MalwareMustDie Ddostf 样本分析
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掉相关进程就好啦,简单得见笑了。