Dyn dns ddos attack

Dyn, DDoS ve Mirai

4
ErenTurkay

Biraz geç kalmış bir yazı olacak ancak temel internet teknolojilerini ilgilendirdiği için üzerinde düşünülmesi yararlı olacak bu konu üzerinde birkaç kelam etmek istedim. Bu olayın meydana geldiği sırada nöbetçi (oncall) olduğum için birinci elden neler yaşandığını tecrübe etme fırsatı buldum. Teknik terimleri çeviremediğim veyahut çevirdiğim zaman anlaşılamayacağını düşünerek terimleri olduğu gibi bıraktığım yerler mevcut. Bunlar için şimdiden kusura bakmayınız.

Hatırlarsanız 21 Ekim 2016 tarihinde aralarında Github, Twitter, Reddit, Spotify'ın bulunduğu birçok servis erişilemez hale geldi. Bunun temel sebebi Dynect'e yapılan DDoS saldırısı idi. Aslında saldırıları desem daha doğru olur zira ilk olarak sadece Amerika'nın doğusu etkilendi ve sonrasında ikinci saldırı ile birlikte dünya çapında Dynect erişilemez oldu. Bu saldırının Mirai adlı botnet tarafından gerçekleştirildiğini biliyoruz. Bu botnetin ya da saldırının arkasında kimlerin olduğu veya motivasyonlarının ne olduğu bilinmemekle birlikte bu saldırı aslında IoT cihazların ne kadar güvensiz olduğunu bizlere bir kez daha hatırlattı ve bu konuda bir düzenleme yapılması konusunda bilinci arttırdığını söyleyebiliriz.

Bu olayı daha iyi anlayabilmek için saldırıya uğrayan bu teknolojilere biraz değinelim.

DNS ve Anycast

Türkiye'deki internet sansüründen dolayı neredeyse herkes yüzeysel olarak DNS'in ne olduğunu biliyor. Hiçbir fikri olmayanlar için DNS'i kısaca "www.fazlamesai.net nerededir?" sorusuna cevap veren sunucu olarak özetleyebiliriz. Lakin bu olayı anlamamız için DNS konusunda biraz daha fikre sahip olmamız gerekmekte.

DNS tasarımı gereği dağıtık bir sistem ve bu dağıtık sistemin parçalarının yönetimi için diğer DNS sunucuları yetkilendirilmiş (delegation) durumda. Her DNS sunucusu kendisinin yönettiği bölge (zone) için otoriter (authoritative) ve otoriter olmadığı bölgeler için de hangi sunucu yetkilendirilmiş ise istemciyi oraya yönlendirmekte. Bu yetkilendirme NS kayıtları ile yapılmakta. NS kayıtlarının dışında A, MX, PTR, SRV gibi daha birçok kayıt tipi mevcut. Temeldeki çalışma prensibini "bu adresi ben bilmiyorum ama bunu bilecek sunucu şurada, ona bir sor" şeklinde özetleyebiliriz. www.wikipedia.org. 'u ele alırsak (sondaki noktaya dikkat), bölgeleri aşağıdaki şekilde özetleyebiliriz.

  • . -- root zone, TLD için authoritative
  • org. -- org zone, gTLD
  • wikipedia.org. -- wikipedia zone

Bu bölgelerin her birini bölge dosyası (zone file) şeklinde ifade ediliyor. Root zone dosyasına isterseniz buradan ulaşabilirsiniz. Şimdi gelin www.wikipedia.org adresinin nasıl çözümlendiğine bakalım ve aşağıdaki grafiği yorumlayalım. Burada www.wikipedia.org için A kaydına ulaşmaya çalışıyoruz.

file (kaynak: wikipedia)

Bu adrese ulaşmaya çalıştığınız zaman DNS çözümleyiciniz (resolver) aslında 1 adet sorgu değil 3 adet sorgu göndermekte [1]. İlk olarak kök DNS sunucusuna bu istek gönderiliyor.

-> % dig @a.root-servers.net www.wikipedia.org A

;; AUTHORITY SECTION:
org.                    172800  IN      NS      a0.org.afilias-nst.info.
org.                    172800  IN      NS      a2.org.afilias-nst.info.
org.                    172800  IN      NS      b0.org.afilias-nst.org.
org.                    172800  IN      NS      b2.org.afilias-nst.org.
org.                    172800  IN      NS      c0.org.afilias-nst.info.
org.                    172800  IN      NS      d0.org.afilias-nst.org.

