windows的认证方式主要有哪些?
- windows的认证方式主要又NTLM认证、kerberos认证两种。同时,windows Access Token记录着用户的SID、组ID、Session、及权限等信息,也起到了权限认证的作用。其中NTLM认证主要有本地认证和网络认证两种方式。本地登陆时用户密码存储在SAM文件中,可以把它当作一个存储密码的数据库,所有的操作都在本地进行的。它将用户输入的密码转换为NTLM Hash,然后与SAM中的NTLM Hash进行比较。而网络认证则是基于一种Challenge/Response认证机制的认证模式。
- Kerberos认证用于域环境中,它是一种基于票据(Ticket)的认证方式。他的整个认证过程涉及到三方:客户端、服务端和KDC(Key Distribution Center)。在Windows域环境中,由DC(域控)来作为KDC。
- Access Token(访问令牌)是用来描述进程或线程安全上下文的对象,令牌所包含的信息是与该用户账户相关的进程或线程的身份和权限信息。当用户登陆时,系统生成一个Access Token,然后以该用户身份运行的的所有进程都拥有该令牌的一个拷贝。这也就解释了A用户创建一个进程而B用户没有该进程的权限。
windows本地认证基础知识
在本地登陆的情况下,操作系统会使用用户输入的密码作为凭据去与系统中的密码进行校验,如果成功的话表明验证通过。操作系统的密码存储在C盘的目录下:
代码语言:javascript复制%SystemRoot%system32configsam
SAM用于储存本地所有用户的凭证信息,但是这并不代表着你可以随意去查看系统密码。我们登陆系统的时候系统会自动读取SAM文件中的密码与我们输入的密码进行比对,如果认证相同则可以使用该机器。
windows自身是不会保存明文密码的,也就是说SAM中保存的不是明文而是Hash。
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
NTLM的认证过程是怎样什么?
NTLM Hash是怎么样生成的呢?当用户注销、重启、锁屏后,操作系统会让winlogon显示登陆界面,当winlogon.exe接收到账号密码输入之后,会将密码交给lsass进程,这个进程会存一份明文密码,将明文密码加密成NTLM Hash,对SAM数据库比较认证。(winlogon.exe即Windows Logon Process,是Windows NT用户登陆程序,用于管理用户登录和退出。LSASS用于微软Windows系统的安全机制。它用于本地安全和登陆策略。) 比如当用户输入密码admin的时候,操作系统会将admin转换为16进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM Hash
代码语言:javascript复制admin -> hex(16进制编码) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
本地认证的流程
代码语言:javascript复制winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)
- Windows Logon Process(即 winlogon.exe),是Windows NT 用户登 陆程序,用于管理用户登录和退出。
- LSASS用于微软Windows系统的安全机 制。它用于本地安全和登陆策略。
NTLM前身LM Hash
LM与NTLM协议的认证机制相同,但是加密算法不同。目前大多数的windows系统都采用了NTLM协议认证,LM协议现在基本已经淘汰了。LM协议认证过程中需要LM Hash作为根本凭证进行参与认证。LM Hash产生原理:
代码语言:javascript复制将所有小写字母转换为大写字母
• >123ABC // 未达到7个字符
• 将密码转化为16进制,分两组,填充为14个字符,空余位使用0x00字符填补
• >31323341424300000000000000
• 将密码分割为两组7个字节的块
• >31323341424300 00000000000000 // 16进制
• 将每组转化为比特流,不足56Bit则在左边加0
• >31323341424300 ->(转换为二进制) 110001001100100011001101000001010000100100001100000000-> (补 足56Bit) 00110001001100100011001101000001010000100100001100000000
• 将比特流按照7比特一组,分出8组,末尾加0
由于后者都为0,结果可想而知,那就都是0;
• 将每组比特流转换为16进制作为被加密的值,使用DES加密,字符串 “KGS!@#$%”为Key(0x4B47532140232425),得到8个结果 ,每个 结果转换为16进制。
• -> 00110000100110001000110001101000000101000001001000001100 00000000
• ->30988C6814120C00 -> DES(30988C6814120C00) -> 48-D7-EB-91- 2F-5E-69-7C
• 由于我们的密码不超过7字节,所以后面的一半是固定的:
• AA-D3-B4-35-B5-14-04-EE
• 连接两个DES加密字符串。这是LM哈希。
• 48-D7-EB-91-2F-5E-69-7C-AA-D3-B4-35-B5-14-04-EE
windows网络认证
windows网络认证 在工作组中,无论是局域网中的一台机器还是很多机器,它们能够通信的话都无法相互建立一个完美的信任机制。只要有一个可以信任的信托机构,对两方进行认证,这样就有第三方来证实双方的可信任性。
在了解认证之前先了解一些SMB协议:
SMB(ServerMessage Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议。SMB 是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。SMB使用了NetBIOS的应用程序接口 (Application Program Interface,简称API),一般端口使用为139,445。另外,它是一个开放性的协议,允许了协议扩展——使得它变得更大而且复杂;大约有65个最上层的作业,而每个作业都超过120个函数,甚至Windows NT也没有全部支持到,最近微软又把 SMB 改名为 CIFS(CommonInternet File System),并且加入了许多新的特色。
- 早期SMB协议在网络上传输的是明文口令。后来出现LAN Manager ChallengeReponse 验证机制,简称LM。
- 微软提出了windowsNT挑战/响应验证机制,简称MTLM。现在已经更新到了V2版本以及加入了Kerberos验证体系
NTLM 协议
NTLM 协议 NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。(这个协议只支持Windows) NTLM协议的认证共需要三个消息完成:协商 --> 挑战 --> 认证。
- 协商:主要用于确认双方协议版本、加密等级等
- 挑战:服务器在收到客户端的协商消息之后, 会读取其中的内容,并从中选择出自己所能接受的服务内容,加密等级,安全服务等等。并生成一个随机数challenge, 然后生成challenge消息返回给客户端。该消息就是挑战/响应认证机制的主要功能体现。
- 认证:验证主要是在挑战完成后,验证结果,是认证的最后一步。
首先客户端向服务器发送一些用户信息以及主机信息(包含用户名,如果没有这个用户的话认证就失败),服务器接收到请求之后会生成一个16为的随机数称之为"Challenge"(挑战),使用登陆用户名对应的NTLM Hash加密Challen(其实就是验证它是否在我本地认证的数据库中)生成Challenge1,同时将Challenge发送给客户端。
代码语言:javascript复制Net NTLM Hash = NTLM Hash(Challenge)
- Challenge是服务端随机生成的、NTLM Hash是服务器根据客户端提供的用户名寻找出来的Hash加密生成Net NTLM Hash(这个是在服务端这边)
- 客户端接收到Challenge后使用将要登陆到账户对应的NTLM Hash加密Challenge生成Response之后发给服务端,服务器接收到客户端发过来的Response后,对比Chanllenge1与Response是否相等,从而且进行验证。
详细过程:
- 第一步:输入密码,然后LSASS会把密码的NTLM Hash后的值先存储到本地。
- 第二步:客户端把用户名的明文发送给服务端
- 第三步:服务端接收到用户名之后会判断用户名是否存在,不存在则代表认证失败。存在的话服务端会生成一个16位的随机数,并且从本地查找share_user对 应的NTLM Hash,使用NTLM Hash加密Chanllenge,生成一 个Net-NTLM Hash存在内存中,并将Chanllenge发送给客户端。
- 第四步:当客户端收到challenge后,用在第一步中存储的NTLM Hash对其加密,然后再将加密后的challenge发送给服务器,也就是response,表现形式是Net-NTLM Hash。
- 第五步:服务端在收到response后,会向DC发送针对客户端的验证请求。该请求主要包含以下三方面的内容:客户端用户名、客户端NTLM Hash加密的Challenge、原始的Challenge。
- 第六步:当DC接到过来的这三个值的以后,会根据用户名到DC的账号数据库(ntds.dit)里面找到该用户名对应的NTLM Hash,然后把这个hash拿出来和传过来的challenge值进行比较,相同则认证成功,反之,则失败。
NTLM 协议 V1 与 V2的区别
NTLM 协议 V1 与 V2的区别 NTLM v1与NTLM v2最显著的区别就是Challenge与加密算法不同,共同点就是加密的原料都是NTLM Hash。
- Challage:NTLM v1的Challenge有8位,NTLM v2的Challenge为16位。
- Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。
Kerberos域认证
活动目录 活动目录 在学习Kerberos认证之前先了解一下活动目录(Active Diretory,AD)。活动目录是指域环境中提供目录服务的组件。目录用于存储有关网络对象(例如用户、组、计算机、共享资源、打印机和联系人等)的信息。能够快速、准确的从目录中找到其所需的信息的服务,为企业提供了网络环境集中式管理的机制。 活动目录主要的功能:
- 账号集中管理:所有的账户都存储在服务器中,可以方便快捷的执行命令和管理密码等。
- 软件集中管理:能够统一推送软件,安装网络打印机等服务器
- 环境集中管理:统一客户端桌面、IE等
- 增强安全性:统一部署杀软,统一执行病毒扫描任务、集中管理用户的计算机权限,统一指定密码策略。
- 更加的可靠更短的宕机时间
在域中,网络对象可以相互访问,但是在真实情况中,需要对某些部门的计算机进行限制,例如:销售部门不能访问技术部门的服务器。 这个中间就需要Kerberos认证协议来验证网络对象间的权限。
Kerbroes
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客 户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不 依赖于主机操作系统的认证,无需基于主机地址的信任,不要求 网络上所有主机的物理安全,并假定网络上传送的数据包可以被 任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一 种可信任的第三方认证服务,是通过传统的密码技术(如:共享 密钥)执行认证服务的。
Kerberos的标志是三只狗头,狗头分别代表以下角色:
- Client
- Server
- KDC(Key Distribution Center) = DC(Domain Controller)
kerberos使用了一个包含客户端、应用服务器和一个kerbroes服务器的协议,这个协议的设计就是对抗客户端/服务器对话安全的多种威胁。在一个不受保护的网络中,任何一个客户端可以使用任意一台服务器提供的服务。很明显的安全威胁就是伪装,对方可以扮演另一个客户端并在服务器上获取没有经过验证的权限!所以服务器必须能确认请求服务的客户端的身份进行验证。为了避免给服务器更多的访问压力和每次和客户端交互的风险,使用认证服务器(AS),它存储了所有用户的口令并集中在一个数据库中,然后用户就可以登陆AS进行验证身份,如果验证通过的话它就可以把信息传达到一个应用服务器。
名词基本概念:
- KDC: Key Distribution Center,密钥分发中心,负责管理票据、认证票据、分发票据,但是KDC不是一个独立的服务,它由AS和TGS组成。
- AS: Authentication Service,验证服务,为client生成TGT的服务
- TGS: Ticket Granting Service,票据授予服务,为client生成某个服务的ticket
- TGT: Ticket Granting Ticket,入场券,通过入场券能够获得票据,是一种临时凭证的存在。
- Ticket:票据,是网络中各对象之间互相访问的凭证
- AD: Account Database,存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT。
- DC: Domain Controller,域控
- KRBTGT: 每个域控制器都有一个krbtgt账户,是KDC的服务账户,用来创建TGS加密的密钥。
域认证流程:
- client向kerberos服务请求,希望获取访问server的权限。kerberos得到了这个消息,首先得判断client是否是可信赖的, 也就是白名单黑名单的说法。这就是AS服务完成的工作,通过 在AD中存储黑名单和白名单来区分client。成功后,返回AS返 回TGT给client。
- client得到了TGT后,继续向kerberos请求,希望获取访问 server的权限。kerberos又得到了这个消息,这时候通过client 消息中的TGT,判断出了client拥有了这个权限,给了client访 问server的权限ticket。
- client得到ticket后,终于可以成功访问server。这个ticket只是 针对这个server,其他server需要向TGS申请。
- 首先用户登陆到一个工作站并请求访问一个特定的服务器,客户端把一个包含用户ID和被称为TGT(Ticket-Granting Ticket,票据授予票据,也可也称为入场券)请求的消息发送到AS。其中,TGT的到期时间为8小时,如果超过了8小时,还需要重新申请TGT,不能之间进入下一步获取Ticket;AS在它的数据库中查找用户的口令,然后AS回复一个TGT和一个称为会话密钥的一次性加密密 钥(可以称之为Session Key)给客户端。这两个加密都是使用用户口令作为加密密钥。然后发送给客户端,这个时候会提示客户端输入口令,产生密钥,并且解开发来的信息,如果提供了正确的口令,票据(ticket)和会话密钥就会被恢复。票据组成了一个客户端用来请求服务的信任证书的集合,票据显示AS已经接收了这个客户端和用户。票据包含了用户ID、一个时间戳、票据的失效时间。整个票据使用AS和服务器共享的DES密钥加密。这个时候客户端会向AS发送TGT和解密的Session Key。
- Session Key用于客户端向TGS服务通信。
- 域内所有网络对象的凭证都在AD中保存
- KDC中某个用户指的是krbtgt
- 这个时候Kerberos与客户端已经建立起来了,客户端需要提供TGT与第一步中使用自己NTLM Hash解密出来的Session Key加密的客户端信息跟时间戳;如果假设这个数据被中间人窃取到,也无法在段时间内破解,因为KDC会校验时间戳。KDC接到TGT与其他内容后,会首先解密TGT,只有KDC可以解密TGT,从TGT中提取到Session Key,再使用Session Key解密其他内容,解密出来的内容同TGT中的信息进行校验来确认客户端是否受信;验证通过后,就会生成一个新的Session Key,我们称之为Server Session Key,这个Server Session Key主要用于和服务器进行通信。同时还会生成一个Ticket,也就是最后的票据了。
- 第三步里,客户端向服务器请求,需要提供Ticket,Server Session Key加密的客户端信息与时间戳。
- Ticket客户端无法解密
- 服务器端通过解密Ticket解密Server Session Key(Client info Timestamp)
- 比较时间长度 校验通过后,认证成功,该票据会一直存在客户端内存中。
Windows Access Token
- Windows Token其实叫Access Token(访问令牌),它是一个描 述进程或者线程安全上下文的一个对象。不同的用户登录计算机后, 都会生成一个Access Token,这个Token在用户创建进程或者线程 时会被使用,不断的拷贝,这也就解释了A用户创建一个进程而该 进程没有B用户的权限。令牌就是系统的临时密钥,相当于用户名和密码,用来决定是否允许这次请求和判读这次请求属于那个用户,它允许你不提供凭证的前提下访问网络和系统资源。
- Windows Access Token(访问令牌)有两种,一种是Delegation token(授权令牌),主要用于交互会话登录(例如本地用户直接登录、远程桌面登录),另一种是Impersonation token(模拟令牌),主要用于非交互登录(利用net use访问共享文件夹)
Access Token种类:
- 主令牌
- 模拟令牌 Windows Access Token组成
- 用户帐户的安全标识符(SID)
- 用户所属的组的SID
- 用于标识当前登录会话的登录SID
- 用户或用户组所拥有的权限列表
- 所有者SID
- 主要组的SID
- 访问控制列表
- 访问令牌的来源
- 令牌是主要令牌还是模拟令牌
- 限制SID的可选列表
- 目前的模拟等级
- 其他统计数据 Windows Access Token SID (安全标识符)
安全标识符是一个唯一的字符串,它可以代表一个账户、一个用户 组、或者是一次登录。通常它还有一个SID固定列表,例如 Everyone这种已经内置的账户,默认拥有固定的SID。 SID的表现形式:
- 域SID-用户ID
- 计算机SID-用户ID
- SID列表都会存储在域控的AD或者计算机本地账户数据库中。
Windows Access Token产生的过程
每个进程创建时都会根据登录会话权限由LSA(Local Security Authority)分配一个Token。如果CreaetProcess时自己指定了 Token, LSA会用该Token, 否则就用父进程Token的一份拷贝。当用户注销后,系统将会使授权令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。
内网渗透常用端口
- 53 DNS服务,在使用中需要用到TCP/UDP 53端口,AD域的核心就是DNS服务器,AD通过DNS服务器定位资源
- 88 Kerberos服务,在使用中需要用到TCP/UDP 88端口,Kerberos密钥分发中心(KDC) 在该端口上侦听Ticket请求
- 135 135端口主要用于使用RPC协议并提供DCOM服务。
- 137 NetBIOS-NS(名称服务),在使用中需要用到TCP/UDP 137端口
- 139 Session Server(会话服务),在使用中需要用到TCP/UDP 139端口,允许两台计算机建立连接
- 389 LDAP服务(轻量级目录访问协议),在使用中需要用到TCP/UDP 389端口,如果需要使用SSL,需要使用636端口,
- 445 主要用于共享文件夹或共享打印,存在较多漏洞,如MS08-067、MS17-010
- 3268 Global Catalog(全局编录服务器),如果需要使用SSL,需要用到3269端口,主要用于用户登录时,负责验证用户身份的域控制器需要通过防火 墙,来向“全局编录”查询用户所隶属的通用组
参考的文章: 倾弦大佬:https://payloads.online/archivers/2018-11-30/1#0x03-windows-access-token https://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html https://www.cnblogs.com/artech/archive/2011/01/25/NTLM.html