Kategoriler
Siber Güvenlik

DHCP Snooping

Bir şirketin ethernet portuna modemi bağlasak, DHCP yayını yapsak, “Bundan sonra bu ağın yeni DHCP serveri benim, IP almak için paşa paşa benim ayağıma geleceksiniz” desek, IP adreslerini biz dağıtsak ne olur? Belki bunun için modeme bile gerek yok. DHCP server kurmak ve çalıştırmak yeterli.

DHCP (Dynamic Host Configuration Protokol) Nedir?

Öncelikle DHCP nedir ve nasıl çalışır kısaca bundan bahsedelim. Biz bir ağa bağlandığımızda bize bir IP adresi atanmalı. Aksi takdirde bağlandığımız ağda mülteci durumuna düşeriz keza bize bir kimlik atanmamıştır. Burada devreye DHCP girer. Bize bir IP adresi yanı sıra ağ maskesi, ağ geçidi, DNS adresi gibi bilgileri atar. Böylece sistem yöneticisi, her seferinde ağa bağlananlara IP adresi atamakla uğraşmaz. Kullanıcı tarafında da hiçbir ek ayara gerek kalmaz. IP adresi çakışmaları yaşanmaz. Ağda hangi VLAN’dayız, daha önce bize bir IP adresi atanmış mı, yenisini vermek lazım mı her şey DHCP tarafında hallolur. DHCP’ye önceden “Bu MAC adresi bağlanırsa, şu IP adresini ver” denmediyse rastgele olarak IP adresi atar. DHCP’nin atayacağı IP adresi aralıklarını da ayarlamak mümkündür. Aynı zamanda bilgi-işlem’e şu IP aralığını, muhasebeye bu IP aralığını ata gibi seçenekler de uygulanabilir.

DORA Süreci

Discover süreci: Ağa bağlandığımızda tüm ağa DHCPDISCOVER paketi gönderilir. Yani bilgisayarımız DHCP var mı, varsa hanginiz diye ağa sorar. Broadcast gönderilen pakette cihazımızın MAC adresi yer alır.

Offer: Bu paket DHCP servera ulaştığında server, kendini tanıtmak için kullanıcıya bir paket hazırlar. İçerisinde kendisinin IP adresi, MAC adresi ve karşı tarafın MAC adresi bulunur. Ben buradayım, IP adresi istiyorsan hemen atayayım diye dönüş yapar diyebiliriz.

Request: Kullanıcı bu isteği aldıktan sonra IP atanmasını onayladığını DHCP servera iletir.

Acknowledgement: Daha sonra DHCP server, kullanıcıya IP adresi ve gerekli diğer bilgilerinin yer aldığı paketi gönderir.

Diğer Kavramlar

Scope: DHCP serverda, kullanıcılara dağıtılmasına izin verilen IP aralığıdır. Bu sayede 50-150 arasını IP olarak dağıt gibi tercihlerde bulunabiliriz.

Exlusions: Scope’un aksine belirtilen aralığın dağıtılmamasını sağlar. 50-150 IP adresi hariç hepsini dağıt gibi tanımlamalar yapabiliriz.

Lesses: DHCP’nin kiraladığı IP adreslerinin listesini gösterir.

Reservation: Belli bir IP adresinin, belli bir cihaza atamak, rezerve etmektir. Örneğin patronun MAC adresine daima aynı IP adresini atayabiliriz.

Sahte DHCP Çalıştırmak (Rogue DHCP Attack)

