Domain Name System (DNS), bir uygulama katmanı protokolüdür. Temel amacı domain isimlerini ip’ye dönüştürmektir. Bu sebeple DNS protokolü internetin ta kendisidir diyebiliriz. Malesef bu güzide protokolun asıl amacından saptırılarak farklı işlevler içinde kullanılmakta mümkün. Bunun başlıca sebebi, DNS güvenliğine verilmeyen önemdir.
Bu yazımızda DNS ‘in neden önemli bir protokol olduğunu ve ona neden önem vermeniz gerektiğini en basit şekilde anlatmamıza olanak sağlayan DNS tünellemeden, DNS tünellemenin önüne geçmek için ne gibi önlemler almamız gerektiğinden bahsedeceğiz.
DNS Tünelleme’nin temel mantığı istemcinizin paketleri sunucuya DNS kayıtları üzerinden göndermesidir. Öyle bir uygulama olur ki bu tünelden sadece http ya da sadece ssh paketlerini gönderebilirsiniz. Bu tamamiyle istemciden giden DNS paketinin karşıdaki sunucu da nasıl yorumladığına bağlıdır. Tünelleme aslında DNS’e özel bir şey değildir. Ancak genelde DNS protokolü özgür bir protokoldür. Kimse gelip analiz edip sorgulamadığı için DNS tünellemeyle günlük hayattaki bir çok şeyi bypass edebilirsiniz.
DNS tünelleme için spesifik bir çok araç bulabilirsiniz. DNS tünelleme araçları genelde sunucuda sanal bir tünel portu açarlar. Taleplerinizi bu interface veya port üzerinden yaparsınız. Yaptığınız istekler artık DNS’deki bir kayda encode edilerek gönderilir. Bu tünelleme aracının sunucu tarafındaki ucu, size gelen bu paketi açar ve DNS kayıdını decode ederek, yapması gerekeni yapar.
# DNS tünelleme neden ihtiyaç duyulur?
Biri neden DNS tünelleme ihtiyaç duyarki. Aslında bakarsanız karşılık olarak VPN’i neden kullanıyorsunuz diye sorabilirim. Aslında en masumane bakış açısıyla bakarsak, erişemediğiniz bir yere erişmek için tünelleme yapıyor olabilirsiniz. Hiç bir kötü amacınız olmayabilir. Olayı biraz daha sıcak hale getirelim. Bir otele veya kafeye gittiniz, burada DNS için ek bir yapılandırma yok. İnternet için şifre gerekli. Dışarıya da DNS sorguları açık. Bedava internetin keyfini çıkarabilirsiniz. Olayı daha da dramize edelim. Kötü birisiniz. Zararlı yazılım yazan biri olduğunuzu düşünün. Takibi zorlaştırmak istiyorsunuz. DNS gibi ip çeviren yapınız var, sürekli farklı domainler üreten bir de yapınız var. Bunları bir araya getirdiniz. Trojanları saldınız. Kurbanlarınız sizden iş bekliyor. Sizden komutlar gidiyor ve onlar da görevlerini yerine getirmek istiyor. Tabi ki bu belirtiklerim basit senaryolar. Bu senaryoları çoğaltabiliriz.
# Proof of Concept Çalışma
Olayı az da olsa görselle süsleme isteğimden, iodine gibi çok bilinen bir dns tunnelling aracı üzerinden örneklemeye karar verdim. Iodine DNS üzerinden ip paketi göndermeye yarar.
DNS tünelinin iki ucuna (ikisi de Linux, ancak Windows içinde mevcut) da iodine’i yükleriz.
apt-get install iodine
DNS sunucumda ek olarak A ve NS kayıtlarını girdim. Aşağıda kayıtların anlamı şu: tunel.gokhankesici.com için dns sorgusu yapıldığında tunelns.gokhankesici.com ‘u name server olarak kullan. Git tunelns.gokhankesici.com için tanımlanmış 192.155.91.32 IP ‘sine sor.
tunelns.gokhankesici.com (A) 192.155.91.32 tunnel (NS) tunelns.gokhankesici.com
Not : Bu kayıtlar hemen aktif olmayabilir. Biraz beklemeniz gerekebilir.
Artık sunucumuzun 53 portuna gelecek tunel.gokhankesici.com isteklerini iodine ile dinleyebiliriz. Bunun için aşağıdaki komutu girmemiz yeterli. Parola burada dns tünelleme kimlik doğrulama ile yapılabilsin diye.
iodined -f 10.0.0.1 tunnel.gokhankesici.com -P parolam321
Böylece bir tünel oluşturup, bu tünelin sunucu tarafındaki ip’si 10.10.1.1 olarak belirledik.
Artık herhangi bir yerden bu sunucuma parolayı biliyorsanız tünel yapabileceksiniz anlamına geliyor. İstemci tarafında bu sefer benzer mantıkla tünele bağlanmaya çalışırız.
iodine -f 192.155.91.32 tunnel.gokhankesici.com -P parolam321
Not: Son olarak bu komutu girdiniz ancak bağlanamadınız. Böyle bir durum yaşarsanız kesinlikle Wireshark ile hem sunucu hem de istemci tarafında paketleri yakalayıp 53 portuna input output trafiği inceleyiniz.
Örneğin 10.0.0.1 ‘i pinglediğimizde ilk olarak gidip dns sorgusu içerisinde encode edip sunucumuza soracaktır. Sunucu decode edecek ve bakacak bu ip kendisinde var cevabı kendi dönecek. Bu aşamadan sonra bu sunucuya isterseniz ssh ile bağlanın, isterseniz sock proxy olarak kullanın. Tamamiyle amacınıza yönelik kullanabilirsiniz.
# Tespit & Analiz
Tespit aşaması her ne kadar kolaymış gibi gözükse de bir çok senaryo olması sebebiyle aslında otomize araçlarla yapılmazsa işiniz biraz zor. Bu sebeple fikir vermesi açısından ya da manuel kontrollerde dikkat edilmesi gereken gözlemlerdir.
# Önlem