DNS Analizi ve Python DNS Spoofing(Scapy)

Python ile penetration test yazı serimizin devamı olarak scapy  kütüphanesi ile  DNS spoofing atağını bu yazımızda inceleyeceğiz. Yazı serilerimizi hazırlarken dikkat ettiğimiz, sektöre yeni katılan kişilerinde okuduğu zaman anlam çıkartabileceği dilleri kullanmak  ve biraz detaya inmek bu yazımızda da tercih sebebimiz olacaktır. Bugün yaşlısından gencine herkes dns dediğimizde yarım yamalakta  olsa anlam çıkartabiliyor ya da nasıl değiştirebileceğini biliyor(Yasaklamalar bazen işe yarıyor). Eminim ki teknik uzman arkadaşlarımızın bir kısmıda basit anlamda  UDP 53(zone transfer için TCP 53) portu üzerinden IP’den isim, isimden IP çözen bir servis olarak biliyor ve windows üzerinde nslookup, linux üzerinde de dig – nslookup ile dns serverlara manuel sorgu çekilebildiğinin ötesinde bir bilgiye sahip değiller(bilmelerine ihtiyaç var mı tartışılır.).  Dig ile nslookup arasındaki fark nedir diye soracak olursak, dig ile zone transfer yapılabilir(linux), nslookup’da ise bunu yapamazsınız(linux). Bir programı yazarken algoritma aşaması önemli olduğu için bizim bugünün konusu olan dns hammaddemizi iyi tanıyıp, davranışı, mimarisini analiz edip spoofing scriptimizi buna göre oluşturacağız.

DNS Query(Sorgu) ve Response(Cevap) ;

  • Bir bilgisayar www.gokhanyuceler.com sitesi ile bağlantı kurmak istediğinde, sorguyu kendinde kayıtlı olan dns sunucusuna  gönderir (212.61.61.61),
  • Dns sunucusuna www.gokhanyuceler.com daha önce sorgulanmışsa, DNS sunucu veritabanından bakarak cevap verir,
  • Veri tabanında kayıtlı bir site değilse, DNS sunucu gokhanyuceler.com alan adına ait primary DNS sunucuyu tespit edebilmek için ROOT DNS (91.239.61.61)sunucuları ile iletişime geçer,
  • ROOT DNS  kendine gelen gokhanyuceler.com alan adı için primary DNS sunucusunun IP adresini veri tabanından bulur(91.200.60.61) ve ilgili DNS sunucusuna gönderir,
  • gokhanyuceler.com adresinin DNS sunucusu bulunduktan sonra, “212.61.61.61” ip adresli DNS sunucu www.gokhanyuceler.com adresini sorgulamak için “91.200.60.61” e sorguyu yollar ve  isteği yollayan bilgisayara database’inden “www” kayıtına bakarak cevap döner.

 

DNSSpoof

 

Basit anlamda sorgu süreci böyle ilerlemektedir. Detayı tabiki mevcut   “.com, .edu, .tr ” gibi alt domainleri sorgu için farklı  dns’lere yönlendirme yapılıyor v.s .. Bir çok IT uzmanı Wireshark gibi sniffer uygulamalarını network sniffing ve analiz için kullanır fakat konumuz Scapy olduğu için basit anlamda, sadece dns paketlerini sniff  edecek bir scripti scapy ile yazıp, yazılı ve görsel belirttiğimiz bu şemayı mantıksal olarakda analiz edelim. Bu kadar detaya girmemin sebebini, kod bloğunu yazdığımızda ” tabi ya basitmiş” dediğinizde daha iyi anlaşılacaktır.

sniff(iface=”en0″, count=1, filter=”udp port 53″, prn=packetsniff) ile scapy’nin paket sniffing komutunu ” sniff “çağırıyoruz ve interface ” en0″ ı dinleyip, içerisinde udp 53 no’lu portu(dns port numarası) gördüğünde sadece 1 paketi yakalayıp ” packetsniff ” adlı fonksiyonu çağırarak sniff edilen paketi değer olarak gönderiyoruz.

