Статья BruteForce, как недооцененный вид атаки (Account TakeOver)

r0hack

r0hack

DAG
Gold Team
29.09.2017
505
983
Всем Салам. Решил поднять тему BruteForce атак, хотя многие, с пеной во рту, очень часто кричат, что это никогда не прокатывает, зачем об этом писать, ужасный вид атаки и т.д.

t14m4t-automated-brute-forcing-attack-tool.1280x600.jpg


Но не буду сейчас кому-то пытаться доказывать, что bruteforce имеет место быть, что это очень эффективный вид атаки. Главное научиться, где и как её правильно применять. Не буду философствовать, сразу перейдем к делу.

Данная статья не обучение тому, как правильно брутфорсить. Я буду здесь описывать примеры, с которыми лично сам сталкивался во время пентеста и багбаунти.

Раньше не уделял особого внимания BruteForce атакам. И вот в начале этой осени во время пентеста я столкнулся с формой регистрации/авторизации пользователей по номеру телефона. И как уже можно догадаться, суть такой авторизации: пользователь вводит номер телефона и ему SMS-кой приходит код подтверждения. Длина кода может быть разной, чаще всего от 4 до 6 цифр. И как вы уже поняли, мы можем перебрать этот самый код из смс, чем он короче, тем легче перебрать. Кроме авторизации, также такое встречается в модуле сброса пароля. Если код будет 6 значный, то вероятность перебора не 100%, зависит от многих факторов:
  • от UpTime самого сервера.
Мне пока что везло, все сервера были с высоким аптаймом, что позволяло достаточно быстро перебирать.

  • от времени жизни кода
Время жизни кода везде разная. Где-то даже можно узнать из ответа, в течение какого времени она будет валидна.

  • от WAF, если он есть
  • от инструментов, с помощью которых это делаем
Инструменты, которые использую - это Burp Suite Intruder и если код 6 значный (в этом случае 1кк вариаций будет), использую Burp Suite Turbo Intruder.

account-takeover-fraud-1.jpg


После того, как я столкнулся с этим во время пентеста, решил также проверить На BugBounty. И вот оно, чудо, у одного только Mail было обнаружено на 4 разных сайтах отсутствие защиты от BruteForce SMS-кода и это приводит к захвату любого аккаунта (Account TakeOver), нужно знать только номер телефона.

Подробно про каждый случай, как находил не очевидную слабость в логике приложения, как брутил 6 значный код (1кк), который был активен 3 минуты, как правильно перебирать с помощью turbo intruder, расскажу чуть позже.
А сейчас покажу, как можно делать перебор в Intruder:

  1. Ловим запрос, при котором идет подтверждение кода, и отправляем его в Intruder, обычно что-то типа этого.
1.png


В данном случае, мы видим где у нас код. Выделяем ее для атаки и переходим на вкладку Payloads.

  1. На этой вкладке нам нужно создать payload. Так как перебираем числовой параметр в payload type выбираем numbers и указываем нужный нам интервал.
2.png


Тут все отлично, теперь переходим на вкладку Options.
  1. Тут уже зависит от UpTime сервера, если он быстрый, то можете уверенно заряжать много потоков.
  2. Start Attack ...ждём… Account Takeover.
Пруфы можно посмотреть здесь - (не все репорты еще закрыты)


Всем удачной охоты.
 
H

HebiNeco

Green Team
31.08.2019
69
9
Спасибо за статью, придал мотивацию изучить Burp Suite :)
 
  • Нравится
Реакции: f22
c0mb0

c0mb0

Well-known member
02.10.2018
48
16
Неплохо, думал над данной темой, но для обхода бана разделять диапазон 0..9999 по проксям +потоки
 
r0hack

r0hack

DAG
Gold Team
29.09.2017
505
983
Неплохо, думал над данной темой, но для обхода бана разделять диапазон 0..9999 по проксям +потоки
если там реально заложили защиту, это все не поможет. А правильная защита только одна - убивать код после 3 раз использования.
 
S

s9m3r

Member
09.12.2019
5
0
Ну такое... от голд тим ожидал чего-то весомее.
 
Z

zakrush

Red Team
21.03.2018
51
52
Похожая уязвимость была у Instagram. Там чел под 30т$ получил. Он предположил, что за 10 минут можно перебрать проксями 6ти или 8ми значный код AWS. Но вот ни где не найду уже информацию о том какой сервис AWS можно использовать.
 
Debug

Debug

Red Team
07.07.2017
189
391
мы выставили параметры словаря от 1 до 9999. То есть такие значения как 0101 оно пропустит? Мы же теряем около 10% всех возможных значений. Или я что-то не так понял?
 
r0hack

r0hack

