Alan adları için keşif araçları hem güvenlik dağıtımlarında hem de github üzerinde bolca bulunabiliyor. Bu araçların arasında hem pentest hem de istihbarat toplama aşamasında en sık kullanılanlardan biri olan “dnsdumpster” kolay kullanıma sahip olması ve birçok parça işi tek seferde yapabilmesi ile kayda değer zaman kazandırabiliyor. Bilindiği gibi dnsdumpster’ı tarayıcı üzerinden kullanmak mümkün fakat bu yazımızda python ile dnsdumpster için yazılmış “unofficial” bir kütüphane kullanarak nasıl kolayca veri elde edebileceğimizden bahsedeceğiz.

Alexa uzun süredir kullanıcılarına “key” gerektirmeyen ücretsiz bir API sunuyor. Bu API sayesinde istenilen domain için standart Alexa detayı ve global derecesi elde edilebiliyor. Özellikle kurumsal rekabet ve rakip analizi amacıyla detaylı olarak takip edilen Alexa için yazacağımız bir API entegrasyonu ile istediğimiz alan adının Alexa skorunu kolayca öğrenebileceğiz.

Serimizin bu yazısında, alan adları üzerinde elde edebileceğimiz DNS sunucu bilgisi, MX kayıtları, TXT kayıtları, subdomain analizi ve Alexa skoru gibi birkaç önemli bilgiyi python ile nasıl elde edebileceğimiz üzerinde duracağız. Özellikle “dnsdumpster” entegrasyonu ile birlikte kendiniz için özelleştirilmiş bir keşif program çatısına yeni yetenekler ekleyebilir ve bug bounty gibi amaca yönelik durumlarda efektif bir şekilde kullanabilirsiniz.

UYGULAMAYI BİRLİKTE İNCELEYELİM

Uygulamamızın ilk kısmında dnsdumpster kütüphanesinden ve gerekli parse işleminden bahsedeceğiz.

Python ile OSINT Uygulamaları #3

• 1.satır: “dnsdumpster” pip paket yöneticisi ile kolayca indirdikten sonra bu pakette bulunan “DNSDumpsterAPI” sınıfını uygulamamıza dahil ediyoruz.
• 3.satır: “DNSDumpsterAPI” sınıfına ilk olarak sorgulama işlemi yapılırken konsolda gerçek zamanlı detay görüp görmediğimizi belirtmek için “verbose” parametresi yolluyoruz. Oluşturulacak bu sınıf objesinin “search” metodu ve ona verdiğimiz parametre ile istediğimiz alan adı için kolayca sorgu gerçekleştiriyoruz. Daha sonra metodun çağrımı ile birlikte dönecek cevabı “response” adlı bir değişkene atıyoruz.
• 4.satır: “dnsdumpster” için yazılan bu API içerisinde herhangi bir parser bulunmamakta. Bu yüzden kendi istediğimiz bilgiyi dönen cevap üzerinden kendimiz elde edeceğiz. Dnsdumpster; hosting detayları ve IP bloğu sahipleri, DNS sunucuları ve IP adresleri, coğrafi konum detayları, MX kayıtları, TXT kayıtları ve A kayıtları gibi birçok cevabı döndürebildiğinden, yazımızı fazla uzatmamak açısından DNS sunucu detaylarını elde etmeye çalışacağız. Bunun için dönen JSON verisini inceliyoruz ve “dns_records” altındaki veriler üzerinde “for” döngüsü ile dolaşmak istediğimizi uygulamamıza belirtiyoruz.
• 5.satır: “for” döngüsü sayesinde artık bizim için her “dns” verisi “resp_data” olarak adlandırılacak. Bu resp data içeriğinde sırasıyla: sunucu adı, sunucu IP adresi, varsa cloudflare, sağlayıcı ve sağlayıcı lokasyonu bilgilerini barındırmakta. Python dilindeki format() özelliğini kullanarak “resp_data” içerisindeki string değerleri, süslü parantez ile belirttiğimiz “key” değerler ile bahsettiğimiz sırada değiştiriyoruz ve elde ettiğimiz cevabı ekrana yazdırıyoruz. Aşağıda “google.com” için örnek cevabı görebilirsiniz:

Python ile OSINT Uygulamaları #3

Uygulamamızın diğer kısmında ise yukarıda da bahsettiğimiz Alexa skorunu python ile nasıl elde ederiz sorusuna cevap arayacağız.

Python ile OSINT Uygulamaları #3

• 7.satır: API yolu üzerine GET isteğinde bulunabilmek için python dilinin “requests” modülünü uygulamamıza dahil ediyoruz.
• 8.satır: Alexa’nın uzun süredir açık olan ücretsiz API cevap olarak XML tipinde bir yanıt döndürdüğü için python diline ait “xml” modülündeki “ElementTree” sınıfını “ET” alias’ı ile programımıza dahil ediyoruz.
• 10.satır: Örnek sorgu gerçekleştirebilmek için sorgu yapacağımız alan adını “query_url” isimli bir değişkene atıyoruz.
• 11.satır: Alexa’nın API yolu üzerinde değiştirmemiz gereken tek şey “url” değişkeninin parametresi olduğundan dolayı daha sonra format() fonksiyonu yardımı ile string yerleştirmek için süslü parantez(“{}”) koyuyoruz. Ve elde ettiğimiz istek yollayacağımız API yolunun son halini “url” isimli bir değişkene atıyoruz.
• 12.satır: “requests” kütüphanesinin get() metoduna “url” parametresini vererek bu adrese GET isteğinde bulunmak istediğimizi söylüyoruz. Daha sonra dönecek olan cevabın “text” kısmını yani içeriğini “xml_response” adlı bir değişkene atıyoruz. Elde ettiğimiz bu değişkenin string tipinde olduğunu unutmayalım.
• 13.satır: XML verisi içerisinde gömülü attribute’lara ulaşabilmek ve iç içe geçmiş tag’lere erişebilmek için daha önce dahil ettiğimiz “ET” sınıfının “fromstring() “metodu yardımı ile “xml_response” değişkenini bir XML ağacına dönüştürüyoruz. Elde ettiğimiz bu XML verisini de kökten aşağıya doğru inebilme işlemlerini gerçekleştirmek için “xml_root” adlı bir değişkene atıyoruz.
• 14.satır: XML veri yapısındaki bu değişken üzerinde “find()” isimli metot yardımı ile var olan seviyede tag araması yapabiliyoruz. Öncelikle örnek bir cevaba birlikte bakalım:

Python ile OSINT Uygulamaları #3

Görüldüğü gibi yukarıdaki XML şemasında istediğimiz veriler “SD” isimli tag içerisinde bulunmakta. Biz de “find()” metoduna bu isteğimizi parametre olarak söyleyip elde edeceğimiz alt ağacı “xml_sd” isimli değişkene atıyoruz.
• 15.satır: “SD” tag’i içerisinde dört adet daha element ve bu elementlere ait attribute’lar olduğunu görebiliyoruz. Bu elementlere teker teker erişebilmek ve ekrana yazdırabilmek için bir “for” döngüsü kuruyoruz.
• 16.satır: Cevabımızdaki XML elementleri “tag” ve “attribute” olarak iki kısımdan oluştuğundan her element için bu bilgileri yazdırmak amacıyla, xml kütüphanesi desteği sağolsun, “element” ögelerinden “tag” ve “attribute” bilgilerini çağırıyoruz. En son işlem olarak bu bilgileri “print()” fonksiyonu yardımı lle ekrana yazdırıyoruz.