İçeriğe atla
0 XP 0
13 dkderinleşmeyle 14 dk50 XP7 etkinlik

IP başlığını okumak

Bu derste
  • IPv4 başlığını bayt bayt çözmeyi, parçalanmayı, TTL ve ICMP davranışını okumayı ve parçalama tabanlı atlatmaya karşı savunmayı öğren.
  • TTL, bayraklar ve parça ofseti gibi alanlar hem yönlendirmeyi hem güvenliği etkiler.
  • Bu derste başlığı tcpdump çıktısından elle çözecek, parçalanmış bir paketi okuyacak, traceroute ve PMTUD mantığını göreceksin.

Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +50 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.

Bağlantı katmanı yerel segmentte kaldı; ağ katmanı ağlar arası taşımayı üstlenir. Her IP paketi kendi başlığını taşır. Bu başlık IPv4'te en az 20 bayttır, seçeneklerle 60 bayta kadar uzar. IP paketi Ethernet çerçevesinin yükü olarak taşınır; EtherType 0x0800 gördüğünde bir alt katmanda IP başlığı seni bekler.

Önceki derste MAC adresinin yalnız yerel segmentte geçerli olduğunu gördün. IP adresi ise paketi ağlar arasında uçtan uca taşır ve yönlendiriciler bu adrese bakarak yol çizer. Güvenlik duvarı kayıtları, IDS uyarıları ve paket yakalamaları aynı alan adlarını kullanır. Bu derste başlığı bayt bayt çözecek, parçalanmayı ve TTL davranışını okuyacaksın.

IPv4 başlığının alanları

IPv4 başlığını RFC 791 tanımlar. Alanları bayt konumuyla okumak işini kolaylaştırır.

0. baytın ilk yarısı Sürüm, ikinci yarısı IHL (başlık uzunluğu) alanıdır. IHL başlığın kaç 32 bitlik kelimeden oluştuğunu sayar; değer 5 ise başlık seçeneksizdir ve tam 20 bayttır.

1. bayt eskiden hizmet türü (ToS) adını taşırdı, bugün ilk altı biti DSCP, son iki biti ECN alanıdır. 2 ve 3. baytlar Toplam Uzunluktur ve başlık dahil paketin boyunu verir.

4 ve 5. baytlar Tanımlayıcıdır (Identification). 6 ve 7. baytlar üç bayrak bitini ve 13 bitlik Parça Ofsetini taşır.

8. bayt TTL, 9. bayt Protokol alanıdır. Ardından Başlık Sağlama Toplamı ve iki adres gelir.

Bayt   Alan                          Boyut
0      Sürüm | IHL                   4 bit + 4 bit
1      DSCP | ECN                    6 bit + 2 bit
2-3    Toplam Uzunluk                16 bit
4-5    Tanımlayıcı (Identification)  16 bit
6-7    Bayraklar | Parça Ofseti      3 bit + 13 bit
8      TTL                           8 bit
9      Protokol                      8 bit
10-11  Başlık Sağlama Toplamı        16 bit
12-15  Kaynak IP                     32 bit
16-19  Hedef IP                      32 bit
20+    Seçenekler (IHL > 5 ise)      0-40 bayt
IPv4 başlığının bayt haritası. Bayraklar alanındaki üç bit sırasıyla ayrılmış bit, DF ve MF'dir.

DSCP paketin hizmet sınıfını işaretler. Ses trafiği genelde EF (Expedited Forwarding) sınıfıyla, yani 46 değeriyle işaretlenir ve kuyrukta öne geçer. ECN ise tıkanıklığı paketi düşürmeden haber verir (RFC 3168). Güvenlikte DSCP'ye körü körüne güvenilmez; bir istemci kendi trafiğini de 46 ile işaretleyebilir.

Ağlar bu yüzden işaretleri güven sınırında yeniden yazar. Protokol alanının değerlerini IANA yönetir: 1 ICMP, 6 TCP, 17 UDP, 47 GRE, 50 ESP demektir. Sınırda beklenmedik bir 47 ya da 50 değeri izinsiz bir tünelin işareti olabilir. Başlık Sağlama Toplamı her yönlendiricide yeniden hesaplanır, çünkü TTL her atlamada değişir.

