网络协议模糊测试之旅——剖析MicrosoftIMAP客户端协议(上)
2023-5-27 12:1:17 Author: 嘶吼专业版(查看原文) 阅读量:12 收藏

网络协议是一组规则,定义了用于解释计算机发送的原始数据的标准格式和过程。网络协议就像计算机的通用语言。网络中的计算机可能使用截然不同的软件和硬件;协议的作用就是使其可以相互通信。

许多网络协议服务于不同的目的,其中一些可能很复杂。由于其固有的复杂性,网络应用程序中的安全漏洞是不可避免的。与其他攻击媒介相比,网络应用程序中的安全漏洞通常会产生更显着的安全影响,因为攻击者可能能够利用这些漏洞在易受攻击的计算机上获得远程代码执行状态,而无需任何用户交互。我们已经在现实生活中看到过此类攻击,例如臭名昭著的WannaCry勒索软件,它利用简单消息块(SMB)协议(称为EternalBlue)通过加密数据和要求以比特币加密货币支付赎金来攻击MicrosoftWindows计算机。迄今为止,据估计,这种恶意软件已经影响了150个国家的20多万台电脑。

强化网络应用程序是一项关键任务,可以最大限度地减少WannaCry等攻击媒介。研究人员致力于确保使用网络协议模糊测试等工具正确保护许多最流行的网络应用程序。这种漏洞发现技术将格式错误的数据包发送到正在测试的应用程序,以发现网络协议实现中的漏洞。发现并报告这些漏洞,特别是在常用应用程序中,有助于降低每个人的网络风险。

Fortinet的研究人员与其他威胁研究团体一起帮助实现这一目标。在本博客中,我们记录了审核和模糊测试MicrosoftInternet消息访问协议(IMAP)客户端协议的过程。虽然我们没有发现任何新漏洞,但详细的指南可以帮助其他人在他们的威胁发现和分析工具库中添加或改进模糊技术策略。

网络应用程序使用客户端和服务器架构来交换数据。然而,即使它们共享相同的网络协议规范,客户端和服务器之间的数据解释也是不同的。数据解释通常由在各个组件中实现的解析器按照单独的规范执行。因此,研究人员必须同时检查客户端和服务器,以确保解析器正确实现。

我们的经验表明,在审计安全实现时,服务器比客户端更受研究人员的关注。但是,不太安全的客户端也可能包含可以被利用的高价值目标。但是由于我们没有看到供应商公开报告的许多IMAP客户端安全问题,我们决定研究IMAP客户端实现,同时获得一些关于开源模糊器WhatTheFuzz(WTF)的实践经验。WTF是一种分布式、代码覆盖引导、可定制、跨平台的基于快照的模糊器,旨在攻击运行在MicrosoftWindows上的用户或内核模式目标。

本文中没有漏洞披露,因为我们没有在MicrosoftIMAP客户端中发现任何安全问题。但我们确实分享了一些兔子洞、我们遇到的限制以及调试WTF模糊器模块的提示和技巧。我们还将介绍一个特别有趣的IMAP响应输入的逆向过程,该输入最初似乎很脆弱,但在深入研究代码后发现是良性的。

IMAP客户端支持用于不同IMAP操作的各种命令。客户端命令开始一个操作并期望来自服务器的响应。每个客户端命令都以称为“标记”的标识符作为前缀。对于客户端发送的每个命令,这个“标签”应该是唯一的。通常,客户端命令如下所示:

重要的是,客户端必须严格按照规范遵循语法。发送缺少或无关的空格或参数的命令是一个语法错误。

IMAP连接包括建立客户机/服务器网络连接、来自服务器的初始问候以及客户机/服务器交互。这些客户机/服务器交互包括客户机命令、服务器数据和服务器完成结果响应。

客户端和服务器传输的所有交互都是行的形式,即以回车和换行结尾的字符串。

客户端需要做的第一件事是在特定端口上与远程服务器建立连接。在这种情况下,我们使用openssl从终端连接到自定义IMAP服务器。

注意到服务器状态响应以“*”为前缀,称为未标记响应,表示服务器问候,或服务器状态不表示命令完成(例如,即将发生的系统关闭警报)。

客户端通常发送的下一个命令是CAPABILITY。CAPABILITY命令允许客户端获取服务器支持的功能列表。未在未标记响应中列出的任何功能都将被标记响应中指示的服务器视为BAD命令。

状态响应可以加标签或不加标签。标记状态响应指示客户端命令的完成结果(OK、NO或BAD状态),并具有与命令匹配的前缀标记。

