Kullanıcı alanı paket yakalamanın darboğazı
tcpdump, dsniff ve eski nesil driftnet gibi geleneksel ağ dinleme araçları, 100 Mbps veya 1 Gbps ağların tavan olduğu bir dönem için tasarlanmıştı. Günümüzün 10 Gbps ve 40 Gbps kurumsal omurgalarında bu geleneksel paket yakalama mimarisi yetersiz kalmaktadır.
Temel problem, bir paketin Linux ağ yığınından geçerken katettiği yolda yatar:
- Ağ Kartı Kesmesi (IRQ): Ağ kartı (NIC) gelen ethernet çerçevesini alır ve donanımsal bir kesme üretir.
- SKB Bellek Ayırma: Çekirdek, gelen her paket için bellekte bir
struct sk_buff(socket buffer) tahsis eder. Bu işlem kilit çekişmesi, işlemci önbellek ıskalamaları ve ciddi bellek ek yükü doğurur. - Ağ Yığını Geçişi: Paket IP tabloları, güvenlik duvarı kancaları, yönlendirme tabloları ve taşıma katmanları boyunca ilerler.
- Kullanıcı Alanına Kopyalama: Paket en son ham sokete veya
libpcaptamponuna ulaştığında, çekirdek alanından kullanıcı alanına (userspace) bir bellek kopyalaması ve bağlam değişimi (context switch) gerçekleşir.
Yüksek hat trafiği altında işlemci çekirdekleri, zamanının büyük bölümünü sk_buff tahsis etmek ve serbest bırakmakla harcar. Paket geliş hızı kullanıcı alanındaki dinleyicinin tüketim kapasitesini aştığında, soket alma tamponları taşar ve paketler sessizce düşürülür (packet drop). Ofansif ekipler için düşen paketler yakalanamayan kimlik el sıkışmaları; savunma ekipleri içinse ağ görünürlüğünde kör noktalar anlamına gelir.
İşte bu noktada eBPF (Extended Berkeley Packet Filter) ve XDP (eXpress Data Path) paket işleme mimarisini kökten değiştirir.
driftnet2’nin çift hatlı mimarisi
Paket düşmelerini önlemek ve kimlik bilgilerini hat hızında (line-rate) yakalamak amacıyla driftnet2 aracını geliştirdik. Araç, XDP aracılığıyla doğrudan ağ aygıtı sürücüsü katmanına bir eBPF programı iliştirir:
1. Çekirdek içi XDP filtrelemesi (xdp_sniff.c)
XDP, doğrulanmış bayt kodunu mümkün olan en alt katmanda — yani çekirdek henüz bir sk_buff oluşturmadan, doğrudan ağ sürücüsünün alma halkasında (RX ring) — çalıştırır.
eBPF programı Layer 3 ve Layer 4 başlıklarını doğrudan tampon üzerinde inceler. Paket hedef kimlik doğrulama portlarıyla (TCP 80, 445, 389, 21, 23, 110, 143, 587 veya UDP 53 gibi) eşleşmiyorsa, kanca derhal XDP_PASS döndürür. Yalnızca hedef paketler yüksek performanslı bir BPF Ring Buffer (BPF_MAP_TYPE_RINGBUF) üzerinden kullanıcı alanına aktarılır:
// bpf/xdp_sniff.c: Line-rate L4 port filtering
SEC("xdp")
int xdp_credential_filter(struct xdp_md *ctx) {
void *data = (void *)(long)ctx->data;
void *data_end = (void *)(long)ctx->data_end;
struct ethhdr *eth = data;
if ((void *)(eth + 1) > data_end)
return XDP_PASS;
if (eth->h_proto != bpf_htons(ETH_P_IP))
return XDP_PASS;
struct iphdr *ip = (void *)(eth + 1);
if ((void *)(ip + 1) > data_end)
return XDP_PASS;
if (ip->protocol == IPPROTO_TCP) {
struct tcphdr *tcp = (void *)ip + (ip->ihl * 4);
if ((void *)(tcp + 1) > data_end)
return XDP_PASS;
__u16 dport = bpf_ntohs(tcp->dest);
__u16 sport = bpf_ntohs(tcp->source);
// Filter: HTTP(80), SMB(445), LDAP(389), FTP(21), Telnet(23), Mail(110,143,587)
if (is_target_port(dport) || is_target_port(sport)) {
submit_to_ringbuf(ctx, ip, tcp);
}
}
return XDP_PASS;
}
Doğrudan sürücü katmanında filtreleme yapılması sayesinde kullanıcı alanı motoru yalnızca kimlik bilgisi barındırma ihtimali olan paketleri inceler; bu da yoğun ağ trafiğinde işlemci tüketimini %90’a varan oranda düşürür.
2. Çift hatlı veri alımı ve taşınabilirlik
Hedef makine yerel XDP desteğine sahip değilse (veya macOS üzerinde çalıştırıldığında), driftnet2 otomatik olarak optimize edilmiş bir libpcap yakalama döngüsüne geçer. Her iki yakalama hattı da aynı protokol ayrıştırma akışını besler.
9 protokol motorunda kimlik bilgisi ayrıştırma
driftnet2, harici paket ayrıştırıcılara (Wireshark gibi) ihtiyaç duymadan doğrudan kimlik bilgisi ve hash yakalamaya odaklanan hafif motorlar içerir:
| Protokol | Varsayılan Portlar | Kimlik Türü ve Teknik | Hashcat Modu | Çıktı Formatı |
|---|---|---|---|---|
| SMB / CIFS | 445, 139 | NTLMv2 Challenge/Response el sıkışması birleştirme | 5600 | username::domain:server_challenge:ntproof:blob |
| LDAP | 389 | Simple Bind isteklerinin ASN.1 BER ayrıştırması | — | bind_dn:password |
| HTTP | 80, 8080 | Basic Auth, POST gövde parametreleri, Bearer token, çerezler | — | user:password veya Bearer <jwt> |
| FTP | 21 | Düz metin USER / PASS komut dizisi | — | user:password |
| Telnet | 23 | Etkileşimli oturum ve tuş vuruşu yeniden birleştirme | — | login:password |
| POP3 / IMAP | 110, 143 | USER/PASS, AUTH PLAIN ve LOGIN komutları | — | user:password |
| SMTP | 25, 587 | AUTH LOGIN (Base64) ve AUTH PLAIN trafiği | — | user:password |
| DNS | 53 | Gizli tünel tespiti için Shannon entropi analizi | — | subdomain.c2.example.com |
Relay vekiline ihtiyaç duymadan NetNTLMv2 yakalama
Bir SMB kimlik doğrulama el sıkışmasında istemci ve sunucu üç mesaj paylaşır:
- Tip 1 (Negotiate): İstemci NTLM yeteneklerini bildirir.
- Tip 2 (Challenge): Sunucu 8 baytlık bir meydan okuma (challenge) döndürür.
- Tip 3 (Authenticate): İstemci etki alanı, kullanıcı adı, NTProofStr HMAC özeti ve zaman damgaları içeren değişken uzunluklu hedef blob’unu iletir.
Geleneksel araçlar (Responder gibi) sahte sunucu rolü üstlenerek bu el sıkışmayı zorla tetikler. driftnet2 ise bu el sıkışmayı meşru ağ trafiğinden pasif olarak yakalar. Ayrıştırıcı, aktif TCP oturumlarındaki Tip 2 meydan okumalarını Tip 3 yanıtlarıyla ilişkilendirerek kırma işlemi için gereken formatı anında üretir:
# Hashcat Mod 5600 NetNTLMv2 hash formatı:
CORP\jsmith::CORP-DC:1122334455667788:AABBCCDDEEFF00112233445566778899:0101000000000000...
Elde edilen hash, hiçbir ek düzenleme gerektirmeden doğrudan hashcat -m 5600 hashes.txt /path/to/wordlist.txt komutuna verilebilir.
Gizli DNS tünel tespiti
Saldırganlar güvenlik duvarı çıkış kısıtlamalarını aşmak için sıklıkla DNS tünelleme araçlarına (dnscat2, iodine) başvurur. driftnet2, her DNS sorgusunu Shannon entropi formülü üzerinden değerlendirir:
$$H(X) = -\sum_{i=1}^{n} P(x_i) \log_2 P(x_i)$$
Alt alan adları aşırı etiket uzunluğu ($> 50$ karakter) ile birlikte yüksek entropi ($H > 3.8$) sergilediğinde, driftnet2 bu işlemi aktif bir protokol tünelleme göstergesi ([T1071.004]) olarak işaretler.
Canlı yürütme ve çevrimdışı PCAP analizi
driftnet2 hem canlı ağ dinleme hem de çevrimdışı analiz modunda çalışır. Bir paket yakalama dosyasını (.pcap) incelerken araç tamamen root yetkisi olmadan çalıştırılabilir:
# Test yakalamasını analiz et, kimlik bilgilerini çıkar ve maruziyet denetimi yap
./driftnet2 -pcap examples/demo.pcap -output creds.json -audit
Konsol, yakalanan kimlik doğrulama olaylarını anlık olarak ekrana basar:
____ _ ______ __ ___
/ __ \_____(_)/ __/ /_____ ___ / /_ |__ \
/ / / / ___/ // /_/ __/ __ \/ _ \ __/ __/ /
/ /_/ / / / // __/ /_/ / / / __/ /_ / __/
/_____/_/ /_//_/ \__/_/ /_/\___/\__|____/
kernel-level packet sniffer & credential extractor
[*] offline mode: examples/demo.pcap
[FTP] Login 192.0.2.10 → 198.51.100.20:21 — demo:[redacted]
[HTTP] Basic Auth 192.0.2.11 → 198.51.100.21:80 — demo:[redacted]
[POP3] Login 192.0.2.12 → 198.51.100.22:110 — [email protected]:[redacted]
[IMAP] Login 192.0.2.13 → 198.51.100.23:143 — [email protected]:[redacted]
[SMTP] AUTH PLAIN 192.0.2.14 → 198.51.100.24:587 — postmaster:[redacted]
[TELNET] Session 192.0.2.15 → 198.51.100.25:23 — [redacted payload]
[LDAP] Simple Bind 192.0.2.16 → 198.51.100.26:389 — cn=admin,dc=corp:[redacted]
[SMB] NTLMv2 192.0.2.17 → 198.51.100.27:445 — [redacted hash]
[DNS] Tunnel Detection 192.0.2.18 → 8.8.8.8:53 — DNS: TXlDMkV4ZmlsUGF5bG9hZERhdGFHb2VzSGVyZQ.c2.example.test
[*] 9 packets processed, 9 unique credentials found in examples/demo.pcap
[*] saved → creds.json
Savunma tarafı: ağ maruziyet denetim motoru
Kırmızı ekipler driftnet2’yi sızma testlerinde pasif kimlik toplama amacıyla kullanırken, mavi ekipler dahili -audit motorunu şirket ağlarındaki şifresiz protokol risklerini ölçmek için kullanabilir:
# SPAN veya TAP portu yakalamasından doğrudan güvenlik açığı denetim raporu üret
./driftnet2 -pcap network_traffic.pcap -audit -audit-output audit_report.json
Denetim motoru bulguları önem derecesine göre sınıflandırır ve somut sıkılaştırma adımları önerir:
Credential Exposure Audit
=========================
9 findings — 7 High, 1 Medium, 1 Low
[HIGH] SMB — Password hash (1)
Endpoints: 192.0.2.17 -> 198.51.100.27
Fix: Require SMB signing/encryption, restrict NTLM (prefer Kerberos), and enable Extended Protection for Authentication.
[HIGH] HTTP — Cleartext password (1)
Endpoints: 192.0.2.11 -> 198.51.100.21
Fix: Enforce HTTPS/HSTS; never send Basic auth, form credentials, or tokens over cleartext HTTP.
[HIGH] LDAP — Cleartext password (1)
Endpoints: 192.0.2.16 -> 198.51.100.26
Fix: Enforce LDAPS (TCP/636) or StartTLS; reject simple bind authentication over cleartext.
[MEDIUM] DNS — DNS tunnel indicator (1)
Endpoints: 192.0.2.18 -> 8.8.8.8
Fix: Investigate for tunneling/exfiltration; apply DNS filtering policy and query rate limiting.
| Bulgu Kategorisi | Protokol | Tehdit Mekanizması | İyileştirme (Fix) |
|---|---|---|---|
| High | SMB / NetNTLMv2 | Çevrimdışı Hashcat sözlük ve kural saldırılarıyla hash kırma | Kerberos kimlik doğrulamasını zorunlu kılın, NTLMv1/v2’yi kapatın, SMB imzalamayı açın |
| High | LDAP Simple Bind | İç anahtarlar üzerinden geçen şifresiz dizin kimlik bilgileri | LDAPS (TCP 636) zorunlu kılın veya LDAP kanal bağlama (channel binding) uygulayın |
| High | HTTP Basic / Form | Yerel ağ hattında açıkta akan kullanıcı adı ve parolalar | HSTS ile HTTPS’i zorunlu kılın, eski HTTP port 80 dinleyicilerini kapatın |
| Medium | DNS Tünelleme | Güvenlik duvarını aşan gizli giden C2 iletişim kanalı | Dahili DNS çözümleyicileri zorunlu kılın, entropi filtrelemesi uygulayın, harici UDP/53’ü engelleyin |
Kanıt ve sınırlar
Tüm testler ve paket ayrıştırma doğrulamaları izole laboratuvar ortamlarında üretilmiş sentetik ve tekrarlanabilir PCAP test dosyalarıyla gerçekleştirilmiştir. Çekirdek içi eBPF/XDP testleri fiziksel ve sanal ağ arayüzlerine sahip Linux 6.x çekirdeklerinde yürütülmüştür. macOS ve Linux dışı sistemlerde paket yakalama standart libpcap arayüzü üzerinden çalışır. Testler sırasında hiçbir canlı üretim ağı veya yetkisiz iletişim izlenmemiştir.
Referanslar
- jankesec, driftnet2 (Kernel-Level Network Sniffer & Auditor): github.com/jankesec/driftnet2
- Linux Kernel Documentation, eXpress Data Path (XDP): docs.kernel.org/networking/af_xdp.html
- MITRE ATT&CK, Network Sniffing (T1040): attack.mitre.org/techniques/T1040/
- MITRE ATT&CK, Adversary-in-the-Middle (T1557.001): attack.mitre.org/techniques/T1557/001/
- Hashcat, NetNTLMv2 Cracking Guide: hashcat.net/wiki/doku.php?id=example_hashes
Bu teknik not ne kadar güncel?
En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.
Yazar teknik incelemeyi tamamladı. Bu etiket tek başına laboratuvar yeniden üretimi iddiası taşımaz.

