暴力破解密码自动阻断

news/2024/5/21 13:43:04

1 re模块

re 模块是 Python 中用于正则表达式操作的模块。正则表达式(Regular Expression)是一种强大的文本处理工具,它使用一种特殊的字符序列来表示字符串中的模式,并可以通过模式匹配、查找、替换等操作对文本进行高效处理。

1.1 导入模块

python
import re

1.2 编译正则表达式

使用 re.compile() 函数可以编译一个正则表达式,返回一个正则表达式对象。

python
pattern = re.compile(r'\d+')  # 匹配一个或多个数字

1.3 匹配操作

1.3.1 re.match()

从字符串的起始位置匹配一个模式,如果匹配成功,返回一个匹配对象;否则返回 None。

match = re.match(r'\d+', '123abc')  # 匹配成功,返回匹配对象  
print(match.group())  # 输出:123

1.3.2 re.search()

扫描整个字符串,返回第一个成功匹配的匹配对象。如果字符串中没有匹配项,则返回 None。

match = re.search(r'\d+', 'abc123def')  # 匹配成功,返回匹配对象  
print(match.group())  # 输出:123

1.3.3 re.findall()

找到字符串中所有匹配项,并返回一个包含所有匹配项的列表。

matches = re.findall(r'\d+', 'abc123def456')  # 返回列表 ['123', '456']  
print(matches)

1.3.4 re.finditer()

找到字符串中所有匹配项,并返回一个迭代器,每个迭代元素是一个匹配对象。

matches = re.finditer(r'\d+', 'abc123def456')  
for match in matches:  print(match.group())  # 分别输出:123 和 456

1.4 替换操作

re.sub() 函数用于在字符串中查找匹配正则表达式的部分,并用新的字符串替换它们。

new_string = re.sub(r'\d+', 'NUMBER', 'abc123def456')  # 替换数字为 'NUMBER'  
print(new_string)  # 输出:abcNUMBERdefNUMBER

1.5 分割操作

re.split() 函数按照正则表达式的模式分割字符串。

parts = re.split(r'\d+', 'abc123def456')  # 按照数字分割字符串  
print(parts)  # 输出:['abc', 'def', '']

1.6 正则表达式语法

正则表达式语法包括字符集、元字符、量词等,用于构建匹配模式。例如:

  • \d 匹配任意数字

  • \. 匹配点字符(由于点在正则表达式中是特殊字符,所以需要使用反斜杠进行转义)

  • * 匹配前面的子表达式零次或多次

  • + 匹配前面的子表达式一次或多次

  • ? 匹配前面的子表达式零次或一次

  • {n} 匹配确定的 n 次

  • {n,} 匹配至少 n 次

  • {n,m} 匹配至少 n 次,但不超过 m 次

  • ^ 匹配字符串的开始

  • $ 匹配字符串的结束

  • [...] 字符集,匹配方括号中的任意字符

  • [^...] 否定字符集,匹配不在方括号中的任意字符

  • | 或者,匹配 | 两侧的任意一项

  • ( ) 捕获括号,用于分组和提取匹配部分

  • \ 转义字符,用于匹配特殊字符或转义序列

1.7 案例

案例 1:基础匹配

import re  # 定义一个简单的正则表达式,匹配数字  
pattern = re.compile(r'\d+')  # 定义一个字符串  
text = "我有10个苹果和5个橙子"  # 使用re.search()进行匹配  
match = re.search(pattern, text)  # 如果匹配成功,输出匹配到的内容  
if match:  print("找到匹配项:", match.group())  # 输出:找到匹配项: 10  
else:  print("未找到匹配项")

效果

案例 2:使用边界符匹配完整单词

import re  # 匹配完整的单词 "apple"  
pattern = re.compile(r'\bapple\b')  # 定义一个包含单词 "apple" 的字符串  
text = "I like apples and apple pie."  # 使用re.findall()查找所有匹配项  
matches = re.findall(pattern, text)  # 输出所有匹配到的单词  
print("找到匹配项:", matches)  # 输出:找到匹配项['apple']
​

效果

案例 3:使用非贪婪匹配

import re  # 使用非贪婪匹配,尽可能少地匹配字符  
pattern = re.compile(r'<.*?>')  # 匹配像 <a> 或 <div> 这样的标签  text = "<html><head><title>Test</title></head><body><p>Hello, world!</p></body></html>"  # 使用re.findall()查找所有匹配项  
matches = re.findall(pattern, text)  # 输出所有匹配到的标签  
print("找到匹配项:", matches)  # 输出:找到匹配项: ['<html>', '<head>', '<title>', '</title>', '</head>', '<body>', '<p>', '</p>', '</body>', '</html>']

效果

案例 4:使用re.match()从字符串开始处匹配

import re  # 使用re.match()从字符串开始处匹配数字  
pattern = re.compile(r'\d+')  text1 = "123开始的地方"  
text2 = "开始的地方123"  # 尝试匹配text1  
match1 = re.match(pattern, text1)  
if match1:  print("text1匹配成功:", match1.group())  # 输出:text1匹配成功: 123  
else:  print("text1未匹配成功")  # 尝试匹配text2  
match2 = re.match(pattern, text2)  
if match2:  print("text2匹配成功:", match2.group())  
else:  print("text2未匹配成功")  # 输出:text2未匹配成功

效果

案例 5:使用re.sub()替换字符串中的模式

import re  # 使用re.sub()替换字符串中的数字为 'NUMBER'  
pattern = re.compile(r'\d+')  text = "我有3个苹果和2个橙子"  
new_text = re.sub(pattern, 'NUMBER', text)  # 输出替换后的字符串  
print("替换后的字符串:", new_text)  # 输出:替换后的字符串: 我有NUMBER个苹果和NUMBER个橙子

效果

案例 6:使用标志位

import re  # 使用IGNORECASE标志位忽略大小写进行匹配  
pattern = re.compile(r'python', re.IGNORECASE)  text = "Python is a great programming language. I love python."  
matches = re.findall(pattern, text)  # 输出所有匹配到的单词,忽略大小写  
print("找到匹配项:", matches)  # 输出:找到匹配项: ['Python', 'python']

效果

案例 7:使用分组和提取

import re  # 使用分组提取日期中的年、月、日  
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')  text = "我的生日是2023-09-17"  
match = re.search(pattern, text)  if match:  year, month, day = match.groups()  print(f"年份: {year}, 月份: {month}, 日期: {day}")  # 输出:年份: 2023, 月份: 09, 日期: 17  
else:  print("未找到匹配项")

效果

2 subprocess模块

subprocess 模块是 Python 中用于创建新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码的模块。这个模块提供了一个高级接口来启动子进程,并收集它们的输出。

2.1 基本使用

subprocess 模块中的几个常用函数包括:

  • subprocess.run():运行命令并等待完成,返回一个 CompletedProcess 实例。

  • subprocess.Popen():更底层的接口,用于启动进程并返回一个 Popen 对象,通过这个对象可以进一步与子进程交互。

2.2 案例

示例 1:使用 subprocess.run() 运行命令
import subprocess  # 运行命令并等待完成  
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)  # 输出命令执行结果  
print(result.stdout)  # 捕获的标准输出  
print(result.stderr)  # 捕获的标准错误输出  
print(result.returncode)  # 返回码,0通常表示成功

效果

示例 2:使用 subprocess.Popen() 与进程交互
import subprocess  # 使用 Popen 创建进程  
p = subprocess.Popen(['ping', '-c', '4', 'www.google.com'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)  # 等待进程完成并获取输出  
stdout, stderr = p.communicate()  # 解码输出为字符串  
stdout_str = stdout.decode('utf-8')  
stderr_str = stderr.decode('utf-8')  # 输出结果  
print('返回码:', p.returncode)  
print('标准输出:', stdout_str)  
print('标准错误:', stderr_str)

效果

3 linux日志分析

/var/log/cron 记录系统的定时任务 /var/log/cups 打印信息的日志 /var/log/message 记录的系统重要信息的日志 /var/log/btmp 登录失败 /var/log/lastlog 最后一次登录 /var/log/wtmp 成功登录记录 /var/log/secure 登录日志 /var/log/utmp 目前登录用户的信息

hosts黑名单 /etc/hosts.deny hosts白名单 /etc/hosts.allow

登录成功 Accepted password for root from 192.168.135.130 port 53776 ssh2

登录失败 Failed password for root from 192.168.135.130 port 42404 ssh2

4 linux日志分析技巧

日志分析常见命令

find grep awk sed cat tail head

分析命令

#显示最后十条日志记录
tail -f messages

#显示最后100条日志记录
tail -100f messages

#从第五行开始的日志记录
tail -n-+5  messages

#搜索存在root的字符串
[root@xuegod61 log]# cat /etc/passwd | grep "root"
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#显示rot前后5行
cat /etc/passwd | grep -C 5 "root"

#显示匹配行以及其前的 5 行
cat /etc/passwd | grep -B 5 "root"

#匹配行以及其后的 5 行
cat /etc/passwd | grep -A 5 "root"

从第10行开始,显示5行,也就是说显示10~15行
cat /etc/passwd | tail -n +10 | head -n 5

只显示/etc/passwd下的账户
cat /etc/passwd | awk -F ':' '{print $1}

/var/log/secure
定位有多少个ip在爆破主机的root账号
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
登录成功的ip有哪些
grep "Accepted" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr

5 linux黑白名单设置

配置格式

服务:地址:允许/封禁

服务: ssh ftp smb telnet 关键字(all)禁止or运行所有服务

all:192.168.0.10:deny(全封)

all:192.168.0.10:allow(加白) 地址:

192.168.0.10

192.168.0.10/24(整个C段封掉)

192.168.0.*(整个C段封掉)

192.168.0.(整个C段封掉)

6项目梳理

怎么实现暴力破解自动阻断

1、打开安全日志

2、对安全日志进行实时监控

3、解析日志每一行的内容,找出正在爆破的ip

4、设置一个阈值 超过阈值之后 直接封禁(把他的ip放入黑名单中)

7项目实现

代码

新建auto_blockip.py

#!/usr/bin/env python3
​
import re
import subprocess
import time
​
​
logFile = '/var/log/secure'
hostDeny = '/etc/hosts.deny'
​
# 允许的密码错误次数,大于该次数,直接拉黑
passwd_wrong_num = 1
​
# 获取已经加入黑名单的ip,转成字典
def getDenies():deniedDict = {}list = open(hostDeny).readlines()for ip in list:group = re.search(r'(\d+\.\d+\.\d+\.\d+)', ip)if group:deniedDict[group[1]] = '1'return deniedDict
​
# 监控方法
def monitorLog(logFile):# 统计密码错误次数tempIp = {}# 已拉黑ip名单deniedDict = getDenies()# 读取安全日志popen = subprocess.Popen('tail -f ' + logFile, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)# 开始监控while True:# 1s10次吧time.sleep(0.1)# 按行读line = popen.stdout.readline().strip()if line:# Invalid user: 不合法的用户名的, 直接拉黑group = re.search(r'Invalid user \w+ from (\d+\.\d+\.\d+\.\d+)', str(line))# 理论上,and后面的不用判断,已经在黑名单里面的,secure日志里,直接是refused connect from XXXXif group and not deniedDict.get(group[1]):subprocess.getoutput('echo \'sshd:{}\' >> {}'.format(group[1], hostDeny))deniedDict[group[1]] = '1'time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))print('{} --- add ip:{} to hosts.deny for invalid user'.format(time_str, group[1]))continue
​# 用户名合法 密码错误的group = re.search(r'Failed password for \w+ from (\d+\.\d+\.\d+\.\d+) ', str(line))if group:ip = group[1]# 统计错误次数if not tempIp.get(ip):tempIp[ip] = 1else:tempIp[ip] = tempIp[ip] + 1# 密码错误次数大于阈值的时候,直接拉黑if tempIp[ip] > passwd_wrong_num and not deniedDict.get(ip):del tempIp[ip]subprocess.getoutput('echo \'sshd:{}\' >> {}'.format(ip, hostDeny))deniedDict[ip] = '1'time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))print('{} --- add ip:{} to hosts.deny for invalid password'.format(time_str, ip))
​
if __name__ == '__main__':monitorLog(logFile)

效果

查看黑名单

[root@xuegod61 ~]# vim /etc/hosts.deny


http://www.mrgr.cn/p/82838814

相关文章

激光雷达盲人导航:科技赋能,独立出行的曙光照亮餐桌之旅

在科技日新月异的今天&#xff0c;一场悄无声息的变革正在为视障群体的生活带来翻天覆地的变化。尤其在城市生活的重要场景——餐厅就餐方面&#xff0c;一款搭载激光雷达技术的辅助软件正以前所未有的力量&#xff0c;助力盲人朋友们打破传统束缚&#xff0c;实现独立、安全且…

Excel 记录单 快速录入数据

一. 调出记录单 ⏹记录单功能默认是隐藏的&#xff0c;通过如下如图所示的方式&#xff0c;将记录单功能显示出来。 二. 录入数据 ⏹先在表格中录入一行数据&#xff0c;给记录单一个参考 ⏹将光标至于表格右上角&#xff0c;然后点击记录单按钮&#xff0c;调出记录单 然后点…

[Java EE] 计算机工作原理与操作系统简明概要

1. 计算机工作原理 1.1 生活中常见的计算机 计算机分为通用计算机和专用计算机,计算机并不单单指的是电脑,还有我们平时使用的手机,ipad,智能手表等终端设备都是计算机.还有我们用户不常见的计算机,比如服务器. 还有许多嵌入式设备(针对特定场景定制的"专用计算机"…

如何在MobaXterm上使用rz命令

1、首先输入命令和想下载的文件&#xff0c;如下图&#xff1a; 2、按住ctrl鼠标右键&#xff0c;选择如下选项&#xff1a; 上传命令是rz&#xff0c;选择Receive...... 下载命令是sz&#xff0c;选择Send...... 3、我这里是要把Linux上的文件下载到我的本地window磁盘&…

找出mongodb的jumbo块并进行分裂

https://www.cnblogs.com/abclife/p/15968628.html 根据这篇文档中的脚本&#xff0c;在我们自己的环境中跑了下&#xff0c;第一次跑的结果如下&#xff1a; 运行完上面跑出的split脚本后&#xff0c;还是存在jumbo块&#xff0c;第二次跑出的结果&#xff1a; 从上面结果可以…

顺序表 (头删 尾删 清空)

//头删 | 1 #include "head.h" | 1 #ifndef ww87 void head_del(p lp) | 2 int main(int argc, const char *argv[]) …

C#自增运算符详解:++i与i++的区别及应用场景

概述:在C#中,++i和i++都是自增运算符,其中++i先增加值再返回,而i++先返回值再增加。应用场景根据需求选择,前缀适合先增后用,后缀适合先用后增。详细示例提供清晰的代码演示这两者的操作时机和实际应用。 在C#中,++i 和 i++ 都是自增运算符,但它们在操作上有细微的差异…

使用webpack5+TypeScript+npm发布组件库

一、前言 作为一只前端攻城狮&#xff0c;没有一个属于自己的组件库&#xff0c;那岂不是狮子没有了牙齿&#xff0c;士兵没有了武器&#xff0c;姑娘没有了大宝SOD蜜&#xff0c;你没有了我.... 言归正传&#xff0c;下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM…

Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(2)-深度探究

目录 1. 前文回顾 1.1 简单背后的复杂 1.2 复杂性的来源 2. 关键代码 2.1 功能概述 2.2 关系梳理 2.3 理解构造函数二 2.4 理解HLS_CONSTEXPR 2.5 理解const volatile 3. 探究ap_int<8> c&#xff1b;经历了什么 4. 在调试中查看 1. 前文回顾 在《Vitis HLS…

项目7-音乐播放器1+BCrypt加密

1.创建项目 1.1 引入依赖 1.2 yml相关配置 application.yml spring:profiles:active: prod mybatis:mapper-locations: classpath:mapper/**Mapper.xmlconfiguration:map-underscore-to-camel-case: true #配置驼峰⾃动转换log-impl: org.apache.ibatis.logging.stdout.StdO…

牛客Linux高并发服务器开发学习第一天

Linux开发环境搭建 安装Xshell 7远程连接虚拟机的Ubuntu 安装Xftp 7可以传输文件(暂时还没使用) 安装VMware Tools可以直接从Windows系统向虚拟机Linux系统拖拽文件实现文件交互。 安装CScode可以远程连接Linux系统进行代码的编写。&#xff08;Windows系统与Linxu系统公钥…

【蓝桥杯】2024年第15届真题题目

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进 行一次握手&#xff08;且仅有一次&a…

iOS开发如何更改xcode中的Apple ID

在Xcode中更改Apple ID是一项常见的任务&#xff0c;尤其是当你需要切换到另一个开发者账号或者团队时。下面是一个简单的步骤指南&#xff0c;帮助你更改Xcode中的Apple ID&#xff1a; 步骤一&#xff1a;退出当前的Apple ID 1.打开Xcode应用程序。 2.在菜单栏中&#xff0c;…

云正在使 IT 受益,但对业务却没有好处

云具有巨大的商业价值&#xff01;这是云提供商及其盟友在每次云计算会议上高喊的战斗口号。 您永远不会听到我说“云”始终是正确的解决方案&#xff0c;或者就此而言&#xff0c;是错误的解决方案。 在作为云专家 20 多年的时间里&#xff0c;从来没有盲目追随云计算先驱或…

Python学习从0开始——项目一day01爬虫(二)

Python学习从0开始——项目一day01爬虫&#xff08;二&#xff09; 一、解析response数据二、json转换三、文件保存四、存储json对象五、完整代码 上一篇 一、解析response数据 在已经知道我们获取图片的最终URL存在于请求响应response中&#xff0c;下一步的重点就放在解析re…

[lesson35]函数对象分析

函数对象分析 客户需求 编写一个函数 函数可以获得斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用 存在的问题 函数一旦开始调用就无法重来 静态局部变量处于函数内部&#xff0c;外界无法改变函数为全局函数&#xff0c;是唯一的&#xff0c;无法多次独…

【YOLOv9】使用yolov9训练自己的数据集/验证 /推理 /参数分析

完胜V8的SOTA模型Yolov9(论文阅读笔记)内容 点击即可跳转 当今的YOLO系列武林盟主YOLOV9&#xff1a; YOLOv9的优秀表现&#xff1a; 环境&#xff1a; ubuntu20.04&#xff0c;无GPU&#xff0c;使用anaconda3创建的虚拟环境yolov9。 环境安装&#xff1a; conda create -n …

FlinkSQL 实时同步 MySQL

本文主要介绍了使用 FlinkSQL 实现 MySQL 数据的实时同步。准备工作MySQL 数据库(version: 5.7.25),注意,MySQL 数据库版本必须大于 5.6,否则不支持。开启 MySQL 的 log-bin: [mysqld] # Binary Logging. log-bin=mysql-bin server-id=1Flink (version : 1.15.4)添加 fli…

Linux基础|线程池Part.1|线程池的定义和运行逻辑

线程池的定义和运行逻辑 多线程的问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统的效率&#xff0c;因为频繁创建线程和销毁线程需要时间。 那么一个很自然的想法就出现了…

FlinkSQL 实时数据同步

准备工作MySQL 数据库(version: 5.7.25),注意,MySQL 数据库版本必须大于 5.6,否则不支持。开启 MySQL 的 log-bin: [mysqld] # Binary Logging. log-bin=mysql-bin server-id=1Flink (version : 1.15.4)添加 flink-connector-jdbc-1.15.4.jar 和 flink-sql-connector-mys…