初遇第三代亡命徒(Outlaw)僵尸网络挖矿病毒

发布于 2023-05-08  145 次阅读


起因:
20230508201149.png

刚睡醒就看到了告警邮件,异常登录+恶意文件

远程查询了一下发现CPU资源异常,负荷100%

接下来正式开始

 

病毒种类

按照腾讯云报道,此次攻击为“亡命徒(Outlaw)僵尸网络”,该病毒最早于2018年被发现,其主要特征为通过SSH攻击目标系统,同时传播基于Perl的Shellbot和门罗币挖矿程序。

病毒处理

01.通过top命令查看各程序运行状态

发现CPU满负荷,出现不明程序kswapd0,rsync等

运行用户为ftptest

02.查看占用进程的病毒路径

ll /proc/16874

发现该进程的真实文件地址

/tmp/.X2d-unix/.rsync/a/kswapd0

PS:所有病毒文件都运行在/tmp,是因为我以前做过权限分离,而且泄露的并不是root权限。

(感觉被曾经的自己拯救了T_T

进入目录后发现存在以下文件

➜  X2d-unix ls -al
总用量 10748
dr--r--r--  3 1000 1000     4096 5月   8 16:08 .
drwxrwxrwt. 6 root root     4096 5月   8 19:30 ..
-r--r--r--  1 1000 1000 10993017 5月   8 16:07 dota3.tar.gz
dr--r--r--  5 1000 1000     4096 5月   8 16:09 .rsync

毫不遮掩的木马的母体文件dota3.tar.gz(这名字很怪真的很怪)

进入.rsync

➜  .rsync ls -al
总用量 136
dr--r--r-- 5 1000 1000  4096 5月   8 16:09 .
dr--r--r-- 3 1000 1000  4096 5月   8 16:08 ..
-r--r--r-- 1 1000 1000  4678 5月   8 16:09 1
dr--r--r-- 3 1000 1000  4096 5月   8 16:09 a
dr--r--r-- 2 1000 1000  4096 5月   8 16:09 b
dr--r--r-- 2 1000 1000  4096 5月   8 18:06 c
-r--r--r-- 1 1000 1000   219 5月   8 16:09 cron.d
-r--r--r-- 1 1000 1000    22 5月   8 16:09 dir.dir
-r--r--r-- 1 1000 1000  2349 2月  27 20:05 init
-r--r--r-- 1 1000 1000 88607 2月  27 20:06 init0
-r--r--r-- 1 1000 1000  1756 2月  27 20:06 init2
-r--r--r-- 1 1000 1000  1912 2月  27 20:06 initall
-r--r--r-- 1 1000 1000     0 5月   8 16:09 .out

看到了有个cron.d的文件,说明该木马病毒设置了定时计划(这是常识吧喂!)

让我们来瞅瞅

➜  .rsync cat cron.d 
5 6 * * 0 /tmp/.X2d-unix/.rsync/a/upd>/dev/null 2>&1
5 8 * * 0 /tmp/.X2d-unix/.rsync/b/sync>/dev/null 2>&1
@reboot /tmp/.X2d-unix/.rsync/b/sync>/dev/null 2>&1
0 0 */3 * * /tmp/.X2d-unix/.rsync/c/aptitude>/dev/null 2>&1

03.看下病毒运行日志

➜  .rsync cat 1     
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
chattr: No such file or directory while trying to stat /data/repo/.configrc*
bash: line 26: lockkr: command not found
xmrig: no process found
ld-linux: no process found
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
mkdir: cannot create directory '/data/repo/.configrc5': Permission denied
cp: cannot create directory '/data/repo/.configrc5/': Permission denied
cp: cannot create directory '/data/repo/.configrc5/': Permission denied
sh: line 21: cd: /data/repo/.configrc5/a/: No such file or directory
sh: line 24: cd: /data/repo/.configrc5/b/: No such file or directory
sh: line 29: cd: /data/repo/.configrc5/: No such file or directory
nohup: failed to run command './a': Permission denied
nohup: failed to run command './a': Permission denied
./aptitude: line 3: 29217 Killed                  ./run &>/dev/null
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
no crontab for repo
./a: line 86: sysctl: command not found
sync: no process found
perl: no process found
ps: no process found
pool: no process found
nginx(1628): Operation not permitted
nginx(2540): Operation not permitted
nginx: no process found
ecryptfs: no process found
xmr: no process found
pkill: killing pid 45 failed: Operation not permitted
pkill: killing pid 1628 failed: Operation not permitted
pkill: killing pid 2540 failed: Operation not permitted
./stop: line 18: kill: (29517) - No such process
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
./stop: line 25: kill: (29579) - No such process
./stop: line 26: kill: (29585) - No such process
./stop: line 27: kill: (45) - Operation not permitted
./stop: line 27: kill: (25177) - Operation not permitted
./stop: line 27: kill: (29593) - No such process
pkill: killing pid 45 failed: Operation not permitted
chmod: cannot access 'ps': No such file or directory
rsync: no process found
sync: no process found
perl: no process found
ps: no process found
pool: no process found
nginx(1628): Operation not permitted
nginx(2540): Operation not permitted
nginx: no process found
ecryptfs: no process found
xmr: no process found
pkill: killing pid 45 failed: Operation not permitted
pkill: killing pid 1628 failed: Operation not permitted
pkill: killing pid 2540 failed: Operation not permitted
./stop: line 18: kill: (29624) - No such process
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
./stop: line 25: kill: (29660) - No such process
./stop: line 26: kill: (29664) - No such process
./stop: line 27: kill: (45) - Operation not permitted
./stop: line 27: kill: (25177) - Operation not permitted
./stop: line 27: kill: (29667) - No such process
./stop: line 27: kill: (29668) - No such process
pkill: killing pid 45 failed: Operation not permitted
mkdir: cannot create directory '.ssh': Permission denied

(再次感谢自己做的权限隔离

04.以下是目录结构

➜ .rsync tree 
.
├── 1
├── a
│   ├── a
│   ├── bash.pid
│   ├── cert_key.pem
│   ├── cert.pem
│   ├── dir.dir
│   ├── init0
│   ├── kswapd0
│   ├── run
│   ├── stop
│   ├── tors
│   │   ├── bin
│   │   │   ├── tor
│   │   │   ├── tor-gencert
│   │   │   ├── torify
│   │   │   ├── tor-print-ed-signing-cert
│   │   │   └── tor-resolve
│   │   ├── cleandirs.sh
│   │   ├── etctor
│   │   │   └── tor
│   │   │   └── torrc1
│   │   ├── libtor
│   │   │   └── tor1
│   │   ├── share
│   │   │   └── tor
│   │   │   ├── geoip
│   │   │   └── geoip6
│   │   ├── start.sh
│   │   └── stop.sh
│   └── upd
├── b
│   ├── a
│   ├── dir.dir
│   ├── run
│   ├── stop
│   └── sync
├── c
│   ├── aptitude
│   ├── blitz
│   ├── blitz32
│   ├── blitz64
│   ├── cron.d
│   ├── dir2.dir
│   ├── dir.dir
│   ├── go
│   ├── n
│   ├── run
│   ├── start
│   ├── stop
│   └── v
├── cron.d
├── dir.dir
├── init
├── init0
├── init2
└── initall

11 directories, 46 files

05.代码分析

初始化代码有3个,即init、init2、initall
通过pkill、rm -f操作,将之前可能存在的程序残留都删除干净;
开始运行程序
mkdir ~/.configrc    新建文件夹
cp -r a ~/.configrc/    拷贝文件夹
cp -r b ~/.configrc/   
cd ~/.configrc/a/
nohup ./init0 >> /dev/null &   进入a文件夹运行init0,程序的主要功能为:在Linux环境中杀死加密矿工的脚本,即杀死别的挖矿脚本,同行是冤家啊。。。
sleep 5s
nohup ./a >>/dev/null &     在a文件夹内运行a程序,折腾一圈,最终目的还是为了运行程序kswapd0
cd ~/.configrc/b/
nohup ./a >>/dev/null &   在b文件夹内运行a程序,目的为运行run程序
cd $dir
cd c
nohup ./start >>/dev/null &  在c文件夹内运行start程序,绕一圈最终为了运行tsm32、tsm64
通过计划任务来启动
echo "1 1 */2 * * $dir2/a/upd>/dev/null 2>&1
@reboot $dir2/a/upd>/dev/null 2>&1
5 8 * * 0 $dir2/b/sync>/dev/null 2>&1
@reboot $dir2/b/sync>/dev/null 2>&1  
0 0 */3 * * $dir/c/aptitude>/dev/null 2>&1" >> cron.d
crontab cron.d
crontab -l
init2为init的简化版,没有新建目录和拷贝程序,直接就在当前目前运行程序。
initall  的功能为上述2个init、init2都运行一遍,cat init | bash、cat init2 | bash就通过这2个命令来实现,cat init | bash表示将init里的命令全部在重新执行一遍,(看完很佩服,精华啊这命令用的)
经过上述分析可知,整个病毒的核心功能是a文件夹的kswapd0、b文件夹的run、c文件夹的tsm32、tsm64,下一步着重分析上述3个文件即可;病毒通过计划任务来启动。

06.文件分析

a目录下二进制文件kswapd0为XMRig编译的Linux平台门罗币挖矿木马
外联的ip及网址:
45.9.148.125            "url": "45.9.148.125:80",
45.9.148.129            "url": "45.9.148.129:80",
XMRig是一款高性能的门罗币(XMR)CPU挖矿软件。
b目录下run脚本主要内容为base64编码的shellbot后门程序,解码后可以看到代码仍然经过混淆。把执行函数eval改为print可打印出解密后的代码,是基于Perl的Shellbot变种,连接C2服务器地址为45.9.148.99:443,能够执行多个后门命令,包括文件下载、执行shell cmd和DDoS攻击。如果接受到扫描端口命令,可针对以下端口进行扫描:"21","22","23","25","53","80","110","143","6665"。

总结

本次入侵为ftp用户管理不当
ftp未设置nologin
密码过弱导致

病毒清理思路如下

1、删除以下文件,杀死对应进程:

/tmp/*-unix/.rsync/a/kswapd0
/tmp/*-unix/.rsync/c/tsm64
/tmp/*-unix/.rsync/c/tsm32
如果未做权限隔离,检查以下文件
*/.configrc/a/kswapd0
*/.configrc/

2、检查定时任务,清理不认识的任务,特别是有以下内容的:

/a/upd
/b/sync
/c/aptitude

君子慎独,不欺暗室。卑以自牧,含章可贞。