• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Гостевая статья Взлом AWS Cognito неправильной конфигурации

В этом блоге , наш ведущий преподаватель учебного класса «Advanced Web Hacking», расскажет о том, как на практике происходит захват учетной записи AWS через неправильно настроенную AWS Cognito.
  • Тестируемое приложение имело только страницу входа в систему и не показывало функцию регистрации.
  • Целевое приложение использует AWS Cognito JavaScript SDK, который раскрывает идентификатор клиента приложения, идентификатор пула пользователей, идентификатор пула идентификаторов и информацию о регионе
  • AWS Cognito настроен неправильно, чтобы разрешить регистрацию нового пользователя
  • Зарегистрируйтесь и войдите в систему, чтобы получить временный токен AWS для аутентифицированных личностей.
  • У токена AWS есть доступ к функциям Lambda, который используется для повышения доступа
Amazon Cognito
Amazon Cognito управляет аутентификацией и авторизацией пользователей (RBAC). Пулы пользователей позволяют выполнять вход и подписку. Пулы удостоверений (федеративные удостоверения) позволяют аутентифицированным и неаутентифицированным пользователям получать доступ к ресурсам AWS с использованием временных учетных данных.

Вкратце, пул пользователей хранит всех пользователей, а пул удостоверений позволяет этим пользователям получать доступ к сервисам AWS.

На приведенном ниже рисунке показан процесс аутентификации и авторизации AWS Cognito. Пользователь аутентифицируется в пуле пользователей, и после успешной аутентификации пользовательский пул назначает 3 токена JWT (ID, Access и Refresh) пользователю. Идентификатор JWT передается в пул идентификационных данных для получения временных учетных данных AWS с ролями, назначенными поставщику идентификационных данных.

cognito-flow.png



Ссылка:

История атаки
Во время недавнего пентеста мы наткнулись на страницу входа. У него не было других функций, связанных с аутентификацией, таких как забытый пароль или страница регистрации.

login.png



В ходе дальнейшего расследования мы обнаружили, что приложение использует AWS Cognito для аутентификации и авторизации с использованием JavaScript SDK. SDK JavaScript для данных клиента, таких как идентификатор клиента приложения, идентификатор пула пользователей, идентификатор пула идентификаторов и информация о регионе, через файл конфигурации JavaScript. JavaScript SDK для AWS Cognito требует эту информацию для доступа к Cognito User Pool и проверки пользователей.

Amazon Cognito имеет режим аутентификации и неаутентификации для создания временных учетных данных AWS для пользователей. Права доступа без аутентификации могут быть получены любым пользователем, использующим определенный вызов API. Поэтому мы попытались получить доступ к учетным данным AWS с помощью неаутентифицированных идентификаторов, но доступ к неаутентифицированным идентификаторам был отключен.

Unautidentity-GetID-1.png



Здесь приведен интересный пример использования незащищенных удостоверений для служб AWS: .

В дальнейшем мы сосредоточились на выявлении доступных нам функций. Мы обнаружили, что приложение непреднамеренно раскрыло некоторые функциональные возможности из-за неправильной конфигурации AWS Cognito. Используя AppClientId, мы создали пользователя в пуле пользователей Amazon Cognito. Письмо с подтверждением было отправлено на указанный адрес электронной почты вместе с кодом подтверждения.

3.-Signup-1.png


Мы определили, что учетную запись пользователя можно подтвердить с помощью токена, полученного на зарегистрированном электронном письме, с помощью API ConfirmSignUp.

4.Sign-up-confirmation.png



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

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

login-error-1.png



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

GetCredentialsForIdentity-1.png


Теперь мы можем использовать интерфейс командной строки AWS (CLI) для взаимодействия со службами AWS:

CLI.png


С помощью команды «aws sts get-caller-identity» было установлено, что токен работает нормально.

get-caller-identity-2.png



Используя наши мы обнаружили, что токен AWS имеет полные разрешения для функций AWS Lambda. Это позволило нам изучить конфигурацию AWS Lambda клиента. Мы начали с просмотра списка функций Lambda:

aws лямбда-лист-функции

list-functions-2.png



Мы обнаружили, что одна из функций Lambda (RotateAccessKeys-CIS) имеет чрезмерно допустимые политики IAM.

aws iam list-attach-role-policy –role-name IAM-CIS

IAM-CIS.png



Мы решили изменить код функции Lambda (RotateAccessKeys-CIS) таким образом, чтобы он работал как требуется, но дополнительно выполнил команду, которая позволяла считывать учетные данные AWS из переменных среды.

Посмотрим, как мы модифицировали указанную функцию.

Мы загрузили код функции Lambda из расположения кода, как выделено

aws lambda get-function –function-name RotateAccessKeys-CIS –query 'Code.Location'

code.location.png


Функция lambda_handler в загруженном коде была изменена для печати переменных среды.

lambda-code.png


Кроме того, мы создали ZIP-файл, который содержал измененный код, чтобы он теперь выполнял измененную функцию Lambda после загрузки и запуска пакета.

zip-code.png



Лямбда функции «RotateAccessKeys-CIS» уа s обновлен.

aws лямбда-код-функции-обновления -function-name RotateAccessKeys-CIS -zip-файл fileb: ///root//lambda_function.zip

upload-lambda-function-1.png



После того, как код функции Lambda был обновлен, как и предполагалось, мы вызвали его, используя указанную ниже команду. Эта команда вызвала функцию и напечатала журнал на экране, который содержал временные учетные данные AWS.

aws lambda invoke –function-name RotateAccessKeys-CIS out –log-type Tail –query 'LogResult' –output text | base64 -d

invoke-lambda-1.png



Мы повторили те же шаги и определили набор временных учетных данных, которые были весьма разрешительными при полном доступе к IAM.

Затем мы настроили интерфейс командной строки AWS с использованием новых учетных данных AWS для создания нового пользователя nirahua и прикрепили управляемую политику AWS с именем AdministratorAccess к пользователю с помощью следующих команд.

aws iam create-user –user-name nirahua
aws iam create-login-profile –user-name nirahua –password s8iUzu ******
aws iam attach-user-policy –policy-arn arn: aws: iam :: aws: policy / AdministratorAccess –user-name nirahua


create-user-1.png


И, как вы можете видеть, мы успешно вошли в систему как администратор через консоль AWS с вновь созданным пользователем.

aws-admin-login.png


Рекомендации
  • Отключить регистрацию на AWS Cognito, если не требуется
  • Никогда не назначайте привилегии сверх необходимого минимума при настройке AWS Cognito для аутентифицированных и не аутентифицированных идентификаторов.
  • Используйте расширенные функции безопасности для Amazon Cognito, чтобы защитить пользователей приложений от несанкционированного доступа.


Источник:
 
Мы в соцсетях:

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