内网主动攻击
密码喷洒获取立足点
密码喷洒可能导致获得系统访问权限,并可能在一个目标网络上获得立足点。
这种攻击涉及使用一个常用密码和一个较长的用户名或电子邮件地址列表来尝试登录一个暴露的服务。
用户名和电子邮件地址可能在渗透测试的 OSINT 阶段或我们最初的枚举尝试中收集。请记住,渗透测试不是静态的,但随着我们发现新数据,我们会不断迭代多种技术和重复过程。通常我们会以团队形式工作或同时执行多个 TTP 来有效利用我们的时间。
获取凭证
linux上获取
我们可以根据域的配置方式以及我们是否拥有有效的域凭证,通过多种方式获取域密码策略。如果拥有有效的域凭证,也可以使用 CrackMapExec 或 rpcclient 等工具远程获取密码策略。
1 | crackmapexec smb 172.16.5.5 -u avazquez -p Password123 --pass-pol |
没有凭证,我们可能能够通过 SMB 空会话或 LDAP 匿名绑定来获取密码策略。
SMB NULL 会话
SMB 空会话允许未经身份验证的攻击者从域中检索信息,例如完整的用户列表、组、计算机、用户账户属性以及域密码策略。SMB 空会话的配置错误通常是由于遗留域控制器就地升级造成的,最终导致不安全的配置被保留下来,这些配置在较旧的 Windows Server 版本中默认存在。
在早期版本的 Windows Server 中创建域时,会向某些共享授予匿名访问权限,这允许进行域枚举。SMB 空会话可以轻松枚举。为了进行枚举,我们可以使用 enum4linux 、 CrackMapExec 、 rpcclient 等工具。
使用 rpcclient
我们可以使用 rpcclient 来检查域控制器是否允许 SMB 空会话访问。1
rpcclient -U "" -N 172.16.5.5
使用 rpcclient 获取密码策略
1 | rpcclient $> querydominfo |
使用 enum4linux
enum4linux 是一个基于 Samba 工具套件( nmblookup 、 net 、 rpcclient 和 smbclient )构建的工具,用于枚举 Windows 主机和域。它可以在许多不同的渗透测试发行版中预装,包括 Parrot Security Linux。下面是一个示例输出,展示了 enum4linux 可以提供的信息。这里是一些常见的枚举工具及其使用的端口:
| Tool 工具 | Ports 端口 |
|---|---|
| nmblookup | 137/UDP |
| nbtstat | 137/UDP |
| net 网络 | 139/TCP, 135/TCP, TCP 和 UDP 135 和 49152-65535 |
| rpcclient | 135/TCP 135/端口 |
| smbclient | 445/TCP 445/端口 |
1 | enum4linux -P 172.16.5.5 |
使用 enum4linux-ng
1 | enum4linux-ng -P 172.16.5.5 -oA ilfreight |
LDAP 匿名绑定
LDAP 匿名绑定允许未经身份验证的攻击者从域中检索信息,例如用户、组、计算机的完整列表、用户账户属性以及域密码策略。这是一个遗留配置,自 Windows Server 2003 起,仅允许经过身份验证的用户发起 LDAP 请求。我们仍然会不时看到这种配置,因为管理员可能需要为某个特定应用程序设置匿名绑定,并给予了超出预期范围的访问权限,从而允许未经身份验证的用户访问 AD 中的所有对象。
使用 LDAP 匿名绑定,我们可以使用 LDAP 特定的枚举工具,如 windapsearch.py 、 ldapsearch 、 ad-ldapdomaindump.py 等,来获取密码策略。使用 ldapsearch 可能有点繁琐,但可以实现。
1 | ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "*" | grep -m 1 -B 10 pwdHistoryLength |
注意:在 ldapsearch 的新版本中, -h 参数已被 -H 取代。
Windows上获取
SMB null
从 Windows 上执行这种空会话攻击不太常见,但我们可以使用命令 net use \\host\ipc$ "" /u:"" 从一台 Windows 机器上建立空会话,并确认我们是否可以执行更多此类攻击。
从 Windows 建立空会话
1 | net use \\DC01\ipc$ "" /u:"" |
使用 net.exe
如果我们能从 Windows 主机认证到域,我们可以使用内置的 Windows 二进制文件(如 net.exe )来检索密码策略
1 | net accounts |
使用PowerView
1 | import-module .\PowerView.ps1 |
制作密码本
详细用户枚举
为了成功实施密码喷射攻击,我们首先需要一个有效域用户列表来尝试进行身份验证。我们可以通过几种方式收集目标有效用户列表:
- 通过利用 SMB 空会话从域控制器检索完整的域用户列表
- 利用 LDAP 匿名绑定来匿名查询 LDAP 并拉取域用户列表
- 使用诸如
Kerbrute的工具,结合来自统计上最可能用户名 GitHub 仓库等来源的单词列表,或通过使用 linkedin2username 等工具创建的潜在有效用户列表来验证用户 - 使用来自 Linux 或 Windows 攻击系统的凭证集,这些凭证集由我们的客户提供或通过其他方式获得,例如使用
Responder进行 LLMNR/NBT-NS 响应中毒,甚至使用较小的单词列表进行成功的密码喷洒
SMB NULL 会话用于拉取用户列表
如果你在内部机器上但没有有效的域凭据,可以查找域控制器上的 SMB 空会话或 LDAP 匿名绑定。这两者中的任何一种都将允许你获取 Active Directory 中所有用户以及密码策略的准确列表。如果你已经有了域用户凭据或在 Windows 主机上具有 SYSTEM 访问权限,那么你可以轻松地查询 Active Directory 以获取这些信息。
使用 SYSTEM 账户可以实现这一点,因为它可以 impersonate 计算机。计算机对象被视为域用户账户(有一些差异,例如跨森林信任进行身份验证)。如果你没有有效的域账户,并且 SMB 空会话和 LDAP 匿名绑定不可用,你可以使用外部资源(如电子邮件收集和 LinkedIn)创建用户列表。这个用户列表可能不完整,但它可能足以为你提供对 Active Directory 的访问。
使用 enum4linux
1 | enum4linux -U 172.16.5.5 | grep "user:" | cut -f2 -d"[" | cut -f1 -d"]" |
使用 rpcclient
1 | rpcclient -U "" -N 172.16.5.5 |
使用 CrackMapExec —users 标志
最后,我们可以使用 CrackMapExec 并配合 --users 标志。这是一个有用的工具,它还会显示 badpwdcount (无效登录尝试),因此我们可以从我们的列表中移除那些接近锁定阈值的账户。它还显示 baddpwdtime ,即最后一次错误密码尝试的日期和时间,因此我们可以看到一个账户距离其 badpwdcount 被重置还有多近。在具有多个域控制器的环境中,此值在每个域控制器上分别维护。要获取账户错误密码尝试的准确总数,我们不得不要么查询每个域控制器并使用值的总和,要么查询具有 PDC 模拟器 FSMO 角色的域控制器。
1 | crackmapexec smb 172.16.5.5 --users |
使用 LDAP 匿名方式收集用户
我们可以使用各种工具来收集用户,当我们发现一个 LDAP 匿名绑定时。一些例子包括 windapsearch 和 ldapsearch。如果我们选择使用 ldapsearch ,我们需要指定一个有效的 LDAP 搜索过滤器。我们可以在 Active Directory LDAP 模块中了解更多关于这些搜索过滤器。
使用 ldapsearch
1 | ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "(&(objectclass=user))" | grep sAMAccountName: | cut -f2 -d" " |
使用 windapsearch
1 | windapsearch.py --dc-ip 172.16.5.5 -u "" -U |
使用 Kerbrute 枚举用户
如果我们完全无法从内部网络位置访问,我们可以使用 Kerbrute 来枚举有效的 AD 账户并进行密码喷洒。
该工具使用 Kerberos 预认证,这是一种更快且可能更隐蔽的密码喷洒方式。
此方法不会生成 Windows 事件 ID 4625:账户登录失败,或登录失败,这些情况通常会被监控。
该工具在执行用户名枚举时,向域控制器发送 TGT 请求而不使用 Kerberos 预认证。
如果 KDC 响应错误 PRINCIPAL UNKNOWN ,则表示用户名无效。每当 KDC 要求进行 Kerberos 预认证时,这表明用户名存在,该工具会将其标记为有效。这种用户名枚举方法不会导致登录失败,也不会锁定账户。
但是,一旦我们获得有效用户列表并切换到使用该工具进行密码喷洒,失败的 Kerberos 预认证尝试将计入账户的失败登录次数,并可能导致账户被锁定。所以我们仍然必须小心,无论选择哪种方法。
让我们使用包含 48,705 个可能常见用户名的 jsmith.txt 单词列表来尝试这种方法,格式为 flast 。统计上最可能的用户名 GitHub 存储库是这种攻击的绝佳资源,其中包含我们可用于使用 Kerbrute 枚举有效用户名的各种不同用户名列表。
Kerbrute 用户枚举
1 | kerbrute userenum -d inlanefreight.local --dc 172.16.5.5 /opt/jsmith.txt |
我们仅用 12 秒多时间检查了超过 48,000 个用户名,发现了 50 多个有效用户名。使用 Kerbrute 进行用户名枚举将生成事件 ID 4768:请求了 Kerberos 认证票据(TGT)。这只有在通过组策略启用了 Kerberos 事件日志记录时才会被触发。防御者可以调整他们的 SIEM 工具来查找此类事件 ID 的激增,这可能表明存在攻击。如果在渗透测试中我们通过这种方法成功,这可以成为我们报告中一个极好的建议。
内部喷洒
Linux主机进行内部碰洒
现在我们已经使用前文所述的一种方法创建了一个单词列表,是时候执行我们的攻击了。接下来的章节将让我们从 Linux 和 Windows 主机上进行密码喷洒的实践。这是我们关注的重点之一,因为它是我们获取域凭证以进行访问的两个主要途径之一,但我们也必须谨慎进行。
使用 Bash 一行代码进行攻击
1 | for u in $(cat valid_users.txt);do rpcclient -U "$u%Welcome1" -c "getusername;quit" 172.16.5.5 | grep Authority; done |
使用 Kerbrute 进行攻击
1 | kerbrute passwordspray -d inlanefreight.local --dc 172.16.5.5 valid_users.txt Welcome1 |
使用 CrackMapExec 和过滤登录失败
从 Linux 进行密码喷洒攻击有多种其他方法。另一个很好的选择是使用 CrackMapExec 。这个多功能的工具接受一个用户名文本文件,用于在喷洒攻击中针对单个密码进行运行。在这里我们使用 grep 来过滤 + ,以排除登录失败并专注于仅有效的登录尝试,以确保我们不会通过滚动许多行输出而错过任何内容。
1 | sudo crackmapexec smb 172.16.5.5 -u valid_users.txt -p Password123 | grep + |
在密码喷洒攻击中成功获取一个(或多个)有效凭证后,我们可以使用 CrackMapExec 快速在域控制器上验证这些凭证。
使用 CrackMapExec 验证凭证
1 | sudo crackmapexec smb 172.16.5.5 -u avazquez -p Password123 |
Windows主机进行密码碰洒
从一个已加入域的 Windows 主机开始,DomainPasswordSpray 工具非常有效。如果我们已通过域进行身份验证,该工具将自动从活动目录生成用户列表,查询域密码策略,并排除在锁定账户的一次尝试内被排除的用户账户。
就像我们从 Linux 主机运行喷洒攻击一样,如果我们身处 Windows 主机但未通过域进行身份验证,也可以向该工具提供用户列表。我们可能会遇到客户要求我们从他们网络中的受管理的 Windows 设备进行测试的情况,我们可以在该设备上加载工具。我们可能身临其境,希望从 Windows 虚拟机进行测试,或者我们可能通过其他攻击获得初始立足点,通过域中的主机进行身份验证并执行密码喷洒,试图获取具有更多域权限的账户的凭证。
我们有几种使用该工具的选项。由于主机已加入域,我们将跳过 -UserList 标志,让工具为我们生成列表。我们将提供 Password 标志和一个单独的密码,然后使用 -OutFile 标志将输出写入文件以供后续使用。
使用 DomainPasswordSpray.ps1
1 | Import-Module .\DomainPasswordSpray.ps1 |
本地管理员密码重用
内部密码喷洒不仅限于域用户账户。如果你获得管理员访问权限,并且获取了本地管理员账户(或其他特权本地账户)的 NTLM 密码哈希或明文密码,可以尝试在网络中的多个主机上执行此操作。由于在自动化部署中使用黄金镜像以及通过在多个主机上强制执行相同密码来感知到的管理容易性,本地管理员账户密码重用现象普遍存在。
CrackMapExec 是一个用于尝试这种攻击的实用工具。值得针对高价值主机,如 SQL 或 Microsoft Exchange 服务器,因为它们更有可能登录了高权限用户,或者其凭证仍然驻留在内存中。
在使用本地管理员账户时,需要考虑密码重用或账户间常见的密码格式。如果我们发现一台桌面主机上的本地管理员账户密码设置为独特的密码,例如 $desktop%@admin123 ,那么尝试在服务器上使用 $server%@admin123 可能是值得的。此外,如果我们发现非标准的本地管理员账户,例如 bsmith ,我们可能会发现该密码也被用于具有相似名称的域用户账户。同样的原则可能适用于域账户。如果我们获取了名为 ajones 的用户的密码,那么尝试在他们的管理员账户(如果用户有的话)上使用相同的密码,例如 ajones_adm ,看看他们是否重用了密码。这种情况在域信任情况下也很常见。我们可能获取到域 A 中用户的有效凭证,这些凭证对域 B 中具有相同或相似用户名的用户同样有效,反之亦然。
有时我们可能仅从本地 SAM 数据库中检索本地管理员账户的 NTLM 哈希。在这些情况下,我们可以将 NT 哈希喷洒到整个子网(或多个子网)中,以搜寻设置相同密码的本地管理员账户。
1 | sudo crackmapexec smb --local-auth 172.16.5.0/23 -u administrator -H 88ad09182de639ccc6579eb0849751cf | grep + |
我们尝试使用从另一台机器检索的内置本地管理员账户 NT 哈希对所有 /23 网络中的主机进行身份验证。 --local-auth 标志将指示工具在每台机器上仅尝试登录一次,从而消除账户被锁定的风险。
默认情况下,如果没有设置本地认证选项,该工具将尝试使用当前域进行身份验证,这可能会导致账户被快速锁定。
SMB认证枚举
现在我们已经在这个域中站稳了脚跟,是时候使用我们低权限域用户凭证深入挖掘了。由于我们对域的用户群和机器有了一个大致的了解,现在是时候深入枚举这个域了。我们对域用户和计算机属性、组成员资格、组策略对象、权限、ACL、信任等信息感兴趣。我们有各种选项可供选择,但最重要的一点是,如果没有有效域用户凭证,任何权限级别的这些工具都不会工作。因此,至少我们必须获得一个用户的明文密码、NTLM 密码哈希或域加入主机上的 SYSTEM 访问权限。
使用Linux
CrackMapExec
CrackMapExec (CME,现称为 NetExec) 是一个强大的工具集,用于帮助评估 AD 环境。它利用 Impacket 和 PowerSploit 工具包中的包来执行其功能。
CME 为每个协议提供帮助菜单(例如 crackmapexec winrm -h 等)。请务必查看整个帮助菜单和所有可能的选项。
我们将从使用 SMB 协议来枚举用户和组开始。我们将针对域控制器(我们之前发现的地址),因为它持有我们感兴趣的域数据库中的所有数据。确保所有命令前都要加上 sudo 。
CME - 域用户枚举
我们首先将 CME 指向域控制器,并使用 forend 用户的凭证来检索所有域用户列表。注意当它提供用户信息时,它包括诸如 badPwdCount 属性等数据点。这在执行类似目标密码喷洒等操作时很有帮助。我们可以构建一个目标用户列表,过滤掉任何 badPwdCount 属性大于 0 的用户,以更加小心地避免锁定任何账户。
1 | sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --users |
我们还可以获取完整的域组列表。我们应该将所有输出保存到文件中,以便以后轻松访问以进行报告或与其他工具一起使用。
CME - 域组枚举
1 | sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --groups |
CME - 在线用户
我们也可以使用 CME 来定位其他主机。让我们查看一个看起来像是文件服务器的地方,看看当前有哪些用户登录了。
1 | sudo crackmapexec smb 172.16.5.130 -u forend -p Klmcargo2 --loggedon-users |
CME 共享搜索
共享枚举 - 域控制器
可以使用 --shares 标志来枚举远程主机上可用的共享,以及我们的用户帐户对每个共享的访问级别(读取或写入访问)。让我们针对 INLANEFREIGHT.LOCAL 域控制器运行此操作。1
sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --shares
Spider_plus列出可读文件
我们可以调查这些文件并爬取每个目录以查找文件。模块 spider_plus 将检查主机上每个可读文件,并列出所有可读文件。让我们试试看。1
sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 -M spider_plus --share 'Department Shares'
完成后,CME 将结果写入位于 /tmp/cme_spider_plus/<ip of host> 的 JSON 文件。下面我们可以看到 JSON 输出的一部分。我们可以查找有趣的文件,例如 web.config 文件或可能包含密码的脚本。如果我们想进一步挖掘,我们可以拉取这些文件,查看其中包含的所有内容,或许能找到一些硬编码的凭证或其他敏感信息。
SMBMap
SMBMap 非常适合从 Linux 攻击主机枚举 SMB 共享。如果可访问,它可用于收集共享列表、权限和共享内容。一旦获得访问权限,它就可以用来下载和上传文件以及执行远程命令。
SMBMap 检查访问权限
1 | smbmap -u forend -p Klmcargo2 -d INLANEFREIGHT.LOCAL -H 172.16.5.5 |
以上将告诉我们我们的用户可以访问什么以及他们的权限级别。就像我们从 CME 得到的结果一样,我们看到用户 forend 通过 ADMIN$ 或 C$ 共享没有访问 DC 的权限(这对于标准用户帐户来说是预期的),但确实有对 IPC$ 、 NETLOGON 和 SYSVOL 的读取访问权限,这是任何域中的默认设置。其他非标准共享,如 Department Shares 以及用户和存档共享,是最有趣的。让我们在 Department Shares 共享中对目录进行递归列表。我们可以看到,正如预期的那样,公司中每个部门都有子目录。
递归所有直接目录列表
1 | smbmap -u forend -p Klmcargo2 -d INLANEFREIGHT.LOCAL -H 172.16.5.5 -R 'Department Shares' --dir-only |
rpcclient
rpcclient 是一个用于 Samba 协议的工具,并通过 MS-RPC 提供额外功能。它可以枚举、添加、更改甚至从 AD 中删除对象。它非常多功能;我们只需要找到正确的命令来执行我们想要完成的事情。rpcclient 的手册页非常有助于此;只需在攻击主机的 shell 中输入 man rpcclient 并查看可用的选项。让我们涵盖一些在渗透测试期间可能有助于 rpcclient 的功能。
需要通过rpcclient进入到对话中,下列是空对话的实例:
1 | rpcclient -U "" -N 172.16.5.5 |
RPCClient 通过 RID 列出用户
在查看 rpcclient 中的用户时,您可能会注意到每个用户旁边都有一个名为 rid: 的字段。相对标识符(RID)是一个唯一的标识符(以十六进制格式表示),Windows 使用它来跟踪和识别对象。
- INLANEFREIGHT.LOCAL 域的 SID 是:
S-1-5-21-3842939050-3880317879-2865463114。 - 当对象在域内创建时,上方的数字(SID)将与一个 RID 结合,以生成一个唯一值用于表示该对象。
- 所以域用户
htb-student,RID:0x457 十六进制 0x457 将等于十进制1111,将拥有完整的用户 SID 为:S-1-5-21-3842939050-3880317879-2865463114-1111。 - 这是 INLANEFREIGHT.LOCAL 域中
htb-student对象独有的,你永远不会看到这个配对值与该域或其他域中的任何其他对象相关联。
然而,你会注意到有些账户无论你在哪个主机上,都具有相同的 RID。像域的内置 Administrator 账户,其 RID 为 0x1f4 的 RID 管理员 rid,转换为十进制值等于 500 。内置 Administrator 账户始终具有 Hex 0x1f4 或 500 的 RID 值。情况总是如此。由于此值是对象的唯一标识,我们可以使用它来从域中枚举有关该对象的其他信息。让我们再次尝试使用 rpcclient。我们将针对 htb-student 用户进行挖掘。
1 | rpcclient $> queryuser 0x457 |
当我们使用 queryuser 命令针对 RID 0x457 搜索信息时,RPC 按预期返回了 htb-student 的用户信息。这并不难,因为我们已经知道 htb-student 的 RID。如果我们希望枚举所有用户以收集超过一个的 RID,我们会使用 enumdomusers 命令。
Enumdomusers 枚举用户
1 | enumdomusers |
以这种方式使用它将按名称和 RID 打印出所有域用户。我们的枚举可以利用 rpcclient 进行非常详细的操作。我们甚至可以开始执行诸如编辑用户和组或将我们自己的添加到域中的操作,但这超出了本模块的范围。目前,我们只想执行域枚举以验证我们的发现。花点时间尝试使用其他 rpcclient 函数并查看它们产生的结果。有关 SIDs、RID 以及其他 AD 核心组件等主题的更多信息,值得查看 Active Directory 简介模块。现在,是时候深入 Impacket 的全部魅力了。
