Nginx日志安全分析脚本

功能

  • 统计Top 20 地址
  • SQL注入分析
  • SQL from查询统计
  • 常见扫描器、黑客工具分析
  • 漏洞利用检测
  • 敏感路径访问
  • Webshell
  • HTTP Tunnel
  • 寻找响应长度的url Top 20
  • 寻找罕见的脚本文件访问
  • 寻找302跳转的脚本文件
  • 二次验证,判断状态吗与url后缀排除静态资源(png/css/js/pdf/jpg等url后缀)

Usage

设置报告保存地址 outfile=/tmp/logs 设置日志分析目录 access_dir=/var/log/nginx/ 设置日志名称 access_log=access chmod u+x ./nginx_check.sh./nginx_check.sh

代码


#!/usr/bin/env bash
 
 echo ""
 echo " ========================================================= "
 echo "                  Nginx日志安全分析脚本 V1.0            / "
 echo " ========================================================= "
 echo " # 支持Nginx日志分析,攻击告警分析等                    "
 echo " # author:al0ne                    "
 echo " # https://github.com/al0ne                    "
 echo -e "n"
 
 #此脚本是参考nmgxy/klionsec修改而来,重新添加了一些特征,只用来临时救急,还是推荐到ELK或者Splunk中分析
 
 #功能
 ###统计Top 20 地址
 ###SQL注入分析
 ###SQL注入 FROM查询统计
 ###扫描器/常用黑客工具
 ###漏洞利用检测
 ###敏感路径访问
 ###文件包含攻击
 ###HTTP Tunnel
 ###Webshell
 ###寻找响应长度的url Top 20
 ###寻找罕见的脚本文件访问
 ###寻找302跳转的脚本文件
 
 #如果存在多个access文件或者有多个access.x.gz 建议先zcat access*.gz >> access.log文件中
 #设置分析结果存储目录,结尾不能加/
 outfile=/tmp/logs
 #如果目录以存在则清空,未存在则新建目录
 if [ -d $outfile ]; then
     rm -rf $outfile/*
 else
     mkdir -p $outfile
 fi
 #设置nginx日志目录,结尾必须加/
 access_dir=/var/log/nginx/
 #设置文件名,如果文件名为access那么匹配的是access*文件
 access_log=access
 #判断日志文件是否存在
 num=$(ls ${access_dir}${access_log}* | wc -l) >/dev/null 2>&1
 if [ $num -eq 0 ]; then
     echo '日志文件不存在'
     exit 1
 fi
 echo -e "n"
 
 # 验证操作系统是debian系还是centos
 OS='None'
 if [ -e "/etc/os-release" ]; then
     source /etc/os-release
     case ${ID} in
     "debian" | "ubuntu" | "devuan")
         OS='Debian'
         ;;
     "centos" | "rhel fedora" | "rhel")
         OS='Centos'
         ;;
     *) ;;
     esac
 fi
 
 if [ $OS = 'None' ]; then
     if command -v apt-get >/dev/null 2>&1; then
         OS='Debian'
     elif command -v yum >/dev/null 2>&1; then
         OS='Centos'
     else
         echo -e "n不支持这个系统n"
         echo -e "已退出"
         exit 1
     fi
 fi
 
 # 检测ag软件有没有安装
 if ag -V >/dev/null 2>&1; then
     echo -e "e[00;32msilversearcher-ag已安装 e[00m"
 else
     if [ $OS = 'Centos' ]; then
         yum -y install the_silver_searcher >/dev/null 2>&1
     else
         apt-get -y install silversearcher-ag >/dev/null 2>&1
     fi
 
 fi
 #如果检测别的日志请手动替换偏移,例如awk的$7代表url,$9代表状态码,$10代表长度,本脚本是以nginx日志为基础
 
 echo "分析结果日志:${outfile}"
 echo "Nginx日志目录:${access_dir}"
 echo "Nginx文件名:${access_log}"
 echo -e "n"
 
 echo -e "e[00;31m[+]TOP 20 IP 地址e[00m"
 ag -a -o --nofilename 'd+.d+.d+.d+' ${access_dir}${access_log}* | sort | uniq -c | sort -nr | head -n 20 | tee -a ${outfile}/top20.log
 echo -e "n"
 
 echo -e "e[00;31m[+]SQL注入攻击分析e[00m"
 #在SQL注入中排除掉了一些扫描css/js/png图片类等无用告警,并且重点筛选状态码200或者500的告警
 ag -a "xp_cmdshell|%20xor|%20and|%20AND|%20or|%20OR|select%20|%20and%201=1|%20and%201=2|%20from|%27exec|information_schema.tables|load_file|benchmark|substring|table_name|table_schema|%20where%20|%20union%20|%20UNION%20|concat(|concat_ws(|%20group%20|0x5f|0x7e|0x7c|0x27|%20limit|bcurrent_userb|%20LIMIT|version%28|version(|database%28|database(|user%28|user(|%20extractvalue|%updatexml|rand(0)*2|%20group%20by%20x|%20NULL%2C|sqlmap" ${access_dir}${access_log}* | ag -v '/w+.(?:js|css|html|jpg|jpeg|png|htm|swf)(?:?| )' | awk '($9==200)||($9==500) {print $0}' >${outfile}/sql.log
 awk '{print "SQL注入攻击" NR"次"}' ${outfile}/sql.log | tail -n1
 echo "SQL注入 TOP 20 IP地址"
 ag -o '(?<=:)d+.d+.d+.d+' ${outfile}/sql.log | sort | uniq -c | sort -nr | head -n 20 | tee -a ${outfile}/sql_top20.log
 # 重点关注from查询,是否存在脱裤行为,排除扫描行为
 echo "SQL注入 FROM 查询"
 cat ${outfile}/sql.log | ag 'bfromb' | ag -v 'information_schema' >${outfile}/sql_from_query.log
 awk '{print "SQL注入FROM查询" NR"次"}' ${outfile}/sql_from_query.log | tail -n1
 echo -e "n"
 
 echo -e "e[00;31m[+]扫描器scan & 黑客工具e[00m"
 ag -a "acunetix|by_wvs|nikto|netsparker|HP404|nsfocus|WebCruiser|owasp|nmap|nessus|HEAD /|AppScan|burpsuite|w3af|ZAP|openVAS|.+avij|.+angolin|360webscan|webscan|XSS@HERE|XSS%40HERE|NOSEC.JSky|wwwscan|wscan|antSword|WebVulnScan|WebInspect|ltx71|masscan|python-requests|Python-urllib|WinHttpRequest" ${access_dir}${access_log}* | ag -v '/w+.(?:js|css|jpg|jpeg|png|swf)(?:?| )' | awk '($9==200)||($9==500) {print $0}' >${outfile}/scan.log
 awk '{print "共检测到扫描攻击" NR"次"}' ${outfile}/scan.log | tail -n1
 echo "扫描工具流量 TOP 20"
 ag -o '(?<=:)d+.d+.d+.d+' ${outfile}/scan.log | sort | uniq -c | sort -nr | head -n 20 | tee -a ${outfile}/scan_top20.log
 echo -e "n"
 
 echo -e "e[00;31m[+]敏感路径访问e[00m"
 ag -a "/_cat/|/_config/|include=|phpinfo|info.php|/web-console|JMXInvokerServlet|/manager/html|axis2-admin|axis2-web|phpMyAdmin|phpmyadmin|/admin-console|/jmx-console|/console/|.tar.gz|.tar|.tar.xz|.xz|.zip|.rar|.mdb|.inc|.sql|/.configb|.bak|/.svn/|/.git/|.hg|.DS_Store|.htaccess|nginx.conf|.bash_history|/CVS/|.bak|wwwroot|备份|/Web.config|/web.config|/1.txt|/test.txt" ${access_dir}${access_log}* | awk '($9==200)||($9==500) {print $0}' >${outfile}/dir.log
 awk '{print "共检测到针对敏感文件扫描" NR"次"}' ${outfile}/dir.log | tail -n1
 echo "敏感文件访问流量 TOP 20"
 ag -o '(?<=:)d+.d+.d+.d+' ${outfile}/dir.log | sort | uniq -c | sort -nr | head -n 20 | tee -a ${outfile}/dir_top20.log
 echo -e "n"
 
 echo -e "e[00;31m[+]漏洞利用检测e[00m"
 ag -a "%00|/win.ini|/my.ini|../../|/etc/shadow|%0D%0A|file:/|gopher:/|dict:/|WindowsPowerShell|/wls-wsat/|call_user_func_array|uddiexplorer|@DEFAULT_MEMBER_ACCESS|@java.lang.Runtime|OgnlContext|/bin/bash|cmd.exe|wgets|curls|s=/index/think" ${access_dir}${access_log}* | awk '($9==200)||($9==500) {print $0}' >${outfile}/exploit.log
 awk '{print "漏洞利用探测" NR"次"}' ${outfile}/exploit.log | tail -n1
 echo "漏洞利用检测 TOP 20"
 ag -o '(?<=:)d+.d+.d+.d+' ${outfile}/exploit.log | sort | uniq -c | sort -nr | head -n 20 | tee -a ${outfile}/exploit_top20.log
 echo -e "n"
 
 echo -e "e[00;31m[+]webshelle[00m"
 ag -a "=whoami|dbname=|exec=|cmd=|br57b|bc99b|bc100b|bb374kb|adminer.php|eval(|assert(|%eval|%execute|tunnel.[asp|php|jsp|aspx]{3,4}|makewebtaski|ma.[asp|php|jsp|aspx]{3,4}|bup.[asp|php|jsp|aspx]{3,4}|cmd.[asp|php|jsp|aspx]{3,4}|201d.[asp|php|jsp|aspx]{3,4}|xiaoma.[asp|php|jsp|aspx]{3,4}|shell.[asp|php|jsp|aspx]{3,4}|404.[asp|php|jsp|aspx]{3,4}|tom.[asp|php|jsp|aspx]{3,4}|k8cmd.[asp|php|jsp|aspx]{3,4}|ver[0-9]{3,4}.[asp|php|jsp|aspx]{3,4}|.aar|[asp|php|jsp|aspx]{3,4}spy.|o=vLogin|aioshell|admine|ghost.[asp|php|jsp|aspx]{3,4}|r00ts|90sec|t00ls|editor.aspx|wso.[asp|aspx]{3,4}" ${access_dir}${access_log}* | awk '($9==200)||($9==500) {print $0}' >${outfile}/webshell.log
 awk '{print "共检测到webshell行为" NR "次"}' ${outfile}/webshell.log | tail -n1
 echo "Webshell TOP 20"
 ag -o '(?<=:)d+.d+.d+.d+' ${outfile}/webshell.log | sort | uniq -c | sort -nr | head -n 20 | tee -a ${outfile}/webshell_top20.log
 echo -e "n"
 
 echo -e "e[00;31m[+]HTTP Tunnele[00m"
 #Regeorg代理特征
 ag -a "cmd=disconnect|cmd=read|cmd=forward|cmd=connect|127.0.0.1" ${access_dir}${access_log}* | awk '($9==200)||($9==500) {print $0}' | tee -a ${outfile}/tunnel.log
 awk '{print "共检测到隧道行为" NR "次"}' ${outfile}/tunnel.log | tail -n1
 echo -e "n"
 
 echo -e "e[00;31m[+]Top 20 url响应长度e[00m"
 # 查找url响应长度最长的url排序,目的是有没有下载服务器的一些打包文件
 len=$(cat ${access_dir}${access_log}* | awk '{print $10}' | sort -nr | head -n 20)
 echo $len | awk 'BEGIN{ RS=" " }{ print $0 }' | xargs -i{} ag -a --nocolor 'd+s{}s' ${access_dir}${access_log}* | awk '{print $7,$10}' | sort | uniq | sort -k 2 -nr | tee -a ${outfile}/url_rsp_len.log
 echo -e "n"
 
 echo -e "e[00;31m[+]罕见的脚本文件访问e[00m"
 echo "访问量特别特别少的脚本文件极有可能是webshell"
 cat ${access_dir}${access_log}* | awk '($9==200)||($9==500) {print $7}' | sort | uniq -c | sort -n | ag -v '?' | ag '.php|.jsp|.asp|.aspx' | head -n 20 | tee -a ${outfile}/rare_url.log
 echo -e "n"
 
 echo -e "e[00;31m[+]302跳转e[00m"
 echo "此目的是寻找一些登录成功的脚本文件"
 cat ${access_dir}${access_log}* | awk '($9==302)||($9==301) {print $7}' | sort | uniq -c | sort -n | ag -v '?' | ag '.php|.jsp|.asp|.aspx' | head -n 20 | tee -a ${outfile}/302_goto.log
 echo -e "n"
 

参考

  • nmgxy
  • klionsec

原文地址:

https://www.secpulse.com/archives/121330.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352