Concourse Enumeration & Attacks
Concourse Enumeration & Attacks
AWS Hacking सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
User Roles & Permissions
Concourse में पाँच भूमिकाएँ होती हैं:
Concourse Admin: यह भूमिका केवल मुख्य टीम (डिफ़ॉल्ट प्रारंभिक concourse टीम) के मालिकों को दी जाती है। Admins अन्य टीमों को कॉन्फ़िगर कर सकते हैं (जैसे:
fly set-team
,fly destroy-team
...)। इस भूमिका की अनुमतियों को RBAC द्वारा प्रभावित नहीं किया जा सकता।owner: टीम के मालिक टीम के भीतर सब कुछ संशोधित कर सकते हैं।
member: टीम के सदस्य टीम की संपत्तियों के भीतर पढ़ और लिख सकते हैं लेकिन टीम सेटिंग्स को संशोधित नहीं कर सकते।
pipeline-operator: पाइपलाइन ऑपरेटर पाइपलाइन संचालन कर सकते हैं जैसे कि बिल्ड को ट्रिगर करना और संसाधनों को पिन करना, हालांकि वे पाइपलाइन कॉन्फ़िगरेशन को अपडेट नहीं कर सकते।
viewer: टीम के दर्शकों को टीम और उसकी पाइपलाइनों तक "केवल-पढ़ने" की पहुंच होती है।
इसके अलावा, owner, member, pipeline-operator और viewer भूमिकाओं की अनुमतियों को RBAC कॉन्फ़िगर करके संशोधित किया जा सकता है (विशेष रूप से इसके कार्यों को कॉन्फ़िगर करके)। इसके बारे में और पढ़ें: https://concourse-ci.org/user-roles.html
ध्यान दें कि Concourse टीमों के अंदर पाइपलाइनों को समूहित करता है। इसलिए, किसी टीम से संबंधित उपयोगकर्ता उन पाइपलाइनों का प्रबंधन कर सकेंगे और कई टीमें मौजूद हो सकती हैं। एक उपयोगकर्ता कई टीमों से संबंधित हो सकता है और प्रत्येक में अलग-अलग अनुमतियाँ हो सकती हैं।
Vars & Credential Manager
YAML कॉन्फ़िग्स में आप ((_source-name_:_secret-path_._secret-field_))
सिंटैक्स का उपयोग करके मान कॉन्फ़िगर कर सकते हैं।
दस्तावेज़ से: source-name वैकल्पिक है, और यदि छोड़ा गया है, तो क्लस्टर-व्यापी क्रेडेंशियल मैनेजर का उपयोग किया जाएगा, या मान स्थिर रूप से प्रदान किया जा सकता है।
वैकल्पिक _secret-field_ एक फ़ील्ड को निर्दिष्ट करता है जिसे पढ़ने के लिए गुप्त से पढ़ा जाता है। यदि छोड़ा गया है, तो क्रेडेंशियल मैनेजर एक 'डिफ़ॉल्ट फ़ील्ड' पढ़ने का चयन कर सकता है यदि फ़ील्ड मौजूद है।
इसके अलावा, secret-path और secret-field को डबल उद्धरण "..."
से घेरा जा सकता है यदि उनमें .
और :
जैसे विशेष वर्ण शामिल हैं। उदाहरण के लिए, ((source:"my.secret"."field:1"))
secret-path को my.secret
और secret-field को field:1
पर सेट करेगा।
Static Vars
स्थिर वेरिएबल्स को tasks steps में निर्दिष्ट किया जा सकता है:
या निम्नलिखित fly
arguments का उपयोग करके:
-v
या--var
NAME=VALUE
स्ट्रिंगVALUE
को varNAME
के लिए मान के रूप में सेट करता है।-y
या--yaml-var
NAME=VALUE
VALUE
को YAML के रूप में पार्स करता है और इसे varNAME
के लिए मान के रूप में सेट करता है।-i
या--instance-var
NAME=VALUE
VALUE
को YAML के रूप में पार्स करता है और इसे instance varNAME
के लिए मान के रूप में सेट करता है। instance vars के बारे में अधिक जानने के लिए Grouping Pipelines देखें।-l
या--load-vars-from
FILE
FILE
को लोड करता है, एक YAML दस्तावेज़ जिसमें मानों के लिए मैपिंग var नाम होते हैं, और उन सभी को सेट करता है।
Credential Management
पाइपलाइन में Credential Manager को निर्दिष्ट करने के विभिन्न तरीके हैं, https://concourse-ci.org/creds.html में पढ़ें। इसके अलावा, Concourse विभिन्न credential managers का समर्थन करता है:
ध्यान दें कि यदि आपके पास किसी प्रकार की Concourse में write access है तो आप जॉब्स बना सकते हैं ताकि उन secrets को exfiltrate किया जा सके क्योंकि Concourse को उन तक पहुंचने में सक्षम होना चाहिए।
Concourse Enumeration
किसी concourse environment को enumerate करने के लिए सबसे पहले आपको valid credentials एकत्र करने की आवश्यकता है या किसी authenticated token को ढूंढना होगा, संभवतः .flyrc
config file में।
Login और Current User enum
लॉगिन करने के लिए आपको endpoint, team name (डिफ़ॉल्ट
main
है) और एक team जिसमें उपयोगकर्ता शामिल है जानना आवश्यक है:fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]
कॉन्फ़िगर किए गए targets प्राप्त करें:
fly targets
कॉन्फ़िगर किए गए target connection अभी भी valid है या नहीं प्राप्त करें:
fly -t <target> status
निर्दिष्ट target के खिलाफ उपयोगकर्ता की role प्राप्त करें:
fly -t <target> userinfo
ध्यान दें कि API token डिफ़ॉल्ट रूप से $HOME/.flyrc
में saved होता है, यदि आप किसी मशीन को लूट रहे हैं तो आप वहां credentials पा सकते हैं।
Teams & Users
Teams की सूची प्राप्त करें
fly -t <target> teams
टीम के अंदर roles प्राप्त करें
fly -t <target> get-team -n <team-name>
उपयोगकर्ताओं की सूची प्राप्त करें
fly -t <target> active-users
Pipelines
पाइपलाइनों की सूची:
fly -t <target> pipelines -a
पाइपलाइन yaml प्राप्त करें (संवेदनशील जानकारी परिभाषा में पाई जा सकती है):
fly -t <target> get-pipeline -p <pipeline-name>
सभी पाइपलाइन config declared vars प्राप्त करें
for pipename in $(fly -t <target> pipelines | grep -Ev "^id" | awk '{print $2}'); do echo $pipename; fly -t <target> get-pipeline -p $pipename -j | grep -Eo '"vars":[^}]+'; done
उपयोग की गई सभी pipelines secret names प्राप्त करें (यदि आप कोई जॉब बना सकते हैं/संशोधित कर सकते हैं या किसी कंटेनर को हाईजैक कर सकते हैं तो आप उन्हें exfiltrate कर सकते हैं):
Containers & Workers
workers की सूची बनाएं:
fly -t <target> workers
containers की सूची बनाएं:
fly -t <target> containers
builds की सूची बनाएं (देखने के लिए कि क्या चल रहा है):
fly -t <target> builds
Concourse Attacks
Credentials Brute-Force
admin:admin
test:test
Secrets और params enumeration
पिछले सेक्शन में हमने देखा कि आप पाइपलाइन द्वारा उपयोग किए गए सभी secrets नाम और vars कैसे प्राप्त कर सकते हैं। vars में संवेदनशील जानकारी हो सकती है और secrets के नाम बाद में उन्हें चुराने की कोशिश करने के लिए उपयोगी होंगे।
चल रहे या हाल ही में चले container के अंदर session
यदि आपके पास पर्याप्त विशेषाधिकार हैं (member role या अधिक) तो आप pipelines और roles की सूची बना सकते हैं और बस <pipeline>/<job>
container के अंदर एक session प्राप्त कर सकते हैं:
इन अनुमतियों के साथ आप सक्षम हो सकते हैं:
गुप्त जानकारी चुराना कंटेनर के अंदर
नोड पर भागने की कोशिश करें
क्लाउड मेटाडेटा एंडपॉइंट को सूचीबद्ध/दुरुपयोग करें (पॉड से और नोड से, यदि संभव हो)
पाइपलाइन निर्माण/संशोधन
यदि आपके पास पर्याप्त विशेषाधिकार हैं (सदस्य भूमिका या अधिक) तो आप नई पाइपलाइनों को बना/संशोधित कर सकेंगे। इस उदाहरण को देखें:
नए पाइपलाइन के संशोधन/निर्माण के साथ आप सक्षम होंगे:
गोपनीय जानकारी चुराना (उन्हें echo करके या कंटेनर के अंदर जाकर
env
चलाकर)नोड से बच निकलना (आपको पर्याप्त विशेषाधिकार देकर -
privileged: true
)क्लाउड मेटाडेटा एंडपॉइंट को सूचीबद्ध/दुरुपयोग करना (पॉड और नोड से)
बनाई गई पाइपलाइन को हटाना
कस्टम टास्क निष्पादित करें
यह पिछले तरीके के समान है लेकिन पूरी नई पाइपलाइन को संशोधित/बनाने के बजाय आप सिर्फ एक कस्टम टास्क निष्पादित कर सकते हैं (जो शायद बहुत अधिक गुप्त होगा):
विशेषाधिकार प्राप्त कार्य से नोड पर भागना
पिछले अनुभागों में हमने देखा कि कैसे concourse के साथ एक विशेषाधिकार प्राप्त कार्य निष्पादित करें। यह कंटेनर को बिल्कुल वैसी ही पहुंच नहीं देगा जैसी कि docker कंटेनर में विशेषाधिकार फ्लैग देता है। उदाहरण के लिए, आप /dev में नोड फाइलसिस्टम डिवाइस नहीं देखेंगे, इसलिए भागना अधिक "जटिल" हो सकता है।
निम्नलिखित PoC में हम कुछ छोटे संशोधनों के साथ release_agent का उपयोग करके भागने जा रहे हैं:
जैसा कि आपने देखा होगा, यह सिर्फ एक regular release_agent escape है, बस node में cmd के path को बदलना है।
Worker container से node में escape करना
इसके लिए एक सामान्य release_agent escape में थोड़े से संशोधन की आवश्यकता है:
वेब कंटेनर से नोड पर भागना
भले ही वेब कंटेनर में कुछ सुरक्षा उपाय अक्षम हों, यह सामान्य विशेषाधिकार प्राप्त कंटेनर के रूप में नहीं चल रहा है (उदाहरण के लिए, आप माउंट नहीं कर सकते और क्षमताएं बहुत सीमित हैं, इसलिए कंटेनर से भागने के सभी आसान तरीके बेकार हैं)।
हालांकि, यह स्थानीय क्रेडेंशियल्स को स्पष्ट पाठ में संग्रहीत करता है:
आप उन क्रेडेंशियल्स का उपयोग वेब सर्वर के खिलाफ लॉगिन करने और एक प्रिविलेज्ड कंटेनर बनाने और नोड पर एस्केप करने के लिए कर सकते हैं।
पर्यावरण में आप postgresql इंस्टेंस को एक्सेस करने के लिए जानकारी भी पा सकते हैं जो concourse उपयोग करता है (पता, username, password और अन्य जानकारी सहित डेटाबेस):
गार्डन सेवा का दुरुपयोग - वास्तविक हमला नहीं
यह सेवा के बारे में कुछ दिलचस्प नोट्स हैं, लेकिन क्योंकि यह केवल localhost पर सुन रहा है, यह नोट्स कोई ऐसा प्रभाव प्रस्तुत नहीं करेंगे जिसे हमने पहले से ही शोषित नहीं किया है।
डिफ़ॉल्ट रूप से प्रत्येक concourse worker पोर्ट 7777 में एक Garden सेवा चला रहा होगा। इस सेवा का उपयोग वेब मास्टर द्वारा worker को यह बताने के लिए किया जाता है कि उसे क्या निष्पादित करना है (छवि डाउनलोड करें और प्रत्येक कार्य चलाएं)। यह एक हमलावर के लिए काफी अच्छा लगता है, लेकिन कुछ अच्छी सुरक्षा हैं:
यह केवल स्थानीय रूप से उजागर (127.0.0.1) है और मुझे लगता है कि जब worker विशेष SSH सेवा के साथ वेब के खिलाफ प्रमाणित करता है, तो एक सुरंग बनाई जाती है ताकि वेब सर्वर प्रत्येक worker के अंदर प्रत्येक Garden सेवा से बात कर सके।
वेब सर्वर हर कुछ सेकंड में चल रहे कंटेनरों की निगरानी कर रहा है, और अप्रत्याशित कंटेनरों को हटा दिया जाता है। इसलिए यदि आप एक कस्टम कंटेनर चलाना चाहते हैं तो आपको वेब सर्वर और गार्डन सेवा के बीच संचार के साथ छेड़छाड़ करनी होगी।
Concourse workers उच्च कंटेनर विशेषाधिकारों के साथ चलते हैं:
हालांकि, /dev डिवाइस को माउंट करने जैसी तकनीकें या release_agent काम नहीं करेंगी (क्योंकि नोड की फाइलसिस्टम वाला वास्तविक डिवाइस सुलभ नहीं है, केवल एक वर्चुअल है)। हम नोड की प्रक्रियाओं तक पहुंच नहीं सकते, इसलिए कर्नेल एक्सप्लॉइट्स के बिना नोड से बाहर निकलना जटिल हो जाता है।
पिछले अनुभाग में हमने देखा कि कैसे एक प्रिविलेज्ड कंटेनर से बाहर निकला जा सकता है, इसलिए यदि हम वर्तमान वर्कर द्वारा बनाए गए प्रिविलेज्ड कंटेनर में कमांड्स को निष्पादित कर सकते हैं, तो हम नोड तक पहुंच सकते हैं।
ध्यान दें कि concourse के साथ खेलते समय मैंने देखा कि जब कुछ चलाने के लिए एक नया कंटेनर स्पॉन किया जाता है, तो कंटेनर प्रक्रियाएं वर्कर कंटेनर से सुलभ होती हैं, इसलिए यह ऐसा है जैसे एक कंटेनर अपने अंदर एक नया कंटेनर बना रहा हो।
एक चल रहे प्रिविलेज्ड कंटेनर के अंदर जाना
नया प्रिविलेज्ड कंटेनर बनाना
आप बहुत आसानी से एक नया कंटेनर बना सकते हैं (बस एक रैंडम UID चलाएं) और उस पर कुछ निष्पादित करें:
हालांकि, वेब सर्वर हर कुछ सेकंड में चल रहे कंटेनरों की जांच कर रहा है, और यदि कोई अप्रत्याशित कंटेनर पाया जाता है, तो उसे हटा दिया जाएगा। चूंकि संचार HTTP में हो रहा है, आप अप्रत्याशित कंटेनरों को हटाने से बचने के लिए संचार के साथ छेड़छाड़ कर सकते हैं:
संदर्भ
https://concourse-ci.org/vars.html
AWS Hacking सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Last updated