前言
長話短說,事情的起因是這樣的,由於工作原因需要分析網站日志,服務器是windows,iis日志,在網上找了找,github找了找,居然沒找到,看來只有自己動手豐衣足食。
那么分析方法我大致可分為三種:
1. 基於時間:將請求url按時間段分類,那么我們根據每個時間段的url數量及攻擊數量就可以大致判斷出哪個時間段有apt類型攻擊,哪個時間段是掃描器行為;
2. 基於攻擊ip:正常的攻擊肯定會有請求被記錄(當然你要是有0day當我沒說,正常的探測總會有吧=。=!),然后每個ip去分析;
3. 基於訪問請求的狀態碼,也大致可以判斷出行為。
規則可以基於開源waf規則,分析掃描器寫正則也可以,開源waf地址是
https://github.com/loveshell/ngx_lua_waf/tree/master/wafconf。
掃描器正則https://github.com/smarttang/w3a_SOCD的database里面有詳細地址
https://github.com/smarttang/w3a_SOC/tree/master/db_sql。
Sql語句里面有想把它做的功能全一些,但是學python學習時間也不是很長,寫出來的代碼也沒有pythonic,會慢慢寫的。目前分三個模塊,一個日志歸類模塊命名為url.py,攻擊分析模塊attac.py, ip地理位置查詢模塊ipfind.py,還有一個主函數。
日志歸類模塊url.py
import re
import os
import sys
from datetime import datetime
dt = datetime.now()
date = str(dt.date())
loglist = [] #
iplist = [] # ip統計
urllist = [] # url統計列表
needlist = [] # 需要統計的
errorlist = [] # 格式錯誤的列表
ipdict,urldict = {},{}
rizhi = str(input('請輸入要分析的日志文件名'))
def find_log():
print('>>>>>>>開始解析日志')
with open(rizhi,'r',encoding='UTF-8',errors='ignore') as f:
#loglist = f.readlines()
for i in f.readlines(): #
if i[0] != '#':
b = re.split(' ',i)
iplist.append(b[10])
urllist.append(b[6])
try:
needlist.append([b[10],b[1],b[5],b[6],b[15]])
except:
errorlist.append(i)
print('>>>>>>>日志解析完畢')
def count(iplist,urllist): #統計ip url訪問量函數
print('>>>>>>>開始分析url與ip訪問量')
global ipdict,urldict
for i in set(iplist):
ipdict[i] = iplist.count(i)
for i in set(urllist):
urldict[i] = urllist.count(i)
ipdict = sorted(ipdict.items(),key=lambda d: d[1], reverse=True)
urldict = sorted(urldict.items(),key=lambda d: d[1], reverse=True)
print(type(urldict))
iplist = list(ipdict)
urllist = list(urldict)
ipdict,urldict = {},{}
print('>>>>>url與ip分析完畢.......')
return [iplist,urllist]
def save_count():
print('>>>>>>>正在保存分析結果')
ipname = 'ip-'+date+'.txt'
urlname = 'url-'+date+'.txt'
with open(ipname,'w') as f:
for i in iplist: