我的日志分析之道:简单的Web日志分析脚本

网友投稿 947 2023-03-11

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

我的日志分析之道:简单的Web日志分析脚本

前言

长话短说,事情的起因是这样的,由于工作原因需要分析网站日志,服务器是windows,iis日志,在网上找了找,github找了找,居然没找到,看来只有自己动手丰衣足食。

那么分析方法我大致可分为三种:

1. 基于时间:将请求url按时间段分类,那么我们根据每个时间段的url数量及攻击数量就可以大致判断出哪个时间段有apt类型攻击,哪个时间段是扫描器行为;

2. 基于攻击ip:正常的攻击肯定会有请求被记录(当然你要是有0day当我没说,正常的探测总会有吧=。=!),然后每个ip去分析;

3. 基于访问请求的状态码,也大致可以判断出行为。

规则可以基于开源waf规则,分析扫描器写正则也可以,开源waf地址是

Sql语句里面有想把它做的功能全一些,但是学python学习时间也不是很长,写出来的代码也没有pythonic,会慢慢写的。目前分三个模块,一个日志归类模块命名为url.py,攻击分析模块attac.py, ip地理位置查询模块ipfind.py,还有一个主函数。

日志归类模块url.py

import reimport osimport sysfrom datetime import datetimedt = 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('>>>>>>>开始分析urlip访问量')    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('>>>>>urlip分析完毕.......')    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:            f.write(str(list(i))+'\n')    with open(urlname,'w') as f:        for i in urllist:            f.write(str(list(i))+'\n')    print('>>>>>>>分析结果保存完毕')find_log()[iplist,urllist] = count(iplist,urllist)save_count()

import reimport osimport sysfrom datetime import datetimedt = 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:            f.write(str(list(i))+'\n')    with open(urlname,'w') as f:        for i in urllist:            f.write(str(list(i))+'\n')    print('>>>>>>>分析结果保存完毕')find_log()[iplist,urllist] = count(iplist,urllist)save_count()

iis日志和apache日志觉得都差不多,就是切割时候改一下就行了。

Iis日志大概是这样的,用pythonreadlines然后切割出来就好了。

这个url.py我加了个功能把ip访问量及url访问量排序输出出来所以有点慢,=.=没办法野路子哪里会什么算法。将地址,时间,ip,状态码都扔进一个列表里就行了。

攻击分析模块attack.py

IP地理位置查询模块ipfind.py

Ipfind.py是查找ip地理位置的

主函数

主函数main.py

import reimport osimport sysfrom datetime import datetimeimport urlimport attackimport ipfindneedlist = url.needlistsqllist,xsslist,senlist = [],[],[]otherurl,iplist = [],[][xssip,sqlip,senip,sqllist,xsslist,senlist,otherurl]=attack.find_attack(needlist)xssip = list(set(xssip))sqlip = list(set(sqlip))senip = list(set(senip))print('>>>>>>>检测出xss攻击'+str(len(xsslist))+''+'共计'+str(len(xssip))+'ip')print(xssip)print('>>>>>>>检测出sql攻击'+str(len(sqllist))+''+'共计'+str(len(sqlip))+'ip')print(sqlip)print('>>>>>>>检测出敏感目录扫描'+str(len(senlist))+''+'共计'+str(len(senip))+'ip')print(senip)iplist = list(set(xssip+sqlip+senip))print(len(iplist))print('开始分析ip地理位置')for i in iplist:    ipfind.find_ipaddrs(str(i))

import reimport osimport sysfrom datetime import datetimeimport urlimport attackimport ipfindneedlist = url.needlistsqllist,xsslist,senlist = [],[],[]otherurl,iplist = [],[][xssip,sqlip,senip,sqllist,xsslist,senlist,otherurl]=attack.find_attack(needlist)xssip = list(set(xssip))sqlip = list(set(sqlip))senip = list(set(senip))print('>>>>>>>检测出xss攻击'+str(len(xsslist))+'次'+'共计'+str(len(xssip))+'个ip')print(xssip)print('>>>>>>>检测出sql攻击'+str(len(sqllist))+'次'+'共计'+str(len(sqlip))+'个ip')print(sqlip)print('>>>>>>>检测出敏感目录扫描'+str(len(senlist))+'次'+'共计'+str(len(senip))+'个ip')print(senip)iplist = list(set(xssip+sqlip+senip))print(len(iplist))print('开始分析ip地理位置')for i in iplist:    ipfind.find_ipaddrs(str(i))

要分析什么就把需要分析的和main.py放在一个目录下就行了

总结

脚本大概说了一遍,说说不足及怎么分析吧。

还有好多攻击类型没有加入到里面,后期打算把判断攻击类型写成函数,拿if,else判断,类型少还可以,类型多了感觉很容易乱,还有user-agent的收集与判断(虽然大多数扫描器都能改user-agent)。

具体分析:我都是用脚本跑一遍,然后按ip来看会比较方便些,而这里缺少机器识别,我单独写了一个简易的机器识别的东西,其实要实现很简单,把全部日志按时间,url,ip扔进一个列表里统计一下相同时间相同ip的就可以了。我写的是识别短信轰炸的,后期还会渐渐的完善,如果有能力就把它结合django来弄成图形化,毕竟脚本始终是脚本,终究听着不好听。

效果如下

具体规则有待完善。

上一篇:360 如何用 QConf 搞定 2W+ 服务器的配置管理
下一篇:用Shell脚本分析Nginx日志
相关文章

 发表评论

暂时没有评论,来抢沙发吧~