mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 14:08:26 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
8051ab7b3c
commit
655e2604fc
1 changed files with 147 additions and 138 deletions
|
@ -1,16 +1,16 @@
|
|||
# macOS Aplikacje - Inspekcja, debugowanie i Fuzzing
|
||||
# macOS Apps - Inspekcja, debugowanie i Fuzzing
|
||||
|
||||
{% hint style="success" %}
|
||||
Dowiedz się i ćwicz Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Szkolenie AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Dowiedz się i ćwicz Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Szkolenie 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>Wesprzyj HackTricks</summary>
|
||||
<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)**.**
|
||||
* **Podziel się trikami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na githubie.
|
||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy 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 na githubie.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
@ -19,11 +19,11 @@ Dowiedz się i ćwicz Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) to wyszukiwarka zasilana przez **dark web**, która oferuje **darmowe** funkcje do sprawdzania, czy firma lub jej klienci zostali **skompromitowani** przez **stealery malware**.
|
||||
[**WhiteIntel**](https://whiteintel.io) to **silnik wyszukiwania** zasilany przez **dark-web**, który oferuje **darmowe** funkcjonalności do sprawdzenia, czy firma lub jej klienci zostali **skompromentowani** przez **złośliwe oprogramowanie kradnące**.
|
||||
|
||||
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z malware kradnącego informacje.
|
||||
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z złośliwego oprogramowania kradnącego informacje.
|
||||
|
||||
Możesz odwiedzić ich stronę internetową i wypróbować ich silnik za **darmo** pod adresem:
|
||||
Możesz sprawdzić ich stronę internetową i wypróbować ich silnik za **darmo** pod adresem:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
|
@ -60,7 +60,7 @@ 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żesz [**pobrać jtool2 tutaj**](http://www.newosxbook.com/tools/jtool.html) lub zainstalować za pomocą `brew`.
|
||||
Możesz [**pobrać jtool2 tutaj**](http://www.newosxbook.com/tools/jtool.html) lub zainstalować go za pomocą `brew`.
|
||||
```bash
|
||||
# Install
|
||||
brew install --cask jtool2
|
||||
|
@ -78,7 +78,7 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
|
|||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
**jtool został zdezaktualizowany na rzecz disarm**
|
||||
**jtool jest przestarzały na rzecz disarm**
|
||||
{% endhint %}
|
||||
|
||||
### Codesign / ldid
|
||||
|
@ -114,27 +114,29 @@ ldid -S/tmp/entl.xml <binary>
|
|||
```
|
||||
### SuspiciousPackage
|
||||
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) to narzędzie przydatne do inspekcji plików **.pkg** (instalatorów) i zobaczenia, co znajduje się w środku przed ich zainstalowaniem.\
|
||||
Te instalatory mają skrypty bash `preinstall` i `postinstall`, których autorzy złośliwego oprogramowania zazwyczaj nadużywają do **utrwalenia** **złośliwego** **oprogramowania**.
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) to narzędzie przydatne do inspekcji plików **.pkg** (instalatorów) i sprawdzenia, co się w nich znajduje przed ich zainstalowaniem.\
|
||||
Te instalatory mają skrypty bash `preinstall` i `postinstall`, które autorzy złośliwego oprogramowania zazwyczaj nadużywają, aby **utrzymać** **złośliwe** **oprogramowanie**.
|
||||
|
||||
### hdiutil
|
||||
|
||||
To narzędzie pozwala na **zamontowanie** obrazów dysków Apple (**.dmg**) do inspekcji przed uruchomieniem cokolwiek:
|
||||
To narzędzie pozwala na **zamontowanie** obrazów dysków Apple (**.dmg**) w celu ich inspekcji przed uruchomieniem czegokolwiek:
|
||||
```bash
|
||||
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
||||
```
|
||||
### Spakowane binaria
|
||||
It will be mounted in `/Volumes`
|
||||
|
||||
### Packed binaries
|
||||
|
||||
* Sprawdź wysoką entropię
|
||||
* Sprawdź ciągi znaków (jeśli nie ma praktycznie żadnych zrozumiałych ciągów, jest spakowane)
|
||||
* Packer UPX dla systemu MacOS generuje sekcję o nazwie "\_\_XHDR"
|
||||
* Sprawdź ciągi (jeśli prawie nie ma zrozumiałego ciągu, spakowane)
|
||||
* Packer UPX dla MacOS generuje sekcję o nazwie "\_\_XHDR"
|
||||
|
||||
## Statyczna analiza Objective-C
|
||||
## Static Objective-C analysis
|
||||
|
||||
### Metadane
|
||||
### Metadata
|
||||
|
||||
{% hint style="danger" %}
|
||||
Zauważ, że programy napisane w Objective-C **zachowują** swoje deklaracje klas **po** **skompilowaniu** do [binariów Mach-O](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Takie deklaracje klas obejmują nazwę i typ:
|
||||
Zauważ, że programy napisane w Objective-C **zachowują** swoje deklaracje klas **gdy** **są kompilowane** do [binariów Mach-O](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Takie deklaracje klas **zawierają** nazwę i typ:
|
||||
{% endhint %}
|
||||
|
||||
* Zdefiniowane interfejsy
|
||||
|
@ -142,18 +144,18 @@ Zauważ, że programy napisane w Objective-C **zachowują** swoje deklaracje kla
|
|||
* Zmienne instancji interfejsu
|
||||
* Zdefiniowane protokoły
|
||||
|
||||
Zauważ, że te nazwy mogą być zaciemnione, aby utrudnić odwracanie binariów.
|
||||
Zauważ, że te nazwy mogą być zafałszowane, aby utrudnić odwracanie binariów.
|
||||
|
||||
### Wywoływanie funkcji
|
||||
### Function calling
|
||||
|
||||
Kiedy funkcja jest wywoływana w binariach używających Objective-C, skompilowany kod zamiast wywoływać tę funkcję, wywoła **`objc_msgSend`**. Która wywoła ostateczną funkcję:
|
||||
Gdy funkcja jest wywoływana w binarium, które używa Objective-C, skompilowany kod zamiast wywoływania tej funkcji, wywoła **`objc_msgSend`**. Które wywoła finalną funkcję:
|
||||
|
||||
![](<../../../.gitbook/assets/image (305).png>)
|
||||
|
||||
Parametry, których ta funkcja oczekuje, to:
|
||||
|
||||
* Pierwszy parametr (**self**) to "wskaźnik wskazujący na **instancję klasy, która ma otrzymać wiadomość**". Innymi słowy, jest to obiekt, na którym wywoływana jest metoda. Jeśli metoda jest metodą klasy, będzie to instancja obiektu klasy (całość), podczas gdy dla metody instancji self wskaże zainstalowaną instancję klasy jako obiekt.
|
||||
* Drugi parametr, (**op**), to "selektor metody obsługującej wiadomość". Ponownie, w prostszy sposób, jest to po prostu **nazwa metody**.
|
||||
* Pierwszy parametr (**self**) to "wskaźnik, który wskazuje na **instancję klasy, która ma otrzymać wiadomość**". Mówiąc prościej, to obiekt, na którym wywoływana jest metoda. Jeśli metoda jest metodą klasową, będzie to instancja obiektu klasy (jako całość), natomiast dla metody instancji, self będzie wskazywać na zainstancjonowaną instancję klasy jako obiekt.
|
||||
* Drugi parametr (**op**) to "selekcja metody, która obsługuje wiadomość". Mówiąc prościej, to po prostu **nazwa metody.**
|
||||
* Pozostałe parametry to wszelkie **wartości wymagane przez metodę** (op).
|
||||
|
||||
Zobacz, jak **łatwo uzyskać te informacje za pomocą `lldb` w ARM64** na tej stronie:
|
||||
|
@ -165,26 +167,26 @@ Zobacz, jak **łatwo uzyskać te informacje za pomocą `lldb` w ARM64** na tej s
|
|||
x64:
|
||||
|
||||
| **Argument** | **Rejestr** | **(dla) objc\_msgSend** |
|
||||
| ----------------- | -------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1. argument** | **rdi** | **self: obiekt, na którym wywoływana jest metoda** |
|
||||
| **2. argument** | **rsi** | **op: nazwa metody** |
|
||||
| **3. argument** | **rdx** | **1. argument metody** |
|
||||
| **4. argument** | **rcx** | **2. argument metody** |
|
||||
| **5. argument** | **r8** | **3. argument metody** |
|
||||
| **6. argument** | **r9** | **4. argument metody** |
|
||||
| **7. i kolejne argumenty** | <p><strong>rsp+</strong><br><strong>(na stosie)</strong></p> | **5. i kolejne argumenty metody** |
|
||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1. argument** | **rdi** | **self: obiekt, na którym wywoływana jest metoda** |
|
||||
| **2. argument** | **rsi** | **op: nazwa metody** |
|
||||
| **3. argument** | **rdx** | **1. argument do metody** |
|
||||
| **4. argument** | **rcx** | **2. argument do metody** |
|
||||
| **5. argument** | **r8** | **3. argument do metody** |
|
||||
| **6. argument** | **r9** | **4. argument do metody** |
|
||||
| **7. i więcej** | <p><strong>rsp+</strong><br><strong>(na stosie)</strong></p> | **5. i więcej argumentów do metody** |
|
||||
|
||||
### Zrzutuj metadane ObjectiveC
|
||||
### Dump ObjectiveC metadata
|
||||
|
||||
### Dynadump
|
||||
|
||||
[**Dynadump**](https://github.com/DerekSelander/dynadump) to narzędzie do wydobywania klas z binariów Objective-C. Repozytorium na githubie określa dyliby, ale działa również z plikami wykonywalnymi.
|
||||
[**Dynadump**](https://github.com/DerekSelander/dynadump) to narzędzie do zrzucania klas binariów Objective-C. Github określa dyliby, ale to również działa z plikami wykonywalnymi.
|
||||
```bash
|
||||
./dynadump dump /path/to/bin
|
||||
```
|
||||
W chwili pisania, to **obecnie działa najlepiej**.
|
||||
W momencie pisania, to jest **aktualnie to, co działa najlepiej**.
|
||||
|
||||
#### Zwykłe narzędzia
|
||||
#### Regular tools
|
||||
```bash
|
||||
nm --dyldinfo-only /path/to/bin
|
||||
otool -ov /path/to/bin
|
||||
|
@ -192,13 +194,13 @@ objdump --macho --objc-meta-data /path/to/bin
|
|||
```
|
||||
#### class-dump
|
||||
|
||||
[**class-dump**](https://github.com/nygard/class-dump/) to oryginalne narzędzie generujące deklaracje klas, kategorii i protokołów w kodzie sformatowanym w ObjetiveC.
|
||||
[**class-dump**](https://github.com/nygard/class-dump/) to oryginalne narzędzie do generowania deklaracji dla klas, kategorii i protokołów w kodzie sformatowanym w ObjectiveC.
|
||||
|
||||
Jest to stare i nieaktualizowane, więc prawdopodobnie nie będzie działać poprawnie.
|
||||
Jest stare i nieutrzymywane, więc prawdopodobnie nie będzie działać poprawnie.
|
||||
|
||||
#### ICDump
|
||||
|
||||
[**iCDump**](https://github.com/romainthomas/iCDump) to nowoczesne i wieloplatformowe narzędzie do wydobywania klas Objective-C. W porównaniu do istniejących narzędzi, iCDump może działać niezależnie od ekosystemu Apple i udostępnia wiązania Pythona.
|
||||
[**iCDump**](https://github.com/romainthomas/iCDump) to nowoczesny i wieloplatformowy zrzut klas Objective-C. W porównaniu do istniejących narzędzi, iCDump może działać niezależnie od ekosystemu Apple i udostępnia powiązania Pythona.
|
||||
```python
|
||||
import icdump
|
||||
metadata = icdump.objc.parse("/path/to/bin")
|
||||
|
@ -207,9 +209,9 @@ print(metadata.to_decl())
|
|||
```
|
||||
## Statyczna analiza Swift
|
||||
|
||||
W przypadku binarnych plików Swift, ponieważ istnieje kompatybilność z Objective-C, czasami można wyodrębnić deklaracje za pomocą [class-dump](https://github.com/nygard/class-dump/), ale nie zawsze.
|
||||
Z binariów Swift, ponieważ istnieje kompatybilność z Objective-C, czasami można wyodrębnić deklaracje za pomocą [class-dump](https://github.com/nygard/class-dump/), ale nie zawsze.
|
||||
|
||||
Za pomocą poleceń **`jtool -l`** lub **`otool -l`** można znaleźć kilka sekcji z prefiksem **`__swift5`**:
|
||||
Za pomocą poleceń **`jtool -l`** lub **`otool -l`** można znaleźć kilka sekcji, które zaczynają się od prefiksu **`__swift5`**:
|
||||
```bash
|
||||
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
|
||||
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
|
||||
|
@ -221,9 +223,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
|
|||
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
||||
[...]
|
||||
```
|
||||
Możesz znaleźć dalsze informacje na temat [**informacji przechowywanych w tych sekcjach w tym wpisie na blogu**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html).
|
||||
Możesz znaleźć więcej informacji na temat [**informacji przechowywanych w tej sekcji w tym poście na blogu**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html).
|
||||
|
||||
Co więcej, **binaria Swift mogą mieć symbole** (na przykład biblioteki muszą przechowywać symbole, aby ich funkcje mogły być wywoływane). **Symbole zazwyczaj zawierają informacje o nazwie funkcji** i atrybutach w nieczytelny sposób, dlatego są bardzo przydatne, a istnieją **"demanglery"**, które mogą odzyskać oryginalną nazwę:
|
||||
Ponadto, **binarne pliki Swift mogą mieć symbole** (na przykład biblioteki muszą przechowywać symbole, aby ich funkcje mogły być wywoływane). **Symbole zazwyczaj zawierają informacje o nazwie funkcji** i atrybucie w nieczytelny sposób, więc są bardzo przydatne i istnieją "**demanglery**", które mogą uzyskać oryginalną nazwę:
|
||||
```bash
|
||||
# Ghidra plugin
|
||||
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
||||
|
@ -231,77 +233,77 @@ https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
|||
# Swift cli
|
||||
swift demangle
|
||||
```
|
||||
## Analiza dynamiczna
|
||||
## Dynamic Analysis
|
||||
|
||||
{% hint style="warning" %}
|
||||
Zauważ, że aby debugować binaria, **SIP musi być wyłączony** (`csrutil disable` lub `csrutil enable --without debug`) lub skopiować binaria do tymczasowego folderu i **usunąć podpis** za pomocą `codesign --remove-signature <ścieżka-do-binaria>` lub zezwolić na debugowanie binariów (możesz skorzystać z [tego skryptu](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))
|
||||
Zauważ, że aby debugować binaria, **SIP musi być wyłączony** (`csrutil disable` lub `csrutil enable --without debug`) lub skopiować binaria do tymczasowego folderu i **usunąć podpis** za pomocą `codesign --remove-signature <binary-path>` lub zezwolić na debugowanie binariów (możesz użyć [tego skryptu](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
Zauważ, że aby **instrumentować binaria systemowe** (takie jak `cloudconfigurationd`) w macOS, **SIP musi być wyłączony** (tylko usunięcie podpisu nie zadziała).
|
||||
Zauważ, że aby **instrumentować binaria systemowe**, (takie jak `cloudconfigurationd`) na macOS, **SIP musi być wyłączony** (same usunięcie podpisu nie zadziała).
|
||||
{% endhint %}
|
||||
|
||||
### Interfejsy programistyczne aplikacji (API)
|
||||
### APIs
|
||||
|
||||
macOS udostępnia kilka interesujących interfejsów programistycznych aplikacji, które dostarczają informacji na temat procesów:
|
||||
macOS udostępnia kilka interesujących API, które dostarczają informacji o procesach:
|
||||
|
||||
* `proc_info`: Jest to główny interfejs dostarczający wiele informacji o każdym procesie. Aby uzyskać informacje o innych procesach, musisz być rootem, ale nie potrzebujesz specjalnych uprawnień ani portów mach.
|
||||
* `libsysmon.dylib`: Pozwala uzyskać informacje o procesach za pomocą funkcji XPC, jednak konieczne jest posiadanie uprawnienia `com.apple.sysmond.client`.
|
||||
* `proc_info`: To główne API, które dostarcza wiele informacji o każdym procesie. Musisz być rootem, aby uzyskać informacje o innych procesach, ale nie potrzebujesz specjalnych uprawnień ani portów mach.
|
||||
* `libsysmon.dylib`: Umożliwia uzyskanie informacji o procesach za pomocą funkcji XPC, jednak potrzebne jest posiadanie uprawnienia `com.apple.sysmond.client`.
|
||||
|
||||
### Stackshot i microstackshots
|
||||
### Stackshot & microstackshots
|
||||
|
||||
**Stackshotting** to technika używana do przechwytywania stanu procesów, w tym stosów wywołań wszystkich działających wątków. Jest to szczególnie przydatne do debugowania, analizy wydajności i zrozumienia zachowania systemu w określonym punkcie czasowym. W systemach iOS i macOS stackshotting można wykonać za pomocą kilku narzędzi i metod, takich jak narzędzia **`sample`** i **`spindump`**.
|
||||
**Stackshotting** to technika używana do uchwycenia stanu procesów, w tym stosów wywołań wszystkich działających wątków. Jest to szczególnie przydatne do debugowania, analizy wydajności i zrozumienia zachowania systemu w określonym momencie. Na iOS i macOS, stackshotting można przeprowadzić za pomocą kilku narzędzi i metod, takich jak narzędzia **`sample`** i **`spindump`**.
|
||||
|
||||
### Sysdiagnose
|
||||
|
||||
To narzędzie (`/usr/bini/ysdiagnose`) zbiera wiele informacji z twojego komputera, wykonując dziesiątki różnych poleceń, takich jak `ps`, `zprint`...
|
||||
To narzędzie (`/usr/bini/ysdiagnose`) zasadniczo zbiera wiele informacji z twojego komputera, wykonując dziesiątki różnych poleceń, takich jak `ps`, `zprint`...
|
||||
|
||||
Musisz uruchomić je jako **root** i demon `/usr/libexec/sysdiagnosed` ma bardzo interesujące uprawnienia, takie jak `com.apple.system-task-ports` i `get-task-allow`.
|
||||
Musi być uruchamiane jako **root**, a demon `/usr/libexec/sysdiagnosed` ma bardzo interesujące uprawnienia, takie jak `com.apple.system-task-ports` i `get-task-allow`.
|
||||
|
||||
Jego plist znajduje się w `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`, który deklaruje 3 usługi Mach:
|
||||
Jego plist znajduje się w `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`, który deklaruje 3 MachServices:
|
||||
|
||||
* `com.apple.sysdiagnose.CacheDelete`: Usuwa stare archiwa w /var/rmp
|
||||
* `com.apple.sysdiagnose.kernel.ipc`: Specjalny port 23 (jądro)
|
||||
* `com.apple.sysdiagnose.service.xpc`: Interfejs trybu użytkownika za pomocą klasy `Libsysdiagnose` Obj-C. Można przekazać trzy argumenty w postaci słownika (`compress`, `display`, `run`)
|
||||
* `com.apple.sysdiagnose.service.xpc`: Interfejs trybu użytkownika przez klasę Obj-C `Libsysdiagnose`. Można przekazać trzy argumenty w słowniku (`compress`, `display`, `run`)
|
||||
|
||||
### Zjednoczone dzienniki
|
||||
### Unified Logs
|
||||
|
||||
macOS generuje wiele dzienników, które mogą być bardzo przydatne podczas uruchamiania aplikacji, próbując zrozumieć **co robi**.
|
||||
MacOS generuje wiele logów, które mogą być bardzo przydatne podczas uruchamiania aplikacji, próbując zrozumieć **co ona robi**.
|
||||
|
||||
Co więcej, istnieją dzienniki, które będą zawierać tag `<private>` w celu **ukrycia** pewnych informacji **identyfikujących użytkownika** lub **komputer**. Jednak można **zainstalować certyfikat, aby ujawnić te informacje**. Postępuj zgodnie z wyjaśnieniami z [**tutaj**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
|
||||
Co więcej, są pewne logi, które będą zawierać tag `<private>`, aby **ukryć** niektóre **informacje** **identyfikowalne** **użytkownika** lub **komputera**. Jednak możliwe jest **zainstalowanie certyfikatu, aby ujawnić te informacje**. Postępuj zgodnie z wyjaśnieniami [**tutaj**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
|
||||
|
||||
### Hopper
|
||||
|
||||
#### Lewy panel
|
||||
#### Left panel
|
||||
|
||||
W lewym panelu hoppera można zobaczyć symbole (**Etykiety**) binariów, listę procedur i funkcji (**Proc**) oraz ciągi znaków (**Str**). Nie są to wszystkie ciągi znaków, ale te zdefiniowane w kilku częściach pliku Mac-O (takich jak _cstring lub_ `objc_methname`).
|
||||
W lewym panelu Hopper można zobaczyć symbole (**Labels**) binariów, listę procedur i funkcji (**Proc**) oraz ciągi (**Str**). To nie są wszystkie ciągi, ale te zdefiniowane w różnych częściach pliku Mac-O (takich jak _cstring lub_ `objc_methname`).
|
||||
|
||||
#### Środkowy panel
|
||||
#### Middle panel
|
||||
|
||||
W środkowym panelu można zobaczyć **kod zdekompilowany**. Możesz zobaczyć go jako **surowy** rozkład, jako **graf**, jako **zdekompilowany** i jako **binarny**, klikając na odpowiednią ikonę:
|
||||
W środkowym panelu można zobaczyć **zdekompilowany kod**. Można go zobaczyć jako **surowy** dekompilat, jako **graf**, jako **zdekompilowany** i jako **binarne** klikając na odpowiednią ikonę:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (343).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Klikając prawym przyciskiem myszy na obiekcie kodu, możesz zobaczyć **odwołania do/od tego obiektu** lub nawet zmienić jego nazwę (to nie działa w zdekompilowanym pseudokodzie):
|
||||
Klikając prawym przyciskiem myszy na obiekt kodu, można zobaczyć **odniesienia do/od tego obiektu** lub nawet zmienić jego nazwę (to nie działa w zdekompilowanym pseudokodzie):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1117).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Co więcej, w **środku na dole możesz pisać polecenia pythona**.
|
||||
Co więcej, w **dolnej części środkowego panelu można pisać polecenia Pythona**.
|
||||
|
||||
#### Prawy panel
|
||||
#### Right panel
|
||||
|
||||
W prawym panelu można zobaczyć interesujące informacje, takie jak **historia nawigacji** (aby wiedzieć, jak dotarłeś do obecnej sytuacji), **graf wywołań**, gdzie można zobaczyć wszystkie **funkcje, które wywołują tę funkcję** i wszystkie funkcje, **które ta funkcja wywołuje**, oraz informacje o **zmiennych lokalnych**.
|
||||
W prawym panelu można zobaczyć interesujące informacje, takie jak **historia nawigacji** (aby wiedzieć, jak dotarłeś do obecnej sytuacji), **graf wywołań**, w którym można zobaczyć wszystkie **funkcje, które wywołują tę funkcję** oraz wszystkie funkcje, które **ta funkcja wywołuje**, oraz informacje o **zmiennych lokalnych**.
|
||||
|
||||
### dtrace
|
||||
|
||||
Pozwala użytkownikom uzyskać dostęp do aplikacji na niezwykle **niskim poziomie** i zapewnia sposób śledzenia **programów** oraz nawet zmiany ich przepływu wykonania. Dtrace używa **sond** umieszczonych w całym jądrze, takich jak na początku i końcu wywołań systemowych.
|
||||
Umożliwia użytkownikom dostęp do aplikacji na niezwykle **niskim poziomie** i zapewnia sposób dla użytkowników na **śledzenie** **programów** i nawet zmianę ich przepływu wykonania. Dtrace używa **probes**, które są **umieszczane w całym jądrze** i znajdują się w miejscach takich jak początek i koniec wywołań systemowych.
|
||||
|
||||
DTrace używa funkcji **`dtrace_probe_create`** do utworzenia sondy dla każdego wywołania systemowego. Sondy te mogą być wyzwalane na **wejściu i wyjściu z każdego wywołania systemowego**. Interakcja z DTrace odbywa się poprzez /dev/dtrace, który jest dostępny tylko dla użytkownika roota.
|
||||
DTrace używa funkcji **`dtrace_probe_create`**, aby utworzyć sondę dla każdego wywołania systemowego. Te sondy mogą być uruchamiane w **punkcie wejścia i wyjścia każdego wywołania systemowego**. Interakcja z DTrace odbywa się przez /dev/dtrace, które jest dostępne tylko dla użytkownika root.
|
||||
|
||||
{% hint style="success" %}
|
||||
Aby włączyć Dtrace bez pełnego wyłączania ochrony SIP, możesz wykonać w trybie odzyskiwania: `csrutil enable --without dtrace`
|
||||
Aby włączyć Dtrace bez całkowitego wyłączania ochrony SIP, możesz wykonać w trybie odzyskiwania: `csrutil enable --without dtrace`
|
||||
|
||||
Możesz również **`dtrace`** lub **`dtruss`** binaria, **które skompilowałeś**.
|
||||
Możesz również **`dtrace`** lub **`dtruss`** binaria, które **skompilowałeś**.
|
||||
{% endhint %}
|
||||
|
||||
Dostępne sondy dtrace można uzyskać za pomocą:
|
||||
|
@ -314,11 +316,11 @@ ID PROVIDER MODULE FUNCTION NAME
|
|||
43 profile profile-97
|
||||
44 profile profile-199
|
||||
```
|
||||
Nazwa sondy składa się z czterech części: dostawcy, modułu, funkcji i nazwy (`fbt:mach_kernel:ptrace:entry`). Jeśli nie określisz części nazwy, DTrace zastosuje tę część jako symbol wieloznaczny.
|
||||
Nazwa sondy składa się z czterech części: dostawcy, modułu, funkcji i nazwy (`fbt:mach_kernel:ptrace:entry`). Jeśli nie określisz jakiejś części nazwy, Dtrace zastosuje tę część jako symbol wieloznaczny.
|
||||
|
||||
Aby skonfigurować DTrace do aktywowania sond i określenia działań do wykonania po ich wyzwoleniu, będziemy musieli użyć języka D.
|
||||
Aby skonfigurować DTrace do aktywacji sond i określenia, jakie działania wykonać, gdy zostaną uruchomione, będziemy musieli użyć języka D.
|
||||
|
||||
Szczegółowe wyjaśnienie i więcej przykładów można znaleźć na stronie [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)
|
||||
Bardziej szczegółowe wyjaśnienie i więcej przykładów można znaleźć w [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)
|
||||
|
||||
#### Przykłady
|
||||
|
||||
|
@ -374,68 +376,70 @@ dtruss -c -p 1000 #get syscalls of PID 1000
|
|||
```
|
||||
### kdebug
|
||||
|
||||
Jest to narzędzie do śledzenia jądra. Udokumentowane kody można znaleźć w **`/usr/share/misc/trace.codes`**.
|
||||
To jest funkcja śledzenia jądra. Udokumentowane kody można znaleźć w **`/usr/share/misc/trace.codes`**.
|
||||
|
||||
Narzędzia takie jak `latency`, `sc_usage`, `fs_usage` i `trace` używają go wewnętrznie.
|
||||
|
||||
Do interakcji z `kdebug` używany jest `sysctl` w przestrzeni nazw `kern.kdebug`, a MIBs do użycia można znaleźć w `sys/sysctl.h`, gdzie funkcje są zaimplementowane w `bsd/kern/kdebug.c`.
|
||||
Aby interfejsować z `kdebug`, używa się `sysctl` w przestrzeni nazw `kern.kdebug`, a MIB-y do użycia można znaleźć w `sys/sysctl.h`, mając funkcje zaimplementowane w `bsd/kern/kdebug.c`.
|
||||
|
||||
Aby komunikować się z kdebug za pomocą niestandardowego klienta, zazwyczaj wykonywane są następujące kroki:
|
||||
Aby interagować z kdebug za pomocą niestandardowego klienta, zazwyczaj wykonuje się następujące kroki:
|
||||
|
||||
* Usuń istniejące ustawienia za pomocą KERN\_KDSETREMOVE
|
||||
* Ustaw śledzenie za pomocą KERN\_KDSETBUF i KERN\_KDSETUP
|
||||
* Użyj KERN\_KDGETBUF, aby uzyskać liczbę wpisów bufora
|
||||
* Wyłącz własnego klienta ze śledzenia za pomocą KERN\_KDPINDEX
|
||||
* Użyj KERN\_KDGETBUF, aby uzyskać liczbę wpisów w buforze
|
||||
* Wyciągnij własnego klienta z śledzenia za pomocą KERN\_KDPINDEX
|
||||
* Włącz śledzenie za pomocą KERN\_KDENABLE
|
||||
* Odczytaj bufor, wywołując KERN\_KDREADTR
|
||||
* Aby dopasować każdy wątek do jego procesu, wywołaj KERN\_KDTHRMAP.
|
||||
|
||||
Aby uzyskać tę informację, można użyć narzędzia Apple **`trace`** lub niestandardowego narzędzia [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**.**
|
||||
Aby uzyskać te informacje, można użyć narzędzia Apple **`trace`** lub niestandardowego narzędzia [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**.**
|
||||
|
||||
**Zauważ, że Kdebug jest dostępny tylko dla jednego klienta na raz.** Dlatego tylko jedno narzędzie z obsługą k-debug może być uruchomione w tym samym czasie.
|
||||
**Uwaga: Kdebug jest dostępny tylko dla 1 klienta na raz.** Więc tylko jedno narzędzie zasilane k-debug może być uruchomione w tym samym czasie.
|
||||
|
||||
### ktrace
|
||||
|
||||
API `ktrace_*` pochodzi z `libktrace.dylib`, które owijają te z `Kdebug`. Następnie klient może po prostu wywołać `ktrace_session_create` i `ktrace_events_[single/class]` aby ustawić wywołania zwrotne na konkretne kody, a następnie uruchomić je za pomocą `ktrace_start`.
|
||||
API `ktrace_*` pochodzi z `libktrace.dylib`, które opakowuje te z `Kdebug`. Następnie klient może po prostu wywołać `ktrace_session_create` i `ktrace_events_[single/class]`, aby ustawić wywołania zwrotne dla konkretnych kodów, a następnie rozpocząć je za pomocą `ktrace_start`.
|
||||
|
||||
Można go używać nawet z **SIP aktywowanym**.
|
||||
Możesz używać tego nawet z **aktywnym SIP**
|
||||
|
||||
Można użyć jako klientów narzędzie `ktrace`:
|
||||
Możesz używać jako klientów narzędzia `ktrace`:
|
||||
```bash
|
||||
ktrace trace -s -S -t c -c ls | grep "ls("
|
||||
```
|
||||
Or `tailspin`.
|
||||
|
||||
### kperf
|
||||
|
||||
To jest używane do profilowania na poziomie jądra i jest zbudowane przy użyciu wywołań `Kdebug`.
|
||||
To narzędzie służy do profilowania na poziomie jądra i jest zbudowane przy użyciu wywołań `Kdebug`.
|
||||
|
||||
W zasadzie, sprawdzana jest globalna zmienna `kernel_debug_active` i jeśli jest ustawiona, wywoływana jest funkcja `kperf_kdebug_handler` z kodem `Kdebug` i adresem ramki jądra wywołującej. Jeśli kod `Kdebug` pasuje do wybranego, pobierane są "akcje" skonfigurowane jako mapa bitowa (sprawdź `osfmk/kperf/action.h` w opcjach).
|
||||
W zasadzie, globalna zmienna `kernel_debug_active` jest sprawdzana, a jeśli jest ustawiona, wywołuje `kperf_kdebug_handler` z kodem `Kdebug` i adresem ramki jądra. Jeśli kod `Kdebug` pasuje do jednego z wybranych, otrzymuje "akcje" skonfigurowane jako bitmapa (sprawdź `osfmk/kperf/action.h` dla opcji).
|
||||
|
||||
Kperf ma również tabelę MIB sysctl: (jako root) `sysctl kperf`. Ten kod można znaleźć w `osfmk/kperf/kperfbsd.c`.
|
||||
Kperf ma również tabelę MIB sysctl: (jako root) `sysctl kperf`. Te kody można znaleźć w `osfmk/kperf/kperfbsd.c`.
|
||||
|
||||
Co więcej, podzbiór funkcjonalności Kperf znajduje się w `kpc`, który dostarcza informacje o licznikach wydajności maszyny.
|
||||
Ponadto, podzbiór funkcjonalności Kperf znajduje się w `kpc`, który dostarcza informacji o licznikach wydajności maszyny.
|
||||
|
||||
### ProcessMonitor
|
||||
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) to bardzo przydatne narzędzie do sprawdzania działań związanych z procesem, które proces wykonuje (na przykład monitorowanie, które nowe procesy tworzy proces).
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) to bardzo przydatne narzędzie do sprawdzania działań związanych z procesami, które dany proces wykonuje (na przykład, monitorowanie, które nowe procesy tworzy dany proces).
|
||||
|
||||
### SpriteTree
|
||||
|
||||
[**SpriteTree**](https://themittenmac.com/tools/) to narzędzie do wyświetlania relacji między procesami.\
|
||||
Musisz monitorować swój Mac za pomocą polecenia takiego jak **`sudo eslogger fork exec rename create > cap.json`** (terminal uruchamiający to wymagał FDA). Następnie możesz załadować plik json do tego narzędzia, aby zobaczyć wszystkie relacje:
|
||||
Musisz monitorować swojego maca za pomocą polecenia **`sudo eslogger fork exec rename create > cap.json`** (terminal uruchamiający to wymaga FDA). Następnie możesz załadować json w tym narzędziu, aby zobaczyć wszystkie relacje:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1182).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
### FileMonitor
|
||||
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) pozwala monitorować zdarzenia plików (takie jak tworzenie, modyfikacje i usuwanie), dostarczając szczegółowych informacji na ich temat.
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) pozwala monitorować zdarzenia związane z plikami (takie jak tworzenie, modyfikacje i usunięcia), dostarczając szczegółowych informacji o takich zdarzeniach.
|
||||
|
||||
### Crescendo
|
||||
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) to narzędzie GUI z wyglądem i funkcjonalnością, które użytkownicy Windows mogą znać z _Procmon_ firmy Microsoft Sysinternal. Narzędzie to pozwala na rozpoczęcie i zatrzymanie nagrywania różnych typów zdarzeń, umożliwia filtrowanie tych zdarzeń według kategorii, takich jak plik, proces, sieć, itp., oraz zapewnia funkcjonalność zapisywania zarejestrowanych zdarzeń w formacie json.
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) to narzędzie GUI, które wygląda i działa jak znane użytkownikom Windows narzędzie Microsoft Sysinternal’s _Procmon_. To narzędzie pozwala na rozpoczęcie i zatrzymanie nagrywania różnych typów zdarzeń, umożliwia filtrowanie tych zdarzeń według kategorii, takich jak plik, proces, sieć itp., oraz zapewnia funkcjonalność zapisywania zarejestrowanych zdarzeń w formacie json.
|
||||
|
||||
### Apple Instruments
|
||||
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) są częścią narzędzi deweloperskich Xcode - używane do monitorowania wydajności aplikacji, identyfikowania wycieków pamięci i śledzenia aktywności systemu plików.
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) są częścią narzędzi deweloperskich Xcode – używane do monitorowania wydajności aplikacji, identyfikowania wycieków pamięci i śledzenia aktywności systemu plików.
|
||||
|
||||
![](<../../../.gitbook/assets/image (1138).png>)
|
||||
|
||||
|
@ -448,34 +452,34 @@ fs_usage -w -f network curl #This tracks network actions
|
|||
```
|
||||
### TaskExplorer
|
||||
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) jest przydatny do zobaczenia **bibliotek** używanych przez plik binarny, **plików**, z którymi się komunikuje oraz połączeń **sieciowych**.\
|
||||
Sprawdza również procesy binarne pod kątem **virustotal** i wyświetla informacje o pliku binarnym.
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) jest przydatny do zobaczenia **bibliotek** używanych przez binarny plik, **plików**, które wykorzystuje oraz **połączeń** sieciowych.\
|
||||
Sprawdza również procesy binarne w stosunku do **virustotal** i pokazuje informacje o binarnym pliku.
|
||||
|
||||
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
|
||||
|
||||
W [**tym wpisie na blogu**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) znajdziesz przykład, jak **debugować działające demony**, które używają **`PT_DENY_ATTACH`** do uniemożliwienia debugowania, nawet jeśli SIP jest wyłączone.
|
||||
W [**tym wpisie na blogu**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) można znaleźć przykład, jak **debugować działający demon**, który używał **`PT_DENY_ATTACH`**, aby zapobiec debugowaniu, nawet jeśli SIP był wyłączony.
|
||||
|
||||
### lldb
|
||||
|
||||
**lldb** to narzędzie **de facto** do **debugowania** plików binarnych w systemie **macOS**.
|
||||
**lldb** jest de **facto narzędziem** do **debugowania** binarnych plików **macOS**.
|
||||
```bash
|
||||
lldb ./malware.bin
|
||||
lldb -p 1122
|
||||
lldb -n malware.bin
|
||||
lldb -n malware.bin --waitfor
|
||||
```
|
||||
Możesz ustawić wersję intel, korzystając z lldb, tworząc plik o nazwie **`.lldbinit`** w swoim folderze domowym i dodając następującą linijkę:
|
||||
Możesz ustawić smak intel podczas używania lldb, tworząc plik o nazwie **`.lldbinit`** w swoim katalogu domowym z następującą linią:
|
||||
```bash
|
||||
settings set target.x86-disassembly-flavor intel
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Wewnątrz lldb, zrzuć proces za pomocą `process save-core`
|
||||
Wewnątrz lldb, zrzutuj proces za pomocą `process save-core`
|
||||
{% endhint %}
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Polecenie</strong></td><td><strong>Opis</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Rozpoczęcie wykonania, które będzie kontynuowane do momentu trafienia w punkt przerwania lub zakończenia procesu.</td></tr><tr><td><strong>continue (c)</strong></td><td>Kontynuacja wykonania procesu w trybie debugowania.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Wykonaj następną instrukcję. To polecenie pomija wywołania funkcji.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Wykonaj następną instrukcję. W przeciwieństwie do polecenia nexti, to polecenie wejdzie w wywołania funkcji.</td></tr><tr><td><strong>finish (f)</strong></td><td>Wykonaj resztę instrukcji w bieżącej funkcji ("ramce") i zatrzymaj.</td></tr><tr><td><strong>control + c</strong></td><td>Wstrzymaj wykonanie. Jeśli proces został uruchomiony (r) lub kontynuowany (c), spowoduje to zatrzymanie procesu ...gdziekolwiek jest obecnie wykonywany.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #Dowolna funkcja o nazwie main</p><p>b <binname>`main #Główna funkcja pliku binarnego</p><p>b set -n main --shlib <lib_name> #Główna funkcja wskazanego pliku binarnego</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #Lista punktów przerwania</p><p>br e/dis <num> #Włącz/Wyłącz punkt przerwania</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Uzyskaj pomoc dotyczącą polecenia punktu przerwania</p><p>help memory write #Uzyskaj pomoc w zapisywaniu do pamięci</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<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 <reg/memory address</strong></td><td>Wyświetl pamięć jako łańcuch zakończony znakiem null.</td></tr><tr><td><strong>x/i <reg/memory address</strong></td><td>Wyświetl pamięć jako instrukcję asemblerową.</td></tr><tr><td><strong>x/b <reg/memory address</strong></td><td>Wyświetl pamięć jako bajt.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>To polecenie wyświetli obiekt wskazywany przez parametr</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>Zauważ, że większość interfejsów API Objective-C firmy Apple zwraca obiekty i powinny być wyświetlane za pomocą polecenia "print object" (po). Jeśli po nie generuje sensownego wyniku, użyj <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 #Zapisz AAAA pod tym adresem<br>memory write -f s $rip+0x11f+7 "AAAA" #Zapisz AAAA pod adresem</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Rozkład bieżącej funkcji</p><p>dis -n <funcname> #Rozkład funkcji</p><p>dis -n <funcname> -b <basename> #Rozkład funkcji<br>dis -c 6 #Rozkład 6 linii<br>dis -c 0x100003764 -e 0x100003768 # Od jednego adresu do drugiego<br>dis -p -c 4 # Rozpocznij rozkładanie w bieżącym adresie</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Sprawdź tablicę 3 komponentów w rejestrze x1</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Komenda</strong></td><td><strong>Opis</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Rozpoczęcie wykonania, które będzie kontynuowane, aż do osiągnięcia punktu przerwania lub zakończenia procesu.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Rozpocznij wykonanie zatrzymując się w punkcie wejścia</td></tr><tr><td><strong>continue (c)</strong></td><td>Kontynuuj wykonanie debugowanego procesu.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Wykonaj następną instrukcję. Ta komenda pominie wywołania funkcji.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Wykonaj następną instrukcję. W przeciwieństwie do komendy nexti, ta komenda wejdzie w wywołania funkcji.</td></tr><tr><td><strong>finish (f)</strong></td><td>Wykonaj pozostałe instrukcje w bieżącej funkcji (“ramce”), zwróć i zatrzymaj.</td></tr><tr><td><strong>control + c</strong></td><td>Wstrzymaj wykonanie. Jeśli proces był uruchomiony (r) lub kontynuowany (c), spowoduje to zatrzymanie procesu ...gdziekolwiek aktualnie się wykonuje.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #Każda funkcja o nazwie main</p><p><code>b <binname>`main</code> #Funkcja main bin</p><p><code>b set -n main --shlib <lib_name></code> #Funkcja main wskazanej bin</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #Każda metoda NSFileManager</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # Zatrzymaj w wszystkich funkcjach tej biblioteki</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #Lista punktów przerwania</p><p><code>br e/dis <num></code> #Włącz/Wyłącz punkt przerwania</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Uzyskaj pomoc dla komendy breakpoint</p><p>help memory write #Uzyskaj pomoc w zapisywaniu do pamięci</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<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 <reg/adres pamięci></strong></td><td>Wyświetl pamięć jako łańcuch zakończony zerem.</td></tr><tr><td><strong>x/i <reg/adres pamięci></strong></td><td>Wyświetl pamięć jako instrukcję asemblera.</td></tr><tr><td><strong>x/b <reg/adres pamięci></strong></td><td>Wyświetl pamięć jako bajt.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>To wydrukuje obiekt wskazywany przez parametr</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>Należy zauważyć, że większość API lub metod Objective-C firmy Apple zwraca obiekty, a zatem powinny być wyświetlane za pomocą komendy “print object” (po). Jeśli po nie produkuje sensownego wyniku, użyj <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 #Zapisz AAAA w tym adresie<br>memory write -f s $rip+0x11f+7 "AAAA" #Zapisz AAAA w adresie</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disas bieżącą funkcję</p><p>dis -n <funcname> #Disas funkcję</p><p>dis -n <funcname> -b <basename> #Disas funkcję<br>dis -c 6 #Disas 6 linii<br>dis -c 0x100003764 -e 0x100003768 # Od jednego adresu do drugiego<br>dis -p -c 4 # Rozpocznij w bieżącym adresie disassembling</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Sprawdź tablicę 3 komponentów w rejestrze x1</td></tr><tr><td><strong>image dump sections</strong></td><td>Wydrukuj mapę pamięci bieżącego procesu</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> #Uzyskaj adres wszystkich symboli z CoreNLP</td></tr></tbody></table>
|
||||
|
||||
{% hint style="info" %}
|
||||
Podczas wywoływania funkcji **`objc_sendMsg`**, rejestr **rsi** przechowuje **nazwę metody** jako łańcuch zakończony znakiem null ("C"). Aby wyświetlić nazwę za pomocą lldb, wykonaj:
|
||||
Podczas wywoływania funkcji **`objc_sendMsg`**, rejestr **rsi** zawiera **nazwę metody** jako łańcuch zakończony zerem (“C”). Aby wydrukować nazwę za pomocą lldb, zrób:
|
||||
|
||||
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
|
@ -485,38 +489,39 @@ Podczas wywoływania funkcji **`objc_sendMsg`**, rejestr **rsi** przechowuje **n
|
|||
`(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
{% endhint %}
|
||||
|
||||
### Anty-Analiza Dynamiczna
|
||||
### Anty-analiza dynamiczna
|
||||
|
||||
#### Wykrywanie maszyn wirtualnych
|
||||
#### Wykrywanie VM
|
||||
|
||||
* Polecenie **`sysctl hw.model`** zwraca "Mac", gdy **hostem jest MacOS**, ale coś innego, gdy jest to maszyna wirtualna.
|
||||
* Grając z wartościami **`hw.logicalcpu`** i **`hw.physicalcpu`**, niektóre złośliwe oprogramowanie próbuje wykryć, czy jest to maszyna wirtualna.
|
||||
* Niektóre złośliwe oprogramowanie może również **wykryć**, czy maszyna jest oparta na **VMware** na podstawie adresu MAC (00:50:56).
|
||||
* Można również sprawdzić, czy proces jest debugowany za pomocą prostego kodu takiego jak:
|
||||
* Komenda **`sysctl hw.model`** zwraca "Mac", gdy **host to MacOS**, ale coś innego, gdy jest to VM.
|
||||
* Bawiąc się wartościami **`hw.logicalcpu`** i **`hw.physicalcpu`**, niektóre złośliwe oprogramowanie próbują wykryć, czy to VM.
|
||||
* Niektóre złośliwe oprogramowanie mogą również **wykrywać**, czy maszyna jest oparta na **VMware** na podstawie adresu MAC (00:50:56).
|
||||
* Możliwe jest również sprawdzenie **czy proces jest debugowany** za pomocą prostego kodu, takiego jak:
|
||||
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proces jest debugowany }`
|
||||
* Można również wywołać wywołanie systemowe **`ptrace`** z flagą **`PT_DENY_ATTACH`**. To **uniemożliwia** dołączenie i śledzenie przez debugera.
|
||||
* Można sprawdzić, czy funkcja **`sysctl`** lub **`ptrace`** jest **importowana** (ale złośliwe oprogramowanie mogłoby importować je dynamicznie)
|
||||
* Jak zauważono w tym artykule, „[Pokonanie Technik Anty-Debugowania: macOS warianty ptrace](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
„_Wiadomość Proces # zakończony ze **statusem = 45 (0x0000002d)** jest zwykle wyraźnym sygnałem, że cel debugowania używa **PT\_DENY\_ATTACH**_”
|
||||
## Zrzuty pamięci
|
||||
* Może również wywołać wywołanie systemowe **`ptrace`** z flagą **`PT_DENY_ATTACH`**. To **zapobiega** dołączeniu i śledzeniu przez debuger.
|
||||
* Możesz sprawdzić, czy funkcja **`sysctl`** lub **`ptrace`** jest **importowana** (ale złośliwe oprogramowanie mogłoby zaimportować ją dynamicznie)
|
||||
* Jak zauważono w tym artykule, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
“_Wiadomość Process # exited with **status = 45 (0x0000002d)** jest zazwyczaj oznaką, że cel debugowania używa **PT\_DENY\_ATTACH**_”
|
||||
|
||||
Zrzuty pamięci są tworzone, jeśli:
|
||||
## Zrzuty rdzenia
|
||||
|
||||
- sysctl `kern.coredump` jest ustawiony na 1 (domyślnie)
|
||||
- Jeśli proces nie był suid/sgid lub `kern.sugid_coredump` jest ustawione na 1 (domyślnie jest 0)
|
||||
- Limit `AS_CORE` pozwala na operację. Można zablokować tworzenie zrzutów pamięci, wykonując polecenie `ulimit -c 0`, a następnie ponownie włączyć je za pomocą `ulimit -c unlimited`.
|
||||
Zrzuty rdzenia są tworzone, jeśli:
|
||||
|
||||
W tych przypadkach zrzuty pamięci są generowane zgodnie z sysctl `kern.corefile` i zazwyczaj przechowywane są w `/cores/core/.%P`.
|
||||
* `kern.coredump` sysctl jest ustawiony na 1 (domyślnie)
|
||||
* Jeśli proces nie był suid/sgid lub `kern.sugid_coredump` jest 1 (domyślnie 0)
|
||||
* Limit `AS_CORE` pozwala na operację. Możliwe jest stłumienie tworzenia zrzutów rdzenia, wywołując `ulimit -c 0` i ponowne włączenie ich za pomocą `ulimit -c unlimited`.
|
||||
|
||||
W tych przypadkach zrzuty rdzenia są generowane zgodnie z `kern.corefile` sysctl i zazwyczaj przechowywane w `/cores/core/.%P`.
|
||||
|
||||
## Fuzzing
|
||||
|
||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
||||
|
||||
ReportCrash **analizuje procesy, które uległy awarii i zapisuje raport o awarii na dysku**. Raport o awarii zawiera informacje, które mogą **pomóc programiście zdiagnozować** przyczynę awarii.\
|
||||
Dla aplikacji i innych procesów **uruchamianych w kontekście uruchamiania per użytkownika**, ReportCrash działa jako LaunchAgent i zapisuje raporty o awariach w `~/Library/Logs/DiagnosticReports/` użytkownika.\
|
||||
Dla demonów, innych procesów **uruchamianych w kontekście uruchamiania systemowego** i innych uprzywilejowanych procesów, ReportCrash działa jako LaunchDaemon i zapisuje raporty o awariach w `/Library/Logs/DiagnosticReports` systemu.
|
||||
Dla aplikacji i innych procesów **uruchamianych w kontekście launchd dla użytkownika**, ReportCrash działa jako LaunchAgent i zapisuje raporty o awariach w `~/Library/Logs/DiagnosticReports/` użytkownika.\
|
||||
Dla demonów, innych procesów **uruchamianych w kontekście launchd systemu** i innych procesów z uprawnieniami, ReportCrash działa jako LaunchDaemon i zapisuje raporty o awariach w `/Library/Logs/DiagnosticReports` systemu.
|
||||
|
||||
Jeśli martwisz się o to, że raporty o awariach **są wysyłane do Apple**, możesz je wyłączyć. W przeciwnym razie raporty o awariach mogą być przydatne do **zrozumienia, jak doszło do awarii serwera**.
|
||||
Jeśli obawiasz się, że raporty o awariach **są wysyłane do Apple**, możesz je wyłączyć. Jeśli nie, raporty o awariach mogą być przydatne do **ustalenia, jak serwer uległ awarii**.
|
||||
```bash
|
||||
#To disable crash reporting:
|
||||
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
|
@ -528,7 +533,7 @@ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.
|
|||
```
|
||||
### Sen
|
||||
|
||||
Podczas przeprowadzania fuzzingu w systemie MacOS ważne jest, aby nie pozwalać Macowi zasypiać:
|
||||
Podczas fuzzingu w MacOS ważne jest, aby nie pozwolić Macowi na uśpienie:
|
||||
|
||||
* systemsetup -setsleep Never
|
||||
* pmset, Preferencje systemowe
|
||||
|
@ -536,7 +541,7 @@ Podczas przeprowadzania fuzzingu w systemie MacOS ważne jest, aby nie pozwalać
|
|||
|
||||
#### Rozłączenie SSH
|
||||
|
||||
Jeśli przeprowadzasz fuzzing za pośrednictwem połączenia SSH, ważne jest, aby upewnić się, że sesja nie zostanie przerwana. Zmodyfikuj plik sshd\_config:
|
||||
Jeśli fuzzujesz przez połączenie SSH, ważne jest, aby upewnić się, że sesja nie wygaśnie. Zmień więc plik sshd\_config na:
|
||||
|
||||
* TCPKeepAlive Yes
|
||||
* ClientAliveInterval 0
|
||||
|
@ -545,22 +550,24 @@ Jeśli przeprowadzasz fuzzing za pośrednictwem połączenia SSH, ważne jest, a
|
|||
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
|
||||
```
|
||||
### Wewnętrzne obsługiwane
|
||||
### Internal Handlers
|
||||
|
||||
**Sprawdź następującą stronę**, aby dowiedzieć się, jak można znaleźć, która aplikacja jest odpowiedzialna za **obsługę określonego schematu lub protokołu:**
|
||||
**Sprawdź następującą stronę**, aby dowiedzieć się, która aplikacja jest odpowiedzialna za **obsługę określonego schematu lub protokołu:**
|
||||
|
||||
{% content-ref url="../macos-file-extension-apps.md" %}
|
||||
[macos-file-extension-apps.md](../macos-file-extension-apps.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Wyliczanie procesów sieciowych
|
||||
### Enumerating Network Processes
|
||||
|
||||
To interesujące, aby znaleźć procesy, które zarządzają danymi sieciowymi:
|
||||
```bash
|
||||
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
|
||||
#wait some time
|
||||
sort -u recv.log > procs.txt
|
||||
cat procs.txt
|
||||
```
|
||||
### Lub użyj `netstat` lub `lsof`
|
||||
Lub użyj `netstat` lub `lsof`
|
||||
|
||||
### Libgmalloc
|
||||
|
||||
|
@ -576,13 +583,15 @@ lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYL
|
|||
|
||||
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
|
||||
|
||||
Działa dla narzędzi CLI.
|
||||
Działa z narzędziami CLI
|
||||
|
||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
||||
|
||||
To "**po prostu działa"** z narzędziami GUI macOS. Zauważ, że niektóre aplikacje macOS mają określone wymagania, takie jak unikalne nazwy plików, odpowiednie rozszerzenie, konieczność odczytu plików z piaskownicy (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
To "**po prostu działa"** z narzędziami GUI macOS. Należy zauważyć, że niektóre aplikacje macOS mają specyficzne wymagania, takie jak unikalne nazwy plików, odpowiednie rozszerzenie, konieczność odczytu plików z piaskownicy (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
|
||||
Przykłady:
|
||||
Kilka przykładów:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```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
|
||||
|
@ -608,7 +617,7 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### Więcej informacji o Fuzzing MacOS
|
||||
### Więcej informacji o fuzzingu MacOS
|
||||
|
||||
* [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)
|
||||
|
@ -626,25 +635,25 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) to wyszukiwarka zasilana **dark-webem**, która oferuje **darmowe** funkcje sprawdzania, czy firma lub jej klienci zostali **skompromitowani** przez **złośliwe oprogramowanie kradnące informacje**.
|
||||
[**WhiteIntel**](https://whiteintel.io) to **silnik wyszukiwania** zasilany **dark-web**, który oferuje **darmowe** funkcje sprawdzania, czy firma lub jej klienci zostali **skompromentowani** przez **malware kradnące dane**.
|
||||
|
||||
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z oprogramowania kradnącego informacje.
|
||||
Ich głównym celem jest zwalczanie przejęć kont i ataków ransomware wynikających z malware kradnącego informacje.
|
||||
|
||||
Możesz odwiedzić ich stronę internetową i wypróbować ich silnik za **darmo** pod adresem:
|
||||
Możesz sprawdzić ich stronę internetową i wypróbować ich silnik za **darmo** pod adresem:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Naucz 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">\
|
||||
Naucz 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>
|
||||
|
||||
<summary>Wesprzyj HackTricks</summary>
|
||||
<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)**.**
|
||||
* **Udostępniaj sztuczki hakerskie, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* **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 na githubie.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
Loading…
Add table
Reference in a new issue