由于日志太多,每条日志都要进行分析逐条分析很难做到的,那么我们就利用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"