远程桌面一直被人爆破的解决思路

news2024/11/16 13:42:50

目录

  • 前言
        • 初步解决方法
        • 题外话
    • 预防措施
    • 获取日志
        • Get-EventLog
        • 例子
        • 防火墙操作
    • 编写软件自动提取IP和添加黑名单
        • 调用powershell命令
        • 调用cmd命令

前言

某天远程自己的电脑发现登不上了,错误信息如下:
在这里插入图片描述
开始也没在意,后面出现了好几次才反应过来。查看了Windows日志发现一直有人在尝试登录这台电脑,因为3389端口已经映射到了公网IP

初步解决方法

进入计算机管理->系统工具->本地用户和组选择被锁定的用户,右键属性就能看到
在这里插入图片描述
取消锁定即可

题外话

之前一直没有出现这种情况,但是我看日志信息这种情况已经出现好几天了,每隔几秒就有人尝试登陆。因为Windows日志右大小限制,也就是最多保留三四天的信息,那这种情况应该持续很长一段时间了。

之前没有发现是因为Windows11 22H2才开始开启这个策略。也就是说之前的系统即使密码尝试一直错误也不会锁定账户,具体可以看:Windows 11 22H2默认启用了密码暴力穷举保护功能

看了看我的纯数字的密码,细思极恐,吓得我马上换成了大小写数字加特殊字符的密码

预防措施

因为我自己也要远程连接电脑,防火墙直接锁死远程登陆也不太现实,因为是映射到公网的IP,用的也不是3389端口,改端口应该是没实际作用的。

查看了日志发现,日志里是有远程登陆的IP的。导出日志为txt,正则提取一下IP,接着去下重,有170个IP。想着加入防火墙的黑名单,但是Windows这防火墙也不能批量编辑,只能一个一个加。

搜了一下如何通过winapi获取日志和添加防火墙

获取日志

我搜到的有两种方式,powershell和WMI

WMI我测试了不太会用,还是powershell命令方便的多。官方文档

Get-EventLog

Get-EventLog
   [-LogName] <String>
   [-ComputerName <String[]>]
   [-Newest <Int32>]
   [-After <DateTime>]
   [-Before <DateTime>]
   [-UserName <String[]>]
   [[-InstanceId] <Int64[]>]
   [-Index <Int32[]>]
   [-EntryType <String[]>]
   [-Source <String[]>]
   [-Message <String>]
   [-AsBaseObject]
   [<CommonParameters>]

说下这里面用的到的:

  • LogName: 日志类型, 比如安全/系统等。可以通过Get-EventLog -List查看所有的类型英文名称
    在这里插入图片描述
  • Newest: 查看最近的多少条
  • After: 在什么时间之后
  • Before: 在什么时间之前
  • Index,EntryType,Source,Message,InstanceID: 这五个都是日志的字段值

例子

Windows命令并不区分大小写,参数也是大写小写都可以。如果参数是字符串的话,不包含特殊字符的话,可以不用引号括起来。如果包含空格等特殊字符的话需要引号括起来

  • Get-EventLog -List
    查看所有日志类型
    在这里插入图片描述

  • Get-EventLog -LogName System -Newest 10
    查看最近十条系统日志
    在这里插入图片描述

  • Get-EventLog -LogName System -Source "Microsoft-Windows*" -Newest 10
    查看最近十条Source字段以Microsoft-Windows开头的系统日志
    在这里插入图片描述

  • Get-EventLog -LogName System -EntryType "Error" -Newest 10
    查看最近十条EntryType等于Error的系统日志
    在这里插入图片描述

  • Get-EventLog -LogName Security -InstanceId 4625 -Newest 10
    查看最近十条InstanceId等于4625的安全日志。InstanceId表示的是事件类型,4625就是登录失败的类型
    在这里插入图片描述

  • Get-EventLog -LogName Security -Message *登录失败* -Newest 10
    查看最近十条,Message包含登录失败的安全日志
    在这里插入图片描述

  • Get-EventLog -LogName System -Newest 1 | Select-Object -Property *
    显示属性
    Get-EventLog -LogName System -Newest 1 | Select-Object -Property EventID,Message 只显示EventID,Message字段
    在这里插入图片描述

  • $Begin = Get-Date -Date '1/17/2019 08:00:00'
    $End = Get-Date -Date '1/17/2019 17:00:00'
    Get-EventLog -LogName System -EntryType Error -After $Begin -Before $End
    这得先定义两个时间变量,再执行第三个命令

  • Get-EventLog -LogName Security -InstanceId 4625 -Newest 1 | select -ExpandProperty message
    只显示Message字段,主要是为了显示全部,不然看到的都是…

防火墙操作

官方文档

如果不清楚具体命令,可以后面跟空格+问号获取帮助信息
在这里插入图片描述
简单说下show delete和add这三个命令

show的功能基本就是下图中的两个例子了

  1. netsh advfirewall firewall show rule name="allow browser" 获取指定name的防火墙规则
  2. netsh advfirewall firewall show rule name=all dir=in type=dynamic 获取防火墙入站规则中类型为dynamic的规则。这个type类型指的是什么,我在防火墙里没看到

在这里插入图片描述

add的帮助信息比较长,这里就截了用法。示例和补充说明可以在自己电脑上看
在这里插入图片描述
介绍下字段:

  • name: 防火墙规则名称,建议唯一,且不能是all
  • dir: 指的是入站和出站规则,入站是别人访问你,出站是你访问别人。举个例子,你不想让别人访问你的某些接口就可以定义入站规则禁止端口。或者是你不想某些广告的请求发出去,你就可以定于出战规则限制某些IP向外请求
  • action:定义是允许还是禁止,这个bypass应该是界面上的那个只允许安全连接。具体可以看界面添加规则
  • program: 程序的目录,用于允许或者禁止应用联网
  • service: 指定服务的名称,如果指定any,则规则只针对服务生效
  • description:描述
  • enable:是否启用规则,默认是
  • profile:这个是指网络类型,也就是界面中的配置文件(域/专用/公用)
  • localip: 这个用来限制本机的某个网卡。比如手机有两个网,禁止其中一个
  • remoteip:这个就是用来添加远程IP的。localsubnet|dns|dhcp|wins|defaultgateway这些我也不清楚有什么用。看后面的参数类型:IPv4 | IPv6 | 地址范围 | 地址列表,这个后面说明
  • localport: 略
  • remoteport: 略
  • protocol: 一般指udp还是tcp或者是any,默认any
  • interfacetype:无线/有线/ 后面还有个ras应该是拨号吧
  • 下面的就不看了,也用不到

这里说下remoteip的规则。localip基本类似

  • ipv4:也就是指 8.8.8.8这种,还可以在后面接/24这种,具体解释看: IP 地址末尾的斜杠。通俗的讲就是下面四个对应关系
    • 10.0.0.0/24(10.0.0.1–10.0.0.254)
    • 10.0.0.0/16(10.0.0.1–10.0.255.254)
    • 10.0.0.0/8(10.0.0.1–10.255.255.254)
    • 10.0.0.0/32(10.0.0.0)
  • ipv6: 一样的用法
  • <range>: 地址范围,比如你不想写成10.0.0.0/24就可以写10.0.0.1–10.0.0.254
  • <list>: 可以写多个,用逗号分隔, 比如 8.8.8.8,10.0.0.0/24

示例
在这里插入图片描述

delete参数基本和add的一样在这里插入图片描述

编写软件自动提取IP和添加黑名单

因为登录失败的IP不止这些,我禁止了一批又出现几个新的,所以我打算写个工具自动提取IP和添加到防火墙黑名单里

这里我选择了aardio来写这个工具,理由很简单:调用powershell和cmd命令方便,容易打包成exe,没有依赖环境

调用powershell命令

import console;
import dotNet.ps;
var ps_string = "Get-EventLog -LogName Security -InstanceId 4625 | select -ExpandProperty message";
var result = dotNet.ps(ps_string);
console.pause(true);

调用cmd命令

import console;
import process.popen;

