1、問題說明
在一個安靜的下午,突然手機上面接收到雲伺服器廠商發的一條簡訊。簡訊內容為伺服器疑似被木馬病毒入侵,監測到病毒檔案。然後我就使用FinalShell登入伺服器準備進去看一看,剛登陸進去FinalShell左邊監控程式顯示cpu佔用100%。伺服器正常來說cpu只會在3%~9%之間,突然這個CPU佔用率這麼高,我就知道伺服器真的被駭客入侵了。
2、排查過程
發現被入侵之後,首先需要做的就是檢視系統中哪一個程式佔用的cpu較高。所以需要透過Linux的 top
命令進行檢視。
top -c
輸入上面命令,發現第一行的程式檔案執行cpu佔用特別大
透過上面可以清楚看到程式的執行目錄,然後我發現這個程式檔案是我沒有見過的,也就是說我的伺服器遭到駭客入侵後他在 /tmp/.local/.-/
目錄裡面給我植入了病毒指令碼檔案。然後我就進入 /tmp
目錄下面檢視
透過 ls
命令檢視,目錄中沒有發現上面那個 .local
檔案。這裡就要注意了,在Linux中建立一個新的資料夾,並在資料夾的名稱前面加上一個點(.),例如前面的 ".local"。這樣該資料夾就會被視為隱藏資料夾了,所以我們要使用 ls -a
命令把隱藏檔案也檢視出來。重新輸入命令:
ls -la
透過執行上面命令就可以發現 .local
資料夾了,然後就一鼓作氣直接進入存放檔案的目錄。
進入之後發現有兩個檔案,透過名字可以看出應該一個是執行程式,另一個是配置檔案。檢視一下檔案大小:
發現是一個大小在6.7兆的程式檔案和一個幾KB的配置檔案,先把檔案下載到本地。下載下來後我們後面在檢視檔案內容。目前我們首先需要把cpu佔用率降下來確保伺服器可以正常執行。
3、處理
透過問題排查我們已經找到了駭客存放在伺服器裡面的病毒檔案了。接下來就可以直接把 .local
檔案目錄刪除掉,透過刪除命令進行刪除:
rm -rf /tmp/.local
執行命令後,再次檢視 /tmp
目錄。發現檔案已經別刪除了。
刪除之後,然後在殺死該程式的執行程序。執行命令:
kill -9 30737 #30737 PID 使用top -c 命令可以檢視
殺死程序後,透過 top
命令再次檢視下是否還有cpu佔用高的程序。
可以發現cpu佔用率都不高,已經降下來了。這就說明病毒已經被處理掉了。然後在透過FinalShell左邊檢視CPU佔用率一直穩定在 4%~6%之間。
透過上面的處理伺服器已經可以正常訪問了。最後還需要檢查一下linux的定時任務配置資訊看看駭客是否修改了定時任務指令碼讓程式週期性的下載病毒檔案。透過 crontab
檢視配置資訊:
crontab -l
如果輸出內容為空,說明駭客沒有新增新的定時任務。下面輸出的是雲伺服器自帶的安全監控工具,沒有影響。
4、門羅幣
透過上面的排查和處理病毒已經被清理乾淨了。接下來來看看下載到本地的病毒檔案java程式和conf.json檔案。java程式是經過加密過的所以看不到植入的程式內容,但是conf.json配置檔案沒有經過加密,是以明文方式顯示的。內容如下:
{
"api": {
"id": null,
"worker-id": null
},
"http": {
"enabled": false,
"host": "127.0.0.1",
"port": 0,
"access-token": null,
"restricted": true
},
"autosave": true,
"background": true,
"colors": true,
"title": true,
"randomx": {
"init": -1,
"init-avx2": -1,
"mode": "auto",
"1gb-pages": false,
"rdmsr": true,
"wrmsr": true,
"cache_qos": false,
"numa": true,
"scratchpad_prefetch_mode": 1
},
"cpu": {
"enabled": true,
"huge-pages": true,
"huge-pages-jit": false,
"hw-aes": null,
"priority": null,
"memory-pool": false,
"yield": true,
"asm": true,
"argon2-impl": null,
"argon2": [0, 1],
"cn": [
[1, 0],
[1, 1]
],
"cn-heavy": [
[1, 0],
[1, 1]
],
"cn-lite": [
[1, 0],
[1, 1]
],
"cn-pico": [
[2, 0],
[2, 1]
],
"cn/upx2": [
[2, 0],
[2, 1]
],
"ghostrider": [
[8, 0],
[8, 1]
],
"rx": [0, 1],
"rx/wow": [0, 1],
"cn-lite/0": false,
"cn/0": false,
"rx/arq": "rx/wow",
"rx/keva": "rx/wow"
},
"log-file": null,
"donate-level": 1,
"donate-over-proxy": 1,
"pools": [
{
"algo": null,
"coin": null,
"url": "3.34.130.68:8080",
"user": null,
"pass": null,
"rig-id": "proxied-miner",
"nicehash": false,
"keepalive": false,
"enabled": true,
"tls": false,
"sni": false,
"tls-fingerprint": null,
"daemon": false,
"socks5": null,
"self-select": null,
"submit-to-origin": false
}
],
"retries": 5,
"retry-pause": 5,
"print-time": 60,
"dmi": true,
"syslog": false,
"tls": {
"enabled": false,
"protocols": null,
"cert": null,
"cert_key": null,
"ciphers": null,
"ciphersuites": null,
"dhparam": null
},
"dns": {
"ipv6": false,
"ttl": 30
},
"user-agent": null,
"verbose": 0,
"watch": true,
"pause-on-battery": false,
"pause-on-active": false
}
雖然說配置內容是明文的json格式,但是我也看不懂什麼意思。然後就隨便找幾個欄位值透過百度搜尋了一下,然後就發現了一個新的知識盲區 " 門羅幣-XMR ":
透過搜尋發現這個病毒是一個挖礦指令碼,伺服器竟然被別人挖礦了... 然後就找到了一篇關於門羅幣挖礦指令碼的說明是B站上一個UP主寫的。
以防萬一後面找不到,把配置說明寫到下面,原文訪問地址連線:https://www.bilibili.com/read/cv8021937/
{
"api": { //請注意json是資料檔案,如果沒必要只填地址和礦池埠就可以了。 //雙斜槓是註釋。
"id": null, //Windows可用管理員模式開啟挖礦軟體,算力會有一定程度上的提升。
"worker-id": null // 本人為門羅技術愛好者,希望可以和大家共同進步。
},
"http": {
"enabled": false, //啟用hhtp與否
"host": "127.0.0.1",
"port": 0, //埠
"access-token": null, //訪問令牌
"restricted": true //受限制
},
"autosave": true, //自動儲存
"background": false, //挖礦是可以選擇是否隱藏視窗
"colors": true, //顏色
"title": true, //標題
"randomx": {
"init": -1, //初始化
"mode": "auto", //模式自動
"1gb-pages": true, //1g大頁面
"rdmsr": true, //讀暫存器
"wrmsr": true, //寫暫存器
"cache_qos": false, //快取
"numa": true,
"scratchpad_prefetch_mode": 1 //草稿行預取模式
},
"cpu": {
"enabled": true, //開啟CPU與否
"huge-pages": true, //大頁面
"hw-aes": null,
"priority": null, //優先順序
"memory-pool": true, //記憶體池
"yield": true, //返回數值
"asm": true,
"argon2-impl": null, //金鑰匯出函式
"astrobwt-max-size": 550, //strobwt演算法最大值
"astrobwt-avx2": false, //高階向量擴充套件集
"rx/keva": "rx/wow"
},
"opencl": { //opencl和cuda都是顯示卡挖礦,顯示卡挖門羅不划算,顯示卡建議挖以太幣
"enabled": false, //啟用顯示卡與否
"cache": true,
"loader": null,
"platform": "AMD", //AMD平臺
"adl": true,
"cn/0": false,
"cn-lite/0": false
},
"cuda": {
"enabled": false, //啟用顯示卡與否
"loader": null,
"nvml": true, //英偉達平臺
"cn/0": false,
"cn-lite/0": false
},
"donate-level": 0, //捐贈等級
"donate-over-proxy": 0, //委託捐贈
"log-file": null, //日誌檔案
"pools": [ //礦池
{
"algo": null, //演算法
"coin": null, //幣種
"url": "mine.c3pool.com:13333", //礦池及埠
"user": "8B5mvT1wDJXQK8o9gL1NABd1AyCpK7fZ6bpAADjG6ZqMKTuJ4q44JZSPyPZzcoXohXcXGDVUsY2LU8w7Tt6AwAjt83Y1HFe", //自己錢包地址
"pass": "4710~rx/0", //挖礦機器名字 ~rx/0為固定門羅演算法挖礦 ~之前是機器名字,之後是幣種演算法
"rig-id": null,
"nicehash": false,
"keepalive": false, //保持線上
"enabled": true,
"tls": false, //傳輸層安全
"tls-fingerprint": null, //傳輸層安全指紋
"daemon": false,
"socks5": null, //代理
"self-select": null //自選項
}
],
"print-time": 60, //60秒顯示一次在cmd裡面
"health-print-time": 60, //正常顯示算力
"retries": 5, //重試
"retry-pause": 5, //重試暫停
"syslog": false, //系統日誌
"tls": { //傳輸層安全
"enabled": false, //啟用傳輸層安全與否
"protocols": null, //協議
"cert": null, //證書
"cert_key": null, //證書金鑰
"ciphers": null, //密碼
"ciphersuites": null, //密碼套件
"dhparam": null //金鑰交換
},
"user-agent": null, //使用者代理
"algo-perf": { //各個幣種演算法的算力大小
},
"pause-on-battery": false //使用電池時是否暫停
}
然後我們根據指令碼說明來看上面的conf.json檔案。然後就發現了礦池及埠:
透過使用IP查詢軟體我們檢視下IP地址所在地區,然後發現:
透過上圖可以看到這個IP地址在韓國,雖說知道了IP地址。但是...然後呢,然後就沒有然後了,到這裡病毒排查過程就結束了。
5、總結
希望上面的內容對大家有所幫助,透過遇到的這個問題,讓我也得到反思。以後在專案開發的同時也需要去關注如何增加伺服器的安全性,以防止這些病毒的再次入侵。這次之所以讓病毒入侵我覺得很大的可能是伺服器開放了一些比較固定的一些中介軟體和軟體埠號導致的。所以我們在部署中介軟體的時候最好要改一下中介軟體啟動的預設埠號,或者不把任何埠號暴漏在公網下面。
公眾號文章連結: https://mp.weixin.qq.com/s/vNXjss5-iobQB15WvMHCoA