DDoS saldırıları, netstat ve TCP oturum detayları

Internete açık penceremiz olan Web sunucularını tehdit eden risklerin ilk sıralarında DDoS saldırıları gelmektedir. DDoS saldırılarını analiz etmek en az engellemek kadar önemlidir. DDoS saldırı analizinde olmazsa olmaz şart ise TCP/IP bilgisidir.

Web Sunucunuzun bir DDOS saldırısına karşı olduğunu nasıl anlarsınız?

En basitinden netstat komutu çalıştırılarak bağlantı tablosunu izlenir ve aynı ip/random ip lerden gelen bağlantılar incelemeye alınır. Normalde aynı ip adresinden(arkasında onlarca istemcisi bulunan networkler haric) belirli bir sayıdan fazla istek gelmez(siz 40 deyin ben 80 diyeyim).

Fazlası varsa anormal, incelenecek bir durum var demektir.

Nasıl incelenir?

Saldırı UDP üzerinden yapılıyorsa netstat ile inceleme zor olacaktır, TCP kullanılarak gerçekleştirilmişse rahatlıkla DDoS saldırıları belirlenebilir.

İncelemeye geçmeden buna sebep olan protokolü ve detaylarına eğilelim.

Kısaca hatırlayacak olursak TCP bağlantıları bayraklarla(flags) yürütülür. Bayraklar TCP bağlantılarında durum belirleme konumuna sahiptir Yani bağlantının başlaması, veri transferi, onay mekanizması ve bağlantının sonlandırılması işlemleri tamamen bayraklar aracılığı ile gerçekleşir.

UDP’de ise böyle bir mekanizma yoktur. UDP’de güvenilirliliğin(paketlerin onay mekanizmasi) sağlanması üst katmanlarda çalışan uygulamalar yazılarak halledilebilir. DNS protokolü UDP aracılığı ile nasıl güvenilir iletişim kurulacağı konusunda detay bilgi verecektir.

UNIX/Windows sistemlerde bağlantılara ait en detaylı bilgi netstat (Network statistics) komutu ile elde edilir. Netstat kullanarak TCP, UDP hatta UNIX domain socketlere ait tüm bilgileri edinebilir.

UDP için bir bağlantı durum bilgisi olmadığından dolayı netstat aracılığı ile de fazla bilgi alamayız fakat

TCP’de bağlantıya ait oldukca fazla durum vardır.

TCP bağlantılarında netstat aracılığı ile görülebilecek durum senaryoları:

CLOSE_WAIT, CLOSED, ESTABLISHED, FIN_WAIT_1, FIN_WAIT_2, LAST_ACK, LISTEN, SYN_RECEIVED, SYN_SEND ve TIME_WAIT

Bunların neler olduğu ve hangi durumlarda oluştuğunu irdeleyelim.

SYN_SEND : Hedef sistemle TCP bağlantısı oluşturma adımının ilkidir. Kısaca SYN bayraklı paket gönderilip buna karşılık cevap bekleme zamanında portun alacağı durum.

SYN_RECEIVED: Hedef sistem portu bağlantı kurulması için gerekli ilk adım olan SYN paketini almıştır.

ESTABLISHED: 3 lü el sıkışma tamamlanmış artık taraflar veri transferi yapabilir durumdadır.

LISTEN: O portun bağlantı kabul eder olduğunu belirtir.

tcp4 0 0 *.465 *.* LISTEN

LISTEN moddaki portları ki bunlar aynı zamanda sistemde çalışan servislerdir netstat -ant|grep LISTEN komutu ile elde edebiliriz.

netstat çıktısında eğer SYN_RECEIVED sayısı çok fazlaysa DDoS saldırısından şüphelenilebilir, aynı şekilde aynı IP adresinden fazla sayıda ESTABLISHED durumda bağlantı varsa yine bir saldırı durumu söz konusu olabilir.

TCP Oturumlarında bağlantı sonlandırma

Oturum sonlandırma her iki tarafında anlaşması sonucu tamamlanır. Taraflardan birinin ilgili bayraklı paketi göndermemesi, geç göndermesi bağlantının sağlıklı olarak sonlanmasına engel olur.

Bağlantı sonlandırma aşamalarında çeşitli durumlar oluşur. Bu durumlara geçmeden bir TCP bağlantısının nasıl kapatıldığını inceleyelim.

A ——FIN ——–>B
A 80.93.212.86.3306: . ack 76 win 17446
2007-08-13 21:38:57.295927 IP 88.233.216.57.2175 > 80.93.212.86.3306: F 1:1(0) ack 76 win 17446
2007-08-13 21:38:57.295941 IP 80.93.212.86.3306 > 88.233.216.57.2175: . ack 2 win 65534

Bağlantı sonlanması esnasında oluşan durumlar:

FIN_WAIT_1:

Bağlantı sonlandırmak için işlem başlatan taraf(A) hedef sisteme FIN bayraklı TCP paketi gönderir. Ardından karşı taraftan(B) ayrı ayrı ACK ve FIN bayraklı paketleri bekler . Bu arada durumunu FIN_WAIT_1 olarak ayarlar.

FIN_WAIT_2:

Bağlantı sonlandırma isteğini(FIN bayraklı ilk paket) alan taraf(B) bu pakete karşılık olarak ACK(onay) bayraklı TCP paketi hazırlar ve gönderir ve durumunu CLOSE_WAIT’e alır. Ilk FIN bayraklı paketi gönderen taraf(A) ACK paketini aldığında durumunu FIN_WAIT_2 olarak ayarlar.

Böylece bağlantı sonlandırma işleminin ilk yarısı tamamlanmıştır. Diğer yarısıda sağlıklı tamamlandıktan sonra bağlantı tamamen sonlanmış olacaktır.

LAST_ACK:

B tarafı ACK bayraklı paket gönderdikten sonra , kendisinin de bağlantıyı sonlandırmak istediğini

bildiren FIN bayraklı paket oluşturarak A sistemine gönderir ve durumunu LAST_ACK olarak ayarlar.

TIME_WAIT

: A sistemi FIN bayraklı paketi aldıktan sonra buna cevaben ACK bayraklı bir paket oluşturarak B’ye gönderir ve durumunu TIME_WAIT olarak belirler.

A sistemi TIME_WAIT durumunda son gönderilen ACK bayraklı paketin hedef sisteme(B) ulaştığını garantilemek için bir müddet bekler. Bu müddet eğer gereğinden fazla(eski tip UNIX sistemlerde 4 dakikaya kadar çıkabiliyor.) ise sisteminizde netstat -an çalıştırdığınızda oldukca fazla TIME_WAIT satırı görebilirsiniz.

Bu da sistemi gereğinden fazla meşgul edeceği için performans problemleri yaşanması kaçınılmaz olacaktır.

Örnek bir sistem üzerinde inceleme:

www portuna yapılan bir istek ve isteğin sonlanması sırasında netstat ile alınan durum çıktıları. Sadece sunucu tarafını gösterdiği için bazı durumlar gözükmemektedir. İsteği yapan taraf da incelenecek olursa eksik kalan kısımlar tamamlanır.

tcp4 0 0 80.93.212.86.80 88.233.216.57.2348 SYN_RECEIVED
tcp4 0 0 80.93.212.86.80 88.233.216.57.2348 ESTABLISHED
tcp4 0 0 80.93.212.86.80 88.233.216.57.2348 FIN_WAIT_2
tcp4 0 0 80.93.212.86.80 88.233.216.57.2348 TIME_WAIT