域渗透学习
[TOC]
在渗透测试过程中,我们经常会遇到以下场景:某处于域中的服务器通过路由做端口映射,对外提供web服务,我们通过web脚本漏洞获得了该主机的system权限,如果甲方有进一步的内网渗透测试需求,以证明企业所面临的巨大风险,这个时候就需要做内网的域渗透。通常,我们是以获得域控制器的权限为目标,因为一旦域控制器沦陷,整个内网就尽在掌握中了。
一、环境配置
在开始之前,需要先配置好⼀个域环境。因为用于教学测试,所以只需一台域控和一台加入域内的主机即可。这里我使用的是 windows server 2012 与 windows 7。通过攻击拿下 windows 7 或者直接操控 windows 7,来模拟被攻陷的主机,从而进行域方面是渗透学习。
windows server 2012 存在Administrator用户(域控超级管理员用户)、Windows7的dada用户(加入管理员组的用户)、Windows7的xiao用户(普通域用户)
二、域内信息收集
所有渗透测试的第⼀步,都是信息收集,域也不例外。
①确定环境
在域内需要先确定被攻击主机的当前内网环境,如拓扑等信息,可以使用以下命令来快速定位。
| |
- 在渗透时,拿到的数据记得保存,不要看一眼就没了,也尽量不要重复查看,所有的动作都要求干净利索。
②域内信息
除了了解内网环境外,还可以通过命令来直接查看域的相关消息。
1、net view
查看本地工作组/域环境中的设备
查看域内在线主机,此时可以看⻅域内的两台机器,⼀台被攻陷的XZM-PC和域控AD。

如果报错6118 =>
1、关闭防火墙;2、开启服务(Computer Browser、Server、Workstation);3、重新打开CMD即可
2、net view /domain
查看当前有几个域。可以看见此时有一个MAO域。

3、net user /domain
查看域内⽤户,可以看⻅除了常⻅的管理员和来宾,域内还有⼀个krbtgt⽤户,这个⽤户⾮常重要,稍后会讲到。

4、net group /domain
查看域的组别信息

这⾥可以看⻅组较多,这⾥列出⼏个关键组了解⼀下。
*Domain Admins 管理员组
*Domain Computers 主机名
*Domain Controllers 域控组
*Enterprise Admins 企业级管理员
可以通过 net group 组名 /domain 来查看组内⽤户。
5、whoami /user
确定自身权限

- 500:administrator
- 501:guest
- 1000+:普通用户
6、net group “domain controllers” /domain
查看域控管理员组的成员(域内高权限组)

- Domain Admins 域控管理员组(高权限)
- Domain Computers 加入域内的主机成员
- Domain Controllers 域控(高权限)
- Domain Users 域内普通用户
- Enterprise Admins 企业管理员(高权限)
8、systeminfo | findstr “KB”
查看补丁信息

7、定位域控
域控作为域的最⾼权限,⾃然是⾸要的攻击⽬标,可以通过刚才的⼀些已知的命令,来找到域控。
通过 net user /domain 来查看域内的账户;通过 net group "domain controllers" /domain 来查看域控。自身权限可以使⽤ whoami /user 命令快速查看。
三、本地认证
①Windows本地认证
在开始攻击之前,需要先了解⼀下 windows 的认证机制。
通过操作系统的学习,已知 C:\Windows\System32\config\SAM 是储存主机账号密码的数据库⽂件。
windows 登⼊的过程其实很简单,启动winlogin.exe,当⽤户输⼊账号密码后,账号密码将会发送到lsass.exe,lsass.exe将会把⽤户输⼊的明⽂,转换为NTLM hash与,SAM⽂件存储的数据做⽐较,⽐较成功即登⼊成功。

Windows Logon: 是wWindows操作系统的用户登录程序,负责管理用户的登录和登出过程。它提供了用户输入账号和密码的界面,也称为登录页面或登录屏幕。
lsass: 是微软windows系统的安全机制,是Windows操作系统中的一个关键进程,负责处理本地安全和登录策略。它在Windows系统启动时自动启动,并一直运行在后台。
②NTLM hash
当然,windows本身是不会存储明⽂密码的,在SAM⽂件中所存储的是密码的散列值,⽽在登⼊的时候,也是先将⽤户输⼊转换为散列值,才进⾏对⽐的。
Hash一般存储在两个地方:
- 1、SAM文件,存储在本机 => 对应本地用户
- 2、NTDS.DIT文件,存储在域控上 => 对应域用户
1、加密过程
⽤户输⼊的明⽂密码 => ⼗六进制 => unicode => md4 算法 => NTLM hash。可以看⻅,整个加密过程还是较为简单的。
2、存储的密码格式
例:administrator:500:LM hash:NTLM hash
可以看⻅,先是⽤户名,再是该⽤户的 SID,后⾯跟着 LM hash 和 NTLM hash
如果LM Hash 是 AAD3B 开头,则是空密码或者未设置密码。
LM Hash全名为 “LAN Manager Hash”,是微软为了提⾼Windows操作系统的安全性⽽采⽤的散列加密算法,其本质是DES加密。尽管LM Hash较容易被破解,但是为了保证系统的兼容性,Windows只是将LM Hash禁⽤了(从Windows Vista和Windows Server 2008版本开始,Windows操作系统默认禁⽤LM Hash),LM Hash明⽂密码被限制在14位以内,也就是说,如果要停⽌使⽤LM Hash,将⽤户的密码设置为14位以上就好了。
3、lsass.exe
在内⽹渗透进⾏横向移动和权限提升时,最常⽤的⽅法是通过 dump 进程 lsass.exe,从中获得明⽂⼝令或者hash。 lsass.exe(Local Security Authority SubsystemService)是⼀个系统进程,⽤于微软Windows系统的安全机制,它⽤于本地安全和登陆策略。在进程空间中,存有着机器的域、本地⽤户名和密码等重要信息。但是需要⾸先获得⼀个⾼的权限才能对其进⾏访问。
四、从 lsass.exe 获取密码
①Procdump
procdump是⼀款命令⾏⼯具,主要⽤途是监视应⽤程序的CPU异常动向,并且对内存做⼀个转储。上⾯提到了密码的明⽂与密⽂都存储在lsass⾥,所以使⽤procdump即可将 lsass 的内存资源转储出来。以下是它的⼀些参数。
1、相关参数
- -ma:写⼊“完整”转储⽂件。【包括所有内存 (映像、映射和专⽤);包括 (进程、线程、模块、句柄、地址空间等) 的所有元数据】
- -accepteula:使⽤该命令行选项时,表示⾃动接受Sysinternals许可协议。
2、简单使用
使⽤⽅式⾮常简单,指定参数和要转储内存的⽂件后,再指定保存的⽂件名,即刻获得后缀名为 .dmp 的内存转储⽂件。(需要管理员权限的命令行窗口才可操作)
| |

正常我们是打不开passwd.dmp这个文件的,要是以记事本打开也都是乱码。这时,我们就要用到另一个小工具Mimikatz进行对passwd.dmp进行读取
②Mimikatz
Mimikatz 是法国⼈benjamin开发的⼀款功能强⼤的轻量级调试⼯具,本意是⽤来个⼈测试,但由于其功能强⼤,能够直接读取WindowsXP-2012等操作系统的明⽂密码⽽闻名于渗透测试,可以说是渗透必备⼯具。
1、相关参数
因为 mimikatz 参数较多,这⾥只介绍常⽤的参数。
| |
- privilege 模块
(需要管理员权限的命令行窗口才可操作)
| |
- sekurlsa 模块
| |
- lsadump 模块
| |
- kerberos 模块
| |
- process 模块
| |
Mimikatz 因为效果太好导致会被杀毒警报,若是想在⽬标机器运⾏先考虑是否需要对 Mimikatz 做免杀处理。
2、简单使用
Mimikatz 能够从内存中提取纯⽂本密码,通过参数 sekurlsa::minidump 载⼊刚才procdump 获取的 dmp ⽂件后,就可以使⽤ sekurlsa::logonpasswords full 等命令,对密码进⾏读取。实现效果如下图:
| |


