什么是令牌
令牌(Token)是指系统中的临时密钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个账户的。获得了令牌,就可以在不提供密码或其他凭证的情况下访问网络和系统资源。令牌会持续存在于系统内部,除非操作系统重新启动。
令牌最大的特点是随机性和不可预测性。一般的攻击者或软件都无法将令牌猜测出来。访问令牌(Access Token)代表访问控制操作主题的系统对象。密保令牌(Security Token)也叫作认证令牌或硬件令牌,是一种用于实现计算机身份校验的物理设备。会话令牌(Session Token)是交互会话的唯一身份标识符。
伪造令牌原理
伪造令牌的核心协议是Kerberos协议。kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。这里有一篇文章详细地介绍了kerberos认证流程 Kerberos协议认证,这里我简单叙述一下客户端请求证书的过程
- 客户端向认证服务器发送请求,要求得到证书
- 认证服务器收到请求后,将包含客户端密钥的加密证书发送给客户端。该证书包含服务器Ticket(由服务器密钥加密的客户机身份和一份会话密钥)和一个临时加密密钥(Session Key)。当然,认证服务器也会向服务器发送一份证书,使服务器能够验证登录的客户端的身份。
- 客户端将Ticket传送给服务器。如果服务器确认该客户端的身份,就允许它登录服务器。
- 客户端登陆服务器后,攻击者就能通过入侵服务器来窃取客户端的身份了。
令牌窃取
倘若我们已经拿到了域普通用户的其中一个权限,但是我们无法获取到更高的权限和管理员的令牌
我们使用local_exploit_suggester
模块对操作系统进行漏洞扫描,获取到了许多的漏洞信息
倘若我们获取到了管理员的权限,我们能看到以下的令牌
然后我们使用bypassuac_dotnet_profiler
模块对其进行提权,获取到了目标系统的system权限
然后我们列出系统的所有相关令牌
这里解释一下,令牌的种类有两种,一种是
Delegation Tokens
(授权令牌),它支持交互式登录;另一种是Impersonation Tokens
(模拟令牌),它支持非交互式登录。令牌的数量取决于我们获取到的shell的权限级别,权限越高,获取到的令牌数量就越多。如果攻击者伪造管理员的令牌,便可以拥有与它同等的权限。
接下来我们要进行令牌的窃取,我们要窃取的令牌是域管理员的令牌,我们输入以下命令impersonate_token HACKE\\Administrator
,注意这里要加两个斜杠,否则会操作失败的
添加域管理员
如果我们已经获取到了目标系统的System权限,并且网络中设置了域管理进程,我们可以把进程进行迁移到域管理员进程上
我们使用如下命令在域内添加一个域管理员用户
net user shuteer xy@china110 /ad /domain
net group "domain admins" shuteer /ad /domain
net group "domain admins" /domain
同样,我们也可以使用另一种方式,在我们进行进程迁移到域管上后,我们可以直接在meterpreter shell
上执行添加域管理员的操作,因为meterpreter它是在内存上进行访问的,因此这种方式不会留下日志痕迹,这种方式更优
add_user shuteer xy@china110 -h 域控的IP地址
add_group_user "Domain Admins" shuteer -h 域控IP地址
Empire下的令牌窃取
我们使用Empire工具时,可以直接使用mimikatz
工具获取系统密码。可以看到我们抓取了域内两个用户的明文密码和对应的hash值
这里的CredID就是对应的ID值,我们使用相应的命令就能窃取到Administrator的身份令牌了
我们可以查看到对应的PID值
进程的相关信息
恢复令牌的权限
防范对策
- 及时安装微软推送的补丁
- 对来路不明的或者有危险的软件,既不要在系统中使用,也不要在虚拟机中使用
- 对令牌的时效性进行限制,以防止散列值被破解后泄露有效的令牌信息。越敏感的数据,其令牌时效应该越短。如果每个操作都使用独立的令牌,就可以比较容易定位泄露令牌的操作或环节
- 对于令牌,应采取加密存储及多重验证保护
- 使用加密链路SSL/TLS传输令牌,以防止中间人窃听