短信發送接口被惡意訪問的網絡攻擊事件(三)定位惡意IP的日志分析腳本


作者:13
GitHub:https://github.com/ZHENFENG13
版權聲明:本文為原創文章,未經允許不得轉載。

前言

承接前文《短信發送接口被惡意訪問的網絡攻擊事件(二)肉搏戰-阻止惡意請求》,文中有講到一個定位非法IP的shell腳本,現在就來公布一下吧,並沒有什么技術難度,只是當時花了些時間去寫這個東西,類似於緊急修復線上bug一樣的趕這個小腳本,雖然現在看來挺簡單的,但是在當時緊張的情景中,趕這個小腳本兒的過程確實是很有趣的。

前一篇文章發布后,有朋友留言問了一下腳本的事,於是整理了一下。

shell1

shell2

需求分析

目標:

通過日志定位並記錄攻擊者的IP,然后封掉此IP的所有請求

借助工具:

  • shell腳本
  • 日志文件
  • iptables防火牆

具體步驟:

  • 第一步,首先是獲取請求了被攻擊URL的所有請求中的IP,因為被攻擊的URL只有一個,這里的做法是通過grep命令查找請求了此URL的日志行,查找的值為api地址的名稱字段,比如此URL的地址為'/message/send/',而send字段只存在於此URL中,因此在日志文件中查找包含'send'字段的行即可。

  • 第二步是從所有的行中提取出IP列,統計出所有出現的IP和此IP請求接口URL的次數,存入ip.txt文件。

  • 接着第三步是通過對ip.txt文件的分析,定位出所有的不正常的IP,分析的比較簡陋,做法是請求超過5次的都視為非法IP,其實5次已經算多的了,應該再小一點,但是其實在分析文件ip.txt文件過程中,發現正常的IP訪問次數基本為一次、兩次,而非法IP則為百次或千次,因此閾值設置為5或者3並沒有大的影響,重點是找出訪問量較大的一些IP。

  • 最后一步,得到這些IP值之后,將其加入到iptables的過濾策略中並重啟iptables即可。

腳本代碼

一開始的腳本,能夠根據需求統計和記錄出訪問過多的IP地址了:

#! /bin/bash

#author:13
#date:2017-06
#desc:找出攻擊者IP

cat /opt/sms-service/logs/access_log.log | awk '{print $1}'|sort|uniq -c|awk '{print $2"="$1;}' > /opt/sms-service/logs/ip.txt

DEFINE="5"

for i in `cat  /opt/sms-service/logs/ip.txt`
do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
if [ $NUM -gt $DEFINE ];then
grep $IP /opt/sms-service/logs/black.txt > /dev/null
      if [ $? -gt 0 ];then
        echo "iptables -I INPUT -s $IP -j DROP" >> /opt/sms-service/logs/black.txt
      fi
    fi
done

后面又對腳本做了一些小改動,改進點有:

  • 對文件路徑進行參數命名,使得代碼不是特別臃腫;
  • 增加一條判斷條件,判斷IP是否已經存在於iptables配置文件中,剔除已經統計和記錄過的IP。
#! /bin/bash

#author:13
#date:2017-06
#desc:找出攻擊者IP

LOGFILE="/opt/sms-service/logs/access_log.log"
IPTXT="/opt/sms-service/logs/ip.txt"
BLACKTXT="/opt/sms-service/logs/black.txt"
IPTABLES="/opt/iptables/run.sh"
DEFINE="5"

cat $LOGFILE|awk '{print $1}'|sort|uniq -c|awk '{print $2"="$1;}' > $IPTXT

for i in `cat  $IPTXT`
do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
if [ $NUM -gt $DEFINE ];then
grep $IP $BLACKTXT > /dev/null
      if [ $? -gt 0 ];then
        grep $IP $IPTABLES > /dev/null
        if [ $? -gt 0 ];then
        echo "iptables -I INPUT -s $IP -j DROP" >> $BLACKTXT
        fi
      fi
    fi
done

總結

首發於我的個人博客,地址在這里

最近工作也比較忙,本來不打算寫這篇文章的,前一篇文章發布后看到有朋友留言了,因此在下班后抽出一段時間完成了這篇文章,文中並沒有特別難的知識點,希望有所收獲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM