目录
1.故障现象
朋友的某客户生产环境Spring Boot进程被异常终止,重复启动无效,请求支援。
- 使用脚本在后台启动Spring Boot程序后,多次执行xx.sh status查看状态,最后应用进程pid 24366消失。
- 在命令行前台执行启动后不久,显示“Killed”进程被终止。
2.处理过程
经了解,客户当天晚上关闭该虚拟机增加了内存,除此之外没有程序的变更和发布,也未调整过其他操作系统参数。
由于是帮朋友忙,客户的环境和应用并不熟悉,手头没有主机、应用的监控历史。
- 首先还是复现故障,手动在shell前台执行java -jar启动应用,直到进程退出,照例同时使用top观察CPU、内存使用正常,tail -f /var/log/message查看没有异常日志记录,查看dmesg无异常,查询last -x | head | tac无异常登录。
- 怀疑是不是发生了OOM进程自动退出了,加上生成OOM dump文件的参数,再次启动应用并观察:java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/app/gc.hprof -jar -Dserver.port=6002 -Dspring.profiles.active=app SpringBootApp-1.0.jar ,发现启动后30s左右就再次回显“Killed”,异常退出,并没有任何dump文件生成,说明应该不是发生了OOM退出的。
- 再次启动应用,使用jmap命令多做几次dump,jmap -dump:file=/home/app/javaDump01.hprof,format=b 24344,把dump文件下载到自己PC上,使用jvisualvm查看dump文件,没有发现什么死锁之类的异常。
- 再次shell前台启动应用,jps查看该java pid=111413。yum -y install strace,使用strace跟踪进程:strace -f -T -tt -e trace=all -p 111413 ,进程被kill后,strace显示:01:27:01.801830 +++ killled by SIGKILL +++,也并没有看到更多的有用信息。
- yum -y install psmisc,使用pstree -apnh查看进程树,发现一个异常进程“daemon”及其5个子进程,开始怀疑是否中招了。
- lsof -p 110583查看这个"daemon"进程访问的文件,发现其访问了/mnt/daemon这个可执行文件,经客户确认没人知道这个可疑文件和守护进程,也不是虚拟机的agent tools工具。
- crontab -l发现每分钟都会启动一次/mnt/daemon,基本可以确定是中木马了。木马文件故意命名为"daemon"伪装混淆,并且可能早就潜伏在系统里,只是本次维护重启服务器后启动运行了。
- 立即crontab -e注释掉上面那行计划任务,kill -9 110583杀掉"daemon"进程。再次启动应用观察就不会出现被kill的情况了。
3.简单分析一下这个木马
在主机PC上新创建一个CentOS7的虚拟机,把木马文件放上去,执行一下果然复现了上面的情况:(1)在crontab中创建每分钟执行一次从计划任务(2)后台运行daemon木马进程。
- lsof -p查看,发现有一条:TCP centos7temp:43900->185.238.3.72:http (ESTABLISHED),说明正在访问185.238.3.72(IP地址在荷兰)的80端口。
- netstat -lantp也证实了对185.238.3.72的访问
- 抓包看看吧,tcpdump tcp -i ens33 -s 0 -w ./tcpdump202011_01.cap,把tcpdump文件下载下来,用wireshark打开分析,发现是jsonrpc协议的数据流。根据这篇文章分析suricata下的挖矿行为检测,抓包中的jsonrpc request和response的特征,符合门罗币挖矿木马的行为。
4.总结
- 一定要做好内外网安全,定期检查是否有异常进程,做好监控。
- 虽然定位到了挖矿木马程序并清理掉了,但仍未确定为什么该木马会kill掉Spring Boot的进程。。留待以后研究吧。