技术分享:如何编写自己的Web日志分析脚本?

标签: WEB安全 web日志 日志审计 自动化脚本 | 发表时间:2016-02-24 15:09 | 作者:鬼魅羊羔
出处:http://www.freebuf.com

*原创作者:鬼魅羊羔

因为平时总是接触Web日志,但是苦于Web日志量大,windows下无法直接打开,linux下又得一个一个的去找,太麻烦,算是偷懒,第一次用shell命令写这个分析脚本,边写边改整理了将近1个星期,肯定不如有UI界面的好,但是作为一个Web日志分析小工具来说,也不是一无是处,各位看官也可以给点意见,可以一起帮忙完善这个脚本。

nginx中间件分析脚本   http://pan.baidu.com/s/1sjX33Hj 

Web中间件分析脚本       http://pan.baidu.com/s/1o74J2GU

自动分析中间件日志,通过从Web日志中,找出存在的SQL注入、XSS脚本攻击等攻击行为,进行筛选。

Web中间件分析脚本:目前仅支持IIS、apache、weblogic中间件

nginx中间件分析脚本:只支持nginx中间件

新加入了针对getshell、敏感文件、以及LFI文件包含攻击的HTTP响应码200和500的分析。并在屏幕输出时,显示每个攻击类型中,出现频率最多的前20个IP地址,并对攻击出现的次数进行统计。

整体脚本的思路:读取日志——->定义攻击特征—–>输出匹配到的含有攻击特征的记录——->输出

日志拷贝回来了,要解决的第一个问题就是读取,apahce日志命名格式为access.log、access_+时间戳。例如:access_2015-04-14.log,而weblogic日志,则是access.log+时间戳(access.log00914)。apache日志、weblog日志的共同点,就是都有access特征字符,知道了特征字符,就比较方便批量读取了。

一、读取文件

按照上面的思路,先解决读取问题。这里我用了判断语句,起初我是想写出类似于  access=more /usr/access*.*,将这个路径全部加到变量里,方便判断,因为在shell里,只能将固定文件、文件夹作为变量,变量中不能加*号(我是没找到别的方法,有知道大牛请提点下小弟),所以就想了个笨办法,用匹配关键词的方式来判断特定目录下,是apache日志,还是weblogic日志,还是IIS日志,具体判断方法如下:

  if ls -l /usr/ | egrep "access";then
more /usr/access*.* | egrep "多个关键词"
else
more /usr/ex*.log  | egrep “多个关键词”
fi   

这样的方式来进行判断,但是这样判断有个缺点,就是中间件日志在/usr/目录下,只能存在一种,比如同时存在apache和IIS的日志,就会优先判断apache的,进而不会执行IIS日志分析的语句。而且,为了不跟之前的历史数据混乱,在脚本执行开始,清空了下数据。

  file=/usr/nmgxy/
