使用 wireshark 高效,准确地鉴别出入站的恶意流量


这篇博文实际上是 http://shayi1983.blog.51cto.com/4681835/1558161

的继续,讲解一些实用的数据包分析技巧,帮助安全架构师们迅速,准确地定位那些恶意的数据包;

在分秒必争的安全突发事件与安全取证工作中,这些高效的方法显得格外重要.


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第1张图片


**********************

wireshark 网络层地址解析

wireshark 中的网络层名称解析功能,与真实场景的 DNS 解析刚好相反,默认情况下,wireshark 抓取的数据包是不会将网络层源 IP 与目标 IP 解析到主机名的,

除非在主菜单 view -> name resolution ->勾选 "enable for network layer",这样,wireshark 会实时用本地配置的 DNS 服务器信息,对其发送解析请求与接收应答,而这个过程刚好与正向解析--从域名或主机名到 IP 的过程相反。

多数情况下,勾选"enable for network layer"后,在 wireshark 抓取数据包前,名称解析的工作已经由操作系统上的 DNS 客户端服务完成,但也有少数情况,从域名或主机名到 IP 的解析是在 wireshark 抓取并显示数据包后完成的,此时的解析结果仅保存在内核缓冲区里,wireshark 不会主动"更新"这里面的信息,因此你也许会看到,即便勾选了 "enable for network layer",列表中的某些数据包的 IP 地址还是无法被"反向"显示为域名或主机名.

此时,你可以单击主菜单 view -> reload ,这将强制 wireshark 从系统那里更新名称解析的结果并显示。


实际上,wireshark 请求本地 DNS 客户端进行名称解析,本地 DNS 客户端的实现取决于操作系统,在 windows server 2008 R2 SP1 中,本地 DNS 客户端叫做

DNS Client(dnscache) ,这是一个 windows 服务例程,


一个纳宿服务的进程,叫做 svchost.exe ,在启动的时候,会加载动态链接库

dnsrslvr.dll ,并且以多线程的方式启动数个 DNS Client(dnscache) 服务

它负责处理所有网络应用程序的名称解析请求(提交给 DNS 服务器,或查看本地的 host 文件),如果禁用该服务,那么任何网络应用程序,Chrome web browser 也好,wireshark 也好,都无法正常工作,这一点必须注意。


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第2张图片


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第3张图片


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第4张图片


值得指出,Dnscache 仅仅是系统服务,负责在本地缓存通过网络解析到的域名—IP的映射,我们可以在cmd命令行下执行:

ipconfig /displaydns

来输出本机的dns缓存内容:


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第5张图片


这些内容可以提供给浏览器使用,加速网页打开过程。

Dnscache服务并不负责具体的dns解析,

真正负责的是前文提及的某个加载了 dnsrslvr.dll 的 svchost.exe 进程中的一些线程,由这些执行在 dnsrslvr.dll 内特定代码逻辑的线程负责。(显然,dns查询包的发送,接收远程dns服务器的应答包等,必须由内核中的TCP/IP协议栈代码完成)

因此,我们停止并且禁用Dnscache服务,只是无法缓存解析结果:


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第6张图片


并不会影响域名解析(浏览器和其他基于域名的网络应用程序照常工作),但是,如果杀掉载入了dnsrslvr.dll(或者dnsapi.dll)的 svchost.exe 进程,那么计算机就可能无法将域名解析成IP,因为解析功能是实现在这2个dll中。各位可以在虚拟机中创建快照,然后删除这2个dll,看看能否解析。

即便如上所示禁用了操作系统级别的dns缓存,浏览器自身也可以缓存dns解析结果,例如在Chrome的地址栏输入:


chrome://net-internals/#dns


将显示chrome自身缓存的dns解析结果:


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第7张图片

****************************



****************************

wireshark 链路层 MAC 地址解析

这个解析唯一具有价值之处在于,它将 6 字节的 MAC 地址中的前 3 个 16 进制字节解析为网络设备(例如个人 PC 的网卡适配器,以及路由器)制造商的名称缩写。

注意,前 3 个 16 进制字节是由 IEEE 分配的,用于唯一标识各厂商的地址,而链路层 MAC 地址解析就是将其转换为可读性更强的厂商缩写名。

单击 wireshark 主菜单 view -> name resolution -> enable for MAC layer ,即可启用链路层 MAC 地址解析功能。

另外,通过单击主菜单 statistics -> show address resolution ,在打开的对话框中,你可以找到一个列表,包含有 wireshark 内置的所有厂商 MAC 地址与厂商缩写的对应关系,如下所示:


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第8张图片


注意,即便这些信息能在***测试中帮助判断目标的基础设施类型,但是这些信息可以通过技术手段更改,因此并不总是准确,但是对于多数组织机构而言,我们可以认为这里的信息是可采用的。


*****************************


*****************************

关于 wireshark 的验证 "TCP 校验和"功能


一般来讲,在发送数据包前,发送方(的 TCP/IP 协议堆栈,通常作为操作系统内核的组成部分)使用某种摘要算法对该包计算,生成该包的校验和,然后在 TCP 首部的校验和字段中携带;接收方(的 TCP/IP 协议堆栈)对收到的包进行同样的计算,将计算结果与校验和字段中的值进行比对,如果两者相等,说明数据在传输的过程中是完整无损坏的,如果不相等,则取决于 TCP/IP 协议堆栈的具体实现,有可能

