Python-SSH日志审计
时间:2022-07-23
本文章向大家介绍Python-SSH日志审计,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
日常开头先扯点什么,最近有本 内网安全攻防
的书到了,质量确实不错,看着看着突然想了一下自己在进入内网机器后的一些信息收集的操作,然后就联想到了我服务器上的SSH日志上,众所周知,公网上的机器有事没事就会挨一顿扫,所以就想趁着疫情闲的发慌,整一个审计的脚本,当然说是审计,但级别还远远不够,只是更直观的来看哪些IP登录成功,哪些IP登录失败,登录失败的用户名又是什么
这个jio本呢,是用 re
和 sys
两个内置库来完成的
不得不说,这个正则匹配确实是一大痛点,说是学,学了这么久也只会个 (.*?)
,
sys
库主要是用来获取文件名的,文件名你也可以用str(input())来获取,不是非得用这个方法,但看起来确实牛批多了
import re
import sys
#获取文件名
filename = sys.argv[1]
解释一下,SSH日志中,记录登录失败和成功
SSH日志文件,一般都存在 /var/log
目录下,我是 Ubuntu
系统,文件名叫做 auth.log
登录失败是有分两种情况
- 已有的用户名登录,但是密码错误
- 无效的用户名登录
第二种情况很明显,就是公网里有人在尝试SSH用户名爆破,这种报错呢,记录在SSH日志中,是长这个样的
Feb 16 18:26:21 xxxxx sshd[20958]: Failed password for invalid user admina from xx.xx.xx.xx port 57609 ssh2
无效的用户 admina
第一种情况的话,记录的内容差不多,只不过没有 invalid user
我们先建立两个空数组,用来储存成功、失败后的记录
...
success_record=[]
failed_record=[]
接着利用 re
来一条一条的匹配SSH日志内容
...
def search(filename):
global success_record,failed_record #全局变量
pattern=re.compile(r': (.*?) password for (.*?) from (.*?) port (d+)') #正则规则
file=open(filename,'r') #打开文件
for i in file:
check_login=pattern.search(i) # 正则匹配
if check_login: # 检查是否匹配到内容,如果没有就下一条
if check_login.group(1)=="Accepted": # 成功登录
#这里的.group(0)是原文,.group(2)为用户名,.group(3)为登录的IP地址,.group(4)为对方的端口
success_record.append([check_login.group(2),check_login.group(3),check_login.group(4)])
elif check_login.group(1)=="Failed": # 失败登录
if "invalid user" in check_login.group(2): #用户名会因为黑客测试无效用户而变得多余,所以删掉多余的部分
failed_record.append([check_login.group(2)[13:],check_login.group(3),check_login.group(4)])
else:
failed_record.append([check_login.group(2),check_login.group(3),check_login.group(4)])
else:
continue
一轮for循环后,成功和失败的结果都保存下来了,然后将结果统一输出就好了
...
def printdata():
global success_record,failed_record
if success_record: #先判断是否存在内容
print("[+] 已找到成功的记录"+str(len(success_record))+"条")
for i in success_record:
print(" 用户名: "+i[0]+" 登录IP: "+i[1]+" 连接端口: "+i[2])
else:
print("[-] 无SSH登录成功的记录...")
if failed_record:
print("n[+] 已找到失败的记录"+str(len(failed_record))+"条")
for i in failed_record:
print(" 用户名: "+i[0]+" 登录IP: "+i[1]+" 连接端口: "+i[2])
else:
print("n[-] 无SSH登录失败的记录...")
写完后,调用即可
...
search(filename)
printdata()
运行后的效果是这样的
github链接:
> https://github.com/Ernket/SSH-log-audit
- 2017.10.2解题报告
- MVC 5 Scaffolder + EntityFramework+UnitOfWork Pattern 代码生成工具集成Visual Studio 2013
- 左手用R右手Python系列——百度地图API调用与地址解析/逆解析
- OpenCV实战:人脸关键点检测(FaceMark)
- Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)
- 模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板
- 洛谷P1311 选择客栈
- 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle
- R语言抓包实战——知乎live二级页面获取
- 左手用R右手Python系列——面向对象编程基础
- 线性同余同余方程组解法(excrt)
- #19. 计数(容斥原理)
- 左手用R右手Python系列——多进程/线程数据抓取与网页请求
- #15. 钻石
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【matplotlib】绘制散点图
- LeetCode刷题心得 -- map的妙用
- 2015javaB组第五题表格计算
- 【线性回归】读取txt
- 走近STL - Vector,再次见面
- 【线性回归】标准方程法
- 133: error: in C++98 XXX must be initialized by constructor, not by '{...}'
- spring之如何将验证错误信息显示在相应界面
- 【python-leetcode329-深度优先搜索】矩阵中的最长递增路径
- 带权树 -- 哈夫曼树,与它的那张哈夫曼编码表
- 【python-动态规划】0-1背包问题
- python之列表推导和生成器表达式
- 二叉树的前中后序遍历
- 【tensorflow2.0】处理结构化数据-titanic生存预测
- 【pandas】pandas中的常见函数