【太阳娱乐】一种检测哈希传递攻击的可靠方法

太阳娱乐 63

【太阳娱乐】一种检测哈希传递攻击的可靠方法

原标题:卡巴斯基2017年企业信息系统的安全评估报告

失效的身份认证和会话管理

与身份认证和回话管理相关的应用程序功能往往得不到正确的实现,这就导致了攻击者破坏密码、密钥、会话令牌或攻击其他的漏洞去冒充其他用户的身份(暂时或永久的)。

太阳娱乐 1

失效的身份认证和会话管理

本指南是用于规划策略以在 Microsoft® Windows Server™ 2003 和 Windows® XP
操作系统中安全地运行服务的重要资源。它解决了设置为使用可能的最大权限运行的
Windows
服务的常见问题,攻击者可能会利用这些服务来获取对计算机或域,甚至整个目录林的完全和不受限制的访问权限。它介绍了几种方法来确定可使用较小权限运行的服务,并且说明了如何有系统地将这些权限降级。本指南可以帮助您评估当前的服务基础结构,并在规划以后的服务部署时帮助您做出一些重要决策。

构建安全的数据访问

更新日期: 2004年04月12日

引言

哈希传递对于大多数企业或组织来说仍然是一个非常棘手的问题,这种攻击手法经常被渗透测试人员和攻击者们使用。当谈及检测哈希传递攻击时,我首先开始研究的是先看看是否已经有其他人公布了一些通过网络来进行检测的可靠方法。我拜读了一些优秀的文章,但我没有发现可靠的方法,或者是这些方法产生了大量的误报。

我存在会话劫持漏洞吗?

如何能够保护用户凭证和会话ID等会话管理资产呢?以下情况可能产生漏洞:
1.用户身份验证凭证没有使用哈希或加密保护。
2.认证凭证可猜测,或者能够通过薄弱的的帐户管理功能(例如账户创建、密码修改、密码恢复,
弱会话ID)重写。
3.会话ID暴露在URL里(例如, URL重写)。
4.会话ID容易受到会话固定(session fixation)的攻击。
5.会话ID没有超时限制,或者用户会话或身份验证令牌特别是单点登录令牌在用户注销时没有失效。
6.成功注册后,会话ID没有轮转。
7.密码、会话ID和其他认证凭据使用未加密连接传输。

Microsoft 已测试了 Windows Server 2003 和 Windows XP
操作系统提供的服务使用其默认登录帐户运行的情况,以确保它们以可能的最低权限级别运行并且具有足够高的安全性。不需要修改这些服务。本指南的重点是确保并非由操作系统提供的服务的安全性,如作为其他
Microsoft 服务器产品的组件而提供的服务:例如,Microsoft SQL Server™ 或
Microsoft Operations Manager
(MOM)。随第三方软件应用程序和内部开发的业务线应用程序一起安装的服务可能需要额外的安全增强功能。

本页内容
本模块内容
目标
适用范围
如何使用本模块
威胁与对策
设计注意事项
输入验证
SQL 注入
身份验证
授权
配置管理
敏感数据
异常管理
构建安全的数据访问组件
代码访问安全性注意事项
部署注意事项
小结
其他资源

卡巴斯基实验室的安全服务部门每年都会为全球的企业开展数十个网络安全评估项目。在本文中,我们提供了卡巴斯基实验室2017年开展的企业信息系统网络安全评估的总体概述和统计数据。

我不会在本文深入剖析哈希传递的历史和工作原理,但如果你有兴趣,你可以阅读SANS发布的这篇优秀的文章——哈希攻击缓解措施。

攻击案例场景

  • 场景#1:机票预订应用程序支持URL重写,把会话ID放在URL里:
    http://example.com/sale/saleitems;jsessionid=2P0OC2JDPXM0OQSNDLPSKHCJUN2JV?dest=Hawaii
    该网站一个经过认证的用户希望让他朋友知道这个机票打折信息。他将上面链接通过邮件发给他朋友们,并不知道自己已经泄漏了自己的会话ID。当他的朋友们使用上面的链接时,他们将会使用他的会话和信用卡。
  • 场景#2:应用程序超时设置不当。用户使用公共计算机访问网站。离开时,该用户没有点击退出,而是直接关闭浏览器。攻击者在一个小时后能使用相同浏览器通过身份认证。盐
  • 场景#3:内部或外部攻击者进入系统的密码数据库。存储在数据库中的用户密码没有被哈希和加盐,
    所有用户的密码都被攻击者获得。

本指南的主要目标是,帮助管理员减少主机操作系统上被操纵的服务造成的影响。本指南以
Microsoft 安全卓越中心 (SCoE) 在客户环境中获得的经验为基础,代表了
Microsoft 最佳做法。

本模块内容

数据访问是使用几个可用的 ADO.NET 数据提供程序之一从 ASP.NET Web
应用程序访问数据库的过程。

此数据库是应用程序级攻击的主要目标。应用程序级攻击用于利用数据访问代码中的漏洞并获取对数据库未授权的访问。如果所有其他攻击方法都已失效,应用程序的前门(即端口
8)将变成攻击者窃取、操纵和破坏数据的可选路径。

本模块说明如何构建安全的数据访问代码,以及如何避免常见的漏洞和缺陷。本模块提供了一系列对策和防御技术,您可以在自己的数据访问代码中使用它们来减少与数据访问有关的主要威胁。

太阳娱乐 2返回页首

本文的主要目的是为现代企业信息系统的漏洞和攻击向量领域的IT安全专家提供信息支持。

总之,攻击者需要从系统中抓取哈希值,通常是通过有针对性的攻击(如鱼叉式钓鱼或通过其他方法直接入侵主机)来完成的(例如:TrustedSec
发布的 Responder
工具)。一旦获得了对远程系统的访问,攻击者将升级到系统级权限,并从那里尝试通过多种方法(注册表,进程注入,磁盘卷影复制等)提取哈希。对于哈希传递,攻击者通常是针对系统上的LM/NTLM哈希(更常见的是NTLM)来操作的。我们不能使用类似NetNTLMv2(通过响应者或其他方法)或缓存的证书来传递哈希。我们需要纯粹的和未经过滤的NTLM哈希。基本上只有两个地方才可以获得这些凭据;第一个是通过本地帐户(例如管理员RID
500帐户或其他本地帐户),第二个是域控制器。

如何防止?

1、区分公共区域和受限区域
  站点的公共区域允许任何用户进行匿名访问。受限区域只能接受特定用户的访问,而且用户必须通过站点的身份验证。考虑一个典型的零售网站。您可以匿名浏览产品分类。当您向购物车中添加物品时,应用程序将使用会话标识符验证您的身份。最后,当您下订单时,即可执行安全的交易。这需要您进行登录,以便通过SSL
验证交易。
  将站点分割为公共访问区域和受限访问区域,可以在该站点的不同区域使用不同的身份验证和授权规则,从而限制对
SSL 的使用。使用SSL
会导致性能下降,为了避免不必要的系统开销,在设计站点时,应该在要求验证访问的区域限制使用
SSL。
2、对最终用户帐户使用帐户锁定策略
  当最终用户帐户几次登录尝试失败后,可以禁用该帐户或将事件写入日志。如果使用
Windows 验证(如 NTLM
或Kerberos协议),操作系统可以自动配置并应用这些策略。如果使用表单验证,则这些策略是应用程序应该完成的任务,必须在设计阶段将这些策略合并到应用程序中。
  请注意,帐户锁定策略不能用于抵制服务攻击。例如,应该使用自定义帐户名替代已知的默认服务帐户(如IUSR_MACHINENAME),以防止获得
Internet 信息服务
(IIS)Web服务器名称的攻击者锁定这一重要帐户。
3、支持密码有效期
  密码不应固定不变,而应作为常规密码维护的一部分,通过设置密码有效期对密码进行更改。在应用程序设计阶段,应该考虑提供这种类型的功能。
4、能够禁用帐户
  如果在系统受到威胁时使凭证失效或禁用帐户,则可以避免遭受进一步的攻击。5、不要在用户存储中存储密码
  如果必须验证密码,则没有必要实际存储密码。相反,可以存储一个单向哈希值,然后使用用户所提供的密码重新计算哈希值。为减少对用户存储的词典攻击威胁,可以使用强密码,并将随机salt
值与该密码结合使用。
5、要求使用强密码
  不要使攻击者能轻松破解密码。有很多可用的密码编制指南,但通常的做法是要求输入至少
8位字符,其中要包含大写字母、小写字母、数字和特殊字符。无论是使用平台实施密码验证还是开发自己的验证策略,此步骤在对付粗暴攻击时都是必需的。在粗暴攻击中,攻击者试图通过系统的试错法来破解密码。使用常规表达式协助强密码验证。
6、不要在网络上以纯文本形式发送密码
  以纯文本形式在网络上发送的密码容易被窃听。为了解决这一问题,应确保通信通道的安全,例如,使用
SSL 对数据流加密。
7、保护身份验证 Cookie
  身份验证
cookie被窃取意味着登录被窃取。可以通过加密和安全的通信通道来保护验证票证。另外,还应限制验证票证的有效期,以防止因重复攻击导致的欺骗威胁。在重复攻击中,攻击者可以捕获cookie,并使用它来非法访问您的站点。减少
cookie 超时时间虽然不能阻止重复攻击,但确实能限制攻击者利用窃取的
cookie来访问站点的时间。
8、使用 SSL 保护会话身份验证 Cookie
  不要通过 HTTP 连接传递身份验证 cookie。在授权 cookie 内设置安全的
cookie 属性,以便指示浏览器只通过HTTPS
连接向服务器传回
cookie。
9、对身份验证 cookie 的内容进行加密
  即使使用 SSL,也要对 cookie 内容进行加密。如果攻击者试图利用 XSS
攻击窃取cookie,这种方法可以防止攻击者查看和修改该
cookie。在这种情况下,攻击者仍然可以使用 cookie
访问应用程序,但只有当cookie 有效时,才能访问成功。
10、限制会话寿命
  缩短会话寿命可以降低会话劫持和重复攻击的风险。会话寿命越短,攻击者捕获会话
cookie并利用它访问应用程序的时间越有限。
11、避免未经授权访问会话状态
  考虑会话状态的存储方式。为获得最佳性能,可以将会话状态存储在 Web
