mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
3d1e437aa2
commit
f1a99eba9b
3 changed files with 202 additions and 80 deletions
|
@ -159,7 +159,7 @@
|
|||
* [macOS Universal binaries & Mach-O Format](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)
|
||||
* [macOS Objective-C](macos-hardening/macos-security-and-privilege-escalation/macos-basic-objective-c.md)
|
||||
* [macOS Privilege Escalation](macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md)
|
||||
* [macOS Proces Abuse](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md)
|
||||
* [macOS Process Abuse](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md)
|
||||
* [macOS Dirty NIB](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md)
|
||||
* [macOS Chromium Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md)
|
||||
* [macOS Electron Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md)
|
||||
|
|
|
@ -8,7 +8,7 @@ Ander maniere om HackTricks te ondersteun:
|
|||
|
||||
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
||||
|
||||
|
@ -16,26 +16,91 @@ Ander maniere om HackTricks te ondersteun:
|
|||
|
||||
## Basiese Inligting
|
||||
|
||||
**Grand Central Dispatch (GCD),** ook bekend as **libdispatch**, is beskikbaar op beide macOS en iOS. Dit is 'n tegnologie wat deur Apple ontwikkel is om programondersteuning te optimaliseer vir gelyktydige (multidraad) uitvoering op multikern-hardeware.
|
||||
**Grand Central Dispatch (GCD),** ook bekend as **libdispatch** (`libdispatch.dyld`), is beskikbaar op beide macOS en iOS. Dit is 'n tegnologie ontwikkel deur Apple om programondersteuning te optimaliseer vir gelyktydige (multidraad) uitvoering op multikern-hardeware.
|
||||
|
||||
**GCD** voorsien en bestuur **FIFO-rye** waarheen jou program take in die vorm van **blokvoorwerpe** kan **indien**. Blokke wat na verspreidingsrye gestuur word, word **uitgevoer op 'n pool van drade** wat volledig deur die stelsel bestuur word. GCD skep outomaties drade vir die uitvoering van die take in die verspreidingsrye en skeduleer daardie take om op die beskikbare kerne uit te voer.
|
||||
**GCD** voorsien en bestuur **FIFO-rye** waar jou aansoek kan **take indien** in die vorm van **blokvoorwerpe**. Blokke wat na verspreidingsrye gestuur word, word **uitgevoer op 'n poel van drade** wat ten volle deur die stelsel bestuur word. GCD skep outomaties drade vir die uitvoering van die take in die verspreidingsrye en skeduleer daardie take om op die beskikbare kerne uit te voer.
|
||||
|
||||
{% hint style="success" %}
|
||||
Kortom, om kode **parallel** uit te voer, kan prosesse **blokke kode na GCD stuur**, wat vir hul uitvoering sal sorg. Daarom skep prosesse nie nuwe drade nie; **GCD voer die gegewe kode met sy eie pool van drade uit**.
|
||||
Opsomming, om kode **gelyktydig** uit te voer, kan prosesse **blokke kode na GCD stuur**, wat sal sorg vir hul uitvoering. Daarom skep prosesse nie nuwe drade nie; **GCD voer die gegewe kode uit met sy eie poel van drade** (wat moontlik vermeerder of verminder soos nodig).
|
||||
{% endhint %}
|
||||
|
||||
Dit is baie nuttig om parallelle uitvoering suksesvol te bestuur, waardeur die aantal drade wat prosesse skep aansienlik verminder word en die parallelle uitvoering geoptimaliseer word. Dit is ideaal vir take wat **groot parallelisme** vereis (brute-forcing?) of vir take wat nie die hoofdraad moet blokkeer nie: Byvoorbeeld, die hoofdraad op iOS hanteer UI-interaksies, sodat enige ander funksionaliteit wat die program kan laat vashang (soek, toegang tot 'n web, lees van 'n lêer...) op hierdie manier hanteer word.
|
||||
Dit is baie nuttig om parallelle uitvoering suksesvol te bestuur, wat die aantal drade wat prosesse skep aansienlik verminder en die parallelle uitvoering optimaliseer. Dit is ideaal vir take wat **groot parallelisme** vereis (brute-krag?) of vir take wat nie die hoofdraad moet blokkeer nie: Byvoorbeeld, die hoofdraad op iOS hanteer UI-interaksies, so enige ander funksionaliteit wat die program kan laat vashang (soek, toegang tot 'n web, lees van 'n lêer...) word op hierdie manier hanteer.
|
||||
|
||||
### Blokke
|
||||
|
||||
'n Blok is 'n **selfstandige afdeling van kode** (soos 'n funksie met argumente wat 'n waarde teruggee) en kan ook gebonde veranderlikes spesifiseer.\
|
||||
Tog, op kompilervlak bestaan blokke nie, hulle is `os_object`s. Elkeen van hierdie voorwerpe word gevorm deur twee strukture:
|
||||
|
||||
* **blokliteraal**: 
|
||||
* Dit begin met die **`isa`** veld, wat na die blok se klas wys:
|
||||
* `NSConcreteGlobalBlock` (blokke van `__DATA.__const`)
|
||||
* `NSConcreteMallocBlock` (blokke in die hoop)
|
||||
* `NSConcreateStackBlock` (blokke in stapel)
|
||||
* Dit het **`vlaggies`** (wat aandui watter velde teenwoordig is in die blokbeskrywing) en 'n paar gereserveerde byte
|
||||
* Die funksie-aanwysers om te roep
|
||||
* 'n Aanwyser na die blokbeskrywing
|
||||
* Ingevoerde blokveranderlikes (indien enige)
|
||||
* **blokbeskrywing**: Dit se grootte hang af van die data wat teenwoordig is (soos aangedui in die vorige vlaggies)
|
||||
* Dit het 'n paar gereserveerde byte
|
||||
* Die grootte daarvan
|
||||
* Dit sal gewoonlik 'n aanwyser hê na 'n Objective-C-stylhandtekening om te weet hoeveel spasie nodig is vir die parameters (vlag `BLOCK_HAS_SIGNATURE`)
|
||||
* As veranderlikes verwys word, sal hierdie blok ook aanwysers hê na 'n kopiehulpprogram (wat die waarde aan die begin kopieer) en 'n verwyderhulpprogram (wat dit vrymaak).
|
||||
|
||||
### Rye
|
||||
|
||||
'n Verspreidingsry is 'n benoemde voorwerp wat FIFO-orden van blokke vir uitvoering voorsien.
|
||||
|
||||
Blokke word in rye geplaas om uitgevoer te word, en hierdie ondersteun 2 modusse: `DISPATCH_QUEUE_SERIAL` en `DISPATCH_QUEUE_CONCURRENT`. Natuurlik sal die **seriële** een **geen wedrenstoestandprobleme hê** nie aangesien 'n blok nie uitgevoer sal word totdat die vorige een klaar is nie. Maar **die ander tipe ry kan dit hê**.
|
||||
|
||||
Verstek rye:
|
||||
|
||||
* `.main-thread`: Vanaf `dispatch_get_main_queue()`
|
||||
* `.libdispatch-manager`: GCD se rybestuurder
|
||||
* `.root.libdispatch-manager`: GCD se rybestuurder
|
||||
* `.root.maintenance-qos`: Laagste prioriteitstake
|
||||
* `.root.maintenance-qos.overcommit`
|
||||
* `.root.background-qos`: Beskikbaar as `DISPATCH_QUEUE_PRIORITY_BACKGROUND`
|
||||
* `.root.background-qos.overcommit`
|
||||
* `.root.utility-qos`: Beskikbaar as `DISPATCH_QUEUE_PRIORITY_NON_INTERACTIVE`
|
||||
* `.root.utility-qos.overcommit`
|
||||
* `.root.default-qos`: Beskikbaar as `DISPATCH_QUEUE_PRIORITY_DEFAULT`
|
||||
* `.root.background-qos.overcommit`
|
||||
* `.root.user-initiated-qos`: Beskikbaar as `DISPATCH_QUEUE_PRIORITY_HIGH`
|
||||
* `.root.background-qos.overcommit`
|
||||
* `.root.user-interactive-qos`: Hoogste prioriteit
|
||||
* `.root.background-qos.overcommit`
|
||||
|
||||
Let daarop dat dit die stelsel sal wees wat besluit **watter drade watter rye op enige tyd hanteer** (veral drade kan in dieselfde ry werk of dieselfde draad kan op 'n stadium in verskillende rye werk)
|
||||
|
||||
#### Eienskappe
|
||||
|
||||
Wanneer 'n ry geskep word met **`dispatch_queue_create`** is die derde argument 'n `dispatch_queue_attr_t`, wat gewoonlik of `DISPATCH_QUEUE_SERIAL` (wat eintlik NULL is) of `DISPATCH_QUEUE_CONCURRENT` is wat 'n aanwyser na 'n `dispatch_queue_attr_t` struktuur is wat toelaat om sekere parameters van die ry te beheer.
|
||||
|
||||
### Verspreidingsvoorwerpe
|
||||
|
||||
Daar is verskeie voorwerpe wat libdispatch gebruik en rye en blokke is net 2 van hulle. Dit is moontlik om hierdie voorwerpe te skep met `dispatch_object_create`:
|
||||
|
||||
* `blok`
|
||||
* `data`: Datablokke
|
||||
* `groep`: Groep van blokke
|
||||
* `io`: Asyns I/O-versoeke
|
||||
* `mach`: Mach-poorte
|
||||
* `mach_msg`: Mach-boodskappe
|
||||
* `pthread_root_queue`: 'n Ry met 'n pthread-draadpoel en nie werkrye nie
|
||||
* `ry`
|
||||
* `semaphore`
|
||||
* `bron`: Gebeurtenisbron
|
||||
|
||||
## Objective-C
|
||||
|
||||
In Objective-C is daar verskillende funksies om 'n blok te stuur om parallel uitgevoer te word:
|
||||
|
||||
* [**dispatch\_async**](https://developer.apple.com/documentation/dispatch/1453057-dispatch\_async): Stuur 'n blok vir asynchrone uitvoering na 'n verspreidingsry en keer onmiddellik terug.
|
||||
* [**dispatch\_async**](https://developer.apple.com/documentation/dispatch/1453057-dispatch\_async): Stuur 'n blok vir asynchrone uitvoering na 'n verspreidingsry en keer dadelik terug.
|
||||
* [**dispatch\_sync**](https://developer.apple.com/documentation/dispatch/1452870-dispatch\_sync): Stuur 'n blokvoorwerp vir uitvoering en keer terug nadat daardie blok klaar is met uitvoer.
|
||||
* [**dispatch\_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch\_once): Voer 'n blokvoorwerp slegs een keer uit vir die leeftyd van 'n aansoek.
|
||||
* [**dispatch\_async\_and\_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch\_async\_and\_wait): Stuur 'n werkitem vir uitvoering en keer slegs terug nadat dit klaar is met uitvoer. Anders as [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch\_sync), respekteer hierdie funksie alle eienskappe van die ry wanneer dit die blok uitvoer.
|
||||
* [**dispatch\_once**](https://developer.apple.com/documentation/dispatch/1447169-dispatch\_once): Voer 'n blokvoorwerp net een keer uit vir die leeftyd van 'n aansoek.
|
||||
* [**dispatch\_async\_and\_wait**](https://developer.apple.com/documentation/dispatch/3191901-dispatch\_async\_and\_wait): Stuur 'n werkeenheid vir uitvoering en keer slegs terug nadat dit klaar is met uitvoer. Anders as [**`dispatch_sync`**](https://developer.apple.com/documentation/dispatch/1452870-dispatch\_sync), respekteer hierdie funksie alle eienskappe van die ry wanneer dit die blok uitvoer.
|
||||
|
||||
Hierdie funksies verwag hierdie parameters: [**`dispatch_queue_t`**](https://developer.apple.com/documentation/dispatch/dispatch\_queue\_t) **`queue,`** [**`dispatch_block_t`**](https://developer.apple.com/documentation/dispatch/dispatch\_block\_t) **`block`**
|
||||
Hierdie funksies verwag hierdie parameters: [**`dispatch_queue_t`**](https://developer.apple.com/documentation/dispatch/dispatch\_queue\_t) **`ry,`** [**`dispatch_block_t`**](https://developer.apple.com/documentation/dispatch/dispatch\_block\_t) **`blok`**
|
||||
|
||||
Dit is die **struktuur van 'n Blok**:
|
||||
```c
|
||||
|
@ -80,7 +145,7 @@ return 0;
|
|||
```
|
||||
## Swift
|
||||
|
||||
**`libswiftDispatch`** is 'n biblioteek wat **Swift-bindings** aan die Grand Central Dispatch (GCD) raamwerk bied wat oorspronklik in C geskryf is.\
|
||||
**`libswiftDispatch`** is 'n biblioteek wat **Swift-bindings** aan die Grand Central Dispatch (GCD) raamwerk voorsien wat oorspronklik in C geskryf is.\
|
||||
Die **`libswiftDispatch`** biblioteek wikkel die C GCD API's in 'n meer Swift-vriendelike koppelvlak, wat dit makliker en intuïtiever maak vir Swift-ontwikkelaars om met GCD te werk.
|
||||
|
||||
* **`DispatchQueue.global().sync{ ... }`**
|
||||
|
@ -118,7 +183,7 @@ sleep(1) // Simulate a long-running task
|
|||
```
|
||||
## Frida
|
||||
|
||||
Die volgende Frida-skrip kan gebruik word om in verskeie `dispatch`-funksies in te hake en die tou-naam, die agtervolging en die blok te onttrek: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js)
|
||||
Die volgende Frida-skrip kan gebruik word om in verskeie `dispatch`-funksies in te hake en die tou naam, die agtervolging en die blok te onttrek: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js)
|
||||
```bash
|
||||
frida -U <prog_name> -l libdispatch.js
|
||||
|
||||
|
@ -135,7 +200,7 @@ Backtrace:
|
|||
|
||||
Tansaner Ghidra verstaan tans nie die ObjectiveC **`dispatch_block_t`** struktuur nie, sowel as die **`swift_dispatch_block`** een.
|
||||
|
||||
As jy wil hê dit moet hulle verstaan, kan jy hulle net **deklareer**:
|
||||
As jy wil hê dit moet hulle verstaan, kan jy hulle net **declareer**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1157).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -158,3 +223,7 @@ Regsklik op die veranderlike -> Herklassifiseer Veranderlike en kies in hierdie
|
|||
Ghidra sal outomaties alles herskryf:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1163).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
## Verwysings
|
||||
|
||||
* [**\*OS Internals, Volume I: User Mode. Deur Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# macOS Prosesmisbruik
|
||||
# macOS Proseshandelinge
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,109 +6,162 @@
|
|||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
||||
|
||||
</details>
|
||||
|
||||
## MacOS Prosesmisbruik
|
||||
## Basiese Inligting oor Prosesse
|
||||
|
||||
MacOS, soos enige ander bedryfstelsel, bied 'n verskeidenheid metodes en meganismes vir **prosesse om te interakteer, kommunikeer en data te deel**. Alhoewel hierdie tegnieke noodsaaklik is vir doeltreffende stelselwerking, kan dit ook misbruik word deur bedreigingsaktors om **booswillige aktiwiteite uit te voer**.
|
||||
'n Proses is 'n instansie van 'n lopende uitvoerbare lêer, maar prosesse voer nie kode uit nie, dit is drade. Daarom is **prosesse net houers vir lopende drade** wat die geheue, beskrywers, poorte, toestemmings voorsien...
|
||||
|
||||
### Biblioteekinspuiting
|
||||
Tradisioneel is prosesse binne ander prosesse (behalwe PID 1) begin deur **`fork`** te roep wat 'n presiese kopie van die huidige proses sou skep en dan sou die **kindproses** gewoonlik **`execve`** roep om die nuwe uitvoerbare lêer te laai en dit uit te voer. Toe is **`vfork`** ingevoer om hierdie proses vinniger te maak sonder enige geheuekopie.\
|
||||
Toe is **`posix_spawn`** ingevoer wat **`vfork`** en **`execve`** in een oproep kombineer en vlae aanvaar:
|
||||
|
||||
Biblioteekinspuiting is 'n tegniek waarin 'n aanvaller 'n proses dwing om 'n skadelike biblioteek te laai. Sodra ingespuit, hardloop die biblioteek in die konteks van die teikenproses, wat die aanvaller dieselfde toestemmings en toegang bied as die proses.
|
||||
* `POSIX_SPAWN_RESETIDS`: Stel effektiewe ids terug na werklike ids
|
||||
* `POSIX_SPAWN_SETPGROUP`: Stel prosesgroepaffiliasie in
|
||||
* `POSUX_SPAWN_SETSIGDEF`: Stel seinverrigting standaard in
|
||||
* `POSIX_SPAWN_SETSIGMASK`: Stel seinmasker in
|
||||
* `POSIX_SPAWN_SETEXEC`: Voer in dieselfde proses uit (soos `execve` met meer opsies)
|
||||
* `POSIX_SPAWN_START_SUSPENDED`: Begin opgeskort
|
||||
* `_POSIX_SPAWN_DISABLE_ASLR`: Begin sonder ASLR
|
||||
* `_POSIX_SPAWN_NANO_ALLOCATOR:` Gebruik libmalloc se Nano-toewysers
|
||||
* `_POSIX_SPAWN_ALLOW_DATA_EXEC:` Laat `rwx` toe op data-segmente
|
||||
* `POSIX_SPAWN_CLOEXEC_DEFAULT`: Sluit alle lêerbeskrywings op exec(2) standaard
|
||||
* `_POSIX_SPAWN_HIGH_BITS_ASLR:` Randomiseer hoë bietjies van ASLR skuif
|
||||
|
||||
{% content-ref url="macos-library-injection/" %}
|
||||
[macos-library-injection](macos-library-injection/)
|
||||
{% endcontent-ref %}
|
||||
Verder laat `posix_spawn` toe om 'n reeks **`posix_spawnattr`** te spesifiseer wat sekere aspekte van die geskepte proses beheer, en **`posix_spawn_file_actions`** om die toestand van die beskrywers te wysig.
|
||||
|
||||
### Funksiehaking
|
||||
Wanneer 'n proses sterf, stuur dit die **terugvoerkode na die ouerproses** (as die ouer sterf, is die nuwe ouer PID 1) met die sein `SIGCHLD`. Die ouer moet hierdie waarde kry deur `wait4()` of `waitid()` te roep en totdat dit gebeur bly die kind in 'n zombie-toestand waar dit nog gelys word maar nie hulpbronne verbruik nie.
|
||||
|
||||
Funksiehaking behels **onderskepping van funksie-oproepe** of boodskappe binne 'n sagteware-kode. Deur funksies te hak, kan 'n aanvaller die gedrag van 'n proses **verander**, sensitiewe data waarneem, of selfs beheer oor die uitvoervloei verkry.
|
||||
### PIDs
|
||||
|
||||
{% content-ref url="macos-function-hooking.md" %}
|
||||
[macos-function-hooking.md](macos-function-hooking.md)
|
||||
{% endcontent-ref %}
|
||||
PIDs, prosesidentifiseerders, identifiseer 'n unieke proses. In XNU is die **PIDs** van **64-bits** wat monotonies toeneem en **nooit oorvloei** (om misbruik te voorkom).
|
||||
|
||||
### Interproseskommunikasie
|
||||
### Prosesgroepe, Sessies & Coalisies
|
||||
|
||||
Interproseskommunikasie (IPC) verwys na verskillende metodes waardeur afsonderlike prosesse **data deel en uitruil**. Alhoewel IPC fundamenteel is vir baie wettige toepassings, kan dit ook misbruik word om prosesisolasie te omseil, sensitiewe inligting te lek, of ongemagtigde aksies uit te voer.
|
||||
**Prosesse** kan in **groepe** geplaas word om dit makliker te maak om hulle te hanteer. Byvoorbeeld, opdragte in 'n skripskryf sal in dieselfde prosesgroep wees sodat dit moontlik is om hulle saam te **seineer** deur byvoorbeeld te doodmaak.\
|
||||
Dit is ook moontlik om **prosesse in sessies te groepeer**. Wanneer 'n proses 'n sessie begin (`setsid(2)`), word die kinderprosesse binne die sessie geplaas, tensy hulle hul eie sessie begin.
|
||||
|
||||
{% content-ref url="macos-ipc-inter-process-communication/" %}
|
||||
[macos-ipc-inter-process-communication](macos-ipc-inter-process-communication/)
|
||||
{% endcontent-ref %}
|
||||
Coalition is 'n ander manier om prosesse in Darwin te groepeer. 'n Proses wat by 'n coalisie aansluit, kan toegang verkry tot poelhulpbronne, 'n grootboek deel of Jetsam in die gesig staar. Coalisies het verskillende rolle: Leier, XPC-diens, Uitbreiding.
|
||||
|
||||
### Elektron-toepassingsinspuiting
|
||||
### Gelde & Persone
|
||||
|
||||
Elektron-toepassings wat uitgevoer word met spesifieke omgewingsveranderlikes kan vatbaar wees vir prosesinspuiting:
|
||||
Elke proses hou **gelde** aan wat **sy voorregte identifiseer** in die stelsel. Elke proses sal een primêre `uid` en een primêre `gid` hê (alhoewel dit dalk tot verskeie groepe behoort).\
|
||||
Dit is ook moontlik om die gebruiker- en groep-id te verander as die binêre lêer die `setuid/setgid`-bietjie het.\
|
||||
Daar is verskeie funksies om **nuwe uids/gids** in te stel.
|
||||
|
||||
{% content-ref url="macos-electron-applications-injection.md" %}
|
||||
[macos-electron-applications-injection.md](macos-electron-applications-injection.md)
|
||||
{% endcontent-ref %}
|
||||
Die stelselooproep **`persona`** bied 'n **alternatiewe** stel **gelde** aan. Die aanneem van 'n persona aanvaar sy uid, gid en groepslidmaatskappe **op een slag**. In die [**bronkode**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) is dit moontlik om die struktuur te vind:
|
||||
```c
|
||||
struct kpersona_info { uint32_t persona_info_version;
|
||||
uid_t persona_id; /* overlaps with UID */
|
||||
int persona_type;
|
||||
gid_t persona_gid;
|
||||
uint32_t persona_ngroups;
|
||||
gid_t persona_groups[NGROUPS];
|
||||
uid_t persona_gmuid;
|
||||
char persona_name[MAXLOGNAME + 1];
|
||||
|
||||
### Chromium-inspuiting
|
||||
/* TODO: MAC policies?! */
|
||||
}
|
||||
```
|
||||
## Drade Basiese Inligting
|
||||
|
||||
Dit is moontlik om die vlae `--load-extension` en `--use-fake-ui-for-media-stream` te gebruik om 'n **man-in-die-blaaier-aanval** uit te voer wat dit moontlik maak om toetsaanslae, verkeer, koekies te steel, skripte in bladsye in te spuit...:
|
||||
1. **POSIX Drade (pthreads):** macOS ondersteun POSIX drade (`pthreads`), wat deel is van 'n standaard drade API vir C/C++. Die implementering van pthreads in macOS word gevind in `/usr/lib/system/libsystem_pthread.dylib`, wat afkomstig is van die openbarelik beskikbare `libpthread`-projek. Hierdie biblioteek voorsien die nodige funksies om drade te skep en te bestuur.
|
||||
2. **Skep Drade:** Die `pthread_create()`-funksie word gebruik om nuwe drade te skep. Intern, roep hierdie funksie `bsdthread_create()` aan, wat 'n laervlak-sisteemaanroep is wat spesifiek is vir die XNU-kernel (die kernel waarop macOS gebaseer is). Hierdie sisteemaanroep neem verskeie vlae afgelei van `pthread_attr` (eienskappe) wat drade se gedrag spesifiseer, insluitend skeduleringsbeleide en stokgrootte.
|
||||
* **Verstek Stokgrootte:** Die verstek stokgrootte vir nuwe drade is 512 KB, wat voldoende is vir tipiese werksaamhede, maar aangepas kan word via draadseienskappe as meer of minder spasie benodig word.
|
||||
3. **Draadinisialisering:** Die `__pthread_init()`-funksie is noodsaaklik tydens draadopstelling, wat die `env[]`-argument gebruik om omgewingsveranderlikes te ontled wat besonderhede oor die stok se ligging en grootte kan insluit.
|
||||
|
||||
{% content-ref url="macos-chromium-injection.md" %}
|
||||
[macos-chromium-injection.md](macos-chromium-injection.md)
|
||||
{% endcontent-ref %}
|
||||
#### Draadbeëindiging in macOS
|
||||
|
||||
### Vuil NIB
|
||||
1. **Uittree Drade:** Drade word tipies beëindig deur `pthread_exit()` aan te roep. Hierdie funksie laat 'n draad toe om skoon af te sluit, nodige skoonmaakwerk te doen en die draad toe te laat om 'n terugkeerwaarde terug te stuur na enige aansluiters.
|
||||
2. **Draadskoonmaak:** Met die aanroeping van `pthread_exit()` word die funksie `pthread_terminate()` geaktiveer, wat die verwydering van alle geassosieerde draadstrukture hanteer. Dit deallokeer Mach-draadpoorte (Mach is die kommunikasiestelsel in die XNU-kernel) en roep `bsdthread_terminate` aan, 'n sisteemaanroep wat die kernelvlakstrukture verwyder wat met die draad geassosieer is.
|
||||
|
||||
NIB-lêers **definieer gebruikerskoppelvlak (UI) elemente** en hul interaksies binne 'n toepassing. Tog kan hulle **willekeurige bevele uitvoer** en **Gatekeeper verhoed nie** dat 'n reeds uitgevoerde toepassing uitgevoer word as 'n **NIB-lêer gewysig word** nie. Daarom kan dit gebruik word om willekeurige programme willekeurige bevele te laat uitvoer:
|
||||
#### Sinksronisasie Meganismes
|
||||
|
||||
{% content-ref url="macos-dirty-nib.md" %}
|
||||
[macos-dirty-nib.md](macos-dirty-nib.md)
|
||||
{% endcontent-ref %}
|
||||
Om toegang tot gedeelde bronne te bestuur en wedloopvoorwaardes te vermy, voorsien macOS verskeie sinksronisasieprimitiewe. Hierdie is krities in multigewindomgewings om data-integriteit en stelselstabiliteit te verseker:
|
||||
|
||||
### Java-toepassingsinspuiting
|
||||
1. **Mutexes:**
|
||||
* **Gewone Mutex (Handtekening: 0x4D555458):** Standaard mutex met 'n geheueafdruk van 60 byte (56 byte vir die mutex en 4 byte vir die handtekening).
|
||||
* **Vinnige Mutex (Handtekening: 0x4d55545A):** Soortgelyk aan 'n gewone mutex, maar geoptimaliseer vir vinniger werksaamhede, ook 60 byte groot.
|
||||
2. **Toestandsveranderlikes:**
|
||||
* Gebruik vir wag vir sekere toestande om voor te kom, met 'n grootte van 44 byte (40 byte plus 'n 4-byte handtekening).
|
||||
* **Toestandsveranderlike Eienskappe (Handtekening: 0x434e4441):** Konfigurasie-eienskappe vir toestandsveranderlikes, grootte van 12 byte.
|
||||
3. **Eenkeer Veranderlike (Handtekening: 0x4f4e4345):**
|
||||
* Verseker dat 'n stuk inisialisasiekode slegs een keer uitgevoer word. Dit is 12 byte groot.
|
||||
4. **Lees-Skryfslote:**
|
||||
* Laat meerdere lesers of een skrywer op 'n slag toe, fasiliteer effektiewe toegang tot gedeelde data.
|
||||
* **Lees-Skryfslot (Handtekening: 0x52574c4b):** Grootte van 196 byte.
|
||||
* **Lees-Skryfslot Eienskappe (Handtekening: 0x52574c41):** Eienskappe vir lees-skryfslote, grootte van 20 byte.
|
||||
|
||||
Dit is moontlik om sekere java-vermoëns (soos die **`_JAVA_OPTS`** omgewingsveranderlike) te misbruik om 'n java-toepassing willekeurige kode/bevele te laat uitvoer.
|
||||
{% hint style="success" %}
|
||||
Die laaste 4 byte van daardie voorwerpe word gebruik om oorvloei te bepaal.
|
||||
{% endhint %}
|
||||
|
||||
{% content-ref url="macos-java-apps-injection.md" %}
|
||||
[macos-java-apps-injection.md](macos-java-apps-injection.md)
|
||||
{% endcontent-ref %}
|
||||
### Draadlokale Veranderlikes (TLV)
|
||||
|
||||
### .Net-toepassingsinspuiting
|
||||
**Draadlokale Veranderlikes (TLV)** in die konteks van Mach-O-lêers (die formaat vir uitvoerbare lêers in macOS) word gebruik om veranderlikes te verklaar wat spesifiek is vir **elke draad** in 'n multigewinde toepassing. Dit verseker dat elke draad sy eie aparte instansie van 'n veranderlike het, wat 'n manier bied om konflikte te vermy en data-integriteit te handhaaf sonder om eksplisiete sinksronisasie-meganismes soos mutexes nodig te hê.
|
||||
|
||||
Dit is moontlik om kode in .Net-toepassings in te spuit deur **die .Net-afsyenfunksionaliteit te misbruik** (nie beskerm deur macOS-beskermings soos hardewareharding nie).
|
||||
In C en verwante tale kan jy 'n draadlokale veranderlike verklaar deur die **`__thread`** sleutelwoord te gebruik. Hier is hoe dit werk in jou voorbeeld:
|
||||
```c
|
||||
cCopy code__thread int tlv_var;
|
||||
|
||||
{% content-ref url="macos-.net-applications-injection.md" %}
|
||||
[macos-.net-applications-injection.md](macos-.net-applications-injection.md)
|
||||
{% endcontent-ref %}
|
||||
void main (int argc, char **argv){
|
||||
tlv_var = 10;
|
||||
}
|
||||
```
|
||||
Hierdie uittreksel definieer `tlv_var` as 'n draadlokale veranderlike. Elke draad wat hierdie kode hardloop, sal sy eie `tlv_var` hê, en veranderinge wat een draad aan `tlv_var` maak, sal nie `tlv_var` in 'n ander draad beïnvloed nie.
|
||||
|
||||
### Perl-inspuiting
|
||||
In die Mach-O binêre lêer is die data wat verband hou met draadlokale veranderlikes georganiseer in spesifieke afdelings:
|
||||
|
||||
Kyk na verskillende opsies om 'n Perl-skrip willekeurige kode te laat uitvoer in:
|
||||
* **`__DATA.__thread_vars`**: Hierdie afdeling bevat die metadata oor die draadlokale veranderlikes, soos hul tipes en inisialisasiestatus.
|
||||
* **`__DATA.__thread_bss`**: Hierdie afdeling word gebruik vir draadlokale veranderlikes wat nie eksplisiet geïnisialiseer is nie. Dit is 'n deel van die geheue wat apart gesit word vir nul-geïnisialiseerde data.
|
||||
|
||||
{% content-ref url="macos-perl-applications-injection.md" %}
|
||||
[macos-perl-applications-injection.md](macos-perl-applications-injection.md)
|
||||
{% endcontent-ref %}
|
||||
Mach-O bied ook 'n spesifieke API genaamd **`tlv_atexit`** om draadlokale veranderlikes te bestuur wanneer 'n draad eindig. Hierdie API stel jou in staat om **destruktore te registreer**—spesiale funksies wat draadlokale data skoonmaak wanneer 'n draad beëindig.
|
||||
|
||||
### Ruby-inspuiting
|
||||
### Draadprioriteite
|
||||
|
||||
Dit is ook moontlik om ruby-omgewingsveranderlikes te misbruik om willekeurige skripte willekeurige kode te laat uitvoer:
|
||||
Die begrip van draadprioriteite behels om te kyk na hoe die bedryfstelsel besluit watter drade om uit te voer en wanneer. Hierdie besluit word beïnvloed deur die prioriteitsvlak wat aan elke draad toegewys is. In macOS en Unix-soortgelyke stelsels word dit hanteer deur konsepte soos `nice`, `renice`, en Kwaliteit van Diens (QoS) klasse.
|
||||
|
||||
{% content-ref url="macos-ruby-applications-injection.md" %}
|
||||
[macos-ruby-applications-injection.md](macos-ruby-applications-injection.md)
|
||||
{% endcontent-ref %}
|
||||
#### Nice en Renice
|
||||
|
||||
### Python-inspuiting
|
||||
1. **Nice:**
|
||||
* Die `nice`-waarde van 'n proses is 'n nommer wat sy prioriteit beïnvloed. Elke proses het 'n nice-waarde wat wissel tussen -20 (die hoogste prioriteit) en 19 (die laagste prioriteit). Die verstek nice-waarde wanneer 'n proses geskep word, is tipies 0.
|
||||
* 'n Laer nice-waarde (nader aan -20) maak 'n proses meer "selfsugtig," wat dit meer CPU-tyd gee in vergelyking met ander prosesse met hoër nice-waardes.
|
||||
2. **Renice:**
|
||||
* `renice` is 'n bevel wat gebruik word om die nice-waarde van 'n reeds lopende proses te verander. Dit kan gebruik word om dinamies die prioriteit van prosesse aan te pas, deur hul CPU-tydtoekenning te verhoog of te verlaag op grond van nuwe nice-waardes.
|
||||
* Byvoorbeeld, as 'n proses tydelik meer CPU-hulpbronne benodig, kan jy sy nice-waarde verlaag met behulp van `renice`.
|
||||
|
||||
As die omgewingsveranderlike **`PYTHONINSPECT`** ingestel is, sal die python-proses in 'n python-cli val sodra dit klaar is. Dit is ook moontlik om **`PYTHONSTARTUP`** te gebruik om 'n python-skrip aan te dui wat aan die begin van 'n interaktiewe sessie uitgevoer moet word.\
|
||||
Let egter daarop dat die **`PYTHONSTARTUP`**-skrip nie uitgevoer sal word wanneer **`PYTHONINSPECT`** die interaktiewe sessie skep nie.
|
||||
#### Kwaliteit van Diens (QoS) Klasse
|
||||
|
||||
Ander omgewingsveranderlikes soos **`PYTHONPATH`** en **`PYTHONHOME`** kan ook nuttig wees om 'n python-opdrag willekeurige kode te laat uitvoer.
|
||||
QoS-klasse is 'n meer moderne benadering tot die hantering van draadprioriteite, veral in stelsels soos macOS wat **Grand Central Dispatch (GCD)** ondersteun. QoS-klasse stel ontwikkelaars in staat om werk te **kategoriseer** in verskillende vlakke gebaseer op hul belangrikheid of dringendheid. macOS bestuur draadprioritisering outomaties op grond van hierdie QoS-klasse:
|
||||
|
||||
Let daarop dat uitvoerbare lêers wat met **`pyinstaller`** saamgestel is, nie hierdie omgewingsveranderlikes sal gebruik nie, selfs as hulle hardloop met 'n ingeslote python.
|
||||
1. **Gebruiker Interaktief:**
|
||||
* Hierdie klas is vir take wat tans met die gebruiker interaksie het of onmiddellike resultate benodig om 'n goeie gebruikerervaring te bied. Hierdie take kry die hoogste prioriteit om die koppelvlak responsief te hou (bv. animasies of gebeurtenishantering).
|
||||
2. **Gebruiker Geïnisieer:**
|
||||
* Take wat die gebruiker inisieer en onmiddellike resultate verwag, soos die oopmaak van 'n dokument of die klik op 'n knoppie wat berekeninge vereis. Hierdie is hoë prioriteit maar onder gebruiker interaktief.
|
||||
3. **Hulpprogram:**
|
||||
* Hierdie take is langdurig en toon tipies 'n vorderingindikator (bv. lêers aflaai, data invoer). Hulle is laer in prioriteit as gebruiker-geïnisieerde take en hoef nie onmiddellik klaar te wees nie.
|
||||
4. **Agtergrond:**
|
||||
* Hierdie klas is vir take wat in die agtergrond werk en nie sigbaar is vir die gebruiker nie. Dit kan take soos indeksering, sinchronisering, of rugsteun wees. Hulle het die laagste prioriteit en minimale impak op stelselverrigting.
|
||||
|
||||
Deur QoS-klasse te gebruik, hoef ontwikkelaars nie die presiese prioriteitsgetalle te bestuur nie, maar eerder te fokus op die aard van die taak, en die stelsel optimaliseer die CPU-hulpbronne dienooreenkomstig.
|
||||
|
||||
Daarbenewens is daar verskillende **draadskeduleringsbeleide** wat vloei om 'n stel skeduleringsparameters te spesifiseer wat die skeduler in ag sal neem. Dit kan gedoen word met behulp van `thread_policy_[set/get]`. Dit kan nuttig wees in wedloopstoestandaanvalle.
|
||||
### Python Injectering
|
||||
|
||||
Indien die omgewingsveranderlike **`PYTHONINSPECT`** ingestel is, sal die python proses in 'n python-cli val sodra dit klaar is. Dit is ook moontlik om **`PYTHONSTARTUP`** te gebruik om 'n python-skrip aan te dui wat aan die begin van 'n interaktiewe sessie uitgevoer moet word.\
|
||||
Let egter daarop dat die **`PYTHONSTARTUP`** skrip nie uitgevoer sal word wanneer **`PYTHONINSPECT`** die interaktiewe sessie skep nie.
|
||||
|
||||
Ander omgewingsveranderlikes soos **`PYTHONPATH`** en **`PYTHONHOME`** kan ook nuttig wees om 'n python-opdrag arbitrêre kode te laat uitvoer.
|
||||
|
||||
Let daarop dat uitvoerbare lêers wat met **`pyinstaller`** saamgestel is nie hierdie omgewingsveranderlikes sal gebruik nie, selfs al hardloop hulle met 'n ingeslote python.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Oor die algemeen kon ek nie 'n manier vind om python willekeurige kode te laat uitvoer deur omgewingsveranderlikes te misbruik nie.\
|
||||
Oor die algemeen kon ek nie 'n manier vind om python arbitrêre kode te laat uitvoer deur omgewingsveranderlikes te misbruik nie.\
|
||||
Meeste mense installeer egter pyhton met **Hombrew**, wat pyhton in 'n **skryfbare ligging** vir die verstek-admin-gebruiker sal installeer. Jy kan dit oorneem met iets soos:
|
||||
```bash
|
||||
mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
|
||||
|
@ -119,7 +172,7 @@ cat > /opt/homebrew/bin/python3 <<EOF
|
|||
EOF
|
||||
chmod +x /opt/homebrew/bin/python3
|
||||
```
|
||||
Selfs **root** sal hierdie kode hardloop wanneer python hardloop.
|
||||
Selfs **root** sal hierdie kode hardloop wanneer python uitgevoer word.
|
||||
{% endhint %}
|
||||
|
||||
## Opmerking
|
||||
|
@ -130,12 +183,12 @@ Selfs **root** sal hierdie kode hardloop wanneer python hardloop.
|
|||
|
||||
* Deur **Omgewingsveranderlikes** te gebruik: Dit sal die teenwoordigheid van enige van die volgende omgewingsveranderlikes monitor: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** en **`ELECTRON_RUN_AS_NODE`**
|
||||
* Deur **`task_for_pid`** oproepe te gebruik: Om te vind wanneer een proses die **taakpoort van 'n ander** wil kry wat dit moontlik maak om kode in die proses in te spuit.
|
||||
* **Electron apps parameters**: Iemand kan **`--inspect`**, **`--inspect-brk`** en **`--remote-debugging-port`** bevellyn argumente gebruik om 'n Electron app in afstemmingsmodus te begin, en sodoende kode daarin in te spuit.
|
||||
* Deur **symboliese skakels** of **harde skakels** te gebruik: Tipies is die mees algemene misbruik om 'n skakel met ons gebruikersbevoegdhede te **plaas**, en dit na 'n hoër bevoegdheid te **rig**. Die opsporing is baie eenvoudig vir beide harde skakels en simboliese skakels. As die proses wat die skakel skep 'n **verskillende bevoegdheidsvlak** as die teikenlêer het, skep ons 'n **waarskuwing**. Ongelukkig is blokkering in die geval van simboliese skakels nie moontlik nie, aangesien ons nie voor die skepping inligting oor die bestemming van die skakel het nie. Dit is 'n beperking van Apple se EndpointSecuriy-raamwerk.
|
||||
* **Electron app parameters**: Iemand kan **`--inspect`**, **`--inspect-brk`** en **`--remote-debugging-port`** bevellyn argument gebruik om 'n Electron app in afstemmingsmodus te begin, en sodoende kode daarin in te spuit.
|
||||
* Deur **symboliese skakels** of **harde skakels** te gebruik: Tipies is die mees algemene misbruik om 'n skakel met ons gebruikersbevoegdhede te **plaas**, en dit na 'n hoër bevoegdheid te **verwys**. Die opsporing is baie eenvoudig vir beide harde skakels en simboliese skakels. As die proses wat die skakel skep 'n **verskillende bevoegdheidsvlak** as die teikenlêer het, skep ons 'n **waarskuwing**. Ongelukkig is blokkering in die geval van simboliese skakels nie moontlik nie, aangesien ons nie voor die skepping inligting oor die bestemming van die skakel het nie. Dit is 'n beperking van Apple se EndpointSecuriy-raamwerk.
|
||||
|
||||
### Oproepe gemaak deur ander prosesse
|
||||
|
||||
In [**hierdie blogpos**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) kan jy vind hoe dit moontlik is om die funksie **`task_name_for_pid`** te gebruik om inligting oor ander **prosesse wat kode in 'n proses inspuit** te kry en dan inligting oor daardie ander proses te kry.
|
||||
In [**hierdie blogpos**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) kan jy vind hoe dit moontlik is om die funksie **`task_name_for_pid`** te gebruik om inligting te kry oor ander **prosesse wat kode in 'n proses inspuit** en dan inligting oor daardie ander proses te kry.
|
||||
|
||||
Let daarop dat om daardie funksie te roep, moet jy **dieselfde uid** as die een wat die proses hardloop of **root** wees (en dit gee inligting oor die proses, nie 'n manier om kode in te spuit).
|
||||
|
||||
|
@ -146,11 +199,11 @@ Let daarop dat om daardie funksie te roep, moet jy **dieselfde uid** as die een
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS hak van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Leer AWS hak vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **laai HackTricks in PDF af** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
Loading…
Reference in a new issue