if [ -e "$file" ];then 
echo "日志目录存在,跳过创建过程,该操作会清空/usr/nmgxy/目录下所有数据"
echo "按回车键开始清空数据,结束请点击Ctrl+c"
read key
rm -r /usr/nmgxy/*
mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
else
mkdir -p /usr/nmgxy/ /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
fi
echo "分析结果日志保存在/usr/nmgxy/目录下"
echo ---------------------日志目标文件---------------------------
if ls -l /usr/ | egrep "access";then
echo --------------------统计出现次数最多的前20个IP地址-----------------
cat /usr/access*.* |awk '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/top20.log
echo "统计完成"   

二、定义攻击特征

日志读取的问题解决了,接下来就是定义攻击特征的事儿了,攻击特征比较好定义。例如,SQL注入攻击的判断:

  echo ------------------------SQL注入攻击sql.log----------------
echo "开始分析存在SQL注入的攻击行为,并将结果保存在/usr/nmgxy/sql/目录下"
more /usr/access*.* |egrep "%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec| information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema" >/usr/nmgxy/sql/sql.log
echo "分析结束"
awk '{print "共检测到SQL注入攻击" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1
echo "开始统计SQL注入攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "统计结束"   

我把一些常见的SQL注入攻击的特征写到了里面,去掉了MSSQL数据库存储过程以及MSSQL数据库才会出现的一些注入语句。

三、输出匹配到的含有攻击特征的记录

将匹配到的攻击特征内容,重新输出到了另外一个log里面,相当于做了一次筛选/usr/nmgxy/sql/sql.log

  more /usr/access*.* |egrep "%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec| information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema" >/usr/nmgxy/sql/sql.log    

然后二次分析这个筛选过的文件,统计SQL注入攻击出现的次数

  awk '{print "共检测到SQL注入攻击" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1    

输出完毕后,将攻击出现最多的前20个IP地址进行统计并显示到屏幕上

  echo "开始统计SQL注入攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "统计结束"   

四、输出结果

这个在代码开头,创建了一些文件夹,用来存放筛选过的记录

  mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/   

中间删删改改折腾了好几次。后来针对特定的攻击,我们比较关注(重点是比较好写的= =)的内容做了HTTP响应请求200/500的判断,并输出结果。

  echo -------------------------getshell-getshell.log----------------
echo "开始分析存在getshell的攻击行为,并将结果保存在/usr/nmgxy/getshell/目录下"
more /usr/access*.* |egrep " eval|%eval|%execute|%3binsert|%20makewebtaski%20|/div.asp|/1.asp|/1.jsp|/1.php|/1.aspx|xiaoma.jsp|tom.jsp|py.jsp|k8cmd.jsp|/k8cmd|ver007.jsp|ver008.jsp|ver007|ver008|%if|\.aar" >>/usr/nmgxy/getshell/getshell.log
echo "分析结束"
echo "二次分析结果中HTTP响应码为200和500,结果另存为/usr/nmgxy/getshell/ok.log"
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=200) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}' >/usr/nmgxy/getshell/ok.log
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}' >>/usr/nmgxy/getshell/ok.log
echo "二次分析结束"
awk '{print "共检测到getshell行为" NR "次"}' /usr/nmgxy/getshell/getshell.log|tail -n1
echo "开始统计漏洞利用攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/getshell/getshell.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/getshell/top20.log
echo ---------------------------------------------------------------
more /usr/nmgxy/getshell/top20.log
echo "统计结束"   

统计HTTP响应状态,IIS和apache有点区别。apache我以默认空格为分隔符,判断第9个分隔符是否为200或500,如果等于,则输出全部内容

  more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}'     

而IIS的,我则是用获取关键词的方式,来进行判断。

  more /usr/nmgxy/getshell/getshell.log | egrep " 200" >/usr/nmgxy/getshell/ok.log    

用egrep的方式,关键词为" 200",200前面有个空格,如果不加空格的话,很容易跟其他的参数混起来,那个时候误报就不是一点点了。例如asp?id=200,所以加入了空格做区分。

IIS和nginx的思路类似,唯一的区别就是特征码,稍微有点改动而已,这个就不一一例举了。思路就是这个思路,其实后期想把报告整体输出成HTML的方式,估计工作量挺大,这个还是得闲下来的时候,慢慢修改吧。

PS:这个脚本虽然写的比较粗糙,但是精确度还是有的,测试了几十次,精确度能达到至少80%以上。

分析1个多G的日志文件,需要大致约30多秒左右,我是在虚拟机里做的测试。虚拟机ubuntu系统,1G的内存。

不见得能帮上大忙,至少可以给大家在分析日志时节省点时间。。。。

先贴出apache、weblogic、IIS的脚本代码,weblogic的从网盘直接下载就好。apache、weblogic、IIS的脚本代码:

  #!/bin/bash
echo "                       "
echo "( what are you doing? )"
echo  ---------------------
echo "      o   ^__^ "
echo "       o  (oo)\_______"
echo "          (__)\       )\/\ "
echo "              ||----w |    "  
echo "              ||     ||    "
echo 
echo "...."中间件日志分析脚本v2.0"..."
echo ------------------------------------------------------------
echo "自动分析中间件日志,并将日志中存在的SQL注入、XSS脚本攻击等攻击行为筛选出来"
echo "本脚本目前仅支持IIS、apache、weblogic中间件"
echo "新加入了针对getshell、敏感文件、以及LFI文件包含攻击的HTTP响应码200和500的分析"
echo "执行脚本之前,请将要分析的日志拷贝到/usr/目录下"
echo ----------------------按回车开始分析---------------------------
read key
file=/usr/nmgxy/
if [ -e "$file" ];then 
echo "日志目录存在,跳过创建过程,该操作会清空/usr/nmgxy/目录下所有数据"
echo "按回车键开始清空数据,结束请点击Ctrl+c"
read key
rm -r /usr/nmgxy/*
mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
else
mkdir -p /usr/nmgxy/ /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
fi
echo "分析结果日志保存在/usr/nmgxy/目录下"
echo ---------------------日志目标文件---------------------------
if ls -l /usr/ | egrep "access";then
echo --------------------统计出现次数最多的前20个IP地址-----------------
cat /usr/access*.* |awk '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/top20.log
echo "统计完成"
echo ------------------------SQL注入攻击sql.log----------------
echo "开始分析存在SQL注入的攻击行为,并将结果保存在/usr/nmgxy/sql/目录下"
more /usr/access*.* |egrep "%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec| information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema" >/usr/nmgxy/sql/sql.log
echo "分析结束"
awk '{print "共检测到SQL注入攻击" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1
echo "开始统计SQL注入攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "统计结束"
echo -------------------------扫描器scan.log-------------------
echo "开始分析存在扫描的攻击行为,并将结果保存在/usr/nmgxy/scan/目录下"
more /usr/access*.* |egrep "sqlmap|acunetix|Netsparker|nmap|HEAD" >/usr/nmgxy/scan/scan.log
echo "分析结束"
awk '{print "共检测到扫描攻击" NR"次"}' /usr/nmgxy/scan/scan.log|tail -n1
echo "开始统计扫描攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/scan/scan.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/scan/top20.log
echo ---------------------------------------------------------------
more /usr/nmgxy/scan/top20.log
echo "统计结束"
echo -------------------------敏感文件扫描dir.log-------------------
echo "开始分析存在扫描的攻击行为,并将结果保存在/usr/nmgxy/dir/目录下"
more /usr/access*.* |egrep "\.zip|\.rar|\.mdb|\.inc|\.sql|\.config|\.bak|/login.inc.php|/.svn/|/mysql/|config.inc.php|\.bak|wwwroot|网站备份|/gf_admin/|/DataBackup/|/Web.config|/web.config|/1.txt|/test.txt" >/usr/nmgxy/dir/dir.log
echo "分析结束"
echo "二次分析结果中HTTP响应码为200和500,结果另存为/usr/nmgxy/dir/ok.log"
more /usr/nmgxy/dir/dir.log | awk '{if($9=200) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}' >/usr/nmgxy/dir/ok.log
more /usr/nmgxy/dir/dir.log | awk '{if($9=500) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}' >>/usr/nmgxy/dir/ok.log
echo "二次分析结束"
awk '{print "共检测到针对敏感文件扫描" NR"次"}' /usr/nmgxy/dir/dir.log|tail -n1
echo "开始统计敏感文件扫描事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/dir/dir.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/dir/top20.log
echo ---------------------------------------------------------------
more /usr/nmgxy/dir/top20.log
echo "统计结束"
echo -------------------------漏洞利用exp.log-------------------
echo "开始分析存在漏洞利用的攻击行为,并将结果保存在/usr/nmgxy/exp/目录下"
more /usr/access*.* |egrep "struts|jmx-console|ajax_membergroup.php|iis.txt|phpMyAdmin|getWriter|dirContext|phpmyadmin|acunetix.txt|/e/|/SouthidcEditor/|/DatePicker/" >/usr/nmgxy/exp/exp.log
echo "分析结束"
awk '{print "共检测到漏洞利用" NR"次"}' /usr/nmgxy/exp/exp.log|tail -n1
echo "开始统计漏洞利用攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/exp/exp.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/exp/top20.log
echo ---------------------------------------------------------------
cat /usr/nmgxy/exp/top20.log
echo "统计结束"
echo -------------------------文件包含LFI.log--------------------
echo "开始分析存在利用文件包含漏洞的攻击行为,并将结果保存在/usr/nmgxy/LFI/目录下"
more /usr/access*.* |egrep "/passwd|%00|/win.ini|/my.ini|/MetaBase.xml|/ServUDaemon.ini|cmd.exe" >/usr/nmgxy/LFI/LFI.log
echo "分析结束"
echo "二次分析结果中HTTP响应码为200和500,结果另存为/usr/nmgxy/LFI/ok.log"
more /usr/nmgxy/LFI/LFI.log | awk '{if($9=200) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}' >/usr/nmgxy/LFI/ok.log
more /usr/nmgxy/LFI/LFI.log | awk '{if($9=500) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}' >>/usr/nmgxy/LFI/ok.log
echo "二次分析结束"
awk '{print "共检测到LFI本地文件包含" NR"次"}' /usr/nmgxy/LFI/LFI.log|tail -n1
echo "开始统计漏洞利用攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/LFI/LFI.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/LFI/top20.log
echo ---------------------------------------------------------------
more /usr/nmgxy/LFI/top20.log
echo "统计结束"
echo -------------------------getshell-getshell.log----------------
echo "开始分析存在getshell的攻击行为,并将结果保存在/usr/nmgxy/getshell/目录下"
more /usr/access*.* |egrep " eval|%eval|%execute|%3binsert|%20makewebtaski%20|/div.asp|/1.asp|/1.jsp|/1.php|/1.aspx|xiaoma.jsp|tom.jsp|py.jsp|k8cmd.jsp|/k8cmd|ver007.jsp|ver008.jsp|ver007|ver008|%if|\.aar" >>/usr/nmgxy/getshell/getshell.log
echo "分析结束"
echo "二次分析结果中HTTP响应码为200和500,结果另存为/usr/nmgxy/getshell/ok.log"
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=200) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}' >/usr/nmgxy/getshell/ok.log
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}' >>/usr/nmgxy/getshell/ok.log
echo "二次分析结束"
awk '{print "共检测到getshell行为" NR "次"}' /usr/nmgxy/getshell/getshell.log|tail -n1
echo "开始统计漏洞利用攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/getshell/getshell.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/getshell/top20.log
echo ---------------------------------------------------------------
more /usr/nmgxy/getshell/top20.log
echo "统计结束"
echo -------------------------xss跨站脚本攻击xss.log--------------------
echo "开始分析存在XSS跨站脚本攻击的攻击行为,并将结果保存在/usr/nmgxy/xss/目录下"
more /usr/access*.* |egrep "

相关 [技术 分享 web] 推荐:

技术分享:如何编写自己的Web日志分析脚本?

- - FreeBuf.COM | 关注黑客与极客
因为平时总是接触Web日志,但是苦于Web日志量大,windows下无法直接打开,linux下又得一个一个的去找,太麻烦,算是偷懒,第一次用shell命令写这个分析脚本,边写边改整理了将近1个星期,肯定不如有UI界面的好,但是作为一个Web日志分析小工具来说,也不是一无是处,各位看官也可以给点意见,可以一起帮忙完善这个脚本.

[Web] 連結分享

- yasy - 網站製作學習誌
关于做PHP扩展开发的一些资源. 我对PHP5.4的一个改进. schema-database – 查詢結果與 PDO::FETCH_CLASS. 讓AJAX動態內容支援瀏覽器回上頁功能. LESS介紹及其與Sass的差異. 網頁設計該用哪種字級單位:px、em或rem. IE10将增强对HTML5和CSS3的支持.

Web技术整理

- Gabriel - 博客园-首页原创精华区
  Web技术或许是将来最为热门的技术之一. 这里略作一些总结,以及对各种Web技术作一些概要性介绍. (以下内容建立在我的粗略理解之上,欢迎指正).   推荐个学习Web技术比较好的网站,介绍的比较全面.   页面的展示使用超文本标记语言(HTML)来表示. 这是一种标签语言,本身不具有执行能力,只是结构化页面内容.

当前最火的web开发技术

- - 博客园_新闻
2014 年 10 月 29 日,万维网联盟泪流满面地宣布,经过几乎 8 年的艰辛努力,HTML5 标准规范终于最终制定完成了,并已公开发布. HTML5 提供了一些新的元素和属性,例如 nav(网站导航块)和 footer. 这种标签将有利于搜索引擎的索引整理,同时更好的帮助小屏幕装置和视障人士使用,除此之外,还为其他浏览要素提供了新的功能,如 audio 和 video 标记.

论Web Service 相关技术(转)

- - 互联网 - ITeye博客
摘要:随着Internet和weh技术的迅速发展,传统的分布式计算技术已经不能 很好的适用于Web环境. 正是基于这种情况,Web Service技术应运而生. Web Service是一个新概念,它的系统架构、实现技术是现有应用的面向Internet的一个延伸. Web是为了程序到用户的交互,而Web Service是为程序到程序的交互作准备,web Service已成为IT产业近几年来探索的热点课题之一.

高并发web服务技术选型

- - 崔永键的博客
主要问题集中在单个GB级数据使用何种DFS的问题上,目前还没有得到可靠的结论. 采用:nginx或 lvs: https://github.com/alibaba/LVS. 实施自己的调度策略:学习配置lvs或改造lvs或自己重写. 调研下采用hdfs还是fastdfs还是其他的:Fastdfs,ZFS,Lustre,HadoopHDFS,GlusterFS.

网易应用下载站WEB端GUI设计的小分享

- kamal - 网易用户体验设计中心博客
 网易应用下载站WEB端开发进度日渐收尾,伴随陆续的测试优化工作,借此机会浅谈一下GUI设计实践上的皮毛经验. 网易应用的特点在于服务用户下载应用和社交分享,因此GUI的设计作用在于把用户交互体验抽象化任务流程和操作方式表达得尽量准确尽量自然:.  例a.不要分散用户的焦点注意力:. GUI设计中不应该分散用户对自己任务目标的注意力.

HTML5开发的十大炫酷Web应用分享与推荐

- - HTML5研究小组
HTML5发展地如火如荼,本文将为大家重点分享基于HTML5开发的十大炫酷Web应用,帮助开发人员更好的领悟HTML5的强大之处,关于HTML5的更多信息,请参考专题:HTML5的应用与炫酷体验. Twimbow 是一个基于 HTML5 开发的 Web 应用,用于帮助用户管理他的社交网络,该应用色彩非常多样.

Evernote Web Clipper – 保存、标注和分享网页[Chrome]

- - 小众软件
Evernote Web Clipper 是大象公司专门为 Evernote 保存、标注和分享网页用的 Chrome 扩展,可以直接在网页上像 Skitch 一样标记,支持快捷键,支持一键分享. Web Clipper Chrome 更像是 Evernote 几个产品的整合,使之用起来更加连贯.

2010 Web前端技术趋势及总结

- bluesnail - 博客园-首页原创精华区
经过这段时间国内(百度,淘宝,新浪)及国外(Facebook,Youtube,Yahoo)各大公司的集中自曝,我们可以从中总结出2010 Web前端技术的一些趋势. 总的来说,随着后端技术(存储,并发,分布式)的成熟,各大公司已经把重点从后端架构调整/建设转移至前端(TTI时间,快速发布,带宽利用率).