用了这么多年 linux,第一次遇到了挖矿木马植入攻击 1。记录一下分析和解决过程。

1 事情经过

昨天用 top 命令查看服务器 cpu 使用情况,突然发现一个用户占用了 8 个 cpu 跑了一个cron,并且运行时间越来越长。

top_screenshot

这个用户一般情况下是不会去使用服务器的,所以我立马引起警觉,联系当事人,询问情况。

很显然该用户没有做任何操作。

由于这个服务器本身的一些原因,暂时无法解决的安全问题,这次并没有查出入侵的原因是管理员用户弱密码攻击,还是运行的某些服务有漏洞。

2 删除木马程序

首先要做的是关掉这个cron程序。

ps -aux | grep cron
kill -9 进程号

#如果没有其他cron job运行,可以直接杀掉crontab

pkill -9 crontab

接下来删除这个 cron 定时任务。

crontab -r 用户名

之后开始查找木马文件,进入该用户目录,发下了隐藏的文件夹.bashtemp

.
├── a
│   ├── a
│   ├── anacron
│   ├── bash.pid
│   ├── cron
│   ├── dir.dir
│   ├── init0
│   ├── run
│   ├── stop
│   └── upd
├── b
│   ├── a
│   ├── dir.dir
│   ├── run
│   ├── stop
│   └── sync
├── cron.d
└── dir2.dir

看到cron.d是执行的定时任务。/home/用户名/.bashtemp/b/sync是所执行的程序。

0 0 */3 * * /home/用户名/.bashtemp/a/upd>/dev/null 2>&1
@reboot /home/用户名/.bashtemp/a/upd>/dev/null 2>&1
5 8 * * 0 /home/用户名/.bashtemp/b/sync>/dev/null 2>&1
@reboot /home/用户名/.bashtemp/b/sync>/dev/null 2>&1  
0 0 */3 * * /tmp/.X19-unix/.rsync/c/aptitude>/dev/null 2>&1

.bashtemp/b/sync是一段 shell 脚本,用来运行.bashtemp/b/run里面的内容,run里是恶意挖矿脚本以及添加黑客的 rsa 公钥加到/root/.ssh/authorized_keys的程序,具体内容和详细分析参见参考资料2 2

密钥长这个模样:

AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr

用这个公钥在网上一搜,可以发现不少中招的信息 345

通过上面的定时任务,还可以发现在/tmp文件夹下有一个隐藏的文件夹.X19-unix, 里面有一个 dota3 的压缩包和隐藏的.rsync文件夹,压缩包查看内容后发现是整套木马程序(.rsync里的内容)。

.
├── dota3.tar.gz
└── .rsync
    ├── 1
    ├── a
    │   ├── a
    │   ├── anacron
    │   ├── cron
    │   ├── init0
    │   ├── run
    │   └── stop
    ├── b
    │   ├── a
    │   ├── run
    │   └── stop
    ├── c
    │   ├── 1
    │   ├── aptitude
    │   ├── dir.dir
    │   ├── go
    │   ├── golan
    │   ├── lib
    │   │   ├── 32
    │   │   │   ├── libc.so.6
    │   │   │   ├── libdl.so.2
    │   │   │   ├── libnss_dns.so.2
    │   │   │   ├── libnss_files.so.2
    │   │   │   ├── libpthread.so.0
    │   │   │   ├── libresolv-2.23.so
    │   │   │   ├── libresolv.so.2
    │   │   │   └── tsm
    │   │   └── 64
    │   │       ├── libc.so.6
    │   │       ├── libdl.so.2
    │   │       ├── libnss_dns.so.2
    │   │       ├── libnss_files.so.2
    │   │       ├── libpthread.so.0
    │   │       ├── libresolv-2.23.so
    │   │       ├── libresolv.so.2
    │   │       └── tsm
    │   ├── n
    │   ├── run
    │   ├── scan.log
    │   ├── slow
    │   ├── start
    │   ├── stop
    │   ├── tsm
    │   ├── tsm32
    │   ├── tsm64
    │   ├── v
    │   └── watchdog
    ├── dir.dir
    ├── init
    ├── init2
    ├── initall  <---安装木马程序到服务器
    └── .out

上面的程序,会安装木马到指定的用户目录下,并改写 root 目录下的 ssh 公钥。所以如果只删除了用户目录的可以程序,并不能解决问题。

3 如何防范这种事情再次发生?

  1. 安装 fail2ban6 禁止多次尝试用户名密码撞库的 ip
  2. 禁止通过 ssh 方式用 root 账号登录服务器(即,只让用管理员账号登录)
  3. 关闭常用的 22 端口

参考资料: