今日闲来无事看了一眼探针,发现有个服务器CPU负载异常高(100%),仔细一想好像也没跑什么高负载服务啊,随即ssh登录上去看一眼。
1、初步排查
使用top
命令查看系统进程,结果发现没有高负载程序,但是cpu显示99 us
。那么怀疑是病毒隐藏了进程。
于是排查无有异常的网络连接,使用 netstat -anp
查看连接,确实有异常连接,但是还是看不到进程。
顺带反查了一下这个IP,发现是一个矿池地址。
2、深入排查
目前已经知道了矿池地址和端口,于是谷歌一下发现不少人都中这种隐藏进程的病毒。这位大佬的帖子中,https://www.cnblogs.com/bonelee/p/16976768.html,我得到思路。直接使用16进制编码端口,再去/proc/net/tcp
文件中查找inode。
于是乎我们得到了该进程的inode,那么接下来我们只需要遍历/proc的pid目录,对比文件的inode,便可揪出异常进程了。所以写了一个python脚本来遍历。
import os
def find_file_by_inode(inode_number, directory='.'):
for foldername, subfolders, filenames in os.walk(directory):
for filename in filenames:
full_path = os.path.join(foldername, filename)
try:
if os.stat(full_path).st_ino == inode_number:
return full_path
except:
pass
return None
inode_number = 813563 # 上一步中找到inode
filename = find_file_by_inode(inode_number)
if filename:
print('File found:', filename)
else:
print('No file found with inode number', inode_number)
把脚本放在proc目录执行,很快哈,找到PID为577。
3、解决
接下来执行 ls -l /proc/{PID}/exe
便可拿到执行文件的路径了。后面清除目前就可以参考以下文章了。
https://blog.csdn.net/wu_qing_song/article/details/127551422
还有要记得检查你的/root/.ssh
下的key文件,我在排查时发现了不属于自己的key,这就是为什么删除了病毒文件,却再次中招的原因之一,当然一般会隐藏进程的病毒都会篡改你的系统文件,为了安全起见(无数据),我直接选择重装系统。
为了验证PID 577是否是病毒,我是直接kill了这个进程,果然CPU负载成功降低。
4、如何防范于未然?
我觉得主要是一下几点:
(1)不要使用弱密码,或者使用ssh key。
(2)修改ssh端口,降低被扫风险。
(3)不要使用来路不明的脚本或程序。