域,工作组,活动目录

工作组

工作组可以认为是同一网络内,功能相似的电脑进行的分组。
举个例子:
“在一个网络内,可能有成百上千台电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可想而知会有多么乱。为了解决这一问题,Windows 9x/NT/2000就引用了“工作组”这个概念,将不同的电脑一般按功能分别列入不同的组中,如财务部的电脑都列入“财务部”工作组中,人事部的电脑都列入“人事部”工作组中。你要访问某个部门的资源,就在“网上邻居”里找到那个部门的工作组名,双击就可以看到那个部门的电脑了。 ”
这就是工作组,但是在工作组中的电脑还是各自管理。当其中一台计算机访问另一台计算机时还是要经过另一台计算机的认证的

域,是一群相互信任的计算机的集合
想要访问域中资源就必须经过一台负责每一台联入网络的电脑和用户的验证工作的服务器,这个服务器叫做 域控制器 (Domain Controller,简写为DC) 的安全认证。每个域至少要有一个域控制器。
当某计算机连入域时,DC就会鉴别这台电脑是否是属于这个域的,用户使用的登录账号是否存在、密码是否正确。如果以上信息不正确,域控制器就拒绝这个用户从这台电脑登录。不能登录,用户就不能访问服务器上有权限保护的资源 。
另外,当一个域和另一个域建立信任关系后,两个域就可以按需要相互管理

工作组和域的区别

“ 工作组是一群计算机的集合,它仅仅是一个逻辑的集合,各自计算机还是各自管理的,你要访问其中的计算机,还是要到被访问计算机上来实现用户验证的。而域不同,域是一个有安全边界的计算机集合,在同一个域中的计算机彼此之间已经建立了信任关系,在域内访问其他机器,不再需要被访问机器的许可了。 ”

活动目录

活动目录 (Active Directory,AD) ,用于存储有关网络对象的信息。帮助用户快速准确的找到所需的信息服务,“ 如果把企业的内网看成一本字典,那么内网里的资源就是字典里的内容,活动目录就相当于字典的索引

活动目录的功能:

  • 账号集中管理
  • 软件集中管理
  • 环境集中管理
  • 增强安全性
  • 更可靠,更短的宕机时间

“要实现域环境,实际上就是安装AD,如果内网中的一台计算机上安装了AD,它就变成了DC(用于存储活动目录数据库的计算机)。

NTLM协议

NTLM也是一个认证协议,与Kerberos协议功能是一样的,不过NTLM的安全性可没有Kerberos好

验证机制

NTLM协议验证机制是基于 挑战(chanllage)/回应(response) 模式的

它的验证模式大致如下:

  1. 用户输入账号密码,本地把密码加密为一个hash值,称为NTML-Hash
  2. 客户端向服务器发送用户名 (这个数据称为 TYPE 1 Negotiate
  3. 服务端接收请求,判断数据库中该用户名是否存在,若存在则生成一个16位随机数称之为chanllage。同时将chanllage返回给客户端 ( TYPE 2
  4. 客户端收到chanllage后将其用上面生成的hash值来加密这个chanllange,并与用户名,chanllange等组合到一起得到Net-NTLMHash 最后将 Net-NTLMHash 封装到 TYPE 3 NTLM_AUTH消息中发往服务器。
  5. 服务器收到TYPE3后,用自己数据库中该用户的密码的NTML-Hash加密chanllage,并比较自己计算出的 Net-NTLMHash 与客户端发过来的 Net-NTLMHash ,若相同则认证成功
  6. (以上是客户端-服务端模型,若是在域中,验证步骤就会有点不同)
    若在域中,那么服务端在第5步收到TYPE3后不会自行进行比对,而是将 Net NTLM-Hash 转发给域控制器DC,由DC进行最后的 Net NTLM-Hash 比较认证

Kerberos协议

Kerberos协议,是一个常用的认证与授权协议(下面只是简化过的大致流程,具体流程请看下面的wireshark抓包分析)

整体流程

QQ图片20210217011242

参与的关键角色

QQ图片20210217011359

  • Client: Application Client 应用客户端
  • AS: Authentication Server 用来认证用户身份
  • TGS: Ticket-Granting Service 用来授权服务访问
  • SS: Service Server 用户所请求的服务
  • 其中AS和TGS都属于KDC系统( 密钥分发中心 )

认证:

以下的加密都是对称加密

1.用户登录

QQ图片20210217125043

用户先输入用户名和密码,其中密码在这个阶段会被单向hash函数加密为一个密钥,用来解密后面的信息

2.请求身份认证(client和kdc双向认证)

2.1 客户端向AS发送认证请求

QQ截图20210217125323

客户端向as发送用户名信息(明文)(进发送用户名而没有发送密码)

2.2AS确认客户端身份

QQ截图20210217125335

AS先把用户名在数据库中查找一下,如果该用户名存在则找到该用户的密码使用单向hash函数生成client密钥并返回Msg A和B。
A中的内容是一个被Client密钥加密的用于生成Authenticator1的数据
B中的内容是一个被TGS密钥加密的一堆信息叫做TGT,当前无TGS密钥故无法解开,其中包含 客户端ID,有效期 ,Client网络地址以及MSG A解密后的内容

3. 请求服务授权(client请求kdc认证server)

3.1 客户端向TGS发送请求服务授权请求

3.1客户端请求授权服务访问

Client在MSG C向TGS发送 请求的服务的ID,2.2中的TGT,MSG D 发送由 **[Client/TGS SessionKey]**加密的Authenticator 1 {Client ID, Timestamp}。

3.2 TGS为Client响应服务授权票据

QQ截图20210217125347
  • Msg E

    使用

    [Service密钥]

    加密的Client-To-Server Ticket, 该Ticket中包含了如下信息:

    • [Client/Server SessionKey]
    • Client网络地址
    • Ticket有效时间
    • Client ID
  • Msg F 使用**[Client/TGS SessionKey]加密的[Client/Server SessionKey]**。

4. 发送服务请求(client与ss双向认证)

4.1 Client向SS(Service Server)发送服务请求
QQ截图20210217125356

发送的消息中包括:

  • Msg E 上一步3.2中,TGS为Client响应的消息Msg E。该消息可以理解为由Client为SS携带的消息。
  • Msg G 由**[Client/Server SessionKey]加密的Authenticator 2**,包含{Client ID, Timestamp}信息。
    这里的Authenticator 2区别于前面3.1步骤中的Authenticator 1。

Note

  1. [Client/Server SessionKey]**并未直接透明传输,而是被包含在使用[Service密钥]**加密的Msg E中。
  2. 既然**[Client/Server SessionKey]并不直接透明传输, Client需要向SS证明自己拥有正确的[Client/Server SessionKey],所以,Authenticator 2使用了[Client/Server SessionKey]**加密。

4.2 SS响应Client

QQ截图20210217125405

Kerberos抓包分析

QQ截图20210217125405

以上是kerberos协议简化图

ASREQ

即客户端往服务端的第一次通讯

QQ截图20210217125644

我抓到的包的样子,我们来解读一下
1.pvno: 标记着kerberos协议的版本
2.msg-type: 标记着这个包的类型, ASREQ对应的就是KRBAS_REQ(0x0a)
3.padata:用于存储一些认证信息
其实这个头下面还有很多不同的类型的头,但是这里抓到了PA-DATA PA-ENC-TIMESTAMP和PA-DATA PA-PAC-REQUEST这两个头部,但是这两个头部是padata最常用最核心的头部.
PA-DATA PA-ENC-TIMESTAMP : 就是用户hash加密的时间戳,作用在于:as配合用户的明文账户(cname头)在数据库中查询该用户是否存在,若存在则取用其hash来解密这个时间戳,若揭秘成功则认证通过
PA-DATA PA-ENC-TIMESTAMP: 这个是启用PAC(一个控制用户权限的东西)支持的扩展。
4.req-body:请求主体,也包含了许多信息.这个头里面比较重要的东西是
cname:存储着发送请求的用户名(明文用户名)
sname:这个包含的是服务端的身份, 在ASREQ里面是krbtgt ,还有所在域名称。till为到期时间,nonce为随机生成数
realm:所在域名称
etype:告知服务器,这个hash的加密方式

之前一直困扰我的 “为什么有些文章说的第一步是向服务器发送明文账户名,有些文章是向服务器发送时间戳hash”问题抓了一下包就懂了..

ASREP

QQ截图20210217125844

1.ticket:这个就是TGT了。
tkt-vno:票据格式版本号
realm:所在域名
sname:同asres
enc-part:被krbtgt密钥加密的票据本体部分
2.enc-part:被client hash 加密的login session key

TGSREQ

QQ截图20210217130159

1.ap-req->…->tikect: 可以发现TGSREQ把整个TGT发送给了TGS
2ap-req->…->authenticator:被login session key加密的时间戳和client id

TGSREP

QQ截图20210217125903

1.tikect:这里就是TGS部分了。
enc-part:这里的enc-part是被所请求的服务的用户hash加密的
2.enc-part:被login session key加密的service session key

SMB协议

SMB协议是一个用于两台计算机间共享文件 、打印机、串口等功能的协议。
网上邻居功能就是依靠SMB协议而起的。
通过smb协议,一台计算机可以在经过smb认证后读写另一台计算机上的一些文件。
smb协议一般架设在NetBios协议之上。
NetBIOS 使用下列端口:UDP/137(NetBIOS 名称服务)、UDP/138(NetBIOS 数据报服务)、TCP/139(NetBIOS 会话服务);SMB 使用下列端口:TCP/139、TCP/445。

SMB认证

如果我们想依靠smb协议去读写另一台计算机上的文件,那么其中的SMB认证情况是如何呢?我们简单分析一下。

1.版本确立阶段
2.用户认证阶段
3.资源链接阶段
4.资源读写阶段

更详细一点。
1.版本确立阶段。客户端先发送自己支持的SMB协议版本给服务器,服务器收到后向客户端列出希望使用的版本。若客户端支持的smb版本服务器均不支持,则返回 0XFFFFH,结束通信 。
2.用户认证阶段。确立好认证版本后,就是客户端发送账户密码给服务端进行身份验证了。服务器收到后返回认证成功或失败
3.资源链接阶段。用户认证通过后,客户端发送自己想要访问的资源名,服务器收到后返回允许或拒绝
4.资源读写阶段,客户端开始读写服务器上文件。

看起来比ntlm和kerberos简单多了。抓包分析一下。

抓包分析

1.1 客户端向服务端列出当前支持的smb版本

QQ截图20210217130121

1.2服务器返回希望的SMB版本

QQ截图20210217130226

1.3这里说个题外话,此时服务器只是选中了SMB2,但是SMB2也分了很多版本,所以客户端还会基于SMB2继续进行版本问询

img

然后服务器再继续选择一个细分版本,版本协商结束

QQ截图20210217130238

2.1 客户端向服务端提供用户信息。SMB协议的这一个部分使用NTLM协议完成的。建议先看看NTLM认证再过来
首先客户端发送一个请求NTLM认证的包

QQ截图20210217130252

2.2服务端返回challenge

QQ截图20210217130331

2.3 客户端发送用户名,被client hash加密的challenge(NTLM RESPONSE)给服务端

QQ截图20210217130400

2.4服务端进行认证处理,返回认证成功或失败,下图是成功时,返回 会话建立字样

QQ截图20210217130419

3.1客户端发送请求的资源

QQ截图20210217130431

3.2服务端返回允许或拒绝

QQ截图20210217130454

  1. 各种读写操作请求

QQ截图20210217130512