Mekotio:使用 SQL 數據庫作為 C&C 服務器
在本系列的這一部分中,我們將介紹Mekotio,這是一種拉丁美洲的銀行木馬,主要針對巴西,智利,墨西哥,西班牙,秘魯和葡萄牙。該惡意軟件家族的最新變體中最顯著的功能是使用SQL數據庫作為C&C服務器。

就像我們在本系列前面介紹的許多其他拉丁美洲銀行木馬一樣,Mekotio遵循了相當混亂的發展道路,其功能經常被修改。根據它的內部版本控制,我們認為有多個變種正在同時開發。但是,類似于Casbaneiro,這些變體幾乎不可能彼此分離,因此我們將它們統稱為Mekotio。
特點
Mekotio是典型的拉丁美洲銀行木馬,至少從2015年開始活躍。因此,它通過向受害者顯示偽造的彈出窗口進行攻擊,試圖誘使他們泄露敏感信息。這些窗口是針對拉丁美洲銀行和其他金融機構精心設計的。
Mekotio收集有關受害者的以下信息:
- 防火墻配置
- 受害人是否具有管理特權
- 安裝的Windows操作系統版本
- 是否安裝了反欺詐保護產品(GAS Tecnologia Warsaw和IBM Trusteer)
- 已安裝的反惡意軟件解決方案列表
Mekotio通過使用運行鍵或在啟動文件夾中創建LNK文件來確保持久性。
與大多數拉丁美洲銀行木馬一樣,Mekotio具有幾種典型的后門功能。它可以截取屏幕截圖,操作窗口,模擬鼠標和鍵盤操作,重新啟動機器,限制對各種銀行網站的訪問以及自我更新。某些變體還可以通過替換剪貼板中的比特幣錢包來竊取比特幣,并泄露由Google Chrome瀏覽器存儲的憑據。有趣的是,一個命令顯然旨在通過嘗試刪除C:\ Windows tree中的所有文件和文件夾來削弱受害者的計算機。
識別Mekotio的一種方法是木馬在多種情況下顯示的特定消息框(請參見圖2)。

為了通過鍵盤記錄功能輕松地竊取密碼,Mekotio禁用了Internet Explorer中的“自動完成”選項。啟用此功能后,通過記住先前已填寫的各種類型的字段上的輸入,可以為Internet Explorer用戶節省時間。Mekotio通過更改以下Windows注冊表值將其關閉:
- HKCU\Software\Microsoft\windows\CurrentVersion\Explorer\AutoComplete\
- AutoSuggest = “No”
- HKCU\Software\Microsoft\Internet Explorer\Main\
- Use FormSuggest = “No”
- FormSuggest Passwords = “No”
- FormSuggest PW Ask = “No”
分配
我們認為Mekotio的主要分發方法是垃圾郵件(示例請參見圖3)。自2018年以來,我們已經觀察到該家庭使用的38個不同的分銷鏈。這些鏈中的大多數鏈均包含多個階段,最終會下載一個ZIP存檔,這是拉丁美洲銀行木馬的典型特征。在以下各節中,我們將剖析兩個最常用的鏈。

鏈1:傳遞上下文
第一鏈包括四個連續的階段,如圖4所示。一個簡單的BAT Dropper刪除一個VBScript下載程序,并使用兩個命令行參數來執行它-一個自定義HTTP動詞(“ 111SA”)和一個下載下一個階段的URL。下載器使用自定義User-Agent值(“ MyCustomUser”及其變體)從提供的URL下載下一階段(還有另一個下載器)。第三階段,在執行腳本之前,先下載一個PowerShell腳本,并在腳本主體中更正URL,從該URL下載Mekotio。然后,PowerShell腳本從更正的URL下載Mekotio,然后安裝并執行它(執行過程將在后面詳細描述)。

關于此鏈有兩個有趣的事情。第一個是使用User-Agent標頭和HTTP動詞的自定義值。這些可用于識別Mekotio的某些網絡活動。
另一個有趣的方面是上下文的傳遞(作為命令行參數或通過修改下一階段的主體)。這是一種簡單但有效的反分析技術,因為如果的Downloader 1沒有匹配的Dropper,那么您將既沒有URL,您將沒有獲取下一階段惡意軟件所需的URL或自定義HTTP動詞。同樣,由于缺少URL,因此沒有Downloader 2的Downloader 3也沒有用。如果沒有上下文的知識,這種方法會使分析變得更加困難。
鏈2:帶有嵌入式JavaScript的MSI
與許多其他拉丁美洲的銀行木馬一樣:Mekotio在其一些最新的分銷鏈中利用了MSI。在這種情況下,鏈條要短得多且不那么健壯,因為只有一個JavaScript(作為最后階段)被嵌入到MSI中并執行。
與上一個鏈中的PowerShell最后階段相比,有一些明顯的相似之處。主要的程序(如圖5所示)是安裝例程,在下載并提取ZIP歸檔文件之后調用該例程,該例程根據文件大小重命名提取的ZIP歸檔文件的內容。這與下一節中描述的執行方法緊密相關。

濫用AutoIt解釋器執行程序
Mekotio通常是通過濫用合法的AutoIt解釋器來執行的。在這種情況下,ZIP存檔包含(除了Mekotio銀行木馬之外)合法的AutoIt解釋程序和小的AutoIt加載程序或注入程序腳本。分發鏈的最后階段執行AutoIt解釋程序,并將加載程序或注入程序腳本傳遞給它進行解釋。然后,該腳本執行銀行木馬。圖6說明了整個過程。

