Günümüzde internette gezinirken karşılaştığımız en can sıkıcı olaylardan birisi de kısaltılmış linklerdir. Bir web sayfasında gerçekleştirmek istediğimiz indirme ve yönlendirme gibi işlemler sırasında hepimiz kısaltılmış linkler ve onların baş belası bekleme ekranları ile karşılaşmışızdır. Kısaltılmış bu adreslerin arkasındaki gerçek adreslere ulaşmaya çalışırken birçok zararlı yazılım ve kötü amaçlı içeriğe maruz kalabiliyoruz. İstemsizce gerçekleşen indirme işlemleri, çıkılamayan yeni sekmeler gibi kısa sürede kullanıcıyı birçok uyarıya maruz bırakan bu kısaltma servislerinin markajından kurtulmanın birkaç yolu mevcut.

Serimizin bu yazısında ilk olarak python ile bir kısaltılmış adresin gerçek adresini nasıl bulacağımızı öğreneceğiz. Daha sonra elde ettiğimiz bu adresin bizim için bir tehdit olup olmadığı ile alakalı fikir sahibi olmaya çalışacağız. Karar verme aşamasında ThreatMiner ismiyle birçok büyük projenin de bünyesinde bulunan tehdit istihbaratı paylaşım platformunun sağladığı ücretsiz bir API kullanacağız.

ThreatMiner; domain, ip adresi ve hash bilgileri gibi veriler üzerinde sorgu yapabilmemizi ve bazı detaylara erişebilmemizi sağlıyor. Biz yazacağımız uygulama doğrultusunda “domain” kapsamında sorgu gerçekleştireceğimiz için, buna uygun sorgu formatlarını kullanacağız. Aşağıda ThreatMiner’dan aldığımız ekran görüntüsünde domain bilgilerine göre sorgu tipleri ve örnek sorgular bulunmaktadır.

Biz yazacağımız kod üzerinde “Report Taging” isimli sorgu tipine ihtiyaç duyduğumuzdan dolayı, “rt=6” flag parametresini kullanacağız. Bu sorgu tipine ait örnek yanıt aşağıda bulunmaktadır:

Bu sorgu tiplerinden elde edilen cevaplarda ortak olarak iki anahtar bulunmakta: status_code ve status_message. Biz de yapacağımız sorguların ardından kontrol işlemi gerçekleştirirken bu iki anahtardan herhangi birini karşılaştırma işlemine tabi tutacağız.

Uygulamayı Birlikte İnceleyelim

• 1.satır: “urllib” paketini uygulamamıza tanıtıyoruz.
• 2.satır: “urllib.request” alt paketinden “Request” ve “urlopen” statik metotlarını dahil ediyoruz.
• 3.satır: Bazı URL çözümleme işlemlerinde SSL engeline takılmamak adına “context”(SSL ve SSL yapı taşları bütünü) üretmek için “ssl” kütüphanesini dahil ediyoruz.
• 4.satır: ThreatMiner sorgularından dönen JSON tipindeki veriyi python dilindeki sözlük tipine çevirmek için gerekli “json” kütüphanesini dahil ediyoruz.
• 6.satır: İstek yaparken gerçek kullanıcıya oldukça benzemek istediğimizden, HTTP istek metodumuzda kullanmak üzere başlık bilgileri (biz sadece User-Agent ekleyeceğiz) oluşturuyoruz.
• 7.satır: “Request” statik metoduna, kısaltılmış URL’imizi ve kullanacağımız başlık bilgilerini parametre olarak veriyoruz ve “req” değişkenine atıyoruz.
• 8.satır: “ssl” kütüphanesinde bulunan “_create_unverified_context()” fonksiyonu ile varsayılan parametreli basit bir “context” oluşturuyoruz.
• 9.satır: “urlopen” statik metoduna oluşturduğumuz “req” değişkenini ve SSL context’ini parametre olarak veriyoruz. Bu işlem sonucunda bir URL bağlantısı açılmış oluyor. Devamında, elde edeceğimiz yanıt üzerinde “geturl()” metodunu kullanarak genişletilmiş URL’i “expanded_url” isminde bir değişkene atıyoruz.

