MalwareMustDie MK64 样本分析
0x00 背景
这次捕获样本的亮点在于有个自保过程,也是有一定的Flood功能,VT上监测如下,但行为和标注出来的家族都不太一样,就暂且将其称为MK64吧,本文主要是静态分析动态验证一下,MMD:
0x01 特征
守护进程
通过init_daemon函数设置成为守护进程,切换至/tmp目录。有个小技巧就是patch该函数就可以看到程序在开发过程中的调试输出(如果有的话),便于理解程序功能。
进程互斥
在CSocketManager::Initalize函数中会bind 29123或29124端口作为互斥条件,失败则退出。
自启动
在DefaultStartUp函数中通过system函数执行以下命令:
echo 'DDosClient &'>> /etc/init.d/rc.local;echo >> /etc/init.d/rc.local
进程自保
在CopyAndRun函数中,其会drop处一个dbuspm-session的ELF文件,添加执行权限并执行:
注意这里通过参数向dbuspm-session中传递了其pid,而在dbuspm-session中则会将该值保存到全局变量pid中,并会实时监测“父进程”是否存在,不存在则再次执行原样本:
dbuspm-session也会把自己的pid传递给原样本的RecvUsr1Signal sa_handler,同样是“认贼作父”,这样两个进程就成为了监控重启彼此的天使宝宝。
dbuspm-session中还cp备份原样本实现低级自保:
C&C
从小节最开始的图片可以看到,样本会fork执行初始化,所以会有两个C&C地址,子进程的初始化还会sleep 2天后在进行。对于连接的地址稍微编码了一下:
解码后为:
118.193.184.221:29135
www.jyzs88.com:29135
jyzs88解析地址为127.0.0.1目测已被某IDC回收,118.193.184.221反查域名又是国内的大佬?:
0x02 功能
SendOnlineInfo
当连接上C&C后会发送全局变量m_LoginInfo 392字节内容,其中包括被控端的utsname.sysname、utsname.release、NetChad、Memory、CpuSpeed、PackageLoad、WorkStatus、SendStatus等信息:
在GetOnlineInfo函数中会开启新线程,一旦连接上就While 1循环发送m_LoginInfo信息。
DisposeMessage
变量设置
- DDos SET:设置在DDOS过程中某些字段内容。
- COMMAND_DDOS_STOP:设置Stop相关全局变量停止攻击。
- SetDNS:接收并设置DNS地址至全局DNS_Servers数组,但无其他交叉引用。
- CpuLimit:设置CpuSpeedLimit、CheckTime限制攻击过程中Cpu的使用。
- 其他:替换MK64为其他字符串。
执行命令
Cmd Arrive
接收cmd字符串fork后执行。
发送数据包
SendForgeUdp
顾名思义,可以设置源端口会发送伪造的udp包至C&C:
StartDDosTask
DDOS功能有SYN_Flood、UDP_Flood、ICMP_Flood、DNS_Flood四种,可以多线程进行攻击:
但在Flood之前会开线程调用CpuLimitor方法设置实例的数据成员,也是前面提到的:如果开启了doCpuLimit,会将实时的CpuSpeed和限制的CpuSpeedLimit对比,超过则usleep对应的CheckTime。同时还会设置攻击的时间。在线程开始攻击后,还会调用Packagecalculator方法记录已加载的数据包。
0x03 修复
虽然该样本的进程自保看似凶相,但还是通过system函数执行原二进制文件,所以先删样本再杀死进程就可以斩草除根了,当然也不要忘记恢复你的rc.local文件哦。欢迎大牛指点,学者轻拍,道友交流。