ModPipe后门打入了酒店业使用的POS软件

阅读量    179049 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

ESET的研究人员发现了ModPipe,这是一个模块化后门,可以让操作人员访问存储在运行ORACLE MICROS餐饮企业系列(RES) 3700 POS设备上的敏感信息–这是一套被全球数十万家酒吧、餐馆、酒店和其他酒店机构所使用的管理软件套件。

使后门与众不同的是它的可下载模块和它们的功能。其中一个名为GetMicInfo的程序包含一个算法,通过从Windows注册表值解密数据库密码来收集这些密码。这表明后门的作者对目标软件有很深的了解,并选择了这种复杂的方法,而不是通过一个更简单但“响亮”的方法收集数据,如键盘记录。

借助泄露的凭据,ModPipe的操作人员访问数据库内容,包括各种定义和配置、状态表和有关POS交易的信息。

然而,根据RES 3700 POS的文件,攻击者应该无法访问一些最敏感的信息,比如信用卡号和到期日–这些信息都受到加密保护。唯一存储在明处,从而可供攻击者使用的客户数据应该是持卡人姓名。

这将限制可供进一步出售或滥用的有价值信息的数量,使其背后的完整 “商业模式 “不明晰。一种可能的解释是,存在另一个可下载的模块,使恶意软件运营商能够解密用户数据库中更敏感的数据。

根据文件,要做到这一点,攻击者必须对 “特定站点密码 “的生成过程进行逆向工程,该密码是用来获取敏感数据的加密密钥的。然后这个过程必须在模块中实施,并且由于使用Windows数据保护API(DPAPI),这个过程是直接在受害者机器上执行的。另一个未知因素是ModPipe的分布方法。已确定的目标对象大多数来自美国,有迹象表明他们是餐馆和酒店业,这些都是RES 3700 POS的主要客户。

 

ModPipe架构

我们的分析表明,ModPipe采用的是由基本组件和可下载模块组成的模块化架构(详见图1)。

  1. 初始dropper – 包含下一阶段(持久性加载器)的32位和64位二进制文件,并将适当的版本安装到受损的机器上。
  2. 持久性加载器 – 解压并加载恶意软件的下一阶段,即主模块。
  3. 主模块 – 执行恶意软件的主要功能。它创建一个用于与其他恶意模块通信的管道,解除/安装这些模块,并作为处理模块与攻击者的C&C服务器之间通信的调度器。
  4. 网络模块 – 用于与C&C通信的模块。
  5. 可下载模块 – 为后门程序添加特定功能的组件,例如窃取数据库密码和配置信息的能力,扫描特定IP地址或获取正在运行的进程及其加载模块的列表。

 

可下载的模块

ModPipe最有趣的部分可能是它的可下载模块。自2019年底,当我们首次发现并分析其 “基本 “组件时,我们就已经知道了它们的存在。

2020年4月,经过几个月的搜索,我们在自然环境下发现了其中三个这样的模块。表1列出了我们找到并分析的所有可下载模块及其id(由16位无符号值表示)。我们的研究还表明,运营商至少还使用了另外四个可下载的模块,目前我们仍然完全不知道它们的功能。

值得一提的是,其中一些模块可以用ID衍生的GUID格式的名称创建一个命名管道。其他模块可以使用该管道向创建该管道的模块发送命令。

可下载的模块:GetMicInfo

GetMicInfo是一个可下载的组件,其目标是与MICROS POS相关的数据,包括与制造商预定义的两个数据库用户名相关的密码:dba和micros(见图2)。这些信息被加密并存储在DataS5(针对dba)和DataS6(针对micros)注册表值中,包含在以下一个注册表键中:

  1. HKLM\Software\Micros\UserDataor
  2. HKLM\Software\WOW6432Node\Micros\UserDataif run in Windows 32-bit on Windows 64-bit (WOW64) subsystem

GetMicInfo模块可以使用专门设计的算法拦截并解密这些数据库密码。为了不帮助其他恶意行为者,我们不会透露算法的内部工作原理。由于解密机制并没有公开,攻击者创建算法的可能情况至少有以下三种:

  1. 最有可能的选择是,攻击者获取并反向工程了ORACLE MICROS RES 3700 POS的实现以及负责数据库密码加密和解密的库。
  2. 攻击者可能从布莱恩-克雷布斯(Brian Krebs)在博客中描述的2016年数据泄露事件中获得了描述加密和解密机制实现的信息。
  3. 恶意软件运营商可能从地下市场购买了代码。

我们的分析表明,在GetMicInfo模块为dba用户名解密的情况下,它还会尝试从环境变量 “SQLANY_API_DLL “中获取SQL Anywhere API库的路径,并在可用的情况下加载它。

如果环境变量不存在,模块会尝试使用其名称dbcapi.dll加载库。这个库是Sybase SQL Anywhere的一部分,它被RES 3700 POS所使用。

如果这些方法之一成功,GetMicInfo 会尝试使用以下连接字符串连接到数据库:

DBN=micros;UID=dba;ENG=sql%PCNAME%;PWD=%decrypted_DataS5%

%PCNAME% 代表通过GetComputerName API检索到的计算机名称,而%decrypted_DataS5% 代表解密后的dba用户密码。

建立连接后,GetMicInfo会尝试执行以下SQL查询,并使用ID为0x10000013的管道消息将结果报告给主模块(关于管道消息及其ID的完整列表,请参见表3):

查询的数据包含各种MICROS RES 3700 POS系统定义和配置(参见图3)。其他被模块窃取的信息包括MICROS POS的版本和最有可能与各种信用卡服务配置有关的特定注册表键的信息。

GetMicInfo模块被注入到安装命令(0x0C)中C&C指定的一个进程中。根据我们的调查结果,它通常与下列合法进程之一有关:

  1. MDSHTTPService.exe(MICROS MDS HTTP Service)
  2. CALSrv.exe(MICROS CAL Service – Client Application Loader server)
  3. explorer.exe

我们可以确认,GetMicInfo模块可以成功地从RES 3700 POS v4.7和v5.4中获取数据库密码。对于所有其他版本,我们既无法确认也无法否认该组件获取目标库的能力。

可下载的模块:ModScan 2.20

ModScan 2.20的主要目的是通过扫描选定的IP地址来收集机器上安装的MICROS POS环境的额外信息。ModScan 2.20模块通过InstallMod命令(0x72)被注入到C&C指定的一个进程中。根据我们的发现,它通常与下列合法进程之一相关联:

  1. MDSHTTPService.exe(MICROS MDS HTTP Service)
  2. CALSrv.exe(MICROS CAL Service – Client Application Loader server)
  3. msdtc.exe
  4. jusched.exe
  5. spoolsv.exe
  6. services.exe

被GetMicInfo滥用的注入进程与ModScan 2.20所针对的进程之间的差异可能是由于GetMicInfo模块只被注入到WOW64下运行的进程中。

用于扫描的IP地址列表和特殊的“ping”IP地址由C&C以两种方式之一指定。它是:

  1. 与ModScan模块一起从C&C下载。
  2. 使用与ModScan模块相关联的命名管道,在运行时接收。

ModScan模块处理表2中列出的管道命令。

扫描程序

1.在扫描之前,模块向 “ping “IP地址的TCP端口50123(MDS HTTP服务使用)和2638(SAP Sybase数据库服务器使用)发送一个特殊的 “ping “消息,其中包含一个由GetTickCount Windows API函数生成的32位值。

2.来自 “ping “IP地址的响应应包含相同的32位值,将其右移一位,并与0x6CF6B8A8的值进行XORed(异或)。如果至少有一个端口的响应提供了合适的值,模块将开始扫描所选的IP地址。该ping函数的反编译如图4所示。

