前面我们介绍了《Windows本地认证》、《Windows网络认证》、《Windows域认证》和《SPN扫描》,这次继续讲解域内相关的东西。

0x01介绍

当发布Windows 2000和Active Directory时,微软打算在 Windows NT 和Windows 95 上也支持Active Directory,这意味着不仅会产生各种各样的安全问题也会导致更多不安全的配置方式。同时,也意味着,微软要保证在多个不同版本的 Windows 客户端上均支持Kerberos协议。要实现这个想法的一个简单的办法就是在Kerberos协议中使用·RC4加密算法·,并将NTLM密码哈希作为该加密算法的私钥,该私钥可用于加密或签名Kerberos票证。因此,对于攻击者来说,一旦发现了 NTLM 密码哈希,就可以随意使用,包括重新拿回Active Directory域权限(比如:黄金票证和白银票证攻击)。

之前我们已经了解过通过SPN来进行域内服务发现,如果对spn还没有了解透彻的,请移步“SPN扫描”

0x02 Kerberos通信流程

这里借鉴一下网上给出的Kerberos的通信流程

用户使用用户名和密码进行登录

1a.将原始的明文密码转换为NTLM哈希,再将这个哈希和时间戳一起加密。最后,将加密的结果作为身份验证者发送到KDC进行身份验证的票据(TGT)请求(AS-REQ)。

1b.域控(KDC)检查用户信息(登录限制,组成员等)并创建票证授权票证(Ticket Granting Ticket-TGT)。

2.将TGT加密,签名并返回给用户(AS-REP)。只有域中的Kerberos服务(KRBTGT)才能打开和读取TGT数据。

3.当用户请求票证授权服务(TGS)票证(TGS-REQ)时,会将TGT发送给DC。 DC打开TGT并验证PAC校验和 – 如果DC可以打开票证并且校验和也可以验证通过,那么这个TGT就是有效的。之后,复制TGT中的数据用于创建TGS票证。

4.使用目标服务帐户的NTLM密码哈希对TGS进行加密并将加密结果发送给用户(TGS-REP)。

5.用户连接到服务器托管的服务的相应端口上并发送TGS(AP-REQ)给服务器。被托管的服务会使用服务账户的NTLM密码哈希打开TGS票证。

6.如果客户端需要进行相互之间的身份验证(可以想想MS15-011:在2月份发布的强化UNC的组策略补丁)就会执行这一步。

在第四步的时候,用户将受到由目标服务实例的NTLM hash加密生成的TGS,他的加密算法为·RC4-HMAC·,那么我们在获得这个TGS后,便可以通过穷举的方式,生成TGS与它进行比较,如果相同,就可以代表密码正确

然后还有几点是需要大家明白的

1.当域控查询某一个服务的SPN时

如果该SPN注册在机器账户computers下,将会查询所有机器账户的servicePrincipalName属性,找到所对应的账户。

如果是注册在域用户账户users下,将会查询所有域用户账户的servicePrincipalName属性,找到其所对应的账户。

找到对应的账户之后,使用它的NTLM hash生成TGS。

2.域内的所有主机都是可以查询SPN的

3.域内的任何用户都是可以向域内的任何服务请求TGS

所以,域内的任何一台主机,都可以通过查询SPN,向域内的所有服务请求TGS,然后进行暴力破解,但是对于破解出的明文,只有域用户的是可以利用的,机器账户的不能用于远程连接,所以我们的关注点主要就在域用户下注册的SPN

0x03 实验

首先我们先登陆服务器


域控
192.168.5.130
Administrator Win7
192.168.5.238
机器账号SECQUAN_WIN7-PC\secquan_win7
域用户账号ZHUJIAN\win7

我们使用下列命令来进行查询

