Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2021-39115 — ईमेल टेम्पलेट्स में टेम्पलेट इंजेक्शन Jira Service Management Server पर कोड निष्पादन की ओर ले जाता है | Kitploit
उपकरण/GitHubGitHub/petrusviet/cve-2021-39115
भेद्यता विश्लेषणकोड विश्लेषणशोषणवेब एप्लिकेशन शोषणपेनिट्रेशन टेस्टिंगलर्निंग और शिक्षा
GitHubpetrusviet/cve-2021-39115

CVE-2021-39115

ईमेल टेम्पलेट्स में टेम्पलेट इंजेक्शन Jira Service Management Server पर कोड निष्पादन की ओर ले जाता है

रिपॉजिटरी देखें
481215 साल पहलेKitploit द्वारा समीक्षित

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2021-39115

ईमेल टेम्पलेट्स में Template Injection, Jira Service Management Server पर कोड निष्पादन की ओर ले जाता है

I) निर्माण

मैंने deploy + debug का निर्देश यहाँ दिया है, आप संदर्भ ले सकते हैं।

II) विश्लेषण

इस CVE के Description में भी स्पष्ट रूप से कहा गया है कि bug Email Template सुविधा में है। admin अधिकार के साथ, उपयोगकर्ता सूचना ईमेल के टेम्पलेट को स्वेच्छा से संपादित कर सकता है। इस bug को करने के लिए admin अधिकार की आवश्यकता होती है, इसलिए RCE होने पर भी यह अधिक गंभीर नहीं है, लेकिन फिर भी मैंने मनोरंजन के उद्देश्य से blog लिखने का निर्णय लिया :) जो लोग SSTI सीख रहे हैं वे संदर्भ ले सकते हैं।

  • काम शुरू करते हुए, मैंने atlassian-jira-servicedesk-4.17.0-m0006-standalone deploy किया और diff करके देखा कि इसमें 4.18.0 संस्करण से क्या अंतर है: image

जब मैंने यह सब देखा, तो.... बेशक मैंने एक-एक फ़ाइल नहीं पढ़ी, मैं बहुत आलसी हूँ। मज़ाक कर रहा हूँ, वास्तव में security fix के अलावा, संस्करणों में सुविधाओं का उन्नयन + परिवर्तन भी होता है। सब कुछ diff करके ऐसे पढ़ना बहुत समय लेने वाला होता है। बेशक कुछ मामलों में मुझे सब कुछ diff करके पढ़ना पड़ता है, लेकिन इस मामले में मैंने ऐसा नहीं किया =)))

  • जैसा ऊपर बताया गया है, admin के पास सभी सूचना ईमेल के टेम्पलेट बदलने का अधिकार है। इसलिए, पहला कदम यह जानना है कि सूचना ईमेल को parse करने की प्रक्रिया में कौन-से context होते हैं? यह विशेष रूप से महत्वपूर्ण है जब SSTI bug (जो sandbox का उपयोग करता है) का शोषण करना चाहते हैं। सबसे प्रभावी तरीका यह है कि email template parse करने वाले भाग में debug करके context चर का मान देखें।
  • बेशक कई अलग-अलग प्रकार की सूचनाएँ होंगी (SignUp, change Password,...), प्रत्येक एक अलग endpoint का उपयोग करेगी। मैंने सूचना ईमेल बनाने के लिए SendBulkMail सुविधा का उपयोग किया। इस endpoint का stack call कैसा है, इसका उल्लेख मैं लंबाई से बचने के लिए नहीं करूँगा क्योंकि यह CVE-2019-11581 के stack call के समान है।

SimpleNote.render फ़ंक्शन पर, मैं context चर देख सकता हूँ कि मैं क्या-क्या उपयोग कर सकता हूँ:

अपने निजी अनुभव के अनुसार, मैं उन context/class की जाँच पर ध्यान देता हूँ जिनमें Utils, Manager, service,... जैसे कीवर्ड होते हैं। मैंने ध्यान दिया कि $jirautils context (class com.atlassian.jira.util.JiraUtils) में method public static <T> T loadComponent(String className, Class<?> callingClass) है:

मैंने docs खोजकर पढ़ा कि इसका कार्य क्या है और इसका उपयोग कैसे करें, क्योंकि input में String className है और output एक class है, इसलिए संभवतः यह method मनमाने ढंग से class load कर सकता है:

  • जैसा docs में कहा गया है, यह फ़ंक्शन class load करने के लिए है :) मैंने तुरंत जाँचना शुरू किया कि क्या यह method वास्तव में मनमाना class load कर सकता है:

मैंने System -> Email templates में जाकर वर्तमान template फ़ाइल अपनी मशीन पर डाउनलोड की

कई अलग-अलग टेम्पलेट हैं, प्रत्येक एक अलग प्रकार की सूचना के लिए उपयोग होता है, इसलिए मैंने ऐसी फ़ाइल खोजी जो कई प्रकार की सूचनाओं के लिए साझा उपयोग की जा सके, जैसे email\html\includes\header.vm

संपादित template फ़ाइल अपलोड करने के बाद, मैंने एक सूचना ईमेल भेजने के लिए SendBulkMail का उपयोग किया। मुझे ईमेल में ऐसा output मिला:

मोटे तौर पर, इस class में constructors नहीं हैं या इसे स्वीकार नहीं किया गया। मैंने एक अन्य class आज़माया जिसमें constructors हैं (बिना input वाले constructors) और देखा:

और परिणाम बिल्कुल अपेक्षित था। मैंने class सफलतापूर्वक प्राप्त कर लिया:

  • इस प्रकार हम लगभग मनमाना class load कर सकते हैं, यह काफी अच्छा है। लेकिन RCE कैसे संभव हो ??? jira velocity template का उपयोग करता है और इसमें काफी पूर्ण sandbox है, जिसमें blacklist packages और blacklist class हैं (blacklist class के साथ यह blacklist में मौजूद class से extends होने वाले सभी class को भी ब्लॉक कर सकता है)। इंटरनेट पर public किए गए class का उपयोग करना लगभग असंभव है। यहाँ मुझे vulnerable संस्करण और patch संस्करण के बीच diff करना ही पड़ा कि वे कैसे भिन्न हैं; बेशक मैं पूरा diff नहीं करूँगा, बल्कि केवल velocity का conf फ़ाइल (\atlassian-jira\WEB-INF\classes\velocity.properties) diff करूँगा, यह देखने के लिए कि कुछ नया update है या नहीं:

हम देखते हैं कि blacklist में 3 class जोड़े गए हैं:

root@kitploit:~
org.springframework.expression.spel.standard.SpelExpressionParser,\
com.atlassian.jira.component.ComponentAccessor,\
com.atlassian.jira.plugin.ComponentClassManager

प्रत्येक class की जाँच करने पर, मैंने पाया कि SpelExpressionParser class में public SpelExpression parseRaw(String expressionString) फ़ंक्शन है; थोड़ी देर google पर उपयोग का तरीका खोजने पर, मोटे तौर पर इसे ऐसे उपयोग किया जा सकता है:

root@kitploit:~
#set($SpelExpressionParser = $jirautils.loadComponent('org.springframework.expression.spel.standard.SpelExpressionParser',$i18n.getClass()))
$SpelExpressionParser.parseRaw("T(java.lang.Runtime).getRuntime().exec('calc')")

जैसा आप देख सकते हैं, parseRaw फ़ंक्शन एक object लौटाता है जो org.springframework.expression.spel.standard.SpelExpression class है, यह हमारे द्वारा दिए गए expression को वास्तव में render नहीं करता। मैंने SpelExpression class में जाकर देखा और getValue method पाया:

root@kitploit:~
@Nullable
    public Object getValue() throws EvaluationException {
        CompiledExpression compiledAst = this.compiledAst;
        if (compiledAst != null) {
            try {
                EvaluationContext context = this.getEvaluationContext();
                return compiledAst.getValue(context.getRootObject().getValue(), context);
            } catch (Throwable var4) {
                if (this.configuration.getCompilerMode() != SpelCompilerMode.MIXED) {
                    throw new SpelEvaluationException(var4, SpelMessage.EXCEPTION_RUNNING_COMPILED_EXPRESSION, new Object[0]);
                }
            }

            this.compiledAst = null;
            this.interpretedCount.set(0);
        }

        ExpressionState expressionState = new ExpressionState(this.getEvaluationContext(), this.configuration);
        Object result = this.ast.getValue(expressionState);
        this.checkCompile(expressionState);
        return result;
    }

input/output को देखकर, मेरे जैसा आध्यात्मिक किस्म का व्यक्ति docs देखे बिना ही सीधे आज़माने का निर्णय लेता है:

root@kitploit:~
#set($SpelExpressionParser = $jirautils.loadComponent('org.springframework.expression.spel.standard.SpelExpressionParser',$i18n.getClass()))
$SpelExpressionParser.parseRaw("T(java.lang.Runtime).getRuntime().exec('calc')").getValue()

और परिणाम:

III) निष्कर्ष

इस प्रकार हम RCE के लिए velocity के sandbox को bypass कर सकते हैं, लेकिन जब मैं खुद को इस bug के खोजकर्ता author की स्थिति में रखता हूँ, तो कई प्रश्न हैं जिन्हें मैं समझा नहीं सकता:

  • blacklist में 3 class तक क्यों जोड़े गए?

जब मैंने इन 3 class का अध्ययन किया, तो मैंने पाया कि ये एक chain बना सकते हैं:

root@kitploit:~
ComponentAccessor.getComponentClassManager() 
  => ComponentClassManager.newInstance(String className) (Class này có thể load class tùy ý)
        => SpelExpressionParser

यदि author ने मेरी तरह $jirautils का उपयोग किया होता, तो उन अन्य 2 class की आवश्यकता नहीं होती। लेकिन यदि author ने $jirautils का उपयोग नहीं किया, तो ComponentAccessor कैसे प्राप्त होता???

  • author उपरोक्त 3 class कैसे खोज पाया? यह वह प्रश्न है जो मेरे मन में है और जिसे मैं सबसे अधिक जानना चाहता हूँ, लेकिन शायद author से सीधे संपर्क करके ही पता चलेगा। दुर्भाग्य से, मैं नहीं जानता कि इस bug का author कौन है।

IV) patch को bypass करना जारी रखें

टूल डाउनलोड करें