前言
当出现问题时,如何快速去定位。
文章简介:
本文将在 CentOS 6 下 假设挖矿应急进行演示
目录:
定位问题
首先使用top命令查看可疑进程,
PS:挖矿病毒一般占CPU比较大
假设查到名字是 sshd 的可疑进程,
这些先记下他的进程名字为 sshd ,PID号为 4366
假设只知道 PID,或者只知道进程名字 想要找其他信息的话,
下面的方法或许能帮助到你。
1. 根据进程查询PID号
上面我们知道了进程名字为 sshd,然后我们去查下他的PID号
命令:
ps -ef | grep sshd # 进程名字
2. 根据PID号查询进程
知道 PID号为 4366 ,然后可以去找下进程,
命令:
netstat -antup | grep 4366 # PID号
参数 antup 分别表示的意思是:
- -a (all)显示所有选项,默认不显示LISTEN相关
- -t (tcp)仅显示tcp相关选项
- -u (udp)仅显示udp相关选项
- -n 拒绝显示别名,能显示数字的全部转化成数字。
- -p 显示建立相关链接的程序名
然后就找到了这个进程,并且发现了外连(PS:挖矿一般都是要连接远程服务器)
第一个IP表示本机服务器,第二个IP表示远程服务器地址,
远程地址一般为攻击者,
到这来我们又得到了几个信息,
攻击者IP地址:192.168.31.197 , 端口:60065
本地IP地址:192.168.31.11 , 端口:22
3. 根据端口号查询PID号和进程
命令:
netstat -antup | grep 22 # 端口号
4. 根据IP查询进程
命令:
netstat -antup | grep 192.168.31.197 # 端口号
5. 根据PID号查询进程路径
到这里,基本可以判断 挖矿程序了,
接下来就是要找到他的在哪里
命令:
lsof -p 4366 # PID号
或者使用
命令:
ll /proc/4366 # PID号
说明:Linux在启动一个进程时,系统会在/proc
下创建一个以PID命名的文件夹,
在该文件夹下会有我们的进程的信息,
其中包括一个名为exe的文件即记录了绝对路径,通过ll
或ls –l
命令即可查看。
ll
命令相关参数:
-
cwd符号链接的是进程运行目录
-
exe符号连接就是执行程序的绝对路径
-
cmdline就是程序运行时输入的命令行命令
-
environ记录了进程运行时的环境变量
-
fd目录下是进程打开或使用的文件的符号连接
6. 根据名字查询路径
命令:
find / -name "sshd" # 进程名
对于find命令大家应该都比较熟悉,就不多说了,
排除问题
经过定位问题后,我们知道 sshd可疑程序是从 /usr/sbin/
目录下运行的,
接下来就是进到这个目录,然后删除全部关于 sshd 可疑的东西,
还没完,这种东西一般都是有守护进程和计划任务的,
不清除这些东西,挖矿进程就会源源不断的出现
1. 查看计划任务
为了保证挖矿能够一直运行,一般都会设定计划任务
命令:
crontab -l
或者
cat /var/spool/cron/root
各个参数说明:
- -e 执行文字编辑器来设定时程表,内定的文字编辑器是 vi
- -r 删除目前的时程表
- -l 列出目前的时程表
- -v 列出用户cron作业的状态
当然也可以直接进计划任务目录去查看
默认路径: /etc/crontab
我这里因为是演示的环境,所以就没有了
除了 /etc/crontab
这个路径外,
还应当特别留意下面这两个路径 ,
创建计划任务时,都会生成相应的文件,如果可疑,那么也应该清除,
/var/spool/cron/
/var/spool/cron/crontabs/
root用户执行的就会在 /var/spool/cron/
下面创建root文件
2. 查看守护进程
守护进程顾名思义就是保护这个程序的运行,
如果 kill 不掉这个进程,那么就是守护进程,
使用命令进行查看
命令:
ps -aux | grep sshd # 进程名
或者
ls /etc/crontab
找到这些进程,然后进去对应的目录下清除掉,然后再 kill掉进程
3. 查看任务操作日志
一般操作任务都会记录一个日志,
这个日志的默认路径是:/var/log/
日志名格式:cron-年月日
,例如:cron-20190407
我们可以先进到目录下去查看挖矿病毒发现的日期,然后再去查看日志
命令:
cat /var/log/cron-20190407
或者
more /var/log/cron-20190407
使用 more
命令是 为了防止数据量过大,导致无法全部显示
more 命令 一次显示一屏文本
按空格键(space)就往下一页显示,按 b 键就会往上(back)一页显示
如果日志太多的话,可以在后面加上 | grep -v {要排除的关键字}
来排除无用信息。
4. kill掉进程
到这里基本结束了,
清除完恶意文件后,就可以kill掉挖矿进程了
命令:
kill -9 4366 # PID号
-9 是强制结束的意思
如果出现 rm: cannot remove 'sshd ': Operation not permitted
应该是病毒使用了 chattr +i
的命令
这时我们只要先执行 chattr -i sshd
,然后就可以正常删除了。
关于 chattr
命令的一点补充:
chattr命令用于改变文件属性,
通过chattr命令修改属性能够提高系统的安全性,
但是它并不适合所有的目录,chattr命令不能保护/
、/dev
、/tmp
、/var
目录。
常用参数:
-
+
:在原有参数设定基础上,追加参数。 -
-
:在原有参数设定基础上,移除参数。 -
i
:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。
还有一个 lsattr
命令
改命令是显示chattr命令设置的文件属性。
使用方法:
lsattr /usr/sbin/sshd # 路径
5. 清除SSH后门
为了保证一直拥有这台服务器的控制权限,攻击者一般会留SSH后门,
SSH 后门路径: /root/.ssh/
攻击者一般会在这个路径下创建自己的SSH公钥
检查的时候也应该特别留意,防止病毒再次爆发。
附1:如果ps、netstat命令被替换了怎么办??
这也是一个很严肃的问题,
应急中我是没遇到过,不知道各位表哥有没有遇到这种情况,
如果命令被替换了,那么执行这些命令就想到于帮攻击者执行程序。
首先还是要使用其他命令找到这些被替换的命令,
被替换的命令也是病毒程序,查看进程还是可以看到的,
找到目录进去清除程序,然后重新安装干净的命令程序,
这些命令一般存放在 /usr/bin
目录下
参考:
https://blog.csdn.net/feloxx/article/details/49273997
附2:常见日志路径及配置文件路径
Linux日志文件通常保存在 /var/log
下面是几个重要的日志文件:
整体系统信息日志: /var/log/messages
系统启动期间的日志: /var/log/syslog
(它只记录警告信息,常常是系统出问题的信息)
用户信息的日志: /var/log/user.log
系统授权信息: /var/log/auth.log
(包括用户登录和使用的权限机制等)
守护进程日志: /var/log/cron
FTP会话日志: /var/log/xferlog
(显示出用户向FTP服务器或从服务器拷贝了什么文件)
SSH登录日志: cd /var/log/ 然后执行 less secure
Apache配置文件默认路径: /etc/httpd/conf/httpd.conf
或者在 /usr/local/apache2/conf/httpd.conf
打开找到 CustomLog 后面指定的路径就是你的日志路径
Nginx日志:/var/log/nginx/
,日志名一般是 error.log ,配置文件: /etc/nginx/nginx.conf
总结
上面步骤没有绝对性,
那个顺手就用那个,
另外,能排查出问题,其他步骤可以省略,
当然前提条件是彻底排除。
后话
当清除完全部恶意进程后,
可以尝试扫描一下 rootkit,
但是呢,别人服务器一般不会给安装其他东西,
扫描的时候说不定也存在一定的风险,
这种情况就好好询问一下客户,或者问下公司同事一般怎么操作。
当然了,除了排除问题,一般客户也会要求找出攻击路径,
说白了就说找漏洞,你可以问问有是不是设了弱口令啊啥的,
然后问他日志情况怎么样,完不完整等等。
参考文献
https://www.freebuf.com/vuls/200289.html
https://www.sohu.com/a/219821377_653604
https://zhuanlan.zhihu.com/p/28352723