问题现象:

刚才开始只有9台服务器异常,过一会有34台服务器异常。内网在传播。
收到阿里云的提醒:您的云服务器(8.211.xx.xx)由于被检测到对外攻击,已阻断该服务器对其它服务器端口(TCP:6379)的访问,阻断预计将在2021-07-17 10:46:50时间内结束,请及时进行安全自查。若有疑问,请工单或电话联系阿里云售后。 感谢您对阿里云的支持。
阿里云云安全中心发现,计划任务在下载恶意脚本。
image.png

登录服务器发现,计划任务被篡改
image.png
查看计划任务日志,第一次是下载init.sh,后面每个40分钟,整点执行/etc/newinit.sh脚本
image.png
服务器top命令被修改,使用其他正常机器上传top命令。
通过分析发现有两个异常进程,zzh和pnscan
pnscan:扫描程序,过一会就会换pid
zzh: 挖矿程序
image.png
image.png
ps查看进程正在执行下载恶意脚本
image.png

恶意脚本init.sh
init.sh

恶意脚本分析:

  • 替换了top/ps/pstree/wget/curl系统命令,替换过的ps top pstree命令过滤了zzh和pnscan进程。
  • 卸载了阿里云的云监控agent
  • 计划任务植入下载恶意脚本并重复执行。
  • 下载zzh挖矿程序并运行
  • /root/.ssh/authorized_keys注入了key
  • 脚本会找/root/.ssh/known_hosts文件登录过的服务器,尝试ssh进一步感染传播
  • /etc/resolv.conf 新增了一个dns:nameserver 1.1.1.1
  • 很多关键目录新增了chattr +a +i权限,导致不能正常删除和修改

问题根因:

服务器redis没设置密码,切redis是已root身份运行的。利用了无密码进入redis
config set dir
config set dbfilename
save
具体原理参考:https://www.52pojie.cn/thread-1393261-1-1.html

我们服务器redis是没有公网对外的,后排查是因为公司内部有机器被感染,然后传播到阿里云服务的。

处理步骤:

  1. 第一时间在安全组,出入方向,拒绝恶意ip访问
  2. 清理异常文件 ```shell

    卸载unhide隐藏程序

    yum remove unhide -y

杀病毒进程

killall -9 zzh killall -9 pnscan

临时chattr权限,增加可自行权限

chmod +x /bin/chattr

删除异常文件

chattr -i -a /usr/local/bin/pnscan rm -rf /usr/local/bin/pnscan

清理异常计划任务

chattr -a -i /var/spool/cron/root echo ‘’ >/var/spool/cron/root chattr -i -a /etc/crontab; echo ‘’ >/etc/crontab chattr -i -a /etc/cron.d/; chattr -i -a /etc/cron.d/zzh; rm -rf /etc/cron.d/zzh

删除zzh二进制挖矿程序

chattr -i -a /etc/zzh rm -rf /etc/zzh chattr -i -a /etc/zzhs rm -rf /etc/zzhs

清空authorized_keys文件

chattr -i -a /root/.ssh/authorized_keys chattr -i -a /root/.ssh/ echo ‘’ >/root/.ssh/authorized_keys

删除恶意脚本

chattr -i -a /etc/newinit.sh rm -rf /etc/newinit.sh

其他

chattr -i /usr/lib/systemd/systemd-update-daily rm -rf /usr/lib/systemd/systemd-update-daily chattr -i /tmp/kdevtmpfsi rm -rf chattr -i /tmp/kdevtmpfsi chattr -i /usr/bin/ip6network chattr -i /usr/bin/kswaped chattr -i /usr/bin/irqbalanced chattr -i /usr/bin/rctlcli chattr -i /usr/bin/systemd-network chattr -i /usr/bin/pamdicks

/etc/resolv.conf文件删除nameserver 1.1.1.1 这一行

chattr -e -i /etc/resolv.conf sed -i ‘/1.1.1.1/d’ /etc/resolv.conf

  1. 3. 恢复命令,从其他机器拷贝以下命令到机器
  2. /usr/bin/ps<br />/usr/bin/top<br />/usr/bin/wget<br />/usr/bin/curl<br />/usr/bin/chattr<br />/usr/bin/pstree
  3. 4. 进入redis flushall,停止redis.
  4. ```shell
  5. echo -e "config set dir /\nconfig get dir\nconfig set dbfilename dump.rdb\nconfig get dbfilename"|redis-cli

改进方案:

  1. redis增加密码
  2. redis绑定127.0.0.1
  3. redis非root启动