• 10.satır: Elde ettiğimiz genişletilmiş URL’i “print()” fonksiyonu yardımıyla ekrana yazdırıyoruz.”expanded_url” değişkeni “http(s)://exampleurl.com/” şeklinde bir URL içeriyor. ThreatMiner API ile sorgu yapabilmemiz için bu değişkeni HTTP protokol bilgisinden (“http://”) ve son karakterden (“/”) kurtarıp bir nevi törpüleme işlemi yapacağız.
• 12.satır: Python dilinde hali hazırda bulunan “split()” fonksiyonu ve bu fonksiyona verdiğimiz karakter parametresi ile; üzerinde kullandığımız “string” tipindeki veriyi parçalar altında inceleyebilmekteyiz. Bu işlem sonunda bize “array” tipinde bir veri dönecektir. Biz de “expanded_url” üzerinde bu işlemi gerçekleştirerek; dönen “array” verisinin 1 indeksli elemanını “q” isminde bir ara değişkene atıyoruz. Bu değişken [“http:”,”//exampleurl.com/”] formatına sahip bir “array” olacaktır.
• 13.satır: Python dilinin sağladığı güzelliklerden birisi de “string” veri tiplerinde sanki “array” üzerinde indeks numaraları ile geziniyormuş gibi gezinmemizi sağlayabiliyor olmasıdır. Gerçekleştirdiğimiz [2:-1] işlemi ile baştan iki ve sondan bir karakteri, yani “/” karakterlerini, “q” değişkenimizin üzerinden siliyoruz. Artık tüm fazlalıklardan arındırdığımız ham adresimizi “query_url” değişkenine atıyoruz.
• 14.satır: Kontrol amacı ile, elde ettiğimiz adresin sorguya hazır olduğunu “print()” fonksiyonu yardımı ile ekrana yazdırıyoruz.
Bu aşamaya kadar yazdığımız kodlarla, kısaltılmış URL bilgisinden gerçek URL bilgisine erişmiş olduk. Devam eden satırlarda gerçekleştireceğimiz işlemler ile elde ettiğimiz URL için ThreatMiner tehdit istihbaratı platformu üzerinde sorgu gerçekleştireceğiz.
• 16.satır: Yazımızın önceki kısmında ThreatMiner API üzerinde “rt=6” flag parametesine sahip sorgu tipini kullanacağımızı söylemiştik. Bunun için sorgu formatına “format()” fonksiyonu yardımı ile elde ettiğimiz “query_url” değişkenini ekliyoruz ve son halini “api_url” değişkenine atıyoruz.
• 17.satır: Sorgu işlemleri sırasında herhangi bir hata ile karşılaşırsak hatayı rahatlıkla inceleyebilmek için bir “try-except” bloğu açıyoruz.
• 18.satır: 7.satırda yaptığımız gibi, fakat burada farklı bir kullanım göstermek açısından yine “urllib” içerisindeki “Request” fonksiyonunu kullanarak bu kez “api_url” için aynı başlık bilgileri ile sorgu oluşturuyoruz.
• 19.satır: Aynı şekilde ThreatMiner için de “context” oluşturuyoruz.
• 20.satır: “urlopen()” ile oluşturduğumuz “req” ve “headers” değişkeni üzerinden yine bir istek yapıp dönen cevabı “resp” değişkenine atıyoruz.
• 21.satır: “json” kütüphanesinin “load()” fonksiyonu yardımı ile JSON tipindeki veriyi pythonda işleyebilmek için “dictionary(sözlük)” veri tipine çeviriyoruz ve “resp_dict” değişkenine atıyoruz.
• 22.satır: Eğer dönen veri içerisindeki “status_message” anahtarının eşleştiği değer “Results found.” ise gerekli işlemleri yapması için bir “if” bloğu açıyoruz.
• 23.satır: Bu karşılaştırmanın doğru olması halinde sorguladığımız URL’in zararlı olacağı anlaşıldığından “print()” fonksiyonu yardımı ile ekrana zararlı olduğunu yazdırıyoruz.
• 24.satır: Karşılaştırmanın farklı bir şekilde sonuçlanması halinde yapılacak işlemler için bir “else” bloğu açıyoruz.
• 25.satır: Zararlı olmadığı anlaşılan adresi ve zararlı olmadığı bilgisini ekrana yine “print()” fonksiyonu yardımı ile yazdırıyoruz.
• 26.satır: Daha önce açtığımız “try” bloğunun “except” durumunda, yani programın çalışmasına engel olacak herhangi bir hata durumunda, yapılması gerekenleri belirlemek için tüm Exception’ları “e” temsili ile belirtiyoruz.
• 27.satır: Alınan hataları “print()” fonksiyonu yardımı ile ekrana yazdırıyoruz.
Serimizin bu yazısında Python ile kısaltılmış bir URL’in arkasındaki gerçek adresi erişmeye ve ThreatMiner ile tehdit istihbaratı otomasyonu gerçekleştirmeye çalıştık. Kurum ve kuruluşlar için olduğu kadar son kullanıcılar için de önemli olan tehdit unsurları ve istihbaratı üzerinde kodladığımız bu otomasyonu, farklı tehdit istihbaratı sağlayıcılarla entegre ederek elde ettiğimiz sonucun kesinliğini arttırabiliriz. Diğer yazılarımızda görüşmek üzere, güvenli günler dileriz.