挖矿类安全事件应急响应

由 mayoterry 发布

2018-2019这几年期间,随着区块链和数字货币持续火爆,黑产类挖矿事件也日益猖獗,做安服同学在应急响应时遇到的安全事件极可能是被客户服务器被非法挖矿造成的。

理解挖矿

什么是挖矿?

挖矿本身指的是通过算力去计算下一个哈希值的过程。谁能第一个计算出来,并通知全网得到验证,谁就算挖到了这个区块,拥有这个区块的奖励和打包的矿工费。

这里的算力,是指计算什么?
指进行哈希碰撞的计算能力

比特币的挖矿到底在计算什么?
比特币挖矿的算法,可以简单地总结为对区块头做两次sha256哈希运算,得到的结果如果小于区块头中规定的难度目标,即挖矿成功。

比特币挖矿的算法可以表达为:

block_header = version + previous_block_hash + merkle_root + time + target_bits + nonce
for i in range(0, 2**32):
    if sha256(sha256(block_header)) < target_bits:
        break
    else:
        continue

version:版本号
previous_block_hash:前一去区块的哈希值
merkle_root: 默克尔根
time:区块生成的时间
target_bits:难度目标
nonce:随机数

区块链与挖矿

比特币的核心原理是“区块链”,每一个区块对应一个帐单,将所有的区块链接起来就是区块链,任何交易信息和转账记录都记录在区块链中。区块链技术是比特币的底层技术,比特币是区块链的第一个应用。

矿池

因为挖矿的难度越来越高,今天一个人使用自己的电脑挖矿成功的事情已经极难成功,因此出现了在辅助网站及辅助程序的帮助下,把大家零散的计算能力汇聚起来,一起进行挖矿,收益大家分享的方式,这就是矿池。
现在黑产挖矿一定是依赖矿池的,pool集合零散算力,单独作为一个node参与网络,获得极大的算力优势,以获得更多的区块奖励

挖矿病毒应急思路

明确应急的目的

简单总结:
针对挖矿,勒索病毒类型的应急响应
在最短的时间,帮助客户解决问题,并将影响,损失控制至最低。最后给客户有效的安全整改方案

针对安全攻击事件类型的应急响应
分析安全事件的整过过程。例如:黑客在什么时间节点利用什么漏洞? 拿走了什么数据? 留下了什么后门?对客户有什么影响? 最后给客户有效的安全整改方案

应急过程中的急与不急

  1. 在应急勒索,挖矿类并带有蠕虫性质的病毒中,如果没有在最短的时间控制病毒的传播,客户可能会遭受到更多的损失。
  2. 在应急安全攻击性事件中,你的一举一动就是在和黑客进行时间的赛跑,如果你没有及时的控制相应的权限,网络等,黑客可能会让客户遭受更多的损失,例如被拖走更多的数据等

不急

  1. 在客户机器上直接操作时,每个操作步奏前都仔细想想,该操作是否会影响客户业务情况,或其他影响,以避免应急过程中带给客户的二次损失
  2. 在应急过程中的每个操作步奏,最好和客户实时同步,及时将当前进展反馈至微信群等,以便后期写应急报告,

明确挖矿样本的特性

  1. crontab被恶意写入的内容
  2. 能否看到持续高占用CPU的进程名?(进程名可能被隐藏)
  3. crontab内容以及其下载shell脚本中的c2地址(绝大多数挖矿进程都是shell脚本拉起)
  4. 在清除crontab内容,kill掉挖矿进程后是否还会被再次拉起?
  5. 挖矿病毒是否具有蠕虫性质,在内网进行横向传播?

阻断挖矿样本的外联地址,控制内网蔓延

如果挖矿病毒具备内网的横向传播感染能力,那我们应急的首要任务就是在内网出口切断其恶意外联的矿池及c2地址。

如果快速找到c2以及矿池地址:

  1. crontab内网中shell脚本的下载地址
  2. shell脚本出现的所有地址(可能是下载矿机,或者矿机的母体文件的地址)
  3. lsof -p pid , 查看挖矿进程发起的网络链接,该地址一般为矿池地址
  4. tcpdump -i eth0 -w result1.pcap ,使用tcpdump抓包

如何阻断?

  1. 如果客户内网中招机器数量比较大,那就必须在客户内网出口防火墙上做阻断
  2. 如果客户中招机器数量小,且样本不具备明显的横向传播能力,可以使用本机iptables做阻断

连不上矿池,挖矿是否还会继续?
挖矿脚本在本机计算所得的哈希需要发往矿池,以证明自己的工作量,如果矿池连接不上,挖矿会减缓或者停止。

详细分析样本特性,输出挖矿病毒的清理脚本

在本地对挖矿病毒做详细分析之前,可以在搜索引擎里针对该样本的关键特征做个搜索查询,也许前人的经历可以快速的帮助你。

1.png

如果你遇到的是一个新的变种,搜索引擎都看不到关于该样本的任何分析,那你只能自己本地起个虚机来做分析了。

在分析前,我们首先要明确清理脚本的作用?

  1. kill掉挖矿进程
  2. 清理挖矿样本在机器上的留下文件(挖机等文件)
  3. 帮助客户恢复可能被篡改的文件(例如crontab ,系统命令等)

在分析过程中,需要考验个人对Linux掌握能力及对挖矿病毒的了解程度,复杂程度不同的样本,更是考验一个人的安全分析能力。

分析过程以下面一些场景为例:

机器资源消耗明显,crontab存在恶意内容,挖矿进程却看不到?
系统命令(常用的top,ls,netstat等)可能被劫持,可以考虑使用busybox来执行系统命令(busybox 是一个编译好不需要外部的动态链接库工具)

2.png

注:正常命令 ls 是不加载这个链接库。恶意ls命令调用的动态链接库,增加了/usr/local/lib/libioset.so库

crontab内容已经被清理,杀掉挖矿进程后,依旧被拉起?
可以查看是否有类似”看门狗“类的进程在守护着主挖矿进程

如下图所示,挖矿进程为ksoftirqds,守护进程为watchdogs,如果只是kill掉ksoftirqds进程,watchdos进程会立刻拉起ksoftirqds。

3.png

正确做法是使用shell脚本,快速kill掉这两个进程

./busybox ps -ef | busybox grep -v grep | busybox egrep 'ksoftirqds' | busybox awk '{print $1}' | busybox xargs kill -9
./busybox ps -ef | busybox grep -v grep | busybox egrep 'watchdogs' | busybox awk '{print $1}' | busybox xargs kill -9

通过busybox尝试恢复被劫持的系统命令和进程后,重启服务器,重新登录服务器后依然有病毒进程被拉起?

通过busybox尝试恢复被劫持的系统命令和进程后,重启服务器,重新登录服务器后依然有病毒进程被拉起,怀疑登录时加载的服务存在问题,最后终于发现/etc/bashrc 存在挖矿木马下载命令。

121.jpg

/etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。所以重启后,挖矿脚本会继续下载。

进程名为随机字符,怎么kill掉 ?

如果挖矿样本起一些随机字符的进程名,确实对我们的批量清理工作带来不小的阻挠,一般有以下思路解决。

  1. 分析进程文件名在特定目录的的生成规则,进而定位进程名
  2. 计算进程文件的哈希,利用文件哈希定位进程名
  3. 分析进程占用CPU的高低

怎么快速定位挖矿样本释放或者改动的文件 ?

直接使用find命令,方便快捷,如果有沙箱或者其他工具,可以更加便捷帮助我们定位样本释放的文件

find /dir -mtime n
其中n表示时间

写挖矿样本的清理脚本需要注意的地方

  1. shell脚本中尽量使用系统默认的命令,以免造成脚本在一些机器上运行失效
  2. 脚本的逻辑需要完整,不要误杀客户业务进程,不要误删客户机器上的正常文件
  3. 脚本运行前,需要和客户安全人员,运维人员review脚本,以免出现意外情况

最后分享一个在最近应急时写的ddgs 4004挖矿病毒的清理脚本。

#!/usr/bin/env bash
sed -i '/curl/d' /var/spool/cron/root
sed -i '/curl/d' /var/spool/cron/crontabs/root
strlen=`find /usr/bin/ -name "*fa4" | wc -L`

#清理模糊匹配的挖矿文件
ddgs_file_arr1=("*fa4")
for file1 in ${ddgs_file_arr1[@]};do
    if [ $strlen == 16 ];then
        echo "yes file exist"
        rm -f /tmp/$file1
        rm -f /usr/bin/$file1
        rm -f /usr/local/bin/$file1
        rm -f /usr/libexec/$file1
        pid=`echo $file1 | sed 's/*//g'`
        echo $pid
        ps -ef | grep -v grep | grep $pid | awk '{print $2}' | xargs kill -9
    fi
done

#清理已知的特定挖矿文件
ddgs_file_arr2=("rndvfa4" "SzdXM" "osetfa4" "zevbfa4" "sjacfa4" "ejgbfa4" "rndofa4" "ftbgfa4" "jtmnfa4")
for file2 in ${ddgs_file_arr2[@]};do
    rm -f /tmp/$file2
    rm -f /usr/bin/$file2
    rm -f /usr/local/bin/$file2
    rm -f /usr/libexec/$file2
    ps -ef | grep -v grep | grep $file2 | awk '{print $2}' | xargs kill -9
done


rm -rf /root/.ddg

暂无评论

发表评论