应用程序的进程地址空间。然而这种方法在
Web场方案中的可伸缩性和内涵都很有限,来自同一用户的请求不能保证由同一台服务器处理。在这种情况下,需要在专用状态服务器上进行进程外状态存储,或者在共享数据库中进行永久性状态存储。ASP.NET支持所有这三种存储方式。
  对于从 Web 应用程序到状态存储之间的网络连接,应使用 IPSec 或 SSL
确保其安全,以降低被窃听的危险。另外,还需考虑Web
应用程序如何通过状态存储的身份验证。
  在可能的地方使用
Windows验证,以避免通过网络传递纯文本身份验证凭据,并可利用安全的
Windows帐户策略带来的好处。

详情请参考这里

目标

使用本模块可以实现:

设计、构建和部署安全的数据访问代码。

使用代码访问安全性和基于角色的安全性可以限制未经授权的调用方或代码的访问。

安全地验证用户的身份。

防止 SQL 注入攻击。

确保数据库连接字符串的安全。

使用加密机制来保护存储在数据库中的数据。

确保通过网络发送到数据库以及从数据库发送的数据的安全。

使用带有salt 的哈希值将密码安全地存储在数据库中。

实现安全的异常处理。

了解如何使用代码访问安全性,允许中等信任 Web 应用程序使用 OLE DB、Oracle 和 ODBC 数据提供程序(这些提供程序需要完全信任)。

了解应使用哪些对策来解决常见的数据访问威胁,包括 SQL 注入、配置数据泄露、敏感的应用程序数据泄露、数据库架构和连接详细信息的泄露、未授权的访问和网络窃听。

太阳娱乐 3返回页首

我们已经为多个行业的企业开展了数十个项目,包括政府机构、金融机构、电信和IT公司以及制造业和能源业公司。下图显示了这些企业的行业和地区分布情况。

哈希传递的主要成因是由于大多数企业或组织在一个系统上拥有共享本地帐户,因此我们可以从该系统中提取哈希并移动到网络上的其他系统。当然,现在已经有了针对这种攻击方式的缓解措施,但他们不是100%的可靠。例如,微软修补程序和较新版本的Windows(8.1和更高版本)“修复”了哈希传递,但这仅适用于“其他”帐户,而不适用于RID为
500(管理员)的帐户。

补充:

适用范围

本模块适用于下列产品和技术:

Microsoft® Windows® 2000 Server 和 Microsoft Windows Server™ 2003

Microsoft .NET Framework 1.1 和 ASP.NET 1.1

Microsoft SQL Server™

太阳娱乐 4返回页首

目标企业的行业和地区分布情况

你可以禁止通过GPO传递哈希:

– 1. 设置httponly属性.

httponly是微软对cookie做的扩展,该值指定 Cookie 是否可通过客户端脚本访问,
解决用户的cookie可能被盗用的问题,减少跨站脚本攻击,主流的大多数浏览器已经支持此属性。

  • asp.net全局设置:

//global中设置有所的cookie只读
protected void Application_EndRequest(Object sender, EventArgs e)
        {
            foreach(string sCookie in Response.Cookies)
            {
                Response.Cookies[sCookie].HttpOnly = true;
                Response.Cookies[sCookie].Secure = true;
            }

        }
  • JAVA

httpOnly是cookie的扩展属性,并不包含在servlet2.x的规范里,因此一些javaee应用服务器并不支持httpOnly,针对tomcat,>6.0.19或者>5.5.28的版本才支持httpOnly属性,具体方法是在conf/context.xml添加httpOnly属性设置

<Context useHttpOnly="true"> ... </Context>

另一种设置httpOnly的方式是使用Tomcat的servlet扩展直接写header

response.setHeader( "Set-Cookie", "name=value; HttpOnly");

下面三个常用的帐号,以及他们所拥有的权限,请仔细阅读

如何使用本模块

为了充分理解本模块内容,请先阅读下列模块或与本模块结合起来阅读:

阅读模块 2 威胁与对策。这将使您更广泛深入地了解 Web 应用程序所面临的潜在威胁及其对策。

阅读模块 4 Web 应用程序安全设计指南。在本模块中,您将了解构建安全解决方案时所面临的体系结构和设计挑战,以及构建准则。

阅读模块 18 保证数据库服务器的安全。阅读模块 18 可了解如何确保数据库服务器的安全。

阅读模块 7 构建安全的程序集。模块 7 中构建安全程序集和开发安全托管代码的准则和建议同样应该适用于数据访问代码

使用评估模块。要在产品周期的不同阶段检查数据访问的安全性,请参见下列模块中的“Web 服务”部分:模块 5 安全性体系结构和设计审查、模块 21 代码审查以及模块 22 部署审查。

使用检查表。本指南“检查表”部分中的检查表:保护数据访问包括一个便于参考的检查表。可以将此基于任务的检查表用作本模块中各个建议的摘要。

请注意,在当前版本的 .NET Framework (1.1) 中,只有 ADO.NET SQL Server
数据访问提供程序才支持部分信任调用方,并且可以安全地用在部分信任 Web
应用程序中。OLE DB、Oracle 和 ODBC ADO.NET 数据提供程序需要完全信任。

太阳娱乐 5返回页首

太阳娱乐 6

“拒绝从网络访问此计算机”

– 2. 验证成功后更换sessionID

在登录验证成功后,通过重置session,使之前的匿名sessionId失效,这样可以避免使用伪造的sessionId进行攻击。代码如下

protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { 
    String username=request.getParameter("username"); 
    Stringpassword=request.getParameter("password");
    if("admin".equals(username) &&"pass".equals(password)){ //使之前的匿名session失效 
          request.getSession().invalidate(); 
          request.getSession().setAttribute("login", true);  
          response.sendRedirect("hello.jsp"); 
    }
    else{ 
          response.sendRedirect("login.jsp");
   } 
}

“本地系统”帐户

威胁与对策

要构建安全的数据访问代码,需要了解数据访问代码中的威胁是什么、常见漏洞是如何产生的以及如何使用适当的对策来降低风险。

数据访问代码面临的主要威胁包括:

SQL 注入

配置数据的泄漏

敏感应用程序数据的泄漏

数据库架构和连接详细信息的泄露

未授权的访问

网络窃听

图 14.1 阐明了这些主要威胁。

太阳娱乐 7

图 14.1
数据访问代码面临的威胁和攻击

漏洞的概括和统计信息是根据我们提供的每种服务分别总结的:

设置路径位于:

“本地系统”帐户是预定义的本地帐户,它可以启动服务并为该服务提供安全上下文。这是一个功能强大的帐户,它具有计算机的完全访问权限,在用于域控制器上运行的服务时,它还包含对目录服务的访问权限。该帐户用作网络上的主机帐户,因此,就像任何其他域帐户一样可以访问网络资源。在网络上,该帐户显示为
DOMAIN<计算机名>$。如果某个服务使用域控制器上的“本地系统”帐户进行登录,则它具有该域控制器本身的“本地系统”访问权限,如果域控制器受到攻击,则可能会允许恶意用户随意更改域中的内容。默认情况下,Windows
Server 2003 将一些服务配置为作为“本地系统”帐户登录。该帐户的实际名称是
NT AUTHORITYSystem,并且它不包含管理员需要管理的密码。

SQL 注入

SQL
注入攻击利用易受攻击的数据访问代码,并允许攻击者在数据库中执行任意命令。如果应用程序使用数据库中不受限制的帐户,由于攻击者可以更自由地执行查询和命令,因此受到的威胁会更大。

漏洞

使数据访问代码容易受到 SQL 注入攻击的常见漏洞包括:

弱输入验证

在不使用类型安全的参数时动态构造 SQL 语句

使用特权过高的数据库登录

对策

要应对 SQL 注入攻击,请务必:

限制和净化输入数据。

使用类型安全的 SQL 参数进行数据访问。这些参数可以与存储过程一起使用,也可以是动态构造的 SQL 命令字符串。参数执行类型和长度检查,并同时确保注入数据库中的代码被视为文本数据(而非可执行语句)。

使用在数据库中具有有限权限的帐户。理想情况下,只应向数据库中的选定存储过程授予执行权限,且不提供直接的表格访问权限。

外部渗透测试是指针对只能访问公开信息的外部互联网入侵者的企业网络安全状况评估

内部渗透测试是指针对位于企业网络内部的具有物理访问权限但没有特权的攻击者进行的企业网络安全状况评估。

Web应用安全评估是指针对Web应用的设计、开发或运营过程中出现的错误导致的漏洞(安全漏洞)的评估。

Computer ConfigurationWindowsSettingsSecurity SettingsLocal PoliciesUser Rights Assignment 

“本地服务”帐户

配置数据泄露

数据访问代码所使用的最敏感的配置数据是数据库连接字符串。如果泄漏的连接字符串包括用户名和密码,后果将不堪设想。

漏洞

下列漏洞会增加与泄漏的配置数据相关的安全风险:

使用 SQL 身份验证,这要求在连接字符串中指定凭据

代码中嵌入的连接字符串

配置文件中的明文连接字符串

无法加密连接字符串

对策

要防止配置数据的泄漏:

使用 Windows 身份验证,以便连接字符串中不包含凭据。

加密连接字符串,并限制对已加密数据的访问。

本出版物包含卡巴斯基实验室专家检测到的最常见漏洞和安全缺陷的统计数据,未经授权的攻击者可能利用这些漏洞渗透公司的基础设施。

大多数企业或组织都没有能力实施GPO策略,而传递哈希可被利用的可能性却非常大。

“本地服务”帐户是一种特殊的内置帐户,它具有较少的权限,与经过身份验证的本地用户帐户类似。如果攻击者利用单个服务或进程,这种受限的访问权限有助于保护计算机。以“本地服务”帐户运行的服务作为空会话来访问网络资源;即,它使用匿名凭据。该帐户的实际名称是
NT AUTHORITYLocalService,并且它不包含管理员需要管理的密码。

敏感应用程序数据的泄漏

许多应用程序都存储敏感的数据(如客户的信用卡号),一定要保护此类数据的私密性和完整性。

漏洞

下列编码做法可能会导致泄漏敏感的应用程序数据:

存储没有加密的数据

弱授权

弱加密

对策

要防止泄漏敏感的应用程序数据:

使用强加密机制来确保数据的安全。

在执行数据访问之前先为每个调用方授权,以便用户只能看到其各自的数据。

针对外部入侵者的安全评估

接下来的问题是,你怎么检测哈希传递攻击?

“网络服务”帐户

数据库架构和连接详细信息的泄露

如果您的代码向客户端返回异常详细信息,恶意用户可能会使用这些信息来攻击服务器。数据访问代码中的异常可能会透露敏感信息,如数据库架构详细信息、数据存储的特性以及
SQL 代码片断。