发送方在一个计时器到时后,还未收到接收方用以汇报该包完整的 ACK 包,那么发送方有可能重传先前发送的数据包,直到收到接收方的 ACK 包为止。


这个验证工作通常是由双方的操作作系统完成的,然而,你也可以使用 wireshark 的验证 "TCP 校验和"功能,对抓取到的包进行再次验证;

使用 wireshark 重复验证的好处在于,它可以明确地告诉你一个数据包的完整性与否,而操作系统不会自动发送消息通知你;

通过单击主菜单 edit -> Preferences ,打开首选项对话框,点击并展开左侧的 Protocols 树型节点,找到 TCP 协议,然后勾选右侧的 "Validate the TCP checksum if possible" 复选方块,这样 wireshark 会显示抓取到的数据包,其校验和是否正确。


谨慎使用这一功能,前面我有提到,真正进行验证的其实是操作系统,而 wireshark 如果验证校验和发现错误(此时,正确校验和的包已经再次通过双方系统发送与接收了,而 wireshark 捕获的是"重传"前的错误校验和包),则 wireshark 拒绝对一些 TCP 分段包进行重组装(尽管操作系统已经正确重新组装了"重传"的包)

从而,我们也就无法获得完整的数据包信息(通常是指 TCP 分段承载的应用层数据)

下面这张截图说明该数据包的 TCP 校验和经过 wireshark 验证,是正确的:


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第9张图片

使用 wireshark 高效,准确地鉴别出入站的恶意流量_第10张图片


上面第一张截图是 TCP 校验和经过 wireshark 验证无误后的结果,如果验证出错,我们将在所选择数据包的详情窗口(位置在中间的窗口)中,看到被红色高亮显示的 TCP 头部,将其展开,就可以查看错误的校验和字段,如下截图所示:


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第11张图片


除了上面截图中讲到的过滤表达式

 tcp.checksum_good == 0

可以用来显示所有校验和错误的数据包之外,下面这个表达式也有相同的效果,当然,你也可以在上图的 "bad checksum: true" 字段右击鼠标,在弹出的上下文级联菜单选择 "apply as filter" -> "selected" 来达到相同目的,请自行实践!

tcp.checksum_bad == 1


顺便提一下,从上图可以很清楚地看到,过滤出来的所有校验和错误的数据包,基本上都是从本地客户端(很可能是 web 浏览器)发往远程 web 服务器的 HTTP 请求,

一般来讲,检测到这些数据包的 TCP 检验和错误,不会有太大的问题,因为校验和是给接收方验证的,如果发送方自行验证有无错误,那么校验和就失去其存在的意义了;


反之,如果在过滤列表中看到来自服务器返回的 HTTP 响应数据包,其校验和错误,那就完全不同,因为在这个场景中,本地客户端是接收方,如果验证出错,表明该数据包在传输的过程中损坏,或丢失,也有可能是被篡改;

尽管双方系统的网络协议堆栈可能已经正确地"重传"数据包,但既然 wireshark 检测到"曾经"有错误,那么作为网络工程师或安全架构师的我们,就应该检查自己这一端可控的链路状态(从物理层到应用层),确保后续稳定地发送与接收数据.

*********************************



*********************************

综合分析技巧举例1


拿到一个捕获的数据包文件样本,其中通常有成百上千个数据包等着我们去查看,如何快速地定位我们感兴趣的信息?

点击主菜单 "statistics" -> "Summary" ,会显示当前你所打开的捕获文件的概要信息,其中最有价值的信息,包括捕获第一个包的日期时间与最后一个包的日期时间,

以及由此计算出的整个捕获过程持续的时间(elapsed),数据包文件里的总字节数,单个数据包大小上限,链路层封装类型.....等等.



使用 wireshark 高效,准确地鉴别出入站的恶意流量_第12张图片

接下来需要关注的,应该是了解这个样本文件中,所有的端点(endpoints)以及

会话(conversations)

端点可以列出一张清单,包括捕获的包文件中,所有与本地通信的远程机器的 IP;

会话则显示一张更详细的清单,包括了通信双方的 IP 以及端口(TCP 或 UDP);

下面的截图显示出,从一个样本文件中提取出来的端点列表,通常我们仅关注

IPv4 端点,因为它可以帮助你判断是否连接到了任何恶意站点或机器,至于详细的出入站流量,应该使用会话来查看,因为它能列出本地端口与远程端口:


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第13张图片


使用 wireshark 高效,准确地鉴别出入站的恶意流量_第14张图片


要打开端点列表,点击主菜单 "statistics" -> "Endpoints"

要打开会话列表,点击主菜单 "statistics" -> "Conversations"

*******************************


*******************************

综合分析技巧举例2


我们在访问一个网站的时候,浏览器通常需要下载大量的 HTML 代码,CSS 样式表,javascript 脚本文件,jepg/gif 图片,视频动画等等,才能完整呈现一个站点的主页,而且这些资源经常存储在各种独立的物理主机上;

有的站点主页甚至通过 ,