suricata下的挖礦行為檢測
*本文原創作者:charm1y,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載
本文淺略地分析了挖礦行為的流量特徵,在suricata下使用相應檢測規則發現挖礦行為。
挖礦木馬的現狀
隨著加密貨幣的出現以及帶來的實際收益,挖礦木馬成為黑產團伙的主要獲利方式之一,也成為了企業內部安全的主要威脅之一。在內網中遇到出現挖礦木馬的原因一般分為伺服器感染木馬、PC感染木馬、網頁挖礦指令碼等,很多殭屍網路也把挖礦作為主要的獲利手段。由此對挖礦木馬的檢測能力成為了內網安全中比較重要的一部分。
挖礦行為的流量特徵
挖礦行為的識別可以通過很多方面進行判斷,終端層面監控硬體資源的使用率,及相關程序分析;流量層面通過識別挖礦行為的流量特徵,從流量中識別出挖礦行為。本文中主要從流量層面去識別挖礦行為。
stratum協議是目前主流的礦機和礦池之間的TCP通訊協議,通過檢測stratum協議來發現挖礦行為是行之有效的。stratum協議為JSON的資料格式,分析礦機與礦池之間使用stratum協議的通訊過程,如下:
通訊過程主要分為礦機登記、任務下發、賬號登入、結果提交與難度調整等部分。
礦機登記以mining.subscribe方法向礦池連線:
{"id":1,"method":"mining.subscribe","params":[]}
礦池以mining.notify方法返回相關資訊:
{"id":1,"result":[["mining.notify","ae6812eb4cd7735a302a8a9dd95cf71f"],"08000002",4],"error":null}
賬號登入一般分為兩種,一種是直接登入,另一種是通過jsonrpc方式(很多挖礦節點與礦池的通訊是依靠jsonrpc來進行請求與相應的,這種方式也是依賴於TCP的Stratum協議)。
礦機直接通過mining.authorize方法登入:
{"params":["miner1","password"],"id":2,"method":"mining.authorize"}
通過jsonrpc方式登入:
{"id":1,"jsonrpc":"2.0","method":"login","params":{"login":"blue1","pass":"x","agent":"Windows NT 6.1; Win64; x64"}}
結果提交通過”mining.submit”方法向礦池提交任務:
{"params":["miner1","bf","00000001","504e86ed","b2957c02"],"id":4,"method":"mining.submit"}
難度調整以mining.set_difficulty方法調整難度:
{"id":null,"method":"mining.set_difficulty","params":[2]}
分許上面json內容,主要特徵欄位有id、method、jsonrpc、params、result、login、pass、agent、mining.submit等,通過對具體通訊資料包進行相應特徵字串檢測,以此來發現挖礦行為的存在。而網頁挖礦行為也可以通過檢測coinhive.min.js等特徵字串來發現。
挖礦行為的特徵檢測
由於門羅幣具有匿名性、CPU挖礦、價值靠前等特點,所以成為挖礦木馬的首選,平常實際工作遇見的挖礦木馬挖取的加密貨幣也幾乎都是門羅幣。故以門羅幣為例,通過suricata來檢測其流量特徵,進而發現流量中存在的挖礦行為。
門羅幣採用Cryptonight演算法,公開提供的程式有xmr-stak,xmrig,claymore等,相應的主要流量請求特徵為:
xmr-stak
request:
{"method":"login","params":{"login":"xxxxxxx","pass":"xxx","rigid":"","agent":"xxxxxx"},"id":1} {"method":"submit","params":{"id":"xx","job_id":"xxxxxx","nonce":"xxxxx","result":"xxxxxx"},"id":1}
response:
{"method":"job","params":{"target":"xxxxx","job_id":"xxxxxx","blob":"xxxxxxx"}}
xmrig
request:
{"id":x,"jsonrpc":"2.0","method":"login","params":{"login":"xxxxxx","pass":"x","agent":"xxxxx","algo":["xxx","xxx","xxx"]}} {"id":x,"jsonrpc":"2.0","method":"submit","params":{"id":"xxxx","job_id":"xx","nonce":"xxxx","result":"xxxxxxx"}}
response:
{"params":{"blob":"xxxxxx","taget":"xxxx","job_id":"xxxxx"},"method":"xxx"}
claymore
request:
{"method":"login","params":{"login":"xxxxxx","pass":"x","agent":"xxx"},"id":1} {"method":"submit","params":{"id":"xxxx","job_id":"xxx","nonce":"xxxxx","result":"xxxxx"},"id":x}
response:
{"params":{"blob":"xxxxxx","target":"xxxx","job_id":"xxx"},"method":"xxx"}
對上面的流量請求特徵分析可以發現,請求中主要分為login操作與submit操作,對具體請求具體分析。login操作可以分為直接使用stratum協議與通過jsonrpc方式,suricata本身有相應檢測規則:
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"ET POLICY Crypto Coin Miner Login"; flow:to_server,established; content:"|7b 22|method|22 3a|"; depth:10; fast_pattern; content:"|22|login|22 2c|"; distance:0; within:9; content:"|22|params|22 3a|"; distance:0; within:10; content:"|7b 22|login"; nocase; distance:0; within:8; content:"agent|22 3a|"; nocase; distance:0; metadata: former_category POLICY; reference:md5,d1082e445f932938366a449631b82946; reference:md5,33d7a82fe13c9737a103bcc4a21f9425; reference:md5,ebe1aeb5dd692b222f8cf964e7785a55; classtype:trojan-activity; sid:2022886; rev:3; metadata:affected_product Any, attack_target Client_Endpoint, deployment Perimeter, tag Bitcoin_Miner, signature_severity Audit, created_at 2016_06_09, malware_family CoinMiner, performance_impact Low, updated_at 2017_10_12;)
alert tcp-pkt $HOME_NET any -> $EXTERNAL_NET any (msg:"ET POLICY Cryptocurrency Miner Checkin"; flow:established,to_server; content:"|7b 22|id|22 3a|"; nocase; depth:6; content:"|22|jsonrpc|22 3a|"; nocase; distance:0; content:"|22 2c 22|method|22 3a 22|login|22 2c 22|params|22 3a|"; fast_pattern; content:"|22|pass|22 3a 22|"; nocase; content:"|22|agent|22 3a 22|"; nocase; content:!"<title"; nocase; content:!"<script"; nocase; content:!"<html"; nocase; metadata: former_category POLICY; classtype:policy-violation; sid:2024792; rev:4; metadata:affected_product Windows_XP_Vista_7_8_10_Server_32_64_Bit, attack_target Client_Endpoint, deployment Perimeter, signature_severity Minor, created_at 2017_10_02, updated_at 2018_06_15;)
對submit操作可以分析,可以使用以下規則進行檢測:
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"Cryptocurrency Miner Check By Submit"; flow:to_server,established; content:"|22|method|22 3a|"; fast_pattern; content:"|22|submit|22 2c|"; distance:0; within:10; content:"|22|params|22 3a 7b|"; distance:0; within:15; content:"result|22 3a|"; nocase; distance:0; sid:3013015; rev:1; metadata:Detecting Mining Rules;
礦池響應礦工的流量檢測規則:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"Pools Response Cryptocurrency Miner"; flow:to_client,established; content:"|22|method|22 3a|"; nocase; content:"|22|params|22 3a|"; nocase; content:"|22|blob|22 3a|"; nocase; content:"|22|job_id|22 3a|"; nocase; sid:3013016; rev:1; metadata:Detecting Mining Rules;)
通過對規則進行分析,以上規則所匹配的字串及其相互位置關係正好符合前面門羅幣的流量請求特徵。由此可以使用suricata載入以上規則來檢測挖礦流量。
網頁挖礦行為也可以通過以下規則進行檢測:
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"ET CURRENT_EVENTS CoinHive In-Browser Miner Detected"; flow:established,from_server; file_data; content:"coinhive.min.js"; nocase; fast_pattern; content:"start"; nocase; distance:0; content:"script"; content:"var"; distance:0; pcre:"/^\s*(?P<var>[a-zA-Z0-9]{3,20})\s*=\s*new\s*CoinHive\s*\.\s*[^\(]+\(\s*[\x22\x27][A-Za-z0-9]+\s*[\x22\x27]\s*(?:\x2c\s*\x7b\s*\w+\x3a\s*\d\.\d\x7d)?\)\s*\x3b\s+(?P=var)\s*\.\s*start/Ri"; metadata: former_category CURRENT_EVENTS; classtype:policy-violation; sid:2024721; rev:2; metadata:affected_product Any, attack_target Client_Endpoint, deployment Perimeter, signature_severity Minor, created_at 2017_09_18, performance_impact Moderate, updated_at 2018_05_08;)
通過以上規則來檢測內網流量,基本可以發現絕大多數的挖礦行為。以一個實際例子來說明,最近遇到在虛擬機器中使用網上的Windows啟用工具導致感染挖礦木馬,具體情況為通過suricata進行流量分析,挖礦木馬的挖礦行為觸發相關規則告警。
通過溯源找到受害機器,對受害機器進行應急處置,之後詳細過程跟本文關係不大,就不說明了。要提到的一點是挖礦程序的commandLine為:
-a cryptonight -o stratum+tcp://xmr.pool.minergate.com:45560 -u [email protected] -p x -t 1
可以發現挖礦程序與礦池的連線採用的是stratum+tcp的協議進行通訊,其惡意流量也就命中了相應的檢測規則,從而觸發告警,發現挖礦行為的存在。實際工作中檢測到server端的流量,往往比檢測到client端的流量更有效,具體原因在於server端有時對請求不一定都有響應操作,或響應不一定能返回成功。
總結
通過以上的方式,基本能夠發現大多數的挖礦行為,但有些情況還是檢測不到的。比如曾經遇到過的OneSystemCare挖礦木馬對挖礦協議進行全部加密,所以無法通過檢測相應挖礦流量發現其惡意行為。實際發現過程為監控IOC的訪問情況,發現有內網IP惡意連線IOC,最終通過溯源分析發現感染挖礦木馬。
對於把挖礦協議進行加密的情況,目前感覺流量監控方向上好的處理方式有對礦池的連線監控、IOC的訪問監控等手段進行防護。 但真實存在的情況多種多樣,如何有效的從流量中發現惡意行為,必將是一個長期對抗的過程。
*本文原創作者:charm1y,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載