
CVE-2020-13277 लैब: GitLab लॉजिक भेद्यता - किसी भी उपयोगकर्ता द्वारा निजी रिपॉजिटरी तक अनधिकृत पहुँच
CVE-2020-13277 प्रशिक्षण मैदान: Gitlab तार्किक भेद्यता - किसी भी उपयोगकर्ता द्वारा निजी रिपॉजिटरी तक अनधिकृत पहुँच
CVE-2020-13277
├── README.md ............... [यह README विवरण]
├── imgs .................... [README विवरण में सहायक चित्र]
├── gitlab .................. [Gitlab कंटेनर का माउंट निर्देशिका]
│ ├── Dockerfile .......... [Gitlab का Docker निर्माण फ़ाइल]
│ ├── config .............. [Gitlab कॉन्फ़िग माउंट निर्देशिका]
│ ├── data ................ [Gitlab डेटा माउंट निर्देशिका]
│ ├── logs ................ [Gitlab लॉग माउंट निर्देशिका]
│ ├── keys ................ [Gitlab क्रैक लाइसेंस भंडारण निर्देशिका]
│ └── runner .............. [Runner कंटेनर का माउंट निर्देशिका]
├── license ................. [क्रैक लाइसेंस कंटेनर निर्माण निर्देशिका]
│ ├── Dockerfile .......... [लाइसेंस का Docker निर्माण फ़ाइल]
│ └── license.rb .......... [क्रैक लाइसेंस उत्पन्न करने के लिए Ruby स्क्रिप्ट]
├── docker-compose.yml ...... [Docker का निर्माण कॉन्फ़िग]
├── keygen.ps1 .............. [Windows: एक-क्लिक क्रैक लाइसेंस उत्पन्न करें]
├── keygen.sh ............... [Linux: एक-क्लिक क्रैक लाइसेंस उत्पन्न करें]
├── run.ps1 ................. [Windows: एक-क्लिक Gitlab प्रशिक्षण मैदान चलाएँ]
├── run.sh .................. [Linux: एक-क्लिक Gitlab प्रशिक्षण मैदान चलाएँ]
├── register.ps1 ............ [Windows: एक-क्लिक Runner पंजीकृत करें]
├── register.sh ............. [Linux: एक-क्लिक Runner पंजीकृत करें]
├── stop.ps1 ................ [Windows: एक-क्लिक Gitlab प्रशिक्षण मैदान रोकें]
└── stop.sh ................. [Linux: एक-क्लिक Gitlab प्रशिक्षण मैदान रोकें]
इस भेद्यता का मुख्य उपयोग Mirror Repository - रिपॉजिटरी की मिरर सिंक बैकअप सुविधा पर आधारित है।
इसमें Mirror की सिंक दिशा दो प्रकार की होती है:
यह भेद्यता Pull दिशा के Mirror Repository का उपयोग करती है
जान लें कि Gitlab CE (समुदाय मुफ्त संस्करण) और EE (उद्यम भुगतान संस्करण) दो संस्करणों में विभाजित है, और Gitlab आधिकारिक तौर पर दावा करता है कि यह भेद्यता CE और EE दोनों के निम्नलिखित संस्करणों को प्रभावित करती है:
>=10.6, <12.9.10>=12.10, <12.10.11>=13.0, <13.0.6लेकिन इसका मतलब यह नहीं है कि इन संस्करणों के Gitlab Docker Image सभी प्रशिक्षण मैदान के लिए उपयोग किए जा सकते हैं, इसका कारण है:
दूसरे शब्दों में, Docker का उपयोग करके प्रशिक्षण मैदान बनाने के लिए, केवल Gitlab-EE संस्करण चुनना होगा और इसे क्रैक करना होगा (अमीर लोग लाइसेंस खरीदना भी चुन सकते हैं) ताकि Mirror Repository - Pull सुविधा सक्रिय हो सके।
लेकिन Gitlab-EE को क्रैक करने के बाद भी, चाहे 10.x, या , जब Mirror Repository - Pull का URL स्थानीय पथ शामिल करता है, तो त्रुटि दिखाई देगी।
./keygen.sh या ./keygen.ps1./run.sh या ./run.ps1पहले क्रैक कुंजी युग्म उत्पन्न करते समय, सार्वजनिक कुंजी पहले ही Gitlab कंटेनर बैकग्राउंड में लिखी जा चुकी है, अब निजी कुंजी को फ्रंटएंड के माध्यम से Gitlab पर अपलोड करके क्रैक पूरा करना आवश्यक है:
./gitlab/keys/ निर्देशिका में उत्पन्न होता है, उसके अंतर्गत .gitlab-license की सामग्री (निजी कुंजी) कॉपी करेंEnter license key चुनें और निजी कुंजी चिपकाएँ, फिर Upload license बटन दबाकर क्रैक पूरा करेंइस प्रकार Mirror Repository - Pull सुविधा सक्रिय हुई