客户端必须先向IMAP服务器进行身份验证,然后才能导航邮箱。有一些IMAP服务器实现允许匿名访问某些邮箱。像下面的例子一样,我们的自定义IMAP服务器允许匿名访问。但是,值得注意的是,经过身份验证的客户端的功能列表通常与未经身份验证的客户端不同。登录的客户端通常包含更多来自IMAP服务器的未锁定功能。

现在客户端已登录,它可以列出邮箱中存在的文件夹

这样,我们就可以看到邮箱中存在的文件夹层次结构。文件夹具有名称属性,在括号中表示。一些属性对于遍历文件夹层次结构很有用,例如HasNoChildren和HasChilden。HasNoChildren属性的存在表明邮箱没有当前经过身份验证的客户端可访问的后来邮箱。

在知道邮箱的文件夹结构后,客户端可以使用SELECT命令在该文件夹上打开一个会话,以便访问邮箱中的邮件。

当返回选中状态时,服务器必须先将上述未标记的数据发送给客户端,然后再向客户端返回OK。如果选择状态建立成功,则称客户端处于选择状态,可以从邮箱中搜索和下载消息。

SEARCH命令在邮箱中搜索与给定搜索条件匹配的邮件。搜索条件由一个或多个搜索关键字组成。它可以支持更全面的搜索条件,例如查找具有指定字段名称的标题并且在标题的文本中包含指定字符串的消息。上面的示例显示了最简单形式的SEARCH命令,它将搜索服务器中的所有可用消息。未标记的响应表明自定义IMAP服务器中有一条消息可用。

一些客户端提供电子邮件消息的预览。这可以通过使用FETCH命令仅下载消息标头来完成。而UIDFETCH命令将下载整个电子邮件消息并将其本地存储在客户端应用程序中。

IMAP客户端—服务器的状态和流程图

在现代模糊控制中,需要有一个线束与主模糊控制程序一起驱动模糊控制操作。虽然这不是强制性的WTF模糊器,一个专用的模糊器模块是必需的。如果你有AFL/WinAFL的经验,很多时间将花费在编写一个有效的harness程序上,但是你将花费大部分时间开发和排除WTF模糊器模块的故障。在内部,WTF模糊器充当模拟器,以编程方式模拟由模糊器模块驱动的内存转储中的代码。基本上,模糊器模块的核心由函数断点和断点处理程序组成。这些断点处理程序由用于不同目的的逻辑组成,例如拦截和修改目标使用的输入数据,以及复制功能(如I/O操作、注册表操作和线程调度)。该项目的存储库为模糊器开发过程提供了全面的指导方针。

首先,必须确定要模糊化的目标组件,并转储一个虚拟映像的快照,以供模糊化模块使用。根据来自项目存储库的文档,该快照映像通常取自感兴趣的目标模块的入口点,其中解析器例程使用输入数据。在MicrosoftIMAP客户端中,InternetMail.dll是实现IMAP和POP3客户端协议的目标组件。这个DLL模块由Windows服务宿主进程托管,也被称为svchost.exe。

WindowsMail是与该模块交互的前端用户界面(UI),用户可以通过该界面设置IMAP帐户,并从邮件服务器下载邮件消息。在编写我们的IMAP客户端模糊器模块时,我们遇到了许多障碍,幸运的是,其中一些在项目的问题跟踪器中有部分记录。尽管大多数障碍都是针对于你所致力于的任何目标,我们认为记录这些挑战和我们的工作区可能会有所帮助。

为WTF模糊器编写一个模糊器模块并不是一件容易的事。这是因为我们试图从内存转储中模拟代码。在软件模拟世界中,你不能期望模拟代码的行为与在本机设备上执行的代码相同。因此,要使模拟按预期工作,需要解决许多障碍。因此,在开始之前确定适当的工具来跟踪和调试模糊器模块是至关重要的。

WTF模糊器支持两种类型的跟踪文件,覆盖跟踪日志和Tenet跟踪文件。基本上,覆盖跟踪日志包含模拟器正在执行的每条指令的跟踪。它有助于诊断大多数模糊器模块问题。Tenet跟踪文件包含每条执行的指令以及每条指令操作的内存/堆栈数据。Tenet插件只能使用一个Tenet跟踪文件。Tenet是一款出色的跟踪记录和回放IDAPro插件,可用于离线调试。WTF模糊器生成的Tenet跟踪文件可以通过IDAPro回放。这样,它允许用户探索已执行的代码,甚至分析读取/写入内存/堆栈的数据,从而使调试和故障排除模糊器模块变得更加容易。

