首页 科技内容详情
从mimikatz学习Windows平安之接见控制模子(一)

从mimikatz学习Windows平安之接见控制模子(一)

分类:科技

网址:

反馈错误: 联络客服

点击直达

登1登2登3代理

www.22223388.com)实时更新发布最新最快最有效的登1登2登3代理网址,包括新2登1登2登3代理手机网址,新2登1登2登3代理备用网址,皇冠登1登2登3代理最新网址,新2登1登2登3代理足球网址,新2网址大全。

,

从mimikatz学习Windows平安之接见控制模子(一)

从mimikatz学习Windows平安之接见控制模子(一)0x00 前言0x01 接见控制模子简介1. 接见令牌(Access Token)2. 平安形貌符(Security Descriptor)3. 权限检查的历程0x02 Mimikatz的Token模块1. token::whoami2. token::list3. token::elevate4. token::run5. token::revert0x03 令牌窃取1. 原理2. 行使0x04 参考链接

作者:Loong716@Amulab

0x00 前言

Mimikatz是法国平安研究员Benjamin Delpy开发的一款平安工具。渗透测试职员对mimikatz印象最深的一定就是抓取Windows凭证,但作者对它的形貌是“a tool I've made to learn C and make somes experiments with Windows security.”,实在它的功效不仅仅是抓取凭证,还包罗了许多Windows平安相关的手艺和知识

这里借用@daiker师傅的头脑导图,mimikatz的模块大致可分为几个部门:

因此文章也会大致分为windows 接见控制模子,windows 凭证以及加解密,windows AD 平安,windows 历程以及服务,mimikatz 其他模块五个小系列。之前自己一直想剖析mimikatz的相关功效,主要是出于以下缘故原由:

  • mimikatz中有许多功效行使了Windows的一些机制和特征,以changentlm为例,其行使MS-SAMR协议修改用户的密码,我们再凭证MS-SAMR或RPC举行知识延伸,一定也有不少收获

  • mimikatz中涉及大量内存的操作,其中运用的内存Patch手艺也被经常应用于一些平安机制的绕过(如绕过AMSI、Credential Guard等),于是自己想在剖析历程中通过windbg学到一些调试的技巧

  • mimikatz在实战中被杀的很厉害,领会响应原理可以自己实现响应功效

  • 学习/演习C语言 :D

mimikatz中与Windows接见控制模子相关的有privilege、token、sid三个模块,其划分对应特权、接见令牌、平安标识符三个知识,本文主要剖析token模块,并简要先容Windows接见控制模子

由于mimikatz代码逻辑较为庞大,涉及大量回调,因此文中代码都是经由简化的。文章可能也会有一些手艺上或者逻辑上的错误,还请师傅们指正

0x01 接见控制模子简介

Windows接见控制模子有两个基本组成部门:

  • 接见令牌(Access Token):包罗有关登任命户的信息

  • 平安形貌符(Security Descriptor):包罗用于珍爱平安工具的平安信息

1. 接见令牌(Access Token)

接见令牌(Access Token)被用来形貌一个历程或线程的平安上下文,用户每次登录乐成后,系统会为其确立接见令牌,该用户的所有历程也将拥有此接见令牌的副本

当线程与平安工具举行交互或实验执行需要特权的系统义务时,系统使用接见令牌来标识用户。使用windbg查看历程的token,其包罗信息如下图所示:

2. 平安形貌符(Security Descriptor)

平安形貌符(Security Descriptor)包罗与平安工具有关的平安信息,这些信息划定了哪些用户/组可以对这个工具执行哪些操作,平安形貌符主要由以下部门组成:

  • 所有者的SID

  • 组SID

  • 自主接见控制列表(DACL),划定哪些用户/组可以对这个工具执行哪些操作

  • 系统接见控制列表(SACL),划定哪些用户/组的哪些操作将被纪录到平安审计日志中

在windbg中查看一个平安工具的平安形貌符,可以清晰的看到平安形貌符的组成:

可以看到该平安形貌符的DACL中有三条ACE,ACE的类型都是ACCESS_ALLOWED_ACE_TYPE,Mask是权限掩码,用来指定对应的权限。以第一条ACE为例,其示意允许SID为S-1-5-32-544的工具能够对该平安工具做0x001fffff对应的操作

3. 权限检查的历程

当某个线程实验接见一个平安工具时,系统凭证平安工具的ACE对照线程的接见令牌来判断该线程是否能够对该平安工具举行接见。通常,系统使用请求接见的线程的主接见令牌。然则,若是线程正在模拟其他用户,则系统会使用线程的模拟令牌