漏洞

下列漏洞可能会导致信息泄漏:

不充分的异常处理

薄弱的 ASP.NET 配置(允许未经处理的异常详细信息返回到客户端)

对策

要防止这种泄漏:

捕获、记录和处理数据访问代码中的数据访问异常。

向调用方返回一般的错误消息。这要求对 Web.config 或 Machine.config 配置文件中的 <customErrors> 元素进行适当的配置。

我们将企业的安全等级划分为以下评级:

检测哈希传递攻击是比较有挑战性的事情,因为它在网络中表现出的行为是正常。比如:当你关闭了RDP会话并且会话还没有关闭时会发生什么?当你去重新认证时,你之前的机器记录仍然还在。这种行为表现出了与在网络中传递哈希非常类似的行为。

“网络服务”帐户是一种特殊的内置帐户,它具有较少的权限,与经过身份验证的用户帐户类似。如果攻击者利用单个服务或进程,这种受限的访问权限有助于保护计算机。以“网络服务”帐户运行的服务使用计算机帐户的凭据来访问网络资源,这与“本地系统”服务访问网络资源的方式相同。该帐户的实际名称是
NT AUTHORITYNetworkService,并且它不包含管理员需要管理的密码。

未授权的访问

在授权不足的情况下,用户也许能够看到另一个用户的数据,并且能够访问其他受限制的数据。

漏洞

下列做法可能会允许未授权的访问:

数据访问代码中缺乏授权,从而提供了不受限制的访问

数据库帐户的特权过高

对策

要防止未授权的访问:

按照主体权限需求为调用用户授权。

按照代码访问安全权限需求为调用代码授权。

使用受限制的权限来限制应用程序登录到数据库,并防止直接访问表格。

非常低

中等偏下

中等偏上

通过对成千上万个系统上的日志进行广泛的测试和分析,我们已经能够识别出在大多数企业或组织中的非常具体的攻击行为并且具有非常低的误报率。有许多规则可以添加到以下检测功能中,例如,在整个网络中查看一些成功的结果会显示“哈希传递”,或者在多次失败的尝试后将显示凭证失败。

网络窃听

大多数应用程序的部署体系结构中都包括数据访问代码与数据库服务器之间的物理隔离。因此,必须防止窃听者通过网络窃听敏感数据(如应用程序特定的数据或数据库登录凭据)。

漏洞

下列做法会增加网络窃听的漏洞:

在 SQL 身份验证过程中通过网络传递的明文凭据

进出数据库服务器的未加密敏感应用程序数据

对策

要限制网络窃听的漏洞:

使用 Windows 身份验证来避免通过网络发送凭据。

在数据库服务器上安装一个服务器证书。这会导致自动加密网络上的 SQL 凭据。

在 Web 服务器和数据库服务器之间使用 SSL 连接来保护敏感的应用程序数据。这需要一个数据库服务器证书。

在 Web 和数据库服务器之间使用 IPSec 加密通道。

太阳娱乐 8返回页首

我们通过卡巴斯基实验室的自有方法进行总体的安全等级评估,该方法考虑了测试期间获得的访问级别、信息资源的优先级、获取访问权限的难度以及花费的时间等因素。

下面我们要查看所有登录类型是3(网络登录)和ID为4624的事件日志。我们正在寻找密钥长度设置为0的NtLmSsP帐户(这可以由多个事件触发)。这些是哈希传递(WMI,SMB等)通常会使用到的较低级别的协议。另外,由于抓取到哈希的两个唯一的位置我们都能够访问到(通过本地哈希或通过域控制器),所以我们可以只对本地帐户进行过滤,来检测网络中通过本地帐户发起的传递哈希攻击行为。这意味着如果你的域名是GOAT,你可以用GOAT来过滤任何东西,然后提醒相应的人员。不过,筛选的结果应该去掉一些类似安全扫描器,管理员使用的PSEXEC等的记录。

设计注意事项

在开始编写代码之前,需要在设计时考虑许多重要的问题。主要的注意事项包括:

使用 Windows 身份验证。

使用最小特权帐户。

使用存储过程。

保护所存储的敏感数据。

使用单独的数据访问程序集。

安全级别为非常低对应于我们能够穿透内网的边界并访问内网关键资源的情况(例如,获得内网的最高权限,获得关键业务系统的完全控制权限以及获得关键的信息)。此外,获得这种访问权限不需要特殊的技能或大量的时间。

请注意,你可以(也可能应该)将域的日志也进行分析,但你很可能需要根据你的实际情况调整到符合基础结构的正常行为。比如,OWA的密钥长度为0,并且具有与基于其代理验证的哈希传递完全相同的特征。这是OWA的正常行为,显然不是哈希传递攻击行为。如果你只是在本地帐户进行过滤,那么这类记录不会被标记。

使用 Windows 身份验证

理想情况下,在设计中应该使用 Windows 身份验证,以增加安全性好处。使用
Windows
身份验证,您不必存储具有嵌入凭据的数据库连接字符串,凭据不通过网络传递,而且您可以受益于安全帐户和密码管理策略。但是,您需要认真考虑在使用
Windows 身份验证时,将使用哪个帐户连接到 SQL Server。

有关详细信息,请参阅本模块后面的身份验证。

安全级别为高对应于在客户的网络边界只能发现无关紧要的漏洞(不会对公司带来风险)的情况。

事件ID:4624

使用最小特权帐户

您的应用程序应该使用在数据库中具有有限权限的最小特权帐户。请确保对应用程序的数据库登录进行了适当的授权和限制。有关详细信息,请参阅本模块后面的授权。

使用最小特权帐户可以降低风险,并在您的帐户发生泄漏或者注入了恶意代码时限制潜在的损害。对于
SQL
注入,该命令将在由应用程序登录定义的安全上下文中执行,并遵守该登录在数据库中拥有的相关权限。如果您使用特权过高的帐户(例如,作为
SQL Server sysadmin
角色的成员)进行连接,攻击者能够在服务器上的任何数据库中执行任意操作。这包括插入、更新和删除数据;删除表;执行操作系统命令。

要点 不要使用 sa 帐户或者 SQL Server sysadmin
db_owner 角色的任何成员帐户连接到 SQL Server。

目标企业的经济成分分布

登录类型:3

使用存储过程

存储过程提供性能、维护和安全性好处。应尽可能使用参数化存储过程进行数据访问。安全性好处包括:

可以限制应用程序数据库登录,以便它只具有执行指定存储过程的权限。没有必要授予直接的表格访问权限。这有助于降低由 SQL 注入攻击造成的风险。

针对传递到存储过程的所有输入数据执行长度和类型检查。同样,不能将参数视为可执行代码。这也会降低 SQL 注入风险。

如果由于某种原因,您无法使用参数化存储过程,但是您需要动态构造 SQL
语句,请使用类型化参数和参数占位符来构造这样的语句,以确保检查输入数据的长度和类型。

太阳娱乐 9

登录过程:NtLmSsP

保护所存储的敏感数据

标识需要保证私密性和完整性的存储数据。如果您只是为了验证而将密码存储到数据库中,请考虑使用单向哈希。如果密码表发生泄漏,则不能使用哈希来获取明文密码。

如果您存储用户提供的敏感数据(如信用卡号),请使用强对称加密算法(如三重
DES (3DES))来加密数据。使用 Win32 数据保护 API (DPAPI) 加密 3DES
密钥,然后将已加密的密钥存储在具有受限 ACL
的注册表项中,只有管理员和应用程序进程帐户才能使用该注册表项。

目标企业的安全等级分布

安全ID:空SID – 可选但不是必需的,目前还没有看到为Null的
SID未在哈希传递中使用。

为什么不使用 DPAPI?

尽管建议使用 DPAPI
来加密连接字符串和其他可在计算机出现故障时手动恢复和重新构造的机密(如帐户凭据),但仍不太适合存储信用卡号之类的数据。这是由于可恢复性问题(如果密钥丢失,则无法恢复加密数据)和
Web 场问题。相反,应该使用对称加密算法(如 3DES)并使用 DPAPI 加密密钥。

下面概述了造成 DPAPI 不太适合在数据库中存储敏感数据的主要问题:

如果 DPAPI 与计算机密钥一起使用,而且您将 CRYPTPROTECT_LOCAL_MACHINE 传递到 CryptProtectDataCryptUnprotectData 函数,则计算机帐户会生成加密密钥。这意味着 Web 场中的每台服务器都有一个不同的密钥,这会禁止一台服务器访问由另一台服务器加密的数据。同样,如果该 Web 服务器计算机被破坏,则密钥会丢失,而且加密的数据无法从数据库进行恢复。

如果使用计算机密钥方法,则该计算机上的任何用户都可以对数据进行解密(除非您使用其他加密机制)。

如果您将 DPAPI 与用户密钥一起使用,而且您使用的是本地用户帐户,就会为每台 Web 服务器上的每个本地帐户生成一个不同的安全标识符 (SID) 和一个不同的密钥,这会禁止一台服务器访问由另一台服务器加密的数据。

如果您将 DPAPI 与用户密钥一起使用,而且您在 Web 场中的计算机之间使用漫游用户配置文件,则所有数据都将共享相同的加密/解密密钥。但是,如果负责漫游用户配置文件帐户的域控制器被损害或被破坏,则无法重新创建具有相同 SID 的用户帐户,而且不能从数据库中恢复加密的数据。

另外,对于漫游用户配置文件,如果某人设法检索该数据,则只要攻击者能够在特定的用户帐户下运行代码,就可以在网络中的任何计算机上解密该数据。这会增加潜在攻击的范围,因此不建议这样做。

太阳娱乐 10

主机名
:(注意,这不是100%有效;例如,Metasploit和其他类似的工具将随机生成主机名)。你可以导入所有的计算机列表,如果没有标记的计算机,那么这有助于减少误报。但请注意,这不是减少误报的可靠方法。并不是所有的工具都会这样做,并且使用主机名进行检测的能力是有限的。

使用单独的数据访问程序集

如果您可以进行选择,请避免将数据访问逻辑直接放在 ASP.NET
页或代码隐藏文件中。如果将数据访问逻辑放在一个单独的程序集中,并实现一个与应用程序的业务和表示逻辑分开的逻辑数据访问层,就会带来安全性、重复使用和维护好处。

从安全的角度看,您可以:

对程序集使用强名称以提供可防篡改功能。

使用沙盒技术来隔离数据访问代码,如果您的代码需要支持部分信任调用方(例如,部分信任 Web 应用程序),这一点十分重要。

使用那些按照代码标识权限需求向调用代码授权的数据访问方法和类。

对于深层防御,请按照业务组件中的主体权限需求来执行基于主体的授权,并按照代码标识权限需求来为调用数据访问逻辑的代码授权,如图
14.2 所示。

太阳娱乐 11

图 14.2
表示层、业务层和数据访问层的分离

有关数据访问代码授权的详细信息,请参阅本模块后面的授权部分。

太阳娱乐 12返回页首

根据测试期间获得的访问级别来划分目标企业

帐户名称和域名:仅警告只有本地帐户(即不包括域用户名的账户)的帐户名称。这样可以减少网络中的误报,但是如果对所有这些账户进行警告,那么将检测例如:扫描仪,psexec等等这类东西,但是需要时间来调整这些东西。在所有帐户上标记并不一定是件坏事(跳过“COMPUTER$”帐户),调整已知模式的环境并调查未知的模式。

输入验证

除了业务层需要确保数据库保持数据的有效性和一致性之外,还必须在将数据提交到数据库之前验证数据,以防
SQL
注入。如果数据访问代码从当前信任边界内部的其他组件接收其输入内容,而且您知道数据已经过验证(例如,由
ASP.NET
网页或业务组件验证),则数据访问代码会忽略广泛的数据验证。但是,请确保在数据访问代码中使用
SQL 参数,这些参数验证输入参数的类型和长度。下一部分将讨论 SQL
参数的用法。

太阳娱乐 13返回页首

太阳娱乐 14

密钥长度:0 –
这是会话密钥长度。这是事件日志中最重要的检测特征之一。像RDP这样的东西,密钥长度的值是
128位。任何较低级别的会话都将是0,这是较低级别协议在没有会话密钥时的一个明显的特征,所在此特征可以在网络中更好的发现哈希传递攻击。

SQL 注入

当应用程序使用输入内容来构造动态 SQL 语句以访问数据库时,会发生 SQL
注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生
SQL 注入攻击。SQL
注入可能导致攻击者能够使用应用程序登录在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。

注意 传统的安全措施(如使用 SSL 和 IPSec)不能防止 SQL 注入攻击。

用于穿透网络边界的攻击向量

另外一个好处是这个事件日志包含了认证的源IP地址,所以你可以快速的识别网络中哈希传递的攻击来源。

防止 SQL 注入

使用下列对策来防止 SQL 注入攻击:

限制输入。

使用类型安全的 SQL 参数。

大多数攻击向量成功的原因在于不充分的内网过滤、管理接口可公开访问、弱密码以及Web应用中的漏洞等。

为了检测到这一点,我们首先需要确保我们有适当的组策略设置。我们需要将帐户登录设置为“成功”,因为我们需要用事件日志4624作为检测的方法。

限制输入

验证输入内容的类型、长度、格式和范围。如果您不希望获得数值,则不要接受它们。应该考虑输入内容来自何处。如果它来自受信任源,而且您知道已针对该来源执行过彻底的输入验证,则可以选择在数据访问代码中忽略数据验证。如果数据来自不受信任源或者用于深层防御,则数据访问方法和组件应该验证输入。

尽管86%的目标企业使用了过时、易受攻击的软件,但只有10%的攻击向量利用了软件中的未经修复的漏洞来穿透内网边界(28%的目标企业)。这是因为对这些漏洞的利用可能导致拒绝服务。由于渗透测试的特殊性(保护客户的资源可运行是一个优先事项),这对于模拟攻击造成了一些限制。然而,现实中的犯罪分子在发起攻击时可能就不会考虑这么多了。

太阳娱乐 15

使用类型安全的 SQL 参数

SQL 中的 Parameters 集合提供类型检查和长度验证。如果您使用
Parameters 集合,则输入内容将被视为文本值,SQL
不会将其视为可执行代码。使用 Parameters
集合还有一个好处,那就是可以强制进行类型和长度检查。超出范围的值会触发异常。这是深层防御的一个有力示例。

要点 SSL 不能防止 SQL
注入。对于任何应用程序来说,如果它在没有正确的输入验证和适当的数据访问技术的情况下访问数据库,都很容易受到
SQL 注入攻击。

尽可能使用存储过程,并使用 Parameters 集合来调用它们。

建议:

让我们分解日志并且模拟哈希传递攻击过程。在这种情况下,我们首先想象一下,攻击者通过网络钓鱼获取了受害者电脑的凭据,并将其提升为管理级别的权限。从系统中获取哈希值是非常简单的事情。假设内置的管理员帐户是在多个系统间共享的,攻击者希望通过哈希传递,从SystemA(已经被入侵)移动到SystemB(还没有被入侵但具有共享的管理员帐户)。

结合使用 Parameters 集合和存储过程

下面的代码片断阐释了 Parameters 集合的用法:

SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin", conn);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm = myCommand.SelectCommand.Parameters.Add(
"@au_id", SqlDbType.VarChar, 11);
parm.Value = Login.Text;

在本例中,@au_id
参数被视为文本值,而非可执行代码。另外,还针对参数进行了类型和长度检查。在上例中,输入值不能长于
11 个字符。如果数据不遵循由参数定义的类型或长度,就会生成异常。

请注意,使用存储过程不一定会防止 SQL
注入。重要的是结合使用参数和存储过程。如果不使用参数,则在存储过程使用未筛选的输入内容时,它们很容易受到
SQL 注入攻击。例如,下面的代码片断很容易受到攻击:

SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure '" +
Login.Text + "'", conn);

要点 如果使用存储过程,请确保同时使用参数。

除了进行更新管理外,还要更加注重配置网络过滤规则、实施密码保护措施以及修复Web应用中的漏洞。

在这个例子中,我们将使用Metasploit
psexec,尽管还有很多其他的方法和工具可以实现这个目标:

结合使用 Parameters 集合和动态 SQL

如果您不能使用存储过程,仍可以使用参数,如下面的代码片断所示:

SqlDataAdapter myCommand = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", conn);
SqlParameter parm = myCommand.SelectCommand.Parameters.Add("@au_id",
SqlDbType.VarChar, 11);
parm.Value = Login.Text;

太阳娱乐 16

太阳娱乐 17

使用参数批处理

通常会产生如下误解:如果将几个 SQL
语句连接在一起,以便在单个往返中向服务器发送一批语句,则不能使用参数。但是,如果您能确保参数名不重复,则可以使用这种技术。通过在
SQL
文本连接过程中,向每个参数名中添加一个数字或其他某个唯一值,可以方便地执行此操作。

利用 Web应用中的漏洞发起的攻击

在这个例子中,攻击者通过传递哈希建立了到第二个系统的连接。接下来,让我们看看事件日志4624,包含了什么内容:

使用筛选例程

用来防止 SQL 注入攻击的另一种方法是开发筛选例程,以便向具有特殊 SQL
含义的字符添加转义符,如单撇号字符。下面的代码片断阐释了一个用来添加转义符的筛选例程:

private string SafeSqlLiteral(string inputSQL)
{
return inputSQL.Replace("'", "''");
}

这种例程存在着一定的问题,而且您不应完全依赖它们,因为攻击者可以使用
ASCII
十六进制字符来回避检查。但是应该筛选输入内容,并将其作为深层防御策略的一部分。

注意 不要依赖筛选输入。

我们的2017年渗透测试结果明确表明,对Web应用安全性的关注仍然不够。Web应用漏洞在73%的攻击向量中被用于获取网络外围主机的访问权限。

太阳娱乐 18

使用 LIKE 子句

请注意,如果您使用 LIKE
子句,通配符仍需要转义符。下面的代码片断阐释了这种技术:

s = s.Replace("[", "[[]");
s = s.Replace("%", "[%]");
s = s.Replace("_", "[_]");

太阳娱乐 19返回页首

在渗透测试期间,任意文件上传漏洞是用于穿透网络边界的最广泛的Web应用漏洞。该漏洞可被用于上传命令行解释器并获得对操作系统的访问权限。SQL注入、任意文件读取、XML外部实体漏洞主要用于获取用户的敏感信息,例如密码及其哈希。账户密码被用于通过可公开访问的管理接口来发起的攻击。

安全ID:NULL
SID可以作为一个特征,但不要依赖于此,因为并非所有的工具都会用到SID。虽然我还没有亲眼见过哈希传递不会用到NULL
SID,但这也是有可能的。

身份验证

当应用程序连接到 SQL Server 数据库时,可以在 Windows 身份验证或 SQL
身份验证之间进行选择。Windows 身份验证更安全。如果必须使用 SQL
身份验证(可能由于必须使用许多不同的帐户连接到数据库,并且希望避免调用
LogonUser),请执行其他几个步骤,以尽可能降低额外的风险。

注意 如果使用 LogonUser 创建模拟令牌,需要在 Microsoft Windows
2000
上具有功能强大的“作为操作系统的一部分工作”特权,因此应避免使用此方法。

考虑下面的建议:

使用 Windows 身份验证。

保护 SQL 身份验证的凭据。

使用最小特权帐户进行连接。

建议:

太阳娱乐 20

使用 Windows 身份验证

Windows 身份验证不通过网络发送凭据。如果对 Web 应用程序使用 Windows
身份验证,请尽可能使用服务帐户或进程帐户(如 ASPNET
帐户)连接到数据库。Windows 和 SQL Server
都必须能够识别您在数据库服务器上使用的帐户。该帐户必须被授予 SQL Server
登录权限,而且需要具有与访问数据库相关的登录权限。

在使用 Windows
身份验证时,必须使用受信任连接。下面的代码片断显示了几个使用 Windows
身份验证的典型的连接字符串。

下例使用面向 SQL Server 的 ADO.NET 数据提供程序:

SqlConnection pubsConn = new SqlConnection(
"server=dbserver; database=pubs; Integrated Security=SSPI;");

下例使用面向 OLE DB 数据源的 ADO.NET 数据提供程序:

OleDbConnection pubsConn = new OleDbConnection(
"Provider=SQLOLEDB; Data Source=dbserver; Integrated Security=SSPI;" +
"Initial Catalog=northwind");

应定期对所有的公开Web应用进行安全评估;应实施漏洞管理流程;在更改应用程序代码或Web服务器配置后,必须检查应用程序;必须及时更新第三方组件和库。

