Uygulama 13 | ARP Attack Detection System v-Python

Bu uygulama, "Ortadaki Adam Saldırısı - Man In The Middle" dedektörü gibi olacaktır. Eğer böyle bir saldırı söz konusu ise bize bir bildirim atmasını istiyoruz. Daha önce Bash Script dersleri içerisinde Bash Script ile "Uygulama 7 | ARP Attack Detection System" isimli blogda buna benzer bir yapı yazmıştık. Burada, Python ile iş yapacağız. Aynı zamanda Windows 10 üzerinde bir kodun belli aralıklarla otomatik olarak nasıl çalıştırılacağını göstereceğim.

Bloga başlamadan önce MITM saldırısının ne olduğundan kısaca bahsetmek istersek blogun başında belirttiğim blog içerisinden bir kesit ile bu işi çözebiliriz. Bununla beraber aşağıda linklerini verdiğim blogları okumanızda yarar vardır:

ARP

MAC Adresleri

Kali Kurulumu

Kali'yi Tanıyalım

Sanal Win10 Kurmak

Modüller | re

*** BAŞLANGIÇ - Bash Script ile yazılmış bir MITM tespit sistemini anlattığımız blogdan alıntı ***

Ortadaki Adam Saldırısında saldırgan, modem ile kullanıcı arasına girer. Bu 'araya girme' işlemi sonucunda modem ile kullanıcı arasında geçen bütün trafik, aslında saldırganın üzerinden geçmiş olur. Bu noktada kullanıcı, saldırganı bir modem olarak algıladığı için trafik saldırgana da yönlendirilir. Peki kullanıcı, saldırganı nasıl modem olarak algılayabilir; 'MAC Adresleri'. Saldırganın MAC adresi, bu saldırı esnasında modemin MAC adresi ile aynı olur. Saldırgan bunu, 'ARP Spoofing - Sahte ARP' dediğimiz bir vektörle başarır; sahte ARP paketleri yollayarak bir 'aldatma' gerçekleştirir. Bahsettiğim bu 'spoof' sonucunda 'ARP Poisoning - ARP Zehirlenmesi' dediğimiz kavram ortaya çıkar. 

Biz bu yazıda Ortadaki Adam Saldırısını yapmayacağız; bunu tespit eden bir yazılım geliştireceğiz. Her şeyden önce bir ARP Zehirlenmesinin 'en basit hâlinin' nasıl yapıldığına ve ARP Zehirlenmesine maruz kalan bir cihazın ARP tablosunun nasıl göründüğüne bakmamız gerekiyor.

Bunun için kullandığım Kali'nin yanında başka bir Kali daha açıyorum ve ikisini aynı ağda olacak şekilde ayarlıyorum. Daha sonra ağ içerisinde bulunan cihazların IP ve MAC adreslerini bulmak için kendi yazdığım bir Python kodunu çalıştırıyorum. Aşağıdaki görselde neler olduğunu bilmenize gerek yok.

Yukarıdaki görselde sol taraftaki kırmızı kutucuk içerisinde ağdaki cihazların IP adreslerini, sağdakinde ise cihazların MAC adreslerini görüyoruz. Hedefimiz, en aşağıdaki cihaz (10.0.2.10). İsterseniz hedef makinede 'ifconfig' çalıştırıp IP ve MAC adresini teyit edelim.

Şimdi, saldırı olmayan bir cihazın ARP tablosuna bakalım.

Gördüğünüz gibi tüm cihazların IP adresleri de MAC adresleri de birbirinden farklı. Saldırganımız, '10.0.2.5' yani 'cyberworm@kali' olarak bekliyor ancak biz onun şu an herhangi bir saldırı yapmadığı için saldırgan olduğunu bilmiyoruz.

Şimdi, saldırımıza geçelim.

Sol tarafta ilk önce modemin IP adresini, sonrasında hedefin IP adresini yazıyoruz. Sağ tarafta ise bunun tam tersini uyguluyoruz. Bunun sonucunda modemi de kullanıcıyı da aldatmış oluyoruz. Bu ikisinin de aynı anda çalışması gerekiyor; terminali kapatırsanız saldırı da kapanacaktır. CTRL+C yaparak da kapatabilirsiniz.

Şimdi, mağdurumuzun ARP tablosuna bakalım.

Modem ile (10.0.2.1) saldırganın (10.0.2.5) MAC adreslerinin aynı olduğunu görüyorsunuz. ARP Poisoning başarılı oldu.

*** BİTİŞ - Bash Script ile yazılmış bir MITM tespit sistemini anlattığımız blogdan alıntı ***

Bu blog içerisinde sanal Win10 ve Kali Linux kullanacağım. Siz de kullanmak isterseniz blogun başında verdiğim linkleri takip edebilirsiniz. Artık Başlayalım.

İlk önce AADSv2.py isminde bir dosya açıyorum ve içerisine os, re modüllerini ve tkinter modülünün messagebox sınıfını import ediyorum:

Şimdi, yapmamız gereken şey bir arp -a komutu çalıştırmak. Windows üzerinde arp -n komutu işe yaramadığı için arp -a çalıştırmamız lazım. Bu noktada subprocess modülü yerine os modülünün popen() fonksiyonunu kullanacağız. Bunu "Modüller | os" blogunda anlatmadım ama nasıl olduğuna bir bakalım.

Gördüğünüz üzere el ile arp -a çalıştırmışım gibi sonuç verdi. Bu noktada popen() fonksiyonuna verdiğiniz komut tahmin edebileceğiniz üzere çalıştırılır. Sonrasında gelen .read() ifadesi ise bunun okunmasını ve result değişkenine atanmasını sağlar.

Şimdi, print(result) ifadesini silmemiz ve MAC adreslerini filtrelememiz lazım. Bunun için re modülünü kullanacağız.

Hatırlayacağınız üzere re modülünde sayı ya da karakter filtrelemesi için \w ifadesini kullanıyorduk. O zaman yapalım.

gatewayMAC isimli bir değişken atadım ve re modülünün findall() fonksiyonu ile bir MAC adresinin nasıl karakterlerden oluştuğunu bildiğim için \w\w-\w\w-... şeklinde bir RegEx ifadesi verdim. Son olarak, biraz önce arp -a sonucunu tuttuğumuz result değişkenini parametre olarak verdim.

print(gatewayMAC) dediğimde ise ARP tablosundaki bütün MAC adreslerini alabildim. Ancak, dikkat ederseniz bu bir liste ve benim ihtiyacım olan şey modemin MAC adresi. Bir önceki görsele bakarsanız 192.168.1.1 şeklindeki yerel IP adresinin karşısında, yukarıdaki ekranda gördüğünüz listenin ilk elemanı yer alıyor. İşte, benim ona ihtiyacım var. O zaman index kullanamaz mıyım?

Elbette, artık gatewayMAC değişkeni yalnızca modemin MAC adresini tutuyor. Şimdi, tuttuğumuz bu değeri, oradaki liste içerisinde saymamız lazım.

result değişkeni arp -a sonucunu tutuyordu, gatewayMAC ise modemin MAC adresini tutuyordu. Dolayısıyla counter değişkenine result.count(gatewayMAC) ifadesini verdim. Burada, result içerisinde gatewayMAC değişkeninin kaç defa geçtiğini bize söylemesi lazım. Zaten sağ tarafa baktığınızda 1 sonucunu görüyorsunuz; şu an herhangi bir saldırı yok ve modemin MAC adresi yalnızca bir tane.

İşte şimdi, counter değişkeninin 1'den büyük olduğu durumları ele almamız lazım. Hatırlatıcıyı okuduysanız bilirsiniz ki MITM saldırısı varsa modemin MAC adresinden 2 tane vardır, o da saldırgandır.

Eğer counter değeri 1'den büyükse yani ARP tablosunda modemin MAC adresinden birden fazla messagebox ile bir uyarı verdik ve bu kadar.

Evet, kod sonlandı. Bu noktada herhangi bir else yapısı kurmamıza gerek yok çünkü bunu arka planda çalıştıracağız ve eğer sıkıntı yoksa kod her çalıştığında bize bildirim atmamalı.

Şimdi, bu kodu sanal makineye alıp kodu arka planda nasıl çalıştıracağımızı görelim. 

İlk önce Windows'un arama kısmına "Task Scheduler" yazıyorum ve gelen uygulamaya giriyorum.

Açılan pencerenin sağ tarafında "Create Task" kısmına geliyoruz:

Açılan pencerede bu göreve bir isim veriyorsunuz ve bu görevin ne yaptığına dair bir açıklama yazıyorsunuz. Sonrasında mor ok ile gösterdiğim "Triggers" kısmına geliyoruz.

Açılan pencerenin sol alt köşesindeki "New" butonuna tıklıyoruz:

Açılan pencerede sırasıyla şunları yapmalısınız (önce görseli görelim):

İlk önce işaretlemeyi unuttuğum ve en üstte bulunan 'Begin the task:' kısmını 'On a schedule' olarak ayarlıyoruz.

