通过推理时区进行攻击溯源
最近博主在研究如何通过行为分析的方式进行溯源,结果发现这方面的知识在网上很少找得到。所以博主决定来分享一下如何通过对PE中的时间、日志、发帖时间等推理攻击者活动时区。因为这方面的资料比较少,所以博主会尽量讲的细一些。
咱们先从PE中的时间戳讲起 ,有些基础的小伙伴可能知道PE中存在着编译时间的字段。但是有经验的黑客一般会混淆掉编译时间的字段,让安全人员无从下手。
不过还好,PE文件中不止存在一个时间戳。应该说,至少有“IMAGE_FILE_HEADER”、“IMAGE_IMPORT_DESCRIPTOR”、“IMAGE_EXPORT_DIRECTORY”、“RESOURCE_DIRECTORY_TABLE”、“IMAGE_DEBUG_DIRECTORY”中的五个时间戳。
虽然在日常研究中,一般很少会遇到某个样本同时存在五个时间戳的情况,不过通过对时间戳的分析会有助于我们开展溯源的工作。
1
PE头 时间戳
首先我们打开010Editor,随便选择一个exe将其拖入010Editor,会弹出提示安装一个模板,我们点击“安装”。
于是我们便可以在下面看到新弹出了一个“模板结果”的窗口
IMAGE_FILE_HEADER
我们先看一下“IMAGE_FILE_HEADER”中的时间戳。我们选择“struct IMAGE_NT_HEADERS NtHeader”->“struct IMAGE_FILE_HEADER FileHeader”->“time_t TimeDateStamp”可以看到这里存在一个时间戳,这个时间戳就是样本的编译时间戳,一般正常的程序是不会修改这个地方的,但是一些木马样本会对这个地方进行混淆,使用一个虚假的时间戳来迷惑研究人员。
IMAGE_IMPORT_DESCRIPTOR
我们在看第二个,“IMAGE_IMPORT_DESCRIPTOR”中的时间戳,首先我们展开“struct IMAGE_IMPORT_DESCRIPTOR ImportDescriptor[0]”->“ULONG TimeDateStamp”,这个字段便是导入表的时间戳,通常一个PE会有多个导入表,所以也会存在多个导入表的时间戳。在本次的样本中,这个地方显示的是0,表示编译时未写入导入表时间戳。
IMAGE_EXPORT_DIRECTORY
第三个时间戳是“IMAGE_EXPORT_DIRECTORY”中的时间戳,也就是导出表时间戳,而一般exe是不存在导出表的,所以这一步建议更换为dll进行测试,本次使用“cmdial32.dll”进行演示。
我们展开“struct IMAGE_EXPORT_DIRECTORY ExportDir”->“time_t TimeDateStamp”字段,这个地方就是导出表时间戳,一般黑客也不会作出修改。
RESOURCE_DIRECTORY_TABLE
第四个时间戳是“RESOURCE_DIRECTORY_TABLE”中的时间戳,我们展开“struct RESOURCE_DIRECTORY_TABLE ResourceDirectoryTable”->“time_t TimeDateStamp”字段,这个就是资源表的时间戳。在本次的演示中,该字段为”01/01/1970 00:00:00″这个时间为无效时间,表示该字段未写入。
IMAGE_DEBUG_DIRECTORY
第五个时间戳是“IMAGE_DEBUG_DIRECTORY”中的时间戳,我们展开“struct IMAGE_DEBUG_DIRECTORY DebugDirectory”->“time_t TimeDateStamp”字段,该字段就是调试表时间。
2
通过时间推理时区
首先我们需要先了解一下全球上班时间,全球上班时间可以在 http://t.90.re/ 查看,我们点击左侧的“全球上班时间对照表”,便可以在右侧看到已经转换为“北京(UTC+08:00)时间”的全球上班、下班时间了。
处理线索数据
接着,我们来处理时间,首先的打开Excel,将我们掌握的时间输入进去,(此处为测试数据)。
我们输入后,点击时间所在列“A”来选中这一列,然后点击“数据”选项卡,选择“分列”功能,在弹出的分列功能中选择“分隔符号”,点击“下一步”。
接着,我们在分隔符号栏选择“其他”,输入分隔符“:”,点击“完成”。
我们再点击时间所在列“A”来选中这一列,按下快捷键“Ctrl+1”打开“设置单元格格式”窗口,选择“文本”,点击确定。
此时,时间便被分成了三列,分别是:时、分、秒。
在不需要特别高精度的情况下,我们默认以小时为基本单位,我们继续操作,我们找一个新列,输入0~23作为小时参考。
然后我们在旁边一列,输入公式“=COUNTIF(A:A,F1)”。
我简单解释下这个公式。
开头的“=”表示这是这个公式,“COUNTIF”函数可以用来在一个范围统计有多少数据符合条件,“A:A”表示的是一个范围,即从“A”列到“A”列,也就是整个“A”列,“F1”则是参考标准。
简单理解,这条命令会在“A”列去寻找有多少条“F1”单元格的数据。
输入完公式后,我们双击公式所在单元格“G2”的右下角
这样公式便被填充到了F列最后一条。
然后,我们在选择时间参考的“F”列和出现次数的“G”列,然后选择“插入”选项卡,选择“插入折线图”,选择“更多折线图(M)”。
然后,我们选择右面的这个折线图,点击确定。
这样我们便得到了一个时区折线图。
从图中可以看出,本次数据中大约是从 UTC+08:00 的21点到次日的6点有活动的行为,说明攻击者会有较大可能在该时区活动。
这里补充一个知识点,特殊情况下,攻击者可能会存在加班的情况,导致时间线较长。但是,攻击者一般不会出现提前上班的情况,所以各位小伙伴在研究时,可以对图表中的开始活动时间多多留意,加大可信权重。
将处理后的数据与“全球上班时间”对比
我们根据现在的数据,可以很明显的发现,北京时间(UTC+08:00)的21点左右是活动高峰期,我们打开 http://t.90.re/,选择“全球上班时间对照表”。
然后找到上班时间在 “21:00” 下班时间在 “06:00” 范围内的几个国家,参照后发现,攻击者时区与 “UTC-05:00” 的工作时间较为匹配,对应北美时区。
原文始发于微信公众号(狼蛛安全实验室):溯源专题 | 通过推理时区进行攻击溯源