密码攻击
一、凭据存储
1. Linux
Linux 系统的密码被存储在 shadow 文件中,位与 /etc/shadow 文件中
该文件具有的格式:参考文章 ---> Linux /etc/shadow(影子文件)内容解析(超详细)
对于密码的加密,具有一些特殊之处,密码的格式如下:
ID | 密码哈希算法 |
---|---|
$1 | MD5 |
$2a | Blowfish |
$5 | SHA-256 |
$6 | SHA-512 |
$sha1 | SHA1crypt |
$y | Yescrypt |
$gy | Gost-yescrypt |
$7 | Scrypt |
在过去主要使用 /etc/group 文件来存储密码,该文件格式 :
2. Windows 身份验证
二、远程密码攻击
如果我们要通过网络管理 Windows 服务器,我们需要借助于 RDP、WinRM、SSH
1. WinRM
我们可以使用一些暴力破解工具,破解此服务密码 (eg: crackmapexec ) ,破解成功后使用 Evil-WinRM 进行登陆
2. SSH
可以使用一些暴力破解工具进行破解密码,然后登陆
3. RDP
三、Windows 本地密码攻击
1. 攻击 SAM
1. 复制 SAM 注册表配置单元
Registry Hive | 描述 |
---|---|
hklm\sam | 包含和本地账号密码关联的哈希值 |
hklm\system | 包含系统引导密钥,用于加密 SAM 数据库 |
hklm\security | 包含域账户的缓存凭据 |
2. 使用 reg.exe 复制注册表配置单元并保存
保存完后使用文件传输相关的方法,传输副本到本地
3. 使用 Impacket 的 secretsdump.py 转储哈希
4. 使用 hashcat 破解哈希
5. 扩展
2. 攻击 LSASS
LSASS 是一项关键服务,在所有 Windows 操作系统的凭证管理和身份验证过程中发挥这核心作用
在首次登陆时,LSASS 将会:
在内存中本地缓存凭据
创建访问令牌
执行安全策略
写入 Windows 的安全日志
1. 转储 LSASS 进程内存
2. 使用 Pypykatz 提取凭据
我们可以使用 pypykatz 尝试从 .dmp 文件中提取凭据, 这是由 python 编写的Mimikatz 的实现
MSV 信息 --> 官方文档
MSV 是 Windows 的一个身份验证包,LSA 调用它来验证针对 SAM 数据库的登录尝试, Pypykatz 提取与存储在 LSASS 进程内存中的 bob 用户帐户登录会话相关联的
SID
、Username
、Domain
甚至NT
&密码哈希WDIGEST
WDIGEST 是一个较旧的身份认证协议,LSASS 使用明文缓存 WDIGEST 使用的凭据,
Kerberos
Kerberos 是 Windows 域环境中 Active Directory 使用的网络身份验证协议。 域用户帐户在使用 Active Directory 进行身份验证时被授予票证。 此票证用于允许用户访问他们已被授予访问权限的网络上的共享资源,而无需每次都键入其凭据。 LSASS 缓存与 Kerberos 关联的密码、电子密钥、票证和 PIN。 可以从 LSASS 进程内存中提取这些并使用它们来访问加入同一域的其他系统。
DPAPI
数据保护应用程序编程接口或DPAPI是 Windows 操作系统中的一组 API,用于在每个用户的基础上为 Windows 操作系统功能和各种第三方应用程序加密和解密 DPAPI 数据 blob。以下是一些使用 DPAPI 的应用程序示例及其用途:
应用 DPAPI的使用 Internet Explorer
密码表单自动完成数据(已保存站点的用户名和密码)。
Google Chrome
密码表单自动完成数据(已保存站点的用户名和密码)。
Outlook
电子邮件帐户的密码。
Remote Desktop Connection
保存连接到远程机器的凭据。
Credential Manager
保存用于访问共享资源、加入无线网络、VPN 等的凭据。
3. 攻击 AD 和 NTDS.dit
Windows 系统加入域后,将不再默认引用 SAM 数据库来验证登录请求。该加入域的系统现在将发送所有身份验证请求,以在允许用户登录之前由域控制器验证。这并不意味着不能再使用 SAM 数据库。希望使用 SAM 数据库中的本地帐户登录的人仍然可以通过指定设备的主机名(以用户名开头)(例如:WS01/nameofuser)或直接访问设备然后在登录 UI 中键入 ./ 来实现此目的在用户名字段中。这是值得考虑的,因为我们需要注意哪些系统组件受到我们执行的攻击的影响。当通过直接物理访问或通过网络将 Windows 桌面操作系统或 Windows 服务器操作系统作为目标时,它还可以为我们提供额外的攻击途径。
1. 使用 CrackMapExec 进行密码的获取
2. 捕获 NTDS.dit
NTDS 是和 AD 一起用于查找和组织网络资源的目录服务,该 NTDS.dit 存储在域控制器 %systemroot%/ntds 上,.dit 代表目录信息树,这是和 AD 管理的主要数据库文件,存储所有域用户名、密码哈希和其它关键架构信息,如果可以捕获此文件,我们可能会破坏域中的每个帐户
3. 创建 C 的卷影副本
我们可以使用 VSS 创建可以主动读取和写入的卷影副本
4. 使用 CrackMapExec
我们可以使用 CrackMapExec 来完成上面的步骤
5. 继续利用
我们可以使用密码破解工具,破解哈希也可以使用 传递哈希(PTH) 对系统进行身份验证
4. Windows 中凭据搜索
1. 工具
我们可以利用 Lazagne 等第三方工具快速反向 WEB 浏览器和其它已经安转应用程序可能不安全的存储凭据
2. 使用 findstr
findstr --> 官方文档
四、Linux 本地密码攻击
1. Linux 中的凭证搜索
文件 | 历史 | 内存 | 凭据 |
---|---|---|---|
配置文件 | 日志 | 缓存 | 浏览器存储的凭据 |
数据库 | 命令行历史 | 内存处理 | |
笔记 | |||
脚本 | |||
源代码 | |||
定时任务 | |||
SSH 密钥 |
1. 文件
2. 日志
日志文件 | 描述 |
---|---|
/var/log/messages | 通用系统活动日志。 |
/var/log/syslog | 通用系统活动日志。 |
/var/log/auth.log | (Debian) 所有与身份验证相关的日志。 |
/var/log/secure | (RedHat/CentOS) 所有身份验证相关的日志。 |
/var/log/boot.log | 引导信息。 |
/var/log/dmesg | 硬件和驱动程序相关信息和日志。 |
/var/log/kern.log | 内核相关的警告、错误和日志。 |
/var/log/faillog | 登录尝试失败。 |
/var/log/cron | 与 cron 作业相关的信息。 |
/var/log/mail.log | 所有与邮件服务器相关的日志。 |
/var/log/httpd | 所有与 Apache 相关的日志。 |
/var/log/mysqld.log | 所有 MySQL 服务器相关的日志。 |
3. 内存和缓存
许多应用程序和进程使用身份验证所需的凭据并将其存储在内存或文件中,
mimipenguin --> Github 官网
LaZagne
4. Firefox 浏览器
当我们在 Firefox 浏览器中存储网页的凭据时,它们会被加密并存储在
logins.json
系统中 , 使用的工具: firefox_decrypt --> Github
2. Passwd, Shadow & Opasswd
基于 Linux 的发行版可以使用许多不同的身份验证机制,最常用和标准的机制之一是 可插入身份验证模块 (PAM), 用于次模块称为 pam_unix.so 和 pam_unix2.so 并且位与 /usr/lib/x86_64-linux-gun/security/ 基于 Debian 的发行版中,这些模块管理用户信息、身份验证、会话、当前密码和旧密码,例如: 如果我想更改 Linux 的 passwd 账户密码,则会调用 PAM , 会采取适当的预防措施并相应的存储和处理信息
于管理的 pam_unix.so 标准模块使用来自系统库和文件的标准化 API 调用来更新帐户信息。 读取、管理和更新的标准文件是 /etc/passwd 和 /etc/shadow。 PAM 还有许多其他服务模块,例如 LDAP、mount 或 Kerberos。
对于 passwd 、shadow 见上
1. Opasswd
PAM 库 (pam_unix.so ) 可以防止重复使用就密码,存储旧面的文件是 /etc/security/opasswd 如果未手动改变文件权限,则还需要管理员权限才可以读取
五、横向移动
1. 传递哈希
传递哈希攻击是一种攻击者使用 密码哈希
而不是纯文本密码进行身份验证的技术,攻击者不需要机密哈希就可以获得明文密码,PTH 攻击利用身份验证协议,因为密码哈希在每个会话中保持不变,知道密码被改变
1. NTLM 介绍
NTLM 是一组安全协议,可以验证用户身份,同时保护其数据的完整性和机密性,NTLM 使用质询-响应协议来验证用户的身份。
使用 NTLM ,存储在服务器和域控制器上的面不会被加盐,这意味这拥有密码哈希的对手可以在不知道原始密码的情况下对会话进行身份验证
2. 使用 Mimikatz 传递哈希 (Windows)
我们可以用来执行哈希传递的攻击的工具是 Mimikatz, 该工具具有一个名为 sekurlsa:pth ,允许我们通过使用用户密码的哈希启动一个进程来执行传递哈希攻击,要使用户此模块我们需要:
/user : 模拟的用户名
/rc4或 /NTLM 用户密码的 NTLM 的哈希
/domain : 模拟用户所属的域
/run : 要在用户上下文中运行的程序
3. 使用 Powershell Invoke-TheHash 传递哈希 (Windows)
在Windows 上传递哈希的另一个工具是 Invoke-TheHash ,该工具是一组 Powershell 函数,用于使用 WMI 和 SMB 来执行传递哈希攻击。
使用Invoke-TheHash
,我们有两种选择:SMB 或 WMI 命令执行。要使用这个工具,我们需要指定以下参数来在目标计算机中执行命令:
Target
- 目标的主机名或 IP 地址。Username
- 用于身份验证的用户名。Domain
- 用于身份验证的域。本地帐户或在用户名后使用@domain 时不需要此参数。Hash
- 用于身份验证的 NTLM 密码哈希。此函数将接受 LM:NTLM 或 NTLM 格式。Command
- 在目标上执行的命令。如果未指定命令,该函数将检查用户名和哈希是否可以访问目标上的 WMI。
4. 使用 Impacket 传递哈希 (Linux)
我们可以使用 Impacket 工具包中的其他几种工具来使用传递哈希攻击来执行命令,例如:
5. 使用 CrackMapExec (Linux) 传递哈希
6. 使用 evil-winrm (Linux) 传递哈希
7. 使用 RDP (Linux) 传递哈希
8. UAC 限制传递本地账户的哈希
UAC(用户帐户控制)限制本地用户执行远程管理操作的能力。当注册表项HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy
设置为 0 时,表示内置本地管理员帐户(RID-500,“管理员”)是唯一允许执行远程管理任务的本地帐户。将其设置为 1 也允许其他本地管理员。
**注意:**有一个例外,如果
FilterAdministratorToken
启用了注册表项(默认情况下禁用)(值为 1),则 RID 500 帐户(即使已重命名)将在 UAC 保护中注册。这意味着远程 PTH 将在使用该帐户时对机器失败。
2. Windows 传递票证 (PtT)
在 AC环境中横向移动的另一种方法称为 传递票证攻击,在这种攻击中我们使用窃取的 Kerberos 票证而不是 NTLM 密码哈希进行横行移动
1. Pass the Ticket
我们需要一个有效的 Kerberos 票证来执行 PtT
服务票证 (TGS - 票证授予服务)运行访问特定资源
票证授予票证 (TGT) 我们可以使用它来请求服务票证以访问用户拥有权限的任何资源
2. 从 WIndows 收集 Kerberos 票证
我们已经获得一台电脑的本地管理员权限
在 Windows 中票证是由 LSASS 进程处理和存储的,我们可以使用 Mimkatz 中的模块
sekurlsa::tickets /export
获取所有的票证,可以得到一个 .kirbi 文件我们也可以使用 Rubeus 和导出票证 dump 选项,此选项可以转储所有票证,该工具的结果时间会产生一个 Base64 格式打印的票证
传递密钥或破解哈希
3. Pass the Key or OverPass the Hash
传统的 PtH 技术不涉及或重用 Kerberos 的 NTLM 哈希
传统的哈希传递 (PtH) 技术涉及重用不涉及 Kerberos 的 NTLM 密码哈希。 Pass the Key 或 OverPass the Hash 方法将加入域的用户的哈希/密钥(rc4_hmac、aes256_cts_hmac_sha1 等)转换为完整的票证授予票证 (TGT)。 此技术由 Benjamin Delpy 和 Skip Duckwall 在他们的演示文稿“滥用 Microsoft Kerberos”中开发。
要伪造票证,我们需要有用户的哈希
我们可以使用 Mimkatz 转储所有用户的 Kerberos 加密密钥使用模块 sekurlsa::ekeys ,该模块将枚举 Kerberos 包中存在的所有密钥类型
Rubeus -- Pass the Key or OverPass the Hash
注意: Mimikatz 需要管理权限才能执行传递密钥/越过哈希攻击,而 Rubeus 则不需要
4. PtT
现在我们有了一些 Kerberos 票证,我们可以使用它们在环境中横向移动。
使用 Rubeus,我们执行了 OverPass the Hash 攻击并以 base64 格式检索了票证。 相反,我们可以使用标志 /ptt 将票证(TGT 或 TGS)提交到当前登录会话。
5. 使用 Powershell Rmoting 传递票证
PowerShell Remoting允许我们在远程计算机上运行脚本或命令。管理员经常使用 PowerShell Remoting 来管理网络上的远程计算机。启用 PowerShell Remoting 会同时创建 HTTP 和 HTTPS 侦听器。侦听器在 HTTP 标准端口 TCP/5985 和 HTTPS 标准端口 TCP/5986 上运行
要在远程计算机上创建 PowerShell Remoting 会话,您必须具有管理权限,是 Remote Management Users 组的成员,或者在会话配置中具有明确的 PowerShell Remoting 权限。
1. Mimikatz - PowerShell Remoting with Pass the Ticket
要使用 PowerShell Remoting 和 Pass the Ticket,我们可以使用 Mimikatz 导入我们的票证,然后打开 PowerShell 控制台并连接到目标机器。让我们打开一个新的cmd.exe
并执行 mimikatz.exe,然后使用 导入我们收集的票证sekurlsa::tickets /export
。将票证导入我们的 cmd.exe 会话后,我们可以从同一个 cmd.exe 启动 PowerShell 命令提示符,并使用该命令Enter-PSSession
连接到目标机器
2. Rubeus - PowerShell Remoting with Pass the Ticket
Rubeus 有一个选项createnetonly
,它创建一个牺牲过程/登录会话(登录类型 9)。进程默认是隐藏的,但是我们可以指定flag/show
来显示进程,结果相当于runas /netonly
. 这可以防止擦除当前登录会话的现有 TGT。
3. Linux 传递票证 (PtT)
最后更新于