简介
日志文件可以收集系统状态以及攻击者的详细信息。假设我们有一个能够通过SSH连接到Internet的系统。很多攻击者试图登入这个系统。我们需要设计一个入侵检测系统来识别登录失败的那些用户。出现这种行为的用户可能是采用字典攻击的骇客。这样的脚本应该生成包含以下细节信息的报告:
❏ 登录失败的用户;
❏ 尝试登录的次数;
❏ 攻击者的IP地址;
❏ IP地址所对应的主机名;
❏ 登录行为发生的时间。
编写脚本
我们可以编写一个shell脚本,对日志文件进行扫描并从中采集所需要的信息。登录细节都记录在/var/log/auth.log或/var/log/secure中。脚本从日志文件中找出失败的登录记录并进行分析。host命令可以用来将IP地址映射为主机名。
检测脚本如下:
#!/bin/bash
#Filename: intruder_detect.sh
#Description: Intruder reporting tool with auth.log input
AUTHLOG=/var/log/auth.log
if [[ -n $1 ]];
then
AUTHLOG=$1
echo Using Log file : $AUTHLOG
fi
# Collect the failed login attempts
LOG=/tmp/failed.$$.log
grep "Failed pass" $AUTHLOG > $LOG
# extract the users who failed
users=$(cat $LOG | awk '{ print $(NF-5) }' | sort | uniq)
# extract the IP Addresses of failed attempts
ip_list="$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" $LOG | sort | uniq)"
printf "%-10s|%-3s|%-16s|%-33s|%s\n" "User" "Attempts" "IP address"\ "Host" "Time range"
# Loop through IPs and Users who failed.
for ip in $ip_list;
do
for user in $users;
do
# Count attempts by this user from this IP
attempts=`grep $ip $LOG | grep " $user " | wc -l`
if [ $attempts -ne 0 ]
then
first_time=`grep $ip $LOG | grep " $user " | head -1 | cut -c-16`
time="$first_time"
if [ $attempts -gt 1 ]
then
last_time=`grep $ip $LOG | grep " $user " | tail -1 | cut -c-16`
time="$first_time -> $last_time"
fi
HOST=$(host $ip 8.8.8.8 | tail -1 | awk '{ print $NF }' )
printf "%-10s|%-3s|%-16s|%-33s|%-s\n" "$user" "$attempts" "$ip"\ "$HOST" "$time";
fi
done
done
rm $LOG
脚本解析
脚本intruder_detect.sh默认使用/var/log/auth.log作为输入。另外也可以用命令行参数来提供指定的日志文件。失败的登录记录被收集并存入临时文件中,以减少处理量。如果登录失败,SSH会记录类似于下面的日志信息:
脚本会利用grep命令找出含有字符串Failed passw的行,然后将其入/tmp/failed.$$.log中。
下一步是提取出登录失败的用户。awk命令提取出倒数第5个字段(用户名),通过管道将其传给sort和uniq,生成一个用户列表。
接下来,利用正则表达式和egrep命令提取出不重复的IP地址。嵌套的for循环对所有的IP地址及用户名进行迭代,提取出每个IP地址与用户名的组合。如果某个IP/User(IP/用户名)组合尝试登录的次数大于0,使用grep、head和cut命令提取出第一次登录的时间。
如果尝试登录的次数大于1,则使用tail提取出最后一次登录的时间。尝试登录的详细信息通过printf命令进行格式化并输出。
最后,删除用到的临时文件。