专栏首页E条咸鱼Python-SSH日志审计

Python-SSH日志审计

日常开头先扯点什么,最近有本 内网安全攻防的书到了,质量确实不错,看着看着突然想了一下自己在进入内网机器后的一些信息收集的操作,然后就联想到了我服务器上的SSH日志上,众所周知,公网上的机器有事没事就会挨一顿扫,所以就想趁着疫情闲的发慌,整一个审计的脚本,当然说是审计,但级别还远远不够,只是更直观的来看哪些IP登录成功,哪些IP登录失败,登录失败的用户名又是什么

这个jio本呢,是用 resys两个内置库来完成的

不得不说,这个正则匹配确实是一大痛点,说是学,学了这么久也只会个 (.*?)

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

本文分享自微信公众号 - E条咸鱼(gh_04d31a502ded),作者:现在你看到我的ID了

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第二天培训小笔记

    第一次握手:建立连接,客户端发送syn包到服务器,等待确认 (SYN:同步序列编号) 第二次握手:服务器确认客户的syn包,同时自己也发送一个确认包ACK给客户...

    Elapse
  • Python资源爬取

    这个玩意之前也发过,大致用法就是输入资源名字,然后就会有一堆网盘资源跳出来了,但是讲道理,如果资源一多,那么就会很乱,所以改版了一次,用户想要哪一个的资源,就输...

    Elapse
  • RHCE培训笔记-6

    进入vim时的模式为命令行模式,在此模式中可以通过按键的一些操作来选择进入编辑模式或者末行模式

    Elapse
  • 数据结构之树-第二篇

    1、此时,将元素30从队首拿出来,进行访问,之后将30的左孩子29、右孩子42入队,那么此时队首元素就是13了。

    别先生
  • GitHub中文帮助文档上线:统一术语翻译,Fork成“分叉”

    曾经,为了能畅通的浏览/使用GitHub而努力学习英语;现在,那股动力眼看就要被浇灭了。

    新智元
  • github 合集Top 3集合列表原文:https://github.com/collections

    iOSDevLog
  • 用“弹性伸缩”需了解客户什么信息?

    很多人提到云计算,一定会说到云计算具备自动伸缩能力,会按照客户的业务负载自动伸缩,我在刚接触云计算时也这么认真。真是这样吗?没这么简单!

    希望的田野
  • 【小技巧】深度学习中的那些效率提升利器(附资源)

    深度学习炼丹,当然少不了 GPU 和 Linux 系统了,部分朋友没有 GPU 的话只能租用远程服务器来训练,这样就少不了 Xshell 这样一款利器了,以下,...

    机器视觉CV
  • 【Windows编程】系列第四篇:使用Unicode编程

    上一篇我们学习了Windows编程的文本及字体输出,在以上几篇的实例中也出现了一些带有“TEXT”的Windows宏定义,有朋友留言想了解一些ANSI和Unic...

    程序员互动联盟
  • 关于堆

    Noneplus

扫码关注云+社区

领取腾讯云代金券