javascript

Подбираем пароли с помощью Google Chrome

  • среда, 10 января 2018 г. в 03:14:22
https://habrahabr.ru/post/346284/
  • Расширения для браузеров
  • Информационная безопасность
  • JavaScript
  • GreaseMonkey
  • Google Chrome


Согласно многочисленным исследованиям в области компьютерной безопасности, в ТОП-3 уязвимостей информационных систем входит подбор пароля.


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


В случае, если мы имеем какой-либо портал, где пользователи – это люди, то бОльшую часть уязвимых слабых паролей можно отнести к одной из 4 групп:


  1. Пароли, входящие в топ самых популярных фраз (такие как «123456», «password», и т.п.).
  2. Пароли, представляющие собой сочетание клавиш – так называемые keyboard-walks пароли (например, «qwerty», «qazwsx», и т.п.).
  3. Пароли – искажённые логины («user123», «user321», и т.п.).
  4. Либо использование в качестве пароля популярных русских слов или имён в «перевёрнутой» раскладке («ljcneg», «fylhtq»).

Вся беда в том, что большинство людей – причем как рядовых пользователей, так и администраторов систем – стремится использовать легко запоминающиеся пароли.


Из выделенных групп частых паролей вытекает, что при подборе пароля можно использовать соответственно 4 методики создания словарей:


  1. По данным сервиса haveibeenpwned.com, на сегодняшний день масштаб всеобщих утечек подбирается к цифре 5 миллиардов (вспомните myspace, linkedin, adobe и т.п). На основе части данных утечек можно выделить топ-1000 наиболее распространенных паролей. Например, так:
    cat antipublic/ exploitin/ | sed -rn 's/[^:]+:(.)/\1/p' | sort | uniq -c | sort -n -r | head 1000 > top1000.txt*
  2. Чуть больше года назад от создателя инструмента hashcat появилась замечательная утилита kwprocessor. С помощью нее можно сгенерировать все возможные сочетания клавиш под любую раскладку клавиатуры:
    kwp basechars/tiny.base keymaps/en.keymap routes/2-to-10-max-3-direction-changes.route | len.bin 6 100 > keywalks.txt
  3. Получение достаточно большого количества искажений для некоторого имени пользователя проще всего сделать при помощи набора правил утилиты hashcat:
    hashcat -r /usr/share/hashcat/rules/leetspeak.rule logins.txt --stdout > login_mutations.txt
  4. Аналогично первому пункту списка, можно взять за основу словаря масштабные утечки русскоязычных ресурсов.

Собранные наборы паролей в дальнейшем могут быть «скормлены» таким утилитам как hydra, medusa, ncrack или patator, в зависимости от тестируемого сервиса.


В случае, если аутентификация реализована через web, а именно через http-формы (то есть не http-basic/digest аутентификация), то удобнее всего воспользоваться функционалом intruder от burp suite free (Рисунок 1).


image

Рисунок 1 — Bruteforce-атака подручными средствами


В случае с burp нужно внимательно следить за размером ответа: изменение размера ответа можешь означать, что логин или пароль присутствует в системе.


Также при bruteforce-атаках на web возможны сложности (и речь даже не про captcha):


  • Во-первых, при каждой отправке формы может использоваться токен. И после каждой неудачной попытки он может меняться.
  • Во-вторых, нет точного образца ответа сервера в случае, если пароль угадан. Более того, возможны ситуации, когда ответ на правильные и неправильные учётные данные будет идентичен, а в ответе будет просто идти редирект через заголовок Location, где уже в дальнейшем будет ясно об успешности попытки входа.
  • В-третьих, некоторые веб-сервисы при аутентификации не отправляют введённые учётные данные, как они были введены, открытым текстом. Речь про случаи, когда используется client-side хэширования, причем сами хэш-функции могут быть уникальными (не md5, sha-x и т.п.).

Впрочем, для этих сложностей можно предложить решения:


  • Разработка скрипта, который будет парсить ответ от сервера, находить там токен, после чего подставлять его в следующий запрос.
  • Разработка скрипта, выполняющего при каждом ответе редирект и сравнение длины полученного ответа.
  • Анализ javascript-кода, выполняющего те или иные преобразования с введёнными данными, а после реализация данного алгоритма в своем скрипте.

Конечно, эти случаи не так часты. Однако порою, встретив подобную веб-форму, мы лишь вручную вводим туда дефолтные учётные записи и что-то тривиальное типа admin:admin.
Но что если производить брутфорс не на уровне http, а выше, на уровне интерфейса пользователя? Ведь если внедрить в контекст тестируемого веб-приложения javascript-код, который в цикле будет подставлять в форму заданные логин/пароли и отправлять её, то достаточно легко удастся обойти все перечисленные ранее сложности. Ведь по сути, вся работа при этом совершается браузером.


