
Userland exec PoC to be used as attack vector technique
Userland exec 在当前地址空间内用一个新的进程映像替换现有的进程映像。它模拟系统调用 execve 的行为,但描述进程映像的进程结构保持不变。换句话说,系统工具报告的进程名称将保留旧的进程名称。
该技术可用于在获得任意代码执行后实现隐蔽性。它还可用于执行存储在 noexec 分区中的二进制文件。
第一个 userland exec 由 grugq 创建。本仓库深受 Rapid7 Mettle library 的启发,其中包含对该技术的全面 博客描述。
最初,本仓库的大部分代码模仿了 Mettle 库,但后来已扩展出额外的复杂性以绕过 SELinux 验证。
SELinux 包含 execmem 验证,该验证确保:
mprotect 将 PROT_WRITE 改为 PROT_EXEC 是不被允许的)。mprotect要绕过 mprotect,必须创建一个临时文件。这可以通过将 memfd_create 与 munmap 和 mmap 结合使用来实现,从而完全避免使用 mprotect 系统调用。
elf_debugger.c 示例表明,任何 ELF 都包含一个既可执行又可写的 PT_LOAD 区域。该区域在执行期间是加载程序信息所必需的。为解决此问题,创建了 bypass_wx.c 实现。该设计:
SIGSEGV 信号。PROT_EXEC 更改为 PROT_WRITE。本节介绍如何为 Android 和 x86 机器构建。在继续之前,请确保已安装 libelf。
mkdir build && cd build
cmake ..
make
desktop % strace ./uexec hello others args here 2>&1 | grep exec
execve("./uexec", ["./uexec", "hello", "others", "args", "here"], 0x7ffc34ec02f0 /* 54 vars */) = 0
desktop % strace bash -c ./hello 2>&1 | grep exec
execve("/usr/bin/bash", ["bash", "-c", "./hello"], 0x7ffebecc3130 /* 54 vars */) = 0
newfstatat(AT_FDCWD, "/desktop/userland-exec/build", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
newfstatat(AT_FDCWD, "/desktop/userland-exec", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
execve("./hello", ["./hello"], 0x5fb22658e2a0 /* 54 vars */) = 0
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-30 ..
make
desktop % adb push uexec hello /data/local/tmp
uexec: 1 file pushed, 0 skipped. 113.9 MB/s (22912 bytes in 0.000s)
hello: 1 file pushed, 0 skipped. 184.9 MB/s (6936 bytes in 0.000s)
2 files pushed, 0 skipped. 0.3 MB/s (29848 bytes in 0.090s)
desktop % adb shell
dm3q:/ $ cd /data/local/tmp
dm3q:/data/local/tmp $ chmod +x uexec
dm3q:/data/local/tmp $ ./hello
Hello World
dm3q:/data/local/tmp $ ./uexec hello
Hello World
dm3q:/data/local/tmp $
在 CentOS 上,libc 库可能会表现出异常行为。为了解决此问题,提供了一个用汇编语言编写的简单 "Hello, World" 程序 hello_nolibc.s。该示例与 cmake 一起演示了如何构建和执行一个不链接 libc 的程序。
如果你的 CMAKE 版本高于 4.0,可以在构建中附加 -DCMAKE_POLICY_VERSION_MINIMUM=3.5。
本仓库使用 GPL-3.0 许可证。
| 操作系统 | 架构 | 结果 |
|---|
| Ubuntu 24.04 | x86_64 | 成功 |
| Archlinux 6.12.4 | x86_64 | 成功 |
| CentOS | x86_64 | 成功 |
| Raspberry Pi OS | arm64 | 成功 |
| S23 Android 14 | arm64 | 成功 |