mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['macos-hardening/macos-auto-start-locations.md', 'macos-hard
This commit is contained in:
parent
dab715364a
commit
643cfcc505
5 changed files with 780 additions and 460 deletions
|
@ -196,9 +196,10 @@
|
|||
* [macOS Apple Scripts](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/macos-apple-scripts.md)
|
||||
* [macOS TCC Payloads](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-payloads.md)
|
||||
* [macOS Dangerous Entitlements & TCC perms](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md)
|
||||
* [macOS MACF](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf.md)
|
||||
* [macOS FS Tricks](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md)
|
||||
* [macOS xattr-acls extra stuff](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/macos-xattr-acls-extra-stuff.md)
|
||||
* [macOS Users](macos-hardening/macos-security-and-privilege-escalation/macos-users.md)
|
||||
* [macOS Users & External Accounts](macos-hardening/macos-security-and-privilege-escalation/macos-users.md)
|
||||
* [macOS Red Teaming](macos-hardening/macos-red-teaming/README.md)
|
||||
* [macOS MDM](macos-hardening/macos-red-teaming/macos-mdm/README.md)
|
||||
* [Enrolling Devices in Other Organisations](macos-hardening/macos-red-teaming/macos-mdm/enrolling-devices-in-other-organisations.md)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,14 +1,14 @@
|
|||
# macOS Sensitiewe Lokasies & Interessante Daemons
|
||||
|
||||
{% hint style="success" %}
|
||||
Leer & oefen AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Opleiding AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Leer & oefen GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Opleiding GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Leer & oefen AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Opleiding AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Leer & oefen GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Opleiding GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ondersteun HackTricks</summary>
|
||||
|
||||
* Kyk na die [**intekening planne**](https://github.com/sponsors/carlospolop)!
|
||||
* Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
|
||||
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
|
@ -38,9 +38,15 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### Sleutelsak Dump
|
||||
'n Ander manier om die `ShadowHashData` van 'n gebruiker te verkry, is deur `dscl` te gebruik: ``sudo dscl . -read /Users/`whoami` ShadowHashData``
|
||||
|
||||
Let daarop dat wanneer die sekuriteit-binary gebruik word om **die wagwoorde ontcijfer** te dump, verskeie vrae die gebruiker sal vra om hierdie operasie toe te laat.
|
||||
### /etc/master.passwd
|
||||
|
||||
Hierdie lêer word **slegs gebruik** wanneer die stelsel in **enkele-gebruiker modus** loop (so nie baie gereeld nie).
|
||||
|
||||
### Sleutelhouer Dump
|
||||
|
||||
Let daarop dat wanneer die sekuriteit-binary gebruik word om die **ontsleutelde wagwoorde te dump**, verskeie vrae die gebruiker sal vra om hierdie operasie toe te laat.
|
||||
```bash
|
||||
#security
|
||||
security dump-trust-settings [-s] [-d] #List certificates
|
||||
|
@ -57,7 +63,7 @@ Op grond van hierdie kommentaar [juuso/keychaindump#10 (comment)](https://github
|
|||
|
||||
### Keychaindump Oorsig
|
||||
|
||||
'n Gereedskap genaamd **keychaindump** is ontwikkel om wagwoorde uit macOS sleutelhouers te onttrek, maar dit ondervind beperkings op nuwer macOS weergawes soos Big Sur, soos aangedui in 'n [bespreking](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Die gebruik van **keychaindump** vereis dat die aanvaller toegang verkry en bevoegdhede tot **root** verhoog. Die gereedskap benut die feit dat die sleutelhouer standaard ontgrendel is by gebruikersaanmelding vir gerief, wat toepassings toelaat om dit te benader sonder om die gebruiker se wagwoord herhaaldelik te vereis. As 'n gebruiker egter kies om hul sleutelhouer na elke gebruik te sluit, word **keychaindump** ondoeltreffend.
|
||||
'n Gereedskap genaamd **keychaindump** is ontwikkel om wagwoorde uit macOS sleutelhouers te onttrek, maar dit ondervind beperkings op nuwer macOS weergawes soos Big Sur, soos aangedui in 'n [bespreking](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Die gebruik van **keychaindump** vereis dat die aanvaller toegang verkry en voorregte tot **root** verhoog. Die gereedskap benut die feit dat die sleutelhouer standaard ontgrendel is by gebruikersaanmelding vir gerief, wat toelaat dat toepassings toegang daartoe verkry sonder om die gebruiker se wagwoord herhaaldelik te vereis. As 'n gebruiker egter kies om hul sleutelhouer na elke gebruik te vergrendel, word **keychaindump** ondoeltreffend.
|
||||
|
||||
**Keychaindump** werk deur 'n spesifieke proses genaamd **securityd** te teiken, wat deur Apple beskryf word as 'n daemon vir magtiging en kriptografiese operasies, wat noodsaaklik is vir toegang tot die sleutelhouer. Die onttrekkingsproses behels die identifisering van 'n **Master Key** wat afgelei is van die gebruiker se aanmeldwagwoord. Hierdie sleutel is noodsaaklik om die sleutelhouer-lêer te lees. Om die **Master Key** te vind, skandeer **keychaindump** die geheuehoop van **securityd** met behulp van die `vmmap` opdrag, op soek na potensiële sleutels binne areas wat as `MALLOC_TINY` gemerk is. Die volgende opdrag word gebruik om hierdie geheue-lokasies te ondersoek:
|
||||
```bash
|
||||
|
@ -69,9 +75,9 @@ sudo ./keychaindump
|
|||
```
|
||||
### chainbreaker
|
||||
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) kan gebruik word om die volgende tipes inligting uit 'n OSX sleutelketting op 'n forensies-gesonde manier te onttrek:
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) kan gebruik word om die volgende tipes inligting uit 'n OSX sleutelketting op 'n forensies-korrekte manier te onttrek:
|
||||
|
||||
* Gehashde Sleutelketing wagwoord, geskik vir kraken met [hashcat](https://hashcat.net/hashcat/) of [John the Ripper](https://www.openwall.com/john/)
|
||||
* Gehashede Sleutelkettingswagwoord, geskik vir kraken met [hashcat](https://hashcat.net/hashcat/) of [John the Ripper](https://www.openwall.com/john/)
|
||||
* Internet Wagwoorde
|
||||
* Generiese Wagwoorde
|
||||
* Privaat Sleutels
|
||||
|
@ -80,11 +86,11 @@ sudo ./keychaindump
|
|||
* Veilige Aantekeninge
|
||||
* Appleshare Wagwoorde
|
||||
|
||||
Gegewe die sleutelketing ontgrendel wagwoord, 'n meester sleutel verkry met behulp van [volafox](https://github.com/n0fate/volafox) of [volatility](https://github.com/volatilityfoundation/volatility), of 'n ontgrendel lêer soos SystemKey, sal Chainbreaker ook platteks wagwoorde verskaf.
|
||||
Gegewe die sleutelkettingsontsluitwagwoord, 'n meester sleutel verkry met behulp van [volafox](https://github.com/n0fate/volafox) of [volatility](https://github.com/volatilityfoundation/volatility), of 'n ontsluitlêer soos SystemKey, sal Chainbreaker ook plattekswagwoorde verskaf.
|
||||
|
||||
Sonder een van hierdie metodes om die Sleutelketing te ontgrendel, sal Chainbreaker al die ander beskikbare inligting vertoon.
|
||||
Sonder een van hierdie metodes om die Sleutelketing te ontsluit, sal Chainbreaker al die ander beskikbare inligting vertoon.
|
||||
|
||||
#### **Dump sleutelketing sleutels**
|
||||
#### **Dump sleutelkettingsleutels**
|
||||
```bash
|
||||
#Dump all keys of the keychain (without the passwords)
|
||||
python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain
|
||||
|
@ -169,19 +175,55 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
|
|||
|
||||
## Voorkeure
|
||||
|
||||
In macOS toepassings is voorkeure geleë in **`$HOME/Library/Preferences`** en in iOS is dit in `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`. 
|
||||
In macOS toepassings is voorkeure geleë in **`$HOME/Library/Preferences`** en in iOS is dit in `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`.
|
||||
|
||||
In macOS kan die cli-gereedskap **`defaults`** gebruik word om die **Voorkeur lêer** te **wysig**.
|
||||
|
||||
**`/usr/sbin/cfprefsd`** eis die XPC dienste `com.apple.cfprefsd.daemon` en `com.apple.cfprefsd.agent` en kan geroep word om aksies soos om voorkeure te wysig, uit te voer.
|
||||
**`/usr/sbin/cfprefsd`** eis die XPC dienste `com.apple.cfprefsd.daemon` en `com.apple.cfprefsd.agent` en kan geroep word om aksies uit te voer soos om voorkeure te wysig.
|
||||
|
||||
## Stelselnotasies
|
||||
## OpenDirectory permissions.plist
|
||||
|
||||
### Darwin Notasies
|
||||
Die lêer `/System/Library/OpenDirectory/permissions.plist` bevat toestemmings wat op knoopattributen toegepas word en is beskerm deur SIP.\
|
||||
Hierdie lêer verleen toestemmings aan spesifieke gebruikers deur UUID (en nie uid nie) sodat hulle toegang kan verkry tot spesifieke sensitiewe inligting soos `ShadowHashData`, `HeimdalSRPKey` en `KerberosKeys` onder andere:
|
||||
```xml
|
||||
[...]
|
||||
<key>dsRecTypeStandard:Computers</key>
|
||||
<dict>
|
||||
<key>dsAttrTypeNative:ShadowHashData</key>
|
||||
<array>
|
||||
<dict>
|
||||
<!-- allow wheel even though it's implicit -->
|
||||
<key>uuid</key>
|
||||
<string>ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000</string>
|
||||
<key>permissions</key>
|
||||
<array>
|
||||
<string>readattr</string>
|
||||
<string>writeattr</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>dsAttrTypeNative:KerberosKeys</key>
|
||||
<array>
|
||||
<dict>
|
||||
<!-- allow wheel even though it's implicit -->
|
||||
<key>uuid</key>
|
||||
<string>ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000</string>
|
||||
<key>permissions</key>
|
||||
<array>
|
||||
<string>readattr</string>
|
||||
<string>writeattr</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
[...]
|
||||
```
|
||||
## Stelselskennisgewings
|
||||
|
||||
Die hoofdaemon vir notasies is **`/usr/sbin/notifyd`**. Om notasies te ontvang, moet kliënte registreer deur die `com.apple.system.notification_center` Mach-poort (kontroleer dit met `sudo lsmp -p <pid notifyd>`). Die daemon is konfigureerbaar met die lêer `/etc/notify.conf`.
|
||||
### Darwin Kenner
|
||||
|
||||
Die name wat vir notasies gebruik word, is unieke omgekeerde DNS-notasies en wanneer 'n notasie na een van hulle gestuur word, sal die kliënt(e) wat aangedui het dat hulle dit kan hanteer, dit ontvang.
|
||||
Die hoof daemon vir kennisgewings is **`/usr/sbin/notifyd`**. Om kennisgewings te ontvang, moet kliënte registreer deur die `com.apple.system.notification_center` Mach-poort (kontroleer dit met `sudo lsmp -p <pid notifyd>`). Die daemon is konfigureerbaar met die lêer `/etc/notify.conf`.
|
||||
|
||||
Die name wat vir kennisgewings gebruik word, is unieke omgekeerde DNS-notasies en wanneer 'n kennisgewing na een van hulle gestuur word, sal die kliënt(e) wat aangedui het dat hulle dit kan hanteer, dit ontvang.
|
||||
|
||||
Dit is moontlik om die huidige status te dump (en al die name te sien) deur die sein SIGUSR2 na die notifyd-proses te stuur en die gegenereerde lêer te lees: `/var/run/notifyd_<pid>.status`:
|
||||
```bash
|
||||
|
@ -201,11 +243,11 @@ common: com.apple.security.octagon.joined-with-bottle
|
|||
```
|
||||
### Verspreide Kennisgewing Sentrum
|
||||
|
||||
Die **Verspreide Kennisgewing Sentrum** waarvan die hoof binêre **`/usr/sbin/distnoted`** is, is 'n ander manier om kennisgewings te stuur. Dit stel 'n paar XPC dienste bloot en dit voer 'n paar kontroles uit om te probeer om kliënte te verifieer.
|
||||
Die **Verspreide Kennisgewing Sentrum** waarvan die hoof-binary **`/usr/sbin/distnoted`** is, is 'n ander manier om kennisgewings te stuur. Dit stel 'n paar XPC-dienste bloot en dit voer 'n paar kontroles uit om te probeer om kliënte te verifieer.
|
||||
|
||||
### Apple Push Kennisgewings (APN)
|
||||
|
||||
In hierdie geval kan toepassings registreer vir **onderwerpe**. Die kliënt sal 'n token genereer deur Apple se bedieners te kontak deur middel van **`apsd`**.\
|
||||
In hierdie geval kan toepassings registreer vir **onderwerpe**. Die kliënt sal 'n token genereer deur Apple se bedieners te kontak via **`apsd`**.\
|
||||
Dan sal verskaffers ook 'n token genereer en in staat wees om met Apple se bedieners te verbind om boodskappe aan die kliënte te stuur. Hierdie boodskappe sal plaaslik deur **`apsd`** ontvang word wat die kennisgewing aan die toepassing wat daarop wag, sal oordra.
|
||||
|
||||
Die voorkeure is geleë in `/Library/Preferences/com.apple.apsd.plist`.
|
||||
|
@ -220,15 +262,15 @@ Dit is ook moontlik om inligting oor die daemon en verbindings te verkry met:
|
|||
```
|
||||
## User Notifications
|
||||
|
||||
Hierdie is kennisgewings wat die gebruiker op die skerm moet sien:
|
||||
Dit is kennisgewings wat die gebruiker op die skerm moet sien:
|
||||
|
||||
* **`CFUserNotification`**: Hierdie API bied 'n manier om 'n pop-up met 'n boodskap op die skerm te wys.
|
||||
* **Die Bulletin Board**: Dit wys in iOS 'n banner wat verdwyn en in die Kennisgewing Sentrum gestoor sal word.
|
||||
* **`NSUserNotificationCenter`**: Dit is die iOS bulletin board in MacOS. Die databasis met die kennisgewings is geleë in `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -0,0 +1,268 @@
|
|||
# macOS MACF
|
||||
|
||||
{% hint style="success" %}
|
||||
Leer & oefen AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Leer & oefen GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ondersteun HackTricks</summary>
|
||||
|
||||
* Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
|
||||
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
**MACF** staan vir **Verpligte Toegang Beheer Raamwerk**, wat 'n sekuriteitstelsel is wat in die bedryfstelsel ingebou is om jou rekenaar te help beskerm. Dit werk deur **strenge reëls op te stel oor wie of wat toegang tot sekere dele van die stelsel kan hê**, soos lêers, toepassings en stelselhulpbronne. Deur hierdie reëls outomaties af te dwing, verseker MACF dat slegs gemagtigde gebruikers en prosesse spesifieke aksies kan uitvoer, wat die risiko van ongemagtigde toegang of kwaadwillige aktiwiteite verminder.
|
||||
|
||||
Let daarop dat MACF nie werklik enige besluite neem nie, aangesien dit net **aksies onderskep**, dit laat die besluite aan die **beleidsmodules** (kernuitbreidings) wat dit aanroep soos `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext` en `mcxalr.kext`.
|
||||
|
||||
### Stroom
|
||||
|
||||
1. Proses voer 'n syscall/mach trap uit
|
||||
2. Die relevante funksie word binne die kern aangeroep
|
||||
3. Funksie roep MACF aan
|
||||
4. MACF kontroleer beleidsmodules wat versoek het om daardie funksie in hul beleid te haak
|
||||
5. MACF roep die relevante beleids aan
|
||||
6. Beleide dui aan of hulle die aksie toelaat of weier
|
||||
|
||||
{% hint style="danger" %}
|
||||
Apple is die enigste wat die MAC Framework KPI kan gebruik.
|
||||
{% endhint %}
|
||||
|
||||
### Etikette
|
||||
|
||||
MACF gebruik **etikette** wat dan deur die beleide gebruik sal word om te kontroleer of hulle sekere toegang moet toestaan of nie. Die kode van die etikette struktuur verklaring kan [hier gevind word](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h), wat dan binne die **`struct ucred`** in [**hier**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) in die **`cr_label`** deel gebruik word. Die etiket bevat vlae en 'n aantal **slots** wat deur **MACF beleide gebruik kan word om wysigers toe te ken**. Byvoorbeeld, Sanbox sal na die houerprofiel wys.
|
||||
|
||||
## MACF Beleide
|
||||
|
||||
'n MACF Beleid definieer **reëls en voorwaardes wat toegepas moet word in sekere kernoperasies**. 
|
||||
|
||||
'n Kernuitbreiding kan 'n `mac_policy_conf` struktuur konfigureer en dit dan registreer deur `mac_policy_register` aan te roep. Van [hier](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
|
||||
```c
|
||||
#define mpc_t struct mac_policy_conf *
|
||||
|
||||
/**
|
||||
@brief Mac policy configuration
|
||||
|
||||
This structure specifies the configuration information for a
|
||||
MAC policy module. A policy module developer must supply
|
||||
a short unique policy name, a more descriptive full name, a list of label
|
||||
namespaces and count, a pointer to the registered enty point operations,
|
||||
any load time flags, and optionally, a pointer to a label slot identifier.
|
||||
|
||||
The Framework will update the runtime flags (mpc_runtime_flags) to
|
||||
indicate that the module has been registered.
|
||||
|
||||
If the label slot identifier (mpc_field_off) is NULL, the Framework
|
||||
will not provide label storage for the policy. Otherwise, the
|
||||
Framework will store the label location (slot) in this field.
|
||||
|
||||
The mpc_list field is used by the Framework and should not be
|
||||
modified by policies.
|
||||
*/
|
||||
/* XXX - reorder these for better aligment on 64bit platforms */
|
||||
struct mac_policy_conf {
|
||||
const char *mpc_name; /** policy name */
|
||||
const char *mpc_fullname; /** full name */
|
||||
const char **mpc_labelnames; /** managed label namespaces */
|
||||
unsigned int mpc_labelname_count; /** number of managed label namespaces */
|
||||
struct mac_policy_ops *mpc_ops; /** operation vector */
|
||||
int mpc_loadtime_flags; /** load time flags */
|
||||
int *mpc_field_off; /** label slot */
|
||||
int mpc_runtime_flags; /** run time flags */
|
||||
mpc_t mpc_list; /** List reference */
|
||||
void *mpc_data; /** module data */
|
||||
};
|
||||
```
|
||||
Dit is maklik om die kernuitbreidings wat hierdie beleide konfigureer te identifiseer deur oproepe na `mac_policy_register` te kontroleer. Boonop, deur die ontbinding van die uitbreiding te kontroleer, is dit ook moontlik om die gebruikte `mac_policy_conf` struktuur te vind.
|
||||
|
||||
Let daarop dat MACF beleide ook **dynamies** geregistreer en ongeregistreer kan word.
|
||||
|
||||
Een van die hoofvelde van die `mac_policy_conf` is die **`mpc_ops`**. Hierdie veld spesifiseer watter operasies die beleid belangrik is. Let daarop dat daar honderde daarvan is, so dit is moontlik om al hulle op nul te stel en dan net diegene te kies waarin die beleid belangstel. Van [hier](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac\_policy.h.auto.html):
|
||||
```c
|
||||
struct mac_policy_ops {
|
||||
mpo_audit_check_postselect_t *mpo_audit_check_postselect;
|
||||
mpo_audit_check_preselect_t *mpo_audit_check_preselect;
|
||||
mpo_bpfdesc_label_associate_t *mpo_bpfdesc_label_associate;
|
||||
mpo_bpfdesc_label_destroy_t *mpo_bpfdesc_label_destroy;
|
||||
mpo_bpfdesc_label_init_t *mpo_bpfdesc_label_init;
|
||||
mpo_bpfdesc_check_receive_t *mpo_bpfdesc_check_receive;
|
||||
mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve;
|
||||
mpo_cred_check_label_update_t *mpo_cred_check_label_update;
|
||||
[...]
|
||||
```
|
||||
Almost all the hooks will be called back by MACF when one of those operations are intercepted. However, **`mpo_policy_*`** hooks are an exception because `mpo_hook_policy_init()` is a callback called upon registration (so after `mac_policy_register()`) and `mpo_hook_policy_initbsd()` is called during late registration once the BSD subsystem has initialised properly.
|
||||
|
||||
Moreover, the **`mpo_policy_syscall`** hook can be registered by any kext to expose a private **ioctl** style call **interface**. Then, a user client will be able to call `mac_syscall` (#381) specifying as parameters the **policy name** with an integer **code** and optional **arguments**.\
|
||||
For example, the **`Sandbox.kext`** uses this a lot.
|
||||
|
||||
Checking the kext's **`__DATA.__const*`** is possible to identify the `mac_policy_ops` structure used when registering the policy. It's possible to find it because its pointer is at an offset inside `mpo_policy_conf` and also because the amount of NULL pointers that will be in that area.
|
||||
|
||||
Moreover, it's also possible to get the list of kexts that have configured a policy by dumping from memory the struct **`_mac_policy_list`** which is updated with every policy that is registered.
|
||||
|
||||
## MACF Initialisering
|
||||
|
||||
MACF word baie vroeg geïnitialiseer. Dit word opgestel in XNU se `bootstrap_thread`: na `ipc_bootstrap` 'n oproep na `mac_policy_init()` wat die `mac_policy_list` initaliseer en 'n oomblik later word `mac_policy_initmach()` aangeroep. Onder andere dinge, sal hierdie funksie al die Apple kexts met die `AppleSecurityExtension` sleutel in hul Info.plist soos `ALF.kext`, `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext` en `TMSafetyNet.kext` kry en laai.
|
||||
|
||||
## MACF Oproepe
|
||||
|
||||
Dit is algemeen om oproepe na MACF te vind wat in kode gedefinieer is soos: **`#if CONFIG_MAC`** voorwaardelike blokke. Daarbenewens, binne hierdie blokke is dit moontlik om oproepe na `mac_proc_check*` te vind wat MACF aanroep om **toestemmings te kontroleer** om sekere aksies uit te voer. Daarbenewens, die formaat van die MACF oproepe is: **`mac_<object>_<opType>_opName`**.
|
||||
|
||||
Die objek is een van die volgende: `bpfdesc`, `cred`, `file`, `proc`, `vnode`, `mount`, `devfs`, `ifnet`, `inpcb`, `mbuf`, `ipq`, `pipe`, `sysv[msg/msq/shm/sem]`, `posix[shm/sem]`, `socket`, `kext`.\
|
||||
Die `opType` is gewoonlik check wat gebruik sal word om die aksie toe te laat of te weier. Dit is egter ook moontlik om `notify` te vind, wat die kext sal toelaat om op die gegewe aksie te reageer.
|
||||
|
||||
You can find an example in [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern\_mman.c#L621](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern\_mman.c#L621):
|
||||
|
||||
<pre class="language-c"><code class="lang-c">int
|
||||
mmap(proc_t p, struct mmap_args *uap, user_addr_t *retval)
|
||||
{
|
||||
[...]
|
||||
#if CONFIG_MACF
|
||||
<strong> error = mac_file_check_mmap(vfs_context_ucred(ctx),
|
||||
</strong> fp->fp_glob, prot, flags, file_pos + pageoff,
|
||||
&maxprot);
|
||||
if (error) {
|
||||
(void)vnode_put(vp);
|
||||
goto bad;
|
||||
}
|
||||
#endif /* MAC */
|
||||
[...]
|
||||
</code></pre>
|
||||
|
||||
Then, it's possible to find the code of `mac_file_check_mmap` in [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_file.c#L174](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_file.c#L174)
|
||||
```c
|
||||
mac_file_check_mmap(struct ucred *cred, struct fileglob *fg, int prot,
|
||||
int flags, uint64_t offset, int *maxprot)
|
||||
{
|
||||
int error;
|
||||
int maxp;
|
||||
|
||||
maxp = *maxprot;
|
||||
MAC_CHECK(file_check_mmap, cred, fg, NULL, prot, flags, offset, &maxp);
|
||||
if ((maxp | *maxprot) != *maxprot) {
|
||||
panic("file_check_mmap increased max protections");
|
||||
}
|
||||
*maxprot = maxp;
|
||||
return error;
|
||||
}
|
||||
```
|
||||
Wat die `MAC_CHECK` makro aanroep, waarvan die kode gevind kan word in [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_internal.h#L261](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_internal.h#L261)
|
||||
```c
|
||||
/*
|
||||
* MAC_CHECK performs the designated check by walking the policy
|
||||
* module list and checking with each as to how it feels about the
|
||||
* request. Note that it returns its value via 'error' in the scope
|
||||
* of the caller.
|
||||
*/
|
||||
#define MAC_CHECK(check, args...) do { \
|
||||
error = 0; \
|
||||
MAC_POLICY_ITERATE({ \
|
||||
if (mpc->mpc_ops->mpo_ ## check != NULL) { \
|
||||
DTRACE_MACF3(mac__call__ ## check, void *, mpc, int, error, int, MAC_ITERATE_CHECK); \
|
||||
int __step_err = mpc->mpc_ops->mpo_ ## check (args); \
|
||||
DTRACE_MACF2(mac__rslt__ ## check, void *, mpc, int, __step_err); \
|
||||
error = mac_error_select(__step_err, error); \
|
||||
} \
|
||||
}); \
|
||||
} while (0)
|
||||
```
|
||||
Wat al die geregistreerde mac-beleide sal deurgaan, hul funksies aanroep en die uitvoer binne die fout veranderlike stoor, wat slegs deur `mac_error_select` oorruilbaar sal wees deur sukses kodes, so as enige toets misluk, sal die volledige toets misluk en die aksie nie toegelaat word nie.
|
||||
|
||||
{% hint style="success" %}
|
||||
Onthou egter dat nie alle MACF-aanroepings slegs gebruik word om aksies te weier nie. Byvoorbeeld, `mac_priv_grant` roep die makro [**MAC\_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_internal.h#L274) aan, wat die aangevraagde voorreg sal toeken as enige beleid met 'n 0 antwoord gee:
|
||||
```c
|
||||
/*
|
||||
* MAC_GRANT performs the designated check by walking the policy
|
||||
* module list and checking with each as to how it feels about the
|
||||
* request. Unlike MAC_CHECK, it grants if any policies return '0',
|
||||
* and otherwise returns EPERM. Note that it returns its value via
|
||||
* 'error' in the scope of the caller.
|
||||
*/
|
||||
#define MAC_GRANT(check, args...) do { \
|
||||
error = EPERM; \
|
||||
MAC_POLICY_ITERATE({ \
|
||||
if (mpc->mpc_ops->mpo_ ## check != NULL) { \
|
||||
DTRACE_MACF3(mac__call__ ## check, void *, mpc, int, error, int, MAC_ITERATE_GRANT); \
|
||||
int __step_res = mpc->mpc_ops->mpo_ ## check (args); \
|
||||
if (__step_res == 0) { \
|
||||
error = 0; \
|
||||
} \
|
||||
DTRACE_MACF2(mac__rslt__ ## check, void *, mpc, int, __step_res); \
|
||||
} \
|
||||
}); \
|
||||
} while (0)
|
||||
```
|
||||
{% endhint %}
|
||||
|
||||
### priv\_check & priv\_grant
|
||||
|
||||
Hierdie aanroepe is bedoel om (tens of) **privileges** te kontroleer en te verskaf soos gedefinieer in [**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h).\
|
||||
Sommige kernkode sal `priv_check_cred()` aanroep vanaf [**bsd/kern/kern\_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern\_priv.c) met die KAuth geloofsbriewe van die proses en een van die privileges kode wat `mac_priv_check` sal aanroep om te sien of enige beleid **weier** om die privilege te gee en dan roep dit `mac_priv_grant` aan om te sien of enige beleid die `privilege` toeken.
|
||||
|
||||
### proc\_check\_syscall\_unix
|
||||
|
||||
Hierdie haak laat toe om alle stelselaanroepe te onderskep. In `bsd/dev/[i386|arm]/systemcalls.c` is dit moontlik om die verklaarde funksie [`unix_syscall`](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/dev/arm/systemcalls.c#L160C1-L167C25) te sien, wat hierdie kode bevat:
|
||||
```c
|
||||
#if CONFIG_MACF
|
||||
if (__improbable(proc_syscall_filter_mask(proc) != NULL && !bitstr_test(proc_syscall_filter_mask(proc), syscode))) {
|
||||
error = mac_proc_check_syscall_unix(proc, syscode);
|
||||
if (error) {
|
||||
goto skip_syscall;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_MACF */
|
||||
```
|
||||
Wat die oproepende proses **bitmask** sal nagaan of die huidige syscall `mac_proc_check_syscall_unix` moet aanroep. Dit is omdat syscalls so gereeld aangeroep word dat dit interessant is om te probeer om `mac_proc_check_syscall_unix` nie elke keer aan te roep nie.
|
||||
|
||||
Let daarop dat die funksie `proc_set_syscall_filter_mask()`, wat die bitmask syscalls in 'n proses stel, deur Sandbox aangeroep word om masks op gesandboksde prosesse te stel.
|
||||
|
||||
## Blootgestelde MACF syscalls
|
||||
|
||||
Dit is moontlik om met MACF te kommunikeer deur sommige syscalls wat in [security/mac.h](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac.h#L151) gedefinieer is:
|
||||
```c
|
||||
/*
|
||||
* Extended non-POSIX.1e interfaces that offer additional services
|
||||
* available from the userland and kernel MAC frameworks.
|
||||
*/
|
||||
#ifdef __APPLE_API_PRIVATE
|
||||
__BEGIN_DECLS
|
||||
int __mac_execve(char *fname, char **argv, char **envv, mac_t _label);
|
||||
int __mac_get_fd(int _fd, mac_t _label);
|
||||
int __mac_get_file(const char *_path, mac_t _label);
|
||||
int __mac_get_link(const char *_path, mac_t _label);
|
||||
int __mac_get_pid(pid_t _pid, mac_t _label);
|
||||
int __mac_get_proc(mac_t _label);
|
||||
int __mac_set_fd(int _fildes, const mac_t _label);
|
||||
int __mac_set_file(const char *_path, mac_t _label);
|
||||
int __mac_set_link(const char *_path, mac_t _label);
|
||||
int __mac_mount(const char *type, const char *path, int flags, void *data,
|
||||
struct mac *label);
|
||||
int __mac_get_mount(const char *path, struct mac *label);
|
||||
int __mac_set_proc(const mac_t _label);
|
||||
int __mac_syscall(const char *_policyname, int _call, void *_arg);
|
||||
__END_DECLS
|
||||
#endif /*__APPLE_API_PRIVATE*/
|
||||
```
|
||||
## Verwysings
|
||||
|
||||
* [**\*OS Internals Volume III**](https://newosxbook.com/home.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Leer & oefen AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Opleiding AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Leer & oefen GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Opleiding GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Ondersteun HackTricks</summary>
|
||||
|
||||
* Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
|
||||
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -1,8 +1,8 @@
|
|||
# macOS Users
|
||||
# macOS Gebruikers & Eksterne Rekeninge
|
||||
|
||||
{% hint style="success" %}
|
||||
Leer & oefen AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Leer & oefen GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Leer & oefen AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Opleiding AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Leer & oefen GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Opleiding GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -10,22 +10,19 @@ Leer & oefen GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size=
|
|||
|
||||
* Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
|
||||
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel hacking truuks deur PR's in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Algemene Gebruikers
|
||||
|
||||
### Algemene gebruikers
|
||||
|
||||
* **Daemon**: Gebruiker gereserveer vir stelseldemons. Die standaard demon rekeningname begin gewoonlik met 'n "\_":
|
||||
* **Daemon**: Gebruiker gereserveer vir stelseldemons. Die standaard daemon rekeningname begin gewoonlik met 'n "\_":
|
||||
|
||||
```bash
|
||||
_amavisd, _analyticsd, _appinstalld, _appleevents, _applepay, _appowner, _appserver, _appstore, _ard, _assetcache, _astris, _atsserver, _avbdeviced, _calendar, _captiveagent, _ces, _clamav, _cmiodalassistants, _coreaudiod, _coremediaiod, _coreml, _ctkd, _cvmsroot, _cvs, _cyrus, _datadetectors, _demod, _devdocs, _devicemgr, _diskimagesiod, _displaypolicyd, _distnote, _dovecot, _dovenull, _dpaudio, _driverkit, _eppc, _findmydevice, _fpsd, _ftp, _fud, _gamecontrollerd, _geod, _hidd, _iconservices, _installassistant, _installcoordinationd, _installer, _jabber, _kadmin_admin, _kadmin_changepw, _knowledgegraphd, _krb_anonymous, _krb_changepw, _krb_kadmin, _krb_kerberos, _krb_krbtgt, _krbfast, _krbtgt, _launchservicesd, _lda, _locationd, _logd, _lp, _mailman, _mbsetupuser, _mcxalr, _mdnsresponder, _mobileasset, _mysql, _nearbyd, _netbios, _netstatistics, _networkd, _nsurlsessiond, _nsurlstoraged, _oahd, _ondemand, _postfix, _postgres, _qtss, _reportmemoryexception, _rmd, _sandbox, _screensaver, _scsd, _securityagent, _softwareupdate, _spotlight, _sshd, _svn, _taskgated, _teamsserver, _timed, _timezone, _tokend, _trustd, _trustevaluationagent, _unknown, _update_sharing, _usbmuxd, _uucp, _warmd, _webauthserver, _windowserver, _www, _wwwproxy, _xserverdocs
|
||||
```
|
||||
* **Gaste**: Rekening vir gaste met baie streng toestemmings
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
state=("automaticTime" "afpGuestAccess" "filesystem" "guestAccount" "smbGuestAccess")
|
||||
for i in "${state[@]}"; do sysadminctl -"${i}" status; done;
|
||||
|
@ -35,16 +32,21 @@ for i in "${state[@]}"; do sysadminctl -"${i}" status; done;
|
|||
* **Niemand**: Prosesse word met hierdie gebruiker uitgevoer wanneer minimale toestemmings benodig word
|
||||
* **Root**
|
||||
|
||||
### Gebruikersregte
|
||||
## Gebruikersregte
|
||||
|
||||
* **Standaard gebruiker:** Die mees basiese van gebruikers. Hierdie gebruiker benodig toestemmings wat van 'n admin-gebruiker toegestaan word wanneer hy probeer om sagteware te installeer of ander gevorderde take uit te voer. Hulle kan dit nie op hul eie doen nie.
|
||||
* **Admin-gebruiker**: 'n Gebruiker wat die meeste van die tyd as 'n standaard gebruiker werk, maar ook toegelaat word om root aksies uit te voer soos om sagteware te installeer en ander administratiewe take. Alle gebruikers wat tot die admin-groep behoort, **word toegang tot root gegee via die sudoers-lêer**.
|
||||
* **Standaard gebruiker:** Die mees basiese van gebruikers. Hierdie gebruiker benodig toestemmings wat deur 'n admin gebruiker toegestaan word wanneer hy probeer om sagteware te installeer of ander gevorderde take uit te voer. Hulle kan dit nie op hul eie doen nie.
|
||||
* **Admin gebruiker**: 'n Gebruiker wat die meeste van die tyd as 'n standaard gebruiker werk, maar ook toegelaat word om root aksies uit te voer soos om sagteware te installeer en ander administratiewe take. Alle gebruikers wat tot die admin-groep behoort, **kry toegang tot root via die sudoers-lêer**.
|
||||
* **Root**: Root is 'n gebruiker wat toegelaat word om byna enige aksie uit te voer (daar is beperkings wat deur beskermings soos Stelselintegriteitsbeskerming opgelê word).
|
||||
* Byvoorbeeld, root sal nie in staat wees om 'n lêer binne `/System` te plaas nie.
|
||||
|
||||
## Eksterne Rekeninge
|
||||
|
||||
MacOS ondersteun ook om in te log via eksterne identiteitsverskaffers soos FaceBook, Google... Die hoof daemon wat hierdie werk uitvoer is `accountsd` (`/System/Library/Frameworks/Accounts.framework//Versions/A/Support/accountsd`) en dit is moontlik om plugins wat vir eksterne autentisering gebruik word, binne die gids `/System/Library/Accounts/Authentication/` te vind.\
|
||||
Boonop kry `accountsd` die lys van rekeningsoorte van `/Library/Preferences/SystemConfiguration/com.apple.accounts.exists.plist`.
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
Loading…
Reference in a new issue