mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['macos-hardening/macos-auto-start-locations.md', 'macos-hard
This commit is contained in:
parent
e4cf82862f
commit
1d43321129
5 changed files with 775 additions and 450 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,16 +1,16 @@
|
|||
# macOS Sensitive Locations & Interesting Daemons
|
||||
# macOS Wrażliwe Lokalizacje i Interesujące Demony
|
||||
|
||||
{% 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)
|
||||
Ucz się i ćwicz Hacking AWS:<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">\
|
||||
Ucz się i ćwicz Hacking GCP: <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>Support HackTricks</summary>
|
||||
<summary>Wsparcie dla HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Dziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
@ -20,7 +20,7 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
### Hasła Shadow
|
||||
|
||||
Hasło shadow jest przechowywane z konfiguracją użytkownika w plikach plist znajdujących się w **`/var/db/dslocal/nodes/Default/users/`**.\
|
||||
Poniższy jednowierszowiec można użyć do zrzutu **wszystkich informacji o użytkownikach** (w tym informacji o haszach):
|
||||
Poniższy jednowierszowiec może być użyty do zrzutu **wszystkich informacji o użytkownikach** (w tym informacji o haszach):
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -38,9 +38,15 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Innym sposobem na uzyskanie `ShadowHashData` użytkownika jest użycie `dscl`: ``sudo dscl . -read /Users/`whoami` ShadowHashData``
|
||||
|
||||
### /etc/master.passwd
|
||||
|
||||
Ten plik jest **używany tylko** wtedy, gdy system działa w **trybie pojedynczego użytkownika** (więc nie bardzo często).
|
||||
|
||||
### Zrzut Keychain
|
||||
|
||||
Należy zauważyć, że podczas używania binarnego narzędzia security do **zrzutu odszyfrowanych haseł**, użytkownik zostanie poproszony o zezwolenie na tę operację.
|
||||
Należy zauważyć, że podczas używania binarnego pliku security do **zrzutu odszyfrowanych haseł**, kilka komunikatów poprosi użytkownika o zezwolenie na tę operację.
|
||||
```bash
|
||||
#security
|
||||
security dump-trust-settings [-s] [-d] #List certificates
|
||||
|
@ -52,14 +58,14 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
|
|||
### [Keychaindump](https://github.com/juuso/keychaindump)
|
||||
|
||||
{% hint style="danger" %}
|
||||
Na podstawie tego komentarza [juuso/keychaindump#10 (komentarz)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) wygląda na to, że te narzędzia nie działają już w Big Sur.
|
||||
Na podstawie tego komentarza [juuso/keychaindump#10 (komentarz)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) wygląda na to, że te narzędzia już nie działają w Big Sur.
|
||||
{% endhint %}
|
||||
|
||||
### Przegląd Keychaindump
|
||||
|
||||
Narzędzie o nazwie **keychaindump** zostało opracowane w celu wydobywania haseł z pęków kluczy macOS, ale napotyka ograniczenia w nowszych wersjach macOS, takich jak Big Sur, co wskazano w [dyskusji](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Użycie **keychaindump** wymaga, aby atakujący uzyskał dostęp i podniósł uprawnienia do **root**. Narzędzie wykorzystuje fakt, że pęk kluczy jest domyślnie odblokowany po zalogowaniu użytkownika dla wygody, co pozwala aplikacjom na dostęp do niego bez konieczności wielokrotnego wprowadzania hasła użytkownika. Jednak jeśli użytkownik zdecyduje się zablokować swój pęk kluczy po każdym użyciu, **keychaindump** staje się nieskuteczny.
|
||||
Narzędzie o nazwie **keychaindump** zostało opracowane w celu wydobywania haseł z pęków kluczy macOS, ale napotyka ograniczenia w nowszych wersjach macOS, takich jak Big Sur, co zostało wskazane w [dyskusji](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Użycie **keychaindump** wymaga, aby atakujący uzyskał dostęp i podniósł uprawnienia do **root**. Narzędzie wykorzystuje fakt, że pęk kluczy jest domyślnie odblokowany po zalogowaniu użytkownika dla wygody, co pozwala aplikacjom na dostęp do niego bez konieczności wielokrotnego wprowadzania hasła użytkownika. Jednak jeśli użytkownik zdecyduje się zablokować swój pęk kluczy po każdym użyciu, **keychaindump** staje się nieskuteczny.
|
||||
|
||||
**Keychaindump** działa, celując w konkretny proces zwany **securityd**, opisany przez Apple jako demon do autoryzacji i operacji kryptograficznych, kluczowy do uzyskania dostępu do pęku kluczy. Proces wydobywania polega na zidentyfikowaniu **Master Key** pochodzącego z hasła logowania użytkownika. Klucz ten jest niezbędny do odczytu pliku pęku kluczy. Aby zlokalizować **Master Key**, **keychaindump** skanuje stertę pamięci **securityd** za pomocą polecenia `vmmap`, szukając potencjalnych kluczy w obszarach oznaczonych jako `MALLOC_TINY`. Następujące polecenie jest używane do inspekcji tych lokalizacji pamięci:
|
||||
**Keychaindump** działa, celując w konkretny proces zwany **securityd**, opisany przez Apple jako demon do autoryzacji i operacji kryptograficznych, kluczowy do uzyskania dostępu do pęku kluczy. Proces wydobywania polega na zidentyfikowaniu **Master Key** pochodzącego z hasła logowania użytkownika. Klucz ten jest niezbędny do odczytu pliku pęku kluczy. Aby zlokalizować **Master Key**, **keychaindump** skanuje stos pamięci **securityd** za pomocą polecenia `vmmap`, szukając potencjalnych kluczy w obszarach oznaczonych jako `MALLOC_TINY`. Następujące polecenie jest używane do inspekcji tych lokalizacji pamięci:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
|
@ -97,7 +103,7 @@ hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo
|
|||
## Use the previous key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **Zrzut kluczy z pęku kluczy (z hasłami) łamanie hasha**
|
||||
#### **Zrzut kluczy z pęku (z hasłami) łamanie hasha**
|
||||
```bash
|
||||
# Get the keychain hash
|
||||
python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain
|
||||
|
@ -145,7 +151,7 @@ sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
|
|||
|
||||
Możesz znaleźć dane Powiadomień w `$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/`
|
||||
|
||||
Większość interesujących informacji będzie w **blob**. Więc będziesz musiał **wyodrębnić** tę zawartość i **przekształcić** ją na **czytelną** **dla ludzi** lub użyć **`strings`**. Aby uzyskać do niej dostęp, możesz to zrobić:
|
||||
Większość interesujących informacji będzie w **blob**. Musisz więc **wyodrębnić** tę zawartość i **przekształcić** ją na **czytelną** **dla ludzi** lub użyć **`strings`**. Aby uzyskać do niej dostęp, możesz to zrobić:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -169,21 +175,57 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
|
|||
|
||||
## Preferencje
|
||||
|
||||
W aplikacjach macOS preferencje znajdują się w **`$HOME/Library/Preferences`**, a w iOS są w `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`. 
|
||||
W aplikacjach macOS preferencje znajdują się w **`$HOME/Library/Preferences`**, a w iOS są w `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`.
|
||||
|
||||
W macOS narzędzie cli **`defaults`** może być używane do **modyfikacji pliku preferencji**.
|
||||
|
||||
**`/usr/sbin/cfprefsd`** obsługuje usługi XPC `com.apple.cfprefsd.daemon` i `com.apple.cfprefsd.agent` i może być wywoływane w celu wykonania działań, takich jak modyfikacja preferencji.
|
||||
|
||||
## OpenDirectory permissions.plist
|
||||
|
||||
Plik `/System/Library/OpenDirectory/permissions.plist` zawiera uprawnienia stosowane do atrybutów węzła i jest chroniony przez SIP.\
|
||||
Ten plik przyznaje uprawnienia określonym użytkownikom na podstawie UUID (a nie uid), aby mogli uzyskać dostęp do określonych wrażliwych informacji, takich jak `ShadowHashData`, `HeimdalSRPKey` i `KerberosKeys`, między innymi:
|
||||
```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>
|
||||
[...]
|
||||
```
|
||||
## Powiadomienia systemowe
|
||||
|
||||
### Powiadomienia Darwin
|
||||
|
||||
Głównym demonem do powiadomień jest **`/usr/sbin/notifyd`**. Aby otrzymywać powiadomienia, klienci muszą zarejestrować się przez port Mach `com.apple.system.notification_center` (sprawdź je za pomocą `sudo lsmp -p <pid notifyd>`). Demon jest konfigurowalny za pomocą pliku `/etc/notify.conf`.
|
||||
|
||||
Nazwy używane do powiadomień są unikalnymi notacjami DNS w odwrotnej kolejności, a gdy powiadomienie jest wysyłane do jednej z nich, klient(y), które wskazały, że mogą je obsłużyć, otrzymają je.
|
||||
Nazwy używane do powiadomień są unikalnymi notacjami DNS w odwrotnej kolejności, a gdy powiadomienie jest wysyłane do jednej z nich, klient(i), którzy wskazali, że mogą je obsłużyć, otrzymają je.
|
||||
|
||||
Możliwe jest zrzucenie bieżącego statusu (i zobaczenie wszystkich nazw) wysyłając sygnał SIGUSR2 do procesu notifyd i odczytując wygenerowany plik: `/var/run/notifyd_<pid>.status`:
|
||||
Możliwe jest zrzucenie bieżącego stanu (i zobaczenie wszystkich nazw) wysyłając sygnał SIGUSR2 do procesu notifyd i odczytując wygenerowany plik: `/var/run/notifyd_<pid>.status`:
|
||||
```bash
|
||||
ps -ef | grep -i notifyd
|
||||
0 376 1 0 15Mar24 ?? 27:40.97 /usr/sbin/notifyd
|
||||
|
@ -227,8 +269,8 @@ To są powiadomienia, które użytkownik powinien zobaczyć na ekranie:
|
|||
* **`NSUserNotificationCenter`**: To jest tablica ogłoszeń iOS w MacOS. Baza danych z powiadomieniami znajduje się w `/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" %}
|
||||
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>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
**MACF** oznacza **Mandatory Access Control Framework**, który jest systemem zabezpieczeń wbudowanym w system operacyjny, aby pomóc chronić komputer. Działa poprzez ustalanie **ścisłych zasad dotyczących tego, kto lub co może uzyskać dostęp do określonych części systemu**, takich jak pliki, aplikacje i zasoby systemowe. Dzięki automatycznemu egzekwowaniu tych zasad, MACF zapewnia, że tylko autoryzowani użytkownicy i procesy mogą wykonywać określone działania, co zmniejsza ryzyko nieautoryzowanego dostępu lub złośliwych działań.
|
||||
|
||||
Należy zauważyć, że MACF nie podejmuje żadnych decyzji, ponieważ po prostu **przechwytuje** działania, pozostawiając decyzje modułom **polityki** (rozszerzenia jądra), które wywołuje, takim jak `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext` i `mcxalr.kext`.
|
||||
|
||||
### Przepływ
|
||||
|
||||
1. Proces wykonuje syscall/mach trap
|
||||
2. Odpowiednia funkcja jest wywoływana wewnątrz jądra
|
||||
3. Funkcja wywołuje MACF
|
||||
4. MACF sprawdza moduły polityki, które zażądały podpięcia tej funkcji w swojej polityce
|
||||
5. MACF wywołuje odpowiednie polityki
|
||||
6. Polityki wskazują, czy zezwalają na działanie, czy je odrzucają
|
||||
|
||||
{% hint style="danger" %}
|
||||
Apple jest jedyną firmą, która może korzystać z KPI Framework MAC.
|
||||
{% endhint %}
|
||||
|
||||
### Etykiety
|
||||
|
||||
MACF używa **etykiet**, które następnie polityki sprawdzają, czy powinny przyznać dostęp, czy nie. Kod deklaracji struktury etykiet można [znaleźć tutaj](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h), która jest następnie używana wewnątrz **`struct ucred`** w [**tutaj**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) w części **`cr_label`**. Etykieta zawiera flagi i liczbę **slotów**, które mogą być używane przez **polityki MACF do alokacji wskaźników**. Na przykład Sanbox będzie wskazywał na profil kontenera.
|
||||
|
||||
## Polityki MACF
|
||||
|
||||
Polityka MACF definiuje **zasady i warunki, które mają być stosowane w określonych operacjach jądra**. 
|
||||
|
||||
Rozszerzenie jądra może skonfigurować strukturę `mac_policy_conf`, a następnie zarejestrować ją, wywołując `mac_policy_register`. Z [tutaj](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 */
|
||||
};
|
||||
```
|
||||
Łatwo jest zidentyfikować rozszerzenia jądra konfigurowane przez te polityki, sprawdzając wywołania do `mac_policy_register`. Co więcej, sprawdzając dezasemblację rozszerzenia, można również znaleźć używaną strukturę `mac_policy_conf`.
|
||||
|
||||
Zauważ, że polityki MACF mogą być rejestrowane i deregisterowane również **dynamicznie**.
|
||||
|
||||
Jednym z głównych pól `mac_policy_conf` jest **`mpc_ops`**. To pole określa, którymi operacjami polityka jest zainteresowana. Zauważ, że jest ich setki, więc możliwe jest wyzerowanie wszystkich z nich, a następnie wybranie tylko tych, którymi polityka jest zainteresowana. Z [tutaj](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 Initialization
|
||||
|
||||
MACF is initialised very soon. It's set up in XNU's `bootstrap_thread`: after `ipc_bootstrap` a call to `mac_policy_init()` which initializes the `mac_policy_list` and moments later `mac_policy_initmach()` is called. Among other things, this function will get all the Apple kexts with the `AppleSecurityExtension` key in their Info.plist like `ALF.kext`, `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext` and `TMSafetyNet.kext` and loads them.
|
||||
|
||||
## MACF Callouts
|
||||
|
||||
It's common to find callouts to MACF defined in code like: **`#if CONFIG_MAC`** conditional blocks. Moreover, inside these blocks it's possible to find calls to `mac_proc_check*` which calls MACF to **check for permissions** to perform certain actions. Moreover, the format of the MACF callouts is: **`mac_<object>_<opType>_opName`**.
|
||||
|
||||
The object is one of the following: `bpfdesc`, `cred`, `file`, `proc`, `vnode`, `mount`, `devfs`, `ifnet`, `inpcb`, `mbuf`, `ipq`, `pipe`, `sysv[msg/msq/shm/sem]`, `posix[shm/sem]`, `socket`, `kext`.\
|
||||
The `opType` is usually check which will be used to allow or deny the action. However, it's also possible to find `notify`, which will allow the kext to react to the given action.
|
||||
|
||||
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;
|
||||
}
|
||||
```
|
||||
Który wywołuje makro `MAC_CHECK`, którego kod można znaleźć w [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)
|
||||
```
|
||||
Które przejdzie przez wszystkie zarejestrowane polityki mac, wywołując ich funkcje i przechowując wynik w zmiennej error, która będzie mogła być nadpisywana tylko przez `mac_error_select` za pomocą kodów sukcesu, więc jeśli jakiekolwiek sprawdzenie się nie powiedzie, całe sprawdzenie się nie powiedzie, a akcja nie będzie dozwolona.
|
||||
|
||||
{% hint style="success" %}
|
||||
Jednak pamiętaj, że nie wszystkie wywołania MACF są używane tylko do odrzucania akcji. Na przykład, `mac_priv_grant` wywołuje makro [**MAC\_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac\_internal.h#L274), które przyzna żądane uprawnienie, jeśli jakakolwiek polityka odpowie 0:
|
||||
```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
|
||||
|
||||
Te wywołania mają na celu sprawdzenie i przyznanie (dziesiątek) **uprawnień** zdefiniowanych w [**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h).\
|
||||
Niektóre kody jądra wywołają `priv_check_cred()` z [**bsd/kern/kern\_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_priv.c) z poświadczeniami KAuth procesu oraz jednym z kodów uprawnień, które wywołają `mac_priv_check`, aby sprawdzić, czy jakakolwiek polityka **odmawia** przyznania uprawnienia, a następnie wywołuje `mac_priv_grant`, aby sprawdzić, czy jakakolwiek polityka przyznaje `uprawnienie`.
|
||||
|
||||
### proc\_check\_syscall\_unix
|
||||
|
||||
Ten hak pozwala na przechwytywanie wszystkich wywołań systemowych. W `bsd/dev/[i386|arm]/systemcalls.c` można zobaczyć zadeklarowaną funkcję [`unix_syscall`](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/dev/arm/systemcalls.c#L160C1-L167C25), która zawiera ten kod:
|
||||
```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 */
|
||||
```
|
||||
Który sprawdzi w wywołującym procesie **bitmask**, czy bieżący syscall powinien wywołać `mac_proc_check_syscall_unix`. Dzieje się tak, ponieważ syscalls są wywoływane tak często, że warto unikać wywoływania `mac_proc_check_syscall_unix` za każdym razem.
|
||||
|
||||
Zauważ, że funkcja `proc_set_syscall_filter_mask()`, która ustawia bitmask syscalls w procesie, jest wywoływana przez Sandbox w celu ustawienia masek na procesach w piaskownicy.
|
||||
|
||||
## Ekspozycja syscalli MACF
|
||||
|
||||
Możliwe jest interakcja z MACF za pomocą niektórych syscalli zdefiniowanych w [security/mac.h](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac.h#L151):
|
||||
```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*/
|
||||
```
|
||||
## References
|
||||
|
||||
* [**\*OS Internals Volume III**](https://newosxbook.com/home.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Ucz się i ćwicz Hacking AWS:<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">\
|
||||
Ucz się i ćwicz Hacking GCP: <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>Wsparcie dla HackTricks</summary>
|
||||
|
||||
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Dziel się trikami hackingowymi, 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>
|
||||
{% endhint %}
|
|
@ -1,8 +1,8 @@
|
|||
# Użytkownicy macOS
|
||||
# Użytkownicy macOS i konta zewnętrzne
|
||||
|
||||
{% hint style="success" %}
|
||||
Ucz się i ćwicz Hacking AWS:<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">\
|
||||
Ucz się i ćwicz Hacking GCP: <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)
|
||||
Ucz się i ćwicz Hacking AWS:<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">\
|
||||
Ucz się i ćwicz Hacking GCP: <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>
|
||||
|
||||
|
@ -10,20 +10,19 @@ Ucz się i ćwicz Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-
|
|||
|
||||
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
|
||||
* **Dziel się sztuczkami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
|
||||
### Wspólni Użytkownicy
|
||||
## Wspólni użytkownicy
|
||||
|
||||
* **Daemon**: Użytkownik zarezerwowany dla demonów systemowych. Domyślne nazwy kont demonów zazwyczaj zaczynają się od "\_":
|
||||
|
||||
```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
|
||||
```
|
||||
* **Gość**: Konto dla gości z bardzo restrykcyjnymi uprawnieniami
|
||||
* **Gość**: Konto dla gości z bardzo surowymi uprawnieniami
|
||||
```bash
|
||||
state=("automaticTime" "afpGuestAccess" "filesystem" "guestAccount" "smbGuestAccess")
|
||||
for i in "${state[@]}"; do sysadminctl -"${i}" status; done;
|
||||
|
@ -33,24 +32,29 @@ for i in "${state[@]}"; do sysadminctl -"${i}" status; done;
|
|||
* **Nikt**: Procesy są wykonywane z tym użytkownikiem, gdy wymagane są minimalne uprawnienia
|
||||
* **Root**
|
||||
|
||||
### Uprawnienia użytkowników
|
||||
## Uprawnienia użytkowników
|
||||
|
||||
* **Użytkownik standardowy:** Najbardziej podstawowy użytkownik. Ten użytkownik potrzebuje uprawnień przyznanych przez użytkownika administracyjnego, gdy próbuje zainstalować oprogramowanie lub wykonać inne zaawansowane zadania. Nie jest w stanie zrobić tego samodzielnie.
|
||||
* **Użytkownik administracyjny**: Użytkownik, który działa przez większość czasu jako użytkownik standardowy, ale ma również prawo do wykonywania działań root, takich jak instalacja oprogramowania i inne zadania administracyjne. Wszyscy użytkownicy należący do grupy administratorów mają **dostęp do roota za pośrednictwem pliku sudoers**.
|
||||
* **Root**: Root to użytkownik, któremu zezwala się na wykonywanie prawie każdej akcji (istnieją ograniczenia nałożone przez zabezpieczenia, takie jak System Integrity Protection).
|
||||
* **Root**: Root to użytkownik, który ma prawo do wykonywania prawie każdej akcji (istnieją ograniczenia nałożone przez zabezpieczenia, takie jak System Integrity Protection).
|
||||
* Na przykład root nie będzie w stanie umieścić pliku w `/System`
|
||||
|
||||
## Konta zewnętrzne
|
||||
|
||||
MacOS obsługuje również logowanie za pośrednictwem zewnętrznych dostawców tożsamości, takich jak FaceBook, Google... Główny demon wykonujący tę pracę to `accountsd` (`/System/Library/Frameworks/Accounts.framework//Versions/A/Support/accountsd`) i możliwe jest znalezienie wtyczek używanych do zewnętrznej autoryzacji w folderze `/System/Library/Accounts/Authentication/`.\
|
||||
Ponadto `accountsd` pobiera listę typów kont z `/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>
|
||||
|
||||
<summary>Wsparcie HackTricks</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podziel się sztuczkami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
Loading…
Reference in a new issue