近几年POS恶意软件活动频繁,本文就2015年发现的一个新成员LogPOS样本进行分析。该恶意软件的一个重要的特点是其利用了邮件槽,可以躲避传统的检测机制。
此外,在该样本中,主程序创建了邮件槽,并作为邮件槽服务器,而注入到各个进程中的代码则作为客户端,它们将获取到的信用卡号码写入邮件槽,然后通过邮件槽直接将数据传输出去。
前言
在这之前,已经有过一次POS恶意软件的恶意活动。
2014年,Jeremy Humble和我发现了2个未曾曝光过的POS恶意软件家族,接着在2015年我们又发现了一个POS恶意软件的新家族。这次发现的恶意软件我们命名为“LogPOS”,它跟前段时间发现的POS恶意软件有几个显著的差异。
在本文接下来的部分中,我们将对LogPOS进行详细分析,该样本哈希值为:
af13e7583ed1b27c4ae219e344a37e2b。
科普:邮件槽(Mailslots)
Windows系统中提供了几种进程间通信的方式,邮件槽(Mailslots)就是其中的一种。
邮件槽提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。
通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送和接收消息的一种好的选择。#p#
深入分析
几乎在看到该样本的那一刻,一个字符串在我脑海中浮现出来:
\\.\mailslot\LogCC。
在大多数的POS变种中,都是利用一个进程读取其他进程的内存,然后将发现的跟踪数据写入到日志中。因为LogPOS将代码注入到了各种进程中,然后令其搜索各个进程的内存,所以此时无法使用日志,因为它们不能同时以写入访问模式打开同一个文件。所以,LogPOS选择使用了邮件槽。
使用邮件槽进行通信或存储对恶意软件来说并不是一种新机制,在火眼(FireEye)关于APT28的一份报告中,它提到该组织曾使用过邮件槽“check_mes_v5555”。邮件槽是一种IPC机制,它允许多个客户端向服务器发送消息。在本文所分析的样本中,主程序创建了邮件槽,并作为邮件槽服务器,而注入到各个进程中的代码则作为客户端,它们将获取到的信用卡号码写入邮件槽,然后通过邮件槽直接传输到C2。
在程序执行的开始处,程序以邮件槽名字\\.\mailslot\LogCC为参数调用了CreateMailslotA函数。
如果邮件槽创建失败,程序将会退出;否则,程序将进入一个无限循环,并按顺序执行下面的函数:
复制
1、休眠500毫秒 2、遍历进程 (1)与白名单进行比较 (2)将shellcode注入到进程中(如果不在白名单中) (3)扫描信用卡跟踪信息 (4)使用Luhn算法进行验证 3、读取邮件槽 4、将数据发送出去
1.
2.
3.
4.
5.
6.
7.
8.
最有趣的是注入的代码,所以接下来我们将更详细地对其进行分析。
在遍历进程(如上所述)时,恶意软件会将进程名与白名单进行比对,白名单主要包含以下名字:
复制
windbg.exe logounui.exe taskmgr.exe skype.exe thunderbird.exe devenv.exe steam.exe winlogon.exe wininit.exe csrss.exe smss.exe svchost.exe firefox.exe chrome.exe explorer.exe psi.exe pidgin.exe System
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
实现比较字符串功能的代码如下所示:
一旦发现某个进程名不在白名单中,就会利用函数WriteProcessMemory将代码注入到该进程的内存空间。Shellcode所做的第一件事就是寻找kernel32的基地址,利用其开始创建导入模块。寻找kernel32的方法在很多博客中都已经总结的很详细了。
一旦发现了基地址,shellcode将开始通过自己的哈希技术重建入口。一些哈希和对应值的列表如下所示。
建立入口之后,恶意软件会以文件名\\.\mailslot\LogCC为参数调用函数CreateFileA来获取一个用于写操作的文件句柄。
当扫描内存时,恶意软件将使用一个自定义搜索算法来查找跟踪信息的常见的标志。
然后,将找到的信息传递给实现的Luhn算法来进行验证。一旦此信息有效,则它们将会被发送到邮件槽中,以供后面主程序的读取。当按顺序增加一个数字后,恶意软件将创建一个格式化字符串,并将该信息发送到远程站点上。
然后,数据被发送到远程站点上(通过HTTP的GET方法)。
站点接收到的内容会被存放在一个表单中(在写本文时,表单内容并未加密)。表单中大部分的号码都在rdpclip和notepad的进程空间中,所以我们猜想可能该恶意软件作者正在测试他们的代码。相应内容和相关IP信息的截图如下图所示。
检测方法
因为LogPOS并不是通过扫描文件来获取未加密的信用卡信息,而是利用邮件槽的方法,所以它能够避开传统的检测机制。然而,如果使用类似yara这样的工具的话,将能够很容易地检测到该恶意软件的各种变体。下面的规则将能够帮助你在网络中找到这个恶意工具。
复制
rule LogPOS { meta: author = "Morphick Security" description = "Detects Versions of LogPOS" md5 = "af13e7583ed1b27c4ae219e344a37e2b" strings: $mailslot = "\\\\.\\mailslot\\LogCC" $get = "GET /%s?encoding=%c&t=%c&cc=%I64d&process=" //64A130000000 mov eax, dword ptr fs:[0x30] //8B400C mov eax, dword ptr [eax + 0xc] //8B401C mov eax, dword ptr [eax + 0x1c] //8B4008 mov eax, dword ptr [eax + 8] $sc = {64 A1 30 00 00 00 8B 40 0C 8B 40 1C 8B 40 08 } condition: $sc and 1 of ($mailslot,$get) }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
除了yara,这种POS恶意软件也能通过它的URI模式被检测出来,下面的签名将能够从网络中检测出该恶意软件。
复制
signature LogPOS { #source: Morphick Security #version: 1 #Ref: af13e7583ed1b27c4ae219e344a37e2b ip-proto == tcp dst-port == 80,443 http-request /.*encoding\=.*\&t\=.*\&cc\=.*\&process\=.*\&track\=/ event "LogPOS Credit Card GET Request Pattern" }
1.
2.
3.
4.
5.
6.
7.
8.
9.
结论
近几年,POS恶意软件已经在很多方面引起了关注。趋势科技最近报道说,在过去6个月中发现的POS恶意软件变种,比过去几年中发现的都要多。
例如,今年早些时候,Josh Grunzweig发现了一个Alina的新变种,该变种被命名为“eagle”;Trustwave记录了另一个新版本(称为Spark)。然而,随着这一切的发生,新的家族如Getmypass、LusyPOS、Daredevil、NewPOSThings和Backoff的发现历程则才刚刚开始。