接下来,工作站名称肯定看起来很可疑;
但这并不是一个好的检测特征,因为并不是所有的工具都会将机器名随机化。你可以将此用作分析哈希传递攻击的额外指标,但我们不建议使用工作站名称作为检测指标。源网络IP地址可以用来跟踪是哪个IP执行了哈希传递攻击,可以用于进一步的攻击溯源调查。

保护 SQL 身份验证的凭据

如果必须使用 SQL
身份验证,请确保凭据不以明文形式通过网络发送,并确保加密包含凭据的数据库连接字符串。

要使 SQL Server
能够自动加密通过网络发送的凭据,请在数据库服务器上安装服务器证书。也可以在
Web 服务器和数据库服务器之间使用 IPSec
加密通道,来确保进出数据库服务器的所有通信的安全。要确保连接字符串的安全,请使用
DPAPI。有关详细信息,请参阅本模块后面配置管理部分中的“确保连接字符串的安全”。

用于穿透网络边界的Web应用漏洞

太阳娱乐 21

使用最小特权帐户进行连接

应用程序应该通过使用最小特权帐户连接到数据库。如果您使用 Windows
身份验证进行连接,则从操作系统的角度看,Windows
帐户应该是最小特权帐户,而且该帐户应该具有有限的特权和对 Windows
资源的有限的访问能力。另外,无论您使用 Windows 身份验证还是 SQL
身份验证,相应的 SQL Server 登录都应该受到数据库中的权限的限制。

有关如何创建最小特权数据库帐户以及使用 Windows 身份验证将 ASP.NET Web
应用程序连接到远程数据库的选项的详细信息,请参阅模块 19 确保 ASP.NET
应用程序和 Web 服务的安全中的“数据访问”。

太阳娱乐 22返回页首

太阳娱乐 23

接下来,我们看到登录过程是NtLmSsp,密钥长度为0.这些对于检测哈希传递非常的重要。

授权

如果用户能够检索和操纵特定的数据,就会建立授权过程。有两种方法:数据访问代码可以使用授权来确定是否执行请求的操作,数据库可以通过执行授权来限制应用程序所使用的
SQL 登录的功能。

在授权不足的情况下,用户也许能够看到另一个用户的数据,未授权的用户也许能够访问受限制的数据。要去除这些威胁:

限制未授权的调用方。

限制未授权的代码。

限制数据库中的应用程序。

图 14.3 概述了应该使用的授权点和技术。

太阳娱乐 24

图 14.3
数据访问授权、程序集和数据库

注意数据访问代码如何按照权限需求为调用用户或调用代码授权。代码标识需求是
.NET 代码访问安全性的一个特性。

要为数据库中的应用程序授权,请使用只具有执行选定存储过程权限的最小特权
SQL
服务器登录。除非有特殊理由,否则不应为应用程序授予如下权限:直接针对任何表执行创建、检索、更新、破坏/删除
(CRUD) 操作。

注意
存储过程在数据库系统的安全上下文中运行。尽管您可以通过为应用程序分配对特定存储过程的权限来限制它的逻辑操作,但不能限制存储过程所执行的操作的结果。存储过程是受信任代码。必须使用数据库权限来确保存储过程的接口安全。

利用Web应用漏洞和可公开访问的管理接口获取内网访问权限的示例

太阳娱乐 25

限制未授权的调用方

您的代码在连接到数据库之前必须基于角色或标识为用户授权。角色检查通常用在应用程序的业务逻辑中,但是,如果您不能清楚地区分业务逻辑和数据访问逻辑,请对数据库访问方法使用主体权限需求。

以下属性确保只有作为 Manager 角色成员的用户才能调用
DisplayCustomerInfo 方法:

[PrincipalPermissionAttribute(SecurityAction.Demand, Role="Manager")]
public void DisplayCustomerInfo(int CustId)
{
}

如果需要其他授权粒度,并且需要在数据访问方法内部执行基于角色的逻辑,请使用命令性主体权限需求或显式的角色检查,如下面的代码片断所示:

using System.Security;
using System.Security.Permissions;
public void DisplayCustomerInfo(int CustId)
{
try
{
// 用来验证调用方是 manager 的命令性主体权限
// 角色检查
PrincipalPermission principalPerm = new PrincipalPermission(
null, "Manager");
// 仅在调用方是“Manager”角色的成员时才执行
// 随后的代码
}
catch( SecurityException ex )
{
. . .
}
}

下面的代码片断使用显式的程序设计角色检查来确保调用方是 Manager
角色的成员:

public void DisplayCustomerInfo(int CustId)
{
if(!Thread.CurrentPrincipal.IsInRole("Manager"))
{
. . .
}
}

太阳娱乐 26

接下来我们看到登录类型是3(通过网络远程登录)。

限制未授权的代码

通过使用 .NET Framework
代码访问安全性(特别是代码标识需求),可以限制能够访问数据访问类和方法的程序集。

例如,如果您只希望由公司或特定开发组织编写的代码能够使用您的数据访问组件,请使用
StrongNameIdentityPermission
,并要求调用程序集具有一个带有指定公钥的强名称,如下面的代码片断所示:

using System.Security.Permissions;
. . .
[StrongNameIdentityPermission(SecurityAction.LinkDemand,
PublicKey="002...4c6")]
public void GetCustomerInfo(int CustId)
{
}

要提取给定程序集的公钥的文本表示形式,请使用下面的命令:

sn -Tp assembly.dll

注意–Tp 开关中使用大写的“T”。

因为 Web
应用程序的程序集是动态编译的,所以对于这些程序集不能使用强名称。这使得很难将数据访问程序集的使用限制在特定的
Web
应用程序上。最佳方法是开发一个自定义权限,并要求该权限来自数据访问组件。完全信任
Web
应用程序(或任何完全受信任代码)可以调用您的组件。但是,部分信任代码只有在被授予了自定义权限之后,才能调用您的数据访问组件。

有关自定义权限的示例实现,请参阅本指南“如何”部分中的如何:创建自定义加密权限。

第一步

太阳娱乐 27

限制数据库中的应用程序

首选方法是为应用程序用来连接到数据库的 Windows 帐户创建一个 SQL Server
登录权限,然后将 SQL Server
登录映射到数据库中的某个数据库用户。将该数据库用户放在用户定义的数据库角色中,并授予该角色相应的权限。理想情况下,应该只为该角色授予对应用程序所使用的存储过程的执行访问权限。

有关如何配置此方法的详细信息,请参阅模块 19 确保 ASP.NET 应用程序和 Web
服务的安全中的“为 ASP.NET 应用程序配置数据访问权限”。

太阳娱乐 28返回页首

利用SQL注入漏洞绕过Web应用的身份验证

最后,我们看到这是一个基于帐户域和名称的本地帐户。

配置管理

数据库连接字符串是针对数据访问代码主要考虑的配置管理问题。应认真考虑这些字符串的存储位置以及如何保护它们(特别是当它们包括凭据时)。要提高加密管理安全性:

使用 Windows 身份验证。

确保连接字符串的安全。

使用受限制的 ACL 确保 UDL 文件的安全。

第二步

总而言之,有许多方法可以检测环境中的哈希传递攻击行为。这个在小型和大型网络中都是有效的,并且基于不同的哈希传递的攻击方式都是非常可靠的。它可能需要根据你的网络环境进行调整,但在减少误报和攻击过程中溯源却是非常简单的。

使用 Window 身份验证

使用 Windows
身份验证时,系统会为您管理凭据,而且凭据不会通过网络传输。还可以避免将用户名和密码嵌入到连接字符串中。

利用敏感信息泄露漏洞获取Web应用中的用户密码哈希

哈希传递仍然广泛的用于网络攻击并且是大多数企业和组织的一个共同的安全问题。有许多方法可以禁止和降低哈希传递的危害,但是并不是所有的企业和组织都可以有效地实现这一点。所以,最好的选择就是如何去检测这种攻击行为。

确保连接字符串的安全

如果您需要使用 SQL
身份验证,连接字符串中将包含用户名和密码。如果攻击者利用 Web
服务器上的源代码泄漏这一漏洞或设法登录到该服务器,则攻击者可以检索连接字符串。同样,能够合法登录到该服务器的任何用户都可以查看它们。使用加密机制确保连接字符串的安全。

第三步

【编辑推荐】

加密连接字符串

使用 DPAPI 加密连接字符串。使用 DPAPI
加密时,由于加密密钥由平台进行管理,并且绑定到特定的计算机或 Windows
用户帐户,因此可避免出现加密密钥管理问题。要使用 DPAPI,必须通过
P/Invoke 调用 Win32 DPAPI 函数。

有关如何构建托管包装类的详细信息,请参阅“Microsoft patterns &
practices
Volume I, Building Secure ASP.NET Web Applications:
Authentication, Authorization, and Secure Communication”的“How
To”部分中的“How To: Create a DPAPI
Library”,其网址为:(英文)。

离线密码猜测攻击。可能利用的漏洞:弱密码

安全地存储加密的连接字符串

加密的连接字符串可以放在注册表中,也可以放在 Web.config 或
Machine.config 文件中。如果您使用 HKEY_LOCAL_MACHINE
下的注册表项,请将下面的 ACL 应用于该项:

管理员:完全控制
进程帐户:读取

注意 该进程帐户由运行数据访问程序集的进程来确定。这通常是 ASP.NET
进程,或者当您的解决方案使用企业服务中间层时,该进程是企业服务服务器进程。

还可以考虑使用
HKEY_CURRENT_USER,该注册表项提供受限制的访问。有关详细信息,请参阅模块
7 构建安全的程序集中的“注册表”部分。

注意 如果您使用 Microsoft Visual Studio® .NET
数据库连接向导,连接字符串将以明文属性值形式存储在 Web
应用程序代码隐藏文件或 Web.config 文件中。这两种方法都应该避免使用。

为了更容易部署,您可能希望将加密的字符串存储在 Web.config
中,尽管这可能不如使用受限制的注册表项安全。在本例中,将使用如下所示的自定义
<appSettings> 名称-值对:

<configuration>
<appSettings>
<add key="connectionString" value="AQA..bIE=" />
</appSettings>
<system.web>
...
</system.web>
</configuration>

要从 <appSettings> 元素访问密码文本,请使用如下所示的
ConfigurationSettings 类:

using System.Configuration;
private static string GetConnectionString()
{
return ConfigurationSettings.AppSettings["connectionString"];
}

第四步

不要将 Persist Security Info 设置为“True”或“Yes”

如果在连接字符串中包括 Persist Security Info 属性,将导致
ConnectionString
属性在密码返回给用户之前,将密码从连接字符串中去除。在建立与数据库的连接之后,默认设置
false(等同于忽略 Persist Security Info 属性)会丢弃该信息。

利用获取的凭据,通过XML外部实体漏洞(针对授权用户)读取文件

使用受限制的 ACL 确保 UDL 文件的安全

如果您的应用程序结合使用外部通用数据链接 (UDL) 文件和面向 OLE DB 的
ADO.NET 托管数据提供程序,请使用 NTFS 权限来限制访问。使用以下受限制的
ACL:

管理员:完全控制
进程帐户:读取

注意 UDL 文件未进行加密。一个更安全的方法是,使用 DPAPI
加密连接字符串,并将其存储在受限制的注册表项中。

第五步

针对获取到的用户名发起在线密码猜测攻击。可能利用的漏洞:弱密码,可公开访问的远程管理接口

第六步

在系统中添加su命令的别名,以记录输入的密码。该命令要求用户输入特权账户的密码。这样,管理员在输入密码时就会被截获。

第七步

获取企业内网的访问权限。可能利用的漏洞:不安全的网络拓扑

利用管理接口发起的攻击

虽然“对管理接口的网络访问不受限制”不是一个漏洞,而是一个配置上的失误,但在2017年的渗透测试中它被一半的攻击向量所利用。57%的目标企业可以通过管理接口获取对信息资源的访问权限。

通过管理接口获取访问权限通常利用了以下方式获得的密码:

利用目标主机的其它漏洞(27.5%)。例如,攻击者可利用Web应用中的任意文件读取漏洞从Web应用的配置文件中获取明文密码。

使用Web应用、CMS系统、网络设备等的默认凭据(27.5%)。攻击者可以在相应的文档中找到所需的默认账户凭据。

发起在线密码猜测攻击(18%)。当没有针对此类攻击的防护措施/工具时,攻击者通过猜测来获得密码的机会将大大增加。

从其它受感染的主机获取的凭据(18%)。在多个系统上使用相同的密码扩大了潜在的攻击面。

在利用管理接口获取访问权限时利用过时软件中的已知漏洞是最不常见的情况。

太阳娱乐 29

利用管理接口获取访问权限

太阳娱乐 30

通过何种方式获取管理接口的访问权限

太阳娱乐 31

管理接口类型

太阳娱乐 32

建议:

定期检查所有系统,包括Web应用、内容管理系统(CMS)和网络设备,以查看是否使用了任何默认凭据。为管理员帐户设置强密码。在不同的系统中使用不同的帐户。将软件升级至最新版本。

大多数情况下,企业往往忘记禁用Web远程管理接口和SSH服务的网络访问。大多数Web管理接口是Web应用或CMS的管理控制面板。访问这些管理控制面板通常不仅可以获得对Web应用的完整控制权,还可以获得操作系统的访问权。获得对Web应用管理控制面板的访问权限后,可以通过任意文件上传功能或编辑Web应用的页面来获取执行操作系统命令的权限。在某些情况下,命令行解释程序是Web应用管理控制面板中的内置功能。

建议:

严格限制对所有管理接口(包括Web接口)的网络访问。只允许从有限数量的IP地址进行访问。在远程访问时使用VPN。

利用管理接口发起攻击的示例

第一步 检测到一个只读权限的默认社区字符串的SNMP服务

第二步

通过SNMP协议检测到一个过时的、易受攻击的思科IOS版本。漏洞:cisco-sa-20170629-snmp(
.
com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20170629-snmp)。