While True:  ile sürekli çalışmasını sağlıyoruz.

if packet.haslayer(DNS) and packet.getlayer(DNS).qr==0:   Burası çok önemli ve bunu açıklamak için öncelikle scriptimizi çalıştırıp ekrana çıkan sonucu gördükten sonra  summary yerine show() komutunu ekleyip, hem summary ile show arasındaki farkı görmüş olacağız hemde verdiği sonuç üzerinden ilgili satırın açıklamasına değineceğiz.

dsnpacketsummary

summary()

summary() ile verdiği çıktıda kırmızı alanda dikkatinizi çekmek istediğim yeri okurken, sniff edilen paketin  Osi Katmanından Layer 4 bir paket olduğunu ve her katmanın Başlığını  (haslayer)  özet olarak ekrana yazdığını görüyoruz.  summary () ile özet bilgiyi ekrana yazdırabildiğimizden detaylı analiz için show komutunu çalıştırıp sonucu görelim,

 

show command

show()

Gördüğünüz gibi show() komutu ile her katmanın altında olan değerleride ekrana yazdırdık.  İşte bu her katmanın altındaki değerlerede “getlayer()” komutu ile erişim sağlayabiliyoruz.   Scapy interactive bir kütüphane olduğu için her başlığın alt değerini ayrı ayrı düzenleyip işlemler yapabiliyoruz.

Gelelim şimdi fonksiyonumuz içerisindeki if packet.haslayer(DNS) and packet.getlayer(DNS).qr==0: açıklamaya;

Sniff edilen UDP 53 içerisinde başka bir pakette olabilir  diye,   haslayer (DNS) ve getlayer ile çektiğimiz mesaj header’ı içindeki qr  değeri “0” ise ( ” 0 ” değeri dns paketinin sorgu paketi olduğunu gösteren değerdir) bir alt satır olan print komutunu çalıştır diyoruz. Bu pakette açıklamamız gereken bizim ileride işimize yarayacak alanları açıklayalım;

id= Sorguyu oluşturan makina her query paketine bir id değeri (identification) atar ve DNS server response aşamasında bu id değerini sabit tutar böylece hangi sorguya cevap verdiği belli olur.

qr==1 dersek de sorguyu yaptığımız makinaya, response (cevap) paketlerini göstermesini sağlıyoruz.

Buraya kadar neler yaptık diye bir göz atacak olursak;

  • DNS nedir ve nasıl çalışır’ı açıkladık,
  • DNS’in şema olarak çalışma mantığından bahsettik,
  • DNS sorgusunu analiz edebilecek bir sniffer scripti yazdık,
  • Sniff ettiğimiz dns paketinde haslayer() ve getlayer() komutlarını inceledik ve dns message header’ına değindik

Önemli: Yukarıdaki ekran görüntüsünde qd\ [Dns Question Record ] alanındaki kayıta dikkat ediniz. qname”www.gokhanyuceler.com” adresine karşılık A record’u sorgulanıyor”

DNS query aşamasının paket yapısını  kısaca analiz ettik fakat bizim için önemli olan dönen cevap. Spoofing yapacağımız zaman biz, kurban makinanın “www.gokhanyuceler.com”adresini sorguladığında belirttiğimiz IP adresini cevap olarak döndüreceğimiz için, hazırlayacağımız paket response paketi olacak.

Sniffer uygulamamızdaki if koşulundaki getlayer(DNS).qr==1 dersek (Yukarıda nedenini belirtmiştik) artık response paketini ekrana yazdırıyor olacağız.

Snip20160322_3

DNS RESPONSE PACKET

Kırmızı ile işaretlediğimiz alan, query paketinde olmayan ve sadece response paketinde yer alan alandır. Buraya baktığınız zaman sorgumuza karşılık, ilgili DNS sucununun DNS Resource Record (DNSRR) başlığı içersinde;

resource name=sorguya karşılık dönecek kayıt adı

rdata=sorgu çekilen A kaydının  “www.gokhanyuceler.com”  adına karşılık gelen IP adresi,

