TCP protokolünden zaten birkaç kez bahsettim, bu yüzden kendimi tekrar etmeyeceğim. Sadece temel bilgileri özetleyeceğim: İletim Kontrol Protokolü (TCP), RFC 793’te açıklanmıştır ve avantajı, internet üzerinden bir makineden diğerine güvenilir veri iletimi sağlamasıdır. Bu, TCP’nin güvenilir veri iletimini garanti ettiği ve düşen veya hasar görmüş paketleri otomatik olarak algıladığı anlamına gelir. Tasarımında önemli olan nedir?
Tipik olarak, bir TCP paket başlığı şöyle görünür:

Nmap veya Metasploit, bir veri arabelleğini TCP yığınına iletir. Yığın daha sonra bu veriyi bölümlere ayırır ve veri kümeleri halinde paketler. Bu veri kümeleri, ağ üzerinden iletilen paketleri oluşturmak için kullanılır. Bağlantının diğer ucunda, ters işlem gerçekleşir. Veri kümesi ve bölümleri paketlerden çıkarılır, ardından bölümler TCP yığınına iletilir, burada analiz edilir, yeniden birleştirilir ve hedef işlem birimine gönderilir.
Sequence numbers
Veriler, alıcıya ayrı ayrı paketler halinde ağ üzerinden gönderilen segmentlere ayrılır. Paketlerin hedeflerine sırasız bir şekilde ulaşması mümkündür. Bu alan, segmentin sıra numarasını belirten 32 bitlik bir sayıdır. Her paketle birlikte artar ve verilerin doğru sırada yeniden birleştirilmesini sağlar. Genel olarak, bu değer bir paketin aktif bir oturuma ait olup olmadığını belirler.
Window
TCP ayrıca sunucuların ne kadar veri almak istediklerini iletmeleri için bir mekanizma sağlar. Bu, TCP başlığındaki 16 bitlik bir sayı olan Pencere alanıdır. Ayarlandığında, sunucuya kesinlikle sınırlı miktarda veri alınacağını ve kalan paketlerin atılacağını bildirir. Alma kuyruğu doluysa, sunucu diğer uca daha fazla veri almayacağını bildirmek için alma penceresini 0’a ayarlayabilir.
Kontrol bitleri (SYN, ACK, PSH, URG, RST ve FIN) birçok kez ele alındı, bu nedenle içeriklerini burada tekrar etmeyeceğim.
TCP RESET saldırısı
Temel fikir, bir paket oluşturarak kurulmuş bir TCP bağlantısını sonlandırmaktır. A ana bilgisayarından B ana bilgisayarına olan bir bağlantıyı ele alalım. Üçüncü bir ana bilgisayar olan C, A ana bilgisayarının kaynak portunu ve IP adresini, B ana bilgisayarının hedef portunu ve IP adresini ve A ile B arasındaki aktif TCP bağlantısının mevcut sıra numarasını belirten bir paket oluşturur. C ana bilgisayarı pakete RTS bitini ekler, böylece B paketi aldığında bağlantı hemen sonlandırılır. Bu, yeni bir BGP oturumu kurulana kadar BGP oturumunu kesintiye uğratır.
Protokol hatası, yönlendirici için oldukça tatsız bir durum olan “yönlendirme atlamalarına” yol açabilir.
Güvenlik açığı
Bu güvenlik açığını keşfeden Paul Watson, böyle bir saldırının daha önce düşünüldüğü kadar zor olmadığını açıklıyor. Önceki hesaplamalar, bir sıra numarasına yönelik kaba kuvvet saldırısının 1’den 4.294.967.295’e kadar tüm sayıları denemeyi gerektireceğini öne sürüyordu. Ancak bu tamamen doğru değil. Örneğin, A ana bilgisayarındaki TCP yığını 16K’lık bir pencereyle sınırlıysa, yığın bu pencere içindeki tüm paketleri almalıdır. Saldırganın, RTS ayarı tüm SN dizisi boyunca ayarlanmış paketler göndermesi gerekmez, bunun yerine TCP, pencere boyutuyla tanımlanan bir aralıktaki herhangi bir sıra numarasını kabul edeceğinden, kendisini her olası pencereyle sınırlandırır. Bu nedenle, saldırganın tüm kullanılabilir pencereleri vurmak için 4.294.967.295 / 16.384 = 262.143 denemesi gerekir.
262.000 büyük bir sayı gibi görünse de aslında öyle değil. Birincisi, iyi bir bağlantıyla, bir saldırgan saniyede on binlerce paket üretebilir. İkincisi, saldırı birden fazla sunucuya dağıtılabilir. Örneğin, standart bir DSL hattı saniyede 250 paket üretebilir ve tüm olası paketleri 17 dakikada tüketebilir. 2 Mbps’lik bir bağlantıyla bu, sadece 60 saniyede 4.730 paket anlamına gelir.
Örneğimde 16K’lık bir pencere kullanılıyor, ancak RFC’ye göre bu alan 16 bit olup maksimum pencere boyutu 64K’dır. Tam pencere boyutu kullanılırsa, saldırgan yalnızca 65.537 paket veya sırasıyla 4 ve 15 saniye alacaktır. Bunun maksimum süre olduğunu unutmayın; ortalama olarak bunun yarısı kadar olacaktır (pratikte 3 dakika 8 saniye). Güvenlik açığında açıklanan dört pakete gelince, bu yalnızca pencere ölçeklendirmesi, bir TCP uzantısı (bkz. RFC 1323) kullanıldığında meydana gelir; burada pencere boyutu 16 bitten 30 bite çıkarılır (örneğin, yukarıda açıklanan BGP’de uygulanır). Maksimum pencere boyutuyla, saldırganın TCP sıfırlamasını tetiklemek için yalnızca dört paket göndermesi yeterli olacaktır.
Source Port
Yukarıdaki örneklerin tümü, saldırganın hedef port ve IP adresinin yanı sıra kaynak port ve kaynak adresini de bilmesine dayanmaktadır. İlk iki parametreyi elde etmek ve belirlemek kolaydır. Hedef IP adresini belirlemek de kolaydır; bu, oluşturulan paketin hedeflendiği istemci adresidir. Tek soru kaynak porttur. Örneğin, işletim sistemi 1025 ile 49152 arasında değişen bir havuzdan rastgele bir port atarsa (OpenBSD’nin yaptığı gibi), bu, her port numarasıyla bir sıra numarasını eşleştirmeyi gerektireceğinden, deneme sayısını tam olarak 48127 kat artıracaktır. İyi haber şu ki, Linux ve Windows dahil olmak üzere çoğu işletim sistemi bu mekanizmayı kullanmıyor, bu da bu savunmayı geçersiz kılıyor.
reset-tcp.c güvenlik açığı
Paul Watson, alışılmadık derecede cömert davranarak yazdığı reset-tcp.c güvenlik açığını çevrimiçi olarak yayınladı. Bu açığı basit bir Debian Linux sisteminde bile oluşturmak oldukça kolay.

Derlemeye başlamadan önce, sistemde gerekli libnet-1.1.1 kütüphanesinin bulunup bulunmadığını kontrol etmenizi ve eksikse yüklemenizi öneririm:
apt-get install libnet1-dev
Kütüphaneyi sisteme başarıyla kurduktan sonra, istismar dosyasını oluşturmaya geçiyoruz:
gcc reset-tcp.c -o reset-tcp /usr/lib/libnet.a
veya
gcc -o reset-tcp reset-tcp.c -lnet
Ayrıca, kullanım sırasında internet sağlayıcınızla ilgili gereksiz sorunlardan kaçınmak için MAC adresini (enet_src/enet_dst) kod içinde önceden değiştirebilirsiniz.
Örnek başlatma:
reset-tcp [interface] [src ip] [src port] [dst ip] [dst port] [window size]
[root@orc EuroTransTelecom]# ./reset-tcp eth1 172.16.0.1 1 172.16.0.2 2 65536
Packets sent: 8192 Sequence guess: 536805376
Packets sent: 16384 Sequence guess: 1073676288
Packets sent: 24576 Sequence guess: 1610547200
Packets sent: 32768 Sequence guess: 2147418112
Packets sent: 40960 Sequence guess: 2684289024
Packets sent: 49152 Sequence guess: 3221159936
Packets sent: 57344 Sequence guess: 3758030848
packets sent: 65535
SYN saldırısı
Sıfırlama saldırısı, RST biti olmadan da gerçekleştirilebilir. Bunun yerine, SYN biti ayarlanarak yukarıda açıklanan saldırının aynısı yapılabilir. Çoğu TCP yığın uygulamasında, tekrarlanan bir SYN, sıra numarası içeren bir RST ile sonuçlanır. SYN mevcut oturum penceresi içindeyse, RST yanıtı yerine oturum sonlandırılır ve sistem büyük olasılıkla yeniden başlatılır.
Kör veri enjeksiyonu
Son olarak, üçüncü ama kesinlikle son olmayan senaryo. Önceki durumlarda olduğu gibi, sıra numarasını bulmak için kaba kuvvet yöntemi kullanılıyor, ancak boş SYN veya RST paketleri göndermek yerine geçerli bir veri paketi oluşturuluyor. Bu durumda bağlantı kesilmeyecek, ancak kullanıcının bilgisayarının göreceği şey tamamen bir gizem olacak. İletilen veriler felaket derecede bozulmuş olacak.
Leave a Reply