Dll Hijacking
Last updated
Last updated
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Hata ödülü ipucu: Intigriti'ye kaydolun, hackers tarafından, hackers için oluşturulmuş bir premium hata ödülü platformu! Bugün https://go.intigriti.com/hacktricks adresine katılın ve $100,000'a kadar ödüller kazanmaya başlayın!
DLL Hijacking, güvenilir bir uygulamanın kötü niyetli bir DLL yüklemesini sağlamak için manipüle edilmesini içerir. Bu terim, DLL Spoofing, Injection ve Side-Loading gibi birkaç taktiği kapsar. Genellikle kod yürütme, kalıcılık sağlama ve daha az yaygın olarak ayrıcalık yükseltme için kullanılır. Burada yükseltmeye odaklanılmasına rağmen, kaçırma yöntemi hedefler arasında tutarlıdır.
DLL hijacking için birkaç yöntem kullanılmaktadır, her biri uygulamanın DLL yükleme stratejisine bağlı olarak etkinliği değişir:
DLL Değiştirme: Gerçek bir DLL'i kötü niyetli bir DLL ile değiştirmek, isteğe bağlı olarak orijinal DLL'in işlevselliğini korumak için DLL Proxying kullanmak.
DLL Arama Sırası Kaçırma: Kötü niyetli DLL'i meşru olanın önünde bir arama yoluna yerleştirmek, uygulamanın arama desenini istismar etmek.
Phantom DLL Kaçırma: Bir uygulamanın yüklemesi için kötü niyetli bir DLL oluşturmak, bunun var olmayan bir gerekli DLL olduğunu düşünerek.
DLL Yönlendirme: Uygulamayı kötü niyetli DLL'e yönlendirmek için %PATH%
veya .exe.manifest
/ .exe.local
dosyaları gibi arama parametrelerini değiştirmek.
WinSxS DLL Değiştirme: Meşru DLL'i WinSxS dizininde kötü niyetli bir karşıtı ile değiştirmek, genellikle DLL side-loading ile ilişkilendirilen bir yöntem.
Göreceli Yol DLL Kaçırma: Kötü niyetli DLL'i kopyalanmış uygulama ile kullanıcı kontrolündeki bir dizine yerleştirmek, Binary Proxy Execution tekniklerine benzer.
Bir sistemde eksik Dll'leri bulmanın en yaygın yolu, sysinternals'tan procmon çalıştırmaktır, aşağıdaki 2 filtreyi ayarlayarak:
ve sadece Dosya Sistemi Etkinliğini gösterin:
Eğer genel olarak eksik dll'ler arıyorsanız, bunu birkaç saniye çalıştırabilirsiniz. Eğer belirli bir yürütülebilir dosya içinde eksik bir dll arıyorsanız, "Process Name" "contains" "<exec name>" gibi başka bir filtre ayarlamalı, çalıştırmalı ve olayları yakalamayı durdurmalısınız.
Ayrıcalıkları yükseltmek için en iyi şansımız, bir ayrıcalıklı sürecin yüklemeye çalışacağı bir dll yazabilmektir ve bu dll'in arama yapılacak yerlerden birinde olmasıdır. Bu nedenle, orijinal dll'in bulunduğu dizinden önce dll'in arandığı bir dizine yazabileceğiz (garip bir durum), ya da dll'in arandığı bir dizine yazabileceğiz ve orijinal dll herhangi bir dizinde mevcut değildir.
Microsoft belgelerinde DLL'lerin nasıl yüklendiğini bulabilirsiniz.
Windows uygulamaları, belirli bir sıraya uyarak, önceden tanımlanmış arama yolları setini takip ederek DLL'leri arar. DLL hijacking sorunu, zararlı bir DLL'in bu dizinlerden birine stratejik olarak yerleştirilmesiyle ortaya çıkar, bu da onun gerçek DLL'den önce yüklenmesini sağlar. Bunu önlemenin bir çözümü, uygulamanın ihtiyaç duyduğu DLL'lere atıfta bulunurken mutlak yollar kullanmasını sağlamaktır.
Aşağıda 32-bit sistemlerde DLL arama sırasını görebilirsiniz:
Uygulamanın yüklendiği dizin.
Sistem dizini. Bu dizinin yolunu almak için GetSystemDirectory fonksiyonunu kullanın. (C:\Windows\System32)
16-bit sistem dizini. Bu dizinin yolunu elde eden bir fonksiyon yoktur, ancak arama yapılır. (C:\Windows\System)
Windows dizini. Bu dizinin yolunu almak için GetWindowsDirectory fonksiyonunu kullanın. (C:\Windows)
Geçerli dizin.
PATH ortam değişkeninde listelenen dizinler. Bunun, App Paths kayıt defteri anahtarı tarafından belirtilen uygulama başına yolu içermediğini unutmayın. App Paths anahtarı, DLL arama yolunu hesaplarken kullanılmaz.
Bu, SafeDllSearchMode etkin olduğunda varsayılan arama sırasıdır. Devre dışı bırakıldığında, geçerli dizin ikinci sıraya yükselir. Bu özelliği devre dışı bırakmak için, HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode kayıt defteri değerini oluşturun ve 0 olarak ayarlayın (varsayılan etkin).
Eğer LoadLibraryEx fonksiyonu LOAD_WITH_ALTERED_SEARCH_PATH ile çağrılırsa, arama, LoadLibraryEx'in yüklediği yürütülebilir modülün dizininde başlar.
Son olarak, bir dll'in yalnızca adını değil, mutlak yolunu belirterek yüklenebileceğini unutmayın. Bu durumda, o dll yalnızca o yolda aranacaktır (eğer dll'in herhangi bir bağımlılığı varsa, bunlar yalnızca adla yüklendiği gibi aranacaktır).
Arama sırasını değiştirmek için başka yollar da vardır, ancak bunları burada açıklamayacağım.
Windows belgelerinde standart DLL arama sırasına belirli istisnalar belirtilmiştir:
Bellekte zaten yüklenmiş bir DLL ile aynı adı paylaşan bir DLL ile karşılaşıldığında, sistem genellikle aramayı atlar. Bunun yerine, yönlendirme ve bir manifest kontrolü yapar ve ardından bellekteki zaten yüklenmiş DLL'e geri döner. Bu senaryoda, sistem DLL için bir arama yapmaz.
DLL, mevcut Windows sürümü için bilinen bir DLL olarak tanındığında, sistem, arama sürecini atlayarak, bilinen DLL'in kendi sürümünü ve bağımlı DLL'lerini kullanır. Kayıt defteri anahtarı HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs, bu bilinen DLL'lerin bir listesini tutar.
Eğer bir DLL bağımlılıkları varsa, bu bağımlı DLL'ler için arama, yalnızca modül adlarıyla belirtilmiş gibi gerçekleştirilir, başlangıçta DLL'in tam yoluyla tanımlanıp tanımlanmadığına bakılmaksızın.
Gereksinimler:
Farklı ayrıcalıklar altında çalışan veya çalışacak bir süreci (yatay veya yan hareket) tanımlayın, bu süreç bir DLL'den yoksundur.
DLL'nin arama yapılacak herhangi bir dizinde yazma erişiminin mevcut olduğundan emin olun. Bu konum, yürütülebilir dosyanın dizini veya sistem yolundaki bir dizin olabilir.
Evet, gereksinimler, varsayılan olarak, ayrıcalıklı bir yürütülebilir dosyanın eksik bir dll bulmasının garip olması nedeniyle bulması zor. Ayrıca, sistem yolu dizininde yazma izinlerine sahip olmak (varsayılan olarak yapamazsınız) daha da garip. Ancak, yanlış yapılandırılmış ortamlarda bu mümkündür. Eğer şanslıysanız ve gereksinimleri karşıladığınızı bulursanız, UACME projesine göz atabilirsiniz. Projenin ana hedefi UAC'yi atlatmak olsa da, orada kullanabileceğiniz Windows sürümü için bir Dll hijacking PoC bulabilirsiniz (muhtemelen yalnızca yazma izinlerinizin olduğu dizinin yolunu değiştirerek).
Bir dizindeki izinlerinizi kontrol edebileceğinizi unutmayın:
Ve PATH içindeki tüm klasörlerin izinlerini kontrol et:
You can also check the imports of an executable and the exports of a dll with:
Tam yetkileri artırmak için Dll Hijacking'i kötüye kullanma hakkında tam bir rehber için System Path klasöründe yazma izinlerinizin olup olmadığını kontrol etmek için bakın:
Winpeas, sistem PATH içindeki herhangi bir klasörde yazma izinlerinizin olup olmadığını kontrol edecektir. Bu açığı keşfetmek için diğer ilginç otomatik araçlar PowerSploit fonksiyonlarıdır: Find-ProcessDLLHijack, Find-PathDLLHijack ve Write-HijackDll.
Eğer istismar edilebilir bir senaryo bulursanız, bunu başarıyla istismar etmek için en önemli şeylerden biri çalıştırılacak dosyanın içe aktaracağı tüm fonksiyonları en azından dışa aktaran bir dll oluşturmak olacaktır. Her neyse, Dll Hijacking'in Orta Bütünlük seviyesinden Yüksek (UAC'yi atlayarak) veya Yüksek Bütünlükten SYSTEM'e** yükselmek için kullanışlı olduğunu unutmayın.** Geçerli bir dll oluşturma hakkında bir örneği, yürütme için dll hijacking'e odaklanan bu dll hijacking çalışmasında bulabilirsiniz: https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows. Ayrıca, bir sonraki bölümde bazı temel dll kodları bulabilirsiniz; bunlar şablon olarak veya gerekli olmayan dışa aktarılan fonksiyonlarla bir dll oluşturmak için faydalı olabilir.
Temelde bir Dll proxy, yüklendiğinde kötü niyetli kodunuzu çalıştırabilen ama aynı zamanda gerçek kütüphaneye yapılan tüm çağrıları ileterek gerekli olarak çalışan bir Dll'dir.
DLLirant veya Spartacus aracıyla, aslında bir çalıştırılabilir dosya belirtebilir ve proxylemek istediğiniz kütüphaneyi seçebilir ve proxylenmiş bir dll oluşturabilirsiniz veya Dll'i belirtebilir ve proxylenmiş bir dll oluşturabilirsiniz.
Rev shell al (x64):
Bir meterpreter al (x86):
Bir kullanıcı oluşturun (x86, x64 versiyonunu görmedim):
Dll'yi derlediğinizde, kurban süreci tarafından yüklenecek birkaç fonksiyonu dışa aktarmanız gerektiğini unutmayın. Bu fonksiyonlar mevcut değilse, ikili dosya bunları yükleyemeyecek ve sömürü başarısız olacaktır.
Hata ödülü ipucu: hackerlar tarafından, hackerlar için oluşturulmuş premium Intigriti hata ödülü platformuna kaydolun! Bugün https://go.intigriti.com/hacktricks adresine katılın ve $100,000'a kadar ödüller kazanmaya başlayın!
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)