暴力破解密码自动阻断

news2024/12/23 20:25:50

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 XXXX
            if 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] = 1
                else:
                    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.coloradmin.cn/o/1597673.html

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

相关文章

【Qt】:对话框(二)

对话框 一.消息对话框&#xff08;QMessageBox&#xff09;1.自己构建2.使用静态函数构建 二.颜色对话框&#xff08;QDialog&#xff09;三.文件对话框&#xff08;QFileDialog&#xff09;四.字体对话框&#xff08;QFontDialog&#xff09;五.输入对话框&#xff08;QInputD…

光场相机建模与畸变校正改进方法

摘要&#xff1a;光场相机作为一种新型的成像系统&#xff0c;可以直接从一次曝光的图像中得到三维信息。为了能够更充分有效地利用光场数据包含的角度和位置信息&#xff0c;完成更加精准的场景深度计算&#xff0c;从而提升光场相机的三维重建的精度&#xff0c;需要实现精确…

PgSQL之WITH Queries/Statement

PostgreSQL WITH 子句 在 PostgreSQL 中&#xff0c;WITH 子句提供了一种编写辅助语句的方法&#xff0c;以便在更大的查询中使用。 WITH 子句有助于将复杂的大型查询分解为更简单的表单&#xff0c;便于阅读。这些语句通常称为通用表表达式&#xff08;Common Table Express…

《Kubernets证书篇:基于Kylin V10+ARM架构CPU修改K8S 1.26.15版本证书时间限制》

一、背景 Kubernetes 默认的证书有效期只有1年&#xff0c;因此需要每年手动更新一次节点上面的证书&#xff0c;特别麻烦而且更新过程中可能会出现问题&#xff0c;因此我们要对 Kubernetes 的 SSL 证书有效期进行修改&#xff0c;这里将证书的时间限制修改为100年。 环境信息…

视频国标学习

总体介绍 GB/T28181协议&#xff0c;全名叫《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是由中国国家标准委员会发布的一种国家级的标准。它主要对视频监控系统的各个方面做了明确的规定&#xff0c;使得不同厂商生产的视频监控设备能够相互连通&am…

JavaScript之Proxy详解

文章的更新路线&#xff1a;JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题&#xff08;HTML基础知识和CSS基础知识已经更新完毕&#xff09; 正文 Proxy是JavaScript中的一个强大而灵活…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc

【C 数据结构】栈

文章目录 【 1. 基本原理 】栈的分类 【 2. 动态链表栈 】2.1 双结构体实现2.1.0 栈的节点设计2.1.1 入栈2.1.2 出栈2.1.3 遍历2.1.4 实例 2.2 单结构体实现2.2.0 栈的节点设计2.2.1 入栈2.2.2 出栈2.2.3 实例 【 3. 顺序栈 】3.1 入栈3.2 出栈3.3 实例 【 1. 基本原理 】 栈&…

牛客网刷题 :BC50 你是天才吗

描述 据说智商140以上者称为天才&#xff0c;KiKi想知道他自己是不是天才&#xff0c;请帮他编程判断。输入一个整数表示一个人的智商&#xff0c;如果大于等于140&#xff0c;则表明他是一个天才&#xff0c;输出“Genius”。 输入描述&#xff1a; 多组输入&#xff0c;每…

【opencv】示例-videocapture_microphone.cpp 使用OpenCV库实现的音频捕获

#include <opencv2/core.hpp> // 包含OpenCV核心功能头文件 #include <opencv2/videoio.hpp> // 包含OpenCV视频输入输出头文件 #include <opencv2/highgui.hpp> // 包含OpenCV高层GUI头文件 #include <iostream> // 包含标准输入输出流头文件using na…

SS3D翻译

SS3D AbstractIntroductionRelated WorkFully-Supervised 3D Object DetectionWeakly/Semi-Supervised 3D Object DetectionSparsely-Supervised 2D Object Detection MethodOverall FrameworkArchitecture of DetectorMissing-Annotated Instance Mining Module 缺失注释实例挖…

leetcode-链表中间节点

876. 链表的中间结点 题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间…

基于STM32的RFID智能门锁系统

本文针对RFID技术&#xff0c;着重研究了基于单片机的智能门锁系统设计。首先&#xff0c;通过链接4*4按键模块与主控STM32&#xff0c;实现了多种模式&#xff0c;包括刷卡开锁、卡号权限管理、密码开锁、修改密码、显示实时时间等功能。其次&#xff0c;采用RC522模块与主控S…

GitHub登录收不到邮箱验证码

由于长时间没有登录GitHub&#xff0c;浏览器可能清除了相应的cookie信息&#xff0c;所以需要对应绑定邮箱进行验证&#xff0c;但因为邮箱长时间没有收到验证码&#xff0c;所以给到以下一种可能解决的方法&#xff1a; 需要输入验证码进行验证 我们可以打开QQ邮箱&#xff0…

Wpf 使用 Prism 实战开发Day19

待办事项功能页面完善以及优化 概要&#xff1a; 由于待办事项功能页&#xff0c;数据已正常渲染出来了。但页面新增&#xff0c;查询&#xff0c;修改&#xff0c;删除等功能还未实现。本章节来实现页面的请求后台实现CURD&#xff08;增删改查&#xff09; 一.待办事项查询…

UE5不打包启用像素流 ubuntu22.04

首先查找引擎中像素流的位置&#xff1a; zkzk-ubuntu2023:/media/zk/Data/Linux_Unreal_Engine_5.3.2$ sudo find ./ -name get_ps_servers.sh [sudo] zk 的密码&#xff1a; ./Engine/Plugins/Media/PixelStreaming/Resources/WebServers/get_ps_servers.sh然后在指定路径中…

分布式锁-redission锁的MutiLock原理

5.5 分布式锁-redission锁的MutiLock原理 为了提高redis的可用性&#xff0c;我们会搭建集群或者主从&#xff0c;现在以主从为例 此时我们去写命令&#xff0c;写在主机上&#xff0c; 主机会将数据同步给从机&#xff0c;但是假设在主机还没有来得及把数据写入到从机去的时…

Java是如何实现跨平台的

Java语言的跨平台能力是其最显著的特性之一&#xff0c;它允许开发者编写一次代码&#xff0c;然后在不同的操作系统上无需修改即可运行。。 Java通过字节码和Java虚拟机&#xff08;JVM&#xff09;实现跨平台 (图源网络) 主要依赖于以下几个关键组件&#xff1a; 字节码&am…

Visual studio项目默认“Header Files”、“Source Files”等过滤器消失后展开的方法。

使用Visual Studio进行项目开发创建默认工程的解决方案资源管理器里查看项目文件&#xff0c;所有的文件是按照其所属的类型自动归类&#xff0c;例如&#xff1a;.h头文件自动划归到Header Files文件夹&#xff0c;.cpp文件自动划归到Source Files文件夹下&#xff0c;如下图所…

小米SU7的防晒秘籍

在春日渐暖的日子里&#xff0c;夏天悄然而至。大家有没有从衣柜深处翻出夏衣和防晒装备&#xff0c;来迎接夏日阳光的“偏爱”呢&#xff1f; 深知防晒烦恼的小米&#xff0c;在小米SU7的设计中也充分考虑了汽车防晒这一痛点&#xff0c;采用前风挡三层镀银、天幕双层镀银、四…