在互联网发展的早期,恶意程序采用TCP直连的方式连上受害者的主机。随着局域网的发展,以TCP反弹的方式进行连接。
随着防火墙还有边界检测产品的出现,对TCP的数据格式端口进行了限制,普通的TCP反弹又变得很难生存,这个时候出现了数据封装,比如传递数据的时候使用http使用smt隧道等统称为数据封装。
情报的发展与传统的检测相结合,可以快速的去阻断检测或阻断恶意程序的传播。DGA和Fast-flux这种技术又开始快速发展,虽然这种技术很早就有,但是由于情报的快速发展,催生了这种技术在恶意程序里快速大量地应用。
随着检测技术的发展(比如二代防火墙,或者基于深度包检测的技术),不依赖IP和域名仅通过分析恶意程序里面的数据规则就可以进行数据规则的匹配。这种检测技术的发展又催生了恶意程序向前继续迈进, 它对内容开始进一步的加密。
1、互联网发展早期,各类防护设备比较欠缺,所以早期木马使用TCP直连方式就可以连到被控端。
2、TCP直连通信的特点就是被控制端打开端口监听,控制端作为客户端,与被控端直接建立TCP连接。
假设一台机器感染了木马,感染后想判断这台机器上面的数据是否有异常,应该从哪个角度去分析呢?
心跳包,就是客户端定时会发送简单的信息给服务器端,告诉服务器端客户端目前的状态。
恶意程序除了与控制端进行正常的数据通信,也会发送心跳包。
心跳包特点:
1、发包频率
2、包长
心跳包可以定时,比如说每隔一分钟或者每隔多少秒发送一次心跳包。恶意程序为了避免引起别人的怀疑会改变发包的频率,但是改变中仍会有一些特征出现。心跳包的包长不一定是等长或者非常接近的。
某台机器的IP是192.168.0.45,如果想发现心跳包应该怎么去看这些数据呢?
通常由客户端向服务器端发出,我们可以写一个过滤器来过滤一下,只关注从45向外发的数据,指定IP地址为当前机器.0.45,回车后可以看到很多数据。我们在对协议进行过滤,再加一个TCP,过滤完后我们就会看到这样的一个流量数据,两个数据包之间相差多久,数据包的包长是多少等等。
我们可以对于整个TCP流的情况从时间的维度和包长的维度画一个图,横轴是时间维度(观察到两个包之间的距离),纵轴是序列号维度(纵轴可以观察两个包之间的长度)。如果图中体现了线性关系,那么它有可能就是一个心跳包。
在我们没有情报的基础上,如果纯粹从流量上看我们不能说有心跳包就一定是恶意的。这个时候我们可以通过情报去查询一下IP是不是可信的,如果有情报的话,我们看看他心跳包里传的什么内容来进一步确认它是不是一个恶意的程序。
1、基于端口
2、基于协议:数据包是否遵守特定协议的格式。
3、基于规则:数据包特征
防火墙等边界防护设备逐渐部署普及,开始对数据封包和协议格式进行检查。传统的TCP数据传递方式易被拦截,因此新型木马开始对传输数据进行封装:如HTTP封装、icmp封装,dns封装等。
想看一个HTTP的通信是否正常
1、客户端发起的请求是否正常
2、服务器端响应的数据是否正常
3、客户端发起请求的频率是否正常。
一个不正常的http通讯是什么样?首先从请求上看,然后从响应上看,再从频率上看。
我们注意观察请求的数据都是push,请求的类型都是get。完全一样的内容,为什么要不停的请求呢,这就是一个可疑的地方。它响应的内容我们注意观察会发现返回来的数据是零,从这几个维度来看,这个数据包它的特征非常明显。请求频率不正常,请求的数据不正常,返回的数据也不正常。我们也可以跟踪整个流,暴露一下,看看它里边的整个情况。
恶意程序通过使用HTTP协议到攻击者指定的某一个恶意站点去下载恶意程序,下载后在本地进行执行。
我们从请求、响应、频率三个维度来判断是否异常,先从请求上看,貌似是正常的,因为它不像心跳,每次请求的数据请求的位置请求的资源都一样,然后还不停的请求服务器它的数据现在看起来貌似也是正常的,每次都有返回,而且返回来的是有数据的,而不是返回零。
得到一个哈希值,然后到情报的网站里边去做一个查询,就可以初步判断这个文件是什么。得出说明刚才传递的这个程序,它是一个恶意的程序。
从请求的维度、请求数据的特征、响应数据的特征、频率的特征上,它是没有异常的,它的危险在于什么呢?它里边传回来的数据是恶意的。所以这两种情况我们要区别进行对待。
1、基于情报:域名、IP
2、基于规则:数据包特征(URI、参数、user-agent、host等)
3、将文件从流量中还原
只要从流量中下载了文件,我把这个文件给它提取出来还原,还原以后,我们可以通过类似于杀软的这种方式进行基于静态特征的检测。如果静态特征我还查不到,就可以把它扔到沙箱里去,让程序跑起来。然后根据执行的这种动态行为去判断到底是恶意的还是非恶意。当然了这些规则也好,从文件从流量里面还原文件也好,必须要有一个前提,就是你用的协议本身是明文传输协议还是加密传输,那么规则和管理文件都是做不到的。
ICMP协议是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通,主机是否可达、路由是否可用等网络本身的消息。像这些信息ICMP防火墙通常不会拦截。
ICMP协议主要有两类,第一类称为差错报文。
还有一种我们称为请求和响应报表。
最常见的请求与响应报文就是由Ping命令产生的报文。正常的拼命令产生的请求和响应报文它是什么样?
ID和序列号是主机可以随机填的,序列号相当于是一个编号,主机填写的ID、序列号在发送请求的报文和响应的报文里边,他俩必须是一样的。比如说我们看一下请求的报文是1256,然后序列号是1256,我们再看一下响应的报文,这些东西是没有变化的,这是第二个我们需要关注的点。第三个我们需要关注的点就是ICMP它的载荷的长度,也就是它里边存储数据的长度。
Ping命令通常产生的数据包长度为32个之字节,在响应的时候,长度也是32个字节,这都是正常的数据包应该有的特征,然后我们可以继续把32个字节里边的内容看一下,如果是正常的Ping命令产生的数据包,它不但请求32个字节,响应也是32个字节,而且里边的数据内容是不会发生变化的,所以我们看请求的时候跟响应的时候,它里面的载荷内容是一样的,这是一个正常的ICMP的数据包。
我们接下来看一个不正常的ICMP数据包。
看看他从频率上有没有什么特别大的变化。请求响应的数据从维度上看也没有什么太大的变化。载荷的内容,跟我们用拼命令产生的这个就不一样了,我们刚才看到的是32个字节,请求跟响应长度一样,包内容一样,那么他首先从长度上我们看到它就不一样。为了能够更清晰的看到这个里边它的长度,我们可以加上一列。从长度上我们能看出来请求跟响应它的长度都是零,跟正常的工具就已经不太一样了。我们不能去下结论,就说它一定是恶意的,我们还要继续观察,再继续找。那么这个请求通常是谁发的呢?响应是谁发的,通常请求是感染的那台机器发的,不停的去向他的受控端去发送这种ICMP的请求,然后当它的控制端想下发命令的时候,会把数据给它放到载荷里边传递回来。传递回来以后,然后受控端在通过睿快死的请求包的载荷再把数据传回去。受控端如果要像控像感染端下发命令的时候,它会通过rap类的这种形式把数据包传回去。可以看到客户端的一些IP相关信息。
1、穿透防火墙
2、绕过传统的基于数据包规则检测
检测方法:
1、频率:检测同一来源ICMP数据包的频率
2、payload长度
3、数据一致性:请求与相应的payload中数据不一样的;
4、数据特征:分析传输数据,找出规律(如果有)。
基于DNS解析过程
我们刚才提到了DNS隧道,之前我提过正常的通信,它会先请求一个DNS请求的记录,隧道通信的时候,请求可能是txt类型,通常用来返回服务器端主机的一些相关信息。
它能直连的一台机器,通过UDP的形式53端口进行数据传输,其实它是可以发送任何格式数据。它为了避免被发现,里边传输的内容通常都会采用DNS的这种协议的格式来进行传递。
是自己真的去注册了一个域名。当我们发送DNS请求的时候,他通过子域名的方式,把要传递的数据放到载荷里进行传输。域名型的DS隧道我们观察的特征就是它后边的域名是正常的,但是他前面的子域名不正常。
1、穿透防火墙
2、绕过传统的基于数据包规则检测;
1、频率
2、请求类型为TXT且无A记录解析结果
3、是否为可信DNS服务器
4、数据特征:分析传输数据,找出规律(如果有)
域名型检测方法:
1、频率
2、请求类型为TXT且无A记录解析结果
3、域名长度:payload为子域名
攻防博弈激烈的程度的提高,威胁情报技术出现, 使边界防护设备可针对域名、IP进行快速的发现和拦截。
攻击者为了应对威胁情报技术,陆续发展了DGA技术和fast-flus技术。