Translated ['macos-hardening/macos-security-and-privilege-escalation/mac

This commit is contained in:
Translator 2024-07-11 00:12:33 +00:00
parent a8cd23ae01
commit 2d3a782c53

View file

@ -6,7 +6,7 @@
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
@ -18,9 +18,9 @@ Drugi načini podrške HackTricks-u:
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
[**WhiteIntel**](https://whiteintel.io) je pretraživač pokretan **dark-web-om** koji nudi **besplatne** funkcionalnosti za proveru da li je kompanija ili njeni korisnici **kompromitovani** od strane **malvera za krađu podataka**.
[**WhiteIntel**](https://whiteintel.io) je pretraživač pokretan **dark-web**-om koji nudi **besplatne** funkcionalnosti za proveru da li je kompanija ili njeni korisnici **kompromitovani** od strane **malvera za krađu podataka**.
Njihov primarni cilj WhiteIntel-a je borba protiv preuzimanja naloga i napada ransomware-a koji proizilaze iz malvera za krađu informacija.
Njihov primarni cilj WhiteIntela je borba protiv preuzimanja naloga i napada ransomware-a koji proizilaze iz malvera za krađu informacija.
Možete posetiti njihovu veb stranicu i isprobati njihovu mašinu za **besplatno** na:
@ -30,14 +30,12 @@ Možete posetiti njihovu veb stranicu i isprobati njihovu mašinu za **besplatno
## Statistička Analiza
### otool
### otool & objdump & nm
```bash
otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application
```
### objdump
{% code overflow="wrap" %}
{% код препун="wrap" %}
```bash
objdump -m --dylibs-used /bin/ls #List dynamically linked libraries
objdump -m -h /bin/ls # Get headers information
@ -47,10 +45,21 @@ objdump -d /bin/ls # Dissasemble the binary
objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour
```
{% endcode %}
```bash
nm -m ./tccd # List of symbols
```
### jtool2 & Disarm
### jtool2
Ovaj alat može se koristiti kao **zamena** za **codesign**, **otool** i **objdump**, i pruža nekoliko dodatnih funkcija. [**Preuzmite ga ovde**](http://www.newosxbook.com/tools/jtool.html) ili ga instalirajte pomoću `brew`.
Možete [**preuzeti disarm odavde**](https://newosxbook.com/tools/disarm.html).
```bash
ARCH=arm64e disarm -c -i -I --signature /path/bin # Get bin info and signature
ARCH=arm64e disarm -c -l /path/bin # Get binary sections
ARCH=arm64e disarm -c -L /path/bin # Get binary commands (dependencies included)
ARCH=arm64e disarm -c -S /path/bin # Get symbols (func names, strings...)
ARCH=arm64e disarm -c -d /path/bin # Get disasembled
jtool2 -d __DATA.__const myipc_server | grep MIG # Get MIG info
```
Možete [**preuzeti jtool2 ovde**](http://www.newosxbook.com/tools/jtool.html) ili ga instalirati pomoću `brew`.
```bash
# Install
brew install --cask jtool2
@ -67,9 +76,13 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
# Get MIG information
jtool2 -d __DATA.__const myipc_server | grep MIG
```
### Potpisivanje koda / ldid
{% hint style="danger" %}
**jtool je zastareo u korist disarm-a**
{% endhint %}
### Codesign / ldid
{% hint style="success" %}
**`Codesign`** se može pronaći u **macOS-u**, dok se **`ldid`** može pronaći u **iOS-u**
{% endhint %}
```bash
@ -100,42 +113,49 @@ ldid -S/tmp/entl.xml <binary>
```
### SuspiciousPackage
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) je alat koristan za inspekciju **.pkg** fajlova (instalatera) i videti šta se nalazi unutra pre instaliranja.\
Ovi instalateri imaju `preinstall` i `postinstall` bash skripte koje zlonamerni autori obično zloupotrebljavaju da **upornost** **zlonamernog softvera**.
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) je alat koristan za inspekciju **.pkg** fajlova (instalatera) i videti šta se nalazi unutra pre instalacije.\
Ovi instalateri imaju `preinstall` i `postinstall` bash skripte koje zlonamerni autori obično zloupotrebljavaju da bi **upornost** **zlonamernog softvera**.
### hdiutil
Ovaj alat omogućava da se **montiraju** Apple disk slike (**.dmg**) fajlovi radi njihove inspekcije pre pokretanja bilo čega:
Ovaj alat omogućava da se **montiraju** Apple disk slike (**.dmg**) fajlovi radi inspekcije pre pokretanja bilo čega:
```bash
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
```
### Objective-C
Biće montiran u `/Volumes`
#### Metapodaci
### Pakovani binarni fajlovi
* Proverite visoku entropiju
* Proverite stringove (da li postoji gotovo nijedan razumljiv string, pakovan)
* Paker UPX za MacOS generiše sekciju nazvanu "\_\_XHDR"
## Statistička analiza Objective-C
### Metapodaci
{% hint style="danger" %}
Imajte na umu da programi napisani u Objective-C **zadržavaju** svoje deklaracije klasa **kada** **se** **kompajliraju** u [Mach-O binarne datoteke](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Takve deklaracije klasa **uključuju** ime i tip:
Imajte na umu da programi napisani u Objective-C **zadržavaju** svoje deklaracije klasa **kada** **su** **kompajlirani** u [Mach-O binarne datoteke](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Takve deklaracije klasa **uključuju** ime i tip:
{% endhint %}
* Klasu
* Metode klase
* Instance varijable klase
* Definisane interfejse
* Metode interfejsa
* Instance varijable interfejsa
* Definisane protokole
Ove informacije možete dobiti koristeći [**class-dump**](https://github.com/nygard/class-dump):
```bash
class-dump Kindle.app
```
#### Pozivanje funkcija
Imajte na umu da ova imena mogu biti zamagljena kako bi se otežalo reverzno inženjerstvo binarnog koda.
Kada se funkcija pozove u binarnom fajlu koji koristi Objective-C, kompajlirani kod umesto pozivanja te funkcije, pozvaće **`objc_msgSend`**. Što će pozvati konačnu funkciju:
### Pozivanje funkcija
Kada se funkcija poziva u binarnom fajlu koji koristi Objective-C, kompajlirani kod umesto pozivanja te funkcije, pozvaće **`objc_msgSend`**. Što će pozvati konačnu funkciju:
![](<../../../.gitbook/assets/image (305).png>)
Parametri koje ova funkcija očekuje su:
* Prvi parametar (**self**) je "pokazivač koji pokazuje na **instancu klase koja treba da primi poruku**". Jednostavnije rečeno, to je objekat na koji se metod poziva. Ako je metod klasni metod, ovo će biti instanca objekta klase (u celini), dok će za instancu metoda, self pokazivati na instanciranu instancu klase kao objekat.
* Drugi parametar, (**op**), je "selektor metoda koji obrađuje poruku". Ponovo, jednostavnije rečeno, ovo je samo **ime metoda**.
* Preostali parametri su bilo **vrednosti koje su potrebne metodu** (op).
* Prvi parametar (**self**) je "pokazivač koji pokazuje na **instancu klase koja treba da primi poruku**". Jednostavnije rečeno, to je objekat na koji se poziva metoda. Ako je metoda klasna metoda, ovo će biti instanca objekta klase (u celini), dok će za instancu metodu, self će pokazivati na instanciranu instancu klase kao objekat.
* Drugi parametar, (**op**), je "selektor metode koja obrađuje poruku". Ponovo, jednostavnije rečeno, ovo je samo **ime metode**.
* Preostali parametri su bilo **vrednosti koje su potrebne metodi** (op).
Pogledajte kako **lako dobiti ove informacije sa `lldb` u ARM64** na ovoj stranici:
@ -145,25 +165,52 @@ Pogledajte kako **lako dobiti ove informacije sa `lldb` u ARM64** na ovoj strani
x64:
| **Argument** | **Registar** | **(za) objc\_msgSend** |
| ----------------- | -------------------------------------------------------------- | ----------------------------------------------------- |
| **1. argument** | **rdi** | **self: objekat na koji se metod poziva** |
| **2. argument** | **rsi** | **op: ime metoda** |
| **3. argument** | **rdx** | **1. argument metoda** |
| **4. argument** | **rcx** | **2. argument metoda** |
| **5. argument** | **r8** | **3. argument metoda** |
| **6. argument** | **r9** | **4. argument metoda** |
| **7.+ argument** | <p><strong>rsp+</strong><br><strong>(na steku)</strong></p> | **5.+ argument metoda** |
| **Argument** | **Registar** | **(za) objc\_msgSend** |
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
| **1. argument** | **rdi** | **self: objekat na koji se poziva metoda** |
| **2. argument** | **rsi** | **op: ime metode** |
| **3. argument** | **rdx** | **1. argument metodi** |
| **4. argument** | **rcx** | **2. argument metodi** |
| **5. argument** | **r8** | **3. argument metodi** |
| **6. argument** | **r9** | **4. argument metodi** |
| **7. i više argumenata** | <p><strong>rsp+</strong><br><strong>(na steku)</strong></p> | **5. i više argumenata metodi** |
### Izbaci ObjectiveC metapodatke
### Dynadump
[**Dynadump**](https://github.com/DerekSelander/dynadump) je alat za dobijanje Objc-klasa iz dylibs.
[**Dynadump**](https://github.com/DerekSelander/dynadump) je alat za izbacivanje klasa Objective-C binarnih fajlova. GitHub specifikuje dylibs ali ovo takođe funkcioniše sa izvršnim fajlovima.
```bash
./dynadump dump /path/to/bin
```
U trenutku pisanja, ovo je **trenutno ono što najbolje funkcioniše**.
### Swift
#### Redovni alati
```bash
nm --dyldinfo-only /path/to/bin
otool -ov /path/to/bin
objdump --macho --objc-meta-data /path/to/bin
```
#### class-dump
Sa Swift binarnim fajlovima, budući da postoji kompatibilnost sa Objective-C, ponekad možete izvući deklaracije koristeći [class-dump](https://github.com/nygard/class-dump/) ali ne uvek.
[**class-dump**](https://github.com/nygard/class-dump/) je originalni alat koji generiše deklaracije za klase, kategorije i protokole u formatiranom ObjectiveC kodu.
Pomoću komandne linije **`jtool -l`** ili **`otool -l`** moguće je pronaći nekoliko sekcija koje počinju sa prefiksom **`__swift5`**:
Star je i nije održavan, pa verovatno neće pravilno raditi.
#### ICDump
[**iCDump**](https://github.com/romainthomas/iCDump) je moderan i višepatformski Objective-C class dump. U poređenju sa postojećim alatima, iCDump može raditi nezavisno od Apple ekosistema i izlaže Python veze.
```python
import icdump
metadata = icdump.objc.parse("/path/to/bin")
print(metadata.to_decl())
```
## Statička analiza Swift-a
Sa Swift binarnim fajlovima, s obzirom da postoji kompatibilnost sa Objective-C-om, ponekad možete izvući deklaracije koristeći [class-dump](https://github.com/nygard/class-dump/), ali ne uvek.
Pomoću komandi **`jtool -l`** ili **`otool -l`** moguće je pronaći nekoliko sekcija koje počinju sa prefiksom **`__swift5`**:
```bash
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
@ -177,7 +224,7 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
```
Možete pronaći dodatne informacije o **informacijama koje se čuvaju u ovim sekcijama u ovom blog postu**.
Štaviše, **Swift binarni fajlovi mogu imati simbole** (na primer, biblioteke moraju čuvati simbole kako bi se funkcije mogle pozvati). **Simboli obično sadrže informacije o imenu funkcije** i atributima na neuredan način, pa su veoma korisni, i postoje "**demangleri"** koji mogu dobiti originalno ime:
Štaviše, **Swift binarni fajlovi mogu imati simbole** (na primer, biblioteke moraju čuvati simbole kako bi se funkcije mogle pozvati). **Simboli obično sadrže informacije o imenu funkcije** i atributima na ružan način, pa su veoma korisni, i postoje "**demangleri"** koji mogu dobiti originalno ime:
```bash
# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
@ -185,12 +232,6 @@ https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
# Swift cli
swift demangle
```
### Pakovani binarnih fajlova
* Provera visoke entropije
* Provera stringova (da li postoji skoro nijedan razumljiv string, pakovan)
* UPX paket za MacOS generiše sekciju nazvanu "\_\_XHDR"
## Dinamička analiza
{% hint style="warning" %}
@ -198,51 +239,51 @@ Imajte na umu da bi za debagovanje binarnih fajlova, **SIP treba da bude onemogu
{% endhint %}
{% hint style="warning" %}
Imajte na umu da bi za **instrumentiranje sistemskih binarnih fajlova** (kao što je `cloudconfigurationd`) na macOS-u, **SIP mora biti onemogućen** (samo uklanjanje potpisa neće raditi).
Imajte na umu da bi za **instrumentaciju sistemskih binarnih fajlova** (kao što je `cloudconfigurationd`) na macOS-u, **SIP mora biti onemogućen** (samo uklanjanje potpisa neće raditi).
{% endhint %}
### API-ji
macOS izlaže neke zanimljive API-jeve koji pružaju informacije o procesima:
* `proc_info`: Ovo je glavni koji pruža puno informacija o svakom procesu. Potrebno je da budete root da biste dobili informacije o drugim procesima, ali vam nisu potrebna posebna ovlašćenja ili mach portovi.
* `proc_info`: Ovo je glavni API koji pruža mnogo informacija o svakom procesu. Potrebno je biti root korisnik da biste dobili informacije o drugim procesima, ali vam nisu potrebna posebna ovlašćenja ili mach portovi.
* `libsysmon.dylib`: Omogućava dobijanje informacija o procesima putem XPC izloženih funkcija, međutim, potrebno je imati ovlašćenje `com.apple.sysmond.client`.
### Stackshot & microstackshots
**Stackshotting** je tehnika koja se koristi za snimanje stanja procesa, uključujući stek poziva svih pokrenutih niti. Ovo je posebno korisno za debagovanje, analizu performansi i razumevanje ponašanja sistema u određenom trenutku. Na iOS-u i macOS-u, stackshotting se može izvršiti korišćenjem nekoliko alata i metoda poput alata **`sample`** i **`spindump`**.
**Stackshotting** je tehnika koja se koristi za snimanje stanja procesa, uključujući stekove poziva svih pokrenutih niti. Ovo je posebno korisno za debagovanje, analizu performansi i razumevanje ponašanja sistema u određenom trenutku. Na iOS-u i macOS-u, stackshotting se može izvršiti korišćenjem nekoliko alata i metoda poput alata **`sample`** i **`spindump`**.
### Sysdiagnose
Ovaj alat (`/usr/bini/ysdiagnose`) uglavnom prikuplja puno informacija sa vašeg računara izvršavajući desetine različitih komandi poput `ps`, `zprint`...
Ovaj alat (`/usr/bini/ysdiagnose`) uglavnom prikuplja mnogo informacija sa vašeg računara izvršavajući desetine različitih komandi poput `ps`, `zprint`...
Mora se pokrenuti kao **root** i daemon `/usr/libexec/sysdiagnosed` ima veoma zanimljiva ovlašćenja poput `com.apple.system-task-ports` i `get-task-allow`.
Mora se pokrenuti kao **root** korisnik, a daemon `/usr/libexec/sysdiagnosed` ima vrlo zanimljiva ovlašćenja poput `com.apple.system-task-ports` i `get-task-allow`.
Njegov plist se nalazi u `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist` koji deklariše 3 MachServices:
* `com.apple.sysdiagnose.CacheDelete`: Briše stare arhive u /var/rmp
* `com.apple.sysdiagnose.kernel.ipc`: Poseban port 23 (kernel)
* `com.apple.sysdiagnose.service.xpc`: Korisnički interfejs putem `Libsysdiagnose` Obj-C klase. Tri argumenta u rečniku mogu biti prosleđena (`compress`, `display`, `run`)
* `com.apple.sysdiagnose.service.xpc`: Korisnički interfejs putem `Libsysdiagnose` Obj-C klase. Mogu se proslediti tri argumenta u obliku rečnika (`compress`, `display`, `run`)
### Unified Logs
macOS generiše puno logova koji mogu biti veoma korisni prilikom pokretanja aplikacije pokušavajući da razumete **šta radi**.
macOS generiše mnogo logova koji mogu biti veoma korisni prilikom pokretanja aplikacije pokušavajući da razumete **šta radi**.
Osim toga, postoje neki logovi koji će sadržati oznaku `<private>` da bi **sakrili** neke **identifikacione** informacije **korisnika** ili **računara**. Međutim, moguće je **instalirati sertifikat da biste otkrili ove informacije**. Pratite objašnjenja sa [**ovde**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
Osim toga, postoje neki logovi koji će sadržati oznaku `<private>` da bi **sakrili** neke **identifikacione** informacije o **korisniku** ili **računaru**. Međutim, moguće je **instalirati sertifikat da biste otkrili ove informacije**. Pratite objašnjenja sa [**ovde**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
### Hopper
#### Leva tabla
Na levoj tabli hoppera mogu se videti simboli (**Oznake**) binarnog fajla, lista procedura i funkcija (**Proc**) i stringovi (**Str**). To nisu svi stringovi već oni definisani u nekoliko delova Mac-O fajla (kao što su _cstring ili_ `objc_methname`).
Na levoj tabli hoppera mogu se videti simboli (**Oznake**) binarnog fajla, lista procedura i funkcija (**Proc**) i stringovi (**Str**). To nisu svi stringovi, već oni definisani u nekoliko delova Mac-O fajla (kao što su _cstring ili_ `objc_methname`).
#### Srednja tabla
Na srednjoj tabli možete videti **dizasemblovani kod**. I možete ga videti kao **sirovi** disasembl, kao **graf**, kao **dekompiliran** i kao **binarni** klikom na odgovarajuću ikonu:
Na srednjoj tabli možete videti **disejblirani kod**. I možete ga videti kao **sirovi** disasembl, kao **graf**, kao **dekompiliran** i kao **binarni** klikom na odgovarajuću ikonu:
<figure><img src="../../../.gitbook/assets/image (343).png" alt=""><figcaption></figcaption></figure>
Desnim klikom na objekat koda možete videti **reference ka/od tog objekta** ili čak promeniti njegovo ime (ovo ne radi u dekompiliranom pseudokodu):
Desnim klikom na objekat koda možete videti **reference ka/od tog objekta** ili čak promeniti njegovo ime (ovo ne funkcioniše u dekompiliranom pseudokodu):
<figure><img src="../../../.gitbook/assets/image (1117).png" alt=""><figcaption></figcaption></figure>
@ -250,18 +291,18 @@ Osim toga, u **sredini dole možete pisati Python komande**.
#### Desna tabla
Na desnoj tabli možete videti zanimljive informacije kao što su **istorija navigacije** (da znate kako ste stigli do trenutne situacije), **pozivni grafikon** gde možete videti sve **funkcije koje pozivaju ovu funkciju** i sve funkcije koje **ova funkcija poziva**, i informacije o **lokalnim promenljivima**.
Na desnoj tabli možete videti zanimljive informacije poput **istorije navigacije** (da znate kako ste stigli do trenutne situacije), **pozivnog grafa** gde možete videti sve **funkcije koje pozivaju ovu funkciju** i sve funkcije koje **ova funkcija poziva**, i informacije o **lokalnim promenljivima**.
### dtrace
Omogućava korisnicima pristup aplikacijama na izuzetno **niskom nivou** i pruža način korisnicima da **prate** **programe** i čak promene njihov tok izvršavanja. Dtrace koristi **sonde** koje su **postavljene širom jezgra** i nalaze se na lokacijama poput početka i kraja sistemskih poziva.
DTrace koristi funkciju **`dtrace_probe_create`** za kreiranje sonde za svaki sistemski poziv. Ove sonde mogu biti aktivirane na **ulaznoj i izlaznoj tački svakog sistemskog poziva**. Interakcija sa DTrace-om se vi preko /dev/dtrace koji je dostupan samo root korisniku.
DTrace koristi funkciju **`dtrace_probe_create`** za kreiranje sonde za svaki sistemski poziv. Ove sonde mogu biti aktivirane na **ulaznoj i izlaznoj tački svakog sistemskog poziva**. Interakcija sa DTrace-om se odvija preko /dev/dtrace koji je dostupan samo root korisniku.
{% hint style="success" %}
Da biste omogućili Dtrace bez potpune onemogućenosti SIP zaštite, možete izvršiti u režimu oporavka: `csrutil enable --without dtrace`
Takođe možete **`dtrace`** ili **`dtruss`** binarne fajlove **koje ste kompajlirali**.
Takođe možete **`dtrace`** ili **`dtruss`** binarne fajlove koje **ste kompajlirali**.
{% endhint %}
Dostupne sonde dtrace-a mogu se dobiti sa:
@ -276,7 +317,7 @@ ID PROVIDER MODULE FUNCTION NAME
```
Ime sonde se sastoji od četiri dela: provajdera, modula, funkcije i imena (`fbt:mach_kernel:ptrace:entry`). Ako ne navedete neki deo imena, Dtrace će taj deo primeniti kao zamenski znak.
Da biste konfigurisali DTrace da aktivira sonde i specificirate koje akcije treba izvršiti kada se aktiviraju, moraćemo koristiti D jezik.
Da biste konfigurisali DTrace da aktivira sonde i specificira koje akcije treba izvršiti kada se aktiviraju, moraćemo koristiti D jezik.
Detaljnije objašnjenje i više primera možete pronaći na [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)
@ -336,18 +377,18 @@ dtruss -c -p 1000 #get syscalls of PID 1000
To je mogućnost praćenja jezgra. Dokumentovani kodovi mogu se pronaći u **`/usr/share/misc/trace.codes`**.
Alati poput `latency`, `sc_usage`, `fs_usage` i `trace` ga koriste interno.
Alati poput `latency`, `sc_usage`, `fs_usage` i `trace` koriste ga interno.
Za interakciju sa `kdebug`-om se koristi `sysctl` preko `kern.kdebug` prostora imena, a MIB-ovi koji se koriste mogu se pronaći u `sys/sysctl.h`, sa funkcijama implementiranim u `bsd/kern/kdebug.c`.
Za interakciju sa `kdebug`-om koristi se `sysctl` preko `kern.kdebug` prostora imena, a MIB-ovi koji se koriste mogu se pronaći u `sys/sysctl.h`, sa funkcijama implementiranim u `bsd/kern/kdebug.c`.
Da biste komunicirali sa kdebug-om pomoću prilagođenog klijenta, obično se koraci sastoje od:
* Uklanjanje postojećih postavki sa KERN\_KDSETREMOVE
* Postavljanje tragova sa KERN\_KDSETBUF i KERN\_KDSETUP
* Korišćenje KERN\_KDGETBUF za dobijanje broja unosa u baferu
* Izvlačenje sopstvenog klijenta iz traga sa KERN\_KDPINDEX
* Omogućavanje praćenja sa KERN\_KDENABLE
* Čitanje bafera pozivanjem KERN\_KDREADTR
* Uklonite postojeće postavke sa KERN\_KDSETREMOVE
* Postavite trag sa KERN\_KDSETBUF i KERN\_KDSETUP
* Koristite KERN\_KDGETBUF da biste dobili broj unosa u baferu
* Izvadite sopstvenog klijenta iz traga sa KERN\_KDPINDEX
* Omogućite praćenje sa KERN\_KDENABLE
* Pročitajte bafer pozivajući KERN\_KDREADTR
* Da biste uparili svaku nit sa njenim procesom, pozovite KERN\_KDTHRMAP.
Da biste dobili ove informacije, moguće je koristiti Apple alat **`trace`** ili prilagođeni alat [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**.**
@ -370,7 +411,7 @@ Ili `tailspin`.
Ovo se koristi za profilisanje na nivou jezgra i izgrađeno je koristeći `Kdebug` pozive.
U osnovi, globalna promenljiva `kernel_debug_active` se proverava i postavlja poziva `kperf_kdebug_handler` sa `Kdebug` kodom i adresom jezgra koji poziva okvir. Ako se `Kdebug` kod poklapa sa odabranim, dobijaju se "akcije" konfigurisane kao bitmape (proverite `osfmk/kperf/action.h` za opcije).
U osnovi, globalna promenljiva `kernel_debug_active` se proverava i postavlja poziva `kperf_kdebug_handler` sa `Kdebug` kodom i adresom poziva jezgra. Ako se `Kdebug` kod poklapa sa odabranim, dobijaju se "akcije" konfigurisane kao bitmape (proverite `osfmk/kperf/action.h` za opcije).
Kperf takođe ima sysctl MIB tabelu: (kao root) `sysctl kperf`. Ovaj kod se može pronaći u `osfmk/kperf/kperfbsd.c`.
@ -389,11 +430,11 @@ Potrebno je pratiti vaš Mac sa komandom poput **`sudo eslogger fork exec rename
### FileMonitor
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) omogućava praćenje događaja sa datotekama (kao što su kreiranje, izmene i brisanje) pružajući detaljne informacije o tim događajima.
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) omogućava praćenje događaja sa datotekama (kao što su kreiranje, izmene i brisanje) pružajući detaljne informacije o takvim događajima.
### Crescendo
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) je GUI alat sa izgledom koji korisnici Windowsa možda prepoznaju iz Microsoft Sysinternal-ovog _Procmon_. Ovaj alat omogućava pokretanje i zaustavljanje snimanja različitih tipova događaja, omogućava filtriranje ovih događaja po kategorijama kao što su datoteka, proces, mreža, itd., i pruža funkcionalnost za čuvanje snimljenih događaja u json formatu.
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) je GUI alat sa izgledom koji korisnici Windowsa mogu prepoznati iz Microsoft Sysinternal-ovog _Procmon_. Ovaj alat omogućava pokretanje i zaustavljanje snimanja različitih tipova događaja, omogućava filtriranje ovih događaja po kategorijama kao što su datoteka, proces, mreža, itd., i pruža funkcionalnost za čuvanje snimljenih događaja u json formatu.
### Apple Instruments
@ -411,15 +452,15 @@ fs_usage -w -f network curl #This tracks network actions
### TaskExplorer
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) je koristan alat za pregled **biblioteka** koje koristi binarni fajl, **datoteke** koje koristi i **mrežne** veze.\
Takođe proverava binarne procese protiv **virustotal** i prikazuje informacije o binarnom fajlu.
Takođe proverava binarne procese na **virustotalu** i prikazuje informacije o binarnom fajlu.
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
U [**ovom blog postu**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) možete pronaći primer kako **debugovati pokrenuti daemon** koji koristi **`PT_DENY_ATTACH`** da spreči debugovanje čak i ako je SIP onemogućen.
U [**ovom blog postu**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) možete pronaći primer kako **debugovati pokrenuti daemon** koji koristi **`PT_DENY_ATTACH`** kako bi sprečio debugovanje čak i ako je SIP onemogućen.
### lldb
**lldb** je glavni alat za **debugovanje** binarnih fajlova na **macOS**-u.
**lldb** je glavni alat za **debugovanje** binarnih fajlova na **macOS** platformi.
```bash
lldb ./malware.bin
lldb -p 1122
@ -431,13 +472,13 @@ Možete postaviti Intel ukus prilikom korišćenja lldb-a kreiranjem datoteke na
settings set target.x86-disassembly-flavor intel
```
{% hint style="warning" %}
Unutar lldb-a, izvršite dump procesa sa `process save-core`
Unutar lldb-a, izbaci proces sa `process save-core`
{% endhint %}
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Komanda</strong></td><td><strong>Opis</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Pokretanje izvršavanja, koje će se nastaviti dok se ne naiđe na prekidnu tačku ili dok se proces ne završi.</td></tr><tr><td><strong>continue (c)</strong></td><td>Nastavak izvršavanja debugiranog procesa.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Izvršava sledeću instrukciju. Ova komanda će preskočiti pozive funkcija.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Izvršava sledeću instrukciju. Za razliku od nexti komande, ova komanda će ući u pozive funkcija.</td></tr><tr><td><strong>finish (f)</strong></td><td>Izvršava preostale instrukcije u trenutnoj funkciji ("frame") i zaustavlja se.</td></tr><tr><td><strong>control + c</strong></td><td>Pauzira izvršavanje. Ako je proces pokrenut (r) ili nastavljen (c), ovo će uzrokovati zaustavljanje procesa ...gde god se trenutno izvršava.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #Bilo koja funkcija nazvana main</p><p>b &#x3C;ime_binarnog_fajla>`main #Glavna funkcija binarnog fajla</p><p>b set -n main --shlib &#x3C;ime_biblioteke> #Glavna funkcija naznačenog binarnog fajla</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #Lista prekida</p><p>br e/dis &#x3C;br> #Omogući/Onemogući prekid</p><p>breakpoint delete &#x3C;br></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Dobijanje pomoći za komandu prekida</p><p>help memory write #Dobijanje pomoći za pisanje u memoriju</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format &#x3C;<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s &#x3C;reg/adresa_memorije></strong></td><td>Prikazuje memoriju kao string završen nulom.</td></tr><tr><td><strong>x/i &#x3C;reg/adresa_memorije></strong></td><td>Prikazuje memoriju kao asemblersku instrukciju.</td></tr><tr><td><strong>x/b &#x3C;reg/adresa_memorije></strong></td><td>Prikazuje memoriju kao bajt.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Ovo će ispisati objekat na koji se parametar odnosi</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Imajte na umu da većina Apple-ovih Objective-C API-ja ili metoda vraća objekte, i stoga bi trebalo da se prikažu putem "print object" (po) komande. Ako po ne proizvodi smislene rezultate, koristite <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Upisuje AAAA na tu adresu<br>memory write -f s $rip+0x11f+7 "AAAA" #Upisuje AAAA na adresu</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disasembliranje trenutne funkcije</p><p>dis -n &#x3C;ime_funkcije> #Disasembliranje funkcije</p><p>dis -n &#x3C;ime_funkcije> -b &#x3C;ime_binarnog_fajla> #Disasembliranje funkcije<br>dis -c 6 #Disasembliranje 6 linija<br>dis -c 0x100003764 -e 0x100003768 # Od jedne adrese do druge<br>dis -p -c 4 # Početak disasembliranja na trenutnoj adresi</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Provera niza od 3 komponente u x1 registru</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Komanda</strong></td><td><strong>Opis</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Pokretanje izvršenja, koje će se nastaviti dok se ne naiđe na prekid ili dok se proces ne završi.</td></tr><tr><td><strong>continue (c)</strong></td><td>Nastavi izvršenje debugiranog procesa.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Izvrši sledeću instrukciju. Ova komanda će preskočiti pozive funkcija.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Izvrši sledeću instrukciju. Za razliku od nexti komande, ova komanda će ući u pozive funkcija.</td></tr><tr><td><strong>finish (f)</strong></td><td>Izvrši preostale instrukcije u trenutnoj funkciji ("frame") i zaustavi se.</td></tr><tr><td><strong>control + c</strong></td><td>Pauziraj izvršenje. Ako je proces pokrenut (r) ili nastavljen (c), ovo će uzrokovati zaustavljanje procesa ...gde god se trenutno izvršava.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #Bilo koja funkcija pozvana main</p><p>b &#x3C;ime_binarnog_fajla>`main #Main funkcija binarnog fajla</p><p>b set -n main --shlib &#x3C;ime_biblioteke> #Main funkcija naznačenog binarnog fajla</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #Lista prekida</p><p>br e/dis &#x3C;br> #Omogući/Onemogući prekid</p><p>breakpoint delete &#x3C;br></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Dobij pomoć za komandu prekida</p><p>help memory write #Dobij pomoć za pisanje u memoriju</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format &#x3C;<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s &#x3C;reg/adresa_memorije></strong></td><td>Prikaži memoriju kao string završen nulom.</td></tr><tr><td><strong>x/i &#x3C;reg/adresa_memorije></strong></td><td>Prikaži memoriju kao asemblersku instrukciju.</td></tr><tr><td><strong>x/b &#x3C;reg/adresa_memorije></strong></td><td>Prikaži memoriju kao bajt.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Ovo će ispisati objekat na koji se odnosi parametar</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Imajte na umu da većina Apple-ovih Objective-C API-ja ili metoda vraća objekte, i stoga bi trebalo da se prikažu putem "print object" (po) komande. Ako po ne proizvodi smislene rezultate, koristite <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Upiši AAAA na tu adresu<br>memory write -f s $rip+0x11f+7 "AAAA" #Upiši AAAA na adresu</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disasembli trenutne funkcije</p><p>dis -n &#x3C;ime_funkcije> #Disasembli funkcije</p><p>dis -n &#x3C;ime_funkcije> -b &#x3C;ime_binarnog_fajla> #Disasembli funkcije<br>dis -c 6 #Disasembli 6 linija<br>dis -c 0x100003764 -e 0x100003768 # Od jedne adrese do druge<br>dis -p -c 4 # Počni sa trenutnom adresom disasembliranja</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Proveri niz od 3 komponente u x1 registru</td></tr></tbody></table>
{% hint style="info" %}
Prilikom pozivanja funkcije **`objc_sendMsg`**, registar **rsi** sadrži **ime metode** kao string završen nulom ("C"). Da biste ispisali ime putem lldb-a, uradite sledeće:
Prilikom pozivanja funkcije **`objc_sendMsg`**, registar **rsi** sadrži **ime metode** kao string završen nulom ("C"). Da biste ispisali ime putem lldb-a uradite sledeće:
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
@ -457,28 +498,28 @@ Prilikom pozivanja funkcije **`objc_sendMsg`**, registar **rsi** sadrži **ime m
* Moguće je otkriti da li se proces **debuguje** jednostavnim kodom poput:
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proces se debuguje }`
* Takođe se može pozvati sistemski poziv **`ptrace`** sa zastavicom **`PT_DENY_ATTACH`**. Ovo **sprečava** deb**a**ger da se poveže i prati.
* Možete proveriti da li se funkcija **`sysctl`** ili **`ptrace`** **uvozi** (ali malver bi mogao da je uvozi dinamički)
* Možete proveriti da li se funkcija **`sysctl`** ili **`ptrace`** **uvozi** (ali malver bi mogao da je dinamički uveze)
* Kao što je navedeno u ovom tekstu, “[Pobeda nad tehnikama protiv-debugovanja: macOS ptrace varijante](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
“_Poruka Proces # je završen sa **statusom = 45 (0x0000002d)** obično je znak da je cilj debugovanja koristi **PT\_DENY\_ATTACH**_”
## Snimanje jezgara
“_Poruka Proces # je izašao sa **statusom = 45 (0x0000002d)** obično je znak da je cilj debugovanja koristi **PT\_DENY\_ATTACH**_”
## Core Dumps
Jezgarni snimci se kreiraju ako:
Core dumps are created if:
- `kern.coredump` sysctl postavljeno na 1 (podrazumevano)
- Ako proces nije bio suid/sgid ili je `kern.sugid_coredump` postavljen na 1 (podrazumevano je 0)
- Limit `AS_CORE` dozvoljava operaciju. Moguće je suzbiti kreiranje jezgarnih snimaka pozivom `ulimit -c 0` i ponovno omogućiti ih sa `ulimit -c unlimited`.
* `kern.coredump` sysctl is set to 1 (by default)
* If the process wasn't suid/sgid or `kern.sugid_coredump` is 1 (by default is 0)
* The `AS_CORE` limit allows the operation. It's possible to suppress code dumps creation by calling `ulimit -c 0` and re-enable them with `ulimit -c unlimited`.
U tim slučajevima jezgarni snimci se generišu prema `kern.corefile` sysctl i obično se čuvaju u `/cores/core/.%P`.
In those cases the core dumps is generated according to `kern.corefile` sysctl and stored usually in `/cores/core/.%P`.
## Faziranje
## Fuzzing
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
ReportCrash **analizira procese koji se ruše i čuva izveštaj o rušenju na disku**. Izveštaj o rušenju sadrži informacije koje mogu **pomoći programeru da dijagnostikuje** uzrok rušenja.\
Za aplikacije i druge procese **koji se izvršavaju u kontekstu pokretanja po korisniku**, ReportCrash se izvršava kao LaunchAgent i čuva izveštaje o rušenju u `~/Library/Logs/DiagnosticReports/` korisnika.\
Za demone, druge procese **koji se izvršavaju u kontekstu sistema pokretanja** i druge privilegovane procese, ReportCrash se izvršava kao LaunchDaemon i čuva izveštaje o rušenju u `/Library/Logs/DiagnosticReports` sistema.
Za aplikacije i druge procese **koji se izvršavaju u kontekstu pokretanja po korisniku**, ReportCrash se izvršava kao LaunchAgent i čuva izveštaje o rušenju u `~/Library/Logs/DiagnosticReports/` korisnika\
Za demone, druge procese **koji se izvršavaju u kontekstu pokretanja po sistemu** i druge privilegovane procese, ReportCrash se izvršava kao LaunchDaemon i čuva izveštaje o rušenju u `/Library/Logs/DiagnosticReports`
Ako vas brine što se **izveštaji o rušenju šalju Apple-u**, možete ih onemogućiti. U suprotnom, izveštaji o rušenju mogu biti korisni za **određivanje načina na koji je server pao**.
Ako vas brine što se **izveštaji o rušenju šalju Apple-u** možete ih onemogućiti. U suprotnom, izveštaji o rušenju mogu biti korisni za **određivanje načina na koji je server pao**.
```bash
#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
@ -490,7 +531,7 @@ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.
```
### Spavanje
Prilikom faziiranja u MacOS-u važno je sprečiti Mac da spava:
Prilikom faziiranja na MacOS-u važno je sprečiti Mac da spava:
* systemsetup -setsleep Nikada
* pmset, System Preferences
@ -498,7 +539,7 @@ Prilikom faziiranja u MacOS-u važno je sprečiti Mac da spava:
#### SSH Prekid
Ako faziirate putem SSH veze, važno je osigurati da sesija neće isteći. Promenite sshd\_config datoteku sa:
Ako faziirate putem SSH veze važno je osigurati da sesija neće isteći. Promenite sshd\_config datoteku sa:
* TCPKeepAlive Yes
* ClientAliveInterval 0
@ -516,6 +557,8 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
{% endcontent-ref %}
### Enumeracija mrežnih procesa
Ovo je interesantno za pronalaženje procesa koji upravljaju mrežnim podacima:
```bash
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
#wait some time
@ -542,9 +585,9 @@ Radi sa CLI alatima
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
On "**samo radi"** sa macOS GUI alatima. Imajte na umu da neki macOS aplikacije imaju specifične zahteve kao što su jedinstvena imena datoteka, ispravna ekstenzija, potreba za čitanjem datoteka iz peska (`~/Library/Containers/com.apple.Safari/Data`)...
On "**samo radi"** sa macOS GUI alatima. Imajte na umu da neki macOS aplikacije imaju specifične zahteve kao što su jedinstvena imena datoteka, ispravna ekstenzija, potreba da se čitaju datoteke iz peska (`~/Library/Containers/com.apple.Safari/Data`)...
Primeri:
Neki primeri:
```bash
# iBooks
litefuzz -l -c "/System/Applications/Books.app/Contents/MacOS/Books FUZZ" -i files/epub -o crashes/ibooks -t /Users/test/Library/Containers/com.apple.iBooksX/Data/tmp -x 10 -n 100000 -ez
@ -570,7 +613,7 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
```
{% endcode %}
### Više informacija o Fuzzing MacOS
### Više informacija o Fuzzing-u na MacOS-u
* [https://www.youtube.com/watch?v=T5xfL9tEg44](https://www.youtube.com/watch?v=T5xfL9tEg44)
* [https://github.com/bnagy/slides/blob/master/OSXScale.pdf](https://github.com/bnagy/slides/blob/master/OSXScale.pdf)
@ -602,7 +645,7 @@ Možete posetiti njihovu veb lokaciju i isprobati njihovu mašinu za **besplatno
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**