$ tcpdump -n -r depo.pcap -X -c 1
17:13:20.000000 IP 192.168.1.20.51544 > 203.0.113.10.80: Flags [P.], seq 1000:1044, ack 5000, win 502, length 44: HTTP: GET /sevkiyat/ HTTP/1.1
	0x0000:  4500 0054 1c46 4000 4006 2097 c0a8 0114  E..T.F@.@.......
	0x0010:  cb00 710a c958 0050 0000 03e8 0000 1388  ..q..X.P........
	0x0020:  5018 01f6 3993 0000 4745 5420 2f73 6576  P...9...GET./sev
	0x0030:  6b69 7961 742f 2048 5454 502f 312e 310d  kiyat/.HTTP/1.1.
	0x0040:  0a48 6f73 743a 2064 6570 6f2e 7465 7374  .Host:.depo.test
	0x0050:  0d0a 0d0a                                ....

$ tcpdump -n -r depo.pcap -v -c 1
17:13:20.000000 IP (tos 0x0, ttl 64, id 7238, offset 0, flags [DF], proto TCP (6), length 84)
    192.168.1.20.51544 > 203.0.113.10.80: Flags [P.], cksum 0x3993 (correct), seq 1000:1044, ack 5000, win 502, length 44
Depo yakalamasından tek bir paket. -X baytları onaltılık ve ASCII olarak, -v ise çözülmüş başlığı gösterir.

tcpdump'ın -X çıktısı bağlantı katmanını atlar ve IP başlığından başlar. İlk 20 baytı soldan sağa oku. 45: sürüm 4, IHL 5, yani başlık 20 bayt.

00: DSCP ve ECN sıfır. 00 54: toplam uzunluk 0x54, yani 84 bayt. 1c 46: tanımlayıcı 0x1c46, onluk sistemde 7238.

40 00: ilk üç bit 010 olduğu için DF biti 1, parça ofseti 0. 40: TTL 64. 06: protokol 6, yük TCP. 20 97: sağlama toplamı.

c0 a8 01 14: kaynak 192.168.1.20. cb 00 71 0a: hedef 203.0.113.10. -v çıktısı aynı değerleri çözülmüş hâlde yazar: ttl 64, id 7238, flags [DF], proto TCP (6), length 84.

Etkinlik 1 / 7

IP başlığı alanını görevle eşleştir.

Soldan bir tane seç, sağdan eşini seç. Kullanılmış bir seçeneği yeniden seçersen yeni öğeye taşınır.

Etkinlik 2 / 7

Bir IPv4 paketinin ilk baytı 0x46. Bu paketin başlığı kaç bayttır? Yalnız sayıyı yaz.

Parçalanma nasıl işler

Parçalanma (fragmentation), paket bağlantının MTU sınırını aştığında devreye girer. Ethernet'te MTU genelde 1500 bayttır. Tanımlayıcı alanı bütün parçalarda aynı kalır, böylece alıcı hangi parçaların aynı pakete ait olduğunu bilir.

Parça Ofseti her parçanın orijinal yükteki konumunu 8 baytlık birimlerle yazar. Bu yüzden son parça dışındaki her parçanın veri boyu 8'in katı olmak zorundadır. MF (More Fragments) biti son parça hariç her parçada 1'dir.

Parçaları yolda değil, yalnız hedef cihaz birleştirir. Tek bir parça kaybolursa bütün paket çöpe gider ve üst katman veriyi yeniden yollamak zorunda kalır.

Somut bir örnek kur. Sevkiyat bilgisayarı 3000 baytlık veriyle bir ping yollasın. ICMP başlığıyla birlikte IP yükü 3008 bayt eder. MTU 1500 ise her parçaya 1500 - 20 = 1480 bayt veri sığar.

İlk parça 0. bayttan başlar, ofseti 0'dır. İkinci parça 1480. bayttan başlar ve ofset alanına 1480 / 8 = 185 yazılır.

Üçüncü parça 2960. bayttan başlar, ofseti 370'tir ve kalan 48 baytı taşır. İlk iki parçada MF biti 1, sonuncusunda 0'dır. Toplam uzunluklar 1500, 1500 ve 68 bayt olur.

