挖矿木马——客户端挖矿分析分享

前言:

本文主要从流量侧通过识别流量中的挖矿特征,从而识别出挖矿行为。能够快速分析出挖矿行为就要对挖矿的协议、通讯过程有所了解。

威胁:

挖矿木马现已成为了企业内部安全的主要威胁之一。在内网中遇到出现挖矿木马的原因一般分为服务器感染木马、PC 感染木马、网页挖矿脚本等,很多僵尸网络也把挖矿作为主要的获利手段。由此对挖矿木马的检测能力成为了内网安全中比较重要的一部分。

挖矿过程中常用协议:

一、Getwork协议:getwork协议代表了GPU挖矿时代,需求主要源于挖矿程序与节点客户端分离,区块链数据与挖矿部件分离。通过HTTP传输发送的JSON-RPC方法。但大多数矿池现已不再支持GETWORK协议(小伙伴可自行了解)。

二、Getblocktemplate协议:getblocktemplate协议被开发并取代了老的getwork协议,getblocktemplate掌握区块链上与挖矿有关的所有信息。矿池采用getblocktemplate协议与节点客户端交互,采用stratum协议与矿工交互,这是最典型的矿池搭建模式。相关数据如下:矿工联系该池并请求初始模板

{"id": 0, "method": "getblocktemplate", "params": [{"capabilities": ["coinbasetxn", "workid", "coinbase/append"]}]}

服务器将回复所需的全部细节,进行区块挖掘,如下:

{ "error": null, "result": { "coinbasetxn": { "data": "wkwkwkkwk" }, "previousblockhash": "wkwkwk", "transactions": [], "expires": 120, "target": "wkwkwk", "longpollid": "some gibberish", "height": 23957, "version": 2, "curtime": 1346886758, "mutable": ["coinbase/append"], "bits": "ffff001d" }, "id": 0}

{ "error": null, "result": { "coinbasetxn": { "data": "wkwkwkwk" }, "previousblockhash": "wkwkwk", "transactions": [], "expires": 120, "target": "wkwkwkwk", "longpollid": "some gibberish", "height": 23957, "version": 2, "curtime": 1346886758, "mutable": ["coinbase/append"], "bits": "ffff001d" }, "id": 0}

可以修正最初使用的模板请求,可以使用如下:

{"id": 0, "method": "getblocktemplate", "params": [{ "capabilities": ["coinbasetxn", "workid", "coinbase/append"], "longpollid": "some gibberish",}]}

{"id": 0, "method": "getblocktemplate", "params": [{ "capabilities": ["coinbasetxn", "workid", "coinbase/append"], "longpollid": "some gibberish",}]}

提交shares:当矿工找到符合要求难度的工作时,可以将该块作为份额提交给服务器:

{"id": 0, "method": "submitblock","params": [ "wkwkwkwkkwk"]}

三、stratum协议:stratum协议是目前最常用的矿机和矿池之间的TCP通讯协议,stratum 协议为 JSON 的数据格式,所以数据使用JSON封装格式。通过json 内容,我们主要检测的特征字段有 id、method、jsonrpc、params、result、login、pass、agent、mining.submit 等,通过对具体通信数据包进行相应特征字符串检测,以此来发现挖矿行为的存在。

详情如下:

一般矿机与矿池的通讯过程如下:通信过程主要分为矿机登记、任务下发、账号登录、结果提交难度调整等部分。

矿机登记以 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”方法向矿池提交任务,bf即为已分配的任务标识:

{"params":["miner1","bf","00000001","504e86ed","b2957c02"],"id":4,"method":"mining.submit"}

难度调整以 mining.set_difficulty 方法调整难度:

{"id":null,"method":"mining.set_difficulty","params":[2]}

主要特征字段有 id、method、jsonrpc、params、result、login、pass、agent、mining.submit 等。

门罗币举例:

门罗币采用 Cryptonight 算法,公开提供的程序有 xmr-stak,xmrig,claymore 等,通过 suricata 来检测其流量特征,进而发现流量中存在的挖矿行为。

xmrig

request:

{"id":x,"jsonrpc":"2.0","method":"login","params":{"login":"wkwk","pass":"x","agent":"wkwk","algo":["xxx","xxx","xxx"]}}{"id":x,"jsonrpc":"2.0","method":"submit","params":{"id":"xxxx","job_id":"xx","nonce":"xxxx","result":"xxxxxxx"}}

response:

{"params":{"blob":"wkwkkwk","taget":"wkwkwk","job_id":"wkwkwkwk"},"method":"wkwkkwk"}

xmr-stak

request:

{"method":"login","params":{"login":"wkwk","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":"wkwk","job_id":"wkwk","blob":"wkwk"}}

流量请求特征分析可以发现,请求中主要分为 login 操作与 submit 操作 , 对具体请求具体分析。

未完待续

通过以上的方式,基本能够发现大多数的挖矿行为。还可以依赖 IOC 的访问情况,发现有内网 IP 恶意连接 IOC,最终通过溯源分析发现感染挖矿木马。

发布了30 篇原创文章 · 获赞 12 · 访问量 8052

猜你喜欢

转载自blog.csdn.net/Gausswk/article/details/105328694