在内网渗透中,当测试人员获取某台机器的控制权后,会以被攻陷的主机为跳板进
行横向渗透,进一步扩大所掌控的资源范围。但是横向渗透中的很多攻击方法都需要先
获取到域内用户的密码或哈希值才能进行,如哈希传递攻击、票据传递攻击等。所以在
进行信息收集时,要尽可能收集域内用户的登录凭据等信息。
获取域内 单机密码和哈希值
在Windows中,SAM文件是Windows用户的账户数据库,位于系统的%SystemRoot%\System32\Config目录中,所有本地用户的用户名、密码哈希值等信息都存储在这个文件中。用户输入密码登录时,用户输入的明文密码被转换为哈希值,然后与SAM文件中的
哈希值对比,若相同,则认证成功。lsass.exe 是Windows 的一个系统进程,用于实现系统的安全机制,主要用于本地安全和登录策略。在通常情况下,用户输入密码登录后,登录的域名、用户名和登录凭据等信息会存储在lsass.exe 的进程空间中,用户的明文密码经过WDigest和Tspkg模块调用后,会对其使用可逆的算法进行加密并存储在内存中。
用来获取主机的用户密码和哈希值的工具有很多,这些工具大多是通过读取SAM文件或者访问lsass.exe 进程的内存数据等操作实现的。这些操作大多需要管理员权限,这意味着需要配合一些提权操作,后面的章节会对常见的提权思路进行讲解。
下面主要通过Mimikatz工具来演示几种获取用户凭据的方法,网络上流行的相关工
具还有很多,请读者自行查阅。
Mimikatz是一款功能强大的凭据转储开源程序,可以帮助测试人员提升进程权限、
注入进程、读取进程内存等,广泛用于内网渗透测试领域(具体见Github的相关网页)。
1.在线读取lsass进程内存
将mimikatz.exe.上传到目标主机,执行以下命令:
mimikatz.exe "privilege: :debug" "sekurlsa: :logonpasswords full" exit
# privilege: :debug,用于提升至DebugPrivilege权限; sekurlsa:: logonpasswords,用于导出用户凭据,可直接从lsass.exe进程的内存中读取当前已登录用户的凭据。
2.离线读取Isass内存文件
除了在线读取,也可以直接将Isass.exe 的进程内存转储,将内存文件导出到本地后,使用Mimikatz进行离线读取。用于转储进程内存的工具有很多,如OutMinidump.ps1、Procdump、SharpDump 等,甚至可以手动加载系统自带的comsvcs.dIl来实现内存转储。
下面使用微软官方提供的Procdump工具(其他方法,读者可以自行查阅资料)。
首先,在目标主机上传Procdump程序,执行以下命令:
procdump.exe -accepteula -ma Lsass.exe lsass. dmp 将lsass.exe 的进程转储。
然后执行以下命令:
mimikatz.exe "sekurlsa: :minidump Lsass. dmp" "sekurlsa: : logonpasswords full" exit
# sekurlsa: :minidump lsass . dmp,用于加载内存文件; sekurlsa:: logonpasswords ,用于导出用户凭据
注意,为了防止用户的明文密码在内存中泄露,微软在2014年5月发布了KB2871997补丁,关闭了WDigest功能,禁止从内存中获取明文密码,且Windows Server 2012及以上版本默认关闭WDigest功能。但是测试人员通过修改注册表,可以重新开启WDigest 功能。当用户注销或者重新登录后,就可以重新获取到用户的明文密码。
#开启WDigest
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v
UseLogonCredential /t REG_ DWORD /d 1 /f
t关闭WDigest
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders \WDigest /v
UseLogonCredential /t REG_ DWORD /d 0 /f
3.在线读取本地SAM文件
将mimikatz.exe上传到目标主机,执行以下命令:
mimikatz.exe "privilege: :debug" "token: :elevate" "lsadump: :sam" exit
# privilege: :debug,用于提升至DebugPrivilege权限
# token: :elevate,用于提升至SYSTEM权限
# Lsadump: :sam,用于读取本地SAM文件
读取SAM文件中保存的用户登录凭据,可以导出当前系统中所有本地用户的哈希值。
4.离线读取本地SAM文件
离线读取就是将SAM文件导出,使用Mimikatz加载并读取其中的用户登录凭据等信息。注意,为了提高SAM文件的安全性以防止离线破解,Windows 会对SAM文件使用密钥进行加密,这个密钥存储在SYSTEM文件中,与SAM文件位于相同目录下。
首先,在目标主机上导出SAM和SYSTEM两个文件。因为系统在运行时,这两个文件是被锁定的,所以需要借助一些工具来实现,而PowerSploit 项目中提供的Invoke-NinjaCopy.ps1脚本可以完成这项工作。
Invoke-NinjaCopy -Path "C: \Windows\System32\config\SAM" -LocalDestination C: \Temp\SAM
Invoke-NinjaCopy -Path "C: \Windows\System32\config\SYSTEM" -LocalDestination C: \Temp\SYSTEM
此外,通过HiveNightmare提权漏洞(CVE-2021-36934),测试人员可以直接读取SAM
和SYSTEM。
也可以在管理员权限下执行以下命令,通过保存注册表的方式导出
reg save HKLM\SAM sam.hive
reg save HKLM\SYSTEM system.hive
然后将导出的SAM和SYSTEM文件复制到本地,使用Mimikatz加载并读取SAM中的
用户凭据信息。
mimikatz.exe "Isadump: :sam /sam:sam.hive /system:system.hive" exit
获取常见应用软件凭据
为了扩大可访问的范围,测试人员通常会搜索各种常见的密码存储位置,以获取用户凭据。-些特定的应用程序可以存储密码,以方便用户管理和维护,如Xmanager.TeamViewer、FileZilla、 NaviCat 和各种浏览器等。通过对保存的用户凭据进行导出和解密,测试人员通常可以获取登录内网服务器和各种管理后台的账号密码,可以通过它们进行横向移动和访问受限资源。
1.获取RDP保存的凭据
为了避免每次连接服务器都进行身份验证,经常使用RDP远程桌面连接远程服务器的用户可能勾选保存连接凭据,以便进行快速的身份验证。这些凭据都使用数据保护API以加密形式存储Windows的凭据管理器中,路径为%USERPROFILE%\AppData\Local\Microsoft\Credentials。
执行以下命令,可以查看当前主机上保存的所有连接凭据
cmdkey /list #查看当前保存的凭据。
dir /a %USERPROFILE%\AppData\Local\Microsoft\Credentials\* #遍历Credentials目录下保存的凭据。
2.获取Xshell保存的凭据
Xshell是一款强大的安全终端模拟软件,支持SSH1、SSH2 和Microsoft的TELNET协议。Xshell 可以在Windows下访问远端不同系统下的服务器,从而达到远程控制终端的目的。
Xshell会将服务器连接信息保存在Session目录下的.xsh文件中。如果用户在连接时勾选了“记住用户名/密码”,该文件会保存远程服务器连接的用户名和经过加密后的密码。
3.获取FileZilla保存的凭据
FileZilla是一款快速的、可依赖的、开源的FTP客户端软件,具备大多数FTP软件
功能。FileZilla 会将所有FTP登录凭据以Base64 密文的格式保存在%USERPROFILE%\
AppData\Roaming\FileZillalrecentservers.xml文件中。
的FTP密码解码即可。
4.获取NaviCat保存的凭据
NaviCat是一款强大的数据库管理和设计工具,被运维人员广泛使用。当用户连接数据库时,需要填写相关信息,如IP、用户名、密码等。用户选择保存密码(默认勾选)后,Navicat将把这些信息保存到注册表中。其中,密码是经过可逆算法加密后保存的,并且Navicat<=11版本和Navicat>=12版本分别使用不同的加密算法。
5.获取浏览器保存的登录凭据
Web浏览器通常会保存网站用户名和密码等凭据,以避免多次手动输入。通常,用户的凭据以加密格式存储在本地文件中,测试人员可以通过读取特定的文件,从Web浏览器中获取凭据。