Üç parçanın tanımlayıcısı aynıdır. Aşağıdaki çıktılar bu üç parçayı gösterir.

$ tcpdump -n -v -r parca.pcap
22:01:34.310085 IP (tos 0x0, ttl 64, id 11024, offset 0, flags [+], proto ICMP (1), length 1500)
    192.168.1.20 > 203.0.113.10: ICMP echo request, id 66, seq 1, length 1480
22:01:34.310185 IP (tos 0x0, ttl 64, id 11024, offset 1480, flags [+], proto ICMP (1), length 1500)
    192.168.1.20 > 203.0.113.10: ip-proto-1
22:01:34.310248 IP (tos 0x0, ttl 64, id 11024, offset 2960, flags [none], proto ICMP (1), length 68)
    192.168.1.20 > 203.0.113.10: ip-proto-1

$ tshark -n -r parca.pcap -Y "ip.flags.mf == 1 || ip.frag_offset > 0" -T fields -e frame.number -e ip.id -e ip.flags.mf -e ip.frag_offset -e ip.len
1	0x2b10	True	0	1500
2	0x2b10	True	185	1500
3	0x2b10	False	370	68
Aynı üç parça iki araçla. tcpdump ofseti bayt olarak, tshark alan değerini ham hâliyle yazar.

tcpdump'ta üç satırın id değeri 11024'tür, yani üç parça aynı pakete aittir. tcpdump ofseti bayt olarak yazar: 0, 1480, 2960. flags [+] MF bitinin 1 olduğunu, flags [none] son parçayı gösterir.

İkinci ve üçüncü satırda ICMP başlığı görünmez, çünkü o başlık yalnız ilk parçadadır. Port ya da ICMP türü bilgisi de yalnız ilk parçada durur. tshark aynı parçaları ham değerle gösterir: 0, 185, 370; 0x2b10 da 11024'ün onaltılık yazımıdır.

Burada bir tuzak var. Wireshark ayrıntı panelinde ikinci parça için Fragment Offset: 1480 yazar, çünkü değeri sekizle çarpıp gösterir. Filtre ise ham değerle çalışır ve ip.frag_offset == 185 ifadesi bu parçayı bulur.

