nginx安全日志分析脚本的编写

由于日志太多,每条日志都要进行分析逐条分析很难做到的,那么我们就利用shell脚本进行相应的分析,大大节约我们的时间。

由于有了waf,进行更准确的拦截模式,所以我们这里不需要更加的精确,所以我们就大范围的搜索关键字。

首先第一部分我们先搜索sql注入的攻击,搜索出的日志均为访问服务器成功的日志。

sql注入攻击的关键字匹配组成,盲注关键字,报错注入常用关键字,延时注入关键字联合查询关键词等。

搜索命令如下:

 grep -E '| (200|302|301|500) |' [FILE] | grep -i -E "('|and |and%20|and\+|and-|and@|and\(|or |or%20|or\+|or-|or@|or\(|--|select|if\(|case when|make_set|elt |extractvalue|updatexml|cast\(|sleep\(|benchmark|generate_series|union|order by).*?HTTP/1.1" 

下面我们看看xss攻击关键词的组成,常用的xss攻击字符,伪协议绕过字符,on事件触发的常用函数,执行xss攻击代码常用的函数,编码绕过的情况等。

搜索命令如下:

grep -v '| (200|302|301|500) |' [FILE] | grep -i -E "(<|>|javascript|data:|vbscript|expression|ed2k|onerror|onmouserover|onload|onclick|onblur|onfocus|eval\(|fromCharCode|%3E|%3C|%25|%27|%0a).*?HTTP/1.1

第三种情况就是我们常见的一些漏洞了,像文件遍历/下载,代码执行,命令执行,木马文件,扫描器关键字,配置文件,日志文件,压缩文件的下载关键词,resin关键字,当然你也可以自己增加一些关键词。

搜索命令如下:

grep -E '| (200|302|301|500) |' [FILE] | grep -i -E "(\.\.|WEB-INF|/etc|\w\{1,6\}\.jsp |\w\{1,6\}\.php |system\(|eval\(|exec\(|acunetix-wvs|Appscan|netsparke|\w+\.xml |\w+\.log |\w+\.swp |\w*\.git |\w*\.svn |\w+\.txt |\w+\.json |\w+\.ini |\w+\.inc |\w+\.rar |\w+\.zip |\w+\.gz |\w+\.tgz|\w+\.bak |/resin-doc).*?HTTP/1.1" 

上面这一个内容搜索的有误报的情况较多,这样就需要你利用grep或awk进行相应的分析,这个脚本的目的也并不能进行完全正确的分析,这是提取攻击成功和带有攻击关键词的日志,减少分析的时间,但仍然要求自己手动确认来提高准确性。


统计访问次数最多ip的次数和值,一般用于爆破类的请求和刷评论等操作。$1对应的用户的ip,一般不需要更改。

统计命令如下:

awk -F '|' '{a[$1]+=1;}END{for(i in a){if(a[i]>=200){if(!match(i,/192.168/)){print a[i]"  "i;}}}}' [FILE]


统计访问次数最多的请求接口的url的次数和值,作用同上,$4对应日志请求path。

统计命令如下:

awk -F '|' '{a[$4]+=1;}END{for(i in a){if(a[i]>=100){if(!match(i,/(gif|png|jpg|ico)/)){print a[i]" [FILE]


统计具有攻击行为的ip的次数和值,作用是统计出带有攻击关键词的ip和个数。$1对应的是用户的ip列。

 awk -F "|" '/and |and%20|and\+|or |or%20|or\+|--|select|if\(|sleep\(|benchmark|union|order by|<|>|javascript|data:|vbscript|expression|onerror|onmouserover|onload|eval\(|\.\.\/|WEB-INF/|\/etc|exec\(|acunetix-wvs|Appscan|netsparke/{a[$1]+=1}END{for(i in a){print a[i]" " i;}}'  [FILE]

统计请求时长超过3秒的用户,主要统计延时注入和某个接口被拒绝服务攻击。$12是请求的响应时间列

awk -F '|' '{if($12 > 3){print $0}else}' [FILE]


脚本的具体实现如下:

#!/bin/bash
# --------------------------------------------------------------------
#      文件名:analyse_log.sh
#      版本: v_1.0
#      日期:2016/7
#      作者:nextdoor
#	   作用:nginx日志分析工具(可根据日志的格式进行相应修改)
#     
# --------------------------------------------------------------------