此时将在该平安工具的DACL中按顺序检查ACE,直到发生以下事宜:

  • 某一条拒绝类型的ACE显式拒绝令牌中某个受信者的所有接见权限

  • 一条或多条允许类型的ACE允许令牌中列出的受信者的所有接见权限

  • 检查完所有ACE但没有一个权限显式允许,那么系统会隐式拒绝该接见

我们以微软文档中的图片为例,形貌一下整个历程:

  1. 线程A请求接见平安工具,系统读取ACE1,发现拒绝Andrew用户的所有接见权限,而线程A的接见令牌是Andrew,因此拒绝接见,并不再检查ACE2、ACE3

  2. 线程A请求接见,系统按顺序读取ACE,ACE1不适用,读取到ACE2发现适用,再读取到ACE3也适用,因此最终该用户拥有对该平安工具的读、写、执行权限

0x02 Mimikatz的Token模块

Mimikatz的token模块共有5个功效:

  • token::whoami:列出当前历程/线程的token信息

  • token::list:列出当前系统中存在的token

  • token::elevate:窃取其他用户的token

  • token::run:行使某用户权限运行指定程序

  • token::revert:恢复为原来的token

1. token::whoami

该功效用于列出当前历程/线程的token信息

只有一个可选参数/full,当指定该参数时会打印出当前token的组信息和特权信息:

该功效的原理大致如下:

  1. 通过OpenProcess()获取当前历程/线程的句柄

  2. 挪用GetTokenInformation()获取token的种种信息并输出

其焦点为挪用GetTokenInformation()来获取token的种种信息,我们先来看这个API界说

BOOL GetTokenInformation(
  HANDLE                  TokenHandle,
  TOKEN_INFORMATION_CLASS TokenInformationClass,
  LPVOID                  TokenInformation,
  DWORD                   TokenInformationLength,
  PDWORD                  ReturnLength
);

其中第二个参数是一个TOKEN_INFORMATION_CLASS枚举类型,我们可以通过指定它的值来获取token指定的信息

typedef enum _TOKEN_INFORMATION_CLASS {
  TokenUser,
  TokenGroups,
  TokenPrivileges,
  TokenOwner,
  TokenPrimaryGroup,
  TokenDefaultDacl,
  TokenSource,
  ...
} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;

例如获取token的SessionID并输出,可以使用以下代码:

if (!GetTokenInformation(hToken, TokenSessionId, &sessionId, sizeof(TokenSessionId), &dwSize))
{
 wprintf(L"[!] GetTokenInformation error: %u\n", GetLastError());
}

wprintf(L"\t%-21s: %u\n", L"Session ID", sessionId);

2. token::list

该功效是获取当前系统中所有的token,注重使用前需要先获取SeDebugPrivilege,否则列出的token不全

该功效原理大致如下:

  1. 挪用NtQuerySystemInformation()获取系统历程信息(如历程PID等)

  2. 循环遍历所有历程的PID,使用token::whoami功效中的方式对指定token信息举行输出

NtQuerySystemInformation()用来检索指定的系统信息:

__kernel_entry NTSTATUS NtQuerySystemInformation(
  SYSTEM_INFORMATION_CLASS SystemInformationClass,
  PVOID                    SystemInformation,
  ULONG                    SystemInformationLength,
  PULONG                   ReturnLength
);

其第一个参数是一个SYSTEM_INFORMATION_CLASS枚举类型,我们同样可以指定差异参数来获取差其余系统信息

以获取系统历程名和PID为例,代码如下:

PSYSTEM_PROCESS_INFORMATION pProcessInfo = NULL;
DWORD flag = TRUE;

pProcessInfo = (PSYSTEM_PROCESS_INFORMATION)malloc(dwSize);
ntReturn = NtQuerySystemInformation(SystemProcessInformation, pProcessInfo, dwSize, &dwSize);

while (ntReturn == STATUS_INFO_LENGTH_MISMATCH) {
 free(pProcessInfo);
 pProcessInfo = (PSYSTEM_PROCESS_INFORMATION)malloc(dwSize);
 ntReturn = NtQuerySystemInformation(SystemProcessInformation, pProcessInfo, dwSize, &dwSize);
}

while (flag)
{
 if (pProcessInfo->NextEntryOffset == 0)
  flag = FALSE;

 wprintf(L"%-15d", (DWORD)pProcessInfo->UniqueProcessId);
 wprintf(L"%-50s", (wchar_t*)pProcessInfo->ImageName.Buffer);

 pProcessInfo = (PSYSTEM_PROCESS_INFORMATION)((BYTE*)pProcessInfo + pProcessInfo->NextEntryOffset);
}