Bu verileri analiz ederek hazırlayacağımız sahte DNS paketi içerisinde neler yer alması gerektiği senaryosu gözümüz önünde kısmen canlandı diye düşünüyorum.

DNS Spoofing;

DNS spoofing  yapacağımız, kurbanımızın DNS paketlerini sniff edebilmemiz  için trafiğin bizim üzerimizden(Saldırgan) akması gerekmektedir.  Bu yüzden ilk olarak kurban makinamız ile gateway’i mac spoofing ile MITM attack yapıp daha sonra da DNS spoof fonksiyonumuzu çağıracağız.

Kod Bloğumuza Baktığımızda;

scriptimizde belirttiğimiz kurbanip, kurbanmac, gatewayip, gatewaymac değişkenleri MITM attack yapacağımız bilgisayar ve router’ın adresleri. Biz bu bilgileri nasıl elde edelim diyorsanız. Ortamda mac ve ip adreslerini broadcast ile bulan scriptimizi kullanabilirsiniz 🙂

Bu ufak scriptin görevi, arp broadcast yapıp gelen paketteki ip ve mac değerlerini ekrana yazıyor. Çıktısına bakalım,

MAC ADRES SCANNER

 

Artık buradan spoof edeceğiniz mac adres ve ip adresini seçerseniz 🙂

Scriptimize devam edelim,

hedefspoof= send(ARP(op=2,psrc=gatewayip,pdst=kurbanip,hwdst=kurbanmac),count=4000)
gatewayspoof = send(ARP(op=2,psrc=kurbanip,pdst=gatewayip,hwdst=gatewaymac),count=4000)

Satırlarının detayına girmiyorum çünkü bir önceki yazımızda http://www.gokhanyuceler.com/scapy-mitm-attack/ bu konuya değinmiştik,

Artık kurban bilgisayarını spoof ettiğimize göre, while döngü bloğu çalıştığında dns paketlerini dinliyor olabileceğiz ve dnspaket fonksiyonumuzu çağıracağız.

if koşulundaki qr==0 değerine dikkat ederseniz, kurbanın sorgu paketlerini dinliyoruz ki saldırgan bu pakete karşı response paketi yollayabilsin. Cevap paketini analiz ettiğimiz zaman layer 4 bir response paketi hazırladığımıza dikkat ediniz.  Üst tarafta sniffer kısmında DNS paketini analiz ederseniz, neden böyle bir cevap paketi hazırladığımı ve rdata kısmında neden saldırganın belirttiği IP adresini yazdığımı anlamıssınızdır. Cevap paketi içindeki değişkenin değerlerini, paket öncesinde tanımladığımızı lütfen gözden kaçırmayın. Cevap paketinin değişkenleri ile aklınıza takılan bir nokta olursa                          gokhan-yuceler@hotmail.com adresinden ulaşabilirsiniz.

DNS snooping scriptimizi çalıştırdığımızda kurban makinanın “www.gokhanyuceler.com” adresine karşılık gelen cevaba, nslookup ile bakalım.

KurbanMakina

 

Görüldüğü gibi kurban makinamız www.gokhanyuceler.com’a nslookup ile sorgu yaptığında, saldırgan makinanın belirttiği IP adresine yönlendiriyor. Burdan sonra siz ister phishing yapın isterseniz evilgrade adlı yazılımı kullanarak, kurbanın makinasında kullanılan uygulmanın update sorgularını analiz ederek hangi uygulamanın çalıştığını tespit edip, evilgrade’de fake bir exploit paketini update dosyası gibi gönderip backdoor yükleyin bu tamamen  hayel gücünüze kalmış 🙂 Bu yazdığımız scriptin işini daha iyi yapan uygulamalar tabiki var (dnssniff) fakat bu uygulamları kullanırken arka planda neler döndüğünün daha farkında olabilirsiniz.  Bir sonraki scapy ve python yazımızda görşmek dileği ile. Bizi okumaya devam ediniz 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

*