3.当ModScan模块开始扫描时,根据收到的扫描命令参数,可能会收集以下一些信息:

  1. Oracle MICROS RES 3700 POS的版本,它是通过向MDS HTTP服务使用的50123端口上的指定IP地址发送HTTP Post消息(见图5)获得的。寻求的信息存储在服务响应的数据xml标签(<data>%version%</data>)之间。

  1. 数据库的名称,通过向SAP Sybase数据库服务器使用的2638端口上的选定IP地址发送特制的TCP数据包(可能使用CMDSEQ命令协议)提取。代表数据库名称的字符串位于数据库服务器发送的响应的偏移量0x28处。
  2. 数据库服务器数据,如其名称、TDS协议版本和TDS服务器版本。为了获得这些信息,ModScan模块发送一个硬编码的TDS 4.2和5.0登录包(图6)到2638端口的指定IP地址。响应包括一个登录确认包,在这两种情况下(成功和失败),它包含有关数据库服务器和使用的TDS版本的信息。TDS登录数据包是硬编码的,用户名设置为内置的dba,密码也是硬编码的,这可能是某些RES 3700 POS版本的默认密码。由于我们还没有找到任何公开的关于这个密码的参考资料,所以我们不会在博客中公布这个密码。

可下载模块:ProcList

我们能够获得并剖析的最后一个下载模块是ProcList。这是一个没有指定ID的轻量级模块。它的主要目的是收集当前正在运行的进程信息,包括:名称、进程标识符(PID)、父进程PID、线程数、令牌所有者、令牌域、进程创建时间和命令行。

ProcList还可以选择性地为每个正在运行的进程收集有关已加载模块的信息。收集到的信息被发送到后门的主模块(使用管道消息0x10000013)。

 

初始dropper

初始的dropper负责安装下一阶段的恶意软件。在调查过程中,我们在两台受损机器上发现了一个dropper可执行文件,存储在以下位置:

  1. C:\IQXDatabase\Live\1.exe
  2. C:\OasisLive\1.exe

每次执行初始dropper时,都会生成一个独特的配置,主要使用随机字节。这将导致加载器的散列值随着每次执行而改变,从而使恶意软件的检测和跟踪复杂化。Dropper组件可以将加载器投放到两个可能的位置,并通过创建Windows服务或Windows注册表Run键来设置持久化机制(详情请参考Compromise指标部分)。

加密后的有效载荷包含了dropper的主要功能,以从A到L命名的位图形式存储在dropper的资源中,dropper使用提供的命令行参数对这个有效载荷进行解密,然后执行它。该有效载荷负责根据系统架构解密相应的加载器,因此可以是32位或64位。每个加载器都使用自己的XOR密钥进行加密,每个密钥长0x80字节。负责从二进制的资源中加载有效载荷,其解密和执行的反编译代码如图7所示。

图8中可以看到一个加密和解密配置的例子,并给出了解释说明。所示的配置来自dropper样例安装的加载器,其SHA-1散列值为9f8530627a8ad38f47102f626dec9f0173b44cd5。请注意,旧版和新版的加载器可执行文件之间的配置的结构会有所不同。

 

持久性装载机

该组件负责解开主模块的包装,并将其注入以下进程之一:

  1. lsass.exe
  2. wininit.exe
  3. services.exe

为了解压主模块,持久性加载器在32位和64位版本中使用了不同的方法。32位的加载器与初始的dropper几乎相同–唯一的区别是资源中存储的有效载荷,而64位的加载器则使用完全不同的 “解压包 “代码。

我们发现了7个不同版本的加载器可执行文件,每个版本的编译时间戳都不一样,最古老的可能源于2017年12月,最晚的则是2020年6月。完整的时间线见图9。所有加载器散列值的清单包含在 Compromise部分的指示器中。

 

主模块

主模块主要负责管理C&C的通信,以及处理从C&C或下载模块接收到的消息/命令。为了方便与模块之间的通信,主模块首先创建一个管道,管道的名称是随机生成的,其格式字符串如下:

{%08X-%04X-%04X-%04X-%08X%04X}

然后,它使用PeekNamedPipe Windows API函数定期检查管道是否有新消息。消息将根据其内容进行解析和处理。有关识别的管道命令和消息的完整列表,请参见表3。

通过管道传输的消息所使用的详细结构和格式请参考图10。

对于与其C&C服务器的通信,主模块使用HTTP和80端口。每一个被剖析的样本都包含一个潜在可用的服务器列表,从中随机选择一个。在我们的研究过程中发现的所有C&C地址的清单可在 Compromise部分找到。

发送给C&C的信息(见图11)是在主模块的代码中构建和加密的。

在与C&C进行任何通信之前,主模块生成两个干净的url,并使用它们来检查互联网连接和恶意流量是否干净。url使用以下格式www.%domain%[.]com/?%rand%,其中%domain%是从谷歌,bing和yahoo中随机选择的,%rand%是一个随机的32位无符号整数,用ASCII表示。

与C&C的通信采用CBC模式下的AES加密,密钥为128位:F45D076FEC641691A21F0C946EDA9BD5. 在加密之前,C&C信息先有一个4字节的校验和,校验和的计算方法是CRC32(信息)与用于加密信息的AES密钥的前4个字节XORed(异或)。在上述关键的情况下,应该是F4 5D 07 6F。

使用轻量级网络模块传输数据,按需注入,上传或下载请求的消息发出后立即退出。为了选择注入的进程,主模块枚举正在运行的进程,并给它们分配一个3到6之间的优先级值。根据以下标准,优先级较高的进程先注入:

优先事项6

最高的优先级,分配给任何已经被成功用于注入网络模块的进程,该进程收到了来自C&C的响应,并且仍然以相同的PID、名称和创建时间运行。

优先级 5

没有扩展名的进程名与下列浏览器使用的进程名相匹配:iexplore, opera, chrome, firefox

优先事项4

没有扩展名与以下进程名相匹配的进程名:explorer、svchost

优先事项3

所有其他正在运行的进程,但不包括以下系统进程:system, lsass, csrss, lsm, winlogon, smss, wininit

优先级列表背后的主要原因是为了注入预计会通过网络通信的进程,同时避免系统进程如果被发现通过网络通信可能会引起注意。

 

网络模块

该ModPipe模块负责向C&C发送请求,并解析C&C响应中收到的有效载荷。图12和图13所示的带有头文件(headers)的HTTP POST或GET方法可用于向C&C上传数据,并下载额外的有效载荷和C&C命令。

来自C&C服务器的响应必须至少有33个字节的长度才能被网络模块解析,并且恶意有效负载位于一个由13个空格组成的序列之后,后面跟着一个HTML注释开始标记。图14所示是一个包含这个序列的服务器响应的示例。

如果所有条件都得到满足,网络模块使用ID为0x10000072的管道消息向主模块发送C&C响应。然后主模块对有效载荷进行解密,验证其校验和,并执行C&C命令。可用的命令列在表4中。

 

结论

ModPipe显示了不少有趣的功能。最有趣的发现可能是隐藏在后门的一个模块中的算法,它是专门设计来通过解密注册表值来窃取凭据的。通过获取数据库密码,攻击者获得了广泛的敏感信息访问权,即使在运行RES 3700 POS的设备中存储的最敏感数据仍然需要加密保护。

ModPipe的架构、模块及其功能也表明,其编写者对目标RES 3700 POS软件有丰富的知识。操作者的熟练程度可能来自多种情况,包括窃取和逆向工程专有软件产品,滥用其泄露的部分或从地下市场购买代码。

为了阻止ModPipe背后的经营者,建议酒店业的潜在受害者以及任何其他使用RES 3700 POS的企业:

  1. 使用最新版本的软件。
  2. 在运行更新操作系统和软件的设备上使用。
  3. 使用能够检测ModPipe和类似威胁的可靠多层安全软件。
分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多