Konuyu daha net anlamanız açısından aşağıda linklerini verdiğim blogları okumanızı öneriyorum.
Bu projemizde 'Ortadaki Adam (Man In The Middle)' saldırısını tespit etmeye çalışacağız. Bu konuyu henüz 'Hacking' kategorisi altında anlatmadım. O yüzden kısaca ne olduğundan bahsedelim.
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.
Bu saldırının çok daha gelişmiş şekillerde yapılabildiğini, trafiğin görülebildiğini, çeşitli araçlarla şifreli trafiğin çözülebildiğini aklınızdan çıkarmayın. Bunu, bu saldırı şu an zararsız gibi göründüğü için söylüyorum. İşte biz, Bash kullanarak bu durum gerçekleştiğinde bize bildirim vermesini sağlayacak bir yazılım geliştireceğiz. Başlayalım.
İlk olarak bizim, modemin MAC adresine erişmemiz gerekiyor. Peki, bunu nasıl yapacağız?

arpTable=`arp -n` şeklinde bir tanımlama yaptım. Burada 'arp -n' komutunun çıktısını arpTable isimli değişkene atadım; zaten artık biliyorsunuzdur. Sonrasında enteresan bir kod görüyorsunuz. İsterseniz bunu test dosyasında deneyelim ve ne olacağına bakalım.

Gördüğünüz gibi modemin MAC adresini filtreleyip bana getiriyor. Daha önce awk komutunu görmüştük. awk, 'grep'e benzer bir komuttur ve kendisinden sonra gelen '{print}' ifadesine verilen argüman, aratılan metin içerisinde kaçıncı kelime olduğunu ifade eder. Bu noktada ben, arp -n komutu sonucunda gelecek olan çıktının dokuzuncu ifadesini çektim. awk, metin içerisindeki her kelimeyi soldan sağa doğru tarar ve verdiğiniz argüman kaç ise onu size getirir. Yalnız dikkat edin; her kalıbı değil, her kelimeyi. Yani 'Flags Mask' kısmı aklınızı karıştırmasın. Buradaki 'Flags' ve 'Mask' kelimeleri ayrı ayrı sayılacaktır.
Ayrıca burada 'arp -a' kullanmak yerine 'arp -n' kullanmamın sebebi, 'arp -a' komutunun çıktısının Linux sistemlerde her zaman sıralı sonuç vermediğinden kaynaklı. Yani 'arp -a' komutu bazen modemi listenin aşağı taraflarında da gösterebiliyor.
Sonuç olarak kodumuz; echo $arpTable | awk '{print $9}' şeklinde oldu. Ben sadece bunu 'gatewayMAC' isimli bir değişkene atadım çünkü bunu ileride kullanacağız.
Bu noktada bu çıktıyı, basit bir .txt dosyasına aktarıp oradan sürekli olarak bir kontrol sağlayabiliriz. Bunun için cw.txt isimli bir dosya oluşturdum. Ancak bunu, varsayılan olarak oluşturdum yani kod ile yapmadım çünkü bu kod her çalıştığında cw.txt silinip touch komutu ile yenisini oluşturur ve içerisine aktarırdı. Bu da, oldukça verimsiz bir yapı olurdu. Bunun içine, arp -n sonuçlarını aktaracağız. Ancak bunların aynı klasörde olması işimizi daha da kolaylaştıracaktır. Dolayısıyla hem arpDetection.sh dosyasını hem de cw.txt dosyasını 'arpDetection' isimli bir klasöre koyuyorum.

Sonrasında bu klasör üzerinde hakimiyetimizi artırmak adına bunun yerini find ile buluyorum ve bunu bir değişkene atıyorum. Ne de olsa kullanıcı bu klasörü istediği lokasyonda tutabilir. Bundan sonra da aşağıda echo komutu ile arpTable değişkeninin tuttuğu sonuçları cw.txt isimli dosyaya aktarıyorum. Ancak dikkat; >> yerine > kullanıyorum. Bu kodun daha sade hâlini şu şekilde gösterebilirim:
echo -e > /root/Desktop/arpDetectiton/cw.txt "ARP TABLE\n$arpTable"
Burada, klasörün lokasyonunu bulduğumuzu ve bir slash (/) çekerek içerisindekileri kontrol edebileceğimizi görüyorsunuz.
Peki, bunu neden bir dosyaya attık? Biz, gatewayMAC değişkeni sayesinde modemin MAC adresini tutuyoruz. Saldırı olduğunda ARP tablosunda bu MAC adresinden en az iki tane olması lazım. Dolayısıyla biz, her seferinde ARP tablosunda bu MAC adresinden birden fazla olup olmadığını kontrol edebiliriz.
Bunun için MAC adresi sayacı tarzında bir değişken atıyorum ve bunu sıfıra eşitliyorum: indexOfMac=0
Sonrasında bu dosyayı sürekli olarak okumam gerekiyor. Bunun için; içerisinde komut çalıştırabileceğimiz for döngüsü çeşidini kullanıyorum. Kullanımını biliyorsunuz; anlatmıştım.

cat ${codeArea}/cw.txt diyerek bu dosyayı okuyoruz ancak bizim, dosya içerisindeki MAC adreslerini de okumamız ve eşleşmeleri kontrol etmemiz lazım. Bunun için case yapısını tercih ediyorum. Hemen bir case oluşturalım.