Outbound requests ढूँढें और Allow requests to the local network from hooks and services चेक करके सहेजेंइस प्रकार Mirror Repository - Pull अब स्थानीय Repository खींचने का समर्थन करता है

./register.sh $TOKEN या ./register.ps1 $TOKENइस प्रकार सभी Repository इस Runner का उपयोग करके CI स्क्रिप्ट (Pipeline Jobs) निष्पादित कर सकते हैं

सत्यापन प्रक्रिया के लिए आधिकारिक Issue का संदर्भ लिया जा सकता है, लेकिन नीचे दी गई सत्यापन प्रक्रिया इस प्रशिक्षण मैदान के अनुसार कुछ चरणों को समायोजित करेगी
root उपयोगकर्ता के साथ http://127.0.0.1/admin/users पृष्ठ खोलकर 3 खाते बनाएँ:
victim: पीड़ित खाताattacker1: हमलावर खाता 1attacker2: हमलावर खाता 2खाता बनाते समय प्रारंभिक पासवर्ड सेट नहीं किया जा सकता, Gitlab डिफ़ॉल्ट रूप से प्रारंभिक पासवर्ड निर्धारित ईमेल पर भेजता है। सुविधा के लिए, वास्तव में मनमाना ईमेल भर सकते हैं, पहले खाता बनाएँ, फिर तुरंत उस खाते को संपादित करें, इस प्रकार root द्वारा उस खाते का प्रारंभिक पासवर्ड सेट किया जा सकता है, बिना ईमेल के

victim खाते से Gitlab में लॉगिन करेंNew Project बनाएँ:
targetPrivateREADME.md फ़ाइल बनाएँ, मनमानी सामग्री सेट करें जैसे mykey is abcxyzस्पष्ट रूप से
targetvictimकी निजी रिपॉजिटरी है, और हमारा लक्ष्य भेद्यता का उपयोग करके इस रिपॉजिटरी की सामग्री प्राप्त करना है

attacker1 खाते से Gitlab में लॉगिन करेंNew Project बनाएँ:
pocPublic.gitlab-ci.yml फ़ाइल बनाएँ, इसकी सामग्री:image: "ruby:2.6"
rspec:
script:
- git clone http://gitlab-ci-token:[email protected]/victim/target.git
- cd target
- ls -lah .
- cat README.md
【उद्देश्य】 आगामी कार्यों में, कुछ तकनीकों का उपयोग करके victim को बिना जानकारी के अपनी अनुमति से इस CI स्क्रिप्ट को निष्पादित करने के लिए प्रेरित किया जाएगा।
क्योंकि वर्तमान प्रशिक्षण मैदान में कोई प्रमाणपत्र सेट नहीं है, इसलिए केवल
httpप्रोटोकॉल का उपयोग किया जा सकता है; इसके अलावा172.168.30.2वह IP है जोdocker-compose.ymlने Gitlab कंटेनर को आवंटित किया है, क्योंकि यह CI स्क्रिप्ट अंततः Runner के माध्यम से निष्पादित होगी, और वर्तमान प्रशिक्षण मैदान में Runner और Gitlab एक ही कंटेनर नहीं हैं, इसलिए Docker द्वारा आवंटित IP पते का उपयोग करना होगा

attacker2 खाते से Gitlab में लॉगिन करेंNew Group बनाएँ:
testPublictest समूह के अंदर पूरी तरह से खाली नया Repository New Project बनाएँ:
pocPublic
मिरर रिपॉजिटरी कॉन्फ़िगर करें Settings => Repository => Pull from a remote repository:
Mirror repository: चेक करेंGit repository URL: http://GITLAB/attacker1/poc भरेंPassword: (खाली छोड़ें, Pull किए जाने वाले रिपॉजिटरी का स्तर Public है, पासवर्ड की आवश्यकता नहीं)Trigger pipelines for mirror updates: चेक करें (मिरर सिंक होने पर CI स्क्रिप्ट निष्पादन ट्रिगर करता है)कॉन्फ़िगरेशन सफल होने के बाद, हर 30 मिनट में जांचा जाता है कि स्रोत रिपॉजिटरी में बदलाव हुआ है या नहीं, यदि बदलाव हुआ तो बलपूर्वक सिंक किया जाता है।
Git repository URLपहले बनाए गए poc रिपॉजिटरी को इंगित करता है, 127.0.0.1 का उपयोग नहीं किया गया क्योंकि Pull स्थानीय रिपॉजिटरी को खींचने की अनुमति नहीं देता है, लेकिन DNS बाईपास का उपयोग किया जा सकता है:GITLABवह होस्टनेम है जोdocker-compose.ymlने Gitlab कंटेनर को आवंटित किया है, डिफ़ॉल्ट रूप से इसे/etc/hostsमें सेट किया जाता है, हालाँकि होस्ट मशीनGITLABको हल नहीं कर सकती, लेकिन कंटेनर के अंदर यहhttp://127.0.0.1/attacker1/pocतक पहुँचने के समान है