在这⾥可以看⻅图中带有管理员信息,若是中真实环境中拿到此信息基本就宣告着结束。
3、进阶使用
①利用procdump导下来的dump文件与mimikatz配合使用获取凭据
| |
②直接利用minikatz获取凭据(需要管理权限)
| |
拥有本地管理员权限
获取密码
| |
绕过LSA防护策略读取密码
| |
总结流程:
- 获取NTLM hash
- 使用procdump/PPLdump dump lsass进程
- 用mimikatz分析dump文件提取hash
- 利用NTLM hash 选择路径:
- 破解hash获取明文密码
- 直接使用hash进行PTH攻击(适用于无法破解情况)
关键点:
- NTLM hash在所有Windows系统中生成方式相同(MD4)
- 相同密码在不同机器生成相同hash
- PTH不需要明文密码就能进行认证
- dump lsass会包含所有已登录用户的凭据信息:
特别点:
- 当前登录的管理员用户hash
- 其他已登录用户的hash
- 系统服务账户的hash
但要注意:
- 只能获取已登录过的用户hash
- 未登录过的用户信息不会在lsass中
实际上md4解密也能获得明文密码
五、实验:PTH(pass-the-hash)哈希传递
①简介
哈希传递是⼀种⿊客技术,攻击者可⽤使⽤⽤户密码的hash对远程服务器进⾏身份验证,扩⼤战果。其实就是⼀种 撞库 的⾏为。在拥有NTLM hash的情况下,我们可以⾮常轻易的使⽤mimikatz的 sekurlsa::pth 发起⼀次 PTH。
- 攻击缺陷:hash 要保持静态(不修改密码)
- 适⽤于:域/⼯作组、可⽤获取 hash 但是不能爆破 hash,且内⽹有相同密码的机器。
- KB2871997:修复了普通⽤户能够 pth,但是管理员除外,系统 >= win server 2012时,⽆法通过 lsass 进程中抓取明⽂密码。
因 KB2871997 修复了普通⽤户能够 pth,所以需要使⽤ privilege::debug 来提升权限(在⾼权限终端下)。
②基本条件
使⽤mimikatz的sekurlsa::pth模块⾄少需要知道以下条件:
- pth 的对象 :使⽤
net user /domain等命令即可查看域内⽤户信息 - 域名 :使⽤
net view /domain等命令即可查看域名 - NTLM hash :可以通过使⽤procdump配合mimikatz获取
| |
③适用条件
适用于无需用户密码,只能拿到域控的NTLM Hash,而且无法解密的情况。
④信息收集
寻找pth的对象 => Administrator

查看管理员组成员 => 选择攻击 Administrator

域名 => MAO

拿到管理员的ntml hash => 570a9a65db8fba761c1008a51d4c95ab
| |

⑤发起攻击
法一:mimikatz直接pth
| |
拿下域控权限。(如果参数都填写正确的情况下,还是无法攻击成功的话,尝试关闭mimikatz窗口,重新以管理员启动cmd.exe,重新提升权限,再进行攻击。run后面的命令不写也行,默认开启域控的cmd.exe)

法二:凭据传递脚本获取shell
| |

| |
六、Kerberos认证协议
Kerberos是⼀种第三⽅认证协议,通过使⽤对称加密技术为客户端/服务器应⽤程序提供强身份验证。在希腊神话中Kerberos是守护地狱之⻔的⼀条三头神⽝,⽽这三个头分别代表着协议的三个⻆⾊,如下图所示它们分别是:
1、访问服务的Client(发送请求的一方)
2、提供服务的Server(接收请求的一方)
3、KDC,密钥分发中⼼,该中⼼⾥⼜包含以下两个服务:
- AS,身份验证服务(认证服务器)【专门用来认证客户端的身份并发放客户用于访问TGS的TGT】
- TGS,票据授权服务(票据授予服务器)【用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据】

- DC(Domain Controller):域控制器
- KDC(Key Distribution Center):密钥分发服中⼼
- AS(Authentication Server):认证服务器
- TGS(Ticket Granting Server):票据授权服务器
- TGT(Ticket Granting Ticket):票据授权票据
认证概述
1、⾸先客户端向 AS 发起请求,获得TGT。
2、客户端使⽤从 AS 获得的TGT,向 TGS 发起请求,TGS 成功解密 TGT 后,生成新的票据返回给客户端。
4、客户端使⽤ TGS 返回的新票据向服务器发送请求进⾏授权。
七、实验:PTC(pass-the-ccahe)缓存传递
如果能够拿到⽤户的 TGT,并将其倒⼊到内存,那么就可以冒充该⽤户获得其访问权限。
①MS14-068漏洞
MS14-068 是密钥分发中⼼(KDC)服务中的 Windows 漏洞。它允许经过身份验证的⽤户在其 Kerberos 票据(TGT)中插⼊任意 PAC(表示所有⽤户权限的结果)。该漏洞位于kdcsvc.dll 域控制器的密钥分发中⼼中。⽤户可以通过呈现具有改变 PAC 的 kerberos TGT 来获得票据。
需要⾼权限。
影响范围
- Windows Server 2003、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012 及 Windows Server 2012 R2
- Windows Vista、Windows 7、 Windows 8 及 Windows 8.1
补丁编号与利⽤条件
补丁编号:KB3011780
利⽤条件:
- 获取到⼀台主机的权限(域内主机)
- 收集到计算机域任意用户⽤户的账号密码、SID、域名信息
- 没打 MS14-068 补丁
#这个教程有问题 如果有管理员的账号和密码 大概率可以走PTH 而MS14-068的特点是普通域账户可以提权到域管理员 所以这个漏洞危害才会那么大 而这里任意一个普通域用户就行
②信息收集
| |


