PsExec远程连接服务器
psexec
是sysinternals
提供的众多windows
工具中的一个,这款工具的初衷是帮助管理员管理大量的机器的,后来被攻击者用来做横向渗透。
下载地址:
https://docs.microsoft.com/en-us/sysinternals/downloads/psexec
使用PsExec远程连接服务其需要满足以下几个条件:
- 远程机器的 139 或 445 端口需要开启状态,即 SMB;
- 明文密码或者 NTLM 哈希;
- 具备将文件写入共享文件夹的权限;
常见的使用psexec进行远程连接的命令如下:(本次测试使用的命令)
PsExec.exe \\TargetIP -u Username -p password /s cmd
环境:
Windows 10 -> 192.168.220.1
Windows 10 -> 192.168.220.75
使用psexec进行远程登录操作:
PsExec.exe \\192.168.220.75 -u Username /s cmd
连接过程中出现的问题
拒绝访问
出现这个问题可能是多方面的因素,我这里总结了两个因素:
1:目标远程服务器445端口未开放
解决办法:开放445端口即可
2:开放445端口之后还会继续报错,报错信息和上边的内容一致。
解决办法:
1:查看本地管理员组确认当前登录的用户属于管理员组,并且存在当前使用的本地用户
2.net share 确定ADMIN$共享处于正常状态,可以看到IPC\$
和ADMIN\$
都处于正常状态
3.测试直接使用ipc$是否可以成功:net use \\192.168.220.75\ipc\$
4.接下来尝试用用ADMIN\$
是否可以成功:net use \\192.168.220.75\admin$
失败,报错信息5,也就是说还是权限的问题,但是当前用户已经可以确认是属于本地管理员用户组的,还是会出现这个问题
查找相关资料,看到微软的WindowsVistaUACDevReqs
文档中有如下描述:
对于本地用户:
当使用远程计算机上本地管理员组成员的用户通过net use \remotecomputer\ 命令建立IPC连接的时候不会以完全管理权限的管理员身份连接,用户无法在远程计算机上提升自己的权限,并且无法执行管理任务,如果用户希望使用安全账户管理器(SAM)中的用户管理服务器,则必须通过远程桌面连接来登录
即使已启用远程管理,内置管理员帐户之外的本地管理员帐户也可能不具有远程管理服务器的权限。 必须将远程用户帐户控制(UAC) LocalAccountTokenFilterPolicy注册表设置配置为允许除内置管理员帐户之外的管理员组的本地帐户远程管理服务器。
如果目标服务器未加入域,请启用以下注册表设置:
HKLM\SOFTWARE\Microsoft\Windows\Currentversion\system\LocalAccountTokenFilterPolicy\策略。
在不对系统设置进行更改的情况下,除默认的本地管理员账户(Administrators)外无法使用其他本地管理员账户完成远程管理。
对于域用户(ACTIVE DIRECTORY 账户):
大致是说:如果你的计算机是域中的一部分,使用管理员组中的用户连接远程计算机,此时UAC 访问令牌过滤器不会生效,不要使用本地的、非域内用户的账户连接远程计算机,即使该用户属于管理员组
当使用域用户(并且该域用户属于管理员组)远程登录到计算机时,该用户会拥有完整的管理员权限,并且UAC会在该会话期间被禁用
Windows已经普遍默认禁用了Administrator用户,并且在域环境下,由于域控端设置的密码安全策略,会因为默认的空密码不满足域内密码安全策略中的密码最小长度导致无法在域机器中启用该账户,除非在域控机器上主动修改域内的密码安全策略,在官方文档中已经有了解决方法,通过修改注册表来解除对非默认管理员账户的限制.
再注册标中新建以下键值:
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Value: LocalAccountTokenFilterPolicy
Data: 1 (to disable, 0 enables filtering)
Type: REG_DWORD (32-bit)
建立完成生效后再次测试,可以成功连接
PsExec连接流量分析
1:使用输入的用户名和密码,通过SMB会话协议进行身份验证
2.访问\\192.168.220.75\admin$
共享文件夹,准备上传PSEXESVC.exe
文件
3.打开svcctl
的句柄,与服务控制器SCM
进行通信,使得能够远程创建/启动服务。此时使用的是SVCCTL
服务,通过对SVCCTL
服务的DCE\RPC
调用来启动Psexec
;
4.使用上传的PSEXESVC.exe
作为服务二进制文件,调用OpenService
函数和StartService
函数;
5.创建命名管道重定向,stdin、stdout、stderr
6.等待攻击者连接管道
7.从管道中读取攻击者的指令
8.将命令的执行结果输出到管道中(报错信息的处理模式与之相同)
9.断开连接,相关命令从管道中传入STATUS_PIPE_DISCONNECTED
10.输出报错信息到远程主机:
11.重新连接SCM
服务管理器,删除服务
12.调用SetInfo
删除PSEXESVC.exe
13.断开连接
综上:PsExec
连接以及命令执行的过程如下:
1:通过SMB
会话进行身份认证,建立连接
2:上传PSEXESVC
文件到共享文件夹
3:连接SCM
服务管理器,启动PSEXESVC
服务
4:创建重定向输入输出管道
5:等待攻击者连接管道
6:从标准输入中获取攻击者要执行的目标命令,将执行结果输出到标准输出中
7:断开连接的时候,将报错信息输出到远程主机
8:重新连接SCM服务管理器
9:删除服务,同时删除上传到共享文件夹的文件
10:断开连接
防御角度
1:该连接过程会在Windows事件日志中产生ID为7045和4624两种事件日志
2:共享文件目录下会存在PSEXESVC
文件
3:连接过程会产生PSEXESVC
服务
4:Event 4697日志记录将有可能包含账号信息。
参考链接
https://www.cnblogs.com/fullstar-l/p/16224372.html
https://www.anquanke.com/post/id/84921
https://rcoil.me/2019/08/%E3%80%90%E7%9F%A5%E8%AF%86%E5%9B%9E%E9%A1%BE%E3%80%91%E6%B7%B1%E5%85%A5%E4%BA%86%E8%A7%A3%20PsExec/