Ağda sahte DHCP sunucusu kuran birisi, kullanıcılar DHCP server kim diye sorduğunda kendileri dönüş yapabilirler. Saldırgan, gönderdiği sahte DHCP paketi ile karşı tarafa kendi atadığı IP adresini gönderir. Artık kullanıcı, saldırganın DHCP  sunucusuna bağlıdır diyebiliriz. Saldırgan bundan sonra kendi DHCP sunucusuna bağlı kullanıcıların ağ trafiğini takip eder ve ulaşmak istediği adres yerine kendi istediği sayfaya yönlendirebilir. Bundan sonrasında karşı tarafın RDP’sini, mail adresini veya kurum platformundaki oturumunu phishing saldırıları ile ele geçirmesi gibi saldırıların sonu tamamen saldırganın hayal gücüne kalmıştır. Aynı zamanda man in the middle ataklarının yanı sıra ağdaki paketlerin hedefe ulaşamamasını da sağlayabilir. Neticede tüm paketler saldırgana ait DHCP üzerinden geçer ve paketlerin yönetimi de ona aittir diyebiliriz. Bu saldırıya Rogue DHCP Attack (Düzenbaz DHCP saldırısı) denir.

Öncelikle ağda bir keşif yaparak, ağ maskesi, dns sunucusu ve ağ geçidi gibi bilgilerini elde edelim. Daha sonrasında kullanılmayan IP adresi bulmamız ve kendimize tanımlamamız gerekli. Atak esnasında yeni bağlanan cihazlara IP atamak için de boştaki IP aralıklarını tespit etmek IP çakışmalarını önlemek için faydalı olabilir.

Keşif aşaması bittikten sonra cihazımızda eth0’ı daha önceden belirlediğimiz, kullanılmayan bir IP adresine ayarlayalım. Bu adres artık bizim sahte DHCP’mize ait olacak.

Ardından, Kali makinesinde, sahte DHCP istemcileri yönlendirmek için varsayılan ağ geçidi olarak kullanılacak bir ağ alt arayüzü oluşturacağız.

Ağdaki diğer cihazları bizim DHCP sunucumuza yönlendirmek için bir ağ alt arayüzü oluşturacağız ve sonra varsayılan ağ geçidi olarak ayarlayacağız.

Yeni ağ alt arayüzümüz olan eth0:1’e , halihazırda kullanılmayan bir IP adresi atayalım. Göze batmaması için varsayılan adresler daha sağlıklı olacaktır. Örneğin varsayılan yol 10.1.1.1 ise 10.1.1.11 veya varsayılan yol 10.1.1.254 ise 10.1.1.251 kullanın.

Şimdi makinemizin IP yönlendirmeye (ip_forwarding) izin vermemiz gerekiyor. Ancak makineyi yeniden başalttığımızda bu ayar değişecektir. Bu durumda, bu ayarları tekrar kontrol etmeyi unutmayın.

Daha sonra eth0:1 ağ alt arayüzümüz için varsayılan ağ geçidi ayarlamamız gerekiyor. Ağdaki gerçek “varsayılan ağ geçidine” (192.168.1.1) ayarlayacağız. Bu sayede bize gelen paketler, sahte DHCP sunucumuz üzerinden geçtikten sonra gerçek DHCP sunucusuna gidecek. Bu sayede ağ trafiği devam ettiği için kimse ağdaki saldırının ilk bakışta farkında olmayacaktır. Tabi biz ağdaki trafik akışını aksatmak istiyorsak durum farklı.

Aşağıdaki komutla beraber route tablosunu ekrana basıyoruz. 0.0.0.0 olarak ayarlanan “Genmask”, bilinmeyen trafiğin 192.168.1.1 ağ geçidine gönderilmesi gerektiği anlamına gelir. Ayrıca flags değerindeki(UG), G varsayılan ağ geçidini ifade eder.

Şimdi saldırı aşamasına geçelim. Yeni terminalde “msfconsole” komutu ile metasploiti açalım. Sahte DHCP oluşturmak için bir modül kullanacağız.

msfconsole

msf > use auxiliary/server/dhcp

Show options komutu ile bu modülü kullanmak için nelere ihtiyacımız var bir bakalım.