setspn -q */*

这个内容我们在spn扫描中也已经说明了,而且我们也发现MSSQL服务是注册在机器账户下的,前面也说过了,我们要关注的是域用户下注册的SPN

这里还有一个东西需要注意一下,在使用 Kerberos 身份验证的网络中,必须在内置计算机帐户(如 NetworkService 或 LocalSystem)或用户帐户下为服务器注册 SPN。

** 对于内置帐户,SPN将自动进行注册。但是,如果在域用户帐户下运行服务,则必须为要使用的帐户手动注册SPN,所以我们需要手动在域用户下注册SPN。

我们先使用 klist 命令,查询一下当前计算机下所存在的票据

紧接着,我们来给域用户下的MSSQL服务注册SPN

setspn -A MSSQLSvc/SECQUAN_WIN7-PC.zhujian.com zhujian\win7

注册完成后,我们再进行查看,确保已经注册到这个域用户下

可以发现已经多了一行域用户的值

然后 请求SPN Kerberos Tickets

Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList " MSSQLSvc/SECQUAN_WIN7-PC.zhujian.com "

然后再次查询所存放的票据

比之前多了一条,且加密类型是RC4-HMAC

然后使用mimikatz来导出票据

接下来便可以使用tgsrepcrack或者保存hash使用hashcat破解

这里我们使用tgsrepcrack来进行测试

python tgsrepcrack.py mima.txt 1-40a00000-win7@MSSQLSvc~SECQUAN_WIN7-PC.zhujian.com-ZHUJIAN.COM.kirbi

可以发现已经成功爆破得到密码

** PS:使用其他工具的方法都是类似的,工具都一样,重点在字典上

0x04 kerberoasting后门利用

如果我们有了SPN的注册权限,我们就可以给指定的域用户注册一个SPN,然后获取到TGS,然后破解得到密码

这里我们用网上的一个例子来让大家明白一下流程即可,其他的内容均与前面所讲到的相同

文章首发公众号:无心的梦呓(wuxinmengyi)

这是一个记录红队学习、信安笔记,个人成长的公众号

扫码关注即可

Kerberoasting攻击的更多相关文章

  1. 使用AS-REP Roasting和kerberoasting攻击kerberos

    准备工作 ''' PowerView是PowerSploit框架的一个子集,里面继承了很多和渗透相关的powershell脚本下载地址:https://github.com/PowerShellMaf ...

  2. SPN扫描

    0x01介绍 Kerberos是一种支持票证身份验证的安全协议.如果客户端计算机身份验证请求包含有效的用户凭据和服务主体名称 (SPN),则 Kerberos 身份验证服务器将授予一个票证以响应该请求 ...

  3. 域渗透-Kerberos协议中spn的应用

    0x01 关于SPN 服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称. 服务主体名称是服务实例(可以理解为一个服务,比如 HTTP.MSSQL ...

  4. 域渗透 | kerberos认证及过程中产生的攻击

    ​文章首发于公众号<Z2O安全攻防>​ 直接公众号文章复制过来的,排版可能有点乱, 可以去公众号看. https://mp.weixin.qq.com/s/WMGkQoMnQdyG8UmS ...

  5. 防御XSS攻击-encode用户输入内容的重要性

    一.开场先科普下XSS 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶 ...

  6. 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)

    上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...

  7. 【趣事】用 JavaScript 对抗 DDOS 攻击

    继续趣事分享. 上回聊到了大学里用一根网线发起攻击,今天接着往后讲. 不过这次讲的正好相反 -- 不是攻击,而是防御.一个奇葩防火墙的开发经历. 第二学期大家都带了电脑,于是可以用更高端的方法断网了. ...

  8. 超大 Cookie 拒绝服务攻击

    有没有想过,如果网站的 Cookie 特别多特别大,会发生什么情况? 不多说,马上来试验一下: for (i = 0; i < 20; i++) document.cookie = i + '= ...

  9. 前端学HTTP之web攻击技术

    前面的话 简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标.本文将详细介绍攻击web站点 ...

随机推荐

  1. 电话面试总结(问的很细).md

    String 和其他基本类型有什么区别 Tip 基本类型有几种 为什么要给String创建一个常量池而不给其他类创建常量池 常量池的定义是什么 垃圾回收机制是如何运行的 对新生代和老年代不同的处理机制 ...

  2. Docker搭建Zookeeper&Kafka集群

    最近在学习Kafka,准备测试集群状态的时候感觉无论是开三台虚拟机或者在一台虚拟机开辟三个不同的端口号都太麻烦了(嗯..主要是懒). 环境准备 一台可以上网且有CentOS7虚拟机的电脑 为什么使用虚 ...

  3. Linux系统下LNMP架构搭建

    一.防火墙状态: 1.查看防火墙状态: systemctl status firewalld service iptables status firewall-cmd --state 2.永久有效开启 ...

  4. JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

    前言 想写好前端,先练好内功. 栈内存与堆内存 .浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScri ...

  5. vue-cli3.x创建及运行项目

    Node 版本要求 Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+).如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm un ...

  6. javaScript 基础知识汇总(四)

    1.对象 概念:对象可以通过花括号{...} 和其中包含一些可选的属性来创建. 属性时一个键值对,键是一个字符串,值可以是任何类型. 对象的创建 let user = new Object(); // ...

  7. NLP(二十二)使用LSTM进行语言建模以预测最优词

    预处理 数据集使用Facebook上的BABI数据集 将文件提取成可训练的数据集,包括:文章 问题 答案 def get_data(infile): stories,questions,answers ...

  8. 关于dijkstra的优化 及 多源最短路

    先来看这样一道题目 给你N个点,M条双向边,要求求出1号点到其他所有点的距离.其中 2 <= N <= 1e5,  1 <=M <= 1e6. 对于这样的一道题目 我们当然不可 ...

  9. Codeforces 964C Alternating Sum

    Alternating Sum 题意很简单 就是对一个数列求和. 题解:如果不考虑符号 每一项都是前一项的 (b/a)倍, 然后考虑到符号的话, 符号k次一循环, 那么 下一个同一符号的位置 就是 这 ...

  10. 牛客小白月赛4 J 强迫症 思维

    链接:https://www.nowcoder.com/acm/contest/134/J来源:牛客网 题目描述 铁子最近犯上了强迫症,他总是想要把一个序列里的元素变得两两不同,而他每次可以执行一个这 ...