Реализовать это можно с помощью расширения для браузера greasemonkey и собственного javascript-кода, который будет жёстко заточен под разметку данной html-страницы. Но писать каждый раз js-код для каждой новой страницы неудобно. Удобнее всего было бы иметь всё это в виде отдельного расширения, в данном случае – для Google Chrome.


Всё, что потребуется, чтобы воспользоваться www_brute – это открыть какой-либо интересующий сайт и нажать на иконку расширения. Если всё сделано правильно, то появится примерно следующее (Рисунок 2).


image
Рисунок 2 — Добавление новой цели


Чтобы приступить к настройке брутфорса, нужно нажать на единственную кнопку – «плюс».
Вся настройка проста и сводится к двум моментам:


  • Выбор полей ввода данных — кнопка со стрелкой.
  • Выбор данных для ввода — следующая кнопка.

Перед выбором полей для ввода логина и пароля на странице сайта с формой, которую предстоит атаковать, будет внедрён скрипт, который последовательно отловит три нажатия на элементы страницы. Этими элементами должны быть поле username, password и кнопка отправки формы. Перечисленные элементы должны быть выбраны именно в данной последовательности (Рисунок 3).


image
Рисунок 3 — Выбор полей для ввода


При каждом нажатии на соответствующий элемент он будет становиться красным, что подтверждает его выбор. После выбора кнопки отправки данных страница может перезагрузиться (если она не использует ajax), в таком случае красное выделение пропадёт, но это нормально.


Тут очень важно отметить, что элементы ввода запоминаются по html-атрибутам и их значениям. Поэтому, если после отправки формы сайт «нарисует» другую форму, то при следующей попытке подбора поле ввода не будет найдено. Хотя логика поиска полей ввода допускает не полное соответствие атрибутов, всё же данную настройку лучше производить уже после хотя бы одной неудачной отправки учётных данных. Пример – facebook.com (Рисунки 4 и 5).


image
Рисунок 4 — Форма до первой попытки входа


image
Рисунок 5 — Форма после первой попытки входа


Словари поддерживаются для имен пользователей, паролей и фиксированных пар логин: пароль (combo) (Рисунок 6).


image
Рисунок 6 — Словари для bruteforce-атаки


Поскольку combo-словари используются для дефолтных учётных записей либо утечек, то вначале будут выбраны именно они. Затем будет выполнен полный перебор всех сочетаний имён пользователей и логинов. Причём будет выполнен перебор по каждому паролю всех логинов – для минимизации возможных блокировок пользователей при неудачных попытках. Итого общее количество попыток можно будет вычислить по формуле:


length(combo) + length(passwords) * length(users)


По окончании всех настроек можно начинать:


image
Рисунок 7 — Bruteforce-атака в действии


Значения username и password в popup-окне расширения — это следующие кандидаты на ввод.
Логика работы достаточно проста и заключается в переборе всех заданных сочетаний логин/пароль, а так же пар логин: пароль в цикле до тех пор пока:


  • не кончится словарь;
  • не исчезнет поле ввода – что может означать успешность входа (либо блокировку).
    Вся статистика подбора пароля отображается в режиме реального времени:

image
Рисунок 8 — Процесс bruteforce-атаки на множество целей


Зелёным выделено то, что удалось подобрать, красным — безуспешная попытка. В ходе работы можно спокойно переключиться на другую вкладку либо полностью свернуть окно браузера, ведь как мы помним, брутфорс делает сам браузер, а мы лишь немного ему в этом помогаем.


Перебор пароля можно легко «распараллелить». Для этого достаточно просто открыть ещё одну или несколько вкладок на том же домене.


В любой момент времени брутфорс любого сайта может быть поставлен на паузу. Стоит заметить, что плагин не имеет обратной связи с ответами сервера, поэтому (особенно в случае с ajax) нужно правильно выбрать интервал между попытками. Не рекомендуется ставить слишком маленькое значение интервала.


Конечно данный способ никак не обходит такую вещь, как captcha, так что брутфорс таких вещей, как gmail.com и им подобных, продлится не долго. Однако в сочетании с proxy/vpn можно что-нибудь придумать...


Что же касается таких вещей, как брутфорс админок разных CMS, систем мониторинга, самописных сайтов и прочих вещей, которыми обычно пестрят сетевые периметры разных компаний, то данный способ подходит как нельзя лучше.


Плагин для chrome, а так же словарь для топ-1000 паролей доступен на тут и в webstore.