ACTIVE DIRECTORY NTLM SALDIRILARI
NTLM nedir ve nasıl çalışır ?
NTLM, domain ortamlarında kimlik doğrulaması yapan bir kimlik doğrulama protokolüdür.
NT: İlk geliştirilen halidir.
LM: NT ile kullanılmak ve güçlendirmek için geliştirilmiştir. NT ve LM birleşince NT hash ortaya çıkar, buna NTLM de denir.
NTLMv1: NTLM’in yetersiz olmasından kaynaklı olarak geliştirilmiştir. Daha güvenlidir.
NTLMv2: NTLMv1' in daha güçlü hash değerleri ile tutulan halidir. Bu NTLM’in en güçlü versiyonu olsa da hala güvenlik açısından yetersizdir.
NTDS ve SAM
NTDS, Domain’de bulunan kullanıcıların bilgilerini ve parola hashlerini tutan ve AD(Active Directory) üzerinde tutulan bir veritabanı dosyasıdır.
SAM, Local’ de bulunan kullanıcıların bilgilerini ve parola hashlerini tutan ve Local’ de saklanan bir veritabanı dosyasıdır.
NTLM Kimlik doğrulama
NTLM challange-response yöntemi ile kimlik doğrulama yapar. Bu yöntem şöyle çalışır;
1. Client bir doğrulama isteği gönderir.
2. Server bu isteği alır ve Client a kendi oluşturduğu benzersiz bir id’yi gönderir. Bu işlem isteği yapan kişiden cevabı aldığını doğrulamak içindir. Eğer başka biri cevap vericek olursa server’ın benzersiz olarak oluşturup isteği yapan kişiye gönderdiği id’yi bilemez böylece şifreyi bilse bile doğrulama yapamaz.
3. Client bu benzersiz id’yi alır, kullanıcı adı ve şifresi ile hashler. Bu hash değeri NTLMv1 veya NTLMv2 olabilir. Bu serverın hangi hash değeri ile çalışmaya yapılandırıldığına göre değişebilir. Daha sonra server’ a geri gönderir.
4. Server Client’ın gönderdiği bu paketi alır id kendi gönderdiği id ile aynıysa eğer şifre ve kullanıcı adının doğrulanması için active directory yani domain contreller’a gönderir.
5. Domain kontroller kendi üzerinde tuttuğu NTDS adı verilen ve kullanıcı bilgilerinin tutulduğu(linux üzerinde passwd ve shadow’a benzetebiliriz) bu veritabanı dosyasında bulunan hash değeri ile server’dan aldığı hash değerini kontol eder ve eğer doğru ise server’a bildirir.
6. Server bilgilerin doğru olduğunu Client’a bildirir ve iletişim böylece gerçekleşmiş olur.
Peki biz bu işlemi manipüle edebilir miyiz ?
SMB bağlantısı üzerinden NTLM’i manipüle etmek çok olasıdır. Bir client paylaşımlı bir dosyaya bağlanırken yayınlayan cihazın yani serverın netbios adı veya ip adresini kullanır. Biliyoruz ki Netbios adı kullanılırsa işin içine DNS , WINS, LLMNR gibi isim çözümleme protokolleri girer. Bu işlemler Domain ortamında yapılacağı için aynı zamanda kimlik doğrulama protokolü yani seneryomuzda ki NTLM’ de kullanılmak zorundadır. Çünkü yetkisiz bir kişi bu dosyaya erişemez.
SMB serverları, DNS ve Netbios hakkında bilginiz yoksa eğer bu konular hakkında yazdığım makalelere göz atabilirsiniz.
\\PC-SERGEN\Ortak
Yukarıdaki komutu çalıştır sekmesinde kullandığımızda bizi PC-SERGEN bilgisayarının paylaştığı Ortak klasörüne götürür.
Peki benim bilgisayarım PC-SERGEN’ in kim olduğunu nasıl biliyor ? İşte burada işin içine DNS, NETBIOS ,WINS, LLMNAR gibi kavramlar giriyor. Benim bilgisayarım gidip PC-SERGEN’ in kim olduğunu DNS sunucusuna sorar ve öğrenir böylece Ortak alan klasörüne ulaşabilir. Peki Çalıştır sekmesine yanlış isim girilirse ne olur ?
Yanlış isim girildiği zaman, DNS üzerinde bunun kaydı bulunmayacağı için bu SMB isteği kimseye gidemez ve NTLM doğrulaması başlamaz tabi eğer ben çıkıp bu yanlış girilen adresi karşılamassam.
NTLM, LLMNR SPOOFING
SERGEN(Client)’nin yapmış olduğu isteği responder aracı ile karşılayabilir, hatta cevap bile verebilirim.
Kısaca işlemin nasıl gerçekleşeceğini şu şekilde anlatayım;
- SMB isteği yapılacak fakat isim yanlış yazıldığı için bu DNS üzerinde bulunamayıp tüm ağa sorulacak.
- Ben responder aracı ile bu NTLM doğrulama isteğini sanki yanlış yazılan cihaz benim cihazımın adıymış gibi tutacağım.
- CAN(server) gibi cevap vereceğim ve ona bir id göndereceğim.
- SERGEN(Client) id alacak ve normalde olduğu gibi bir NTLM doğrulama adımı olacak şekilde, kendi kullanıcı adını ve parolasının hash’ ni bana istenilen formatta gönderecek. Bunu yapmasının nedeni yanlış yazdığı sunucunun ben olduğumu sanması.
- Ben, bana gönderidği hashleri responder aracı ile ele geçirmiş olacağım. Bu hashleri, hashcat aracı ile kıracağım ve şifreleri öğreneceğim. Hashler genellikle NTLMv2 veya NTLMv1 formatında gelir. Hangi formatta geldiği responder aracında yazar.
NOT: Bu netbios adı illaki yanlış girilir. Fakat girilmediği durumlar olursa kendimiz arp spoof ve DNS spoof kullanarak aynı zamanda /sys/proc/ipv4/ip_forward dosyasının içini 0 yaparsak iletişimi iletmeyeceğimizden dolayı kullanıcı doğru yazsa bile iletişim gerçekleşmez böylece farklı şeyler denemeye başlar ve yanlış girer.
RESPONDER
responder -I <interface>
“SMB SERVER ON” yazsını görüceksiniz. Eğer yazdığınız interface’in üzerinde bulunduğu bir ağ da biri yanlış yazım yaparsa, sizin “fake” SMB sunucunuz bu cihaz ile NTLM doğrulaması yapacak ve hashleri yakalayacak.
HASHCAT
hashcat -m 5600 -a 0 ntlmv2.txt /usr/share/worlists/rockyou.txt
Hashcat -m diyerek NTLMv2 hashi olduğunu ve -a 0 diyerek wordlist saldırı yapacağımı belirttim.
IMPACKET
Domain üzerinde saldırılar gerçekleştirebileceğimiz çok güzel bir proje var, bunun adı Impacket. İçerisinde birden fazla python kodu ile yazılmış araç bulunan bu projeyi github üzerinden download edebiliriz.
Kurulumu için requirements ve setup dosyalarını çalıştırdıktan sonra içerisine girip python modüllerini kullanabiliriz.
Eğer NTLMv2 hash değerlerini kırıp bazı kullanıcıların şifrelerini elde ettiysek, bu kullanıcıların yetkileri dahilinde Impacket projesini kullanarak bir çok şifre ve hash daha elde edebiliriz.
Örneğin secretdump.py aracını kullanarak, elde ettiğimiz şifreler ile sistemlere giriş yapabilir ve yetkilerimizin yettiği sistemlerin içerisinde, yetkilerimizin yettiği işlemleri yapabiliriz. Örneğin daha önce bu sistemde oturum açmış hesapların NT-LM hashlerini görebiliriz, buna CDLC cache denir. Secretsdump modülü msfconsole’ un içerisinde de kullanılabilir fakat Impacket üzerinden devam edelim.
python3 secretsdump.py ‘<domain-name>/<user-name>:<password>@<ip-adress>’
şeklinde kullanılır. Eğer yetkisi varsa girdiği sistemde ki SAM veya NTDS dosyalarının içinde bulunan hashleri de getirebilir.
PtH
Hashleri kırmadan neler yapabiliriz ?
Bu işlemlerin hepsi şifreler kırıldığı zaman daha kolay yapılan işlemlerdir fakat PtH saldırıları adı verdiğimiz saldırılarla da gerçekleştirilebilir. PtH(pass the hash) elimizde şifrelerin sadece hashleri var ise yapabileceğimiz saldırı tekniğidir.
NTLM RELAY
NTLM Relay saldırısı, SMB2 singing kullanmayan sistemlere gerçekleştirilebilir. Bu yüzden önce kimlerin SMB2 signing kullandığını öğrenmek için nmap aracımızın scriptlerinden smb2-security-mode
scriptini kullanacağız.
nmap — script smb2-security-mode -p 445 10.10.10.0/24
Tüm ağa bu enumeration işlemini gerçekleştirmesini istedim. Çıktı üzerinde not required olanlar benim saldırı yapabileceğim ip adresleri.
Şimdi NTLM Relay saldırımızı yapabiliriz. Bu saldırıda gene yanlış girilen bir cevabı responder ile tutacağız ama sahte SMB serverlık yapmayacağız. Bunu Impacket’ın içinde bulunan ntlmrelayx.py aracına bırakacağız, bizim responder ile tuttuğumuz bilgiler ile ntlmrelayx.py gidip bizim ona verdiğimiz wordlist içerisinde bulunan host iplerine giriş yapıp bize bilgiler getirmeye çalışacak. Burada ki amaç, hostların locallerinde bulunan SAM dosyasının içerisinde ki bilgileri dump etmek yani almaktır. Böylece password spray gibi saldırı yöntemlerini de deneyebiliriz. Bu işlem için responder aracımızın SMB SERVER ON özelliğini OFF yapmamız gerek.
nano /etc/responder/Responder.conf
NOT: PtH gibi ataklar NTLMv1 ve NTLMv2 hashler ile yapılmayacağından dolayı SAM dosyasının içerisinde bulunan NT-LM hashlerine’de ihtiyacımız var. Aslında bir nevi NTLMv1 veya NTLMv2 hashlerini kullanarak NT-LM hashleri elde etmeye çalışıyoruz.
python3 ntlmrelayx.py -tf <ip-address-file> -smb2support
Gelen ntlm bilgileri ile hangi ip adreslerine giriş yapıp bilgiler getireceğini söylediğimiz bir ip adres dosyası oluşturmamız gerekiyor. Smb2support diyerek smb versiyon 2 desteklemesini sağlıyoruz. -tf ise file target anlamına gelir eğer sadece ip adresi vericek olursam -t yazmam yeterliydi.
PASSWORD SPRAY ATTACK
Elde ettiğimiz bir şifreyi diğer kullanıcılara deneyerek, aynı şifreyi kullanan başka bir kullanıcı var mı diye kontrol edilir. Bu işlem yapılırken security policyler içerisinde bulunan password policylere dikkat edilmelidir. Eğer edilmesse bütün denenen hesaplar kitlenebilir.
Bu işlem crackmapexec adı verilen bir araçla veya msfconsole içerisinde bulunan smb login modülü ile gerçekleştirilebilir. crackmapexec üzerinden devam edelim.
crackmapexec smb 10.10.10.0/24 -d <domain-adress> -p <password> -u <user-name-list> — continue-on-succsess
Açıklama: Smb kullanacağımı belirttim. Tüm network üzerinde ki cihazlara, verdiğim domain içerisinde bulunan user-name-list içinde ki kullanıcılara, bu şifre denensin dedim ve — countinue-on-succsess diyerek bulduğun zaman durma, diğer kullanıcılara da devam et, demiş oldum. Eğer — continue-on-succsess demezsem ilk bulduğu şifreden sonra başka bir host a denemeler yapmaya başlar ve öncekini yarım bırakmış olur.
SMBMAP
Dosya paylaşımlarını görüntülememizi sağlayan bir tooldur. Smbclient gibi alternatifleri vardır. Burda SMBMAP üzerinde NT-LM hash ile dosya paylaşımlarını görüntülemeyi göstereceğim.
smbmap -H 10.10.10.10 -d bizim.local -u sergen.can -p DGd7gd6st76xtyhfytd:5sjkYSVBHJXZxvsSBXxhstya53cf
Açıklama: Bu komut bize bizim.local domaininde bulunan sergen.can kullanıcısının yetkileri ile görüntüleyebileci 10.10.10.10 sisteminde bulunan paylaşımları ve bu paylaşımların üzerinde sergen.can kullanıcısnın ne hakları olduğunu söyler.
NT-LM HASH İLE KOD ÇALIŞTIRMA
smbmap, crackmapexec gibi araçlar ile nasıl paylaşımları listeyebiliyor ve şifre kullanabiliyorsak, yetkimizin yeterli olduğu bir kullanıcının adını ve NT-LM hash değerini kullnarak komut da çalıştırabiliriz.
crackmapexec smb 10.10.10.10 -d bizim.local -u sergen.can -H sjkYSVBHJXZxvsSBXxhstya53cf -x ‘whoami’
Açıklama : bizim.local domaininde sergen.can kullanıcısı ve -H diyerek onun şifresinin NT-LM hashini kullanarak -x yani execute anlamına gelen parametresiyle ‘ ‘ işaretleri içerisine yazdığım her şey artık 10.10.10.10 ip adresine sahip sistemin cmd ekranına yazıyormuşum gibi düşünülebilir. crackmapexec, NT-LM hashin sadece LM kısmını kullanır.
smbmap -H 10.10.10.10 -d bizim.local -u sergen.can -p DGd7gd6st76xtyhfytd5:sjkYSVBHJXZxvsSBXxhstya53cf -x whoami
Açıklama: smbmap aracında ‘H’ hostu belirtir, ‘p’ password ve hashler için kullanılır. SMBMAP NT-LM hasin hem NT hem LM kısmını kullanır. Bu kısımlar “:” ile ayrılır.
NT-LM HASH ILE RDP
Normalde rdp bağlantıları için linux üzerinde rdesktop tool’u kullanılır fakat bu tool şifre ile çalışır. NT-LM hashleri ile çalışan bir tool vardır bu ise freerdp2-x11 dir. Bu işlemin yapılabilmesi için hedef sistemin rdp’si açık olmalıdır.
xfreerdp -d bizim.local -pth sjkYSVBHJXZxvsSBXxhstya53cf -u sergen.can -v 10.10.10.10
xfreerdp -u sergen.can -v 10.10.10.10 -p <password> -d bizim.local
NOT: Domain üzerinde sadece Kerberos kullanmak en güvenlisidir. Bunun için AD üzerinde Policylerden NTLM kısıtlanabilir fakat bunu yaparken herhangi bir sistemin NTLM ile ilgili bir doğrulamaya ihtiyaç duymadığını öğrenmemiz gerekir.
Hash ile yapmış olduğum rdp üzerinde aşağıda aldığım hata policy ler yüzünden ortaya çıkar, biz sistem üzerinde komut çalıştırabildiğimiz için bu hatayı komut satırından register kullanarak veya policy edit ile çözebiliriz.
Evil-winrm
Evil winrm, elimizde bir NT-LM hash değeri veya password var ise uzaktan shell almamızı sağlayan bir araçtır.
evil-winrm -i <ip-address> -H <NT-LM HASH> -u <username>
evil-winrm -i <ip-address> -p <password> -u <username>
Okuyabileceğiniz ek kaynaklar;
https://www.coresecurity.com/core-labs/open-source-tools/impacket