case $sameMAC dememin sebebi, for döngüsü ile okuduğumuz dosyanın değişkeninin sameMAC olmasından kaynaklanıyor. Biz, okunan dosya üzerinde işlem yapıyoruz ve bu dosyanın içeriğini tutan değişken, for döngüsü içerisindeki sameMAC değişkeni.
Bunu yaptıktan sonra daha önce modemin MAC adresini tuttuğumuz gatewayMAC isimli değişkeni case olarak arıyoruz. Evet, bulursa ne yapacağız?

Eğer modemin MAC adresi bulunursa indexOfMac değişkeninin değerini bir artırıyorum. Bunun sebebi nedir? Saldırı olmuş bir cihazın ARP tablosunu gözünüzün önüne getirin; bu durumda bir MAC adresinden o tabloda iki tane olacaktır. Bu koşulda aşağıdaki if yapısına hiç girmeyecektir çünkü if'in koşulu 'index 2 ise' şeklindedir. Bu tur bittikten sonra döngü başa saracak ve bulduğu ikinci MAC adresinde index değerini bir daha artıracaktır. Bu olduktan sonra if koşulu sağlanmış olacak ve bize uyarı verecektir. Zaten eğer bu oluyorsa saldırı var demektir. Kısacası dosyadaki ifadeler taranırken modemin MAC adresini görünce index, 1 olacaktır. Sonrasında eğer bir tane daha görürse bu değer 2 olacaktır ve o zaman bize uyarı verecektir. İşte, yukarıdaki kodun tam olarak yaptığı iş budur.
Evet, kodumuz bu kadardı. Ancak bir sorunum var. Ben bu kodu ne Cron'da ne de sistem çalıştırılırken çalıştırılan dosyaların arasında çalıştırabiliyorum. Aslında kod çalışıyor ama dosyaya ARP tablosunu attığımız kod çalışmıyor. Nedenini bir türlü bulamadım; onlarca farklı senaryo kurdum, kodu değiştirdim, farklı metotlar denedim ama yine de olmadı. Siz denemek istersiniz diye size, Cron için hazırladığım bir Script'i vereceğim. Bunun için, arpDetection klasörünün içine cron.sh isimli bir dosya oluşturuyorum.

Çalıştırmamız gereken yani tespit sistemi olan arpDetection.sh isimli dosyayı find ile buluyorum. Sonra, daha önceki uygulamalardan da hatırlayacağınız üzere bunu Cron'a veriyorum. Cron içerisinde şu tarz bir görüntü oluşacaktır.

Normalde çalışması gerekir hatta çalışıyor. Ancak dosyaya aktarırken maalesef sorun çıkıyor; Instagram üzerinden de size belirtmiştim. Bu noktada başka bir çözüm ürettim.
Bildiğiniz üzere kullanıcılar, ortak ve açık ağlarda (otel, cafe vb.) güvende değildir ve Ortadaki Adam'a maruz kalma olasılıkları oldukça yüksektir. Bu yüzden kullanıcı, bu ağlara bağlanmak zorunda kaldığında bu sistemi çalıştırması yeterli olacaktır. Fakat, sistem tek bir defa çalışıp kapanıyor; kullanıcı birkaç dakikada bir bunu çalıştırmakla mı uğraşacak? Elbette, hayır.
O yüzden run.sh isimli bir dosya daha açıyorum.

İçerisine de yine klasörü bulan bir kod yazıyorum. Sonrasında while ile sonsuz bir döngü açıp bash $codeArea/arpDetection.sh kodu ile bunu sürekli olarak çalıştırmasını sağlıyorum. Bu yöntem ortalama bir süre boyunca çalıştığında cihazı büyük ölçüde yorabileceği için sleep komutu ile bunun 5 saniyede bir gerçekleştirilmesini sağladım. Yani bir nevi küçük bir Cron yarattım. Burada, kodu denediğim ve hemen gerçekleşmesini istediğim için sleep 5 yazdım. Siz, bu değeri değiştirebilirsiniz ve isterseniz 3 dakikada bir çalışmasını isteyebilirsiniz. Bunu, 'sleep 3m' (3 minutes - 3 dakikada bir) veya 'sleep 180' (180 saniyede yani 3 dakikada bir) komutu ile yapabilirsiniz.
NOT: Kullanıcının, bu kodu çalıştırdıktan sonra terminali kapatmaması, işlerini başka bir terminal üzerinden gerçekleştirmesi gereklidir. Terminal kapanırsa program da kapanacaktır. Bunun için arka planda çalışan bir terminal açabilirsiniz.
Şimdi, kodumuzu deneyelim.

Ben tekrar 10 saniyede bir çalışması için sleep 10 yaptım. Kod şu an çalışıyor, herhangi bir saldırı yok. Burada run.sh dosyası, arpDetection.sh dosyasının çalışmasını sağlıyor. Şimdi, saldırımızı yapalım ve ne olacağına bakalım.

Saldırı altındaki sisteme dönüp bakalım.

Saldırı gerçekleştiğinde sağ taraftaki uyarıları görüyorsunuz. Bir de cw.txt içerisindeki ARP tablosuna bakalım.

Sistem, başarılı bir şekilde çalışıyor.
Yayınlanma Tarihi: 2022-10-16 13:10:36
Son Düzenleme Tarihi: 2022-10-18 20:32:46