---
title: "eBPF/XDP ile Kernel Düzeyinde Paket Dinleme: Gerçek Zamanlı Kimlik Bilgisi Çıkarma ve Ağ Maruziyet Denetimi"
description: "eBPF ve XDP teknolojilerinin kullanıcı alanı paket yakalama darboğazlarını aşarak kimlik doğrulama el sıkışmalarını, NetNTLMv2 hash'lerini ve düz metin parolaları hat hızında nasıl yakaladığı: mimari, protokol ayrıştırıcıları ve driftnet2 ile maruziyet denetimi."
date: 2026-11-09
author: Sevban Dönmez (@jankesec)
canonical: https://jankesec.com/tr/yazilar/driftnet2-ebpf-xdp-network-sniffing/
---

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

1. **Ağ Kartı Kesmesi (IRQ):** Ağ kartı (NIC) gelen ethernet çerçevesini alır ve donanımsal bir kesme üretir.
2. **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.
3. **Ağ Yığını Geçişi:** Paket IP tabloları, güvenlik duvarı kancaları, yönlendirme tabloları ve taşıma katmanları boyunca ilerler.
4. **Kullanıcı Alanına Kopyalama:** Paket en son ham sokete veya `libpcap` tamponuna 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`](https://github.com/jankesec/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:

<figure class="diagram">
<svg viewBox="0 0 760 220" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="driftnet2 eBPF/XDP dual-path network capture architecture.">
<defs><marker id="dn2-arrow" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="7" markerHeight="7" orient="auto"><path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" /></marker></defs>
<text x="0" y="16" class="dg-muted">KERNEL-LEVEL EBPF/XDP SNIFFING · ZERO-COPY DUAL-PATH INGESTION</text>
<rect x="0" y="40" width="220" height="120" rx="8" class="dg-box" />
<text x="14" y="66" class="dg-label">1 · Ingress Frame</text>
<text x="14" y="88" class="dg-mono dg-compact">NIC Driver Layer</text>
<text x="14" y="108" class="dg-muted">Raw Ethernet Ingress</text>
<line x1="220" y1="100" x2="262" y2="100" class="dg-line-crit" marker-end="url(#dn2-arrow)" />
<rect x="266" y="40" width="230" height="120" rx="8" class="dg-box-accent" />
<text x="280" y="66" class="dg-label">2 · eBPF / XDP Hook</text>
<text x="280" y="88" class="dg-mono dg-compact">In-Kernel L4 Filter</text>
<text x="280" y="108" class="dg-muted">Drops Non-Target Traffic</text>
<line x1="496" y1="100" x2="538" y2="100" class="dg-line-crit" marker-end="url(#dn2-arrow)" />
<rect x="542" y="40" width="218" height="120" rx="8" class="dg-box-danger" />
<text x="556" y="66" class="dg-label">3 · Userspace Engine</text>
<text x="556" y="88" class="dg-mono dg-compact">9 Protocol Parsers</text>
<text x="556" y="108" class="dg-muted">NTLMv2 & Audit Report</text>
</svg>
<figcaption>driftnet2 capture pipeline: in-kernel eBPF/XDP filtering drops irrelevant packets at line rate, feeding bounded records to userspace protocol parsers.</figcaption>
</figure>

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

```c
// 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:
1. **Tip 1 (Negotiate):** İstemci NTLM yeteneklerini bildirir.
2. **Tip 2 (Challenge):** Sunucu 8 baytlık bir meydan okuma (challenge) döndürür.
3. **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:

```text
# 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:

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

```text
    ____       _  ______            __   ___  
   / __ \_____(_)/ __/ /_____  ___ / /_ |__ \ 
  / / / / ___/ // /_/ __/ __ \/ _ \ __/ __/ / 
 / /_/ / /  / // __/ /_/ / / /  __/ /_ / __/  
/_____/_/  /_//_/    \__/_/ /_/\___/\__|____/ 

      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 — demo@example.test:[redacted]
[IMAP] Login 192.0.2.13 → 198.51.100.23:143 — demo@example.test:[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
```

<figure class="evidence">
<a href="/images/posts/driftnet2-terminal-capture-evidence.webp" target="_blank" rel="noopener" aria-label="driftnet2 terminal ciktisi ekran goruntusunu tam boyutta ac"><img src="/images/posts/driftnet2-terminal-capture-evidence.webp" alt="FTP, HTTP, POP3, IMAP, SMTP, Telnet, LDAP, SMB ve DNS uzerinde calisan driftnet2 coklu protokol terminal ciktisi" loading="lazy" /></a>
<figcaption><span>driftnet2 Terminal Çıktısı</span> 9 protokol motoru üzerinden eşzamanlı kimlik bilgisi yakalayan ve ardından otomatik maruziyet puanlaması yapan çevrimdışı PCAP analizi.</figcaption>
</figure>

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

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

```text
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](https://github.com/jankesec/driftnet2)
- **Linux Kernel Documentation, eXpress Data Path (XDP):** [docs.kernel.org/networking/af_xdp.html](https://docs.kernel.org/networking/af_xdp.html)
- **MITRE ATT&CK, Network Sniffing (T1040):** [attack.mitre.org/techniques/T1040/](https://attack.mitre.org/techniques/T1040/)
- **MITRE ATT&CK, Adversary-in-the-Middle (T1557.001):** [attack.mitre.org/techniques/T1557/001/](https://attack.mitre.org/techniques/T1557/001/)
- **Hashcat, NetNTLMv2 Cracking Guide:** [hashcat.net/wiki/doku.php?id=example_hashes](https://hashcat.net/wiki/doku.php?id=example_hashes)
