如何通过利用漏洞获取远程 shell 真的有效?

信息安全 开发 脆弱性 外壳代码
2021-09-06 10:53:22

我可以理解缓冲区溢出是什么,并且它允许您在您不应该能够写入的内存位置进行写入。我还可以理解可能存在其他软件漏洞的概念,这些漏洞以不同的方式工作,允许您将想要的东西放入内存中。我还使用 metasploit 访问了我的一些旧 XP 机器,这很有趣。

但是我无法真正理解如何通过考虑(例如)缓冲区溢出漏洞来访问远程系统。

有几点我不清楚:

  1. 有漏洞的程序是否需要运行并监听受害机器上的特定端口(如迷你服务器或其他东西)?如果一个写得不好的程序不监听端口,它可以被远程利用吗?
  2. 我假设程序将从该端口读取一些输入,然后将其写入某个变量的内存中,并可能对其进行处理。为程序提供比它应该读取的更多的数据,并假设它存在漏洞,它将写入内存中的某个位置(特别是在变量之后)我们想要的任何位置。这怎么不会在 99.9% 的情况下使程序崩溃?如果恰好在内存中存储此变量的位置之后有一个指向某个函数的指针无法执行并且程序崩溃了怎么办?
  3. 假设程序没有崩溃,我们如何执行我们注入内存的代码?我们是否需要将我们想要的代码放在内存中我们知道它将被执行的地方?如何执行内存的一些随机部分?几乎从来没有在我的程序中执行我的某个变量,除非我想运行其他程序,这非常罕见,并且不应该与直接从内存中执行代码相同(这让我想起了 eval())。
  4. 如果第 2 点正确假设漏洞通常出现在易受攻击的程序从端口读取恶意输入并且执行此代码时,那么执行的代码如何能够返回给我,攻击者?我是否将恶意代码发送到我的 IP 地址中的变量或其他东西中?
  5. 程序通常无法读取或写入另一个程序的内存。这是否意味着当易受攻击的程序关闭时,我将失去与打开的远程 shell 的连接?还是一旦它执行并且我实际上连接到它,它是否会产生一个独立的子进程?

任何人都可以给我一个简单但现实和彻底的例子来说明整个系统是如何工作的,从程序监听某个端口到攻击者获得一个 shell?

2个回答
  1. 易受攻击的程序需要侦听端口才能直接通过网络访问它们。但是,您可以通过其他方式访问系统,然后利用无法访问网络的易受攻击的程序(例如,触发 PDF 阅读器漏洞的电子邮件恶意软件)

  2. 了解易受攻击的程序如何以可预测的方式运行是发现和利用漏洞的关键。简而言之,在发送漏洞利用之前,您必须已经知道堆栈中会发生什么。这就是为什么,就像所有编程一样:测试、测试、测试。

  3. 如果您了解 BO,那么您就知道您在指针将指导执行的位置写入堆栈。这就是我们执行代码的方式。

  4. 就像我的#1 一样,易受攻击的程序不需要是在端口上运行的网络服务。如果您想要一个“反向外壳”,那么外壳代码必须包含连接回您所需的网络代码。

  5. 是的,是的。如果您不迁移到另一个进程(嵌入到正在运行的进程或由您的代码触发的新进程),那么一旦易受攻击的程序结束,您的连接也会结束。所以,迁移。

我的回答是对您的问题的非常简单化的看法。您可以做很多事情来深入挖掘我提供的内容,甚至是与我所说的内容相矛盾的技术,但这些都是非常基础的。

简单场景:

易受攻击的 FTP 服务器正在端口上运行。您发现某个 FTP 命令没有得到适当的约束,因此可能会发送过大的命令参数并写入 FTP 服务器访问的部分堆栈。您设计的代码(包括网络功能)可以适应 FTP 程序占用的堆栈空间。然后您连接到 FTP 服务器并使用您的 shellcode 作为有效负载发送命令。当 FTP 服务器处理命令时,它会访问您的代码并处理有效负载。你的 shellcode 执行并创建一个网络连接回到你的机器。

缓冲区溢出允许攻击者在从函数返回时覆盖应用程序使用的堆栈上存储的地址。一旦攻击者控制了这个地址,他们就可以通过返回应用程序的不同部分或它使用的库来转移程序的执行。

在其最简单的形式中,攻击者可以在地址覆盖范围之外将 shell 代码写入堆栈,并将返回地址设置为jmp esp将 eip 指向堆栈的指令,并将堆栈上的数据作为代码执行。

然后,shell 代码可以建立出站连接或侦听端口。

远程利用一词通常适用于没有守护程序的程序,例如浏览器或通过电子邮件向某人发送利用打开程序中的漏洞的文件,即:PDF 文件。