深入分析新型POS機木馬LogPOS
近幾年POS惡意軟件活動頻繁,本文就2015年發(fā)現(xiàn)的一個新成員LogPOS樣本進行分析。該惡意軟件的一個重要的特點是其利用了郵件槽,可以躲避傳統(tǒng)的檢測機制。
此外,在該樣本中,主程序創(chuàng)建了郵件槽,并作為郵件槽服務器,而注入到各個進程中的代碼則作為客戶端,它們將獲取到的信用卡號碼寫入郵件槽,然后通過郵件槽直接將數(shù)據(jù)傳輸出去。
前言
在這之前,已經(jīng)有過一次POS惡意軟件的惡意活動。
2014年,Jeremy Humble和我發(fā)現(xiàn)了2個未曾曝光過的POS惡意軟件家族,接著在2015年我們又發(fā)現(xiàn)了一個POS惡意軟件的新家族。這次發(fā)現(xiàn)的惡意軟件我們命名為“LogPOS”,它跟前段時間發(fā)現(xiàn)的POS惡意軟件有幾個顯著的差異。
在本文接下來的部分中,我們將對LogPOS進行詳細分析,該樣本哈希值為:
af13e7583ed1b27c4ae219e344a37e2b。
科普:郵件槽(Mailslots)
Windows系統(tǒng)中提供了幾種進程間通信的方式,郵件槽(Mailslots)就是其中的一種。
郵件槽提供進程間單向通信能力,任何進程都能建立郵件槽成為郵件槽服務器。其它進程,稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽服務器進程發(fā)送消息。進來的消息一直放在郵件槽中,直到服務器進程讀取它為止。一個進程既可以是郵件槽服務器也可以是郵件槽客戶,因此可建立多個郵件槽實現(xiàn)進程間的雙向通信。
通過郵件槽可以給本地計算機上的郵件槽、其它計算機上的郵件槽或指定網(wǎng)絡區(qū)域中所有計算機上有同樣名字的郵件槽發(fā)送消息。廣播通信的消息長度不能超過400字節(jié),非廣播消息的長度則受郵件槽服務器指定的最大消息長度的限制。
郵件槽與命名管道相似,不過它傳輸數(shù)據(jù)是通過不可靠的數(shù)據(jù)報(如TCP/IP協(xié)議中的UDP包)完成的,一旦網(wǎng)絡發(fā)生錯誤則無法保證消息正確地接收。不過郵件槽有簡化的編程接口和給指定網(wǎng)絡區(qū)域內的所有計算機廣播消息的能力,所以郵件槽不失為應用程序發(fā)送和接收消息的一種好的選擇。#p#
深入分析
幾乎在看到該樣本的那一刻,一個字符串在我腦海中浮現(xiàn)出來:
\\.\mailslot\LogCC。
在大多數(shù)的POS變種中,都是利用一個進程讀取其他進程的內存,然后將發(fā)現(xiàn)的跟蹤數(shù)據(jù)寫入到日志中。因為LogPOS將代碼注入到了各種進程中,然后令其搜索各個進程的內存,所以此時無法使用日志,因為它們不能同時以寫入訪問模式打開同一個文件。所以,LogPOS選擇使用了郵件槽。
使用郵件槽進行通信或存儲對惡意軟件來說并不是一種新機制,在火眼(FireEye)關于APT28的一份報告中,它提到該組織曾使用過郵件槽“check_mes_v5555”。郵件槽是一種IPC機制,它允許多個客戶端向服務器發(fā)送消息。在本文所分析的樣本中,主程序創(chuàng)建了郵件槽,并作為郵件槽服務器,而注入到各個進程中的代碼則作為客戶端,它們將獲取到的信用卡號碼寫入郵件槽,然后通過郵件槽直接傳輸?shù)紺2。
在程序執(zhí)行的開始處,程序以郵件槽名字\\.\mailslot\LogCC為參數(shù)調用了CreateMailslotA函數(shù)。
如果郵件槽創(chuàng)建失敗,程序將會退出;否則,程序將進入一個無限循環(huán),并按順序執(zhí)行下面的函數(shù):
1、休眠500毫秒 2、遍歷進程 (1)與白名單進行比較 (2)將shellcode注入到進程中(如果不在白名單中) (3)掃描信用卡跟蹤信息 (4)使用Luhn算法進行驗證 3、讀取郵件槽 4、將數(shù)據(jù)發(fā)送出去
最有趣的是注入的代碼,所以接下來我們將更詳細地對其進行分析。
在遍歷進程(如上所述)時,惡意軟件會將進程名與白名單進行比對,白名單主要包含以下名字:
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
實現(xiàn)比較字符串功能的代碼如下所示:
一旦發(fā)現(xiàn)某個進程名不在白名單中,就會利用函數(shù)WriteProcessMemory將代碼注入到該進程的內存空間。Shellcode所做的第一件事就是尋找kernel32的基地址,利用其開始創(chuàng)建導入模塊。尋找kernel32的方法在很多博客中都已經(jīng)總結的很詳細了。
一旦發(fā)現(xiàn)了基地址,shellcode將開始通過自己的哈希技術重建入口。一些哈希和對應值的列表如下所示。
建立入口之后,惡意軟件會以文件名\\.\mailslot\LogCC為參數(shù)調用函數(shù)CreateFileA來獲取一個用于寫操作的文件句柄。
當掃描內存時,惡意軟件將使用一個自定義搜索算法來查找跟蹤信息的常見的標志。
然后,將找到的信息傳遞給實現(xiàn)的Luhn算法來進行驗證。一旦此信息有效,則它們將會被發(fā)送到郵件槽中,以供后面主程序的讀取。當按順序增加一個數(shù)字后,惡意軟件將創(chuàng)建一個格式化字符串,并將該信息發(fā)送到遠程站點上。
然后,數(shù)據(jù)被發(fā)送到遠程站點上(通過HTTP的GET方法)。
站點接收到的內容會被存放在一個表單中(在寫本文時,表單內容并未加密)。表單中大部分的號碼都在rdpclip和notepad的進程空間中,所以我們猜想可能該惡意軟件作者正在測試他們的代碼。相應內容和相關IP信息的截圖如下圖所示。
檢測方法
因為LogPOS并不是通過掃描文件來獲取未加密的信用卡信息,而是利用郵件槽的方法,所以它能夠避開傳統(tǒng)的檢測機制。然而,如果使用類似yara這樣的工具的話,將能夠很容易地檢測到該惡意軟件的各種變體。下面的規(guī)則將能夠幫助你在網(wǎng)絡中找到這個惡意工具。
- 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)
- }
除了yara,這種POS惡意軟件也能通過它的URI模式被檢測出來,下面的簽名將能夠從網(wǎng)絡中檢測出該惡意軟件。
- 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"
- }
結論
近幾年,POS惡意軟件已經(jīng)在很多方面引起了關注。趨勢科技最近報道說,在過去6個月中發(fā)現(xiàn)的POS惡意軟件變種,比過去幾年中發(fā)現(xiàn)的都要多。
例如,今年早些時候,Josh Grunzweig發(fā)現(xiàn)了一個Alina的新變種,該變種被命名為“eagle”;Trustwave記錄了另一個新版本(稱為Spark)。然而,隨著這一切的發(fā)生,新的家族如Getmypass、LusyPOS、Daredevil、NewPOSThings和Backoff的發(fā)現(xiàn)歷程則才剛剛開始。