如何通过审计安全事件日志检测密码喷洒(Password Spraying)攻击

许多渗透测试人员和攻击者通常都会使用一种被称为“密码喷洒(Password Spraying)”的技术来进行测试和攻击。对密码进行喷洒式的攻击,这个叫法很形象,因为它属于自动化密码猜测的一种。这种针对所有用户的自动密码猜测通常是为了避免帐户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率,消除帐户被锁定的概率。
攻击者首先会从他们已有的密码列表开始尝试,并以最脆弱的密码开始(“Fall2017”,“Winter2018”“123456”等)入手。
关于“密码喷洒(Password Spraying)”的概念,我是在BSidesCharm 2017的有关“如何检测难以寻找的攻击活动目录”的演讲中提到的。
当密码开始喷洒时,往往会从列表中的第一个密码开始。第一个密码用于尝试对活动目录中的每个用户进行身份验证。针对活动目录中的每个用户,攻击者都会尝试用这个密码进行登录,并且当所有用户都使用该密码进行了测试后,就会自动转到下一个密码,执行重复的测试。
由于活动目录中的每个用户的测试上限次数都会是5次,因此攻击者会为每个用户进行4个不同密码的尝试。此时msDS-LockoutObservationWindow,设置复位帐户锁定计数器为0:00:30:00(30分钟)。至于如何收集有关活动目录环境的密码策略的信息并使密码喷洒工具自动适应这些信息,对攻击者来说是小菜一碟。

上图显示了测试者是如何使用AD PowerShell cmdlet Get-ADDefaultDomainPasswordPolicy cmdlet.来显示实验室域环境的域密码策略的,应该说,这种策略在大多数情况下都适用,因为用户的密码设置,往往都非常地脆弱。比如,用户的密码通常是一些小于10位的纯数字。
由于密码喷洒通常连接到SMB共享或网络服务,因此让我先从连接到PDC的netlogon共享(\\PDC\ netlogon)开始分析,该共享在许多网络中很常见。在密码喷洒运行一段时间后,我会发现许多用户的密码,这些用户密码也可能包含特权帐户。
下图就是我自己编写的一个快速PowerShell脚本的密码喷洒:

在域控制器上针对SMB的密码喷洒会导致域控制器上的记录事件ID 4625表示为“登录失败”,并且大多数事件都会显示在记录日志中,因此发生这种情况时,应该能够检测到。

上图显示了在密码喷洒的过程中,在域控制器上的登录事件ID 4625。然而,目前许多组织还没有创建关联规则,如果在发生密码喷洒的过程中,发生登录事件ID 4625,就会发生密码喷洒。

上图显示在密码喷洒的过程中,我在实验室域环境中所记录的众多事件ID 4625。不过,还有另一种方法可以在活动目录中发现密码喷洒。由于每个用户帐户都有一个名为“Bad-Password-Time”的关联属性,该属性在使用Active Directory PowerShell cmdlet Get-ADUser时显示为“lastbadpasswordtry”。它可以显示出黑客尝试登录该帐户的最后一个错误密码的日期和时间。运行以下PowerShell cmdlet可显示活动目录域中具有与错误密码尝试相关的属性的用户。
get-aduser -filter * -prop lastbadpasswordattempt,badpwdcount | select name,lastbadpasswordattempt,badpwdcount | format-table –auto

上图显示在我实施密码喷洒后,实验室域环境中的具有lastbadpasswordattempt和badpwdcount属性的活动目录用户帐户。
你可以注意一下上面显示的PowerShell命令的结果,所有错误的密码尝试都是在同一分钟内进行的,其中大多数都是在几秒钟内,这个现象很不寻常。
由于攻击者可以通过更改他们连接的服务来避免事件ID 4625被记录,所以我并不是连接到SMB,而是连接到域控制器上的LDAP服务的。这样一来,ID 4625就可能躲过记录。

上图显示当针对LDAP进行密码喷洒时,你是发现不了事件ID 4625的。
由于目前许多网络安防组织都会通过监控事件ID 4625,来保护网络。所以为了避免被监测到,攻击者可能会连接到LDAP服务进行密码喷洒。但前提是你,他们需要将Kerberos 事件日志记录记录到事件ID 4771中,并监视“Kerberos预验证失败”。在事件ID 4771中,验证失败的话,会用代码 “0x18”表示。

上图就是显示的事件ID 4771,当根据LDAP进行密码喷洒时,就会在域控制器上启用Kerberos日志记录时记录该事件。
当攻击者在一个域连接的计算机上使用密码喷洒时,会记录到事件ID 4648(“尝试使用显式凭据登录”)。有许多4648事件显示,一个叫做Joe的用户多次尝试登录并使用“Alexis Phillips”或“Christopher Kelley”或whomever的密码,并且这些记录在几秒钟内就被记录下来。所以,这种类型的活动是不寻常的。
以下四个图显示在执行密码喷洒的工作站上记录的事件ID 4648,不过必须启用审计日志记录才能记录该事件ID。




如何对密码喷洒进行检测?
密码喷洒发生在许多活动目录环境中,并且可以通过适当的日志记录启用和有效关联来检测。
检测的主要方法包括:
1.启用适当的日志记录:
1.1域控制器:事件ID 4625的“审计登录”(成功与失败)。
1.2域控制器:事件ID 4771的“审计Kerberos验证服务”(成功与失败)。
1.3所有系统:事件ID 4648的“审计登录”(成功与失败)。
2.在1分钟内配置50 4625多个事件的警报。
3.在1分钟内为50 4771多个事件的警报的设置失败代码“0x18”。
4.在1分钟内为工作站上的100 4648多个事件配置警报。
5.根据以下命令,编写一个每天运行的PowerShell脚本并报告可能的密码喷洒:
get-aduser -filter * -prop lastbadpasswordattempt,badpwdcount | select name,lastbadpasswordattempt,badpwdcount | format-table –auto。
每个警报规则都需要根据你的运行环境进行调整,具体方法就是增加警报的数量或缩短警报的时间。
如何通过审计安全事件日志检测密码喷洒(Password Spraying)攻击的更多相关文章
- DG备库无法接受主库归档日志之密码文件
DG备库无法接受主库归档日志之密码文件 实验目的:还原某个客户案例,客户审计需要,对主库sys用户进行锁定,一小时后对sys用户进行解锁后,发现备库无法接受主库的归档日志 本篇文章,测试sys用户与D ...
- JS正则检测密码强度
今天遇到个需求,使用JS检测密码强度:密码长度最短为8,必须同时包含字母.数字.特殊符号. 代码如下: /* * 检测密码复杂度 */ function ...
- Python实现Telnet自动连接检测密码
最近在学习Python网络相关编程,这个代码实现了Telnet自动连接检测root用户密码,密码取自密码本,一个一个检测密码是否匹配,直到匹配成功,屏幕输出停止. Python内置了telnetlib ...
- 检测密码 Exercise06_18
import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:检测密码 * */ public class Exercise06_18 ...
- 《Java语言程序设计》编程练习6.18(检测密码)
6.18 (检测密码)一些网站对于密码具有一些规则.编写一个方法,检测字符串是否是一个有效密码. 假定密码规则如下: • 密码必须至少8位字符. • 密码仅能包含字母和数字. ...
- Word密码破解工具字典攻击用来干什么的
AOPR全称Advanced Office Password Recovery作为一款专业的Word密码破解工具,是通过暴力破解的方式帮助用户迅速恢复各种Word文档的密码,其中常常会用到字典攻击,这 ...
- My sql添加远程用户root密码为password
添加远程用户root密码为password grant all privileges on *.* to root@localhost identified by '123321' with gran ...
- 联想笔记本 thinkpad BIOS 超级密码 Supervisor Password 清除 破解 亲测有效 转载地址https://blog.csdn.net/ot512csdn/article/details/72571674
联想笔记本 thinkpad BIOS 超级密码 Supervisor Password 清除 破解 亲测有效 转载地址https://blog.csdn.net/ot512csdn/article/ ...
- Oracle 10g安全加固(审计、监听密码)
环境: Linux 6.4 + Oracle 10.2.0.4 1. Oracle 10g 审计功能 2. 对数据库监听器的关闭和启动设置密码 1. Oracle 10g 审计功能 Oracle 10 ...
随机推荐
- 关于v$rowcache
关于v$rowcache column parameter format a21column pct_succ_gets format 999.9column updates format 999,9 ...
- C#的抽象类和接口的区别,在什么时候使用才合适?
理解抽象类 abstract class和interface在c#语言中都是用来进行抽象类(本文 中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract cl ...
- where T : class泛型类型约束
类型参数约束,.NET支持的类型参数约束有以下五种: where T : struct | T必须是一个结构类型where T : class T必须是一个类(class)类型where T : ne ...
- iOS8模糊效果UIVisualEffectView的使用
iOS8模糊效果UIVisualEffectView的使用 效果: 源码: // // ViewController.m // EffectView // // Created by XianMing ...
- setfacl 命令的常用用法
setfacl命令----可以用来细分linux下的文件权限. chmod命令----可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限. 换句话说,set ...
- MySQL -Naivacat工具与pymysql模块
Navicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数据库. 官网下载:https ...
- 使用LR的socket协议进行进行性能测试,转解决方案
在用LR对公司delphi开发的C/S程序进行测试时,发现只有选择socket协议可以录制代码,经研究是通过TCP/IP的方式将参数保存在buffer中发送的方式来完成操作,但由于将buffer内容参 ...
- Tuple元组 、 ValueTuple 值元组详解
Tuple元组 Tuple是C# 4.0时出的新特性,.Net Framework 4.0以上版本可用. 元组是一种数据结构,具有特定数量和元素序列,与数组不同,元祖中的元素可以不同的数据类型.比如设 ...
- 好用的纯CSS加载动画-spinkit
首先放一个css spinkit <style> .loaders{ width: 100%; height: 100%; padding: 100px; box-sizing: bor ...
- 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)
注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...