不自量力的还手,直至死方休。
Docker Remote Api 未授权
Docker Remote API是指docker团队为了远程管理docker,允许通过unix socket通信操作Docker daemon,也可以通过HTTP调用其Rest API,完成容器的查询,创建、销毁等等操作。
docker默认是没有开启Remote API的,需要我们手动开启。
- Kali下: 编辑/lib/systemd/system/docker.service文件
注释掉图中第第二行,并在其上方添加一行(默认端口为2375):
1 | ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 |
- 重启服务:
1 | sudo systemctl daemon-reload |
- 浏览器输入IP地址:2375/images/json就能查看宿主机的所有镜像:
- 获取所有容器
其他api参见官方文档:
Remote_api调用示意图:
通过tls的双向认证,确保不被非法访问
- 如何控制宿主机
1 | # 使docker命令可以操作远端docker引擎 |
DirtyCow漏洞对Docker的影响
影响
- 漏洞自Linux 2.6.22(发布于 2007 年)存在至今,并于2016年10月18日被修复。绝大多数基于linux内核的发行版(包括安卓在内)均受到影响。
效果
- 可使一个低权限用户提升至root权限。
1 | test@ubuntu:~$ uname -a |
DirtyCow套路Docker
vDSO是一个优化性能的功能。在vDSO的帮助页面上以gettimeofday为例进行说明,gettimeofday经常被用户空间的程序和C语言库调用。试想一下,如果一个程序需要立即知道当前的时间,就会频繁的进行定时循环或者轮询。为了减少开销,而且这不是私密信息,所以,它可以轻易并安全地在所有进程中共享。内核就需要负责把时间放在一个所有进程都能访问的内存位置。于是,通过在vDSO中定义一个功能来共享这个对象,让进程来访问此信息。
通过这种方式,调用gettimeofday的花销就大大降低了,速度也就变得更快了。
通过漏洞将shellcode写入本不能写入的vDSO(内核中特殊内存)
修改clock_gettime内核函数
当用户层程序调用clock_gettime函数(实际已经被替换),且是一个root权限的进程的时候,将会反弹回来一个shell
Docker逃逸与Vmware逃逸比较
https://cansecwest.com/slides/2016/CSW2016_Wang_DockerEscapeTechnology.pdf
2016年3月18日早上,在加拿大温哥华举行世界顶级信息安全峰会Cansecwest中来自360的
安全专家wangshengping@Marvel Team介绍了docker逃逸技术.理论上说,只要linux内核出现
任意代码执行漏洞,docker必然是可以逃逸的!
内核做,黑客看,Linus & Greg 留隐患!0day 一出天地灭,赶紧下线保平安!
诚心诚念 PaX 好,HardenedLinux 平安保。系统皆为安全来,
security > through obscurity 忘前缘,spender 弟子说真相,换你内核莫拒绝!
上网搜 CVE-2016-5195,有天机!
– 某个盖子@weibo
相比较Vmware
不论从启动时间,还是性能上比较
docker都是很有优势的
传统虚拟化从隔离性或者安全性上
远远优于docker
Docker在安全中的应用
安全研究者研究漏洞最头疼的就是找环境
1.如果自己搭建费时费力
2.如果从网上找真是环境一是不好找,二是违法的
所以使用docker保存漏洞环境是最完美
如下是几个大佬的github Docker库
漏洞靶场
域名使用泛解析,指向docker服务器(端口总有用完的时候,域名却不用,而且端口容易被其他人探测,但64位长度的域名却很难猜解)
反代根据情况进行代理
如果保证remote_api的安全,限制远端服务器ip只能是xxx