PS:根据该思绪,理论上行使CreateToolhelp32Snapshot() + Process32First()遍历历程PID也可以实现该功效

3. token::elevate

该模块用于窃取指定用户的token,共有7个可选参数,这些参数主要用来指定要窃取的token,若是不指定参数则默认窃取NT AUTHORITY\SYSTEM的token

  • /id:指定目的token的TokenID

    欧博Allbet

    欢迎进入欧博Allbet官网(www.aLLbetgame.us),欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

  • /domainadmin:窃取域管的token

  • /enterpriseadmin:窃取企业治理员的token

  • /admin:窃取内陆治理员的token

  • /localservice:窃取Local Service权限的token

  • /networkservice:窃取Network Service权限的token

  • /system:窃取SYSTEM权限的token

假设我们现在在目的机械上发现的域管权限的token

我们可以指定目的TokenID,或者使用/domainadmin来窃取域管的token,执行乐成后可以看到当前线程已经拥有域管的模拟令牌:

然后我们就可以在当前mimikatz上下文中使用域管身份执行操作了,如DCSync

该功效大致历程如下:

  1. 通过OpenProcess()获取当前历程/线程的句柄

  2. 挪用OpenProcessToken()打开与历程相关的token句柄

  3. 使用DuplicateTokenEx()使用目的历程token确立一个新的模拟token

  4. 挪用SetThreadToken()设置当前线程的token为上一步确立的新的模拟token

由于窃取token是Access Token行使的重点,该历程放在本文后面剖析

4. token::run

该功效是使用指定的token来运行程序,也可以使用token::elevate中的几个参数来指定运行程序的token,除此之外另有一个参数:

  • /process:指定要运行的程序,默认值为whoami.exe

其原理前三步与token::elevate大致相同,区别在于使用DuplicateTokenEx()窃取token后,该功效使用CreateProcessAsUser()来使用新的primary token确立一个历程

BOOL CreateProcessAsUserA(
  HANDLE                hToken,
  LPCSTR                lpApplicationName,
  LPSTR                 lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFOA        lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

确立历程后,行使匿名管道做历程间通讯,将新确立历程的尺度输出写入到匿名管道的write端,从管道read端读取数据举行回显(在webshell等非交互场景下很有用)

if (CreatePipe(&hStdoutR, &hStdoutW, &saAttr, 0))
{
 SetHandleInformation(hStdoutR, HANDLE_FLAG_INHERIT, 0);
 si.cb = sizeof(STARTUPINFO);
 si.hStdOutput = hStdoutW;
 si.hStdError = si.hStdOutput;
 si.dwFlags |= STARTF_USESTDHANDLES;

 if (CreateProcessWithTokenW(hDupToken, LOGON_WITH_PROFILE, NULL, cmd, CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &si, &pi))
 {
  CloseHandle(si.hStdOutput);
  si.hStdOutput = si.hStdError = NULL;
  while (ReadFile(hStdoutR, resultBuf, sizeof(resultBuf), &dwRead, NULL) && dwRead)
  {
   for (i = 0; i < dwRead; i++)
    wprintf(L"%c", resultBuf[i]);
  }

  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
 }
 else wprintf(L"CreateProcessWithTokenW error 0x%08X\n", GetLastError());

}
else wprintf(L"CreatePipe error! 0x%08X\n", GetLastError());

5. token::revert

该模块用来祛除线程的模拟令牌:


原理很简朴,直接使用SetThreadToken(NULL, NULL)即可将当前线程的token祛除

0x03 令牌窃取

在渗透测试中,窃取token是administrator -> system的常见手法之一,还经常被用于降权等用户切换操作

1. 原理

窃取token主要涉及以下几个API:

  1. OpenProcess

HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL  bInheritHandle,
  DWORD dwProcessId
);

该函数打开指定PID的历程的句柄,需要注重的是第一个参数dwDesiredAccess,主要会用到的是以下三个权限

  • PROCESS_ALL_ACCESS

  • PROCESS_QUERY_INFORMATION (0x0400)

  • PROCESS_QUERY_LIMITED_INFORMATION (0x1000)

我在编写窃取Token的代码时,发现对部门历程(如smss.exe、csrss.exe等)挪用OpenProcess会泛起拒绝接见的情形,查阅网上资料后发现这些历程存在珍爱,需要使用PROCESS_QUERY_LIMITED_INFORMATION权限打开句柄,详情请参考这篇文章

  1. OpenProcessToken

BOOL OpenProcessToken(
  HANDLE  ProcessHandle,
  DWORD   DesiredAccess,
  PHANDLE TokenHandle
);

该函数打开与历程相关联的令牌的句柄,其中第二个参数DesiredAccess同样用来指定令牌的接见权限,需要以下几个:

  • TOKEN_DUPLICATE:复制令牌需要的权限

  • TOKEN_QUERY:查询令牌需要的权限

若是要挪用DuplicateTokenEx需要指定TOKEN_DUPLICATE,若是挪用ImpersonatedLoggedOnUser则需要指定TOKEN_DUPLICATE和TOKEN_QUERY

  1. DuplicateTokenEx

BOOL DuplicateTokenEx(
  HANDLE                       hExistingToken,
  DWORD                        dwDesiredAccess,
  LPSECURITY_ATTRIBUTES        lpTokenAttributes,
  SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  TOKEN_TYPE                   TokenType,
  PHANDLE                      phNewToken
);

DuplicateTokenEx用来复制现有的令牌来天生一张新令牌,该函数可以选择天生主令牌照样模拟令牌

  • hExistingToken:指定现有的令牌句柄,可以使用OpenProcessToken获得

  • dwDesiredAccess:用来指定令牌接见权限,需要指定以下几个来支持后面挪用CreateProcessWithToken:

    • TOKEN_DUPLICATE:需要复制接见令牌

    • TOKEN_QUERY:需要查询接见令牌

    • TOKEN_ASSIGN_PRIMARY:将令牌附加到主历程的权限

    • TOKEN_ADJUST_DEFAULT:需要更改接见令牌的默认所有者、主要组或 DACL

    • TOKEN_ADJUST_SESSIONID:需要调整接见令牌的会话 ID,需要 SE_TCB_NAME 权限

  • lpTokenAttributes:指向SECURITY_ATTRIBUTES结构的指针,该 结构指定新令牌的平安形貌符并确定子历程是否可以继续该令牌

  • ImpersonationLevel:指定令牌的模拟级别,当举行复制令牌时,主令牌被复制为模拟令牌是始终被允许的,而模拟令牌复制为主令牌则需要模拟级别 >= Impersonate

  • TokenType:指定新令牌的类型,是主令牌(Primary Token)照样模拟令牌(Impersonate Token)

  • phNewToken:返回令牌句柄的地址

复制完一张新令牌后,我们就可以行使这张新令牌来运行我们指定的历程了

  1. CreateProcessWithTokenW

BOOL CreateProcessWithTokenW(
  HANDLE                hToken,
  DWORD                 dwLogonFlags,
  LPCWSTR               lpApplicationName,
  LPWSTR                lpCommandLine,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCWSTR               lpCurrentDirectory,
  LPSTARTUPINFOW        lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

该函数确立一个新历程及其主线程,新历程在指定令牌的平安上下文中运行。我们直接指定前面复制出来的新令牌,使用该令牌确立我们指定的历程即可

2. 行使

凭证mimikatz的token模块的原理,简质朴现了一个demo,也有许多token相关的工具如incognito等

当获取治理员权限后,我们可以列出系统中历程对应的token:


然后窃取指定历程的token来运行我们的程序,如直接运行上线马


若是想要拿回程序输出的话,则可以通过管道等历程间通讯的方式往返显输出


若是拿到一台机械有域管的历程,那么我们可以直接窃取域管历程的token来举行DCSync攻击


0x04 参考链接

https://docs.microsoft.com/

https://github.com/gentilkiwi/mimikatz/

https://www.ired.team/offensive-security/privilege-escalation/t1134-access-token-manipulation

https://www.slideshare.net/JustinBui5/understanding-windows-access-token-manipulation

https://posts.specterops.io/understanding-and-defending-against-access-token-theft-finding-alternatives-to-winlogon-exe-80696c8a73b


  • 皇冠官网手机版 @回复Ta

    2021-08-14 00:00:08 

    www.22223388.com)实时更新发布最新最快最有效的登1登2登3代理网址,包括新2登1登2登3代理手机网址,新2登1登2登3代理备用网址,皇冠登1登2登3代理最新网址,新2登1登2登3代理足球网址,新2网址大全。总之加油吧

  • 新2手机管理端(www.22223388.com) @回复Ta

    2021-10-03 00:03:12 

    同时一名现场处置的事情职员拍摄了25-100张现场照片,而且通过手机向同事流传,造成互联网疯传,瓦妮莎据此对洛杉矶警方提出诉讼。没仔细看,再来一遍

发布评论