Webshell河马后门查杀工具配合shell脚本实现多站点自动化查杀

河马官网 https://www.shellpub.com/

河马工具查杀的步骤特别简单

下载,解压,开始扫描,参考官网教程 https://www.shellpub.com/doc/hm_linux_usage.html

扫描出来的结果都会保存在hm文件的同级目录result.csv中,扫描出来的结果是这样的

第一行是固定的,序号,类型,路径,如果有可疑或者木马文件,会生成一个result.csv

如果没有则不会生成,再次执行,会覆盖上次的result.csv结果

需要注意的是,这个工具需要联网才能用的,没网可用不了

思路:

有时候开发用到的函数是危险函数,可能会被误认为可疑文件,所以第一次手动扫描的时候,要记住这些文件,确认文件没问题之后,创建个 站点名.safe.old文件,里面存没问题但是被认为可疑的文件,以及该文件的md5值,下次出现通过获取md5值来进行对比文件是否发生变化,那么就需要2个脚本了。

脚本1:第一次扫描之后,看result.csv文件里记录的文件,后门文件直接删掉,正常文件但是被认为可疑的,保留下来,获取md5值放文件里。

脚本2:有了旧文件(确认安全但被认为可疑的文件),拿本次的文件与之对比,先判断数量,可疑文件多了,那就两种情况,不是开发新上传,就是被入侵了,然后再判断可疑文件的md5值是否发生变化,如果发生变化,不是开发改了,就是被黑客利用了,没任何变化,那就是一切正常了。

我的河马是在/root/safe/hippo下解压的,所以路径写的是这个

脚本1:create_old.sh内容如下

#!/bin/bash
#定义result.csv文件的路径
result_txt="/root/safe/hippo/result.csv"

#定义函数
write_dir(){
#循环文件的每一行
for i in `cat $result_txt`
do
   #获取可疑文件名
   file_name=`echo $i|awk -F',' '{print $NF}'`
   #第一列是“序号,类型,路径”,所以要忽略,如果文件名是路径,就跳过本次循环
   if [[ $file_name =~ "路径" ]];then
      continue
   fi
   #获取MD5值
   md5_num=`md5sum $file_name`
   #md5的结果输入到一个文件里
   echo $md5_num  >> /root/safe/hippo/logs/$1.safe.old
done
}

#获取用户输入
read -p "Input dir name: " dir_name
#调用函数传参
write_dir $dir_name

第一次扫描 

切换目录

cd /root/safe/hippo/

执行扫描,多个站点执行多次

./hm scan /data0/htdocs/a.com

生成安全old文件

./create_old.sh

输入a.com

然后就可以看到logs目录下就有个a.com.safe.old文件了

脚本2:scan_dirs.sh

#!/bin/bash
#获取站点名
dirs=`ls -lh /data0/htdocs/|grep -v "total"|awk '{print $NF}'`
#定义result.csv路径
result_txt="/root/safe/hippo/result.csv"

#写入文件函数
write_dir(){
#先删除result.csv ,不删除的话,如果这次没有扫出来,获取的是上次的内容
rm -f $result_txt
#再创建个空文件,如果没有扫码出来,不会创建,echo >的话,会有一个空行,影响数量
touch $result_txt
#删除上次的扫码结果,非old安全文件
rm -f /root/safe/hippo/logs/$1.safe.txt
#创建本次的结果存储位置
touch  /root/safe/hippo/logs/$1.safe.txt
#开始扫描传参过来的站点
/root/safe/hippo/hm scan /data0/htdocs/$1
#循环结果每一行
for i in `cat $result_txt`
do
   #获取文件名
   file_name=`echo $i|awk -F',' '{print $NF}'`
   #跳过第一行
   if [[ $file_name =~ "路径" ]];then
      continue    
   fi
   #获取MD5值
   md5_num=`md5sum $file_name`
   #写入本次结果
   echo $md5_num  >> /root/safe/hippo/logs/$1.safe.txt
done
#调用另一个函数,并且传参站点名
diff_files $1
}

#定义对比函数
diff_files(){
#old安全文件
old_files="/root/safe/hippo/logs/$1.safe.old"
#new本次扫描结果
new_files="/root/safe/hippo/logs/$1.safe.txt"
#统计old行数
old_num=`cat $old_files|wc -l`
#统计new行数
new_num=`cat $new_files|wc -l`

#判断行数是否一致,有误新增
if [[ $new_num == $old_num  ]];then
   echo "上次数量: $old_num"
   echo "本次数量: $new_num"
   echo "本次数量和上次数量一致."
else
   echo "上次数量: $old_num"
   echo "本次数量: $new_num"
   echo "数量不一致,此次有新增文件"
fi

#循环每一行
for i in `seq 1 $new_num`
do
  #获取第N行内容
  txt=`sed -n "$i p" $new_files`
  #获取new里这一行的md5值
  md5_sum=`echo $txt|awk '{print $1}'`
  #获取new里这一行的文件名
  file_name=`echo $txt|awk '{print $2}'`
  #获取old里可疑文件相对应的md5值
  old_md5=`grep "$file_name" $old_files|awk '{print $1}'`
  #如果新旧MD5值一样,没变化,跳过
  if [[ $md5_sum == $old_md5 ]];then
#      echo "new: $md5_sum , old: $old_md5" 
#      echo "$file_name 新老一致...."
      continue
  #如果新的有,老的没有,或者对比md5值不一样,报警
  else
      echo "新可疑文件: $file_name ,MD5值: $md5_sum"
      #还能在此处写个调用发送微信报警函数
  fi
done

}


#循环每个站点
for i in $dirs
do
   #输出扫描哪个站点
   echo "Now scan dir is $i."
   #调用函数传参
   write_dir $i
   #输出该站点扫描完成。
   echo "scan $i over."
done

第二次扫描

切换目录

cd /root/safe/hippo/

执行脚本,如果站点目录不是/data0/htdocs就手动换路径

./scan_dirs.sh

输出结果是这样的

可以在脚本里添加微信报警函数,发现不一致则发送微信,配合crontab弄个定时,也算是实现自动化了

后续再说吧,目前先这样手动扫描,用一段时间再说。

猜你喜欢

转载自blog.csdn.net/wojiuwangla/article/details/107858366