但是,需要注意的是,如果记录的跟踪文件太大,插件需要很长时间来处理它。例如,一个几千兆字节的跟踪文件很容易占据大部分主机内存,这可能无法通过IDAPro重播跟踪。作为一种解决方法,我们向WTF模糊应答器引入了一个“——trace-start -address”命令行参数,以便模糊应答器只有在到达指定地址时才开始跟踪。这个新引入的命令行参数显著减少了跟踪文件的大小。然而,这种过滤机制的结果在某些情况下并不是很成功。我们有时仍然会得到一个大的跟踪文件,因为所关心的函数中的起始地址不是唯一的。例如,函数可能会在多个不确定的位置触发,导致跟踪器意外触发,这就违背了我们的目标。

经过测试,我们发现WinDbg Preview中的time - trip - debugging (TTD)特性也可以用于离线调试。WinDbg预览将附加一个正在运行的进程,并在目标进程中注入一个TTD专有的跟踪DLL。注入的跟踪程序DLL负责捕获目标进程的运行时执行,并将执行的代码保存在存储在物理磁盘中的跟踪文件中。为了模拟这个过程,我们创建了一个简单的IMAP服务器,它读取以JSON格式定义的IMAP数据包,并在IMAP连接建立时将数据包发送给连接的客户端Windows Mail。同时,WinDbg Preview被附加到Windows主机进程,用于服务记录代码执行情况。这种方法的缺点是每次只能手动生成一个执行跟踪。但是,TTD仍然是一个有用的特性,可以补充离线调试体验。

为目标可执行文件生成代码执行跟踪的替代方法

另一个用例通过比较TTD和Tenet生成的跟踪信息,利用差异调试技术对模糊器模块产生的更多问题进行深度故障排除。尽管如此,Tenet仍然是在模糊器模块开发过程中产生跟踪文件来调试更复杂问题的首选。

接下来我们将分享一些技巧,这些技巧可以直接从覆盖跟踪日志中而不是使用Tenet跟踪文件来确定一些更明显的问题。这有望为你节省模糊器模块开发的时间。

WTF模糊器模块在WTF框架之上运行。每个模糊器模块必须实现WTF框架注册的回调函数,然后由WTF可执行文件触发。

IMAP包括创建、删除和重命名邮箱、检查新消息、永久删除消息、设置和清除标志以及选择性获取消息属性和文本的操作。因此,为IMAP协议实施一个全面的突变策略可能会耗时。在本例中,我们只关注Windows Mail用于与IMAP服务器交互的特定IMAP命令。首先,我们将WinDbg预览调试器附加到目标进程,以生成Windows Mail与真实的IMAP服务器(Gmail)交互的执行跟踪,以收集IMAP事务中的典型命令。清单1显示了调试器的输出,包括由Windows Mail客户机发送到Gmail服务器的IMAP命令。


清单1:WindowsMail客户端发送的调试器输出IMAP命令

这样我们的变异方法侧重于NAMESPACE、LIST、SELECT、SEARCH和FETCH命令的IMAP响应。我们决定跳过对UIDFETCH命令的模糊测试,因为此响应处理程序涉及对本地文件系统中的消息数据库的读/写。不幸的是,即使WTF默认提供了I/O子系统模拟框架,对于我们的案例来说,这个操作也无法轻松实现。我们认为这是一种合理的权衡,因为大多数重要的解析操作(如消息头解析器)都在FETCH命令中进行。

IMAP数据包由此处规范定义的一系列结构化文本消息组成。因此,我们的IMAP数据包变异策略也需要具有结构感知能力。受著名的结构感知突变库libprotobuf-mutator的启发,我们使用JSON文件格式来存储每个突变的IMAP响应。这个JSON文件将作为模糊器模块的输入测试用例。根据规范,JSON对象的关键组件是ResponseParams,它由IMAP客户端将解释的核心数据组成。尽管如此,我们的突变器将专注于从ResponseParams、ResponseStatus和ResponseType中改变数据。





清单2:示例IMAP响应输入测试用例

本文主要讲的是理论上的可能性,下一篇文章,我们会详细介绍实践中遇到的一些挑战。

参考及来源:https://www.fortinet.com/blog/threat-research/analyzing-microsoft-imap-client-protocol


文章来源: http://mp.weixin.qq.com/s?__biz=MzI0MDY1MDU4MQ==&mid=2247561832&idx=2&sn=a0b22a86224e65db57881a86b1539732&chksm=e9142252de63ab440a05e71d528bee8ad6942e69b0d9ae0b623db5a55d177f8542c650aa8ba1#rd
如有侵权请联系:admin#unsafe.sh