var ruleName = "BlockIPsByHelper";
var show_ps_string = string.format("netsh advfirewall firewall show rule name=%s", ruleName);
var prcsShow = process.popen(show_ps_string);
var showIps = table.array();
for line in prcsShow.lines("<远程\s*IP>|<RemoteIP>\s*\:\s*([\d./,-]+)"){  
	if(!line || line == "") continue;
	var s = string.split(line, ",");
	for(i=1;#s;1){
		table.push(showIps, s[i]);
	}
}
prcsShow.close();
console.pause(true);

完整代码:

import console;
import dotNet.ps;
import process.popen;

io.open()

var ruleName = "BlockIPsByHelper";

var arrayCounter = function(tab){
	var counter = {};
	for(i=1;#tab;1){
		var c = tab[i];
		if(!counter[c]){
			counter[c] = 1;
		}else{
			counter[c] += 1;
		}
	}
	return counter;
}


// 通过powershell命令查询日志,获取登录失败(EventID=4625)的远程IP
var getLoginFailEventIP = function(){
	var ps_string = "Get-EventLog -LogName Security -InstanceId 4625 | select -ExpandProperty message";
	var result = dotNet.ps(ps_string);
	var ips = table.array();
	string.search(ips, result, "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}");
	var counter = arrayCounter(ips);
	console.log("IP计数: ")
	console.dump(counter);
	var set_ips = table.array();
	for(i=1;#ips;1){
		var ip = ips[i];
		var ip32 = ip+"/32";
		if(!table.find(set_ips, ip32) and ip32 != "127.0.0.1/32" and counter[ip] > 2){
			table.push(set_ips, ip32);
		}
	}
	return set_ips;
}


var addFirewallRule = function(){
	console.log("规则名称:", ruleName);
	// 查询旧规则
	var show_ps_string = string.format("netsh advfirewall firewall show rule name=%s", ruleName);
	var prcsShow = process.popen(show_ps_string);
	var showIps = table.array();
	for line in prcsShow.lines("<远程\s*IP>|<RemoteIP>\s*\:\s*([\d./,-]+)"){  
		if(!line || line == "") continue;
		line = string.trim(line);
		var s = string.split(line, ",");
		for(i=1;#s;1){
			table.push(showIps, s[i]);
		}
	}
	prcsShow.close();
	console.log("查询旧规则结果IP: ", '\r\n', string.join(showIps, '\r\n'));
	// 删除旧规则
	var delete_ps_string = string.format(`netsh advfirewall firewall delete rule name="%s"`, ruleName);
	var prcsDelete = process.popen(delete_ps_string);
	var result, a, b = prcsDelete.readAll();
	console.log("删除规则结果: ", result);
	prcsDelete.close();
	// 查询IP
	console.log('开始从计算机管理->系统工具->事件查看器->Windows日志 查询错误登录信息,等待时间会有点长(看日志量)!\r\n');
	var t0 = time.tick();
	var ips = getLoginFailEventIP();
	console.log("获取IP完成,耗时(秒): ", (time.tick()-t0)/1000);
	// 将showIps中的ip加入到ips
	for(i=1;#showIps;1){
		var ip = string.trim(showIps[i]);
		if(!table.find(ips, ip)){
			table.push(ips, ip);
		}
	}
	// 将提取的ip保持到文件
	string.save("\日志提取的IP.txt", string.join(ips,'\r\n'));
	// 添加新规则
	var remoteip = string.join(ips, ",");
	var add_ps_string = string.format(`netsh advfirewall firewall add rule name="%s" dir=in action=block description="firewall-Helper添加的需要阻止的IP黑名单" remoteip="%s"`, ruleName, remoteip);
	console.log("执行的netsh命令: ", add_ps_string);
	var prcsAdd = process.popen(add_ps_string);
	var result, a, b = prcsAdd.readAll();
	console.log("添加规则结果: ", result);
	prcsAdd.close();
}


addFirewallRule()

console.pause(true);

接着编译成exe,添加定时任务,每小时执行一次即可。

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

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

相关文章

程序员职场生态:近8成本科毕业生起薪过万,跳槽首选智能汽车行业

中国互联网行业经历了超过20年的高速发展&#xff0c;逐渐融入到各行各业&#xff0c;程序员在其中发挥着举足轻重的作用&#xff0c;从业人员数量与日俱增。GitHub数据显示&#xff0c;2021年中国开发者规模达到755万。 近日&#xff0c;拉勾招聘数据研究院对程序员群体开展深…

SpringBoot笔记

文章目录1️⃣ 简介一. 什么是 IoC 容器&#xff1f;二. AOP面向切面编程三. SSM整合四. HttpServletRequest五. HttpServletResponse六. Cookie 与 Session七. Cookie八. Session九. 转发与重定向十. Spring项目转SpringBoot十一. Spring生命周期十二. 什么是 pom十三. 为什么…

知识整理说明:1799962-26-7,(4E)-TCO-NH2,(4E)-反式环辛烯-氨基

(4E)-TCO-amine物理数据&#xff1a; CAS&#xff1a;1799962-26-7| 中文名&#xff1a;(4E)-反式环辛烯-氨基 | 英文名&#xff1a;(4E)-TCO-amine&#xff0c;(4E)-TCO-NH2 结构式&#xff1a; 英文别名&#xff1a; (4E)-TCO-amine 中文别名&#xff1a; (4E)-反式环辛烯…

耗时半月,把牛客网最火Java面试题总结成PDF,涵盖所有面试高频题

最近感慨面试难的人越来越多了&#xff0c;一方面是市场环境&#xff0c;更重要的一方面是企业对Java的人才要求越来越高了。 基本上这样感慨的分为两类人&#xff0c;第一&#xff0c;虽然挂着3、5年经验&#xff0c;但肚子里货少&#xff0c;也没啥拿得出手的项目&#xff0c…

Vite 入门篇:学会它,一起提升开发幸福感。

相信大部分兄弟都体验过 Vite 了&#xff0c;知道它很快。但你知道它为什么快&#xff0c;相比 Webpack 有哪些不同吗&#xff1f;今天咱们就来全面了解一下 Vite &#xff0c;尤其适合新手兄弟。话不多说&#xff0c;开整&#xff01; 什么是构建工具 很多人对构建工具没有什…

RE转NFA转DFA

https://github.com/Nightmare4214/re_nfa_dfa 前置知识 ϵ\epsilonϵ代表空串 语言 某个给定字母表上一个任意的可数的串集合 正则语言/正则表达式 正则语言&#xff08;regular language&#xff09;/正则表达式&#xff08;regular expression&#xff09; 每个正则表达…

2022 SpeechHome 语音技术研讨会-回顾

2022年11月13日&#xff0c;第二届SpeechHome语音技术研讨会和第七届Kaldi技术交流会圆满落幕。本届SpeechHome语音技术研讨会由中国计算机学会、深圳市人工智能学会、小米集团、腾讯天籁实验室、语音之家主办&#xff0c;CCF语音对话与听觉专委会作为指导单位&#xff0c;由内…

【Java开发】 Spring 03:云服务器 Docker 环境下安装 MongoDB 并连接 Spring 项目实现简单 CRUD

接下来介绍一下 NoSQL &#xff0c;相比于 Mysql 等关系型的数据库&#xff0c;NoSQL &#xff08;文档型数据库&#xff09;由于存储的数据之间无关系&#xff0c;因此具备大数据量&#xff0c;高性能等特点&#xff0c;用于解决大规模数据集合多重数据种类带来的挑战&#xf…

点击化学试剂1609736-43-7,TCO-NH2 hydrochloride,反式环辛烯-氨基HCL盐

TCO-amine hydrochloride物理数据&#xff1a; CAS&#xff1a;1609736-43-7| 中文名&#xff1a; 反式环辛烯-氨基盐酸盐&#xff0c;反式环辛烯-氨基HCL盐 | 英文名&#xff1a;TCO-amine hydrochloride 结构式&#xff1a; 中文别名&#xff1a; 环辛-4-烯-1-基 (3-氨基丙…

Mvvm中的Lifecycle

lifecycle&#xff1a;一个持有activity/fragment生命周期信息的类&#xff0c;允许其他对象观察此对状态 Event:从框架和lifecycle类派发的生命周期事件&#xff0c;也就是activity和fragment的各个状态会发Event state:这个就好理解了&#xff0c;就是activity和fragment当…

工业互联与MQTT

、工业互联网 新一代信息通信技术与工业经济深度融合的新型基础设施、应用模式和工业生态&#xff0c;通过对人、机、物、系统等的全面连接&#xff0c;构建起覆盖全产业链、全价值链的全新制造和服务体系&#xff0c;为工业乃至产业数字化、网络化、智能化发展提供了实现途径&…

论文阅读-Dr.Deep_基于医疗特征上下文学习的患者健康状态可解释评估

论文地址&#xff1a;Dr.Deep&#xff1a;基于医疗特征上下文学习的患者健康状态可解释评估 (ict.ac.cn) 代码地址&#xff1a;GitHub - Accountable-Machine-Intelligence/Dr.Deep 简介&#xff1a; 深度学习是当前医疗多变量时序数据分析的主流方法。临床辅助决策关乎病人生…

深入浅出Nodejs中的大文件读写

笔者最近在做一些node端的文件读写和分片上传工作&#xff0c;在这个过程中&#xff0c;发现node读取的文件如果超过2G&#xff0c;超过了读取Blob最大值&#xff0c;会出现读取异常&#xff0c;此外在node中读写文件也受服务器RAM的限制等&#xff0c;需要分片读取&#xff0c…

2022年认证杯SPSSPRO杯数学建模A题(第二阶段)人员的紧急疏散求解全过程文档及程序

2022年认证杯SPSSPRO杯数学建模 A题 人员的紧急疏散求解 原题再现&#xff1a; 在过去的几十年里&#xff0c;由于大规模集会活动的数量和规模的增加&#xff0c;紧急疏散的问题变得越来越重要。通过有限宽度的门或狭窄通道进行疏散是最值得关注的情况之一。为了更好地理解各…

.Net Maui 开发之路(1): APP基本设置(图标、应用名称)

.Net Maui APP基本设置(图标、应用名称) 前言一、App显示名称设置二、App显示图标设置三、App加载动画设置四、App透明状态栏设置总结前言 最终实现的显示效果如下图 提示:以下是本篇文章正文内容,下面案例可供参考 一、App显示名称设置 1、在项目上右键,选择编辑项目文…

02 DevOps 之 Jenkins

1. 什么是CICD 推荐阅读&#xff1a;CICD原理及流程 CICD面试题 在要介绍jenkins之前&#xff0c;我们需要了解CICD是什么&#xff1f; Continuous Integration (CI) 持续集成 Continuous Delivery (CD) 持续交付 Continuous Deployment (CD) 持续部署 1.1 持续集成 持续集成…

Echarts折线图隐藏markPoint只显示最大值和最小值的文本,且只在该两点显示symbol

算是一个比较偏门的需求吧&#xff0c;具体UED给的设计图效果如下&#xff1a; 看起来非常简单&#xff0c;但实际实现起来……也确实简单&#xff0c;就是步骤多一点~ 我们知道Echarts提供的markPoint标注最大值和最小值是会有一个水滴图案的&#xff1a; 首先要做的就是隐藏这…

进程状态和优先级【Linux】

1.进程状态的分类 在Linux内核中&#xff0c;进程状态分为七大类&#xff0c;不同的状态有不同的含义。 下面的状态在kernel中定义&#xff1a; /* * The task state array is a strange "bitmap" of * reasons to sleep. Thus "running" is zero, and *…

深度学习笔记--Transformer中position encoding的源码理解与实现

1--源码 import torch import math import numpy as np import torch.nn as nnclass Pos_Embed(nn.Module):def __init__(self, channels, num_frames, num_joints):super().__init__()# 根据帧序和节点序生成位置向量pos_list [] for tk in range(num_frames):for st in ran…

感知机的认识和简单的实现

一、感知机perceptron 1.1 感知机的信号 只有0和1两种取值 1.2 神经元会计算传递过来的信号总和 只有当信号总和超过某个界限的时候&#xff0c;神经元才会被激活 1.3 信号权重 不同的权重对应的信号的重要性越高 二、常见的逻辑电路 与门与非门或门 2.1 思考 使用感…