• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

Всем Салам. Решил поднять тему 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.
Пруфы можно посмотреть здесь - (не все репорты еще закрыты)


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

HebiNeco

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

c0mb0

Green Team
02.10.2018
52
19
BIT
13
Неплохо, думал над данной темой, но для обхода бана разделять диапазон 0..9999 по проксям +потоки
 

r0hack

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

zakrush

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

Debug

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

r0hack

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

Debug

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

mrOkey

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

Debug

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

mrOkey

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

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

explorer

Platinum
05.08.2018
1 081
2 469
BIT
14
мы выставили параметры словаря от 1 до 9999. То есть такие значения как 0101 оно пропустит? Мы же теряем около 10% всех возможных значений. Или я что-то не так понял?

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

111.png


Python:
Кто не успел, тот опоздал, кода больше нет...
 
  • Нравится
Реакции: 1984, HebiNeco и Debug

r0hack

DAG
Gold Team
29.09.2017
522
1 087
BIT
0
Привет багхантерам!
Справедливое замечание, кроме того в этом варианте он ещё и лишние с 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 делаются
 
  • Нравится
Реакции: ASMi386

Joseph Brosnen

Green Team
06.04.2020
12
1
BIT
0
Спасибо за статью)).
А скажите: что если мы просто будем не перебирать SMS-код, а запрашивать его каждый раз и вводить один и тот же код SMS в надежде,что он, однажды, придёт к пользователю. Тоесть: мы знаем,что код состоит из 4 цифр, всего 10к вариантов, мы просто вводим каждый раз "1234" и запрашиваем каждый раз SMS в надежде,что однажды пользователю придёт SMS с кодом "1234", мы его очередной раз введём и получим доступ к аккаунту. Может быть такое?
 
  • Нравится
Реакции: Techno Grover

r0hack

DAG
Gold Team
29.09.2017
522
1 087
BIT
0
Спасибо за статью)).
А скажите: что если мы просто будем не перебирать SMS-код, а запрашивать его каждый раз и вводить один и тот же код SMS в надежде,что он, однажды, придёт к пользователю. Тоесть: мы знаем,что код состоит из 4 цифр, всего 10к вариантов, мы просто вводим каждый раз "1234" и запрашиваем каждый раз SMS в надежде,что однажды пользователю придёт SMS с кодом "1234", мы его очередной раз введём и получим доступ к аккаунту. Может быть такое?
Может. Такой способ называется горизонтальный брутфорс.
И чем больше номеров будет, на которые мы будем запрашивать код, тем больше вероятность, чтобы быстрее найдем.
Ну такой логичен, если при подтверждении есть защита а в запросе кода - нет.
 

Joseph Brosnen

Green Team
06.04.2020
12
1
BIT
0
И чем больше номеров будет, на которые мы будем запрашивать код, тем больше вероятность, чтобы быстрее найдем.
А может быть такое,что один и тот же код придёт на несколько номеров? Если у нас есть аккаунт к которому мы можем восстановить доступ по SMS, к аккаунту привязан только один номер, мы должны восстанавливать доступ к нескольким аккаунтам одновременно, правильно?
 

r0hack

DAG
Gold Team
29.09.2017
522
1 087
BIT
0
А может быть такое,что один и тот же код придёт на несколько номеров?
Ну да. Теория вероятностей.
Если у нас есть аккаунт к которому мы можем восстановить доступ по SMS, к аккаунту привязан только один номер, мы должны восстанавливать доступ к нескольким аккаунтам одновременно, правильно?
Не понял
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!