GCP - Привілейоване підвищення в Artifact Registry
Reading time: 6 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.
Artifact Registry
Для отримання додаткової інформації про Artifact Registry дивіться:
artifactregistry.repositories.uploadArtifacts
З цією дозволом зловмисник може завантажувати нові версії артефактів з шкідливим кодом, наприклад, Docker-образи:
# Configure docker to use gcloud to authenticate with Artifact Registry
gcloud auth configure-docker <location>-docker.pkg.dev
# tag the image to upload it
docker tag <local-img-name>:<local-tag> <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
# Upload it
docker push <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
caution
Було перевірено, що можливо завантажити новий шкідливий docker образ з таким же ім'ям та тегом, як у вже наявного, тому старий втратить тег і наступного разу, коли цей образ з цим тегом буде завантажено, буде завантажено шкідливий.
Завантажити бібліотеку Python
Почніть з створення бібліотеки для завантаження (якщо ви можете завантажити останню версію з реєстру, ви можете уникнути цього кроку):
- Налаштуйте структуру вашого проєкту:
- Створіть новий каталог для вашої бібліотеки, наприклад,
hello_world_library
. - Усередині цього каталогу створіть ще один каталог з ім'ям вашого пакету, наприклад,
hello_world
. - Усередині каталогу вашого пакету створіть файл
__init__.py
. Цей файл може бути порожнім або містити ініціалізації для вашого пакету.
mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
- Напишіть код вашої бібліотеки:
- Усередині каталогу
hello_world
створіть новий файл Python для вашого модуля, наприклад,greet.py
. - Напишіть вашу функцію "Hello, World!":
# hello_world/greet.py
def say_hello():
return "Hello, World!"
- Створіть файл
setup.py
:
- У корені вашого каталогу
hello_world_library
створіть файлsetup.py
. - Цей файл містить метадані про вашу бібліотеку та вказує Python, як її встановити.
# setup.py
from setuptools import setup, find_packages
setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Будь-які залежності, які потрібні вашій бібліотеці
],
)
Тепер давайте завантажимо бібліотеку:
- Скомпілюйте ваш пакет:
- З кореня вашого каталогу
hello_world_library
виконайте:
python3 setup.py sdist bdist_wheel
- Налаштуйте автентифікацію для twine (використовується для завантаження вашого пакету):
- Переконайтеся, що у вас встановлено
twine
(pip install twine
). - Використовуйте
gcloud
, щоб налаштувати облікові дані:
```
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
```
3. **Очистити збірку**
<div class="codeblock_filename_container"><span class="codeblock_filename_inner hljs">bash</span></div>
```bash
rm -rf dist build hello_world.egg-info
```
</details>
<div class="mdbook-alerts mdbook-alerts-caution">
<p class="mdbook-alerts-title">
<span class="mdbook-alerts-icon"></span>
caution
</p>
Немає можливості завантажити бібліотеку python з тією ж версією, що вже присутня, але можливо завантажити **більші версії** (або додати додатковий **`.0` в кінці** версії, якщо це працює - не в python, проте), або **видалити останню версію та завантажити нову з** (потрібно `artifactregistry.versions.delete)`**:**
```sh
gcloud artifacts versions delete <version> --repository=<repo-name> --location=<location> --package=<lib-name>
```
</div>
### `artifactregistry.repositories.downloadArtifacts`
З цією дозволом ви можете **завантажувати артефакти** та шукати **чутливу інформацію** та **вразливості**.
Завантажте **Docker** образ:
<div class="codeblock_filename_container"><span class="codeblock_filename_inner hljs">sh</span></div>
```sh
# Configure docker to use gcloud to authenticate with Artifact Registry
gcloud auth configure-docker <location>-docker.pkg.dev
# Dowload image
docker pull <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
```
Завантажте бібліотеку **python**:
<div class="codeblock_filename_container"><span class="codeblock_filename_inner hljs">bash</span></div>
```bash
pip install <lib-name> --index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@<location>-python.pkg.dev/<project-id>/<repo-name>/simple/" --trusted-host <location>-python.pkg.dev --no-cache-dir
```
- Що станеться, якщо змішати віддалені та стандартні реєстри в віртуальному, і пакет існує в обох? Перегляньте цю сторінку:
<a class="content_ref" href="../gcp-persistence/gcp-artifact-registry-persistence.md"><span class="content_ref_label">GCP - Artifact Registry Persistence</span></a>
### `artifactregistry.tags.delete`, `artifactregistry.versions.delete`, `artifactregistry.packages.delete`, (`artifactregistry.repositories.get`, `artifactregistry.tags.get`, `artifactregistry.tags.list`)
Видалити артефакти з реєстру, такі як образи docker:
<div class="codeblock_filename_container"><span class="codeblock_filename_inner hljs">bash</span></div>
```bash
# Delete a docker image
gcloud artifacts docker images delete <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
```
### `artifactregistry.repositories.delete`
Видалити повний репозиторій (навіть якщо він має вміст):
```
gcloud artifacts repositories delete <repo-name> --location=<location>
```
### `artifactregistry.repositories.setIamPolicy`
Зловмисник з цим дозволом міг би надати собі дозволи для виконання деяких з раніше згаданих атак на репозиторії.
### Пивотування до інших сервісів через читання та запис в Artifact Registry
- **Cloud Functions**
Коли створюється Cloud Function, новий docker-образ завантажується в Artifact Registry проекту. Я намагався змінити образ на новий, а також видалити поточний образ (і образ `cache`), але нічого не змінилося, Cloud Function продовжує працювати. Тому, можливо, **можливо зловживати атакою Race Condition** як з бакетом, щоб змінити docker-контейнер, який буде запущено, але **просто зміна збереженого образу не може скомпрометувати Cloud Function**.
- **App Engine**
Хоча App Engine створює docker-образи всередині Artifact Registry. Було протестовано, що **навіть якщо ви зміните образ всередині цього сервісу** і видалите екземпляр App Engine (щоб був розгорнутий новий), **виконуваний код не змінюється**.\
Можливо, що виконання **атаки Race Condition, як з бакетами, може дозволити перезаписати виконуваний код**, але це не було протестовано.
<div class="mdbook-alerts mdbook-alerts-tip">
<p class="mdbook-alerts-title">
<span class="mdbook-alerts-icon"></span>
tip
</p>
Вивчайте та практикуйте AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
Вивчайте та практикуйте GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
Вивчайте та практикуйте Azure Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
<details>
<summary>Підтримка HackTricks</summary>
- Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
- **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
- **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
</details>
</div>