mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
7d2c4117e1
commit
789f5a13c3
5 changed files with 511 additions and 155 deletions
|
@ -175,6 +175,7 @@
|
|||
* [macOS Java Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-java-apps-injection.md)
|
||||
* [macOS Library Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md)
|
||||
* [macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
* [macOS Dyld Process](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md)
|
||||
* [macOS Perl Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md)
|
||||
* [macOS Python Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-python-applications-injection.md)
|
||||
* [macOS Ruby Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ruby-applications-injection.md)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Zacznij od zera i stań się 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 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 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 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>
|
||||
|
||||
|
@ -21,14 +21,14 @@ Inne sposoby wsparcia HackTricks:
|
|||
* **/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**: Można tu znaleźć wiele podkatalogów i plików związanych z preferencjami, pamięci podręczną i logami. Istnieje folder Library w głównym katalogu oraz w katalogu każdego użytkownika.
|
||||
* **/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)
|
||||
* **/System**: Plik do uruchamiania OS X. Powinny znajdować się tutaj głównie pliki specyficzne dla Apple (nie firm trzecich).
|
||||
* **/tmp**: Pliki są usuwane po 3 dniach (jest to miękkie łącze do /private/tmp)
|
||||
* **/Users**: Katalog domowy użytkowników.
|
||||
* **/usr**: Konfiguracje i binaria systemowe
|
||||
* **/var**: Pliki dziennika
|
||||
* **/var**: Pliki dziennika zdarzeń
|
||||
* **/Volumes**: Zamontowane dyski pojawią się tutaj.
|
||||
* **/.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`
|
||||
|
||||
|
@ -36,10 +36,10 @@ Inne sposoby wsparcia HackTricks:
|
|||
|
||||
* **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 oraz w `~/Library/Application Support` dla aplikacji działających jako użytkownik.
|
||||
* 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 systemu** znajduje się w `/System/Library/Kernels/kernel`
|
||||
* **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`
|
||||
|
||||
|
@ -60,7 +60,7 @@ macOS przechowuje informacje takie jak hasła w kilku miejscach:
|
|||
## Specyficzne Rozszerzenia OS X
|
||||
|
||||
* **`.dmg`**: Pliki obrazów dysków Apple są bardzo częste dla instalatorów.
|
||||
* **`.kext`**: Musi przestrzegać określonej struktury i jest to wersja sterownika dla OS X. (jest to pakiet)
|
||||
* **`.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. Binarny można odczytać za pomocą:
|
||||
* `defaults read config.plist`
|
||||
|
@ -85,13 +85,16 @@ Pakiet to **katalog**, który **wygląda jak obiekt w Finderze** (przykładem pa
|
|||
[macos-bundles.md](macos-bundles.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Współdzielona Pamięć Dyld
|
||||
## Bufor Bibliotek Współdzielonych Dyld (SLC)
|
||||
|
||||
Na macOS (i iOS) wszystkie współdzielone 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.
|
||||
Na macOS (i iOS) wszystkie systemowe biblioteki współdzielone, takie jak frameworki i dyliby, są **łączone w pojedynczy plik**, zwany **buforem bibliotek współdzielonych dyld**. Poprawia to wydajność, ponieważ kod może być ładowany szybciej.
|
||||
|
||||
Podobnie jak współdzielona pamięć dyld, jądro i rozszerzenia jądra są również kompilowane do pamięci podręcznej jądra, która jest ładowana podczas uruchamiania systemu.
|
||||
Znajduje się to w macOS w `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`, a w starszych wersjach można było znaleźć **bufor współdzielonych bibliotek** w **`/System/Library/dyld/`**.\
|
||||
W iOS można je znaleźć w **`/System/Library/Caches/com.apple.dyld/`**.
|
||||
|
||||
Aby wyodrębnić biblioteki z pojedynczego pliku współdzielonej pamięci dylib, można było użyć binariów [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip), które obecnie mogą nie działać, ale można również użyć [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
Podobnie jak bufor bibliotek współdzielonych dyld, jądro i rozszerzenia jądra są również kompilowane do bufora jądra, który jest ładowany podczas uruchamiania systemu.
|
||||
|
||||
Aby wyodrębnić biblioteki z pojedynczego pliku bufora współdzielonych dylibów, 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
|
||||
|
@ -105,48 +108,65 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
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" %}
|
||||
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ć**:
|
||||
Zauważ, że nawet jeśli narzędzie `dyld_shared_cache_util` nie działa, możesz przekazać **wspólny binarny 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 (1149).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
## Specjalne uprawnienia plików
|
||||
Niektóre ekstraktory nie będą działać, ponieważ dylibs są wstępnie połączone z twardymi adresami, dlatego mogą skakać do nieznanych adresów.
|
||||
|
||||
{% hint style="success" %}
|
||||
Możliwe jest również pobranie Udostępnionego Cache Bibliotek innych urządzeń \*OS w systemie macOS za pomocą emulatora w Xcode. Zostaną one pobrane do: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`, na przykład:`$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
|
||||
{% endhint %}
|
||||
|
||||
### Mapowanie SLC
|
||||
|
||||
**`dyld`** używa wywołania systemowego **`shared_region_check_np`** aby sprawdzić, czy SLC został zmapowany (co zwraca adres) i **`shared_region_map_and_slide_np`** aby zmapować SLC.
|
||||
|
||||
Zauważ, że nawet jeśli SLC jest przesunięty przy pierwszym użyciu, wszystkie **procesy** używają **tej samej kopii**, co **eliminuje ochronę ASLR**, jeśli atakujący był w stanie uruchomić procesy w systemie. Zostało to faktycznie wykorzystane w przeszłości i naprawione za pomocą współdzielonego regionu pagera.
|
||||
|
||||
Pule gałęzi to małe dyliby Mach-O, które tworzą małe przestrzenie między mapowaniami obrazów, co uniemożliwia interweniowanie w funkcje.
|
||||
|
||||
### Nadpisywanie SLC
|
||||
|
||||
Korzystając z zmiennych środowiskowych:
|
||||
|
||||
* **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> To pozwoli na załadowanie nowego wspólnego cache'a bibliotek
|
||||
* **`DYLD_SHARED_CACHE_DIR=avoid`** i ręczne zastąpienie bibliotek dowiązaniami symbolicznymi do cache'a wspólnego z rzeczywistymi (będziesz musiał je wyodrębnić)
|
||||
|
||||
## Specjalne Uprawnienia Plików
|
||||
|
||||
### Uprawnienia folderów
|
||||
|
||||
W **folderze**, **odczyt** pozwala na **wylistowanie go**, **zapis** pozwala na **usunięcie** i **zapisywanie** 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.
|
||||
W **folderze**, **odczyt** pozwala na **wylistowanie go**, **zapis** pozwala na **usunięcie** i **zapis** plików w nim, a **wykonanie** pozwala na **przejście** po katalogu. Na przykład użytkownik z **uprawnieniem do odczytu pliku** wewnątrz katalogu, w którym **nie ma uprawnień do wykonania**, **nie będzie w stanie 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ą `ls -lO /ścieżka/do/katalogu`
|
||||
|
||||
* **`uchg`**: Znana jako flaga **uchange** uniemożliwi **dokonanie jakiejkolwiek zmiany** lub usunięcie **pliku**. Aby ją ustawić, wykonaj: `chflags uchg plik.txt`
|
||||
* **`uchg`**: Znana jako flaga **uchange** uniemożliwi **dokonanie jakiejkolwiek akcji** zmieniającej lub usuwającej **plik**. Aby ją ustawić, wykonaj: `chflags uchg plik.txt`
|
||||
* Użytkownik root może **usunąć flagę** i zmodyfikować plik
|
||||
* **`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 mogą 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.
|
||||
* **`Sticky bit`**: Jeśli katalog ma ustawiony bit sticky, **tylko** właściciel katalogu lub root mogą zmienić nazwę lub usunąć pliki. Zazwyczaj jest to ustawione na 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 zmienić właścicielowi.
|
||||
* `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 odbywać się tylko przez dodawanie.
|
||||
* `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_TRACKED` 0x00000040: Brak powiadomień o usuwaniu/zmianie nazwy dla plików z tym ustawieniem.
|
||||
* `UF_DATAVAULT` 0x00000080: Wymagane uprawnienie do odczytu i zapisu.
|
||||
* `UF_HIDDEN` 0x00008000: Wskazuje, że ten element nie powinien być wyświetlany w interfejsie GUI.
|
||||
* `UF_HIDDEN` 0x00008000: Wskazówka, że ten element nie powinien być wyświetlany w interfejsie GUI.
|
||||
* `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 odbywać się tylko przez dodawanie.
|
||||
* `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 lub zamontowany.
|
||||
* `SF_FIRMLINK` 0x00800000: Plik jest łączem stałym.
|
||||
|
@ -154,10 +174,10 @@ Wszystkie flagi można znaleźć w pliku `sys/stat.h` (znajdź go za pomocą `md
|
|||
|
||||
### **ACL plików**
|
||||
|
||||
ACL plików zawiera **ACE** (wpisy kontroli dostępu), gdzie można przypisać różne **bardziej szczegółowe uprawnienia** różnym użytkownikom.
|
||||
ACL plików zawiera **ACE** (wpisy kontroli dostępu), w których można przypisać różne **bardziej szczegółowe uprawnienia** różnym użytkownikom.
|
||||
|
||||
Możliwe jest nadanie **katalogowi** tych uprawnień: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
|
||||
A plikowi: `read`, `write`, `append`, `execute`.
|
||||
Możliwe jest przyznanie **katalogowi** tych uprawnień: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
|
||||
A dla **pliku**: `read`, `write`, `append`, `execute`.
|
||||
|
||||
Gdy plik zawiera ACL, zobaczysz **"+" podczas wyświetlania uprawnień jak w**:
|
||||
```bash
|
||||
|
@ -176,25 +196,25 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
|||
```
|
||||
### Rozszerzone atrybuty
|
||||
|
||||
Rozszerzone atrybuty posiadają nazwę i wartość oraz można je zobaczyć za pomocą `ls -@` i manipulować za pomocą polecenia `xattr`. Niektóre wspólne rozszerzone atrybuty to:
|
||||
Rozszerzone atrybuty posiadają nazwę oraz wartość i można je zobaczyć za pomocą `ls -@`, a także manipulować nimi za pomocą polecenia `xattr`. Niektóre wspólne rozszerzone atrybuty to:
|
||||
|
||||
* `com.apple.resourceFork`: Kompatybilność 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 logd epok uruchomień z unikalnym UUID
|
||||
* `com.apple.decmpfs`: MacOS: Transparentna kompresja plików (II/7)
|
||||
* `com.apple.cprotect`: \*OS: Dane szyfrowania plików (III/11)
|
||||
* `com.apple.installd.*`: \*OS: Metadane używane przez installd, np. `installType`, `uniqueInstallID`
|
||||
- `com.apple.resourceFork`: Kompatybilność z widłami zasobów. 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 logd epok uruchomień 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
|
||||
### Widły zasobów | macOS ADS
|
||||
|
||||
Jest to sposób uzyskania **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**.
|
||||
To sposób na uzyskanie **Alternatywnych Strumieni Danych w maszynach 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
|
||||
|
@ -217,7 +237,7 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
|
|||
|
||||
Rozszerzony atrybut `com.apple.decmpfs` wskazuje, że plik jest przechowywany zaszyfrowany, `ls -l` będzie raportować **rozmiar 0** i skompresowane dane znajdują się w tym atrybucie. Za każdym razem, gdy plik jest dostępny, zostanie zdeszyfrowany w pamięci.
|
||||
|
||||
Ten atrybut można zobaczyć za pomocą `ls -lO`, oznaczony jako skompresowany, ponieważ skompresowane pliki są również oznaczone flagą `UF_COMPRESSED`. Jeśli skompresowany plik zostanie usunięty z tą flagą za pomocą `chflags nocompressed </ścieżka/do/pliku>`, system nie będzie wiedział, że plik był skompresowany i dlatego nie będzie w stanie zdekompresować i uzyskać dostępu do danych (będzie myślał, że jest pusty).
|
||||
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 z tą flagą za pomocą `chflags nocompressed </ścieżka/do/pliku>`, system nie będzie wiedział, że plik był skompresowany i dlatego nie będzie w stanie 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.
|
||||
|
||||
|
@ -240,7 +260,7 @@ Binarki systemu Mac OS zazwyczaj są kompilowane jako **uniwersalne binarne**. *
|
|||
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 to:
|
||||
|
||||
* **LSRiskCategorySafe**: Pliki w tej kategorii są uważane za **całkowicie bezpieczne**. Safari automatycznie otworzy te pliki po pobraniu.
|
||||
* **LSRiskCategoryNeutral**: Te pliki nie wywołują żadnych ostrzeżeń i **nie są automatycznie otwierane** przez Safari.
|
||||
* **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.
|
||||
|
||||
|
@ -264,7 +284,7 @@ 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) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Hakowanie funkcji w systemie macOS
|
||||
# Hacowanie funkcji w macOS
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -7,24 +7,24 @@
|
|||
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) 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>
|
||||
|
||||
## Interpozycja funkcji
|
||||
|
||||
Utwórz **dylib** z sekcją **`__interpose`** (lub sekcją oznaczoną flagą **`S_INTERPOSING`**), zawierającą krotki **wskaźników funkcji**, które odnoszą się do **oryginalnych** i **zastępczych** funkcji.
|
||||
Utwórz **dylib** z sekcją **`__interpose` (`__DATA___interpose`)** (lub sekcją oznaczoną flagą **`S_INTERPOSING`**), zawierającą krotki **wskaźników funkcji**, które odnoszą się do **oryginalnych** i **zastępczych** funkcji.
|
||||
|
||||
Następnie **wstrzyknij** dylib przy użyciu **`DYLD_INSERT_LIBRARIES`** (interpozycja musi nastąpić przed załadowaniem głównej aplikacji). Oczywiście [**ograniczenia** dotyczące użycia **`DYLD_INSERT_LIBRARIES`** również mają zastosowanie tutaj](macos-library-injection/#check-restrictions).
|
||||
|
||||
### Interpozycja funkcji printf
|
||||
### Interpozycja printf
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="interpose.c" %}
|
||||
{% code title="interpose.c" %}
|
||||
{% code title="interpose.c" overflow="wrap" %}
|
||||
```c
|
||||
// gcc -dynamiclib interpose.c -o interpose.dylib
|
||||
#include <stdio.h>
|
||||
|
@ -58,42 +58,8 @@ return 0;
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="interpose2.c" %}
|
||||
|
||||
### Hakowanie funkcji w systemie macOS
|
||||
|
||||
W systemie macOS możemy wykorzystać interpose do podmiany funkcji systemowych na własne. Możemy to zrobić poprzez użycie flagi `DYLD_INSERT_LIBRARIES` podczas uruchamiania programu.
|
||||
|
||||
Oto prosty przykład kodu w języku C, który demonstruje hakowanie funkcji `open` i `close`:
|
||||
|
||||
```c
|
||||
#define _DARWIN_C_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
int (*original_open)(const char *pathname, int flags, mode_t mode);
|
||||
int (*original_close)(int fd);
|
||||
|
||||
int open(const char *pathname, int flags, mode_t mode) {
|
||||
printf("Hakowanie funkcji open: %s\n", pathname);
|
||||
return original_open(pathname, flags, mode);
|
||||
}
|
||||
|
||||
int close(int fd) {
|
||||
printf("Hakowanie funkcji close: %d\n", fd);
|
||||
return original_close(fd);
|
||||
}
|
||||
|
||||
__attribute__((constructor))
|
||||
void init() {
|
||||
original_open = dlsym(RTLD_NEXT, "open");
|
||||
original_close = dlsym(RTLD_NEXT, "close");
|
||||
}
|
||||
```
|
||||
|
||||
Kod ten podmienia funkcje `open` i `close`, wypisując dodatkowe informacje na konsoli. Możemy skompilować ten kod i uruchomić program z flagą `DYLD_INSERT_LIBRARIES` aby zobaczyć efekt działania naszego haka.
|
||||
|
||||
{% endtab %}
|
||||
{% tab title="interpose2.c" %}
|
||||
{% code overflow="wrap" %}
|
||||
```c
|
||||
// Just another way to define an interpose
|
||||
// gcc -dynamiclib interpose2.c -o interpose2.dylib
|
||||
|
@ -117,6 +83,7 @@ return ret;
|
|||
|
||||
DYLD_INTERPOSE(my_printf,printf);
|
||||
```
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
```bash
|
||||
|
@ -126,6 +93,25 @@ Hello from interpose
|
|||
DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello
|
||||
Hello from interpose
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Zmienna środowiskowa **`DYLD_PRINT_INTERPOSTING`** może być użyta do debugowania interposing i wyświetli proces interpose.
|
||||
{% endhint %}
|
||||
|
||||
Należy również zauważyć, że **interposing zachodzi pomiędzy procesem a załadowanymi bibliotekami**, nie działa z pamięcią podręczną współdzielonych bibliotek.
|
||||
|
||||
### Dynamiczne Interposing
|
||||
|
||||
Teraz jest również możliwe dynamiczne interposing funkcji za pomocą funkcji **`dyld_dynamic_interpose`**. Pozwala to programowo interpose funkcję w czasie wykonania, zamiast robić to tylko od początku.
|
||||
|
||||
Wystarczy wskazać **krotki** **funkcji do zastąpienia i funkcji zastępczej**.
|
||||
```c
|
||||
struct dyld_interpose_tuple {
|
||||
const void* replacement;
|
||||
const void* replacee;
|
||||
};
|
||||
extern void dyld_dynamic_interpose(const struct mach_header* mh,
|
||||
const struct dyld_interpose_tuple array[], size_t count);
|
||||
```
|
||||
## Metoda Swizzling
|
||||
|
||||
W ObjectiveC wywołuje się metodę w ten sposób: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
|
@ -142,7 +128,9 @@ Zauważ, że ponieważ metody i klasy są dostępne na podstawie swoich nazw, te
|
|||
|
||||
### Dostęp do surowych metod
|
||||
|
||||
Możliwe jest uzyskanie informacji o metodach, takich jak nazwa, liczba parametrów lub adres, jak w poniższym przykładzie:
|
||||
Możliwe jest uzyskanie dostępu do informacji o metodach, takich jak nazwa, liczba parametrów lub adres, jak w poniższym przykładzie:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
// gcc -framework Foundation test.m -o test
|
||||
|
||||
|
@ -210,11 +198,13 @@ return 0;
|
|||
```
|
||||
### Podmiana metody za pomocą method\_exchangeImplementations
|
||||
|
||||
Funkcja **`method_exchangeImplementations`** pozwala **zmienić** **adres** **implementacji** jednej funkcji na drugą.
|
||||
Funkcja **`method_exchangeImplementations`** pozwala **zmienić** **adres** **implementacji** **jednej funkcji na drugą**.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Kiedy funkcja jest wywoływana, **wykonywana jest inna funkcja**.
|
||||
Dlatego gdy funkcja jest wywoływana, **wykonywana jest inna funkcja**.
|
||||
{% endhint %}
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
//gcc -framework Foundation swizzle_str.m -o swizzle_str
|
||||
|
||||
|
@ -258,17 +248,21 @@ NSLog(@"Substring: %@", subString);
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
W tym przypadku, jeśli **kod implementacji prawidłowej** metody **sprawdza** **nazwę metody**, może **wykryć** takie podmienianie i zapobiec jego uruchomieniu.
|
||||
|
||||
Następna technika nie ma tego ograniczenia.
|
||||
Następująca technika nie ma tego ograniczenia.
|
||||
{% endhint %}
|
||||
|
||||
### Podmienianie metody za pomocą method\_setImplementation
|
||||
### Podmienianie Metod za pomocą method\_setImplementation
|
||||
|
||||
Poprzedni format jest dziwny, ponieważ zmieniasz implementację 2 metod na siebie nawzajem. Korzystając z funkcji **`method_setImplementation`** możesz **zmienić implementację metody na inną**.
|
||||
Poprzedni format jest dziwny, ponieważ zmieniasz implementację 2 metod na siebie. Korzystając z funkcji **`method_setImplementation`** możesz **zmienić implementację** jednej **metody na inną**.
|
||||
|
||||
Pamiętaj tylko, aby **przechować adres implementacji oryginalnej metody**, jeśli zamierzasz ją wywołać z nowej implementacji przed jej nadpisaniem, ponieważ później będzie znacznie trudniej zlokalizować ten adres.
|
||||
Pamiętaj tylko, aby **zapisać adres implementacji oryginalnej metody**, jeśli zamierzasz ją wywołać z nowej implementacji przed jej nadpisaniem, ponieważ później będzie znacznie trudniej zlokalizować ten adres.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
|
@ -320,17 +314,19 @@ return 0;
|
|||
}
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## Metodologia ataku za pomocą hookowania
|
||||
|
||||
Na tej stronie omówione zostały różne sposoby hookowania funkcji. Jednakże, wymagały one **uruchomienia kodu wewnątrz procesu w celu ataku**.
|
||||
|
||||
Aby to zrobić, najłatwiejszą techniką jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcie kontroli](macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md). Jednakże, można to również zrobić za pomocą [wstrzyknięcia procesu Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
Aby to zrobić, najłatwiejszą techniką jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcie kontroli](macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md). Jednakże, można to również zrobić poprzez [wstrzyknięcie procesu Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
|
||||
Obie opcje są jednak **ograniczone** do **niechronionych** binarnych/procesów. Sprawdź każdą technikę, aby dowiedzieć się więcej o ograniczeniach.
|
||||
Obie opcje są jednak **ograniczone** do **niechronionych** binarnych/procesów. Sprawdź każdą technikę, aby dowiedzieć się więcej na temat ograniczeń.
|
||||
|
||||
Atak za pomocą hookowania funkcji jest bardzo specyficzny, atakujący będzie to robił, aby **ukraść wrażliwe informacje z wnętrza procesu** (jeśli nie, wystarczyłoby przeprowadzić atak wstrzyknięcia procesu). Te wrażliwe informacje mogą znajdować się w pobranych przez użytkownika aplikacjach, takich jak MacPass.
|
||||
|
||||
Wektor ataku polegałby na znalezieniu podatności lub usunięciu sygnatury aplikacji, a następnie wstrzyknięciu zmiennej środowiskowej **`DYLD_INSERT_LIBRARIES`** poprzez plik Info.plist aplikacji, dodając coś w rodzaju:
|
||||
Wektor ataku dla atakującego polegałby na znalezieniu podatności lub usunięciu sygnatury aplikacji, a następnie wstrzyknięciu zmiennej środowiskowej **`DYLD_INSERT_LIBRARIES`** poprzez plik Info.plist aplikacji, dodając coś w rodzaju:
|
||||
```xml
|
||||
<key>LSEnvironment</key>
|
||||
<dict>
|
||||
|
@ -346,13 +342,15 @@ a następnie **ponownie zarejestruj** aplikację:
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Dodaj do tej biblioteki kod hakowania w celu wycieku informacji: hasła, wiadomości...
|
||||
Dodaj do tej biblioteki kod hakowania w celu wycieku informacji: Hasła, wiadomości...
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że w nowszych wersjach macOS, jeśli **usuniesz sygnaturę** binariów aplikacji i zostały one wcześniej uruchomione, macOS **nie będzie już uruchamiał aplikacji**.
|
||||
Zauważ, że w nowszych wersjach macOS, jeśli **usuniesz sygnaturę** binariów aplikacji i zostały one wcześniej uruchomione, macOS **nie będzie już uruchamiać aplikacji**.
|
||||
{% endhint %}
|
||||
|
||||
#### Przykład biblioteki
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib
|
||||
|
||||
|
@ -388,6 +386,8 @@ IMP fake_IMP = (IMP)custom_setPassword;
|
|||
real_setPassword = method_setImplementation(real_Method, fake_IMP);
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## Odnośniki
|
||||
|
||||
* [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/)
|
||||
|
@ -402,6 +402,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** 🐦 [**@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 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>
|
||||
|
|
|
@ -1,26 +1,34 @@
|
|||
# Wstrzykiwanie biblioteki w macOS
|
||||
# Wstrzykiwanie biblioteki macOS
|
||||
|
||||
<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>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)!
|
||||
* 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.
|
||||
* **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) repozytoriów na GitHubie.
|
||||
|
||||
</details>
|
||||
|
||||
{% hint style="danger" %}
|
||||
Kod **dyld jest otwartoźródłowy** i można go znaleźć pod adresem [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) oraz pobrać jako archiwum tar za pomocą **URL, takiego jak** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
|
||||
Kod **dyld jest otwarto źródłowy** i można go znaleźć pod adresem [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) oraz pobrać jako archiwum tar za pomocą **URL, takiego jak** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
|
||||
{% endhint %}
|
||||
|
||||
## **Proces Dyld**
|
||||
|
||||
Zobacz, jak Dyld ładuje biblioteki wewnątrz binarnych plików w:
|
||||
|
||||
{% content-ref url="macos-dyld-process.md" %}
|
||||
[macos-dyld-process.md](macos-dyld-process.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **DYLD\_INSERT\_LIBRARIES**
|
||||
|
||||
To jest jak [**LD\_PRELOAD w Linuxie**](../../../../linux-hardening/privilege-escalation/#ld\_preload). Pozwala wskazać proces, który ma zostać uruchomiony, aby załadować określoną bibliotekę z określonej ścieżki (jeśli zmienna środowiskowa jest włączona).
|
||||
To jest jak [**LD\_PRELOAD na Linuxie**](../../../../linux-hardening/privilege-escalation/#ld\_preload). Pozwala wskazać proces, który ma zostać uruchomiony, aby załadować określoną bibliotekę z ścieżki (jeśli zmienna środowiskowa jest włączona).
|
||||
|
||||
Ta technika może być również **używana jako technika ASEP**, ponieważ każda zainstalowana aplikacja ma plik plist o nazwie "Info.plist", który pozwala na **przypisanie zmiennych środowiskowych** za pomocą klucza o nazwie `LSEnvironmental`.
|
||||
|
||||
|
@ -32,7 +40,7 @@ Przejdź do kodu i **sprawdź `src/dyld.cpp`**. W funkcji **`pruneEnvironmentVar
|
|||
W funkcji **`processRestricted`** ustawiono powód ograniczenia. Sprawdzając ten kod, można zobaczyć, że powody to:
|
||||
|
||||
* Binarne są `setuid/setgid`
|
||||
* Istnienie sekcji `__RESTRICT/__restrict` w binarce macho.
|
||||
* Istnienie sekcji `__RESTRICT/__restrict` w binarnym pliku macho.
|
||||
* Oprogramowanie ma uprawnienia (zmodyfikowany czas wykonania) bez uprawnienia [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables)
|
||||
* Sprawdź **uprawnienia** binarne za pomocą: `codesign -dv --entitlements :- </ścieżka/do/bin>`
|
||||
|
||||
|
@ -48,11 +56,11 @@ Aby załadować niestandardową bibliotekę, binarny plik musi mieć **jedno z n
|
|||
* [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
|
||||
* [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
|
||||
|
||||
lub binarny plik **nie powinien** mieć flagi **hardened runtime** ani flagi **walidacji biblioteki**.
|
||||
lub binarny plik **nie powinien** mieć flagi **zmodyfikowanego czasu wykonania** ani flagi **walidacji biblioteki**.
|
||||
|
||||
Możesz sprawdzić, czy binarny plik ma **hardened runtime** za pomocą `codesign --display --verbose <bin>` sprawdzając flagę runtime w **`CodeDirectory`** taką jak: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
|
||||
Możesz sprawdzić, czy binarny plik ma **zmodyfikowany czas wykonania** za pomocą `codesign --display --verbose <bin>` sprawdzając flagę czasu wykonania w **`CodeDirectory`** jak: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
|
||||
|
||||
Możesz również załadować bibliotekę, jeśli jest **podpisana tym samym certyfikatem co binarny plik**.
|
||||
Możesz również załadować bibliotekę, jeśli jest **podpisana tym samym certyfikatem co binarny**.
|
||||
|
||||
Znajdź przykład, jak (nadużyć) wykorzystać to i sprawdź ograniczenia w:
|
||||
|
||||
|
@ -63,15 +71,15 @@ Znajdź przykład, jak (nadużyć) wykorzystać to i sprawdź ograniczenia w:
|
|||
## Przechwytywanie Dylib
|
||||
|
||||
{% hint style="danger" %}
|
||||
Pamiętaj, że **wcześniejsze ograniczenia walidacji biblioteki** również dotyczą ataków przechwytywania Dylib.
|
||||
Pamiętaj, że **wcześniejsze ograniczenia walidacji biblioteki** również mają zastosowanie do przeprowadzania ataków przechwytywania Dylib.
|
||||
{% endhint %}
|
||||
|
||||
Tak jak w systemie Windows, w systemie MacOS również można **przechwycić dyliby**, aby **aplikacje wykonywały** **arbitralny** **kod** (w rzeczywistości od zwykłego użytkownika to może być niemożliwe, ponieważ może być konieczne uzyskanie uprawnień TCC do zapisu wewnątrz pakietu `.app` i przechwycenia biblioteki).\
|
||||
Jednak sposób, w jaki **aplikacje MacOS** **ładują** **biblioteki**, jest **bardziej ograniczony** niż w systemie Windows. Oznacza to, że **twórcy złośliwego oprogramowania** nadal mogą używać tej techniki dla **ukrycia**, ale prawdopodobieństwo **nadużycia tego do eskalacji uprawnień jest znacznie niższe**.
|
||||
Tak jak w systemie Windows, w systemie MacOS również można **przechwycić dyliby**, aby sprawić, że **aplikacje wykonają** **arbitralny** **kod** (no cóż, tak naprawdę od zwykłego użytkownika to nie byłoby możliwe, ponieważ mogą być wymagane uprawnienia TCC do zapisu wewnątrz pakietu `.app` i przechwycenia biblioteki).\
|
||||
Jednakże, sposób, w jaki **aplikacje MacOS** **ładują** **biblioteki** jest **bardziej ograniczony** niż w systemie Windows. Oznacza to, że **twórcy złośliwego oprogramowania** nadal mogą używać tej techniki dla **ukrycia**, ale prawdopodobieństwo **nadużycia tego do eskalacji uprawnień jest znacznie niższe**.
|
||||
|
||||
Po pierwsze, **częściej** można znaleźć, że **binarne pliki MacOS wskazują pełną ścieżkę** do bibliotek do załadowania. Po drugie, **system MacOS nigdy nie szuka** w folderach **$PATH** bibliotek.
|
||||
|
||||
**Główna** część **kodu** związana z tą funkcjonalnością znajduje się w **`ImageLoader::recursiveLoadLibraries`** w `ImageLoader.cpp`.
|
||||
Główna część **kodu** związana z tą funkcjonalnością znajduje się w **`ImageLoader::recursiveLoadLibraries`** w `ImageLoader.cpp`.
|
||||
|
||||
Istnieją **4 różne polecenia nagłówka**, które binarny plik macho może użyć do ładowania bibliotek:
|
||||
|
||||
|
@ -80,11 +88,11 @@ Istnieją **4 różne polecenia nagłówka**, które binarny plik macho może u
|
|||
* Polecenie **`LC_REEXPORT_DYLIB`** przechwytuje (lub ponownie eksportuje) symbole z innej biblioteki.
|
||||
* Polecenie **`LC_LOAD_UPWARD_DYLIB`** jest używane, gdy dwie biblioteki zależą od siebie nawzajem (nazywa się to _zależnością w górę_).
|
||||
|
||||
Jednak istnieją **2 rodzaje przechwytywania dylibów**:
|
||||
Jednakże istnieją **2 rodzaje przechwytywania dylibów**:
|
||||
|
||||
* **Brakujące słabe połączone biblioteki**: Oznacza to, że aplikacja spróbuje załadować bibliotekę, której nie ma skonfigurowanej z **LC\_LOAD\_WEAK\_DYLIB**. Następnie, **jeśli atakujący umieści dylib tam, gdzie się spodziewa, zostanie załadowany**.
|
||||
* Fakt, że połączenie jest "słabe" oznacza, że aplikacja będzie nadal działać, nawet jeśli biblioteka nie zostanie znaleziona.
|
||||
* **Kod związany** z tym znajduje się w funkcji `ImageLoaderMachO::doGetDependentLibraries` w `ImageLoaderMachO.cpp`, gdzie `lib->required` jest `false` tylko wtedy, gdy `LC_LOAD_WEAK_DYLIB` jest prawdziwe.
|
||||
* **Kod związany** z tym znajduje się w funkcji `ImageLoaderMachO::doGetDependentLibraries` w `ImageLoaderMachO.cpp`, gdzie `lib->required` jest prawdziwe tylko wtedy, gdy `LC_LOAD_WEAK_DYLIB` jest prawdziwe.
|
||||
* **Znajdź słabe połączone biblioteki** w binariach (później masz przykład, jak tworzyć biblioteki przechwytywania):
|
||||
* ```bash
|
||||
otool -l </ścieżka/do/bin> | grep LC_LOAD_WEAK_DYLIB -A 5 cmd LC_LOAD_WEAK_DYLIB
|
||||
|
@ -94,10 +102,10 @@ time stamp 2 Wed Jun 21 12:23:31 1969
|
|||
current version 1.0.0
|
||||
compatibility version 1.0.0
|
||||
```
|
||||
* **Skonfigurowane z @rpath**: Binarki Mach-O mogą zawierać polecenia **`LC_RPATH`** i **`LC_LOAD_DYLIB`**. Na podstawie **wartości** tych poleceń, **biblioteki** będą **ładowane** z **różnych katalogów**.
|
||||
* **Skonfigurowane z @rpath**: Binaria Mach-O mogą zawierać polecenia **`LC_RPATH`** i **`LC_LOAD_DYLIB`**. Na podstawie **wartości** tych poleceń, **biblioteki** będą **ładowane** z **różnych katalogów**.
|
||||
* **`LC_RPATH`** zawiera ścieżki niektórych folderów używanych do ładowania bibliotek przez binarny plik.
|
||||
* **`LC_LOAD_DYLIB`** zawiera ścieżkę do określonych bibliotek do załadowania. Te ścieżki mogą zawierać **`@rpath`**, które zostanie **zastąpione** przez wartości w **`LC_RPATH`**. Jeśli w **`LC_RPATH`** jest kilka ścieżek, każda z nich będzie używana do wyszukiwania biblioteki do załadowania. Przykład:
|
||||
* Jeśli **`LC_LOAD_DYLIB`** zawiera `@rpath/library.dylib` i **`LC_RPATH`** zawiera `/application/app.app/Contents/Framework/v1/` oraz `/application/app.app/Contents/Framework/v2/`. Oba foldery zostaną użyte do załadowania `library.dylib`**. Jeśli biblioteka nie istnieje w `[...]/v1/` i atakujący może ją umieścić tam, aby przejąć załadowanie biblioteki w `[...]/v2/` ponieważ kolejność ścieżek w **`LC_LOAD_DYLIB`** jest zachowana.
|
||||
* **`LC_LOAD_DYLIB`** zawiera ścieżkę do konkretnych bibliotek do załadowania. Te ścieżki mogą zawierać **`@rpath`**, które zostaną **zastąpione** przez wartości w **`LC_RPATH`**. Jeśli w **`LC_RPATH`** jest kilka ścieżek, każda z nich będzie używana do wyszukiwania biblioteki do załadowania. Przykład:
|
||||
* Jeśli **`LC_LOAD_DYLIB`** zawiera `@rpath/library.dylib`, a **`LC_RPATH`** zawiera `/application/app.app/Contents/Framework/v1/` i `/application/app.app/Contents/Framework/v2/`. Oba foldery zostaną użyte do załadowania `library.dylib`. Jeśli biblioteka nie istnieje w `[...]/v1/` i atakujący mógłby ją umieścić tam, aby przejąć ładowanie biblioteki w `[...]/v2/`, ponieważ zachowywana jest kolejność ścieżek w **`LC_LOAD_DYLIB`**.
|
||||
* **Znajdź ścieżki rpath i biblioteki** w plikach binarnych za pomocą: `otool -l </ścieżka/do/binarnego> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
|
||||
|
||||
{% hint style="info" %}
|
||||
|
@ -105,11 +113,11 @@ compatibility version 1.0.0
|
|||
|
||||
**`@loader_path`**: Jest to **ścieżka** do **katalogu** zawierającego **binarny Mach-O**, który zawiera polecenie ładowania.
|
||||
|
||||
* Gdy używane w pliku wykonywalnym, **`@loader_path`** jest efektywnie **takie samo** jak **`@executable_path`**.
|
||||
* Gdy używane w **dylib**, **`@loader_path`** podaje **ścieżkę** do **dylib**.
|
||||
* Gdy jest używane w pliku wykonywalnym, **`@loader_path`** jest efektywnie **takie samo** jak **`@executable_path`**.
|
||||
* Gdy jest używane w **dylib**, **`@loader_path`** podaje **ścieżkę** do **dylib**.
|
||||
{% endhint %}
|
||||
|
||||
Sposób na **eskalację uprawnień** wykorzystując tę funkcjonalność polega na rzadkim przypadku, gdy **aplikacja** uruchamiana przez **roota** poszukuje pewnej **biblioteki w pewnym folderze, w którym atakujący ma uprawnienia do zapisu.**
|
||||
Sposobem na **eskalację uprawnień** wykorzystującą tę funkcjonalność byłoby w rzadkim przypadku, gdy **aplikacja** uruchamiana przez **roota** poszukuje pewnej **biblioteki w folderze, w którym atakujący ma uprawnienia do zapisu.**
|
||||
|
||||
{% hint style="success" %}
|
||||
Świetnym **skanerem** do znajdowania **brakujących bibliotek** w aplikacjach jest [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) lub [**wersja CLI**](https://github.com/pandazheng/DylibHijack).\
|
||||
|
@ -125,27 +133,27 @@ Sposób na **eskalację uprawnień** wykorzystując tę funkcjonalność polega
|
|||
## Dlopen Hijacking
|
||||
|
||||
{% hint style="danger" %}
|
||||
Pamiętaj, że **dotyczą ograniczenia poprzedniej walidacji bibliotek**, aby przeprowadzić ataki dlopen hijacking.
|
||||
Pamiętaj, że **wcześniejsze ograniczenia walidacji bibliotek** również mają zastosowanie do przeprowadzania ataków Dlopen hijacking.
|
||||
{% endhint %}
|
||||
|
||||
Z **`man dlopen`**:
|
||||
|
||||
* Gdy ścieżka **nie zawiera znaku ukośnika** (czyli jest to tylko nazwa liścia), **dlopen() będzie przeszukiwać**. Jeśli **`$DYLD_LIBRARY_PATH`** był ustawiony podczas uruchamiania, dyld najpierw **sprawdzi ten katalog**. Następnie, jeśli plik mach-o wywołujący lub główny plik wykonywalny określają **`LC_RPATH`**, dyld będzie **szukać w tych** katalogach. Następnie, jeśli proces jest **nieograniczony**, dyld będzie szukać w **bieżącym katalogu**. Na koniec, dla starych binarnych plików, dyld spróbuje kilka alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** był ustawiony podczas uruchamiania, dyld będzie szukać w **tych katalogach**, w przeciwnym razie dyld będzie szukać w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`** (te informacje zostały zaczerpnięte z **`man dlopen`**).
|
||||
* Gdy ścieżka **nie zawiera znaku ukośnika** (czyli jest to tylko nazwa liścia), **dlopen() będzie przeszukiwać**. Jeśli **`$DYLD_LIBRARY_PATH`** był ustawiony przy starcie, dyld najpierw **sprawdzi ten katalog**. Następnie, jeśli plik mach-o wywołujący lub główny plik wykonywalny określają **`LC_RPATH`**, to dyld będzie **szukać w tych** katalogach. Następnie, jeśli proces jest **nieograniczony**, dyld będzie szukać w **bieżącym katalogu**. Na koniec, dla starych binarnych plików, dyld spróbuje kilka alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** był ustawiony przy starcie, dyld będzie szukać w **tych katalogach**, w przeciwnym razie dyld będzie szukać w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`** (te informacje zostały zaczerpnięte z **`man dlopen`**).
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. `LC_RPATH`
|
||||
3. `CWD`(jeśli nieograniczony)
|
||||
3. `CWD` (jeśli nieograniczony)
|
||||
4. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||
5. `/usr/local/lib/` (jeśli nieograniczony)
|
||||
6. `/usr/lib/`
|
||||
|
||||
{% hint style="danger" %}
|
||||
Jeśli brak ukośników w nazwie, istnieją 2 sposoby na wykonanie hijackingu:
|
||||
Jeśli brak znaków ukośnika w nazwie, istnieją 2 sposoby na wykonanie ataku hijacking:
|
||||
|
||||
* Jeśli którykolwiek **`LC_RPATH`** jest **zapisywalny** (ale sygnatura jest sprawdzana, więc do tego potrzebujesz również nieregowanego binarnego)
|
||||
* Jeśli binarny jest **nieograniczony**, wówczas możliwe jest załadowanie czegoś z CWD (lub nadużywanie jednej z wymienionych zmiennych środowiskowych)
|
||||
* Jeśli binarny jest **nieograniczony**, wówczas możliwe jest załadowanie czegoś z CWD (lub wykorzystanie jednej z wymienionych zmiennych środowiskowych)
|
||||
{% endhint %}
|
||||
|
||||
* Gdy ścieżka **wygląda jak ścieżka do frameworka** (np. `/stuff/foo.framework/foo`), jeśli **`$DYLD_FRAMEWORK_PATH`** był ustawiony podczas uruchamiania, dyld najpierw będzie szukać w tym katalogu dla **częściowej ścieżki frameworka** (np. `foo.framework/foo`). Następnie dyld spróbuje **podanej ścieżki bez zmian** (używając bieżącego katalogu roboczego dla ścieżek względnych). Na koniec, dla starych binarnych plików, dyld spróbuje kilka alternatyw. Jeśli **`$DYLD_FALLBACK_FRAMEWORK_PATH`** był ustawiony podczas uruchamiania, dyld będzie szukać w tych katalogach. W przeciwnym razie będzie szukać w **`/Library/Frameworks`** (na macOS, jeśli proces jest nieograniczony), a następnie w **`/System/Library/Frameworks`**.
|
||||
* Gdy ścieżka **wygląda jak ścieżka do frameworka** (np. `/stuff/foo.framework/foo`), jeśli **`$DYLD_FRAMEWORK_PATH`** był ustawiony przy starcie, dyld najpierw będzie szukać w tym katalogu dla **częściowej ścieżki frameworka** (np. `foo.framework/foo`). Następnie dyld spróbuje **podanej ścieżki takiej jak jest** (używając bieżącego katalogu roboczego dla ścieżek względnych). Na koniec, dla starych binarnych plików, dyld spróbuje kilka alternatyw. Jeśli **`$DYLD_FALLBACK_FRAMEWORK_PATH`** był ustawiony przy starcie, dyld będzie szukać w tych katalogach. W przeciwnym razie będzie szukać w **`/Library/Frameworks`** (na macOS, jeśli proces jest nieograniczony), a następnie w **`/System/Library/Frameworks`**.
|
||||
1. `$DYLD_FRAMEWORK_PATH`
|
||||
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczony)
|
||||
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
|
||||
|
@ -153,12 +161,12 @@ Jeśli brak ukośników w nazwie, istnieją 2 sposoby na wykonanie hijackingu:
|
|||
5. `/System/Library/Frameworks`
|
||||
|
||||
{% hint style="danger" %}
|
||||
Jeśli ścieżka frameworka, sposób na jej przejęcie to:
|
||||
Jeśli ścieżka frameworka, sposób na jej przejęcie byłby:
|
||||
|
||||
* Jeśli proces jest **nieograniczony**, nadużywając **ścieżki względnej z CWD** wspomnianych zmiennych środowiskowych (nawet jeśli nie jest to wspomniane w dokumentacji, jeśli proces jest ograniczony, zmienne środowiskowe DYLD\_\* są usuwane)
|
||||
* Jeśli proces jest **nieograniczony**, wykorzystując **ścieżkę względną z CWD** wspomniane zmienne środowiskowe (nawet jeśli nie jest to powiedziane w dokumentacji, czy proces jest ograniczony, zmienne środowiskowe DYLD\_\* są usuwane)
|
||||
{% endhint %}
|
||||
|
||||
* Gdy ścieżka **zawiera ukośnik, ale nie jest ścieżką do frameworka** (czyli pełna ścieżka lub częściowa ścieżka do dylib), dlopen() najpierw szuka (jeśli ustawiono) w **`$DYLD_LIBRARY_PATH`** (z częścią liścia z ścieżki ). Następnie dyld **sprawdza podaną ścieżkę** (używając bieżącego katalogu roboczego dla ścieżek względnych (ale tylko dla nieograniczonych procesów)). Na koniec, dla starszych binarnych plików, dyld spróbuje alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** był ustawiony podczas uruchamiania, dyld będzie szukać w tych katalogach, w przeciwnym razie dyld będzie szukać w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`**.
|
||||
* Gdy ścieżka **zawiera ukośnik, ale nie jest to ścieżka do frameworka** (czyli pełna ścieżka lub częściowa ścieżka do dylib), dlopen() najpierw szuka (jeśli ustawione) w **`$DYLD_LIBRARY_PATH`** (z częścią liścia z ścieżki). Następnie dyld **sprawdza podaną ścieżkę** (używając bieżącego katalogu roboczego dla ścieżek względnych (ale tylko dla nieograniczonych procesów)). Na koniec, dla starych binarnych plików, dyld spróbuje alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** był ustawiony przy starcie, dyld będzie szukać w tych katalogach, w przeciwnym razie dyld będzie szukać w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`**.
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczony)
|
||||
3. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||
|
@ -166,24 +174,24 @@ Jeśli ścieżka frameworka, sposób na jej przejęcie to:
|
|||
5. `/usr/lib/`
|
||||
|
||||
{% hint style="danger" %}
|
||||
Jeśli są ukośniki w nazwie i nie jest to framework, sposób na jej przejęcie to:
|
||||
Jeśli są ukośniki w nazwie i nie jest to framework, sposób na jej przejęcie byłby:
|
||||
|
||||
* Jeśli binarny jest **nieograniczony**, wówczas możliwe jest załadowanie czegoś z CWD lub `/usr/local/lib` (lub nadużywanie jednej z wymienionych zmiennych środowiskowych)
|
||||
* Jeśli binarny jest **nieograniczony**, wówczas możliwe jest załadowanie czegoś z CWD lub `/usr/local/lib` (lub wykorzystanie jednej z wymienionych zmiennych środowiskowych)
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="info" %}
|
||||
Uwaga: Nie ma **plików konfiguracyjnych do kontrolowania przeszukiwania dlopen**.
|
||||
Uwaga: Nie ma plików konfiguracyjnych do **kontroli wyszukiwania dlopen**.
|
||||
|
||||
Uwaga: Jeśli główny plik wykonywalny jest **binarnym ustaw\[ug]id lub podpisany z uprawnieniami**, wtedy **wszystkie zmienne środowiskowe są ignorowane**, i można użyć tylko pełnej ścieżki ([sprawdź ograniczenia DYLD\_INSERT\_LIBRARIES](macos-dyld-hijacking-and-dyld\_insert\_libraries.md#check-dyld\_insert\_librery-restrictions) dla bardziej szczegółowych informacji)
|
||||
Uwaga: Jeśli główny plik wykonywalny jest **binarnym ustawionym na set\[ug]id lub podpisanym z uprawnieniami**, wtedy **wszystkie zmienne środowiskowe są ignorowane**, i można użyć tylko pełnej ścieżki ([sprawdź ograniczenia DYLD\_INSERT\_LIBRARIES](macos-dyld-hijacking-and-dyld\_insert\_libraries.md#check-dyld\_insert\_librery-restrictions) dla bardziej szczegółowych informacji)
|
||||
|
||||
Uwaga: Platformy Apple używają "uniwersalnych" plików do łączenia bibliotek 32-bitowych i 64-bitowych. Oznacza to, że nie ma **oddzielnych ścieżek wyszukiwania 32-bitowych i 64-bitowych**.
|
||||
Uwaga: Platformy Apple używają plików „uniwersalnych” do łączenia bibliotek 32-bitowych i 64-bitowych. Oznacza to, że nie ma **oddzielnych ścieżek wyszukiwania 32-bitowych i 64-bitowych**.
|
||||
|
||||
Uwaga: Na platformach Apple większość systemowych dylibów jest **łączona w pamięci podręcznej dyld** i nie istnieje na dysku. Dlatego wywołanie **`stat()`** w celu wstępnego sprawdzenia, czy dylib systemowy istnieje, **nie zadziała**. Jednak **`dlopen_preflight()`** używa tych samych kroków co **`dlopen()`** do znalezienia zgodnego pliku mach-o.
|
||||
Uwaga: Na platformach Apple większość dylibów systemowych jest **łączona w pamięć podręczną dyld** i nie istnieje na dysku. Dlatego wywołanie **`stat()`** wstępnie, aby sprawdzić, czy dylib systemowy istnieje, **nie zadziała**. Jednak **`dlopen_preflight()`** używa tych samych kroków co **`dlopen()`** do znalezienia zgodnego pliku mach-o.
|
||||
{% endhint %}
|
||||
|
||||
**Sprawdź ścieżki**
|
||||
|
||||
Sprawdź wszystkie opcje za pomocą poniższego kodu:
|
||||
Sprawdźmy wszystkie opcje za pomocą poniższego kodu:
|
||||
```c
|
||||
// gcc dlopentest.c -o dlopentest -Wl,-rpath,/tmp/test
|
||||
#include <dlfcn.h>
|
||||
|
@ -226,27 +234,27 @@ fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
Jeśli go skompilujesz i wykonasz, możesz zobaczyć **gdzie nieudanie wyszukiwano każdej biblioteki**. Ponadto, możesz **filtrować dzienniki systemowe**:
|
||||
Jeśli go skompilujesz i wykonasz, możesz zobaczyć **gdzie nieudanie próbowano wyszukać każdą bibliotekę**. Ponadto, możesz **filtrować dzienniki systemu plików**:
|
||||
```bash
|
||||
sudo fs_usage | grep "dlopentest"
|
||||
```
|
||||
## Przechwytywanie względnej ścieżki
|
||||
## Relative Path Hijacking
|
||||
|
||||
Jeśli **binarny/aplikacja z uprawnieniami** (takie jak SUID lub jakiś binarny z potężnymi uprawnieniami) **ładuje bibliotekę o względnej ścieżce** (na przykład używając `@executable_path` lub `@loader_path`) i ma wyłączoną **Walidację Biblioteki**, może być możliwe przeniesienie binarnego pliku do lokalizacji, w której atakujący mógłby **zmodyfikować załadowaną bibliotekę o względnej ścieżce**, i wykorzystać ją do wstrzyknięcia kodu do procesu.
|
||||
Jeśli **binarny/aplikacja z uprawnieniami** (takie jak SUID lub jakiś binarny z potężnymi uprawnieniami) **ładuje bibliotekę za pomocą ścieżki względnej** (na przykład używając `@executable_path` lub `@loader_path`) i ma wyłączoną **Walidację Biblioteki**, może być możliwe przeniesienie binarnego pliku do lokalizacji, w której atakujący mógłby **zmodyfikować załadowaną bibliotekę ze ścieżki względnej** i wykorzystać ją do wstrzyknięcia kodu w procesie.
|
||||
|
||||
## Usuwanie zmiennych środowiskowych `DYLD_*` i `LD_LIBRARY_PATH`
|
||||
## Prune `DYLD_*` and `LD_LIBRARY_PATH` env variables
|
||||
|
||||
W pliku `dyld-dyld-832.7.1/src/dyld2.cpp` można znaleźć funkcję **`pruneEnvironmentVariables`**, która usunie dowolną zmienną środowiskową, która **zaczyna się od `DYLD_`** i **`LD_LIBRARY_PATH=`**.
|
||||
|
||||
Funkcja ta również ustawia na **null** konkretne zmienne środowiskowe **`DYLD_FALLBACK_FRAMEWORK_PATH`** i **`DYLD_FALLBACK_LIBRARY_PATH`** dla binarnych plików **suid** i **sgid**.
|
||||
Zostanie również ustawione na **null** specjalnie zmienne środowiskowe **`DYLD_FALLBACK_FRAMEWORK_PATH`** i **`DYLD_FALLBACK_LIBRARY_PATH`** dla binarnych plików **suid** i **sgid**.
|
||||
|
||||
Ta funkcja jest wywoływana z funkcji **`_main`** tego samego pliku, jeśli jest celowane system operacyjny OSX w ten sposób:
|
||||
Ta funkcja jest wywoływana z funkcji **`_main`** tego samego pliku, jeśli jest to system operacyjny OSX, w ten sposób:
|
||||
```cpp
|
||||
#if TARGET_OS_OSX
|
||||
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
|
||||
pruneEnvironmentVariables(envp, &apple);
|
||||
```
|
||||
i te flagi logiczne są ustawione w tym samym pliku w kodzie:
|
||||
i te flagi boolean są ustawione w tym samym pliku w kodzie:
|
||||
```cpp
|
||||
#if TARGET_OS_OSX
|
||||
// support chrooting from old kernel
|
||||
|
@ -277,7 +285,7 @@ gLinkContext.allowClassicFallbackPaths = !isRestricted;
|
|||
gLinkContext.allowInsertFailures = false;
|
||||
gLinkContext.allowInterposing = true;
|
||||
```
|
||||
Co w zasadzie oznacza, że jeśli binarny plik jest **suid** lub **sgid**, lub ma segment **RESTRICT** w nagłówkach, lub został podpisany flagą **CS\_RESTRICT**, to **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** jest prawdziwe i zmienne środowiskowe są przycinane.
|
||||
Co w zasadzie oznacza, że jeśli binarny plik jest **suid** lub **sgid**, lub ma segment **RESTRICT** w nagłówkach lub został podpisany flagą **CS\_RESTRICT**, to **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** jest prawdziwe, a zmienne środowiskowe są przycinane.
|
||||
|
||||
Należy zauważyć, że jeśli CS\_REQUIRE\_LV jest prawdziwe, to zmienne nie zostaną przycięte, ale walidacja biblioteki sprawdzi, czy używają tego samego certyfikatu co oryginalny plik binarny.
|
||||
|
||||
|
@ -326,7 +334,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Należy pamiętać, że nawet jeśli istnieją pliki binarne podpisane flagami **`0x0(none)`**, mogą one dynamicznie otrzymać flagę **`CS_RESTRICT`** podczas wykonywania, dlatego ta technika w nich nie zadziała.
|
||||
Należy zauważyć, że nawet jeśli istnieją pliki binarne podpisane flagami **`0x0(none)`**, mogą one dynamicznie otrzymać flagę **`CS_RESTRICT`** podczas wykonywania i dlatego ta technika w nich nie zadziała.
|
||||
|
||||
Możesz sprawdzić, czy proces ma tę flagę za pomocą (pobierz [**tutaj csops**](https://github.com/axelexic/CSOps)):
|
||||
```bash
|
||||
|
@ -335,17 +343,18 @@ csops -status <pid>
|
|||
## Odnośniki
|
||||
|
||||
* [https://theevilbit.github.io/posts/dyld\_insert\_libraries\_dylib\_injection\_in\_macos\_osx\_deep\_dive/](https://theevilbit.github.io/posts/dyld\_insert\_libraries\_dylib\_injection\_in\_macos\_osx\_deep\_dive/)
|
||||
* [**\*OS Internals, Tom I: Tryb Użytkownika. Autor: Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
|
||||
<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 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>
|
||||
|
||||
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)
|
||||
* 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) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -0,0 +1,326 @@
|
|||
# Proces Dyld w macOS
|
||||
|
||||
<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>
|
||||
|
||||
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.
|
||||
|
||||
</details>
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
Rzeczywistym **punktem wejścia** binarnej Mach-o jest dynamiczny linker, zdefiniowany w `LC_LOAD_DYLINKER`, zazwyczaj znajduje się w `/usr/lib/dyld`.
|
||||
|
||||
Ten linker będzie musiał zlokalizować wszystkie biblioteki wykonywalne, zmapować je w pamięci i połączyć wszystkie biblioteki nie-leniwie. Dopiero po tym procesie zostanie wykonany punkt wejścia binarny.
|
||||
|
||||
Oczywiście **`dyld`** nie ma żadnych zależności (korzysta z wywołań systemowych i fragmentów libSystem).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Jeśli ten linker zawiera jakąkolwiek podatność, ponieważ jest wykonywany przed wykonaniem jakiegokolwiek binarnego (nawet tych o wysokich uprawnieniach), byłoby możliwe **eskalowanie uprawnień**.
|
||||
{% endhint %}
|
||||
|
||||
### Przepływ
|
||||
|
||||
Dyld zostanie załadowany przez **`dyldboostrap::start`**, który również załaduje rzeczy takie jak **canary stosu**. Dzieje się tak, ponieważ ta funkcja otrzyma w swoim argumencie **`apple`** ten i inne **wrażliwe** **wartości**.
|
||||
|
||||
**`dyls::_main()`** jest punktem wejścia dyld i jego pierwszym zadaniem jest uruchomienie `configureProcessRestrictions()`, która zazwyczaj ogranicza zmienne środowiskowe **`DYLD_*`** wyjaśnione w:
|
||||
|
||||
{% content-ref url="./" %}
|
||||
[.](./)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Następnie mapuje współdzieloną pamięć podręczną dyld, która prelinkuje wszystkie ważne biblioteki systemowe, a następnie mapuje biblioteki, od których zależy binarny, i kontynuuje rekurencyjnie, aż wszystkie potrzebne biblioteki zostaną załadowane. Dlatego:
|
||||
|
||||
1. zaczyna ładować wstawione biblioteki za pomocą `DYLD_INSERT_LIBRARIES` (jeśli jest to dozwolone)
|
||||
2. Następnie te współdzielone podręczne
|
||||
3. Następnie importowane
|
||||
1.  Następnie kontynuuje importowanie bibliotek rekurencyjnie
|
||||
|
||||
Gdy wszystkie są załadowane, uruchamiane są **inicjatory** tych bibliotek. Są one kodowane za pomocą **`__attribute__((constructor))`** zdefiniowane w `LC_ROUTINES[_64]` (obecnie przestarzałe) lub za pomocą wskaźnika w sekcji oznaczonej flagą `S_MOD_INIT_FUNC_POINTERS` (zazwyczaj: **`__DATA.__MOD_INIT_FUNC`**).
|
||||
|
||||
Terminatory są kodowane za pomocą **`__attribute__((destructor))`** i znajdują się w sekcji oznaczonej flagą `S_MOD_TERM_FUNC_POINTERS` (**`__DATA.__mod_term_func`**).
|
||||
|
||||
### Wskaźniki
|
||||
|
||||
Wszystkie binarne pliki w macOS są dynamicznie łączone. Dlatego zawierają pewne sekcje stubs, które pomagają binarnemu skoczyć do poprawnego kodu w różnych maszynach i kontekstach. To dyld, gdy binarny jest wykonywany, musi rozwiązać te adresy (przynajmniej te nie-leniwie).
|
||||
|
||||
Niektóre sekcje stubs w binarnym:
|
||||
|
||||
* **`__TEXT.__[auth_]stubs`**: Wskaźniki z sekcji `__DATA`
|
||||
* **`__TEXT.__stub_helper`**: Mały kod wywołujący dynamiczne łączenie z informacją o funkcji do wywołania
|
||||
* **`__DATA.__[auth_]got`**: Globalna tabela przesunięć (adresy do importowanych funkcji, rozwiązane podczas czasu ładowania, ponieważ jest oznaczone flagą `S_NON_LAZY_SYMBOL_POINTERS`)
|
||||
* **`__DATA.__nl_symbol_ptr`**: Wskaźniki symboli nie-leniwych (rozwiązane podczas czasu ładowania, ponieważ jest oznaczone flagą `S_NON_LAZY_SYMBOL_POINTERS`)
|
||||
* **`__DATA.__la_symbol_ptr`**: Wskaźniki symboli leniwych (rozwiązane przy pierwszym dostępie)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Zauważ, że wskaźniki z prefiksem "auth\_" używają jednego klucza szyfrowania w procesie do ochrony (PAC). Ponadto możliwe jest użycie instrukcji arm64 `BLRA[A/B]` do weryfikacji wskaźnika przed jego śledzeniem. A zamiast adresu RET można użyć RETA\[A/B\].\
|
||||
Faktycznie kod w **`__TEXT.__auth_stubs`** będzie używał **`braa`** zamiast **`bl`** do wywołania żądanej funkcji w celu uwierzytelnienia wskaźnika.
|
||||
|
||||
Zauważ również, że obecne wersje dyld ładują **wszystko jako nie-lenwe**.
|
||||
{% endhint %}
|
||||
|
||||
### Wyszukiwanie symboli leniwych
|
||||
```c
|
||||
//gcc load.c -o load
|
||||
#include <stdio.h>
|
||||
int main (int argc, char **argv, char **envp, char **apple)
|
||||
{
|
||||
printf("Hi\n");
|
||||
}
|
||||
```
|
||||
Interesujący fragment rozkładu:
|
||||
```armasm
|
||||
; objdump -d ./load
|
||||
100003f7c: 90000000 adrp x0, 0x100003000 <_main+0x1c>
|
||||
100003f80: 913e9000 add x0, x0, #4004
|
||||
100003f84: 94000005 bl 0x100003f98 <_printf+0x100003f98>
|
||||
```
|
||||
Możliwe jest zauważenie, że skok do wywołania printf przechodzi do **`__TEXT.__stubs`**:
|
||||
```bash
|
||||
objdump --section-headers ./load
|
||||
|
||||
./load: file format mach-o arm64
|
||||
|
||||
Sections:
|
||||
Idx Name Size VMA Type
|
||||
0 __text 00000038 0000000100003f60 TEXT
|
||||
1 __stubs 0000000c 0000000100003f98 TEXT
|
||||
2 __cstring 00000004 0000000100003fa4 DATA
|
||||
3 __unwind_info 00000058 0000000100003fa8 DATA
|
||||
4 __got 00000008 0000000100004000 DATA
|
||||
```
|
||||
Podczas analizy sekcji **`__stubs`**:
|
||||
```bash
|
||||
objdump -d --section=__stubs ./load
|
||||
|
||||
./load: file format mach-o arm64
|
||||
|
||||
Disassembly of section __TEXT,__stubs:
|
||||
|
||||
0000000100003f98 <__stubs>:
|
||||
100003f98: b0000010 adrp x16, 0x100004000 <__stubs+0x4>
|
||||
100003f9c: f9400210 ldr x16, [x16]
|
||||
100003fa0: d61f0200 br x16
|
||||
```
|
||||
Możesz zauważyć, że **skaczemy do adresu GOT**, który w tym przypadku jest rozwiązany natychmiastowo i będzie zawierał adres funkcji printf.
|
||||
|
||||
W innych sytuacjach zamiast bezpośrednio skakać do GOT, można skoczyć do **`__DATA.__la_symbol_ptr`**, który załaduje wartość reprezentującą funkcję, którą próbuje załadować, a następnie skoczyć do **`__TEXT.__stub_helper`**, który skacze do **`__DATA.__nl_symbol_ptr`**, który zawiera adres **`dyld_stub_binder`**, który jako parametry przyjmuje numer funkcji i adres.\
|
||||
Ta ostatnia funkcja, po znalezieniu adresu poszukiwanej funkcji, zapisuje go w odpowiednim miejscu w **`__TEXT.__stub_helper`**, aby uniknąć przeszukiwania w przyszłości.
|
||||
|
||||
{% hint style="success" %}
|
||||
Zauważ jednak, że obecne wersje dyld ładują wszystko jako natychmiastowe.
|
||||
{% endhint %}
|
||||
|
||||
#### Opcodes Dyld
|
||||
|
||||
W końcu, **`dyld_stub_binder`** musi znaleźć wskazaną funkcję i zapisać ją pod odpowiednim adresem, aby nie szukać jej ponownie. Aby to zrobić, używa operacji (maszyny stanów skończonych) wewnątrz dyld.
|
||||
|
||||
## apple\[] argument vector
|
||||
|
||||
W macOS funkcja główna faktycznie otrzymuje 4 argumenty zamiast 3. Czwarty nazywa się apple, a każdy wpis ma formę `klucz=wartość`. Na przykład:
|
||||
```c
|
||||
// gcc apple.c -o apple
|
||||
#include <stdio.h>
|
||||
int main (int argc, char **argv, char **envp, char **apple)
|
||||
{
|
||||
for (int i=0; apple[i]; i++)
|
||||
printf("%d: %s\n", i, apple[i])
|
||||
}
|
||||
```
|
||||
## macOS Dynamic Linker (dyld) Process
|
||||
|
||||
### macOS Biblioteka Wstrzykiwania
|
||||
|
||||
Biblioteka dynamiczna (dyld) w systemie macOS jest odpowiedzialna za ładowanie plików wykonywalnych i bibliotek do pamięci procesu. Atakujący może wykorzystać proces ładowania bibliotek przez dyld do wstrzyknięcia złośliwego kodu do procesu lub do nadpisania istniejących funkcji bibliotecznych. To może prowadzić do eskalacji uprawnień lub innych ataków na system. Aby zabezpieczyć system macOS przed tego typu atakami, należy podjąć odpowiednie środki ostrożności, takie jak monitorowanie procesów, ograniczanie uprawnień procesów oraz regularne aktualizacje systemu.
|
||||
```
|
||||
0: executable_path=./a
|
||||
1:
|
||||
2:
|
||||
3:
|
||||
4: ptr_munge=
|
||||
5: main_stack=
|
||||
6: executable_file=0x1a01000012,0x5105b6a
|
||||
7: dyld_file=0x1a01000012,0xfffffff0009834a
|
||||
8: executable_cdhash=757a1b08ab1a79c50a66610f3adbca86dfd3199b
|
||||
9: executable_boothash=f32448504e788a2c5935e372d22b7b18372aa5aa
|
||||
10: arm64e_abi=os
|
||||
11: th_port=
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Do czasu dotarcia tych wartości do funkcji głównej, wrażliwe informacje zostały już z nich usunięte lub doszłoby do wycieku danych.
|
||||
{% endhint %}
|
||||
|
||||
można zobaczyć wszystkie te interesujące wartości debugując przed wejściem do funkcji głównej za pomocą:
|
||||
|
||||
<pre><code>lldb ./apple
|
||||
|
||||
<strong>(lldb) target create "./a"
|
||||
</strong>Aktualny plik wykonywalny ustawiony na '/tmp/a' (arm64).
|
||||
(lldb) process launch -s
|
||||
[..]
|
||||
|
||||
<strong>(lldb) mem read $sp
|
||||
</strong>0x16fdff510: 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 ................
|
||||
0x16fdff520: d8 f6 df 6f 01 00 00 00 00 00 00 00 00 00 00 00 ...o............
|
||||
|
||||
<strong>(lldb) x/55s 0x016fdff6d8
|
||||
</strong>[...]
|
||||
0x16fdffd6a: "TERM_PROGRAM=WarpTerminal"
|
||||
0x16fdffd84: "WARP_USE_SSH_WRAPPER=1"
|
||||
0x16fdffd9b: "WARP_IS_LOCAL_SHELL_SESSION=1"
|
||||
0x16fdffdb9: "SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.4.sdk"
|
||||
0x16fdffe24: "NVM_DIR=/Users/carlospolop/.nvm"
|
||||
0x16fdffe44: "CONDA_CHANGEPS1=false"
|
||||
0x16fdffe5a: ""
|
||||
0x16fdffe5b: ""
|
||||
0x16fdffe5c: ""
|
||||
0x16fdffe5d: ""
|
||||
0x16fdffe5e: ""
|
||||
0x16fdffe5f: ""
|
||||
0x16fdffe60: "pfz=0xffeaf0000"
|
||||
0x16fdffe70: "stack_guard=0x8af2b510e6b800b5"
|
||||
0x16fdffe8f: "malloc_entropy=0xf2349fbdea53f1e4,0x3fd85d7dcf817101"
|
||||
0x16fdffec4: "ptr_munge=0x983e2eebd2f3e746"
|
||||
0x16fdffee1: "main_stack=0x16fe00000,0x7fc000,0x16be00000,0x4000000"
|
||||
0x16fdfff17: "executable_file=0x1a01000012,0x5105b6a"
|
||||
0x16fdfff3e: "dyld_file=0x1a01000012,0xfffffff0009834a"
|
||||
0x16fdfff67: "executable_cdhash=757a1b08ab1a79c50a66610f3adbca86dfd3199b"
|
||||
0x16fdfffa2: "executable_boothash=f32448504e788a2c5935e372d22b7b18372aa5aa"
|
||||
0x16fdfffdf: "arm64e_abi=os"
|
||||
0x16fdfffed: "th_port=0x103"
|
||||
0x16fdffffb: ""
|
||||
</code></pre>
|
||||
|
||||
## dyld\_all\_image\_infos
|
||||
|
||||
Jest to struktura eksportowana przez dyld z informacjami o stanie dyld, które można znaleźć w [**kodzie źródłowym**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld\_images.h.auto.html) z informacjami takimi jak wersja, wskaźnik do tablicy dyld\_image\_info, do dyld\_image\_notifier, czy proces jest odłączony od pamięci podręcznej współdzielonej, czy został wywołany inicjalizator libSystem, wskaźnik do własnego nagłówka Mach dyld, wskaźnik do ciągu wersji dyld...
|
||||
|
||||
## Zmienne środowiskowe dyld
|
||||
|
||||
### debug dyld
|
||||
|
||||
Interesujące zmienne środowiskowe pomagające zrozumieć, co robi dyld:
|
||||
|
||||
* **DYLD\_PRINT\_LIBRARIES**
|
||||
|
||||
Sprawdź każdą bibliotekę, która jest ładowana:
|
||||
```
|
||||
DYLD_PRINT_LIBRARIES=1 ./apple
|
||||
dyld[19948]: <9F848759-9AB8-3BD2-96A1-C069DC1FFD43> /private/tmp/a
|
||||
dyld[19948]: <F0A54B2D-8751-35F1-A3CF-F1A02F842211> /usr/lib/libSystem.B.dylib
|
||||
dyld[19948]: <C683623C-1FF6-3133-9E28-28672FDBA4D3> /usr/lib/system/libcache.dylib
|
||||
dyld[19948]: <BFDF8F55-D3DC-3A92-B8A1-8EF165A56F1B> /usr/lib/system/libcommonCrypto.dylib
|
||||
dyld[19948]: <B29A99B2-7ADE-3371-A774-B690BEC3C406> /usr/lib/system/libcompiler_rt.dylib
|
||||
dyld[19948]: <65612C42-C5E4-3821-B71D-DDE620FB014C> /usr/lib/system/libcopyfile.dylib
|
||||
dyld[19948]: <B3AC12C0-8ED6-35A2-86C6-0BFA55BFF333> /usr/lib/system/libcorecrypto.dylib
|
||||
dyld[19948]: <8790BA20-19EC-3A36-8975-E34382D9747C> /usr/lib/system/libdispatch.dylib
|
||||
dyld[19948]: <4BB77515-DBA8-3EDF-9AF7-3C9EAE959EA6> /usr/lib/system/libdyld.dylib
|
||||
dyld[19948]: <F7CE9486-FFF5-3CB8-B26F-75811EF4283A> /usr/lib/system/libkeymgr.dylib
|
||||
dyld[19948]: <1A7038EC-EE49-35AE-8A3C-C311083795FB> /usr/lib/system/libmacho.dylib
|
||||
[...]
|
||||
```
|
||||
* **DYLD\_PRINT\_SEGMENTS**
|
||||
|
||||
Sprawdź, jak jest ładowana każda biblioteka:
|
||||
```
|
||||
DYLD_PRINT_SEGMENTS=1 ./apple
|
||||
dyld[21147]: re-using existing shared cache (/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e):
|
||||
dyld[21147]: 0x181944000->0x1D5D4BFFF init=5, max=5 __TEXT
|
||||
dyld[21147]: 0x1D5D4C000->0x1D5EC3FFF init=1, max=3 __DATA_CONST
|
||||
dyld[21147]: 0x1D7EC4000->0x1D8E23FFF init=3, max=3 __DATA
|
||||
dyld[21147]: 0x1D8E24000->0x1DCEBFFFF init=3, max=3 __AUTH
|
||||
dyld[21147]: 0x1DCEC0000->0x1E22BFFFF init=1, max=3 __AUTH_CONST
|
||||
dyld[21147]: 0x1E42C0000->0x1E5457FFF init=1, max=1 __LINKEDIT
|
||||
dyld[21147]: 0x1E5458000->0x22D173FFF init=5, max=5 __TEXT
|
||||
dyld[21147]: 0x22D174000->0x22D9E3FFF init=1, max=3 __DATA_CONST
|
||||
dyld[21147]: 0x22F9E4000->0x230F87FFF init=3, max=3 __DATA
|
||||
dyld[21147]: 0x230F88000->0x234EC3FFF init=3, max=3 __AUTH
|
||||
dyld[21147]: 0x234EC4000->0x237573FFF init=1, max=3 __AUTH_CONST
|
||||
dyld[21147]: 0x239574000->0x270BE3FFF init=1, max=1 __LINKEDIT
|
||||
dyld[21147]: Kernel mapped /private/tmp/a
|
||||
dyld[21147]: __PAGEZERO (...) 0x000000904000->0x000101208000
|
||||
dyld[21147]: __TEXT (r.x) 0x000100904000->0x000100908000
|
||||
dyld[21147]: __DATA_CONST (rw.) 0x000100908000->0x00010090C000
|
||||
dyld[21147]: __LINKEDIT (r..) 0x00010090C000->0x000100910000
|
||||
dyld[21147]: Using mapping in dyld cache for /usr/lib/libSystem.B.dylib
|
||||
dyld[21147]: __TEXT (r.x) 0x00018E59D000->0x00018E59F000
|
||||
dyld[21147]: __DATA_CONST (rw.) 0x0001D5DFDB98->0x0001D5DFDBA8
|
||||
dyld[21147]: __AUTH_CONST (rw.) 0x0001DDE015A8->0x0001DDE01878
|
||||
dyld[21147]: __AUTH (rw.) 0x0001D9688650->0x0001D9688658
|
||||
dyld[21147]: __DATA (rw.) 0x0001D808AD60->0x0001D808AD68
|
||||
dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
|
||||
dyld[21147]: Using mapping in dyld cache for /usr/lib/system/libcache.dylib
|
||||
dyld[21147]: __TEXT (r.x) 0x00018E597000->0x00018E59D000
|
||||
dyld[21147]: __DATA_CONST (rw.) 0x0001D5DFDAF0->0x0001D5DFDB98
|
||||
dyld[21147]: __AUTH_CONST (rw.) 0x0001DDE014D0->0x0001DDE015A8
|
||||
dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
|
||||
[...]
|
||||
```
|
||||
* **DYLD\_PRINT\_INITIALIZERS**
|
||||
|
||||
Drukuj, kiedy uruchamiany jest każdy inicjalizator biblioteki:
|
||||
```
|
||||
DYLD_PRINT_INITIALIZERS=1 ./apple
|
||||
dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
|
||||
[...]
|
||||
```
|
||||
### Inne
|
||||
|
||||
* `DYLD_BIND_AT_LAUNCH`: Leniwe wiązania są rozwiązywane z wiązaniami natychmiastowymi
|
||||
* `DYLD_DISABLE_PREFETCH`: Wyłącza wczytywanie wstępne zawartości \_\_DATA i \_\_LINKEDIT
|
||||
* `DYLD_FORCE_FLAT_NAMESPACE`: Wiązania jednopoziomowe
|
||||
* `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: Ścieżki rozwiązania
|
||||
* `DYLD_INSERT_LIBRARIES`: Ładuje określoną bibliotekę
|
||||
* `DYLD_PRINT_TO_FILE`: Zapisuje debugowanie dyld do pliku
|
||||
* `DYLD_PRINT_APIS`: Wyświetla wywołania API libdyld
|
||||
* `DYLD_PRINT_APIS_APP`: Wyświetla wywołania API libdyld dokonane przez główny program
|
||||
* `DYLD_PRINT_BINDINGS`: Wyświetla symbole podczas wiązania
|
||||
* `DYLD_WEAK_BINDINGS`: Wyświetla tylko słabe symbole podczas wiązania
|
||||
* `DYLD_PRINT_CODE_SIGNATURES`: Wyświetla operacje rejestracji sygnatur kodu
|
||||
* `DYLD_PRINT_DOFS`: Wyświetla sekcje formatu obiektu D-Trace jako załadowane
|
||||
* `DYLD_PRINT_ENV`: Wyświetla środowisko widziane przez dyld
|
||||
* `DYLD_PRINT_INTERPOSTING`: Wyświetla operacje interpostowania
|
||||
* `DYLD_PRINT_LIBRARIES`: Wyświetla załadowane biblioteki
|
||||
* `DYLD_PRINT_OPTS`: Wyświetla opcje ładowania
|
||||
* `DYLD_REBASING`: Wyświetla operacje przesunięcia symboli
|
||||
* `DYLD_RPATHS`: Wyświetla rozwinięcia @rpath
|
||||
* `DYLD_PRINT_SEGMENTS`: Wyświetla odwzorowania segmentów Mach-O
|
||||
* `DYLD_PRINT_STATISTICS`: Wyświetla statystyki czasowe
|
||||
* `DYLD_PRINT_STATISTICS_DETAILS`: Wyświetla szczegółowe statystyki czasowe
|
||||
* `DYLD_PRINT_WARNINGS`: Wyświetla komunikaty ostrzegawcze
|
||||
* `DYLD_SHARED_CACHE_DIR`: Ścieżka do użycia dla pamięci podręcznej współdzielonych bibliotek
|
||||
* `DYLD_SHARED_REGION`: "use", "private", "avoid"
|
||||
* `DYLD_USE_CLOSURES`: Włącza zamknięcia
|
||||
|
||||
Możliwe jest znalezienie więcej za pomocą:
|
||||
```bash
|
||||
strings /usr/lib/dyld | grep "^DYLD_" | sort -u
|
||||
```
|
||||
Lub pobierając projekt dyld z [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) i uruchamiając go wewnątrz folderu:
|
||||
```bash
|
||||
find . -type f | xargs grep strcmp| grep key,\ \" | cut -d'"' -f2 | sort -u
|
||||
```
|
||||
## Odnośniki
|
||||
|
||||
* [**\*OS Internals, Tom I: Tryb Użytkownika. Autor: Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Zacznij od zera i zostań mistrzem 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)!
|
||||
* 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.
|
||||
|
||||
</details>
|
Loading…
Reference in a new issue