Sonrasında "Daily" seçeneğini seçiyoruz. Sonrasında Start: kısmından bu kodun başlayacağı ilk zamanı belirliyoruz. Daha sonra aşağıda bulunan 'Repeat task every:' kısmından dilediğiniz zaman dilimini seçiyor ve 'for a duration of' kısmını 1 day olarak işaretliyoruz. Bunları kendinize göre değiştirebilirsiniz. Bu ayarlar sayesinde kodum her gün her beş dakikada bir 1 defa çalışacaktır.

OK butonuna tıkladıktan sonra "Triggers" kısmının hemen yanındaki "Actions" kısmına geliyoruz ve "New" diyoruz:

Açılan pencerede arka planda çalıştırılmasını istediğiniz yazılımın yolunu (path) yazmalısınız. Bunun için "Browse" butonunu kullanabilirsiniz. Eğer kodunuz optparse modülünde anlattığım gibi argümanlarla çalışıyorsa 'Add arguments (optional):' kısmına o argümanları girebilirsiniz.

Bunu da yaptıktan sonra bütün pencereleri sırasıyla OK diyerek kapatıyoruz ve Task Schedule uygulamasını tekrar açıyoruz. Önce görseli görelim:

Uygulamayı açtıktan sonra "Active Tasks" kısmına gelirseniz sizin tanımladığınız görevin orada olduğunu göreceksinizdir. Hatırlarsanız başlama zamanını 2/5/2023 12.25.28 PM olarak ayarlamıştık. Şu an mor ok ile gösterdiğim kısma dikkat ederseniz o zamanın beş dakika sonrasını gösterdiğini görürsünüz. Demek ki bu kod 12.30.28'de bir defa çalıştırılacak. Bu çalıştırma işlemi olduktan sonra o kısım 12.35.28 olacaktır. Şimdi 12.30.28'e kadar bekleyelim ve ne olacağını görelim.

Bu arada Windows'taki ARP tablosuna bakalım:

En üst kısımda 10.0.2.1 yerel IP adresinin karşısındaki değer, modemin MAC adresidir. Bu noktada bundan yalnızca bir tane olduğunu görüyorsunuz.

Şimdi, saldırıyı da başlatalım. Bunun için Kali'ye giriyorum ve komutlarımı yazıyorum.

İlk önce kurbanımızın internet bağlantısının gitmemesi için ip_forward içerisindeki değeri 1 olarak değiştirmemiz lazım. Bunların ne demek olduğunu bilmenize gerek yok, şu an saldırıyı hazırlıyorum. Bu işlemler sırasında root olmayı ya da sudo ifadesini vermeyi ihmal etmeyiniz.

Normal şartlarda bu kod, ip_forward dosyasındaki değeri 1 olarak değiştirecektir. Bu kodu girip Enter'a bastıktan sonra cat /proc/sys/net/ipv4/ip_forward komutunu girerseniz ip_forward içerisindeki değeri görürsünüz. Eğer o değer 1 değil de 0 ise yani komutumuz çalışmamışsa şunu deneyebilirsiniz:

Komutu şu şekilde değiştirebilirsiniz: sudo echo > /proc/sys/net/ipv4/ip_forward "1"

Dosyayı bir metin editörü ile açıp değeri el ile değiştirmek ve kaydetmek: leafpad /proc/sys/net/ipv4/ip_forward

Garanti olması açısından cat /proc/sys/net/ipv4/ip_forward komutunu verip oradaki değerin 1 olduğuna emin olmanız gerekiyor.

Saldırıyı başlatalım:

Bu iki komutu iki farklı terminalde çalıştırmanız gerekiyor. Oradaki IP adresleri sizde farklı ise lütfen kendinize göre yazın. Soldaki terminalde -t ifadesinden sonra ilk önce hedefin IP adresi sonra modemin MAC adresi yer alırken sağdaki terminalde -t ifadesinden sonra ilk önce modemin IP adresi sonra hedefin IP adresi yer alıyor. Enter'a bastıktan sonra birkaç defa CTRL + C kullanarak bu komutları durdurabilirsiniz.

Komutlarım çalışır vaziyetteyken Windows ekranına dönüyorum. Yani şu an Windows makine bir MITM saldırısı altında.

Saat tam 12.30.28 olunca uyarının geldiğini görüyoruz.

Uygulamamız bu kadardı. İçe aktardığımız modülleri ve messagebox ile verdiğimiz mesajı tek bir satır olarak kabul edersek toplam 6 satırlık Python kodu ile neler yapabildiğimizi görebiliyorsunuz.


Yayınlanma Tarihi: 2023-02-05 20:49:54

Son Düzenleme Tarihi: 2023-02-28 10:37:24