服务如何以登录用户身份运行?渗透测试权限异常排查
关于服务运行身份的疑问:Local System服务替换二进制后仅以登录用户权限启动
在一次渗透测试中,我们发现一个标注为Local System权限的服务存在未加引号的服务路径(unquoted service path)问题。替换该路径下的服务二进制文件(用于添加用户)后,新二进制文件仅以登录用户权限启动——但我们原本确信它应该以Local System权限运行。
由于无法再访问目标设备,无法验证是否误读了服务的账户设置,但我们确定该服务显示的运行身份为Local System。现在需要复现这种「看似以Local System运行、实则以登录用户身份启动」的服务场景,以此解释漏洞利用失败的原因,同时拓展服务权限相关知识。
我查阅服务编写教程时,找到一段接近需求的代码:
this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.User;
但ServiceAccount.User的文档说明是:
由网络上特定用户定义的账户。为Account成员指定User会导致系统在安装服务时提示输入有效的用户名和密码,除非您为ServiceProcessInstaller实例同时设置Username和Password属性。
由于该服务部署在企业笔记本上,不可能是通过这种需要逐个输入用户凭据的方式创建的,所以肯定存在其他实现方法。
想请教熟悉服务开发的人:
- 是否存在无需每个用户凭据,就能让服务以当前登录用户权限运行的方法?
- 为什么替换Local System服务的初始二进制文件后,进程会以登录用户权限启动?
我已经找到多种让Local System服务以登录用户身份启动其他程序的方法,但这次替换的是服务本身的初始二进制文件,按道理应该继承服务的权限。另外,我从未见过LogOnAs为User的服务,所以对这种场景的实现方式非常困惑。
内容的提问来源于stack exchange,提问作者Mikuláš Hrdlička
相关产品推荐
相关产品推荐

