导语:在数字取证调查过程中检查Windows系统的网络连接时间,是一种查找异常可疑进程的重要做法。在本文中,我会介绍如何提取每次网络连接的时间戳。
在数字取证调查过程中检查Windows系统的网络连接时间,是一种查找异常可疑进程的重要做法。在本文中,我会介绍如何提取每次网络连接的时间戳。
寻找时间戳的重要意义
在我看来,几乎所有的恶意软件都具有某种利用网络才能实施的需求,比如黑客必须通过网络向恶意软件发布命令或控制远程服务器,以进行攻击或在受害者的系统上创建后门。当然,对于非自动化攻击也是如此,在这些攻击中,攻击者会实时的手动控制恶意攻击进程。
美国系统网络安全协会(SANS Institute)的专家们最近就列出了调查取证人员在取证时应该查看的各种可疑的网络活动:
一些可疑的网络活动
更详细的介绍请阅读美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)的《将取证技术融入到事件响应中的指南》以及Corey Harrell的《事件响应进程中的证据提取方法》。
在这些标准方法中,你可以看到寻找时间戳的重要性。只要找到了时间戳就可以了解你要取证的设备何时建立了连接、连接了什么等,这样与该时间点相关的信息都能顺藤摸瓜的找到。通过将网络连接的相关指标关联起来,就可以为全面综合分析攻击者的活动和简化事件响应流程创建更好的取证环境。
在取证时,我们要想先掌握一些得手的分析取证工具,以便你调查一些不稳定的易失性数据,无论是通过内存取证分析工具还是实时响应工具。事实上,所有的工具都包括某种与网络连接证据收集相关功能。
几乎所有可用的工具都会生成类似于Windows的netstat.exe的输出内容,其中就包括有关每个连接的信息,如本地IP地址和端口,远程IP地址和端口,状态和拥有进程ID。
带有-abno标志的netstat.exe输出截图
现有的网络连接提取工具
在深入介绍取证方法之前,我想先介绍一下现有工具及其功能。
实时响应类的工具
无论是基于代理的(osquery和GRR)工具,还是无代理的(Kansa)工具,此类工具都有能力收集网络连接证据,它们通常会通过解析内置于netstat.exe实用程序中的Windows输出内容,或利用Windows API函数和结构。比如,osquery支持像SQL语句一样查询系统的各项指标,可以用于OSX和Linux操作系统。它使得底层操作系统分析和监控性能更加直观。
不过,上述工具目前都没有提取连接的时间戳的功能。
内存取证类的工具
由于内存取证都是关于易失性数据的,因此像Volatility和Rekall这样的框架也会将网络相关证据作为其插件列表的一部分。Rekall框架是一个完全开放的工具集合,旨在向人们介绍技术以及从RAM中进行数字取证的复杂度,并提供一个平台去对这一领域进行进一步更为深入的研究。Volatility是一款非常强大的内存取证工具,它是由来自全世界的数百位知名安全专家合作开发的一套工具, 可以用于windows,linux,mac osx,android等系统内存取证。
虽然上述工具都是使用内存转储或内核驱动程序来提取数据,但是数据是从netstat.exe使用的相同操作系统资源中检索的,如Michael的(@ iMHLv2)博客中对Volatility的netscan插件所做的介绍。
Volatility的netscan插件可以输出与netstat相同的信息,但Volatility的优势在于,它可以绑定套接字或已建立连接的创建时间戳。
Volatility的网络扫描输出样本
当我第一次运行与网络相关的Volatility插件时,我发现开放连接的时间戳可能是实时响应的一个很好的证据。
所以我的假设是,由于Volatility会从内核池中提取时间戳,所以从用户系统(USER-LAND)获取信息是不可能的,因此我就没有往下进一步研究Volatility。
另外,我认为,如果netstat和所有其他用户模式工具没有显示时间戳,则可能是不可能的。原来我完全错了!可以从用户模式提取网络连接时间戳。
在用户模式下提取网络连接时间戳
其实该方法还我要求我的开发团队将取证工具中的netstat输出修改为易于使用的输出时发现的。在处理netstat输出的解析时,大多数工具开发人员要么为netstat输出流编写他们自己的解析器(比如Kansa),要么调用Windows API(比如psutils)。
而我的一位开发团队负责人(@Liad Gareh)则花了很短的时间就得出以下结论:使用Windows API提取网络连接时,还可以获取每个创建连接的时间戳。
例如,获得所有TCP网络连接的时间戳的步骤如下:
1.GetExtendedTcpTable函数检索包含可用于应用程序的TCP端点列表(IP和端口组合)的表;
取自MSDN的GetExtendedTcpTable
2.TCP_TABLE_CLASS枚举参数定义了要检索的TCP表结构的类型;
3.将TCP_TABLE_OWNER_MODULE_ALL作为GetExtendedTcpTable的表类参数进行检索将生成一个MIB_TCPTABLE_OWNER_MODULE类型的TCP表。
4.结果TCP表中的每个条目(行)都是MIB_TCPROW_OWNER_MODULE类型,根据MSDN的介绍,这些条目具有“包含描述IPv4 TCP连接的信息,其中包含有所有权数据、IPv4地址、TCP连接使用的端口,以及与连接相关的特定进程ID (PID)”的特点。
取自MSDN的MIB_TCPROW_OWNER_MODULE
5.请你仔细观察上面的结构和新添加的liCreateTimestamp,这会被记录为一个SYSTEMTIME结构,该结构会指示创建此TCP链接的上下文绑定操作何时发生。
含有时间戳的Get-NetworkConnection
起初,我非常怀疑为什么没有取证工具对这些高价值的信息进行分析?为什么netstat,tcpvcon,psutils都没有包含这个分析?
带着这些疑问我检查了GitHub中具有上述结构的所有代码,以查看是否有任何工具使用此证据。结果,我发现了许多取证工具实际上都使用了API和相关结构,但我却无法找到提取时间戳结构的工具。虽然最近,我发现了由Lee Christensen(@tifkin_)编写的PowerShell代码,名为Get-NetworkConnection,它就使用了上面提到的Windows API调用,来提取当前TCP和UDP连接,但却没有时间戳的证据。
于是我联系了Lee,经过他的同意,我可以使用他已经开发的代码。为了提取我正在寻找的时间戳,我对Get-NetworkConnection进行了简单的修改,以便进行以下操作:
1.提取CreateTimestamp的值;
2.在输出内容中包含时间戳;
添加了时间戳的Get-NetworkConnection的运行示例
在对修改后的Get-NetworkConnection运行过程进行验证后,我可以确保它具有实际的提取时间戳的能力,使用这个简单的Windows API调用来提取TCP和UDP连接的时间戳,然后在进行以下思考:
1.这真的是一个有价值的取证证据吗?
2.这是否可以添加到用于取证的时间表(Timeline)中?
为了解决这些疑问,我亲自进行了测试。首先我创造了一些类似的取证场景,并试图查看我拥有的新证据是否可以派上用场。
将提取的时间戳证据纳入时间表
我使用了两种不同的方案测试了连接时间戳的值。在这两种情况下,我都模拟饿是攻击者或恶意软件。我的测试证明,加了时间戳的Get-NetworkConnection可以帮助我们进行高效的取证分析。
方案一:恶意进程
一般情况下,恶意进程会在端点上生成一个恶意进程,并立即打开连接。这种情况可以采取以下两种形式之一:
1.将后门安装在系统上并等待攻击者进行连接;
2.当恶意软件出现在系统上时,立即建立与C&C的连接;
就我的测试目的而言,我选择了使用netcat模拟后门示例的选项1,来执行我的取证收集工具并将取证日志记录到时间表中。
Netcat监听器在时间表上的连接以及流程执行证据
我在以前提到过,CreateTimestamp字段是在套接字被绑定后立即填充的,因此在这种情况下时间戳的证据并没有带来很大的价值,其原因是因为在连接的时间点附近创建了其他的证据,例如进程执行证据(Windows事件ID 4688,预取文件,UserAssist等),但是这些证据并不总是有用的。无论如何,所提取的连接时间戳给取证带来了很大的帮助。
方案二:注入代码
接下来,我测试了一个恶意代码注入的场景,其中恶意软件或攻击者将代码注入已运行的进程,然后才启动连接。例如,如果我检查与PID 1856的进程相关的这个可疑连接,就可以看到它已通过TCP端口1234建立了与10.0.2.15的输出连接。
PID 1856属于explorer.exe:
到目前为止,我可以提取的唯一时间戳只能是以下两个中的一个:
1.如果进程还在运行,就可以提取该进程的启动时间;
2.任何包含时间戳的执行证据;
由于缺乏连接时间戳的证据,所以取证的关键一步就是得到与创建或执行explorer.exe相关的时间戳。如果是对explorer.exe创建之前和之后几分钟的信息进行提取,则得到的有价值的信息就非常少,比如只能得到用户登录后的常规引导过程。
在用户(“boss”)登录后执行explorer.exe
在我提取新证据后,再把它添加到用于取证的时间表中,就可以揭示explorer.exe的连接时间戳。以下就是连接时间框架(timeframe )的时间表:
explorer.exe的连接时间戳的TCP连接显示出的其他恶意活动
你可以看到在连接被创建之前,Injector.exe进程已经执行。这可能就是explorer.exe注入恶意代码的时间点。
尽管我改造的这个工具可能有用,但还是有一些注意事项:
1.由于这些信息是使用Windows API检索的,因此rootkit(一种特殊的恶意软件)可以通过挂钩相关函数来隐藏连接;
2.由于网络连接信息不稳定,因此,在你收集信息时,连接可能会被关闭;
3.测试重点针对Windows 10,由于我在Windows 7中提取时间戳时遇到了一些非确定性结果(在某些情况下,连接时间戳为1/1/1601 2:00:00 AM),所以需要通过进一步的研究来分析这种行为;
总结
关于提取时间戳对取证分析的帮助有多大,目前还不确定,否则怎么会有那么多取证工具没有对着部分证据进行提取,详细的分析你可以读Harlan Carvey的博客。
但我觉得提取网络连接的时间戳确实非常有帮助,绝对对得起你的付出。以上测试的情景表明,这些证据可以在调查取证过程中起到关键作用,以帮助调查人员更好地了解他们的分析方向。比如你计划将调查范围扩大时,就可以使用网络连接时间戳,并将其用与网络防火墙或IDS日志中的数据相关联。
目前许多有关事件响应(IR)工具已经在使用Windows API调用来获取所有网络连接,但它们不会提取每个连接的时间戳。只要少将修改,就可以将时间戳证据包含在这些工具的分析结果中。
我的GitHub存储库提供了包含时间戳提取的增强版Get-NetworkConnection,你可以点此参考。