河马官网 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弄个定时,也算是实现自动化了
后续再说吧,目前先这样手动扫描,用一段时间再说。