Parçalanmış Paketler ve Güvenlik Sistemlerine Etkileri (Fragmanted Packets)

 

 

Parçalanmış Paketler

 

Parçalanmış paketler(Fragmented Packets) konusu çoğu network ve güvenlik probleminin temelini teşkil etmektedir. Günümüzde tercih edilen NIDS/NIPS(Ağ tabanlı Saldırı Tespit ve Engelleme Sistemleri) sistemleri bu konuya bir çözüm getirse de hala eksik kalan, tam anlaşılmayan kısımlar vardır. Bu sebepledir ki günümüzde hala parçalanmış paketler aracılığıyla yapılan saldırılara karşı korunmasız olan popüler IPS yazılımları bulunmaktadır[1].

Bu yazıda parçalanmış paketlerin nasıl çalıştığı, ne gibi tehlikeler oluşturabileceği ve basit koruma yöntemlerinden bahsetmeye çalışacağım.

Yazı iki bölümden oluşmaktadır; ilk bölümde IP parçalamanın ne olduğu, hangi durumlarda nasıl gerçekleştiği, ikinci bölümde IP parçalamanın ne tip güvenlik zafiyetlerine sebep olabileceği konuları üzerinde durulacaktır.

 

IP (Internet Protocol) Yapısı

 

Parçalanmış paketler konusunun iyi anlaşılabilmesi için öncelikle IP(Internet Protocol) paketinin temel yapısının bilinmesi gerekmektedir. IP paketinin yapısını analiz etmek Sniffer olarak adlandırılan çeşitli araçlar vasıtasıyla olur. Bu araçlardan bazıları aşağıdaki gibidir;

        Tcpdump

        Wireshark

        Snort

        Tshark

        Snoop

Linux ortamında paket analizi için en sık kullanılan araçlar tcpdump ve daha görsel bir araç olan Wireshark’dır.

Windows ortamları için windump, thsark ya da daha görsel bir yazılım olan Wireshark tercih edilmektedir.

Not: Tcpdump ile paket analizi yaparken dikkat edilmesi gereken en önemli nokta tcpdump’ın öntanımlı değerleri ile bir pakete ait 68/96 byte’ı göstermesidir. Bu değer bir ip paketinin başlık bilgilerini göstermeye yetecektir fakat paketin payload kısmı incelenmek istenirse bu değerden daha fazlasına ihtiyaç duyulur.

Tcpdump’la analiz yaparken  –s 0 parametresini kullanarak bir pakete ait tüm alanları görmek mümkündür.  Temel Tcpdump kullanımı için https://www.enderunix.org/docs/tcpdump.html adresinden faydalanabilirsiniz.

 

 

MTU (Maximum Transfer Unit)

 

 

MTU değeri bir ağa girişteki maksimum kapasiteyi belirtir. Mesela Ethernet ağları için MTU değeri 1500 byte, FDDI için 4500 byte’dır. Bu demek oluyor ki Ethernet ağa giren bir paketin boyutu maksimum 1500 byte, FDDI ağa giren bir paketin boyutu en fazla 4500 byte olabilir.

MTU değerleri farklı iki ağ arasında geçişlerde eğer ilk ortamın MTU değeri daha büyükse IP paketlerinde yeni girilecek ortama göre parçalama işlemi yapılır. 

clip_image002

 

Paket Parçalama(Fragmentation)

 

 

Fragmentation (parçalama) bir IP datagramının ağlar arasında dolaşırken kendi boyutundan daha düşük kapasitede bir ağa/ağ geçidine geldiğinde yaşadığı durumdur, yani parçalanma, bölünmedir.

Mesela Ethernet ağlarının MTU değeri 1500 byte’dır. Bizim IP datagramımızın değeri 1560 byte olsun. Bu paket ethernet ağının girişindeki router’a geldiğinde router diğer tarafında Ethernet ağı olduğunu ve bunun mtu değerinin 1500 byte olduğunu bilir ve 1560 byte’lik gelen paketi Ethernet ağına parçalayarak gönderiyor.

Paketimiz artık hedefine ilk parça 1500 byte, ikinci parçası 60 byte olmak üzere iki parça olarak ulaşır ve birleştirilir.

Paketlerin Birleştirilmesi

 