help(){
	echo  "Usage: ./action.sh [options] [FILE]       "
	echo  "Options:"
	echo  "xxx.sh xss    [FILE] 获取成功访问请求中带有xss关键字的日志列表"
	echo  "xxx.sh sql    [FILE] 获取成功访问请求中带有sql关键字的日志列表"
	echo  "xxx.sh other  [FILE] 获取成功访问请求中除xss和sql其他漏洞的日志列表"
	echo  "xxx.sh act1   [FILE] 统计带有攻击关键词的次数和对应恶意ip地址"
	echo  "xxx.sh act2   [FILE] 统计访问最多的请求接口并显示次数和对应接口"
	echo  "xxx.sh act3   [FILE] 统计访问最多的ip并显示次数和对应ip"
	echo  "xxx.sh act4   [FILE] 统计服务器响应时长超过3秒的日志"
}


if [ $# == 0 ]
then
	help
	exit
fi

if [ ! -e $2 ]
then
	echo -e "$2: 日志文件不存在"
	exit
fi

if [ ! -d "log" ]
then
	mkdir log
fi

echo "[*] Starting ..."

if  [ $1 == "xss" ] 
then
	echo "开始获取xss跨站脚本攻击日志..."
	grep -v '| (200|302|301|500) |' $2 | grep -i -E "(<|>|javascript|data:|vbscript|expression|ed2k|onerror|onmouserover|onload|onclick|onblur|onfocus|eval\(|fromCharCode|%3E|%3C|%25|%27|%0a).*?HTTP/1.1" >> ./log/xss.log
	echo "分析日志已经保存到./log/xss.log"
elif [ $1 == "sql" ]
then
	echo  "开始获取sql注入漏洞攻击日志..." 
	grep -E '| (200|302|301|500) |' $2 | grep -i -E "('|and |and%20|and\+|and-|and@|and\(|or |or%20|or\+|or-|or@|or\(|--|select|if\(|case when|make_set|elt |extractvalue|updatexml|cast\(|sleep\(|benchmark|generate_series|union|order by).*?HTTP/1.1" >> ./log/sql.log
	echo "分析日志已经保存到./log/sql.log"

elif [ $1 == "other" ]
then
	echo -e "开始获取文件遍历/代码执行/扫描器信息/配置文件等相关日志"
	grep -E '| (200|302|301|500) |' $2 | grep -i -E "(\.\.|WEB-INF|/etc|\w\{1,6\}\.jsp |\w\{1,6\}\.php |system\(|eval\(|exec\(|acunetix-wvs|Appscan|netsparke|\w+\.xml |\w+\.log |\w+\.swp |\w*\.git |\w*\.svn |\w+\.txt |\w+\.json |\w+\.ini |\w+\.inc |\w+\.rar |\w+\.zip |\w+\.gz |\w+\.tgz|\w+\.bak |/resin-doc).*?HTTP/1.1" >> ./log/other.log
	echo "分析日志已经保存到./log/other.log"
elif [ $1 == "act1" ]
then
	echo -e "正在统计具有攻击行为的ip的次数和值"
	awk -F "|" '/(and |and%20|and\+|or |or%20|or\+|--|select|if\(|sleep\(|benchmark|union|order by|<|>|javascript|data:|vbscript|expression|onerror|onmouserover|onload|eval\(|\.\.\/|WEB-INF\/|\/etc|exec\(|acunetix-wvs|Appscan|netsparke)/{a[$1]+=1}END{for(i in a){print a[i]" " i;}}' $2

elif [ $1 == "act2" ]
then
	echo -e "正在统计访问次数最多ip的次数和值"
	awk -F '|' '{a[$1]+=1;}END{for(i in a){if(a[i]>=200){if(!match(i,/192.168/)){print a[i]"  "i;}}}}' $2

elif [ $1 == "act3" ]
then
	echo -e "正在统计访问次数最多的请求接口的url的次数和值"
	awk -F '|' '{a[$4]+=1;}END{for(i in a){if(a[i]>=100){if(!match(i,/(gif|png|jpg|ico)/)){print a[i]"  "i;}}}}' $2

elif [ $1 == "act4" ]
then
	echo -e "正在统计请求时长超过3秒的日志"
	awk -F '|' '{if($12 > 3){print $0}else}' $2
else 
	help
fi

echo "[*] shut down"








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值