文章关键词:电子数据取证、流量分析、流量取证
一、前言
近期,网络安全团队在对公司内部网络进行安全检查时发现,有五台电脑出现了不明的网络流量。这些电脑并没有执行任何明显的操作,但是网络流量却显示它们正在向外传输数据。
初步调查后发现,这些数据流都通往同一个外部地址,并发现所有这些被控制的电脑都执行了相同的操作,下载并执行了一个来自外部地址的恶意程序。
这起事件引发了公司的担忧,因为如果这些电脑被黑客控制,那么黑客就能够访问公司的内部网络,甚至可能获取到敏感数据。
为了明确事情的真相,公司决定进一步调查此事。截取了一段流量并对其进行取证,大致确定了黑客使用的工具名叫Cobalt Strike,并对这起事件进行了相关处理。
通过这个案例,我们可以了解到Cobalt Strike的一些主要特征和操作方式。
二、基本运行原理
Cobalt Strike的运行需要一个连接被控端和控制端的teamserver,在一个完整的指令传输以及运行中,主要的步骤有:
被控端向team server发送一个心跳包,心跳包默认每60秒发送一次(可以手动修改),作用主要是为了迷惑安全软件,防止因为持续连接并发送数据而被检测到。
心跳包的数据信息被team server记录后,被控端会再次向team server发送一个心跳包询问是否有需要执行的指令,Team server接收到第二次心跳包后会将控制端输入的指令传送给被控端,被控端执行指令(间隔同样是默认60秒),当知晓以上的基本信息后,遇见未魔改的CS后就可以快速识别出流量的来源是CS:
在上面的流量包中,两台主机之间的通信基本上是每隔60秒通信一次且上下行的数据长度固定,大致可以判断出是一个没有经过修改的CS与被控端之间交流的流量。
三、可执行和文件的下载(stage)
Stage是可执行文件在运行后会使用http协议向指定服务器下载stage,指定服务器通常是team server,请求http的路径有多个,但不管怎样,路径名都符合checksum8原则,请求的路径的ascii的和与256取余之后的值为92(x86位木马)或者93(64位木马)
使用checksum8的Java代码:
public class EchoTest {
public static long checksum8(String text) {
if (text.length() < 4) {
return 0L;
}
text = text.replace("/", "");
long sum = 0L;
for (int x = 0; x < text.length(); x++) {
sum += text.charAt(x);
}
return sum % 256L;
}
public static void main(String[] args) throws Exception {
System.out.println(checksum8("4Ekx")); // Yle2、cKTZ、wQPD等
}
}
3.1、控制端命令的下发
控制端在向被控端下发命令时,在流量中会有比较明显的submit.php同时后接id参数:
3.2、user-agent头
在4.0之前的CS版本中,使用CS的流量的user-agent头是固定的,不会变化特征比较明显,在4.0之后的版本中user-agent头开始随机生成,避免被检测到。
4.0之前的版本,每次user-agent头都相同。
四、总结
在对流量的取证过程中,应当先了解各种工具的各种基本特征,才能根据其特征来分析并确定其类型,需要充分了解取证的技巧以及具备充实的知识储备,才能在令人眼花缭乱的数据流中找出关键的证据。
今后的流量取证中仍然需要继续学习,加强技术能力,为网络安全贡献一份力。