前言
长话短说,事情的起因是这样的,由于工作原因需要分析网站日志,服务器是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