没得说,被***后最直接的办法就是找到了入口点封堵后直接重装搞定。今天要说的机器却因为某些原因不能重装,只有干掉***,清理得干干净净。


一、使用chattr 配合 touch 空文件/echo 杜绝周期任务不曾是一种办法。

以/var/spool/cron/root为例子:

/root/chattr -i  /var/spool/cron/root;echo > /var/spool/cron/root;/root/chattr +i  /var/spool/cron/root

ps:chattr 命令最好从bin 移出来 因为别人同样可以使用chattr来释放权限
ps:这条语句不一定一次就成功,需要多次执行,因为别人的循环速度也是很快的

二、同样是用chattr 来解决掉 user/.ssh 的免密登陆(不做过多介绍这里使用移动目录也是可以的)


三、杜绝了免密登陆之后who -a (可以查看进程号 以及ip)配合netstat 的内容 使用iptable 封杀远程登陆的ip 以及kill掉已经登陆的非自身ip


四、其实之前的处理完毕后,基本上机器已经不会很卡,现在要处理的就是隐藏的小马(大马*** 小马隐藏嘛)

先贴张图

可以看见22 和9033的pid是看不到的显而易见有东西隐藏了进程,这里参照下边的链接
https://blog.csdn.net/nzjdsds/article/details/82919100

虽然看不懂不要紧,这里总结三大类:

1.ps netstat 等命令被替换导致的无法显示

解决方案:直接stat 判断下命令更改事件,直接从未中***机器复制命令替换即可

2.基于lib导致的无法现在

解决方案:centos7 使用 strace ls /proc 2>&1 |grep open 与未中***机器对比加载的so内容即可判断(巧的是本次遇到的就属于这一类 废话不多说上图)

此图可以看到比正常情况多了2个so
/etc/ld.so.preload
/usr/local/lib/libevent_extra-9.5.so
这里我们来看看2个的目录情况

已知的文件都被隐藏了没关系,直接mv 走即可 这里先要做/usr/local/lib/ 后做/etc/ld.so.preload

然后清理掉/etc/ld.so.preload 

恢复正常,最后清理下残余文件即可。注意(周期任务 用户登陆调用脚本 开机调用脚本  关机调用脚本  用户退出调用脚本 一定要清理干净)

3.基于内核模块导致的无法显示

解决方案:lsmod 命令列表 与为中***机器对比即可,不过就算找出来了,若不能rmmod掉,需要重启机器且启动过程的脚本要全面排查,阻止mod的加载。(若是内核加载 常见的被安装了 kernel-devel 等包 因为需要根据机器编译,mod一旦生效 包含自身文件目录,都会被隐藏得干干净净)

第1大类很好做,直接stat 判断下命令更改实

写得比较粗了清理持续了3天中途去研究了下netstat 的原理得如下脚本:

#!/bin/bash
echo -n > /tmp/inode.tmp
for((i=0;i<66666;i++));
do
if [[ -d /proc/$i ]];then
    ls -l /proc/$i/fd|grep "socket"|awk -F 'socket:' -v a=$i '{print "i_"$2"="a}'|sed 's;\[;;g'|sed 's;\];;g' >> /tmp/inode.tmp
fi
done
source /tmp/inode.tmp
while read line 
do
echo -n $line
inode=`echo $line|awk '{print $10}'`
v="i_"$inode
echo -n " "
eval echo -n $`echo $v`
echo " "$v
done < /proc/net/tcp

这个是干嘛的呢,简单解释下,实际上netstat 的内容是取的/proc/net/tcp tcp6 udp udp6的内容,但-p命令实际上是扫描的/proc/进程id/fd 的socket 软连接对应的 inode (php命令的话用fileinode直接可以获取)再使用/proc/net内容的inode 对应得到的进程id , 这段内容参照netstat源码