Parçalanmış paketlerin hedefe ulaştığında doğru sırada birleştirilmesi gerekir. Paketler hedefe ulaştığında tekrar birleştirilip orijinalinin elde edilmesi için her pakette bulunması gereken bazı alanlar vardır. Bunlar;


Fragmentation ID, diğer bir isimle IP ID. Bir IP datagramına ait parçalanmış tüm paketlerde bu değer aynı olmalıdır.

clip_image004

 

 


• Parçalanmış her paket datagramın hangi kısmını taşıdığını (Offset değeri) ve sırasını bilmelidir. Kendisinden sonra ek parça paket varsa bu alan flags[+], paketin kendisi son paket ise değer flags [none] olur.

clip_image006


• Parçalanmış her paket taşıdığı veri boyutunu ve hangi byte’dan itibaren taşıdığını bilmelidir. Ne kadarlık bir veri taşıdığı Total Lenght ile belirtilir.

clip_image008

Hangi Byte’dan itibaren bu verinin ekleneceği de “Fragment Offset” değeri ile belirtilir. Yani önceki paket 2960 byte tasımıstır, biz de buna ek 1500 byte yapıp göndereceğiz, bir sonraki pakette offset değeri 2960+1500 olacaktır(aslında 2960+1480)

clip_image010

 

 

 

Ip Parçalama Örneği

 

 

Bir IP paketinin nasıl parçalandığını görmenin en kısa yolu Ethernet ağında 1500 bytedan büyük paket göndermektir. Bunu da Windows/Linux ortamındaki ping komutu ile yapabiliriz. Daha detaylı paket oluşturma için hping aracı incelenebilir.

clip_image012

Yukarıdaki komutla 192.168.2.1 sistemine gönderilmek üzere 5000 byte uzunluğunda bir adet paket(-n 1) hazırlamış olduk.

Bu komut çalıştırıldığında ağ arabirimi sniffer(Wireshark) aracılığıyla izlenirse aşağıdaki gibi bir çıktı alınacaktır. Çıktıda dikkat edilmesi gereken tek bir paket olarak gönderilen icmp paketinin 3 parçaya ayrılarak hedefe gönderildiğidir.

clip_image014

 

Detay İnceleme

 

 

Amacımız 1560 byte olarak gönderilen bir paketin nasıl parçalandığı ve parçaların ne içerdiğini incelemek. Bunun için yine Windows komut satırından ping aracını kullanıyoruz.

clip_image016 


clip_image018

 

Yukarıdaki resimde dikkatimizi çeken bir nokta var. IP datagram‘ımız 1560 byte ve biz bunun 1500 ve 60 byte olmak üzere iki pakete parçalanarak gitmesi gerektiğini düşünüyoruz fakat tcpdump çıktısında ilk paket 1500, ikinci paket 108 byte olarak gözüküyor.

Bunun sebebi parçalanmış her paketin de bir IP paketi olduğu ve her IP paketinin de 20 bytelik bir başlık bilgisi taşıdığıdır. Ilk parçada icmp başlık bilgileri (8) byte da taşındığı için ilk paketin orjinal veri boyutu aslında 1472’dir.

Not: Parçalanmış paketlerde sadece ilk paket protokol başlık bilgisini(TCP, UDP, ICMP vs) taşır.

Elimizde 108 bytelik bir eksiklik var bunu bir sonraki pakete veriyoruz, bir sonraki paketin boyutu 60 olmalıydı buna bir de IP başlığı ekliyoruz (dikkat: icmp başlığı sadece ilk pakette var!) 60+28+20=108 etti. Yani ikinci paketin toplam boyutu 108 byte olmalı ki tcpdump çıktıları da bunu doğruluyor.

C:\>ping snort-home -n 1 -l 3000

Tcpdump Çıktısı

clip_image020

Buraya kadar IP paketlerinin parçalanması, parçalanmanın neden ve nasıl olduğunu inceledik. Konunun detayının anlaşıldığını düşünerek parçalanmış paketlerin güvenlik yönünden incelenmesine geçebiliriz.

Parçalanmış Paketler ve Güvenlik Zafiyetleri

 

Öncelikle paket parçalamanın olağan bir durum olduğunu belirtmek gerekir. İyi niyetlerle düşünülmüş bu özellik bugüne kadar çeşitli ciddi güvenlik sorunlarına sebep olmuştur. Bunların başında denial of service saldırısı yapmak için kullanılan Ping Of Death ve Tear Drop gelir.

