破解与执行
20、Hashcat 的使用
1、介绍
Hashcat 是一款用于破解密码的工具,据说是世界上最快最高级的密码破解工具,支持 LM 哈希、MD5、SHA 等系列的密码破解,同时也支持 Linux、Mac、Windows 平台。
工具地址:https://hashcat.net
项目地址:https://github.com/hashcat/hashcat
2、安装
Mac
Mac 用户直接使用 brew 安装即可
Linux
对于 Debain 的 Linux,比如 Kali、Ubuntu 可以直接使用 apt 进行安装
或者下载官方二进制文件进行安装
在 https://github.com/hashcat/hashcat/releases 里下载最新版压缩包,这里以 6.2.4 版为例
Windows
在 https://github.com/hashcat/hashcat/releases 里下载最新版压缩包,解压后可以看到 hashcat.exe
3、使用
常用参数:
-a 破解模式:
-D 指定设备类型
一般使用 -D 2 指定 GPU 破解
掩码设置:
掩码设置举例:
自定义掩码规则:
在掩码中用 ?1、?2、?3、?4 来表示
注意:
--custom-charset1 abcd ?1?1?1?1?1 等价于 -1 abcd ?1?1?1?1?1
-3 abcdef -4 123456 ?3?3?3?3?4?4?4?4 表示前四位可能是 adbcdef,后四位可能是 123456
另外 Hash 模式与 ID 的对照表由于太长,这里就不放了,可以直接 hashcat -h 进行查看
4、示例
MD5
密码为 8 位数字
密码为 4 位小写字母+数字
密码为 1-4 位大写字母+数字
指定特定字符集:123456abcdf!@+- 进行破解
由于在终端里可能会把部分字符识别为特殊字符,因此需要转义一下
如果不知道目标密码的构成情况,可以直接使用 ?a 表示使用所有字符进行破解
使用字典破解
使用字典批量破解
字典组合破解
经过测试,这里的字典组合破解,不是说简单的将两个字典的内容合并去重形成 1 个字典进行去重,而是说字典 1 的内容加上字典 2 的内容组合成一个字典,例如:
pwd1.txt 字典为:
pwd2.txt 字典为:
那么组合后的字典就是这样的:
字典+掩码破解,也是和上面一样的组合方法,只不过 pwd2.txt 换成了掩码
Mysql4.1/5
可以使用 select authentication_string from mysql.user; 查看当前数据库中的密码哈希值。
sha512crypt
, SHA512 (Unix)
sha512crypt , SHA512 (Unix) 破解,为了避免系统误识别到特殊字符,这里为哈希值加了单引号
可通过 cat /etc/shadow 获取哈希值
或者不删除用户名,直接使用 --username 参数
NTLM
NT Hash
LM Hash
NetNTLM Hash
MSSQL (2005)
WordPress 密码 hash
具体加密脚本在 ./wp-includes/class-phpass.php 的 HashPassword 函数
Discuz 用户密码 hash
其密码加密方式 md5(md5(
salt)
RAR 压缩密码
首先获取 rar 文件的 hash 值,我们可以使用另一款哈希破解工具 John 提供的 rar2john 工具将 rar 文件里的 hash 提取出来。
rar2john 下载地址:http://openwall.info/wiki/_media/john/johntheripper-v1.8.0.12-jumbo-1-bleeding-e6214ceab-2018-02-07-win-x64.7z
hashcat 支持 RAR3-hp 和 RAR5
对于 RAR5,示例如下:
对于 RAR3-hp
RAR3-hp 哈希头为
*0*,而不是
*1*,中间的数值是0(-hp)而不是1(-p),-p 尚未得到支持,只支持 -hp
关于 RAR 参数 -p 和 -hp 的区别: -p:只对 RAR 文件加密,里面的目录和文件名没加密; -hp:对目录中的文件名和子目录都进行加密处理
ZIP 压缩密码
和 rar 破解过程一样,我们需要先提取 zip 文件的哈希值,这里可以使用 zip2john 进行获取,zip2john.exe 在上面下载的 rar2john.exe 的同级目录下。
这里 ZIP 的加密算法使用的 AES256
office 密码
和 rar 与 zip 破解过程一样,我们需要先提取 office 文件的哈希值,这里可以使用 office2john.py 进行获取,office2john.py 在上面下载的 rar2john.exe 和 zip2john.exe 的同级目录下。
测试中发现 python 会出现告警信息,不过这个告警信息不会影响程序执行
这里哈希头为 2013 所以使用 9600 破解模式,如果是 2010 则要使用 9500 破解模式,2007 则使用 9400 破解模式。
WIFI 密码
要破解 WIFI 密码,首先要抓到 WIFI 的握手包,要想得到 WIFI 的握手包,就需要在监听时刚好有设备连接了该 WIFI,但这就需要运气加成,因此可以我们可以主动将该 WIFI 的设备踢下去,一般设备就会自动连接该 WIFI,此时我们就抓到握手包了。
抓取 WIFI 握手包
1、将网卡处于监听状态
wlan0 是网卡名称,一般都是 wlan0,如果不是则需要根据自己的情况进行修改,可通过 iwconfig 进行查看网卡的名称
当使用 iwconfig 查看网卡名称变为 wlan0mon 说明此时网卡已经处于监听模式了
2、扫描可用 WIFI

3、获取wifi的握手包
这里以 ssid 为 teamssix 的 WIFI 为例
为了顺利得到 WIFI 的握手包,可以将该 WIFI 下的设备强制踢下去

可以看到 teamssix 这个 WIFI 有一个设备正在连接,该设备的 MAC 地址为:38:26:2C:13:D3:33,使用以下命令可以将其强制踢下去none
等待设备重新连接后,当右上角出现 WPA handshake 的时候说明获取成功

4、破解密码
使用 aircrack-ng 将握手包转换成 hccapx 格式
或者使用 hashcat 官网提供的在线工具进行格式转换:https://hashcat.net/cap2hashcat/

5、其他
Hashcat 在有时破解的时候会提示 All hashes found in potfile!,这表明该 hash 已经被破解出来过了,可以使用 hashcat [哈希值] –show 查看已破解出来的明文密码。
如果想再次破解已经破解过的密码,删除 ~/.hashcat/hashcat.potfile 文件里的对应记录即可。
在使用GPU模式进行破解时,可以使用 -O 参数自动进行优化
在实际破解过程中,可以先使用 top 字典进行破解,不行再试试社工字典,比如姓名+生日的组合字典
Hashcat 参数优化:
21、哈希传递与票据传递
1、哈希传递
哈希传递(Pass The Hash, PTH)顾名思义,就是利用哈希去登录内网中的其他机器,而不是通过明文密码登录的方式。
通过哈希传递,攻击者不需要花时间破解哈希值得到明文,在Windows Server 2012 R2及之后版本的操作系统中,默认不会在内存中保存明文密码,Mimikatz 就读不到密码明文,因此此时往往会使用工具将哈希值传递到其他计算机中进行登录验证。
NTLM Hash
在目标主机上使用 mimikatz 获取 NTLM Hash
在远程主机上以管理员权限打开 mimikatz

mimikatz 执行后,会弹出一个拥有对应 Hash 用户权限的 CMD 窗口。
AES-256 密钥
使用 mimikatz 抓取密钥
在其他远程计算机中,以管理员权限打开 mimikatz
这里需要目标机器上安装 KB2871997 补丁,补丁下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=42722
将该补丁安装后,就可以通过 AES256 密钥进行哈希传递了。
除了 AES256 外还有 AES128 等,不过平时基本都是使用 NTLM 哈希进行传递。
2、票据传递
票据传递(Pass The Ticket, PTT)是基于Kerberos认证的一种攻击方式,这里主要学习票据传递在 mimikatz 和 kekeo 两个工具里的使用。
mimikatz
使用 mimikatz 可以将内存中的票据进行导出。
执行该命令后,会在当前目录下生成多个服务的票据文件,例如 kirbi 等
使用以下命令可以清除内存中的票据
将票据文件注入内存
在当前终端下退出 mimikatz ,然后就可以列出目标目录了。

票据传递除了用 mimikatz 还可以用 kekeo
kekeo
kekeo 需要使用域名、用户名、NTLM HASH 生成票据,然后再将票据导入,从而连接远程计算机。

在 kekeo 中清除当前内存中的其他票据,不然可能会导致票据传递失败
在 Windows 命令行中也可以执行系统自带的命令进行内存中的票据清除
使用以下命令将票据导入内存,之后 exit 退出 kekeo,使用 dir 命令就可以列出远程文件了。

注意点:
1、票据文件注入内存的默认有效时间为 10 小时
2、在目标机器上不需要本地管理员权限就可以进行票据传递
3、使用票据传递时,dir 命令必须使用主机名,如果使用 IP 地址会提示拒绝访问。
22、PsExec 和 WMI 的使用
1、PsExec
PsExec.exe
PsExec 在之前的文章里提到过一次,参见https://teamssix.com/210802-181052.html,今天来着重学习一下。
PsExec 是 PSTools 工具包里的一部分,其下载地址为:https://download.sysinternals.com/files/PSTools.zip
利用 PsExec 可以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个 psexec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过 psexec 服务运行命令,运行结束后删除服务。
建立 ipc$ 连接
在已经建立 ipc$ 的情况下,执行以下命令就可以获得 system 权限

如果没有建立 ipc$ 连接,也可以直接使用 PsExec 指定用户名密码进行连接
或者执行以下命令直接回显命令结果
在使用 PsExec 时需要注意以下几点:
需要远程系统开启 admin$ 共享(默认是开启的)
因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口
在使用 IPC$ 连接目标系统后,不需要输入账户和密码。
在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务,命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。
使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是 administrator 权限的 shell
在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能,只能依靠账号和密码进行传递。
MSF
MSF 中也有 PsExec 的利用模块,使用方法如下:
2、WMI
WMI 全称 Windows Management Instrumentation 即 Windows 管理工具,Windows 98 以后的操作系统都支持 WMI。
由于 Windows 默认不会将 WMI 的操作记录在日志里,同时现在越来越多的杀软将 PsExec 加入了黑名单,因此 WMI 比 PsExec 隐蔽性要更好一些。
wmic 命令
WMI 连接远程主机,并使用目标系统的 cmd.exe 执行命令,将执行结果保存在目标主机 C 盘的 ip.txt 文件中
使用 WMIC 连接远程主机,需要目标主机开放 135 和 445 端口( 135 端⼝是 WMIC 默认的管理端⼝,wimcexec 使⽤445端⼝传回显)
之后建立 IPC$ ,使用 type 读取执行结果

也可以预先建立 ipc$ 连接,再使用 wmic
wmiexec.py
在 impacket 工具包里有 wmiexec.py 脚本,可以用来直接获取 shell

wmiexec.py 还支持通过哈希传递获得 shell
wmiexec.vbs
wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能,wmiexec.vbs 下载地址:https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs

使用 vmiexec.vbs 执行单条命令
因为这只是个半交互式的 Shell,因此对于运行时间比较长的命令,比如 ping、systeminfo 等,需要加上 -wait 5000 或更长的时间。
在运行 nc 等不需要输出结果但需要一直运行的进程时,可以使用 -persist 参数,当命令加了 -persist 选项后,程序会在后台运行,不会有结果输出,而且会返回这个命令进程的 PID,方便结束进程,这样就可以运行 nc 或者木马程序了。
不过目前 vmiexec.vbs 已经被卡巴斯基、赛门铁克等杀软列入查杀名单了。
Invoke-WmiCommand
Invoke-WmiCommand.ps1 是 PowerSploit 工具包里的一部分,该脚本是利用 Powershell 调用 WMI 来远程执行命令。
在 Powershell 中运行以下命令

Invoke-WMIMethod
Invoke-WMIMethod 是 PowerShell 自带的一个模块,也可以用它来连接远程计算机执行命令和指定程序。none

可以看到在 192.168.7.7 主机中已经有进程 ID 为 3276 的 calc.exe 被执行了。
wmic 的其他命令
使用 wmic 远程开启目标的 RDP
判断 RDP 有没有开可以使用以下命令,如果返回 0 表示开启,返回 1 表示关闭。

使用 wmic 远程重启目标计算机none
参考文章:
https://cloud.tencent.com/developer/article/1752180
https://www.freebuf.com/articles/246440.html
原文链接:
23、SMBExec 与 DCOM 的使用
1、SMBExec
利用 SMBExec 可以通过文件共享(admin$
、c$
、ipc$
、d$
)在远程系统中执行命令,它的工作方式类似于 PsExec
C++ 版
C++ 版项目地址:https://github.com/sunorr/smbexec
一看这个项目是 8 年前上传的了,然后试了用 VS2019 没编译成功,而且目前各大杀软也都查杀这个工具了,所以这个就不看了,直接看 impacket 里的同类工具。
impacket 版
在 impacket 工具包里包含了 smbexec.py 工具,使用起来也很简单。

Linux 跨平台 Windows 远程命令执行
smbexec 工具包下载地址:https://github.com/brav0hax/smbexec
这里安装以 Kali 为例
安装时需要选择操作系统,根据自己情况选择就行,如果是 Kali 就选择 Debain,然后选择安装目录,直接回车默认 /opt 目录即可。 安装完后,在终端里输入 smbexec 就会显示 smbexec 的主菜单,分别如下:
选择菜单 1 System Enumeration 有以下选项:
选择菜单 2 System Exploitation 有以下选项:
选择菜单 3 Obtain Hashes 有以下选项:
选择菜单 4 Options 有以下选项:
获取目标系统 UAC 的状态

获取目标系统中的网络共享目录

获取本地哈希

2、DCOM 在远程系统中的使用
COM 即组件对象模型 (Component Object Model,COM) ,是基于 Windows 平台的一套组件对象接口标准,由一组构造规范和组件对象库组成。
COM 是许多微软产品和技术如 Windows 媒体播放器和 Windows Server 的基础。
DCOM (分布式组件对象模型)是微软基于组件对象模型(COM)的一系列概念和程序接口,DCOM 是 COM(组件对象模型)的扩展。
它支持不同的两台机器上的组件间的通信,不论它们是运行在局域网、广域网、还是 Internet 上,利用这个接口,客户端程序对象能够向网络中另一台计算机上的服务器程序对象发送请求。
攻击者可使用 DCOM 进行横向移动,通过 DCOM 攻击者可在拥有适当权限的情况下通过 Office 应用程序以及包含不安全方法的其他 Windows 对象远程执行命令。
使用 DCOM 进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管 COM 服务器端的软件。例如我们滥用 ShellBrowserWindow COM 对象,那么就会在远程主机的现有 explorer.exe 进程中执行。
对攻击者而言,这无疑能够增强隐蔽性,由于有大量程序都会向 DCOM 公开方法,因此防御者较难以监测所有程序。
在本地通过 DCOM 执行命令
1、获取 DCOM 程序列表
Get-CimInstance 是 PowerShell 3.0 以上的版本自带的,因此只有 Windows Server 2012 及以上的操作系统才会自带 Get-CimInstance 命令
在 Windows 7 和 Windows Server 2008 中可以使用 Get-WmiObject 替代 Get-CimInstance
2、使用 DCOM 执行任意命令
在 DCOM 程序列表中有个 MMC Application Class(MMC20.Application),这个 COM 对象可以编程 MMC 管理单元操作的组件脚本。
在本地以管理员权限启动一个 PowerShell,并执行以下命令
获得COM对象的实例后,还可以执行如下命令枚举这个 COM 对象中的不同方法和属性
在 MMC20.Application 中有个 ExecuteShellCommand 方法,我们可以拿它来执行命令,比如启动个计算器

除了 MMC20.Application 还有 ShellWindows、ShellBrowserWindow、Excel.Application 以及 Outlook.Application 等等可以被我们利用。
使用 DCOM 在远程主机上执行命令
在使用该方法时,需要具备以下条件:
具有本地管理员权限的 PowerShell
需要关闭目标系统的防火墙。
在远程主机上执行命令时,必须使用域管的 administrator 账户或者在目标主机上具有管理员权限的账户
1、调用 MMC20.Application 远程执行命令

2、调用 ShellWindows 远程执行命令

以上这两种方法均适用于Windows 7、Windows 10、Windows Server 2008、Windows Server 2016 的系统。
除了 MMC20.Application 和 ShellWindows,还有以下这几种 DCOM 对象可以被利用。
3、调用 Excel.Application 远程执行命令
4、调用 ShellBrowserWindow 远程执行命令
适用于 Windows 10 和 Windows Server 2012 R2 等版本的系统
5、调用 Visio.Application 远程执行命令
前提是目标安装了 Visio
6、调用 Outlook.Application 远程执行命令
前提是目标安装了 Outlook
dcomexec.py 脚本
Impacket 工具包里也提供了 DCOM 的利用脚本,该脚本可以提供一个类似于 wmiexec.py 脚本的半交互式 shell,不过使用的是 DCOM
dcomexec.py 脚本目前支持 MMC20.Application、ShellWindows 和 ShellBrowserWindow 对象。
或者只执行一条命令
如果只知道 hash 也可以用 hash 去连接

参考文章:
https://cloud.tencent.com/developer/article/1752145
https://www.freebuf.com/articles/network/261454.html
24、SPN 的应用
0、前言
SPN
Windows 域环境是基于微软的活动目录服务工作的,它在网络系统环境中将物理位置分散、所属部门不同的用户进行分组和集中资源,有效地对资源访问控制权限进行细粒度的分配,提高了网络环境的安全性及网络资源统一分配管理的便利性。
在域环境中运行的大量应用包含了多种资源,为了对资源的合理分类和再分配提供便利,微软给域内的每种资源分配了不同的服务主题名称即 SPN (Service Principal Name)
Kerberos
Kerberos 是由 MIT 提出的一种网络身份验证协议,旨在通过密钥加密技术为客户端/服务器应用程序提供强身份验证,它也是主要用在域环境下的身份认证协议。
在 Kerberos 认证中,最主要的问题就是如何证明「你是你」的问题,比如当一个用户去访问服务器上的某服务时,服务器如何判断该用户是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不会影响通讯的安全性,这正是 Kerberos 解决的问题。
Kerberos 协议中的名称解释:
Client: 访问服务的客户端
Server: 提供服务的服务器
KDC (Key Distribution Center): 密钥分发中心
AS (Authentication Service): 认证服务器
TGS (Ticket Granting Service): 票据授予服务
DC (Domain Controller): 域控制器
AD (Account Database): 用户数据库
TGT (Ticket Granting Ticket): 票证授予票证
ST (Servre Ticket): 服务票据

根据上图,这里一步一步进行解释
第一阶段:Clinet 与 AS
① 客户端向认证服务器 AS 发起请求,请求内容为自己的用户名、主机 IP 和当前时间戳。
② AS 接收到请求,此时 AS 会根据用户名在用户数据库 AD 中寻找,判断这个用户名在不在白名单里,此时只会查找具有相同用户名的用户,并不会判断身份的可靠性;如果没有该用户名,认证失败;如果存在该用户名,则 AS 便认为用户存在,此时 AS 对客户端做出响应,响应内容包含两部分:
第一部分:票据授予票据 TGT,客户端需要使用 TGT 去密钥分发中心 KDC 中的票据授予服务 TGS 获取访问网络服务所需的票据,TGT 中包含的内容有 kerberos 数据库中存在的客户端信息、IP、当前时间戳
第二部分:使用客户端密钥加密的一段内容,这段内容包括:用于客户端和 TGS 之间通信的 Session_Key (CT_SK) ,客户端即将访问的 TGS 信息以及 TGT 的有效时间和一个当前时间戳,该部分内容使用客户端密钥加密,所以客户端在拿到该部分内容时可以通过自己的密钥解密。
至此,第一阶段通信完成。
第二阶段:Clinet 与 TGS
此时客户端已经获取到了 AS 返回的消息,客户端会将 AS 返回的第二部分内容进行解密,分别获得时间戳、接下来要访问的 TGS 信息以及用于和 TGS 通信的密钥 CT_SK
首先客户端会判断时间戳与自己发出的时间差是否大于 5 分钟,如果大于 5 分钟那就认为这个 AS 是伪造的,认证失败,否则就继续准备向 TGS 发起请求。
③ 客户端向 TGS 发起请求,请求的内容包含三部分:
第一部分:使用 CT_SK 加密的客户端信息、IP、时间戳
第二部分:自己想要访问的 Server 服务信息(明文形式)
第三部分:使用 TGS 密钥加密的 TGT
④ TGS 接收到请求,首先判断当前系统是否存在客户端想要访问的 Server 服务,如果不存在,认证失败,如果存在则继续接下来的认证。
第一部分:使用服务端密码加密的服务票据 ST,其中包括客户端信息、IP、客户端待访问的服务端信息、ST 有效信息、时间戳以及用于客户端和服务端之间通信的 CS_SK
第二部分:使用 CT_SK 加密的内容,其中包括 CS_SK 、时间戳和 ST 的有效时间。
至此,第二阶段通信完成。
第三阶段:Clinet 与 Server
此时客户端收到来自 TGS 的响应,并使用本地缓存的 CT_SK 解密出 TGS 返回的第二部分内容,检查时间戳无误后,取出 CS_SK 准备向服务端发起请求。这里由于 TGS 返回的第一部分信息是用的服务端秘钥加密的,因此这里的客户端是无法进行解密的。
⑤ 客户端向服务端发送请求,请求内容包括两部分:
第一部分:利用 CS_SK 将自己的主机信息和时间戳进行加密的信息
第二部分:第 ④ 步里 TGS 向客户端返回的第一部分内容,即使用服务端密码加密的服务票据 ST
⑥ 服务端此时收到了来自客户端的请求,它会使用自己的密钥解密客户端发来的第二部分内容,核对时间戳之后,取出 CS_SK,利用 CS_SK 解密第一部分内容,从而获得经过 TGS 认证后的客户端信息。
此时服务端会将第一部分解密后的信息与第二部分解密后的信息进行对比,如果一致则说明该客户端身份为真实身份,此时服务端向客户端响应使用 CS_SK 加密的表示接受的信息,客户端接受到信息后也确认了服务端的真实性。
至此,第三阶段通信完成,到这里整个 kerberos 认证也就完成了,接下来客户端与服务端就能放心的进行通信了。
这里可以再通过时序图加深下印象。

注意点:
KDC 服务默认会安装在一个域的域控中
Kerberos 认证采用对称加密算法
三个阶段里都使用了密钥,这些密钥都是临时生成的,也只在一次会话中生效,因此即使密钥被劫持,等到密钥被破解可能这次会话也都早已结束。
AD 其实是一个类似于本机 SAM 的一个数据库,全称叫 Account Database,存储所有 Client 白名单,只有存在于白名单的 Client 才能顺利申请到 TGT
KDC 服务框架中包含一个 KRBTGT 账户,它是在创建域时系统自动创建的一个账号,可以暂时理解为它就是一个无法登陆的账号,在发放票据时会使用到它的密码 HASH 值。
1、SPN
相关概念
在使用 Kerberos 协议进行身份验证的网络中,必须在内置账号(NetworkService、LocalSystem)或者用户账号下为服务器注册 SPN。
对于内置账号,SPN 将自动进行注册,如果在域用户账号下运行服务,则必须为要使用的账号手动注册 SPN。
因为域环境中的每台服务器都需要在 Kerberos 身份验证服务中注册 SPN ,所以 RT 会直接向域控制器发送查询请求,获取需要的服务的 SPN ,从而知道自己需要使用的服务资源在哪台机器上。
SPN 格式如下:
serviceclass(必选):服务组件名称
hostname(必选):以 “/” 与后面的名称分隔,这里的 hostname 是计算机的 FQDN (全限定域名,同时带有计算机名和域名)
port(可选):以冒号分隔,后面的内容为该服务监听的端口号
servicename(可选):一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名
常见 SPN 服务
MSSQL 服务
Exchange 服务
RDP 服务
WSMan/WinRM/PSRemoting 服务
SPN 扫描脚本
SPN 扫描也叫「扫描 Kerberos 服务实例名称」,在活动目录中发现服务的最佳方法就是 SPN 扫描。
SPN 扫描通过请求特定 SPN 类型的服务主体名称来查找服务,与网络端口相比,SPN 扫描的主要特点是不需要通过连接网络中的每个 IP 地址来检查服务端口,因此不会因触发内网中的安全设备规则而产生大量的告警日志。
由于 SPN 查询是 Kerberos 票据行为的一部分,所以检测难度较大。
setspn
setspn 是 Windows 自带命令,以下命令可列出域中所有的 SPN 信息
Active Directory 模块
PowerShell 模块 Active Directory 只在域控上有
或者使用大佬导出的模块,这样普通用户也可以使用该模块,下载地址:https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll
PowerView
PowerView 下载地址:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
Powershell-AD-Recon
Powershell-AD-Recon 提供了一系列获取服务与服务登录账号和运行服务的主机之间的对应关系的工具,这些服务包括但不限于 MSSQL、Exchange、RDP、WinRM
Powershell-AD-Recon 下载地址:https://github.com/PyroTek3/PowerShell-AD-Recon
Powershell-AD-Recon 工具包里的内容如下:
下载后的文件是没有 .ps1 后缀的,需要自己添加上
由于 SPN 是通过 LDAP 协议向域控制器进行查询的,因此 RT 需要获得一个普通的域用户权限才可以进行 SPN 扫描。
将 PowerShell 脚本导入并执行,以 MSSQL 服务为例
扫描域中所有的 SPN 信息
kerberoast
kerberoast 工具包里的 GetUserSPNs.ps1,可以帮助我们发现仅与用户帐户相关联的服务。
kerberoast 下载地址:https://github.com/nidem/kerberoast
kerberoast 工具包里的 GetUserSPNs.vbs 也能实现相同的功能
PowerShellery
PowerShellery 工具包里包含了 Get-SPN,可以为各种服务收集 SPN
PowerShellery 下载地址:https://github.com/nullbind/Powershellery
结果也可以转换为表格的形式,以便于浏览
另外一个 Get-DomainSpn.psm1 脚本可以用来获取 UserSID、服务和实际用户
Impacket
Impacket 下载地址:https://github.com/SecureAuthCorp/impacket
上面的工具都是在域内的机器里扫描 SPN 的,利用 impacket 工具包下的 GetUserSPNs.py 可以在非域主机中扫描目标的 SPN

2、kerberoast
kerberoast 是一种针对 Kerberos 协议的利用方式,在因为需要使用某个特定资源而向 TGS 发送 Kerberos 服务票据的请求时,用户首先需要使用具有有效身份权限的 TGT 向 TGS 请求相应服务的票据。
当 TGT 被验证有效且具有该服务的权限时,TGS 会向用户发送一张票据。该票据使用与 SPN 相关联的计算机服务账号的 NTLM Hash(RC4_HMAC_MD5),就是说,RT 会通过 Kerberoast 尝试使用不同的 NTLM Hash 来打开该 Kerberos 票据,如果 RT 使用的 NTLM Hash 是正确的,Kerberos 票据就会被打开,而该 NTLM Hash 对应于该计算机服务账号的密码。
kerberoast 的利用思路:
1、查询 SPN 寻找在 Users 下并且是高权限域用户的服务
2、请求并导出 TGS
3、对 TGS 进行爆破
这里以 MSSQL 服务为例,并尝试破解该服务的票据
手动注册 SPN
查看用户所对应的 SPN
也可以使用 adsiedit.msc 查看用户 SPN 及其他高级属性
为用户配置指定服务的登录权限,gpedit.msc 打开本地组策略编辑器,找到以下路径,将用户添加进去,例如这里添加的用户为 test
因为 Kerberos 协议的默认加密方式是 AES256_HMAC,而通过 tgsreperack.py 脚本无法破解该加密方式,因此我们可以通过组策略将加密方式设置为 RC_HMAC_MD5
在本地组策略编辑器中,找到以下路径,将加密方式设置为 RC_HMAC_MD5
请求指定 SPN 的服务票据
或者请求所有服务的服务票据
可以使用 klist 查看本地缓存的票证,看看有没有新的票据
之后在 mimikatz 中执行如下命令,将内存中的票据导出
也可以不使用 mimikatz,使用 powershell 脚本导出支持 hashcat 破解的格式
或者使用 Rubeus 获取票据
也可以使用 impacket 获取票据

将 MSSQL 服务所对应的票据复制到有 kerberoast 的机器上,之后用 kerberoast 中的 tgsreperack.py 脚本破解票据的 NTLM Hash
Kerberoast 脚本下载地址:https://github.com/nidem/kerberoast
或者使用 hashcat 破解 powershell 脚本、Rubeus、impacket 获取到的服务票据

25、Exchange 邮件服务器
1、Exchange 的基本操作
在 Exchange 服务器上的 PowerShell 里进行以下操作
将 Exchange 管理单元添加到当前会话中
查看邮件数据库
查询数据库的物理路径
获取现有用户的邮件地址
查看指定用户的邮箱使用信息
获取用户邮箱中的邮件数量,通过该命令还可以列出那些用户未登录过邮箱
2、导出指定的电子邮箱
Exchange Server 2007 中需要使用 ExportMailBox 命令,在 Exchange Server 2010 SP1 及以后的版本中可以使用图形化界面导出,也可以使用 PowerShell
如果想要导出 PTS 格式的邮件文件,则需要为用户配置导出/导出权限。
配置用户的导入导出权限
查看用户权限
将 Administrator 用户添加到 Mailbox Import Export 角色组里,将用户添加到角色组后,需要重启 Exchange 服务才能执行导出操作
删除刚刚添加的 Mailbox Import Export 角色组中的用户
设置网络共享文件夹
不论使用哪种方式导出邮件,都需要将文件放置在 UNC(Universal Naming Convention,通用命名规则,也称通用命名规范)路径下
类似于 “\hostname\sharename”、“\ipaddress\sharename” 的网络路径下,sharename 为网络共享名称。
首先开启共享,将 C 盘 inetpub 文件夹设置为 everyone 可读写,执行如下命令:
导出用户的电子邮件
使用 PowerShell 导出电子邮件,用户的电子邮箱目录一般为Inbox(收件箱)、SentItems(已发送邮件)、DeleteItems(已删除邮件)、Drafts(草稿)等
使用图形化界面导出电子邮件,访问 https://127.0.0.1/ecp,打开 Exchange 管理中心的登录界面。
输入账号密码进入 Exchange 管理中心,点击「...」更多按钮,选择「导出到 PST 文件」即可进行导出操作。

管理导出请求
不论是通过 Powershell 导出还是通过图形化的方式导出,都会在 Exchange 中生成一条告警信息,这些信息有助于 BT 发现服务器里的异常行为,通过以下命令,可以查看之前的导出请求记录信息。
将指定用户已经完成的导出请求删除
删除所有已完成的导出请求
删除所有导出请求,包括完成和失败的请求
26、ntds.dit 的提取与散列值导出
0、前言
在活动目录中,所有数据都保存在 ntds.dit 文件中,ntds.dit 是一个二进制文件,存储位置为域控的 %SystemRoot%\ntds.dit
ntds.dit 中包含(但不限于)用户名、散列值、组、GPP、OU 等与活动目录相关的信息,因此如果我们拿到 ntds.dit 就能获取到域内所有用户的 hash
在通常情况下,即使拥有管理员权限,也无法读取域控中的 ntds.dit 文件(因为活动目录始终访问这个文件,所以文件被禁止读取),它和 SAM 文件一样,是被 Windows 操作系统锁定的。
不过使用 Windows 本地卷影拷贝服务,就可以获得文件的副本(类似于虚拟机的快照)
1、使用卷影拷贝服务提取 ntds.dit
ntdsutil
ntdsutil 是一个为活动目录提供管理机制的命令行工具,使用 ntdsutil 可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区、删除由未使用活动目录安装向导(DCPromo.exe)成功降级的与控制器留下的元数据等。
该工具默认安装在域控上,使用以下命令创建一个快照,该快照包含 Windows 中的所有文件,且在复制文件时不会受到 Windows 锁定机制的限制。
加载刚刚创建的快照
使用 copy 命令将快照中的文件复制到 C 盘下
删除之前加载的快照
查询当前系统中的快照,可以看到没有任何快照

vssadmin
vssadmin 可用于创建和删除卷影拷贝、列出卷影的信息(只能管理系统 Provider 创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序(writers)和提供程序(providers),以及改变卷影拷贝的存储空间(即所谓的 “diff 空间”)的大小等。
vssadmin 的使用流程和 ntdsutil 差不多,首先创建一个 C 盘的卷影拷贝
在创建的卷影拷贝中将 ntds.dit 复制出来
删除快照

vssown.vbs
vssown.vbs 脚本的功能和 vssadmin 类似,可用于创建和删除卷影拷贝以及启动和停止卷影拷贝服务。
vssown.vbs 下载地址:https://raw.githubusercontent.com/borigue/ptscripts/master/windows/vssown.vbs
启动卷影拷贝服务
创建一个 C 盘的卷影拷贝
列出当前卷影拷贝
复制 ntds.dit
删除卷影拷贝

IFM
除了上面介绍的通过执行命令来提取 ntds.dit,也可以通过创建一个 IFM 的方式获取 ntds.dit
在使用 ntdsutil 创建媒体安装集(IFM)时,需要进行生成快照、加载、将 ntds.dit 和计算机的 SAM 文件复制到目标文件夹中等操作,这些操作也可以通过 PowerShell 或 VMI 远程执行。
在域控中以管理员模式打开命令行环境,输入命令
此时 ntds.dit 将被保存在 C:\test\Active Directory 下,SYSTEN 和 SECURITY 两个文件将被保存在 C:\test\registry 文件夹下
将 ntds.dit 拖回本地后,在目标机器上将 test 文件夹删除
Copy-VSS.ps1
nishang 工具包里的 Copy-VSS.ps1 也可以将 ntds.dit 提取出来,nishang 工具包地址:https://github.com/samratashok/nishang
通过该脚本,可以将 SAM、SYSTEM,ntds.dit 复制到与 ps1 脚本相同的目录下。
diskshadow
diskshadow 和 vshadow 功能类似,不过 vshadow 是包含在 Windows SDK 里的,因此实际应用的时候还需要将其上传到目标机器上。
diskshadow 有交互模式和非交互模式,在使用交互模式时,需要在图形化界面里操作
首先创建一个 txt 文件,内容如下:
使用 diskshadow 调用刚才的文本文件
因为 system.hive 里存放着 ntds.dit 的秘钥,所以需要转储 system.hive ,不然没法查看 ntds.dit 里内容

Invoke-NinjaCopy.ps1
PowerSploit 工具包里的 Invoke-NinjaCopy.ps1 脚本也可以提取 ntds.dit 文件,这种方法没有调用 Volume Shadow Copy 服务,所以不会产生日志文件
PowerSploit 工具包项目地址:https://github.com/PowerShellMafia/PowerSploit
impacket
impacket 安装
通过 impacket 里的 secretsdump.py 脚本可以直接远程读取 ntds.dit 并导出哈希值
2、导出 ntds.dit 文件中的散列值
esedbexport
安装 esedbexport,以 Kali 为例
导出 ntds.dit
安装 ntdsxtract
将 ntds.dit.export 和 SYSTEM 文件放入到 ntdsxtract 工具的文件夹中,然后导出哈希值,最后的结果将保存在 all_user.txt 里
如果提示 ImportError: No module named Crypto.Hash,直接 pip install pycryptodome 即可

ntds.dit 包含域内的所有信息,可以通过分析 ntds.dit 导出域内的计算机信息以及其他信息,最后结果将保存在 all_computers.csv 文件内
impacket
将 ntds.dit.export 和 SYSTEM 文件放入到 impacket 工具的文件夹中
或者直接使用 python 执行 secretsdump.py 文件
NTDSDump.exe
NTDSDumpEx.exe 可以进行导出哈希值的操作,下载地址:https://github.com/zcgonvh/NTDSDumpEx/releases
mimikatz
mimikatz 有个 dcsync 的功能,可以利用卷影拷贝服务直接读取 ntds.dit 文件,不过需要管理员权限。
导出域内所有用户的用户名和哈希值
导出域内指定用户的用户名和哈希值
也可以通过转储 lsass.exe 进行 dump 操作
如果输出内容太多,可以使用 log 命令,这样操作就都会被记录到文本里了
Invoke-DCSync.ps1
该脚本通过 Invoke-ReflectivePEinjection 调用 mimikatz.dll 中的 dcsync 功能,并利用 dcsync 直接读取 ntds.dit 得到域用户密码散列值
Invoke-DCSync.ps1 下载地址:https://gist.github.com/monoxgas/9d238accd969550136db
MSF
msf 里的 psexec_ntdsgrab 可以获取目标的 ntds.dit 和 SYSTEM 并将其保存到 /root/.msf4/loot/ 目录下
除此之外,在获取到会话后,也可以直接用 MSF 提供的模块获取 ntds.dit
注意生成的 payload 需要和目标系统位数一致,不然会报错
DSInternals
DSInternals 主要功能包括离线 ntds.dit 文件操作以及通过目录复制服务(DRS)远程协议查询域控制器。
DSInternals 下载地址:https://github.com/MichaelGrafnetter/DSInternals/releases
安装 DSInternals
直接导出 hash,并保存在 output_hash.txt 文件里
或者导出 hashcat 支持的 hash,并保存在 output_hashcat.txt 文件里
vshaow 和 QuarksPwDump
在正常的域环境中,ntds.dit 文件里包含大量的信息,体积较大,不方便保存到本地。
如果域控制器上没有安装杀毒软件,攻击者就能直接进入域控制器,导出 ntds.dit 并获得域账号和域散列值,而不需要将 ntds.dit 保存到本地。
QuarksPwDump 可以快速、安全、全面地读取全部域账号和域散列值。
QuarksPwDump 下载地址:https://github.com/tuthimi/quarkspwdump/tree/master/Release
ShadowCopy.bat 使用微软的卷影拷贝技术,能够复制被锁定的文件及被其他程序打开的文件,代码如下
vshadow.exe 是从 Windows SDK 中提取出来的,需要先安装 Windows SDK,下载地址:https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/
Windows SDK 下载安装完后,找到 vshadow.exe ,我这里的路径是:
将这三个文件放到同一个文件夹里后,运行 ShadowCopy.bat 文件,之后可以看到导出了 ntds.dit 和 system.hive 文件
使用 esentutl 修复导出的 ntds.dit 文件
最后通过 QuarksPwDump.exe 导出域账号和散列值
在 log 里就能看到导出的密码哈希了
Last updated
Was this helpful?