从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显式拒绝令