0x00 背景

蜜罐上又捕获一HFS上下载的恶意软件,从功能上看和之前的lx样本类似,只不过加了些Flood方法和功能,VT上一看原来都是是属于Ddostf家族。以后还是会分析些不同家族的样本,从多个角度分析样本的特征,毕竟时代在变化嘛。

MMD组织之前也分析过该样本,他们对页面信息的探索和不同变种的分析比较全面,而且这个官网的页面也是蛮有意思的,感兴趣的同学可以自行探究:

0x01 特征

权限判定

调用JudgeIfRoot函数会根据文件/proc/cpuinfo的可读性,来判断进程的有效id是否为root。

进程互斥

启动时若有参数传递,则会执行 ps -e查看是否已有相同程序运行,有的话则退出。

自启动

在MVfile函数中会调用system函数执行以下命令:

chmod +x /etc/rc.local
mv $(pwd)/c1 /etc/c1
cd /etc;chmod 777 c1
sed -i -e '/exit/d' /etc/rc.local
sed -i -e '/^\r\n|\r|\n$/d' /etc/rc.local
sed -i -e '/c1/d' /etc/rc.local
sed -i -e '2 i/etc/c1 reboot' /etc/rc.local
sed -i -e '2 i/etc/c1 start' /etc/rc.d/rc.local
sed -i -e '2 i/etc/c1 start' /etc/init.d/boot.local

貌似吸取了某些经验后,将rc.local删除了exit和空行,并插入第2行实现自启动。

守护进程

平平无常,会切换到/tmp目录。

C&C

依旧是实现了两个函数来连接主控端,其中ServerConnectClishell函数会连接base64解码的地址,但是该硬编码全局变量还没定好,所以无法得到正确解码和完成后续操作:

没有关系,ConnectServer函数会挑起大梁,而且具备的功能类型也比ConnectServershell多3种,下面会详解。

0x02 功能

在主动连接上主控端后,会先发一段$(uname –s)_$(uname –r) TF- Linux kernel … [SYN-Flow | UDP-Flow]告知主机信息,其中SYN-Flow代表是拥有root权限,然后会根据接收的指令执行对应功能:

DealwithDDoS

增至了12种Flood方法,指令的结构稍微发生了点变化。

SYN_Flood

源ip和port为随机化,还会循环地向tcp flags中加入标志位。

WZSYN_Flood

和SYN_Flood类似,不过开始源ip为192.168.3.100,源端口为5678,后续就会随机源ip和port,并且tcp flags为SYN,ACK:

ack_Flood

和WZSYN_Flood类似,但不指定ip数据包长度,data数据段为0。

WZTCP_Flood

需要root权限,和WZSYN_Flood类似,window size和tcp flags均为空:

TCP_Flood

为指定长度的tcp connect flood:

UDP_Flood

和SYN_Flood类似,length指定的是data段的长度,填充的为X字符。

WZUDP_Flood

和WZSYN_Flood类似,但data长度为0。

ICMP_Flood

和UDP_Flood类似,但data段为内存数据。

GET_Flood

其会随机选取UA,并用原始ip地址进行HTTP Flood:

GETFT_Flood

和GET_Flood类似,但多发送了两次请求:

HEAD_Flood

和GETFT_Flood类似,只是请求方法变成了HEAD。

xzcc_Flood

功能和GETFT_Flood一样。

POST_Flood

和GETFT_Flood类似,只是请求方法变成了POST。

popen

调用popen函数无回显地执行命令。

Rent_Main

设置远程的ip、port和运行时间,通过RentConnectClient函数,再次调用DealwithDDoS功能:

Send_Host_Message

通过对/proc/net/dev和/proc/stat的读取,实时获取被控端的网络速率和cpu使用率。

XTSTOP

停止Send_Host_Message功能。

StopFlag

停止Flood攻击。

0x03 修复

根据上述的特征,修复时首先删除恶意样本,然后修复rc.local文件,最后kill掉相关进程就好啦,简单得见笑了。