DAG
Gold Team
29.09.2017
505
983
мы выставили параметры словаря от 1 до 9999. То есть такие значения как 0101 оно пропустит? Мы же теряем около 10% всех возможных значений. Или я что-то не так понял?
Да, там немного не правильно описал, нужно словарь делать, например, с помощью crunch. Где будут и те, которые начинаются с 0001....
 
  • Нравится
Реакции: Debug
Debug

Debug

Red Team
07.07.2017
189
391
Можно вопрос по теме? Допустим мы отослали 100 раз неправильный код на сервер и он нас не заблокировал, отослав 101 раз правильный код сервер ответил положительно. Вопрос в следующем, можно ли утверждать, что мы можем и 300 раз проверить код если не принимать uptime сервера?
 
mrOkey

mrOkey

Red Team
14.11.2017
768
774
Можно вопрос по теме? Допустим мы отослали 100 раз неправильный код на сервер и он нас не заблокировал, отослав 101 раз правильный код сервер ответил положительно. Вопрос в следующем, можно ли утверждать, что мы можем и 300 раз проверить код если не принимать uptime сервера?
Нет, это будет нашей гипотезой скорее. Но ее можно подтвердить с определенной долей вероятности р.
 
Debug

Debug

Red Team
07.07.2017
189
391
Нет, это будет нашей гипотезой скорее. Но ее можно подтвердить с определенной долей вероятности р.
Может есть вероятность, которую вы получили на практике, которая утверждает % что сервер примет код. Надеюсь правильно донёс мысль.
 
mrOkey

mrOkey

Red Team
14.11.2017
768
774
Может есть вероятность, которую вы получили на практике, которая утверждает % что сервер примет код. Надеюсь правильно донёс мысль.
Ну блин это «теория экспериментов». Ты запрашиваешь около 100 кодов (хотя для научного исследования это малая выборка, но тут сойдёт) и проверяешь на практике сколько кодов ты сбрутил. Отсюда получишь процент успеха. Если он 100% говорить о том что там нет защиты можно с 99% вероятностью. Если скажем 80% то скорее всего тебе везёт и следует проверить другие параметры, например, позицию кода в словаре, и да уже можно говорить о том что какая то защита присутствует. Но поняв почему у тебя 20% стали невалидны ты можешь найти что то новое)

если я тебя правильно понял. Но если ты про какой то общий процент - то его Вообще нет, так как это почти всегда частный случай. Или вернее частный случай для компонента
 
  • Нравится
Реакции: Debug
explorer

explorer

Red Team
05.08.2018
825
1 742
мы выставили параметры словаря от 1 до 9999. То есть такие значения как 0101 оно пропустит? Мы же теряем около 10% всех возможных значений. Или я что-то не так понял?
Привет багхантерам!
Справедливое замечание, кроме того в этом варианте он ещё и лишние с 1 до 999 будет перебирать. Сегодня набросал тузлу на питоне, которая за пару секунд сделает чёткий словарь, и притом хорошо перемешанный.
Enjoy it!

111.png


Python:
import itertools
import random
from time import process_time

print('Start process...')
start_time = process_time()
a = 0
for i in itertools.product('0123456789', repeat=4):
    a += 1
    x = ''.join(i)
    with open("brute_4.txt", 'a') as writer:
        writer.write(x + '\n')
print('Количество комбинаций:' + str(a))

with open("brute_4.txt", "r") as file:
    mix = file.readlines()

random.shuffle(mix)
with open("brute_4.txt", "w") as fid:
    if mix[-1][-1] == '\n':
        mix[-1] = mix[-1][:-1]
    fid.writelines(mix)
stop_time = process_time()
print('Done!')
print('Completed in:', "%.3f" % (stop_time - start_time), "seconds")
 
  • Нравится
Реакции: HebiNeco и Debug
r0hack

r0hack

DAG
Gold Team
29.09.2017
505
983
Привет багхантерам!
Справедливое замечание, кроме того в этом варианте он ещё и лишние с 1 до 999 будет перебирать. Сегодня набросал тузлу на питоне, которая за пару секунд сделает чёткий словарь, и притом хорошо перемешанный.
Enjoy it!

Посмотреть вложение 38639

Python:
import itertools
import random
from time import process_time

print('Start process...')
start_time = process_time()
a = 0
for i in itertools.product('0123456789', repeat=4):
    a += 1
    x = ''.join(i)
    with open("brute_4.txt", 'a') as writer:
        writer.write(x + '\n')
print('Количество комбинаций:' + str(a))

with open("brute_4.txt", "r") as file:
    mix = file.readlines()

random.shuffle(mix)
with open("brute_4.txt", "w") as fid:
    if mix[-1][-1] == '\n':
        mix[-1] = mix[-1][:-1]
    fid.writelines(mix)
stop_time = process_time()
print('Done!')
print('Completed in:', "%.3f" % (stop_time - start_time), "seconds")
такие словари с помощью crunch делаются
 
Мы в соцсетях: