如何利用自动化脚本防御远程桌面的暴力破解攻击

news2026/3/14 20:58:33
1. 从一次惊心动魄的远程登录失败说起那天下午我像往常一样准备通过远程桌面连接家里的电脑处理点工作。结果熟悉的连接界面卡了半天最后弹出一个冷冰冰的提示“登录尝试失败”。一开始我以为是自己输错了密码或者网络有点波动没太在意。但连续试了几次都失败甚至提示账户被锁定时我才意识到事情不对劲——我的电脑可能正被人“光顾”。我赶紧通过其他方式登录进去打开Windows的“事件查看器”翻到“安全”日志。好家伙满屏的红色警告事件ID 4625全是“登录失败”的记录。时间戳密密麻麻几乎每隔几秒就有一条来自全球各地不同的IP地址。这就是典型的远程桌面暴力破解攻击攻击者用自动化工具不断尝试用常见的或弱密码来“撞”开我的电脑大门。更让我后怕的是由于Windows日志有大小限制只保留最近几天的记录这意味着这种攻击可能已经持续了相当长一段时间而我浑然不觉。我的远程桌面端口默认3389因为工作需要映射到了公网这就像把自家大门钥匙孔暴露在了人来人往的大街上。虽然我早就改了端口号但这对专业的扫描工具来说不过是多花几秒钟扫描一下的事治标不治本。看着日志里那些陌生的IP我明白手动去防火墙里一个一个添加黑名单不仅效率低下而且永远跟不上攻击者更换IP的速度。我必须找到一个自动化的、一劳永逸的解决方案让脚本替我24小时站岗实时分析日志自动把那些不怀好意的IP关在防火墙之外。2. 防御基石深入理解Windows安全日志与防火墙要想自动化防御首先得知道敌人在哪里留下了脚印。对于远程桌面暴力破解所有的攻击痕迹都清晰地记录在Windows的安全日志里。我们需要的就是学会如何高效地“阅读”这些日志。2.1 精准定位事件ID 4625是关键在Windows安全日志中每一次登录尝试无论成功与否都会产生一条记录。而标识“登录失败”的正是事件ID 4625。这条日志里宝藏很多它包含了尝试登录的账户名、登录类型比如网络登录就是Type 3、以及最重要的——源网络地址Source Network Address也就是攻击者的IP地址。手动在事件查看器里筛选当然可以但我们的目标是自动化。这里PowerShell成为了绝佳的工具。它内置于Windows系统功能强大能直接与系统底层交互。用一句简单的命令我们就能提取出所有失败的登录记录Get-EventLog -LogName Security -InstanceId 4625 -Newest 100这条命令的意思是从“Security”日志里查找最近100条事件ID为4625的记录。-Newest参数可以控制获取的数量避免数据太多。更进阶一点我们可以只提取每条记录的详细信息Message字段因为IP地址就藏在这里面Get-EventLog -LogName Security -InstanceId 4625 -Newest 50 | Select-Object -ExpandProperty Message这样输出就是纯文本的日志信息方便我们后续用正则表达式把IP地址“抠”出来。我实测过一台被频繁攻击的电脑可能几分钟内就能产生上百条这样的记录手动查看根本不可能但脚本处理起来就是一瞬间的事。2.2 权力之门用netsh命令操控防火墙找到“坏人”的地址后下一步就是禁止他访问。Windows防火墙本身界面并不支持批量添加IP黑名单但通过命令行的netsh advfirewall命令我们可以实现一切。防火墙规则的核心是“谁”远程IP通过“什么方式”协议端口访问“我”本地IP时我要执行“什么动作”允许或阻止。对于防御爆破攻击我们关心的是“谁”即remoteip参数。添加一条阻止特定IP的入站规则命令结构是这样的netsh advfirewall firewall add rule nameRDP_Block_List dirin actionblock remoteip192.168.1.100,10.0.0.0/24 description自动添加的爆破IP黑名单我来拆解一下name给规则起个名字比如RDP_Block_List要唯一。dirin方向是“入站”即外部访问我。actionblock动作是“阻止”。remoteip这里就是黑名单列表了。可以支持多种格式单个IP192.168.1.100IP段CIDR格式10.0.0.0/24表示10.0.0.1到10.0.0.254范围192.168.1.100-192.168.1.200列表上述格式用英文逗号隔开即可。description写个描述方便日后管理。有添加就有删除和查询。当黑名单IP积累过多或者需要更新时我们可以先删除旧规则再添加新规则。# 查询名为“RDP_Block_List”的规则详情 netsh advfirewall firewall show rule nameRDP_Block_List # 删除这条规则 netsh advfirewall firewall delete rule nameRDP_Block_List掌握了这两项核心技能——用PowerShell抓取攻击IP用netsh命令封锁IP我们就具备了编写自动化防御脚本的全部基础能力。接下来就是让它们联动起来。3. 手把手打造自动化防御脚本PowerShell实战篇理论讲完了咱们直接上干货。我将分享一个我自用的、经过实战检验的PowerShell脚本。它逻辑清晰你可以直接复制修改也可以跟着我的思路理解每一步。3.1 脚本核心逻辑拆解整个脚本的工作流程就像是一个不知疲倦的安全哨兵循环执行以下任务巡检定期比如每5分钟检查安全日志寻找最近一段时间内的失败登录记录事件ID 4625。识别从这些记录中用正则表达式提取出所有的远程IP地址。研判对IP进行过滤。比如忽略本机IP127.0.0.1忽略内网IP如果你确定攻击不来自内网并且只将尝试次数超过一定阈值例如3次的IP判定为恶意IP。这是为了避免误封因输错密码的合法用户。行动将本次识别出的恶意IP与防火墙现有黑名单规则中的IP合并去重后形成一份最新的黑名单。更新删除旧的防火墙黑名单规则用这份最新的IP列表创建一条新规则。3.2 完整脚本代码与逐行解析下面这个脚本你可以保存为一个.ps1文件比如AutoBlockRDP.ps1然后用任务计划程序定期执行。# 自动防御远程桌面暴力破解的PowerShell脚本 # 作者一个踩过坑的安全爱好者 # 1. 定义脚本参数 $RuleName AutoBlock_RDP_Attackers # 防火墙规则名称 $LogName Security # 要查询的日志名称 $EventID 4625 # 登录失败的事件ID $FailedAttemptThreshold 3 # 失败次数阈值超过此数才封禁 $LookBackMinutes 30 # 回溯查询日志的时间分钟 # 2. 计算查询日志的时间范围查询最近30分钟内的日志 $StartTime (Get-Date).AddMinutes(-$LookBackMinutes) # 3. 从安全日志中获取失败登录事件 Write-Host [*] 正在查询最近${LookBackMinutes}分钟内的安全日志... -ForegroundColor Cyan $FailedEvents Get-WinEvent -LogName $LogName -FilterXPath *[System[EventID$EventID and TimeCreated[SystemTime$($StartTime.ToUniversalTime().ToString(o))]]] -ErrorAction SilentlyContinue if (-not $FailedEvents) { Write-Host [] 近期未发现登录失败事件一切正常。 -ForegroundColor Green exit 0 } Write-Host [!] 发现 $($FailedEvents.Count) 条登录失败记录。 -ForegroundColor Yellow # 4. 从事件详情中提取IP地址 $IPCounter {} # 用于统计每个IP的出现次数 $IPPattern \b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b # 匹配IPv4地址的正则表达式 foreach ($Event in $FailedEvents) { # 将事件XML转换为可读对象 $EventXML [xml]$Event.ToXml() # 从事件数据中提取IP地址字段位置可能因系统而异这里是常见位置 $IpAddress $EventXML.Event.EventData.Data | Where-Object { $_.Name -eq IpAddress } | Select-Object -ExpandProperty #text # 如果上述方法没提取到则从整个Message中正则匹配 if (-not $IpAddress) { if ($Event.Message -match $IPPattern) { $IpAddress $Matches[0] } } if ($IpAddress -and $IpAddress -ne 127.0.0.1 -and $IpAddress -notmatch ^192\.168\.|^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.) { # 忽略本地回环和常见内网地址可根据需要调整 if ($IPCounter.ContainsKey($IpAddress)) { $IPCounter[$IpAddress] } else { $IPCounter[$IpAddress] 1 } } } # 5. 筛选出失败次数超过阈值的IP $MaliciousIPs $IPCounter.Keys | Where-Object { $IPCounter[$_] -ge $FailedAttemptThreshold } if (-not $MaliciousIPs) { Write-Host [] 未发现达到封禁阈值($FailedAttemptThreshold次)的IP。 -ForegroundColor Green exit 0 } Write-Host [!] 发现需要处理的IP地址 -ForegroundColor Red $MaliciousIPs | ForEach-Object { Write-Host $_ (失败次数: $($IPCounter[$_])) } # 6. 获取现有防火墙规则中的IP列表用于合并 $ExistingIPs () $ExistingRule netsh advfirewall firewall show rule name$RuleName 2$null if ($ExistingRule) { # 从规则输出中解析出remoteip字段 if ($ExistingRule -match 远程 IP:\s*(.)) { $ipString $Matches[1].Trim() $ExistingIPs $ipString -split , | ForEach-Object { $_.Trim() } | Where-Object { $_ } } elseif ($ExistingRule -match RemoteIP:\s*(.)) { $ipString $Matches[1].Trim() $ExistingIPs $ipString -split , | ForEach-Object { $_.Trim() } | Where-Object { $_ } } } # 7. 合并新旧IP列表并去重 $AllBlockIPs ($MaliciousIPs $ExistingIPs) | Select-Object -Unique # 将IP格式统一为 x.x.x.x/32这是防火墙规则中表示单个IP的标准格式 $AllBlockIPs $AllBlockIPs | ForEach-Object { if ($_ -notmatch /\d{1,2}$) { $_ /32 } else { $_ } } if ($AllBlockIPs.Count -eq 0) { Write-Host [!] 合并后的IP列表为空无需更新规则。 -ForegroundColor Yellow exit 0 } $IPListString $AllBlockIPs -join , Write-Host [*] 合并去重后总计需要封禁 $($AllBlockIPs.Count) 个IP地址。 -ForegroundColor Cyan # 8. 更新防火墙规则 Write-Host [*] 正在更新防火墙规则... -ForegroundColor Cyan # 先尝试删除旧规则如果存在 netsh advfirewall firewall delete rule name$RuleName 2$null | Out-Null # 添加新规则 $Command netsh advfirewall firewall add rule name$RuleName dirin actionblock remoteip$IPListString description自动封禁RDP暴力破解IP更新时间: $(Get-Date -Format yyyy-MM-dd HH:mm:ss) Invoke-Expression $Command if ($LASTEXITCODE -eq 0) { Write-Host [√] 防火墙规则 $RuleName 更新成功已封禁IP: $($AllBlockIPs.Count) 个。 -ForegroundColor Green # 可选将封禁的IP记录到日志文件 $AllBlockIPs | Out-File -FilePath C:\RDP_Blocked_IPs_$(Get-Date -Format yyyyMMdd).log -Append } else { Write-Host [X] 防火墙规则更新失败请检查命令或权限。 -ForegroundColor Red }脚本使用要点权限运行这个脚本需要管理员权限。因为操作防火墙和读取安全日志都需要较高权限。执行策略首次运行可能需要在管理员权限的PowerShell中执行Set-ExecutionPolicy RemoteSigned以允许脚本运行。参数调整你可以根据情况修改开头的几个参数$FailedAttemptThreshold失败阈值、$LookBackMinutes查询日志的时间范围。如果你有固定的合法IP需要排除可以在提取IP后加入白名单过滤。日志脚本会将封禁的IP追加记录到C:\RDP_Blocked_IPs_日期.log文件中方便你后续审计。4. 进阶与优化让防御体系更智能可靠基础的自动化脚本已经能解决大部分问题但要想让它更稳固、更智能还需要一些进阶技巧。这些都是我在实际部署中踩过坑后总结出来的经验。4.1 实现无人值守利用Windows任务计划程序脚本写好了总不能每次都手动运行。我们需要它像守护进程一样定时执行。Windows自带的“任务计划程序”就是完美工具。打开“任务计划程序”点击右侧“创建基本任务”。起个名字比如“RDP攻击自动防御”。触发器选择“按预定计划”然后设置“重复任务间隔”我建议设为每5分钟或10分钟一次间隔太短可能对系统有负担太长则防御不及时。操作选择“启动程序”程序或脚本处填写powershell.exe。在“添加参数”一栏填写-ExecutionPolicy Bypass -File C:\你的脚本路径\AutoBlockRDP.ps1。-ExecutionPolicy Bypass是为了绕过执行策略限制确保脚本能运行。最关键的一步在“常规”选项卡里务必勾选“使用最高权限运行”否则脚本会因权限不足而失败。设置完成后可以手动右键任务“运行”一次测试是否成功。这样你的防御脚本就实现了7x24小时全自动运行。你可以随时去任务计划程序里查看它的运行历史记录确认是否在正常工作。4.2 避免误伤设置IP白名单与智能过滤自动化封禁最大的风险就是“误伤友军”。比如你自己从公司或手机热点连接回家如果连续输错几次密码也可能被脚本封掉。因此引入白名单机制至关重要。你可以在脚本开头定义一个白名单数组$WhiteList (你的办公室公网IP/32, 你家宽带的IP段如 202.96.128.0/24, 127.0.0.1/32)然后在合并IP列表的步骤后加入过滤$AllBlockIPs $AllBlockIPs | Where-Object { $BlockIP -notin $WhiteList }此外脚本中已经内置了对常见私有IP段192.168.x.x, 10.x.x.x, 172.16.x.x-172.31.x.x的过滤因为来自内网的攻击可能性较低且误封内网IP会影响局域网内其他服务。这个过滤列表你可以根据你的网络环境调整。4.3 性能与日志管理脚本的自我修养一个健壮的脚本还需要考虑性能和日志管理。性能查询日志时不要无限制地获取所有历史记录。脚本中通过$LookBackMinutes如30分钟来限定时间范围既能抓到近期攻击又不会因为处理海量历史日志而卡顿。对于日志量巨大的服务器可以考虑使用-MaxEvents参数限制获取的事件条数。规则管理防火墙规则中的IP列表会越来越长。虽然理论上一条规则可以包含很多IP但为了管理清晰你可以考虑在脚本中加入“规则清理”逻辑。例如当封禁IP超过500个时自动将最早封禁的100个IP移除或者每周将规则重置一次前提是攻击IP通常不会长期复用。脚本日志除了将封禁IP记录到文件脚本自身的运行状态也应该记录。你可以使用Start-Transcript和Stop-Transcriptcmdlet将每次脚本运行的输出包括成功、错误信息记录到文本文件便于日后排查问题。4.4 扩展思路与其他安全措施联动自动化封禁脚本是最后一道主动防线但它不应该成为唯一一道。结合其他防御措施能构建更立体的安全体系强密码与多因素认证这是根本。为远程桌面账户设置一个长度超过12位包含大小写字母、数字和特殊字符的强密码。如果条件允许启用Windows Hello或第三方多因素认证能让爆破攻击彻底失效。更改默认端口虽然不能完全阻止扫描但能减少被广撒网式扫描命中的概率。在注册表HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp下修改PortNumber值。网络层隔离如果可能使用VPN来访问内网再连接远程桌面。这样远程桌面服务本身就不暴露在公网是最安全的方式。或者在路由器或云服务商的安全组设置中仅允许来自可信国家或地区的IP访问3389端口。把这个自动化脚本部署上线后我再去查看安全日志心情就完全不一样了。依然能看到零星的4625事件但每个攻击IP通常只出现几次之后就再也看不到了——因为它们已经被我的脚本悄无声息地丢进了防火墙的黑名单。整个系统安静地运行在后台我几乎忘记了它的存在直到某天检查封禁日志看到里面成百上千个被拦截的IP才真切感受到它一直在默默工作。这种“以自动对抗自动”的感觉正是技术带来的安全感。安全是一个持续的过程这个脚本就是一个可靠的自动化起点你可以基于它根据自己的需求不断打磨和强化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…