Başlangıçta ağı keşfederken boşta olan IP aralıklarını not almıştık hatırladınız mı? Burada kullanmamız gerekecek. DHCPIPSTART‘ın karşısına IP aralığının başlangıcını, DHCPIPEND‘in karşısına ise IP aralığının bitişini yazıyoruz. Görüldüğü üzere bu bilgiler zorunlu değil. Daha sonra DNSSERVER seçeneğini ayarlama sebebimiz ise kullanıcıların erişmek istediği web sayfalarına istekte bulunurken karşılık bulmasıdır. Eğer kullanıcılar web sayfalarına erişemezse muhtemelen ağ yöneticisine bir sorun olduğunu bildirecek ve saldırımız tehlikeye düşecek. DNSSERVER‘ı “8.8.8.8” ayarlıyoruz. Evet Google DNS sunucuları 🙂

SRVHOST kısmına makinemizin yerel IP adresini girip ağ maskesini de ayarlıyoruz. Yine ağ trafiğinde sorun yaşanmaması için ağ maskesini (NETMASK), gerçek DHCP sunucunun ağ maskesine ayarlıyoruz. Son olarak ROUTER değerini de önceden belirlediğimiz şekilde ayarlayarak modüle gerekli verileri vermiş oluyoruz.

DHCP sunucumuzu başlatmadan önce ağda son olarak neler olup bitiyor, gerçek DHCP sunucusu ne durumda bir kontrol edelim.

Şu anda DHCP sunucusundan iki IP adresi kiralanmış. Oluşturacağımız sahte DHCP sunucusu için belirlediğimiz IP aralığını önceden kiralayalım. Daha sonra bu IP adreslerini, bizden IP isteyen kullanıcılara dağıtacağız. Öncelikle IP adreslerini topluca kiralamak için yeni bir terminal daha açın. Aşağıdaki komutu çalıştırarak kiralanabilir IP adreslerini alacağız:

pig.py eth0:1

DHCP sunucusuna son kez göz atacak olursak artık tüm IP adreslerinin kiralandığını ve rastgele isimlere sahip olduğunu görebiliriz. Bu isimlendirme dikkat çekebilir, belki gerçekçi isimler vermek için de bir yol vardır. Ama biz saldırıya odaklanalım şimdi.

Artık elimizde dağıtacak bolca IP adresi ve çalışmak için tetikte bekleyen sahte bir DHCP sunucusu olduğuna göre saldırıya hazırız. Metasploit sekmesine dönerek run komutunu verebiliriz.

Artık IP adresi isteyen kişiler bize uğrayacak, biz gerçekten de DHCP’ye kaydettiğimiz için network admini durumu öyle kolayca çark edemeyecek, trafik biz kasten yapmadıkça aksamayacak ve bütün internet paketlerine biz sahip olacağız. İç ağ, dış ağ, web sayfaları her şeyi takip edebilir ve paketleri değiştirebiliriz. Temiz yöntem…

Bir kontrol edelim DHCP artık biz miyiz değil miyiz?

Aşağıdaki görselde de 80 portuna yani web adresine atılan bir isteğin görüntüsü yer alıyor.

Ağdaki Sahte DHCP Yayınlarının Tespiti

Wireshark

Bunun için ağdaki paketleri takip etmek yeterli. Wireshark bunun için en ideal araç. Neticede yalnızca saldırılar için değil blue team ve network üzerindeki hataların tespitinde de kullanıyoruz. Arama kısmına “bootp.type == 2” yazarak sadece DHCP ve ACK paketlerinin dinlenmesini sağlarız. Bu paketleri yalnızca DHCP sunucu gönderir. Eğer burada sizin DHCP sunucunuzun dışında başka bir IP adresi varsa sahte DHCP sunucusu olduğunu söyleyebiliriz.

Başka bir örnek daha verelim. Aşağıda olması gereken bir DHCP trafiği görüyoruz. f0:de:f1:a3:5d:d6 MAC adresi, ağımızın çaylağı, yeni bağlanan biricik kullanıcısı. 00:18:0a:40:05:34 ise ağdaki gerçek DHCP’nin mac adresi. DORA sürecine uygun biçimde kullanıcımız “Discover” ile DHCP sunucusunu aramış ve iletişime geçerek bir IP adresi almış.

Aşağıdaki wireshark çıktısı ise biraz daha uzun. 00:18:0a:10:8b.e0 MAC adresine sahip cihaz, DHCP sunucusu ile IP almak isteyen cihaz arasındaki iletişime sıkça salça olmuş gibi görünüyor. DORA sürecine dahil olup DHCK NAK (Negative Acknowledgment) paketleri göndermiş. Yani IP taleplerini olumsuz karşılamış. Bunu yapan ağdaki gerçek DHCP sunucusu olmadığına göre birilerinin ağda sahte DHCP sunucusu ayağa kaldırdığını tespit ettik demektir. 00:18:0a:10:8b.e0 MAC adresi sahte DHCP sunucumuzdur.

Tcpdump

Tcpdump’da ise kaynağın 67. portundan hedefin 68. portuna ulaşan UDP paketlerini takip ederiz. Aşağıdaki komutla bunu yapmak mümkün.

tcpdump -i eth0 -l  “udp src port 67 and udp dst port 68″

DHCP Snooping Tanımı ve Konfigürasyonu

Cisco bu saldırılara önlem olarak DHCP Snooping özelliği geliştirmiştir. Bu yöntemde artık yalnızca belirli portlardan DHCP yayınına izin verilir. Portlar güvenilir ve güvensiz olarak tanımlanır. Güvenli portlar üzerinden DHCP yayınına izin verilirken güvensiz portlardan gelen DHCP paketleri çöpe atılır. Bunun için ilgili switchlerde DHCP snooping özelliğinin açılması gerekir. Bunu da aşağıdaki komutla gerçekleştiririz:

Switch> enable

Switch# conf t

Switch(config)# ip dhcp snooping

Özelliği kapatmak için ise şu komut kullanılır:

(config)#no ip dhcp snooping

Özelliği aktif ettikten sonra hangi vlanda geçerli olacağını belirtmemiz, vlanları yapılandırmamız gerekiyor.

Switch(config)#ip dhcp snooping vlan 1

Daha sonra güvenilir portları belirlemek gerekiyor. Bunun için de seçtiğimiz interface’e geçerek onun güvenilir olduğunu belirtiyoruz.

Switch(config)#interface fastEtherne t 0/1

Switch(config-if)#ip dhcp snooping trust

DHCP snooping ayarlarımızı kontrol etmek için aşağıdaki komutu kullanırız. Sonuna “binding” ekleyerek hangi IP adresi hangi MAC adresine atanmış öğrenebiliriz.

Switch#sh dhcp snooping [binding]

Artık DHCP sunucumuz dışında kimse IP dağıtamayacak. Ancak hala başka bir sorun var ortada. Kullanıcılar, DHCP sunucudan sürekli IP adresi talep ederek IP havuzunu tüketebilirler. Bunu da önlememiz gerekiyor. Bunun için ise güvensiz bütün portlara bir sınırlama koymak mantıklı olur. Bunun için DHCP sunucusuna saniyede kaç paket gönderileceğini belirtelim. Saniyede en az iki paket gitsin ki kullanıcı IP alabilsin. Önceden anlattığımız gibi önce DHCP kim diye soran cihaz, daha sonra IP adresi istediğini teyit eden bir paket gönderiyordu. Saniyede giden paket sayısı ikinin altında olursa makine IP alamaz.

Switch(config)#interface fastEthernet 0/2

Switch(config-if)#ip dhcp snooping trust limit rate 2

Eğer kullanıcı saniyede ikiden fazla DHCP paketi gönderirse fazladan gönderdiği paketler çöpe atılır ve port bloklanır. İhtiyaç duyulursa, buradaki sınırlandırmayı güvenilir portlarda da yapabiliriz.

Artık güvenilir olmayan portlar arka arkaya istek atamıyor. Ancak paketleri daha yavaş göndererek de hala IP’leri bitirebilirler. Bunun için de bir porttan aynı anda en fazla kaç MAC adresi için IP istenebileceğini belirtebiliriz.

Switch(config)#interface fastEthernet 0/2

Switch(config-if)#switchport port-security

Switch(config-if)#switchport port-security maximum 3

Faydalandığım ve daha farklı örneklerin de bulunduğu kaynaklar: