SaltStack常用组件使用 SaltStack配置文件说明 轻量级DNS、DHCP服务软件DNSMASQ 千万级PV(日)的移动应用架构如何实现 高效运维最佳实践-运维自动化之殇 Ubuntu 14.04 Linux如何配置静态IP地址和DNS服务器 ELK 常见错误与解决办法 Elasticsearch 集群配置管理常用操作 常用数字证书格式相互转换-OpenSSL/Keytool/Jks2pfx ELK 综合日志归档分析系统(2)-Logstash安装配置 Elasticsearch之Shield认证与权限管理 ELK 综合日志归档分析系统(1)-Elasticsearch-Redis安装配置 Redmine 3.2 安装配置指南 CentOS6 大型web系统数据缓存设计 Redis 集群方案 Linux 内核TCP优化详解 SaltStack初始化安装配置 OpenLDAP常用操作 OpenLDAP统一身份认证 [CentOS6/7] 构建Linux Skype Message消息推送API服务(Zabbix集成告警) Tomcat 生产服务器性能优化 Zabbix结合iptables监控网络流量 Linux操作系统环境配置与优先级问题 深入 NGINX: 我们如何设计性能和扩展 Windows SQL Server 性能计数器详细说明 Windows性能计数器说明 Ubuntu安装openntpd报错:Starting openntpd: /etc/openntpd/ntpd.conf: Permission denied locale: Cannot set LC_ALL to default locale: No such file or directory OpenSSL拆解p12证书公约和私钥 Linux sar 统计系统性能(网卡、内存和交换空间、CPU资源等) Linux Shell /dev/null 2>&1 含义 Windows 2003操作系统网络不通 构建私有yum安装源镜像站点(openstack) CentOS6/RedHat6新增网卡识别问题 Ubuntu 14.04 Server优化与使用问题解决 Redhat/CentOS6系统使用ntfs-3g挂载NTFS分区 Linux GPT挂载超过2TB磁盘 Linux系统性能优化、测试和监控工具梳理 修复WIN2003远程桌面服务无法访问 解决CentOS“Zabbix discoverer processes 75% busy”的问题 REHL/CentOS安装phpMyadmin

使用Powershell自动过滤暴力破解IP

2015年06月18日

在Windows服务器放置公网后,一直存在来之海外和国内IP针对远程桌面和SQLServer数据库服务帐号密码的暴力破解。于是编写了一个Powershell脚本,通过分析系统安全日志,自动探测攻击来源的IP并加入到Windows防火墙中,从而达到了自动过滤暴力攻击的IP地址。

1.开启Windows防火墙

在开始菜单运行中,输入:fw.msc,打开防火墙管理程序,在所有区域启用防火墙规则。

图1

2.创建防火墙入站规则

依次选择:入站规则–>新建规则。

名称必须为:MY BLACKLIST

操作:阻止

作用域:远程IP地址,选择“下列IP地址”,初始配置时必须填写一个IP。否则防火墙将阻止所有入站通讯。

图2

3.下载并运行脚本

将脚本中的10.1.1.20地址修改成远程访问的IP地址,防止将受信任的IP地址防火墙中,导致无法访问。完成在powershell中运行下载的脚本程序。

因系统默认只允许运行经过受信任数字签名后的代码,脚本可能无法正常运行,有两个解决方法:

1.调整powershell运行安全策略,信任所有本地powershell脚本。

#从网络上下载的脚本执行会提示需要签名
set-executionpolicy remotesigned
#如要恢复强制签名,使用下面的命令
# 验证所有的脚本的签名信息,验证不通过,拒绝执行。
set-executionpolicy AllSigned

2.创建自签名证书,对脚本进行签名。

参考本站点另外一篇文章:《自签名证书对Powershell代码签名》

脚本下载地址:点击此处

3.具体代码如下

#modification your application port number
#Run Secript: powershell.exe -file 
#Cancel Run: CTRL+C
#This code has been used pactera eds data certificate to sign
#If change security policy run all local code: set-executionpolicy remotesigned
#Change 10.1.1.20 to your trust remote access IP
$tick = 0; 
"Start to run at: " + (get-date); 

#fiter 
$regex2 = [regex] "Source Network Address:\t(\d+\.\d+\.\d+\.\d+)"; 
$regex3 = [regex] "CLIENT: (\d+\.\d+\.\d+\.\d+)";
  
while($True) {
	"Running... (tick:" + $tick + ")"; $tick+=1; 
	$blacklist = @();

	#Get System FW Blocked IPs
	$fwDefault=New-object -comObject HNetCfg.FwPolicy2;
	$myruleBlockIPs = ($fwDefault.Rules | where {$_.Name -eq "MY BLACKLIST"} | select -First 1).RemoteAddresses;

	#Port 3389 
	$a = netstat -ant | Select-String ":3389";

	if ($a.count -gt 0) {    
		$ips = get-eventlog Security -Newest 1000 | Where-Object {$_.EventID -eq 4625 -and $_.Message -match "Logon Type:\s+10"} | foreach {
			$m = $regex2.Match($_.Message); $ip = $m.Groups[1].Value; $ip; 
		} | Sort-Object | Tee-Object -Variable list | Get-Unique

		foreach ($ip in $ips) {
			if ((-not ($myruleBlockIPs -match $ip))) {
				$attack_count = ($list | Select-String $ip -SimpleMatch | Measure-Object).count;
				"Found attacking IP on 3389: " + $ip + ", with count: " + $attack_count;
				if ($attack_count -ge 8) {$blacklist = $blacklist + $ip;}
			}
		}
	}

	#Get MSSQLSERVER Audits Failed List
	$mssqlserver=(netstat -ant | Select-String ":1433");

	if ($mssqlserver.count -gt 0) {
		$ips = get-eventlog Application -Newest 1000 | Where-Object {$_.EventID -eq 18456} | foreach {
				$m = $regex3.Match($_.Message);
				$ip = $m.Groups[1].Value;
				$ip;
			} | Sort-Object | Tee-Object -Variable list | Get-Unique

		foreach ($ip in $ips) {
			if ((-not ($blacklist -contains $ip)) -and (-not ($myruleBlockIPs -match $ip))) {
				$attack_count = ($list | Select-String $ip -SimpleMatch | Measure-Object).count;
				"Found attacking MS-SQLServer IP on 1433: " + $ip + ", with count: " + $attack_count;
				if ($attack_count -ge 8) {$blacklist = $blacklist + $ip;}
			}
		}
	}

	#Firewall change 
	foreach ($ip in $blacklist) {
		$fw=New-object -comObject HNetCfg.FwPolicy2;
		$myrule = $fw.Rules | where {$_.Name -eq "MY BLACKLIST"} | select -First 1;   
		if (-not ($myrule.RemoteAddresses -match $ip) -and -not ($ip -like "10.1.1.20")) {
			(get-date)+"   "+"Adding this IP into firewall blocklist: " + $ip;   
			$myrule.RemoteAddresses+=(","+$ip); 
		}
	}

	Wait-Event -Timeout 30 #pause 30 secs
} # end of top while loop.

转载请注明:自动化运维 » 使用Powershell自动过滤暴力破解IP