该漏洞允许攻击者通过只读的SNMP社区字符串进行提权,获取设备的完全访问权限。利用思科发布的公开漏洞信息,卡巴斯基专家Artem
Kondratenko开发了一个用来演示攻击的漏洞利用程序(
第三步
利用ADSL-LINE-MIB中的一个漏洞以及路由器的完全访问权限,我们可以获得客户的内网资源的访问权限。完整的技术细节请参考
最常见漏洞和安全缺陷的统计信息

最常见的漏洞和安全缺陷

太阳娱乐 33

针对内部入侵者的安全评估

我们将企业的安全等级划分为以下评级:

非常低

中等偏下

中等偏上

我们通过卡巴斯基实验室的自有方法进行总体的安全等级评估,该方法考虑了测试期间获得的访问级别、信息资源的优先级、获取访问权限的难度以及花费的时间等因素。安全级别为非常低对应于我们能够获得客户内网的完全控制权的情况(例如,获得内网的最高权限,获得关键业务系统的完全控制权限以及获取关键的信息)。此外,获得这种访问权限不需要特殊的技能或大量的时间。

安全级别为高对应于在渗透测试中只能发现无关紧要的漏洞(不会对公司带来风险)的情况。

在存在域基础设施的所有项目中,有86%可以获得活动目录域的最高权限(例如域管理员或企业管理员权限)。在64%的企业中,可以获得最高权限的攻击向量超过了一个。在每一个项目中,平均有2-3个可以获得最高权限的攻击向量。这里只统计了在内部渗透测试期间实践过的那些攻击向量。对于大多数项目,我们还通过bloodhound等专有工具发现了大量其它的潜在攻击向量。

太阳娱乐 34

太阳娱乐 35

太阳娱乐 36

这些我们实践过的攻击向量在复杂性和实践步骤数(从2步到6步)方面各不相同。平均而言,在每个企业中获取域管理员权限需要3个步骤。

获取域管理员权限的最简单攻击向量的示例:

攻击者通过NBNS欺骗攻击和NTLM中继攻击拦截管理员的NetNTLM哈希,并利用该哈希在域控制器上进行身份验证;

利用HP Data
Protector中的漏洞CVE-2011-0923,然后从lsass.exe进程的内存中提取域管理员的密码

获取域管理员权限的最小步骤数

太阳娱乐 37

下图描述了利用以下漏洞获取域管理员权限的更复杂攻击向量的一个示例:

使用包含已知漏洞的过时版本的网络设备固件

使用弱密码

在多个系统和用户中重复使用密码

使用NBNS协议

SPN账户的权限过多

获取域管理员权限的示例

太阳娱乐 38

第一步

利用D-Link网络存储的Web服务中的漏洞。该漏洞允许以超级用户的权限执行任意代码。创建SSH隧道以访问管理网络(直接访问受到防火墙规则的限制)。

漏洞:过时的软件(D-link)

第二步

检测到思科交换机和一个可用的SNMP服务以及默认的社区字符串“Public”。思科IOS的版本是通过SNMP协议识别的。

漏洞:默认的SNMP社区字符串

第三步

利用思科IOS的版本信息来发现漏洞。利用漏洞CVE-2017-3881获取具有最高权限的命令解释器的访问权。

漏洞:过时的软件(思科)

第四步

提取本地用户的哈希密码

第五步

离线密码猜测攻击。

漏洞:特权用户弱密码

第六步

NBNS欺骗攻击。拦截NetNTLMv2哈希。

漏洞:使用NBNS协议

第七步

对NetNTLMv2哈希进行离线密码猜测攻击。

漏洞:弱密码

第八步

使用域帐户执行Kerberoasting攻击。获得SPN帐户的TGS票证

第九步

从思科交换机获取的本地用户帐户的密码与SPN帐户的密码相同。

漏洞:密码重用,账户权限过多

关于漏洞CVE-2017-3881(思科IOS中的远程代码执行漏洞)

在CIA文件Vault
7:CIA中发现了对此漏洞的引用,该文档于2017年3月在维基解密上发布。该漏洞的代号为ROCEM,文档中几乎没有对其技术细节的描述。之后,该漏洞被分配编号CVE-2017-3881和cisco-sa-20170317-cmp。

该漏洞允许未经授权的攻击者通过Telnet协议以最高权限在思科IOS中执行任意代码。在CIA文档中只描述了与开发漏洞利用程序所需的测试过程相关的一些细节;
但没有提供实际漏洞利用的源代码。尽管如此,卡巴斯基实验室的专家Artem
Kondratenko利用现有的信息进行实验研究重现了这一高危漏洞的利用代码。

关于此漏洞利用的开发过程的更多信息,请访问 ,

最常用的攻击技术

通过分析用于在活动目录域中获取最高权限的攻击技术,我们发现:

用于在活动目录域中获取最高权限的不同攻击技术在目标企业中的占比

太阳娱乐 39

NBNS/LLMNR欺骗攻击

太阳娱乐 40

我们发现87%的目标企业使用了NBNS和LLMNR协议。67%的目标企业可通过NBNS/LLMNR欺骗攻击获取活动目录域的最大权限。该攻击可拦截用户的数据,包括用户的NetNTLMv2哈希,并利用此哈希发起密码猜测攻击。

安全建议:

建议禁用NBNS和LLMNR协议

检测建议:

一种可能的解决方案是通过蜜罐以不存在的计算机名称来广播NBNS/LLMNR请求,如果收到了响应,则证明网络中存在攻击者。示例:

如果可以访问整个网络流量的备份,则应该监测那些发出多个LLMNR/NBNS响应(针对不同的计算机名称发出响应)的单个IP地址。

NTLM中继攻击

太阳娱乐 41

在NBNS/LLMNR
欺骗攻击成功的情况下,一半的被截获的NetNTLMv2哈希被用于进行NTLM中继攻击。如果在NBNS/LLMNR
欺骗攻击期间拦截了域管理员帐户的NetNTLMv2哈希,则可通过NTLM中继攻击快速获得活动目录的最高权限。

42%的目标企业可利用NTLM中继攻击(结合NBNS/LLMNR欺骗攻击)获取活动目录域的最高权限。47%的目标企业无法抵御此类攻击。

安全建议:

防护该攻击的最有效方法是阻止通过NTLM协议的身份验证。但该方法的缺点是难以实现。

身份验证扩展协议(EPA)可用于防止NTLM中继攻击。

另一种保护机制是在组策略设置中启用SMB协议签名。请注意,此方法仅可防止针对SMB协议的NTLM中继攻击。

检测建议:

此类攻击的典型踪迹是网络登录事件(事件ID4624,登录类型为3),其中“源网络地址”字段中的IP地址与源主机名称“工作站名称”不匹配。这种情况下,需要一个主机名与IP地址的映射表(可以使用DNS集成)。

或者,可以通过监测来自非典型IP地址的网络登录来识别这种攻击。对于每一个网络主机,应收集最常执行系统登录的IP地址的统计信息。来自非典型IP地址的网络登录可能意味着攻击行为。这种方法的缺点是会产生大量误报。

利用过时软件中的已知漏洞

太阳娱乐 42

过时软件中的已知漏洞占我们实施的攻击向量的三分之一。

大多数被利用的漏洞都是2017年发现的:

思科IOS中的远程代码执行漏洞(CVE-2017-3881)

VMware vCenter中的远程代码执行漏洞(CVE-2017-5638)

Samba中的远程代码执行漏洞(CVE-2017-7494 – Samba Cry)

Windows SMB中的远程代码执行漏洞(MS17-010)

大多数漏洞的利用代码已公开(例如MS17-010、Samba Cry、VMwarevCenter
CVE-2017-5638),使得利用这些漏洞变得更加容易

常见的内部网络攻击是利用Java RMI网络服务中的远程代码执行漏洞和Apache
Common
Collections(ACC)库(这些库被应用于多种产品,例如思科局域网管理解决方案)中的Java反序列化漏洞实施的。反序列化攻击对许多大型企业的软件都有效,可以在企业基础设施的关键服务器上快速获取最高权限。

Windows中的最新漏洞已被用于远程代码执行(MS17-010
永恒之蓝)和系统中的本地权限提升(MS16-075
烂土豆)。在相关漏洞信息被公开后,全部企业的60%以及接受渗透测试的企业的75%都存在MS17-010漏洞。应当指出的是,该漏洞不仅在2017年第一季度末和第二季度在这些企业中被发现(此时检测到该漏洞并不令人惊讶,因为漏洞补丁刚刚发布),而且在2017年第四季度在这些企业中被检测到。这意味着更新/漏洞管理措施并没有起到作用,并且存在被WannaCry等恶意软件感染的风险。

安全建议:

监控软件中被公开披露的新漏洞。及时更新软件。使用包含IDS/IPS模块的终端保护解决方案。

检测建议:

以下事件可能意味着软件漏洞利用的攻击尝试,需要进行重点监测:

触发终端保护解决方案中的IDS/IPS模块;

服务器应用进程大量生成非典型进程(例如Apache服务器启动bash进程或MS
SQL启动PowerShell进程)。为了监测这种事件,应该从终端节点收集进程启动事件,这些事件应当包含被启动进程及其父进程的信息。这些事件可从以下软件收集得到:收费软件EDR解决方案、免费软件Sysmon或Windows10/Windows
2016中的标准日志审计功能。从Windows 10/Windows
2016开始,4688事件(创建新进程)包含了父进程的相关信息。

客户端和服务器软件的不正常关闭是典型的漏洞利用指标。请注意这种方法的缺点是会产生大量误报。

在线密码猜测攻击

太阳娱乐 43

在线密码猜测攻击最常被用于获得Windows用户帐户和Web应用管理员帐户的访问权限。

密码策略允许用户选择可预测且易于猜测的密码。此类密码包括:p@SSword1,
123等。

使用默认密码和密码重用有助于成功地对管理接口进行密码猜测攻击。

安全建议:

为所有用户帐户实施严格的密码策略(包括用户帐户、服务帐户、Web应用和网络设备的管理员帐户等)。

提高用户的密码保护意识:选择复杂的密码,为不同的系统和帐户使用不同的密码。

对包括Web应用、CMS和网络设备在内的所有系统进行审计,以检查是否使用了任何默认帐户。

检测建议:

要检测针对Windows帐户的密码猜测攻击,应注意:

终端主机上的大量4625事件(暴力破解本地和域帐户时会发生此类事件)

域控制器上的大量4771事件(通过Kerberos攻击暴力破解域帐户时会发生此类事件)

域控制器上的大量4776事件(通过NTLM攻击暴力破解域帐户时会发生此类事件)

离线密码猜测攻击

太阳娱乐 44

离线密码猜测攻击常被用于:

破解从SAM文件中提取的NTLM哈希

破解通过NBNS/LLMNR欺骗攻击拦截的NetNTLMv2哈希

Kerberoasting攻击(见下文)

破解从其它系统上获取的哈希

Kerberoasting攻击

太阳娱乐 45

Kerberoasting攻击是针对SPN(服务主体名称)帐户密码的离线暴力破解攻击,其Kerberos
TGS服务票证是加密的。要发起此类攻击,只需要有域用户的权限。如果SPN帐户具有域管理员权限并且其密码被成功破解,则攻击者获得了活动目录域的最高权限。在20%的目标企业中,SPN帐户存在弱密码。在13%的企业中(或在17%的获得域管理员权限的企业中),可通过Kerberoasting攻击获得域管理员的权限。

安全建议:

为SPN帐户设置复杂密码(不少于20个字符)。

遵循服务帐户的最小权限原则。

检测建议:

监测通过RC4加密的TGS服务票证的请求(Windows安全日志的记录是事件4769,类型为0×17)。短期内大量的针对不同SPN的TGS票证请求是攻击正在发生的指标。

卡巴斯基实验室的专家还利用了Windows网络的许多特性来进行横向移动和发起进一步的攻击。这些特性本身不是漏洞,但却创造了很多机会。最常使用的特性包括:从lsass.exe进程的内存中提取用户的哈希密码、实施hash传递攻击以及从SAM数据库中提取哈希值。

使用此技术的攻击向量的占比

太阳娱乐 46

从 lsass.exe进程的内存中提取凭据

太阳娱乐 47

由于Windows系统中单点登录(SSO)的实现较弱,因此可以获得用户的密码:某些子系统使用可逆编码将密码存储在操作系统内存中。因此,操作系统的特权用户能够访问所有登录用户的凭据。

安全建议:

在所有系统中遵循最小权限原则。此外,建议尽可能避免在域环境中重复使用本地管理员帐户。针对特权账户遵循微软层级模型以降低入侵风险。

使用Credential Guard机制(该安全机制存在于Windows 10/Windows Server
2016中)

使用身份验证策略(Authentication Policies)和Authentication Policy
Silos

禁用网络登录(本地管理员帐户或者本地管理员组的账户和成员)。(本地管理员组存在于Windows
8.1/ Windows Server2012R2以及安装了KB2871997更新的Windows 7/Windows
8/Windows Server2008R2中)

使用“受限管理模式RDP”而不是普通的RDP。应该注意的是,该措施可以减少明文密码泄露的风险,但增加了通过散列值建立未授权RDP连接(Hash传递攻击)的风险。只有在采取了综合防护措施以及能够阻止Hash传递攻击时,才推荐采用此方法。

将特权账户置于受保护的用户组,该组中的成员只能通过Kerberos协议登录。(Microsoft网站上提供了该组的所有保护机制的列表)

启用LSA保护,以阻止通过未受保护的进程来读取内存和进行代码注入。这为LSA存储和管理的凭据提供了额外的安全防护。

禁用内存中的WDigest存储或者完全禁用WDigest身份验证机制(适用于Windows8.1
/ Windows Server 2012 R2或安装了KB2871997更新的Windows7/Windows Server
2008系统)。

在域策略配置中禁用SeDebugPrivilege权限

禁用自动重新登录(ARSO)功能

使用特权帐户进行远程访问(包括通过RDP)时,请确保每次终止会话时都注销。

在GPO中配置RDP会话终止:计算机配置策略管理模板
Windows组件远程桌面服务远程桌面会话主机会话时间限制。

启用SACL以对尝试访问lsass.exe的进程进行登记管理

使用防病毒软件。

此措施列表不能保证完全的安全。但是,它可被用于检测网络攻击以及降低攻击成功的风险(包括自动执行的恶意软件攻击,如NotPetya/ExPetr)。

检测建议:

检测从lsass.exe进程的内存中提取密码攻击的方法根据攻击者使用的技术而有很大差异,这些内容不在本出版物的讨论范围之内。更多信息请访问

我们还建议您特别注意使用PowerShell(Invoke-Mimikatz)凭据提取攻击的检测方法。

Hash传递攻击

太阳娱乐 48

在此类攻击中,从SAM存储或lsass.exe进程内存中获取的NTLM哈希被用于在远程资源上进行身份验证(而不是使用帐户密码)。

这种攻击成功地在25%的攻击向量中应用,影响了28%的目标企业。

安全建议:

防止此类攻击的最有效方法是禁止在网络中使用NTLM协议。

使用LAPS(本地管理员密码解决方案)来管理本地管理员密码。

禁用网络登录(本地管理员帐户或者本地管理员组的账户和成员)。(本地管理员组存在于Windows
8.1/ Windows Server2012R2以及安装了KB2871997更新的Windows 7/Windows
8/Windows Server2008R2中)

在所有系统中遵循最小权限原则。针对特权账户遵循微软层级模型以降低入侵风险。

检测建议:

在对特权账户的使用具有严格限制的分段网络中,可以最有效地检测此类攻击。

建议制作可能遭到攻击的账户的列表。该列表不仅应包括高权限帐户,还应包括可用于访问组织关键资源的所有帐户。

在开发哈希传递攻击的检测策略时,请注意与以下相关的非典型网络登录事件:

源IP地址和目标资源的IP地址

登录时间(工作时间、假期)

此外,还要注意与以下相关的非典型事件:

帐户(创建帐户、更改帐户设置或尝试使用禁用的身份验证方法);

同时使用多个帐户(尝试从同一台计算机登录到不同的帐户,使用不同的帐户进行VPN连接以及访问资源)。

哈希传递攻击中使用的许多工具都会随机生成工作站名称。这可以通过工作站名称是随机字符组合的4624事件来检测。

从SAM中提取本地用户凭据

太阳娱乐 49

从Windows
SAM存储中提取的本地帐户NTLM哈希值可用于离线密码猜测攻击或哈希传递攻击。

检测建议:

检测从SAM提取登录凭据的攻击取决于攻击者使用的方法:直接访问逻辑卷、Shadow
Copy、reg.exe,远程注册表等。

有关检测凭据提取攻击的详细信息,请访问

最常见漏洞和安全缺陷的统计信息

最常见的漏洞和安全缺陷

太阳娱乐 50

在所有的目标企业中,都发现网络流量过滤措施不足的问题。管理接口(SSH、Telnet、SNMP以及Web应用的管理接口)和DBMS访问接口都可以通过用户段进行访问。在不同帐户中使用弱密码和密码重用使得密码猜测攻击变得更加容易。

当一个应用程序账户在操作系统中具有过多的权限时,利用该应用程序中的漏洞可能在主机上获得最高权限,这使得后续攻击变得更加容易。

Web应用安全评估

以下统计数据包括全球范围内的企业安全评估结果。所有Web应用中有52%与电子商务有关。

根据2017年的分析,政府机构的Web应用是最脆弱的,在所有的Web应用中都发现了高风险的漏洞。在商业Web应用中,高风险漏洞的比例最低,为26%。“其它”类别仅包含一个Web应用,因此在计算经济成分分布的统计数据时没有考虑此类别。

Web应用的经济成分分布

太阳娱乐 51

Web应用的风险级别分布

太阳娱乐 52

对于每一个Web应用,其整体风险级别是基于检测到的漏洞的最大风险级别而设定的。电子商务行业中的Web应用最为安全:只有28%的Web应用被发现存在高风险的漏洞,而36%的Web应用最多存在中等风险的漏洞。

高风险Web应用的比例

太阳娱乐 53

如果我们查看每个Web应用的平均漏洞数量,那么经济成分的排名保持不变:政府机构的Web应用中的平均漏洞数量最高;金融行业其次,最后是电子商务行业。

每个Web应用的平均漏洞数

太阳娱乐 54

2017年,被发现次数最多的高风险漏洞是:

敏感数据暴露漏洞(根据OWASP分类标准),包括Web应用的源码暴露、配置文件暴露以及日志文件暴露等。

未经验证的重定向和转发(根据OWASP分类标准)。此类漏洞的风险级别通常为中等,并常被用于进行网络钓鱼攻击或分发恶意软件。2017年,卡巴斯基实验室专家遇到了该漏洞类型的一个更加危险的版本。这个漏洞存在于Java应用中,允许攻击者实施路径遍历攻击并读取服务器上的各种文件。尤其是,攻击者可以以明文形式访问有关用户及其密码的详细信息。

使用字典中的凭据(该漏洞在OWASP分类标准的身份验证破坏类别下)。该漏洞常在在线密码猜测攻击、离线密码猜测攻击(已知哈希值)以及对Web应用的源码进行分析的过程中发现。

在所有经济成分的Web应用中,都发现了敏感数据暴露漏洞(内部IP地址和数据库访问端口、密码、系统备份等)和使用字典中的凭据漏洞。

敏感数据暴露

太阳娱乐 55

未经验证的重定向和转发

太阳娱乐 56

使用字典中的凭据

太阳娱乐 57

漏洞分析

2017年,我们发现的高风险、中等风险和低风险漏洞的数量大致相同。但是,如果查看Web应用的整体风险级别,我们会发现超过一半(56%)的Web应用包含高风险漏洞。对于每一个Web应用,其整体风险级别是基于检测到的漏洞的最大风险级别而设定的。

超过一半的漏洞都是由Web应用源代码中的错误引起的。其中最常见的漏洞是跨站脚本漏洞(XSS)。44%的漏洞是由配置错误引起的。配置错误导致的最多的漏洞是敏感数据暴露漏洞。

对漏洞的分析表明,大多数漏洞都与Web应用的服务器端有关。其中,最常见的漏洞是敏感数据暴露、SQL注入和功能级访问控制缺失。28%的漏洞与客户端有关,其中一半以上是跨站脚本漏洞(XSS)。

漏洞风险级别的分布

太阳娱乐 58

Web应用风险级别的分布

太阳娱乐 59

不同类型漏洞的比例

太阳娱乐 60

服务器端和客户端漏洞的比例

太阳娱乐 61

漏洞总数统计

本节提供了漏洞的总体统计信息。应该注意的是,在某些Web应用中发现了相同类型的多个漏洞。

10种最常见的漏洞类型

太阳娱乐 62

20%的漏洞是跨站脚本类型的漏洞。攻击者可以利用此漏洞获取用户的身份验证数据(cookie)、实施钓鱼攻击或分发恶意软件。

敏感数据暴露
-一种高风险漏洞,是第二大常见漏洞。它允许攻击者通过调试脚本、日志文件等访问Web应用的敏感数据或用户信息。

SQL注入 –
第三大常见的漏洞类型。它涉及到将用户的输入数据注入SQL语句。如果数据验证不充分,攻击者可能会更改发送到SQL
Server的请求的逻辑,从而从Web服务器获取任意数据(以Web应用的权限)。

很多Web应用中存在功能级访问控制缺失漏洞。它意味着用户可以访问其角色不被允许访问的应用程序脚本和文件。例如,一个Web应用中如果未授权的用户可以访问其监控页面,则可能会导致会话劫持、敏感信息暴露或服务故障等问题。

其它类型的漏洞都差不多,几乎每一种都占4%:

用户使用字典中的凭据。通过密码猜测攻击,攻击者可以访问易受攻击的系统。

未经验证的重定向和转发(未经验证的转发)允许远程攻击者将用户重定向到任意网站并发起网络钓鱼攻击或分发恶意软件。在某些案例中,此漏洞还可用于访问敏感信息。

远程代码执行允许攻击者在目标系统或目标进程中执行任何命令。这通常涉及到获得对Web应用源代码、配置、数据库的完全访问权限以及进一步攻击网络的机会。

如果没有针对密码猜测攻击的可靠保护措施,并且用户使用了字典中的用户名和密码,则攻击者可以获得目标用户的权限来访问系统。

许多Web应用使用HTTP协议传输数据。在成功实施中间人攻击后,攻击者将可以访问敏感数据。尤其是,如果拦截到管理员的凭据,则攻击者将可以完全控制相关主机。

文件系统中的完整路径泄露漏洞(Web目录或系统的其他对象)使其他类型的攻击更加容易,例如,任意文件上传、本地文件包含以及任意文件读取。

Web应用统计

本节提供有关Web应用中漏洞出现频率的信息(下图表示了每种特定类型漏洞的Web应用的比例)。

最常见漏洞的Web应用比例

太阳娱乐 63

改进Web应用安全性的建议

建议采取以下措施来降低与上述漏洞相关的风险:

检查来自用户的所有数据。

限制对管理接口、敏感数据和目录的访问。

遵循最小权限原则,确保用户拥有所需的最低权限集。

必须对密码最小长度、复杂性和密码更改频率强制进行要求。应该消除使用凭据字典组合的可能性。

应及时安装软件及其组件的更新。

使用入侵检测工具。考虑使用WAF。确保所有预防性保护工具都已安装并正常运行。

实施安全软件开发生命周期(SSDL)。

定期检查以评估IT基础设施的网络安全性,包括Web应用的网络安全性。

结论

43%的目标企业对外部攻击者的整体防护水平被评估为低或非常低:即使外部攻击者没有精湛的技能或只能访问公开可用的资源,他们也能够获得对这些企业的重要信息系统的访问权限。

利用Web应用中的漏洞(例如任意文件上传(28%)和SQL注入(17%)等)渗透网络边界并获取内网访问权限是最常见的攻击向量(73%)。用于穿透网络边界的另一个常见的攻击向量是针对可公开访问的管理接口的攻击(弱密码、默认凭据以及漏洞利用)。通过限制对管理接口(包括SSH、RDP、SNMP以及web管理接口等)的访问,可以阻止约一半的攻击向量。

93%的目标企业对内部攻击者的防护水平被评估为低或非常低。此外,在64%的企业中发现了至少一个可以获得IT基础设施最高权限(如活动目录域中的企业管理权限以及网络设备和重要业务系统的完全控制权限)的攻击向量。平均而言,在每个项目中发现了2到3个可以获取最高权限的攻击向量。在每个企业中,平均只需要三个步骤即可获取域管理员的权限。

实施内网攻击常用的两种攻击技术包括NBNS欺骗和NTLM中继攻击以及利用2017年发现的漏洞的攻击,例如MS17-010
(Windows SMB)、CVE-2017-7494 (Samba)和CVE-2017-5638
(VMwarevCenter)。在永恒之蓝漏洞公布后,该漏洞(MS17-010)可在75%的目标企业的内网主机中检测到(MS17-010被广泛用于有针对性的攻击以及自动传播的恶意软件,如WannaCry和NotPetya/ExPetr等)。在86%的目标企业的网络边界以及80%的企业的内网中检测到过时的软件。

值得注意的是JavaRMI服务中的远程代码执行及许多开箱即用产品使用的Apache
Commons
Collections和其它Java库中的反序列化漏洞。2017年OWASP项目将不安全的反序列化漏洞包含进其10大web漏洞列表(OWASP
TOP
10),并排在第八位(A8-不安全的反序列化)。这个问题非常普遍,相关漏洞数量之多以至于Oracle正在考虑在Java的新版本中放弃支持内置数据序列化/反序列化的可能性1。

获取对网络设备的访问权限有助于内网攻击的成功。网络设备中的以下漏洞常被利用:

cisco-sa-20170317-cmp或CVE-2017-3881(CiscoIOS)。该漏洞允许未经授权的攻击者通过Telnet协议以最大权限访问交换机。

cisco-sa-20170629-snmp(Cisco
IOS)。该漏洞允许攻击者在知道SNMP社区字符串值(通常是字典中的值)和只读权限的情况下通过SNMP协议以最大权限访问设备。

思科智能安装功能。该功能在Cisco交换机中默认启用,不需要身份验证。因此,未经授权的攻击者可以获取和替换交换机的配置文件2。

2017年我们的Web应用安全评估表明,政府机构的Web应用最容易受到攻击(所有Web应用都包含高风险的漏洞),而电子商务企业的Web应用最不容易受到攻击(28%的Web应用包含高风险漏洞)。Web应用中最常出现以下类型的漏洞:敏感数据暴露(24%)、跨站脚本(24%)、未经验证的重定向和转发(14%)、对密码猜测攻击的保护不足(14%)和使用字典中的凭据(13%)。

为了提高安全性,建议企业特别注重Web应用的安全性,及时更新易受攻击的软件,实施密码保护措施和防火墙规则。建议对IT基础架构(包括Web应用)定期进行安全评估。完全防止信息资源泄露的任务在大型网络中变得极其困难,甚至在面临0day攻击时变得不可能。因此,确保尽早检测到信息安全事件非常重要。在攻击的早期阶段及时发现攻击活动和快速响应有助于防止或减轻攻击所造成的损害。对于已建立安全评估、漏洞管理和信息安全事件检测良好流程的成熟企业,可能需要考虑进行Red
Teaming(红队测试)类型的测试。此类测试有助于检查基础设施在面临隐匿的技艺精湛的攻击者时受到保护的情况,以及帮助训练信息安全团队识别攻击并在现实条件下进行响应。

参考来源

*本文作者:vitaminsecurity,转载请注明来自 FreeBuf.COM返回搜狐,查看更多

责任编辑:

admin

网站地图xml地图