Mekotio不是唯一使用此方法的拉丁美洲銀行木馬,但它比競爭對手更受青睞。
密碼學
用于加密Mekotio二進制文件中的字符串的算法本質上與Casbaneiro使用的算法相同。但是,Mekotio的許多變體會修改數據在解密之前的處理方式。可以忽略硬編碼解密密鑰的前幾個字節,也可以忽略加密字符串的某些字節。一些變體還使用base64對加密的字符串進行編碼。這些方法的細節各不相同。
C&C服務器通信
SQL數據庫作為C&C服務器
一些Mekotio的變體立足于他們的網絡協議Delphi_Remote_Access_PC一樣,Casbaneiro。如果不是這種情況,Mekotio將SQL數據庫用作一種C&C服務器。相對于拉丁美洲的銀行木馬,這種技術并非聞所未聞。Mekotio似乎不依賴SELECT命令,而是依賴于執行SQL過程。這樣,尚無法立即弄清楚基礎數據庫的外觀。但是,登錄字符串仍以二進制形式硬編碼。
C&C服務器地址生成
對于Mekotio如何獲取其C&C服務器的地址,我們已經觀察到三種不同的算法。我們按照遇到它們的時間順序描述它們。
基于“偽造域名”的硬編碼列表
第一種方法依賴于兩個域的硬編碼列表–一個用于生成C&C域,另一個用于端口。從兩個列表中選擇一個隨機域并進行解析。IP地址被進一步修改。生成C&C域時,將從解析的IP地址的最后一個八位字節中減去一個硬編碼的數字。生成C&C端口時,將八位字節連接在一起并視為數字。為了清楚起見,我們在Python中實現了這兩種算法,如圖7所示。請注意,此方法與Casbaneiro使用的方法驚人地相似(在超鏈接分析中標記為方法5)。
def generate_domain(base_domains, num):
domain = to_ip(random.choice(base_domains))
octets = domain.split(".")
octets[3] = chr(int(octets[3]) - num)
return octets.join(".")
def generate_port(base_domains):
domain = to_ip(random.choice(base_domains))
return int(domain.split(".").join(""))
圖7.用于從硬編碼的域列表生成C&C域和端口的代碼
基于當前時間
第二種方法利用基于當前本地時間的DGA(因此,受害者的時區會影響結果)。該算法采用星期幾,月份和小時中的當前日期,并使用它們來生成單個字符串。然后,它計算該字符串的MD5,以十六進制字符串表示。帶有硬編碼后綴的結果是C&C服務器域(其端口硬編碼在二進制文件中)。圖8顯示了我們對該算法的Python實現。
day_names = {
0: "MON",
1: "TUE",
2: "WED",
3: "THU",
4: "FRI",
5: "SAT",
6: "SUN",
}
hour_names = {
7: "AM02",
8: "AM03",
9: "AM04",
10: "AM05",
11: "AM06",
12: "PM01",
13: "PM02",
14: "PM03",
15: "PM04",
16: "PM05",
17: "PM06"
}
def get_hour_name(hour):
if hour <= 6 or hour >= 18:
return "AM01"
else
return hour_names[hour]
def generate_domain(suffix):
time = get_current_time()
dga_data = "%s%02d%s" % (day_names[time.dayOfWeek], time.day, hour_names[time.hour])
dga_data = hexlify(md5(dga_data))
return dga_data.lower() + suffix
圖8.用于根據當前時間生成C&C域的代碼
以當天為基準
第三種算法與第二種算法有些相似。它與從本地時間創建的字符串的格式不同,并且每天使用不同的后綴。此外,它以類似方式生成C&C端口。再次,該代碼的Python重新實現如圖9所示。
def generate_domain(domains_list, subdomain):
time = get_current_time()
dga_data = "%02d%02d%s" % (time.day, time.month, subdomain)
dga_data = hexlify(md5(dga_data))
return dga_data[:20] + "." + domains_list[time.day - 1]
def generate_port(portstring):
time = get_current_time()
return int("%d%02d%d" % (time.day, time.dayOfWeek, time.month))
圖9.用于根據當前日期生成C&C域和端口的代碼
多個并發變體?
我們已經提到過,與其他拉丁美洲的銀行木馬類似,Mekotio遵循一個相當混亂的發展周期。但是,除此之外,還有跡象表明同時開發了Mekotio的多種變體。
兩個主要指標是內部版本控制和用于提取由Mekotio收集的有關受害者計算機的信息的字符串格式。我們確定了四種不同的版本控制方案:
- 編號(001,002,072,39A,…)
- 依日期排列的版本(01-07、15-06、17-10、20-09…)
- 完整版本(02_03_20、13_03_20、26_05_20…)
- 編號和日期合并在一起(103–30-09、279–07-05、293–25-05…)
這些方案中的每一個都與被竊取數據字符串的特定格式相關聯。由于我們同時看到這些方案中的多個,因此我們認為可能有多個威脅參與者使用Mekotio的不同變體。
結論
我們分析了自2015年以來一直活躍的拉丁美洲銀行木馬Mekotio。與本系列中介紹的其他銀行木馬一樣,Mokotio具有這種惡意軟件的共同特征,例如使用Delphi編寫,使用偽造的彈出式窗口,其中包含后門功能以及以西班牙語和葡萄牙語國家為目標。