DF (Don't Fragment) biti set edilmişse yönlendirici paketi parçalayamaz. MTU aşılırsa paketi düşürür ve göndericiye ICMP Tür 3 Kod 4 mesajı yollar: parçalama gerekli ama DF set. RFC 1191 bu mesaja bir sonraki atlamanın MTU değerini de ekler.

Gönderici paket boyunu küçültür ve yeniden dener. Bu mekanizmanın adı Path MTU Discovery'dir (PMTUD). Sık yapılan hata ICMP'yi tümden engellemektir.

Tür 3 Kod 4 gelmezse gönderici sorunu öğrenemez. Küçük paketler geçer, büyükler sessizce kaybolur. Bu duruma PMTUD kara deliği denir. Belirtisi tipiktir: bağlantı kurulur ama büyük bir sayfa ya da dosya aktarımı takılır.

Derinleş:Ping of Death ve Teardrop

1990'ların ortasında parçalanma, işletim sistemlerini tek bir paketle çökertebiliyordu. 1996'da yayılan Ping of Death saldırısında parçalar öyle ayarlanıyordu ki birleşen paket 65535 baytlık IPv4 sınırını aşıyordu. Birçok sistem bu boyu hiç beklemediği için bellekte taşma yaşıyor ve çöküyordu. 1997'de ortaya çıkan Teardrop ise örtüşen parçalar kullanıyordu.

İkinci parça ilk parçanın tamamen içine düşüyor, birleştirme kodundaki uzunluk hesabı negatife dönüyordu. Kod bu hatalı değeri kopyalama boyu olarak kullanınca sistem çöküyordu. İki saldırı aynı dersi verdi: ağdan gelen hiçbir uzunluk ve ofset değeri denetlenmeden kullanılmaz.

Günümüz çekirdekleri bu sınırları denetler. Yine de benzer hatalar zaman zaman yeni ağ sürücülerinde ve gömülü sistemlerde yeniden ortaya çıkar.

Etkinlik 3 / 7

Doğru mu, yanlış mı?

DF biti 1 olan bir paket MTU'yu aşınca yönlendirici onu parçalara böler.

Etkinlik 4 / 7

Wireshark ayrıntı panelinde bir parça için Fragment Offset: 1480 görüyorsun. Bu parçayı hangi filtre getirir?

TTL, ICMP ve traceroute

TTL (Time to Live) alanı döngüleri önler. Her yönlendirici paketi iletmeden önce TTL'yi bir azaltır. Değer sıfıra inerse paketi düşürür ve göndericiye ICMP Tür 11 Kod 0 mesajı yollar: yolda süre aşıldı.

traceroute bu davranışı kullanır. İlk sondayı TTL 1 ile yollar; ilk yönlendirici paketi düşürür ve Tür 11 ile kendini ele verir. Sonra TTL 2 ile ikinci yönlendiriciyi bulur ve hedefe varana kadar devam eder.

Linux'taki traceroute varsayılan olarak UDP sonda, Windows'taki tracert ise ICMP yankı isteği yollar. tracepath aynı yöntemle yolu çıkarırken her atlamada MTU'yu da ölçer. Bu yüzden PMTUD sorunlarını bulmakta işe yarar.

$ tracepath -n 203.0.113.10
 1?: [LOCALHOST]                      pmtu 1500
 1:  192.168.1.1                                           0.612ms
 1:  192.168.1.1                                           0.498ms
 2:  192.168.1.1                                           0.521ms pmtu 1492
 2:  10.20.0.1                                             7.940ms
 3:  198.51.100.1                                          9.215ms
 4:  203.0.113.10                                         11.402ms reached
     Resume: pmtu 1492 hops 4 back 4
Depodan uzak sunucuya bir tracepath çıktısı. Ağ geçidinin dış bağlantısı 1492 baytlık MTU bildiriyor.

İlk satır yerel arayüzün MTU'sunu 1500 olarak verir. Birinci atlama ağ geçididir. İkinci sondada ağ geçidi pmtu 1492 bildirir; dış bağlantısı 1500 baytlık paketi taşıyamaz. tracepath bundan sonra sondaları 1492 bayta göre yollar.

Dördüncü satırda hedefe ulaşılır, reached etiketi bunu söyler. Özet satırı yol boyu MTU'yu 1492, atlama sayısını 4 olarak verir; back değeri dönüş yolunun tahminidir. Bu çıktıda ICMP geri bildirimi çalışıyor. Duvar Tür 3 mesajlarını engelleseydi pmtu satırı hiç görünmezdi ve büyük paketler sessizce kaybolurdu.

TTL alanı işletim sistemi tahmininde de kullanılır. Linux ve macOS genelde 64, Windows 128, birçok ağ cihazı 255 ile başlar. Gözlenen değer başlangıçtan hep düşüktür, çünkü her yönlendirici sayacı azaltır.

Kural şudur: gözlenen değerin üstündeki en yakın başlangıç değerini (32, 64, 128, 255) seç. Gözlenen değer 53 ise başlangıç 64'tür ve paket 11 atlama geçmiştir. Gözlenen değer 116 ise başlangıç 128'dir ve paket 12 atlama geçmiştir.

İnternet yolları genelde 30 atlamanın altında kalır, bu yüzden kural çoğu zaman tutar. Yine de yönetici varsayılan TTL'yi değiştirebilir. Arada bir vekil (proxy) varsa gördüğün TTL de vekilden gelir.

Etkinlik 5 / 7

203.0.113.10 adresine tek paket gönderip gelen cevaptaki TTL değerini gör.

ogrenci@lab

Parçalama tabanlı atlatma ve savunma

Parçalanmanın bir güvenlik yüzü de vardır. Küçük parça saldırısında (tiny fragment) ilk parça öyle küçük tutulur ki TCP bayrakları ikinci parçaya kayar. Yalnız ilk parçaya bakan basit bir süzgeç bayrakları göremez. Örtüşen parça saldırısında (overlapping fragment) ikinci parçanın ofseti ilk parçanın içine düşer ve başlığın bir kısmını yeniden yazar.

RFC 1858 iki tekniği tanımlar, RFC 3128 küçük parçanın bir çeşidini ekler. Daha ince sorun yeniden birleştirmedeki belirsizliktir. Örtüşen iki parçada hangi verinin kazanacağı işletim sistemine göre değişir. IDS bir yolu, hedef başka bir yolu seçerse ikisi farklı paket görür.

IP seçenekleri de risk taşır. Gevşek ve katı kaynak yönlendirme (LSRR, SSRR) seçenekleriyle gönderici paketin yolunu kendisi belirler. Saldırgan bu yolla yönlendirme kurallarını atlatmaya çalışabilir.

RFC 7126 bu seçenekleri taşıyan paketlerin varsayılan olarak düşürülmesini önerir; Linux da ana bilgisayarda kaynak yönlendirmeyi kapalı tutar. IPv6 başlığı başka bir tasarım seçer. Başlık sabit 40 bayttır ve sağlama toplamı taşımaz.

TTL'nin yerini Hop Limit, Protokol alanının yerini Next Header alır. Next Header da IANA numaralarını kullanır; ICMPv6'nın numarası 58'dir. Yönlendiriciler IPv6 paketini hiç parçalamaz, parçalamayı yalnız kaynak yapar. Bu yüzden ICMPv6 Packet Too Big mesajını engellememelisin.

Savunmada dört önlem öne çıkar. İlki ilk parçada yeterli taşıma başlığı taşımayan paketi düşürmektir; RFC 1858, TCP için ofseti 1 olan parçaların atılmasını önerir. İkincisi IDS'te ve duvarda yeniden birleştirmeyi açık tutmaktır, çünkü parçalar birleşmeden kural doğru çalışmaz. Üçüncüsü ICMP'yi türüne göre süzmektir: yankı isteğini sınırlayabilirsin ama Tür 3 ve Tür 11 mesajlarını geçirmelisin.

Dördüncüsü anomali uyarısıdır. Aynı kaynaktan gelen TTL değerinin aniden değişmesi araya bir cihaz girdiğini gösterebilir. IP ID örüntüsü de ipucu verir: düzenli artan bir dizinin birden başka bir düzene geçmesi, paketleri başka bir yığının ürettiğini düşündürür. Wireshark'ın ip.fragment.overlap alanı da örtüşen parçaları doğrudan işaretler.

Derinleş:IDS'i atlatan belirsizlik: 1998 raporu

1998'de Thomas Ptacek ve Timothy Newsham, ağ tabanlı IDS'lerin temel bir zaafını anlatan bir rapor yayımladı: Insertion, Evasion, and Denial of Service: Eluding Network Intrusion Detection. Ana fikir basitti. IDS, hedefin gördüğü paketi değil, kendi yorumladığı paketi inceler.

Hedefin reddedeceği bir paketi IDS kabul ederse buna ekleme (insertion) denir. Hedefin kabul edeceği bir paketi IDS reddederse kaçış (evasion) olur. Örtüşen parçalar, hedefe varmadan ölen düşük TTL'li paketler ve bozuk sağlama toplamları bu farkı yaratmanın yollarıydı.

Rapor IDS tasarımını kalıcı olarak değiştirdi. Günümüz IDS'leri hedef tabanlı yeniden birleştirme kullanır. Yönetici hangi ağ bloğunda hangi işletim sisteminin çalıştığını tanımlar, IDS de parçaları o sistemin kuralıyla birleştirir. Suricata ve Snort bu politikayı yapılandırma dosyasında seçtirir.

Etkinlik 6 / 7

Bir paketin Wireshark'ta ip.flags.df==1 ve ip.frag_offset==0 taşıdığını gördün. Bu paket için ne söyleyebilirsin?

Etkinlik 7 / 7

Güvenlik duvarı kaydında bir paket 'fragmentation needed, DF set' hatasıyla düşürüldü. Bu paketin hangi alanı sorunu doğrudan tetikledi?

Bu derste bir hata mı gördün? Bildir