首页 > 代码库 > deny.sh

deny.sh

脚本目的:自动捕捉锁定恶意链接的ip,将其加入到hosts.deny

思路:运用命令lastb找出近期拒绝的访问,过滤出其ip位,用输出重定向加入到/hosts.deny

     设置自动运行。

编写过程发现问题:

1.  使用lastb时会发现lastb的输出会有首行和空白

为将其滤除,所以选择用grep命令只将带有IP段的行过滤出

lastb | grep‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}‘

spacer.gif

发现IP段在第三段,使用cat会发现,cat 只能分割单个空格,而无法分割连续的空格,所以选择awk命令:lastb | grep‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}‘ | awk ‘{print $3}‘

spacer.gif

因为一般弱口令攻击会攻击多次,所以同ip会重复出现,这里使用sort –u来过滤掉重复显示的iplastb | grep‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}‘ | awk ‘{print $3}‘ |sort -u

spacer.gif

这样我们就锁定了访问失败的ip了,接下来就是写脚本,把这个ip加入到hosts.deny

#! /bin/bash

 

while [ "1" > "0" ]

do

       txt=$(lastb | grep‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}‘ | awk ‘{print $3}‘ |sort -u)

       file=‘/etc/hosts.deny‘

       for ip in $txt

       do

                        echo "sshd:     $ip" >> $file    

       done

sleep 120s

done

这样每两分钟写入一次,可是会造成相同ip多次重复写入的问题,这样又需要有一个查询捕捉的ip是否已经存在于hosts.deny的步骤:

grep $ip $file >> /dev/null

       if [ "$?" != "0" ] ; then

                  echo "sshd:     $ip" >> $file

        fi

这样整合的脚本为:

#! /bin/bash

 

while [ "1" > "0" ]

do

       txt=$(lastb | grep‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}‘ | awk ‘{print $3}‘ |sort -u)

       file=‘txt.txt‘

       for ip in $txt

       do

       grep $ip $file >> /dev/null

                if [ "$?" !="0" ] ; then

                        echo "sshd:     $ip" >> $file

                fi

       done

sleep 120s

done

基本可以实现拒绝访问失败的ip继续访问,可是,当管理员误操作登陆失败时也会把管理员禁掉,还有现实使用中,也许黑客用来访问的不是ip而是域名,针对以上问题设计了以下脚本(远鹏出品,嘿嘿)

#!/bin/bash

#Prevent SSH attack

#Author:Li Yuanpeng

#V1.0

#Date:20140806

 

SLEEPTIME=30

 

while true 

 do

   lastb -n 500| grep -v "^$" | grep -v "btmp" | awk‘{print $3}‘ | sort | uniq -c  | grep -v"172.16.1.51" |sort -nr > attack.log  #读取攻击IP 并以攻击次数排序(过滤管理机IP)

 while read line 

   do

 IP=`echo $line | awk ‘{print $2}‘ `

 TIME=`echo $line | awk ‘{print $1}‘ `

 if ["$TIME" -gt 5 ];then

  grep "$IP" /etc/hosts.deny &> /dev/null     

  if[ "$?" -ne "0" ]; then

  echo "sshd: $IP" >> /etc/hosts.deny

  fi

fi  

 done < attack.log

/bin/sleep $SLEEPTIME

done


deny.sh