;; ADDITIONAL SECTION:
a0.org.afilias-nst.info. 172800 IN      A       199.19.56.1
...
...

Buradan istediğimiz cevap olan A kaydını alamadık ancak bize sonraki aşamada nereye soracağımızı söyledi. Org DNS sunucusundan bir tanesine tekrar bu soruyu soralım.

-> % dig @a0.org.afilias-nst.info www.wikipedia.org A

;; AUTHORITY SECTION:
wikipedia.org.          86400   IN      NS      ns2.wikimedia.org.
wikipedia.org.          86400   IN      NS      ns1.wikimedia.org.
wikipedia.org.          86400   IN      NS      ns0.wikimedia.org.

;; ADDITIONAL SECTION:
ns0.wikimedia.org.      86400   IN      A       208.80.154.238
ns1.wikimedia.org.      86400   IN      A       208.80.153.231
ns2.wikimedia.org.      86400   IN      A       91.198.174.239

Yine istediğimizi alamadık. Önceki sefer olduğu gibi nereye soracağımızı gösterdi.

-> % dig @ns0.wikimedia.org www.wikipedia.org A

;; ANSWER SECTION:
www.wikipedia.org.      600     IN      A       91.198.174.192

Bu sefer aradığımız kaydı bulduk. Gördüğünüz gibi aslında hiçbir şey bilmeden, sadece kök sunucudan başlayarak istediğimiz kaydı bulabildik. DNS çözümleyici de tam olarak bunları gerçekleştirerek bize istediğimiz kaydı döndürmekte. Tüm bu takip ettiğimiz zincire yetkilendirme kümesi (delegation set) denmekte. İstenirse wikipedia.org altında başka bölgeler olabilir ve bu bölgelerin yönetimi başka DNS sunucusuna verilebilir.

Bu noktada kullandığımız çözümleyici kök sunucuyu nasıl bulacak diye merak etmekte haklısınız. Bu işlemin başlayabilmesi için kök sunucu adreslerinin öncesinde bilinmesi gerekmekte. Bu genel olarak kullandığınız çözümleyici sunucusunun kodu içerisinde sabit olarak tanımlanıyor ve bütün kök DNS sunucu adreslerinin bulunduğu dosya ile birlikte yayınlanıyor.

Buraya kadar sabredip okuduysanız artık temel konseptlere alışkınız. Bir sonraki aşama olarak Anycast ile isim sunucularının etkileşimini ele alacağız. İsim sunucusu yönetmek için Anycast'e ihtiyacınız yok ancak orta ve büyük ölçekte isim sunucusu altyapısına sahipseniz kullanacağınız temel teknik bu. Amazon Route 53, Dynect, UltraDNS, NS1 gibi servislerin altyapıları anycast üzerine kurulu.

Anycast

file (kaynak: http://pingbin.com/2011/03/what-is-any-cast-dns/)

Anycast'i aynı adrese sahip birden fazla cihazın ağ içerisinde bulunması ve cihazlara erişmek istediğimiz zaman routerların gönderdiğimiz paketleri bize en yakın cihaza ulaştırması olarak özetleyebiliriz. Yani Türkiye'den ulaştığınız Google DNS sunucusu (8.8.8.8) ile İrlanda'dan ulaştığınız sunucu aynı yerde değil. Bunu traceroute ile görebiliriz:

-> % mtr --report-wide -b 8.8.8.8
Start: Fri Jan 13 16:14:39 2017
HOST: zion                                                   Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- ec2-79-125-xxx-xxx.eu-west-1.compute.amazonaws.com   0.0%    10   14.8  15.5  12.4  20.2   2.3
  2.|-- 100.64.0.14                                          0.0%    10   15.4  16.4  11.8  22.3   2.9
  3.|-- 100.64.0.5                                           0.0%    10   10.0 141.9   7.1 993.9 313.7
  4.|-- 100.64.17.5                                          0.0%    10    0.6   1.1   0.5   6.0   1.6
  5.|-- ???                                                 100.0    10    0.0   0.0   0.0   0.0   0.0
  6.|-- ???                                                 100.0    10    0.0   0.0   0.0   0.0   0.0
  7.|-- 52.93.7.132                                          0.0%    10    3.3   4.4   2.7  15.1   3.7
  8.|-- 52.93.7.37                                           0.0%    10    1.2   1.2   1.1   1.3   0.0
  9.|-- 72.14.204.244                                        0.0%    10    1.2   1.4   1.0   3.8   0.7
 10.|-- 209.85.250.213                                       0.0%    10    1.4   1.5   1.3   2.4   0.0
 11.|-- google-public-dns-a.google.com (8.8.8.8)             0.0%    10    1.0   1.1   0.9   1.5   0.0

Burada gördüğümüz gibi İrlanda'da bulunan EC2 makinesinden 8.8.8.8 adresine ulaşmak istediğimizde gönderdiğimiz paket EC2 ağından çıkıp Google ağına giriyor ve 1ms'den kısa bir sürede Google DNS sunucusuna ulaşıyor (8. ve 9. kısım). Bu da Amazon ve Google arasında bir peering anlaşmasının olduğunu göstermekte.

Türkiye'den baktığımız zaman ise aynı adrese gönderilen paket şöyle bir yol izlemekte:

  1. server-31.210.xxx.xxx         0.0%    10    1.3   1.4   1.2   1.8   0.2
  2. 10.20.30.213                  0.0%    10    1.1   1.7   0.4   8.3   2.6
  3. 10.20.20.49                   0.0%    10    2.7   0.8   0.3   2.7   0.7
  4. 195.175.208.141.static.turkt  0.0%    10    0.8   1.5   0.8   4.3   1.2
  5. 212.156.251.124.static.turkt  0.0%    10    1.0   0.9   0.8   1.1   0.1
  6. 195.175.174.55.00-ebgp-gayre 70.0%    10    1.3  42.9   1.3 126.2  72.1
  7. ???                          100.0    10    0.0   0.0   0.0   0.0   0.0
  8. 74.125.51.92                  0.0%    10   93.4  98.7  93.4 103.5   3.8
  9. 216.239.47.163                0.0%    10   51.1  51.0  50.9  51.1   0.1
 10. 216.58.215.173                0.0%    10   55.6  56.1  55.5  60.2   1.4
 11. google-public-dns-a.google.c  0.0%    10   47.9  47.9  47.7  48.0   0.1

Paketin Türk Telekomdan çıktığını ve Google ağına girdiğini görüyoruz. Maalesef 7. aşamadaki sunucunun ne olduğunu göremiyoruz ancak Türk Telekomun yurtdışı çıkışı için kullandığı servis sağlayıcılardan bir tanesi olması muhtemel.

Bu adreslere ulaşırken hangi yolun takip edileceği BGP ile belirleniyor. Anycast altyapısına sahip şirketler, BGP duyuruları ile hangi ağdaki kullanıcıların nereye ulaşacaklarını belirliyor. Örneğin Türk Telekom ağından çıkan bir paket için en yakın varış noktası Almanya olarak ayarlanmış olabilir. İlerde Türkiye'de sunucu barındırmaya başlandığında BGP duyurularını değiştirip paketlerin direkt Türkiye'deki sunucuya göndermelerini sağlayabilirler. Bu esnekliğin operatör açısından avantajı ise herhangi bir hata anında, o noktadaki sunuculara istek gönderen kullanıcıları kesinti olmaksızın başka POP noktasına yönlendirerek hizmetin devamlılığını sağlamak.

Anycast'in sağladığı bir diğer avantaj ise herhangi bir saldırı anında, saldırının kaynağına en yakın sunucuların etkilenmesi ve saldırının diğer noktalara ulaşmaması. Saldırgan kullandığı ağı kontrol edemediği için, ağ yapılandıması neyi gösteriyor ise o sunuculara ulaşacak ve diğer noktalar etkilenmeyecektir.

Global Anycast DNS altyapısını tamamiyle servis dışı bırakmak dünyanın birçok kıtasında yeterince büyük bir botnet'e sahip olmanız ve nereye saldıracağınızı biliyor olmanız gerekmekte.

Dynect Saldırısı

Temel konseptlere değindiğimize göre Dynect saldırısında ne yaşandığndan bahsedebiliriz. Şu adresten görebileceğiniz gibi Dynect dünyanın birçok noktasındaki sunucularla global Ancyast altyapısına sahip.

21 Ekim 2016 saat 12:00 UTC civarında saldırı başladı ve bu saldırı sadece Amerikanın Doğu kısmında etkili oldu. Yukarıda bahsedildiği gibi Anycast altyapısından dolayı sadece bu bölgedeki istemciler Dynect sunucularına erişemedi ve diğer bölgelerden gelen isteklerde herhangi bir sorun oluşmadı.

file (lk saldırı sırasında Dynect sunucularının görünümü. Kaynak: http://thehackernews.com/2016/10/dyn-dns-ddos.html)

Birkaç saat içerisinde ilk saldırının önüne geçilse de akşam saatlerinde ikinci bir saldırı ile Dynect özellikle Avrupa ve Amerika olmak üzere dünyanın birçok yerinde erişilemez hale geldi. Bana kalırsa bu saldırı öncelikle Amerikanın doğusunda denendi, saldırı ile nasıl başa çıkıldığı görüldü ve sonrasında bütün Dynect sunucularına saldırı başlatıldı. Komplo teorisi olarak değerlendirilebilir ancak amacımın bu olmadığını belirterek bu noktada Bruce Schneier 'in Birileri İnterneti Nasıl Kapatacağının Yollarını Öğreniyor başlıklı blog girdisini araya sıkıştırayım.

file

(İkinci saldırı sırasında Dynect sunucularının görünümü. Kaynak: http://www.zdnet.com/article/dyn-ddos-part-2-the-hackers-strike-back/)

Dynect'in yaptığı resmi açıklama saldırının olduğu sırada milyonlarca IP adresinden istek geldiği belirtilmekte ancak bu milyonlarca botnet olduğu anlamına gelmiyor. Botnet milyonlarca IP adresinin sadece ufak bir kısmını oluşturuyor. Geri kalan istekler normal kullanıcıların gönderdiği istekler. Bu durum isim çözümleme sırasında sunucuların davranışından kaynaklanmakta. Eğer çözümleme sırasında isim sunucusu ulaşılamıyor ve cevap olarak SERVFAIL dönüyorsa, isim sunucusu hiçbir şekilde beklemeden bu isteği tekrar tekrar gönderiyor. Dynect kullanan birçok servis olduğu için, DNS sunucuları cevap alamadığından bu saldırıya katkıda bulunuyor. Buradan şu sonucu çıkarabiliriz: eğer bir DNS servisini TTL boyunca ulaşılamaz hale getirirseniz, diğer bütün DNS sunucuları DDoS saldırısına katkı verir biçimde davranmakta. Bu TTL süreleri serivisi kullananların ihtiyaçlarına göre değişmek ile birlikte genel olarak 15 dakika ile 1 saat arasında tutuluyor. Eğer kayıtlarınız çok sık değişmiyor ise 24 saate kadar çıkabiliyor.

Mirai

IoT cihazları ele geçirip bunları çeşitli amaçlarla kullanan Mirai botneti saldırının ana sorumlusu. İnternete bağlı bu küçük cihazların büyük bir çoğunluğunun yönetim arayüzleri (ssh, telnet vs) dışarıya açık ve yönetici parolaları değiştirilmiyor. Mirai, bütün interneti tarayıp bulduğu cihazlara belirli kullanıcı adı ve parola kombinasyonu ile girmeyi deniyor ve başarılı olursa cihazı ele geçiriyor. Dahası, bir sonraki kişinin ele geçirmemesi için yönetim arayüzlerini dışarıya kapatıyor. Temel olarak çalışma biçimini bu şekilde özetleyecek olsam da botnet bundan daha fazla özelliğe sahip.

Mirai hakkında daha detaylı bilgiye bu adresten ve bu botnetten etkilenen KrebsOnSecurity bloğundan ulaşabilirsiniz.

Neden Birçok Servise Erişilemedi?

Bunun sebebi basit. Eğer isim sağlayıcısı olarak sadece Dynect kullanıyor iseniz, Dynect'in çalışmadığı zaman servisleriniz çözümlenemediği için bunlar çalışmayacak. Bir nevi Dynect yenildiği için siz de yenilmiş sayılıyorsunuz.

Önceki bölümde TTL teriminden bahsetmiştim. TTL, Time To Live anlamına geliyor ve her DNS cevabı içerisinde bu değer gönderiliyor. TTL, cevabı alan DNS sunucusuna bu cevabın saniye cinsinden ne kadar süre önbellekte (cache) tutulabileceğini belirtmekte. Dolayısıyla, herhangi bir kayıt bir kere sorulduktan ve önbelleğe alındıktan sonra, TTL süresince bu kayıt için tekrar sorgulama yapılmıyor ve önbellekten veriliyor. TTL bittiği zaman otoriter sunucuya tekrar bu sorgu gönderilerek işlem tekrarlanıyor. Eğer bu aşamada otorite sunucusu cevap vermez ise servisiniz doğal olarak erişilemez hale geliyor.

Ne Yapmalı?

Tek bir DNS servisi kullanmak yerine 2 veya daha fazla DNS servisi kullanmak problemi büyük oranda çözecektir (multi-homed). Her iki servis sağlayıcının aynı anda çalışmaması olasılık dahilinde olsa da bu olasılık düşük. Örnek verecek olursam Amazon Dynect ve UltraDNS kullanıyor. Amazon bu saldırıdan çok az etkilendi. Saldırının olduğu sırada us-east-1 sadece Dynect kullanıyordu. Dolayısıyla bu bölge saldırıdan kısa bir süre etkilendi ancak sonrasında UltraDNS eklenerek problem giderildi.

-> % dig ns us-east-1.amazonaws.com
us-east-1.amazonaws.com. 332    IN  NS  ns2.p31.dynect.net.
us-east-1.amazonaws.com. 332    IN  NS  ns4.p31.dynect.net.
us-east-1.amazonaws.com. 332    IN  NS  u1.amazonaws.com.
us-east-1.amazonaws.com. 332    IN  NS  u3.amazonaws.com.
us-east-1.amazonaws.com. 332    IN  NS  u4.amazonaws.com.
us-east-1.amazonaws.com. 332    IN  NS  pdns1.ultradns.net.
us-east-1.amazonaws.com. 332    IN  NS  u2.amazonaws.com.
us-east-1.amazonaws.com. 332    IN  NS  pdns5.ultradns.info.
us-east-1.amazonaws.com. 332    IN  NS  u6.amazonaws.com.
us-east-1.amazonaws.com. 332    IN  NS  pdns3.ultradns.org.
us-east-1.amazonaws.com. 332    IN  NS  u5.amazonaws.com.
us-east-1.amazonaws.com. 332    IN  NS  ns1.p31.dynect.net.
us-east-1.amazonaws.com. 332    IN  NS  ns3.p31.dynect.net.

Sonuç

Bu saldırı temel internet teknolojilerinden biri olan DNS'in ne kadar önemli olduğunu ve güvensiz IoT cihazlarının bir araya geldiklerinde neler yapabileceğiniz gösterdi. Bu problemin temel çözümü IoT cihazların daha güvenli hale getirilmesinden geçiyor ve bu konudaki regülasyon eksikliği tartışılmaz bir gerçek. Umarım ilerleyen zamanlarda IoT cihazların güvenliği konusunda regülasyon değişikliğine gidilir ve şirketler bu cihazların güvenliğini sağlamaya zorlanır. O vakte kadar DNS altyapısını tek bir servise emanet etmek yerine birden fazla servis kullanmak akıllıca bir çözüm olacak.


[1]: İşin içerisine caching vs. giriyor tabi ki ancak şimdilik bunu es geçerek π = 3 diyelim. Normalde root sunucularından başlayarak delegation set takip edilerek kayıt bulma işi 1 kez yapılıyor ve TTL süresince cacheleniyor. Bir sonraki sefer aynı kayıt sorulduğu zaman cache içerisinde varsa direkt cevap veriliyor, yoksa bu süreç tekrarlanıyor.

Görüşler

0
FZ

Eline saglik, epey keyifli ve doyurucu bir yazi olmus.

0
efe

Sade ve bilgilendirici bir yazı oldu benim için. Teşekkürler.

Paketin Türk Telekomdan çıktığını ve Google ağına girdiğini görüyoruz. Maalesef 7. aşamadaki sunucunun ne olduğunu göremiyoruz ancak Türk Telekomun yurtdışı çıkışı için kullandığı servis sağlayıcılardan bir tanesi olması muhtemel.

Yedinci aşamadaki sunucuyu göremememiz nasıl mümkün olabiliyor?

1
ErenTurkay

Genellikle ICMP paketi gönderildiğinde TTL 0'a ulaştığı zaman bu paketi geri göndermeyip işliyorsa, arada başka bir router'ın olduğunu MTR uygulaması görebiliyor ancak paket geri gelmediği için ne olduğunu gösteremiyor. Konu ile ilgili stackoverflowida şöyle bir soru sorulmuş ve yukarıdakı durumu açıklayan cevap da yazılmış.

1
tongucyumruk

Su cevap aklima genclik gunlerimde iptables'in mangle modulu ile yaptigim fantastik isleri getirdi.

Bunun yaninda tabi ki aradaki cihazin konfigurasyonuna bagli fakat ICMP'ye cevap vermez iken UDP veya TCP tabanli bir traceroute yapmak kendisini görunur kilabilir.

3
tongucyumruk

Eğer çözümleme sırasında isim sunucusu ulaşılamıyor ve cevap olarak SERVFAIL dönüyorsa, isim sunucusu hiçbir şekilde beklemeden bu isteği tekrar tekrar gönderiyor.

Bu cok ilginc. Normalde SERVFAIL durumunda sorguyu yapan DNS cozumleyicisinin tekrar sorgu yapmadan önce SOA kaydndaki negative TTL kadar beklemesi gerekir diye biliyordum ben. Aksi halde bahsedildigi gibi TTL'in dolmasiyla birlikte cok ciddi bir DNS Amplification durumu yasanacaktir.

3
ErenTurkay

Bu cok ilginc. Normalde SERVFAIL durumunda sorguyu yapan DNS cozumleyicisinin tekrar sorgu yapmadan önce SOA kaydndaki negative TTL kadar beklemesi gerekir diye biliyordum ben. Aksi halde bahsedildigi gibi TTL'in dolmasiyla birlikte cok ciddi bir DNS Amplification durumu yasanacaktir.

Negative TTL sadece NXDOMAIN cevabi durumda ise yariyor. Bu durumda ise refresh timeout gectigi icin SOA kaydina ulasmak istediginde bunu basaramiyor ve SERVFAIL aliyor. Bu noktada hangi resolverin nasil implement ettigini bilmiyorum ancak su cevapta biraz aciklamis. Yeni Bind versiyonunda hardcoded olarak 1 saniye olarak ayarlanmakta. Binlerce insanin Dynect servisine sorgu yaptigini varsayarsak halihazirda saniyede Twitter/Github/Spotify kullanan insan sayisi kadar istek gonderilecek ki az buz bir rakam degil :)

Bu noktada yapilmasi gereken esasinda exponential backoff tarzi bir teknigi uygulamak. Bildigim kadariyla DNS sunucularinda bu implement edilmis degil.

0
tongucyumruk

Aha, dogru. Yalniz Bind ve benzeri DNS sunucularinin bu konuda exponential backoff implement etmemis olmalari sasirtici. Umalim ki bu olaydan bir ders cikartip yakin zamanda implement ederler. Aksi halde tonguc@earth:~$ vim tovbeyaleppim.go

1
Chaosopher

Mirai yazarının kim olabileceği konusunda krebsonsecurity.com'da dev bir yazı yayınlanmış.

Görüş belirtmek için giriş yapın...

İlgili Yazılar

Google Yardımıyla Kendi TLD'nizi Yönetin: Nomulus

tongucyumruk

Eğer alan adı dünyasını bir süredir takip ediyorsanız biliyorsunuzdur, uzun bir süredir ICANN'in "para varsa varım" politikası sayesinde gerekli ücreti ödeyip altyapınızı da kurduktan sonra .ninja, .xyz veya .google gibi kendi TLD'nizi (TLD = Top Level Domain, Üst Seviye Alan Adı) kurabiliyorsunuz.

Google sayesinde, artık kendi TLD'nizi çok daha kolay bir şekilde kurup...