attacker2 खाते का उपयोग जारी रखेंtest समूह के उपयोगकर्ताओं का प्रबंधन करेंvictim उपयोगकर्ता को समूह में जोड़ें:
Add new member to test: victimPermissions: OwnerExpiration date: (खाली छोड़ें, अर्थात अनंत काल)=> Setting => Account => Delete account वर्तमान खाता (attacker2) हटाएँ【उद्देश्य】 test समूह में केवल victim और attacker2 दो Owner हैं, जब attacker2 उपयोगकर्ता हटा दिया जाता है, तो test समूह और इसके अंतर्गत सभी रिपॉजिटरी का स्वामित्व बलपूर्वक victim के नाम पर स्थानांतरित हो जाता है। और वर्तमान test समूह के अंतर्गत attacker1/poc से मिरर सिंक किया गया test/poc रिपॉजिटरी है, अर्थात test/poc रिपॉजिटरी को बलपूर्वक victim उपयोगकर्ता को हस्तांतरित कर दिया जाता है।


पहले अब तक की स्थिति का विश्लेषण करें:
victim के लिए एक test/poc रिपॉजिटरी बनाईtest/poc रिपॉजिटरी की सामग्री attacker1/poc रिपॉजिटरी से मिरर सिंक की गई है (हर 30 मिनट में जांचा जाता है कि बदलाव हुआ है और सिंक की आवश्यकता है)attacker1/poc रिपॉजिटरी की सामग्री हमलावर द्वारा नियंत्रित है, जिसमें CI स्क्रिप्ट .gitlab-ci.yml शामिल हैtest/poc रिपॉजिटरी ने Trigger pipelines for mirror updates सेट किया है, हर बार सिंक होने पर CI स्क्रिप्ट निष्पादित होती हैtest/poc रिपॉजिटरी का Owner victim है, इसलिए CI स्क्रिप्ट निष्पादित करते समय victim की अनुमति का उपयोग होता है
पहले सेट किए गए CI स्क्रिप्ट .gitlab-ci.yml की सामग्री की समीक्षा करें, यह poc Runner में victim की अनुमति का उपयोग करके उसके Private रिपॉजिटरी target की निर्देशिका संरचना और README.md तक पहुँचता है:
image: "ruby:2.6"
rspec:
script:
- git clone http://gitlab-ci-token:[email protected]/victim/target.git
- cd target
- ls -lah .
- cat README.md
इसके बाद हमलावर को केवल attacker1/poc रिपॉजिटरी में कुछ अप्रासंगिक सामग्री को मनमाने ढंग से संशोधित करना होगा, सबसे बुरी स्थिति में केवल 30 मिनट तक प्रतीक्षा करनी होगी, फिर victim की अनुमति का उपयोग करके सेट किए गए CI स्क्रिप्ट को निष्पादित कर सकता है।
हालाँकि हमलावर के पास Pipeline Jobs के निष्पादन परिणामों तक सीधी पहुँच नहीं है, लेकिन स्क्रिप्ट के आउटपुट लक्ष्य को समायोजित करके, जैसे रिपॉजिटरी की सामग्री को निर्दिष्ट ईमेल या FTP सर्वर पर भेजना, रिपॉजिटरी कोड चुराया जा सकता है।

12.x13.xImport url is blocked: Requests to localhost are not allowedजबकि Admin area => Settings => Network => Outbound requests सेट करके Allow requests to the local network from hooks and services सक्षम करने के बाद स्थानीय URL कॉन्फ़िगर किया जा सकता है, लेकिन मिरर सिंक करते समय त्रुटि 2:Fetching remote upstream failed: fatal: unable to access http://127.0.0.1/xxxx/: The requested URL returned error: 301 आएगी। दूसरे शब्दों में केवल Pull Remote Repository उपलब्ध है।
हालाँकि, यद्यपि 12.x और 13.x स्थानीय URL के निर्धारण में बहुत सख्त हैं, 10.x संस्करण में एक उपाय है: Pull URL कॉन्फ़िगर करते समय, केवल स्थानीय रूप से सेट किए गए DNS सेवा नाम का उपयोग करके बाईपास किया जा सकता है।
उपरोक्त से निष्कर्ष निकलता है कि अंततः केवल gitlab-ee:10.6.0-ee.0 संस्करण का Docker Image इस प्रशिक्षण मैदान के लिए उपयोग किया जा सकता है।
वास्तव में पूर्व विवरण से यह भी पता चलता है कि इस भेद्यता के उपयोग की शर्तें बहुत कड़ी हैं, मूलतः गरीब लोगों को इस भेद्यता से प्रभावित होने की संभावना नहीं है।