Windows对大小写不敏感,所以mao.com和MAO.COM均可


③漏洞利用
1、生成域控管理员密钥
| |

2、将内存中导入生成好的票据
然后使⽤mimikatz的 kerberos::ptc 模块来载⼊票据。
| |

3、开启当前权限的管理员终端
使⽤mimikatz的 misc::cmd 模块,打开打开⼀个新窗⼝验证我们当前权限。
| |

4、PsExec.exe获取一个交互式shell
用刚刚生成的管理员终端使用PsExec.exe工具获取一个交互式shell,并创建了隶属于管理员组的用户
| |


PTC linux
- 查找票据缓存文件:
| |
- 导入票据:
| |
- 使用票据:
| |
主要使用场景:
- Linux加入域环境
- 域内渗透测试
- 跨平台攻击
八、实验:PTT(pass-the-ticket)黄金票据
①简介
KDC 的作⽤是⽣成任意⽤户的 TGT,那么问题来了,是什么条件能够让他⽣成任意⽤户的 TGT 呢?还得看 kerberos 认证的过程,在 windows 认证过程中,客户端将⾃⼰的信息发送给 KDC,然后 KDC 使⽤ krbtgt ⽤户密码的 NTLM hash 作为密钥进⾏加密,⽣成 TGT。
一句话:TGT是KDC使用 krbtgt 用户密码的 hash 作为密钥,加上客户端自己的信息生成的。
那么如果获取到了 krbtgt 的密码 hash 值,是否就可以伪造任意 TGT?答案是肯定的。但因为 krbtgt 只有域控制器上才有,所以使⽤⻩⾦票据(票据传递攻击)意味着之前就拿到了域控制器的权限,所以⻩⾦票据可以理解为⼀个后⻔。
Krbtgt ⽤户在域控创建完成后⾃动⽣成。
只要krbtgt用户不更改密码,就可以使用黄金票据是实现任何用户的票据信息,注入到内存中。
黄金票据在使用的过程需要同域控通信。
②基本条件
- 域名称、域 SID(去掉rid):通过
whoami /user获取 - 要伪造(目标)的⽤户名:通过
net user /domain等⽅法获取 - krbtgt⽤户的hash:通过 mimikatz 等⽅法获取
③信息收集
mimkatz获取 krbtgt hash(只有这一步才需要在域控上操作) => e798fdc7ba810c372ef7bffcdc8f2d13
由于mimkatz使用条件有点苛刻,且mimkatz软件问题,在命令行直接复制mimkatz内容可能无法成功或者直接到导致程序崩溃,那么这里可以通过生成log来解决。
| |

域SID(不需要权限的域SID): whoami /user => S-1-5-21-863777703-696496247-1862912240(最后的一个横线后表示用户权限。因此只需要前半部分)
伪造(目标)的⽤户名:net user /domain => Administrator
域名称(完整域名):ipconfig /all => mao.com

③漏洞利用
管理员窗口操作
1、清除原有票据
因为在⽣成票据时需要将原有的票据清空,所以⼀旦票据⽣成失败,主机也将⽆法继续访问域内信息了(脱域)。
使⽤ kerberos::purge 清空票据后,就可以使⽤ kerberos::golden ⽣成票据了。
| |

2、⽣成票据
| |

3、注入票据
| |

4、生成域控会话
| |


https://blog.csdn.net/m0_55751267/article/details/127990619 此处有白银和黄金票据的原理
此处的博客:https://xz.aliyun.com/t/13435?time__1311=Gqmxu7G%3D5mq05DK5YK0%3DIouDfxiT277GbD
免杀mimikatz https://github.com/wangfly-me/mimikatz_bypass/releases/tag/v1.0
参考如下: