走进森林深处(一)

robots

 

前言

在比赛期间,往往获得分数的应该在内网。内网资产的脆弱性和其架构的沉重性是安全所能针对的,这个系列我想分享下在内网域中常用的手段和一些理论知识。起初,我纠结了很久。我在想文章到底应不应该讲一些理论知识,因为夹杂一些理论知识往往会让读者失去耐心和看下去的勇气,但是最终我的结论是需要。在我面试了多家之后我发现,似乎原理性的侧重点居多,也是恰恰最需要的,事物的本质是如此重要。网上的域相关内容数不胜数,但是看起来总缺乏连贯性,缺乏实战应用和理论的相结合此为其一,其二是分享也是我在学习和巩固的过程,文章也是记录我学习的点滴,这是我开启这个系列的原因。也希望没有讲到之处各位读者海涵,本文的面向人群也并非大佬。

 

kerberos产生的过程

要理解kerberos协议,应该首先知道为什么产生它。

1.kerberos解决什么痛点

起初计算机采用的都是分时操作系统,大家都来使用一个计算机,它存在的意义在于,一台计算机按照时段给不同的用户使用,每个用户都觉得是自己的计算机,提高了资源的使用率。但是,它让用户觉得时间臃肿,占用计算机并不是长久的,所以效率低下。但是给每个用户分配一台计算机,一台打印机,一台邮件服务器又不太可能。所以提出一种假想,把软件放到一台服务器上,专门一台打印机服务,专门一台邮件服务器。用户去访问和使用,然后做自己想做的事情。问题在于,例如邮箱服务器,我会用你的用户名去收发邮件和取文件,所以,如何让服务器知道我不是你?

2.kerberos的完善1

于是下个遐想产生,在登陆邮件服务器时,需要提供账户跟密码以此来验证身份。但是,若如此做,一台邮件服务器应存储几千个用户,一台打印机存储几千个用户。如果一个用户的密码修改,这些服务的密码都要修改。于是,将认证服务单独抽离显得必不可少。这台认证服务存储着所有用户的账号密码进行集中管理。例如,在使用邮件服务器时,将你的账号密码告诉认证服务,认证服务返回邮件系统的账号密码,以便使用…..但是,如果下次在使用,使用邮件服务器的账号密码直接登陆就绕过了认证服务…..

3.kerberos的完善2

下一个遐想产生,取而代之的是:认证服务本该给你邮件服务器的账号密码,替换成了一张票。使用这张票来访问邮件服务器,这张票包含用户的用户名并且用邮件服务器的密码来进行加密。邮件服务器拿到这张票时用自己的密码进行解密得到用户的用户名是否正确来确定是否可以被使用。还有一个问题就是,邮件服务器如何知道这张票是被正确解密的?所以票中还应该加上邮件服务器的名称。当邮件服务器用自己的密码解密这张票时,得到用户的用户名以确定用户的权限;得到服务名来确定这张票已被正确解密….所以票的内容应该如下所示:
票{用户名:服务名}
但是,重新梳理逻辑。在用户需要使用邮件服务器时,将自己的名字发送给认证服务。认证服务返回一张票,这张票包含用户名和服务名。但是在这其中这张票被窃取了,窃取者将自己的用户名更改为被窃取者的用户名一样可以访问邮件服务器……

4.kerberos的完善3

下一个遐想的产生,在防止认证服务返回票给用户时,被窃取票。票中加入另一项认证因素:IP地址 在邮件服务器用自己的密码解密之后获得用户的用户名和IP地址以及自己的服务名,在用户名确定的情况下再次确定IP地址以防止票被窃取。所以票的内容如下所示:
票{用户名:IP:服务名}
但是还有一个问题,如果我使用完邮件服务器再去使用文件服务器时,我需要将用户名密码再次发送到认证服务中重新获取文件服务器的票。这样多次输入密码过于繁琐,密码在网络中传输也会有过多其他的问题…..

5.kerberos的完善4

下一个遐想的产生,解决上一个提出的第一个问题,多次输入密码。在引入一个对象进来,这个对象叫做票据授权。采用上文相同的流程,向认证服务获取票,这个票叫做票据授权票,用户拿着这个票据授权票再去访问票据授权的服务获取邮件服务器的票,文件服务器的票。与上个小节不同的是,向认证服务获取的票据授权的票是不需要每次都申请的。只需要申请一次,然后拿着这个票去访问票据授权服务获得不同的票解决了上一个小结的第一个疑问重复输入密码。
上小结的第二个疑问,密码传输的问题。其实不用,用户向认证服务获取票据授权的票时只需要输入用户名,然后认证服务读取数据库此用户名的密码。用此用户名的密码加密此票然后发送给用户,用户输入密码解密此数据包。如果解密成功即拥有了票据授权的票。然后去访问票据授权服务取其他服务的票。然后给这个票加上使用期限,这个票如下所示:
票{用户名:IP:服务名:有限期:时间戳}
但是又出现一个问题,IP和用户名不能伪造嘛……

6.kerberos的完善5

重新梳理认证流程:如果我需要访问一个服务,我需要给服务器传递以下信息:用户名,IP,服务名,有限期,时间戳。而这些内容都被服务的密码加密了,思考….
● 票能否被解密?
● 票是否在有效期?
● 票上的用户名和IP地址是否和用票者的匹配?
第一个问题可以确定票是否具有真实性,因为是服务端的密码加密的,如果解密不了说明票是伪造的
第二个问题可以确定票是否是旧票还是否在使用期限内
第三个问题是验证票是否是本人在使用,如果用户名IP匹配不上说明票被偷窃。
但是IP和用户名都是可以被伪造的,所以服务和用户之间需要某种密钥。这种密钥可以保证此票不被盗用。
于是流程如下:认证服务返回一个密钥和票,票的内容
票{密钥:用户名:IP地址:服务名:有效期:时间戳},然后在请求服务时,会生成一个“认证器”,认证器被密钥加密内容如下:
认证器{用户名:IP地址}被密钥加密
然后将认证器和票一起发送给服务,服务用自己的密码解开票获取密钥,在用密钥揭开认证器,用票里的ip和用户名与认证器中的ip和用户名做对比….但是将认证器和票一起投来就可以了……..

7.kerberos的完善6

在认证器和票一起发送时产生窃取行为一样没用,但是值得注意的是,窃取者获得的认证器和票肯定晚于用户,所以只要给认证器加上使用次数就可以解决。当窃取者获取到认证器时次数已经被使用便不再生效了。
所以可以将时间戳和有效期放在认证器上,即使认证器被窃取想在两分钟内修改IP和用户名基本不可能。

 

总结

此文描述了kerberos的产生原因和进化的流程,我想在此处感谢那些分享过kerberos的人,这篇文章收集了大多数网上的文章加上自己的理解诞生。整个流程较为复杂,但是我想我把它讲清楚了,只是需要反复理解和消化。终有一天,你会发现事物的本质是如此的重要….

(完)