工作组可以认为是同一网络内,功能相似的电脑进行的分组。 举个例子: “在一个网络内,可能有成百上千台电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可想而知会有多么乱。为了解决这一问题,Windows 9x/NT/2000就引用了“工作组”这个概念,将不同的电脑一般按功能分别列入不同的组中,如财务部的电脑都列入“财务部”工作组中,人事部的电脑都列入“人事部”工作组中。你要访问某个部门的资源,就在“网上邻居”里找到那个部门的工作组名,双击就可以看到那个部门的电脑了。 ” 这就是工作组,但是在工作组中的电脑还是各自管理。当其中一台计算机访问另一台计算机时还是要经过另一台计算机的认证的
域,是一群相互信任的计算机的集合 想要访问域中资源就必须经过一台负责每一台联入网络的电脑和用户的验证工作的服务器,这个服务器叫做 域控制器 (Domain Controller,简写为DC) 的安全认证。每个域至少要有一个域控制器。 当某计算机连入域时,DC就会鉴别这台电脑是否是属于这个域的,用户使用的登录账号是否存在、密码是否正确。如果以上信息不正确,域控制器就拒绝这个用户从这台电脑登录。不能登录,用户就不能访问服务器上有权限保护的资源 。 另外,当一个域和另一个域建立信任关系后,两个域就可以按需要相互管理
“ 工作组是一群计算机的集合,它仅仅是一个逻辑的集合,各自计算机还是各自管理的,你要访问其中的计算机,还是要到被访问计算机上来实现用户验证的。而域不同,域是一个有安全边界的计算机集合,在同一个域中的计算机彼此之间已经建立了信任关系,在域内访问其他机器,不再需要被访问机器的许可了。 ”
活动目录 (Active Directory,AD) ,用于存储有关网络对象的信息。帮助用户快速准确的找到所需的信息服务,“ 如果把企业的内网看成一本字典,那么内网里的资源就是字典里的内容,活动目录就相当于字典的索引 ”
活动目录的功能:
“要实现域环境,实际上就是安装AD,如果内网中的一台计算机上安装了AD,它就变成了DC(用于存储活动目录数据库的计算机)。”
NTLM也是一个认证协议,与Kerberos协议功能是一样的,不过NTLM的安全性可没有Kerberos好
NTLM协议验证机制是基于 挑战(chanllage)/回应(response) 模式的
它的验证模式大致如下:
Kerberos协议,是一个常用的认证与授权协议(下面只是简化过的大致流程,具体流程请看下面的wireshark抓包分析)
以下的加密都是对称加密
用户先输入用户名和密码,其中密码在这个阶段会被单向hash函数加密为一个密钥,用来解密后面的信息
客户端向as发送用户名信息(明文)(进发送用户名而没有发送密码)
AS先把用户名在数据库中查找一下,如果该用户名存在则找到该用户的密码使用单向hash函数生成client密钥并返回Msg A和B。 A中的内容是一个被Client密钥加密的用于生成Authenticator1的数据 B中的内容是一个被TGS密钥加密的一堆信息叫做TGT,当前无TGS密钥故无法解开,其中包含 客户端ID,有效期 ,Client网络地址以及MSG A解密后的内容
Client在MSG C向TGS发送 请求的服务的ID,2.2中的TGT,MSG D 发送由 **[Client/TGS SessionKey]**加密的Authenticator 1 {Client ID, Timestamp}。
发送的消息中包括:
Note
以上是kerberos协议简化图
即客户端往服务端的第一次通讯
我抓到的包的样子,我们来解读一下 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”问题抓了一下包就懂了..
1.ticket:这个就是TGT了。 tkt-vno:票据格式版本号 realm:所在域名 sname:同asres enc-part:被krbtgt密钥加密的票据本体部分 2.enc-part:被client hash 加密的login session key
1.ap-req->…->tikect: 可以发现TGSREQ把整个TGT发送给了TGS 2ap-req->…->authenticator:被login session key加密的时间戳和client id
1.tikect:这里就是TGS部分了。 enc-part:这里的enc-part是被所请求的服务的用户hash加密的 2.enc-part:被login session key加密的service session key
SMB协议是一个用于两台计算机间共享文件 、打印机、串口等功能的协议。 网上邻居功能就是依靠SMB协议而起的。 通过smb协议,一台计算机可以在经过smb认证后读写另一台计算机上的一些文件。 smb协议一般架设在NetBios协议之上。 NetBIOS 使用下列端口:UDP/137(NetBIOS 名称服务)、UDP/138(NetBIOS 数据报服务)、TCP/139(NetBIOS 会话服务);SMB 使用下列端口:TCP/139、TCP/445。
如果我们想依靠smb协议去读写另一台计算机上的文件,那么其中的SMB认证情况是如何呢?我们简单分析一下。
1.版本确立阶段 2.用户认证阶段 3.资源链接阶段 4.资源读写阶段
更详细一点。 1.版本确立阶段。客户端先发送自己支持的SMB协议版本给服务器,服务器收到后向客户端列出希望使用的版本。若客户端支持的smb版本服务器均不支持,则返回 0XFFFFH,结束通信 。 2.用户认证阶段。确立好认证版本后,就是客户端发送账户密码给服务端进行身份验证了。服务器收到后返回认证成功或失败 3.资源链接阶段。用户认证通过后,客户端发送自己想要访问的资源名,服务器收到后返回允许或拒绝 4.资源读写阶段,客户端开始读写服务器上文件。
看起来比ntlm和kerberos简单多了。抓包分析一下。
1.1 客户端向服务端列出当前支持的smb版本
1.2服务器返回希望的SMB版本
1.3这里说个题外话,此时服务器只是选中了SMB2,但是SMB2也分了很多版本,所以客户端还会基于SMB2继续进行版本问询
然后服务器再继续选择一个细分版本,版本协商结束
2.1 客户端向服务端提供用户信息。SMB协议的这一个部分使用NTLM协议完成的。建议先看看NTLM认证再过来 首先客户端发送一个请求NTLM认证的包
2.2服务端返回challenge
2.3 客户端发送用户名,被client hash加密的challenge(NTLM RESPONSE)给服务端
2.4服务端进行认证处理,返回认证成功或失败,下图是成功时,返回 会话建立字样
3.1客户端发送请求的资源
3.2服务端返回允许或拒绝