Bu saldırılara sebep olan güvenlik açıklıkları uzun zaman önce işletim sistemi geliştirici firmalar tarafından kapatılmıştır fakat paket parçalama ile yapılan Firewall/IDS/IPS atlatma yöntemleri hala bazı sistemler üzerinde çalışabilmektedir.

 

Parçalanmış Paket Oluşturma Araçları

 

 

Paket parçalama işlemi normalde bizim (kullanıcılar) tarafımızdan yapılmaz. Ağlar arası geçişleri sağlayan yönlendirici sistemler(router) gerektiğinde bu işlemi gerçekleştirir. Fakat internette bulunan çeşitli araçlar kullanılarak kendi isteğimize göre paketleri parçalayıp gönderebiliriz.

Bu da bize kullandığımız network sistemlerini test etme imkânı sunar.

Hping ile Parçalanmış Paket Oluşturma

 

 

Hping TCP/IP ağlarda kullanılan ileri düzey bir paket oluşturma aracıdır. Hping kullanarak bir IP paketine ait tüm özellikleri kendimiz belirleyebiliriz. Aşağıdaki komut hping’in paket parçalama amaçlı kullanılabilecek seçeneklerini göstermektedir.

 

clip_image022

 

Nmap Taramalarında Parçalanmış Paket Kullanımı

 

 

Nmap –f (–mtu) parametresi ile port taramalarında istenilen boyutlarda parçalanmış paketler kullanmaya izin verir.

Aşağıdaki taramada hedef sistem taranırken gönderilecek paketlerin boyutları 8 byte olarak düzenlenmiştir.

clip_image024

 

 

Fragroute ve Fragrouter Araçları

 

 

Hping ve Nmap parçalanmış paketler oluşturmaya ve bunlarla bazı işlemler yapmaya izin verse de özellikleri kısıtlıdır. İleri düzey testler için her iki araç da yetersiz kalmaktadır. Gerçek ortamlarda test yapabilmek için bu işe özel yazılmış alternatif araçlar kullanılmalıdır. Bunlar fragroute ve fragrouter’dir. Her iki araç da temelde aynı işi yapmaya yöneliktir. Aralarında basit farklar vardır.

Fragroute ile Parçalanmış paket çalışmaları

 

Fragroute hâlihazırda oluşturulmuş bir trafiği(bir web isteği) istenen özelliklere göre parçalamaya yarar. Yani siz bir yandan web sayfasını ziyaret ederken diğer yandan fragroute sizin web sayfanıza giden istekleri belirli boyut ve özelliklerde parçalayarak gönderir.

clip_image026

 

Fragroute’in sağlıklı çalışabilmesi için öncelikle Linux sistemlerde aşağıdaki komut çalıştırılmalıdır.

echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter

 Fragroute ile Ngrep örneği;

 

Ngrep ağ trafiğinde string arama yazılımıdır. Mesela ngrep –d eth2 –i ‘/etc/passwd’

Komutu eth2 arabirimini dinleyerek trafikte geçen /etc/passwd stringini yakalar ve ekrana basar.

Bizim yapacağımız test fragroute ile bir paketi parçalayıp göndermek ve Ngrep’in bunu yakalayamadığını görmek.

Önce paketleri parçalamadan Ngrep’i çalıştıralım ve HTTP isteğinde gönderdiğimiz  /etc/passwd stringini yakaladığını görelim.

clip_image028

 

Yukarıdaki işlemi (HTTP isteğinde /etc/passwd gönderimi fragroute aracılığıyla yaparsak Ngrep’in bir şey yakalayamadığını görürüz.

 

clip_image030

 

Parçalanmış Paketler ve Güvenlik Duvarları

 

Güvenlik duvarına bir paket geldiğinde onu başlık bilgilerine bakarak filtreleyebilir fakat paket parçalanmış bir paket ise sadece ilk parça paketi filtreleyebilecektir, diğer parça paketler firewalldan süzülerek geçecektir.

Güvenlik duvarları gelip giden paketleri kural tablosu ile karşılaştırabilmesi için paketlerin parçalı olmaması gerekir. Bu da güvenlik duvarlarının paket birleştirme özelliğine sahip olmalarını zorunlu tutar.

OpenBSD PF güvenlik duvarındaki scrub özelliği kullanılarak parçalanmış paketlerin güvenlik duvarında tekrar birleştirilmesi ve hedefe bu şekilde ulaştırılması sağlanabilir.

 

OpenBSD PF ve parçalanmış paketler

 

Scrub özelliği

 

fragment reassemble : Gelen parçalanmış paketleri hedefe iletmeden once birleştirerek göndermek için kullanılır. Bu seçeneğin yararı güvenlik duvarları paket tamamlanmadan kuralları tam uygulamayacağı için fragment paketlerin güvenlik duvarı kurallarına gelmeden birleştirilmesi gerekir. Ek olarak fragment crop, fragment drop-ovl , no-df seçeneklerine de incelenebilir.

 

Parçalanmış Paketler ve Saldırı Tespit Sistemleri

 

Parçalanmış paketler konusunda en sıkıntılı sistemler IDS/IPS’lerdir. Bunun nedeni bu sistemlerin temel işinin ağ trafiği inceleme olmasıdır. Saldırı tespit sistemleri gelen bir paketin/paket grubunun saldırı içerikli olup olmadığını anlamak için çeşitli kontrollerden geçirir. Eğer bu kontrolleri geçirmeden önce paketleri birleştirmezse çok rahatlıkla kandırılabilir.

 

Mesela HTTP trafiği içerisinde “/bin/bash” stringi arayan bir saldırı imzası olsun. IDS sistemi 80.porta gelen giden her trafiği inceleyerek içerisinde /bin/bash geçen paketleri arar ve bu tanıma uyan paketleri bloklar. Eğer IDS sistemimiz paket birleştirme işlemini uygun bir şekilde yapamıyorsa biz fragroute veya benzeri bir araç kullanarak /bin/sh stringini birden fazla paket olacak şekilde (1. Paket /bin, 2.paket /bash)gönderip IDS sistemini atlatabiliriz.

 

Snort ve Parçalanmış Paketler

 

Açık kaynak kodlu IDS/IPS yazılımı Snort parçalanmış paketler için sağlam bir çözüm sunmaktadır. Snort ile birlikte frag3 önişlemcisi kullanılarak IDS sistemine gelen parçalanmış paketler detection engine(Snort’da kural karşılaştırmasının yapıldığı kısım)gelmeden birleştirilerek yapılmaya çalışılan ids atlatma tekniklerini işe yaramaz hale getirilebilir. Frag3 önişlemcisine ek olarak Stream5 önişlemcisi de kullanılarak stateful bir yapı kurulur. Bu ikili sağlıklı yapılandırılmazsa Snort birçok saldırıya açık hale gelir ve gerçek işlevini yerine getiremez.

 

Snort TCP reassembly modülü:

preprocessor stream5_tcp: policy windows, use_static_footprint_sizes, \                                                  ports client 21 23 25 42 53 80  135 136 137 139 143 110 111 445 465 513 691 1433 1521 2100 2301 3128 3306 8000 8080 8180 8888

Aşağıdaki çıktı Frag3 ve Stream5 önişlemcilerinin aktif olduğu durumda HTTP üzerinden yapılan GET ../../../etc/passwd HTTP/1.1 isteğinin Snort  tarafından yakalandığını gösteriyor. Aynı isteği parçalanmış paketlerle denersek Snort yine yakalar. Bunun nedeni frag3 eklentisinin networkten gelen paketleri önce birleştirip sonra Detection engine’e aktarmasıdır.

 

 

Sonuç

 

 

Parçalanmış paketler TCP/IP’nin en ilginç konularından biridir ve ilginç olduğu kadar da tehlikeli kullanımlara sahiptir. Bu yazıda parçalanmış paketler ve güvenlik sistemlerinin(Firewall/IPS) parçalanmış paketlere karşı nasıl davrandıklarını incelemeye çalıştım.

Kaynaklar:

[1] TippingPoint IPS Signature Evasion through  Packet Fragmentation (https://www.milw0rm.com/papers/302 )

https://www.openbsd.org/faq/pf/scrub.html

The Tao of Network Security Monitoring

https://www.snort.org/docs/snort_htmanuals

https://citeseer.ist.psu.edu/ptacek98insertion.html  

https://www.monkey.org/~dugsong/fragroute/)

Huzeyfe ÖNAL