
Heavily-modified fork of David Buchanan's dlinject project. Injects arbitrary assembly (or precompiled binary) payloads directly into x86-64, x86, and ARM32 Linux processes without the use of ptrace by accessing /proc/<pid>/mem. Useful for certain post-exploitation scenarios, recovering content from process memory, etc..
asminject.py 是 David Buchanan 的 dlinject 项目 的一个大幅修改版分支。它通过访问 /proc/<pid>/mem 而不是通过 ptrace 附加,将任意汇编(或预编译二进制)有效载荷直接注入 x86-64、x86 和 ARM32 Linux 进程。可用于篡改受信任的进程、某些后渗透场景、从进程内存中恢复内容,以及绕过某些安全控制。只要你在主机上拥有 root 权限,就可以从容器外部注入容器化进程。
你也可以在 Bishop Fox 工具页面上阅读更多关于 asminject.py 及其起源的信息,包括 一篇详细阐述启发该工具的写作。
本文档包含:
独立的更详细文档:
asminject.py 类似于 dlinject,但不同之处在于,它不只是加载库,而是可以注入你想要的任何有效载荷,并且适用于多种架构。"asminject.py 有点像 Frida,但不同之处在于它不通过 ptrace 接口附加,因此进程无法通过对自身进行 ptrace 来阻止它。"asminject.py 的编写主要针对 Linux 环境中渗透测试的两种场景:
例如,假设在一次渗透测试中,测试人员获得了托管许多容器的服务器的 root 访问权限。其中一个容器处理银行转账,并且内部安装了非常强大的端点安全产品。当渗透测试人员尝试在容器内修改银行转账数据时,端点安全软件会检测并阻止该尝试。asminject.py 允许渗透测试人员从容器外部直接将任意代码注入银行软件进程的内存,甚至注入端点安全产品本身。就像笛卡尔的 "邪恶恶魔" 的受害者一样,容器内的安全软件无能为力,因为它所处的环境完全在攻击者的控制之下。
最初的 dlinject.py 专门设计用于将 Linux 共享库加载到现有进程中。asminject.py 实现了原工具的所有功能,并且功能更多。它可以执行任意汇编代码,并包含多种攻击的模板。它也被重新设计,以帮助规避那些以可疑活动(如库加载事件)作为检测依据的安全机制。
本仓库的 practice 目录包含基本的循环代码,用于向控制台输出时间戳和循环迭代次数,以便你在受控环境中练习注入各种类型的代码。这些练习循环将在后续示例中被引用。
调用 asminject.py 的基本语法如下:
# python3 ./asminject.py <target_process_id> <payload> \
--arch [x86-64|x86|arm32] --relative-offsets-from-binaries --stop-method "slow" \
--var <payload_variable_1_name> <payload_variable_1_value> \
# ... \
--var <payload_variable_n_name> <payload_variable_n_value>
在大多数情况下,示例中使用的任何有效载荷都可以在任何受支持的架构上运行。
大多数 Linux 发行版都包含一个名为 Yama 的内核安全模块,用于控制对使用 ptrace 能力来操作其他进程的访问。虽然 asminject.py 不附加到调试器接口,但它仍然需要权限才能使用 ptrace 能力。如果你收到有关此能力的错误,请检查 /proc/sys/kernel/yama/ptrace_scope 的内容。如果其值设置为 2,则以 root 身份运行以下命令:
echo 1 > /proc/sys/kernel/yama/ptrace_scope
值为 3 或更高时,如果不重启则无法取消设置。但是,如果你是某台 Linux 系统的授权管理员,而有人不小心将 /proc/sys/kernel/yama/ptrace_scope 设置为 3,或者你正在对设置了该值的环境进行授权渗透测试,请参阅 ptrace_scope_kernel_module 目录,了解一种无需重启的潜在解决方法。
gcc 命令。eval 式执行),提供利用此能力实现更高隐蔽性的有效载荷。dlinject.py 继承的 "挂钩下一个 syscall" 技术的替代方案。asminject.py 注入 Frida 的方法可能更有意义——需要更多研究。asminject.py 提示操作员输入要注入的一行代码,注入它,返回产生的输出,然后提示操作员输入另一行代码。
asminject.py 注入到进程中,并且这种方式能避免 Frida 需要临时调用调试器接口的问题,那么使用 Frida 处理这种情况可能也更有意义。asminject.py 运行的架构不匹配。例如,使用 PCI leech 等硬件与远程设备交互,利用极端边界情况,例如通过 NFS 共享以 root 身份可访问 /proc/mem 的设备等。