夜间模式暗黑模式
字体
阴影
滤镜
圆角
thumbnail
APT攻击溯源工作总结2021.6
[github author="Endcat" project="apt-provenance-research" size="mini"][/github] 要进行apt攻击的溯源,我们得从数据入手。apt攻击明面上最直观能拿到的数据就是日志数据,所以如何对日志数据进行处理就是前期最重要的工作。对于日志数据,凭经验来说它们其实就是一种格式化字符串,由格式化模板与参数构成。我们在写程序的时候通常也会这么去写: print("template demo {} and {}", param1, param2) 从这点出发,我对日志进行拆解。也就是说,日志它是由模板与参数构成的数据集合。 这是一个定义,研究过程中十分重要的一点就是要明确定义,否则接下来的工作不会稳固前行。理解为公理化系统就行,所有的构建都先要有一个基础的规定,这是研究过程中比较重要的一件事情。 现在对日志的定义完成,接下来需要思考apt溯源的过程中,我是处于一个怎样的工作流程。首先为了将想法转为实际应用,应当有诸如溯源图这样的呈现方式。在溯源图中我应该清楚的了解到哪一段时间我遭受了外网的攻击,被攻击的设备是哪个,攻击者做出了什么操作等等。那么所有这些,其实都源自已经得到的日志数据,可能在所有的日志数据中,有那么几条代表了攻击者可能对目标靶机进行了提权操作,有那么几条可能代表了攻击者在进行口令爆破……从这里我们知道,仅仅靠现有日志数据是无法来描述溯源过程中的种种联系与事件的,我们需要针对日志数据进行更高维度的抽象: 到目前这个阶段,我采用的是2014年有关日志在时间空间维度上的张量分解论文上采用的方案。这篇文章较为合理的整合了日志数据特征,本篇也着重讲一下文章的思路。 首先直观的理解这个公式,主要目的就是把一个大大的高阶张量分解成小小的低阶张量。这样做有什么好处,拿一张图来直观地感受一下: 右边的人脸就是原始数据,通过张量分解我们可以得到类似左边张量的乘积形式。这样做是有好处的,因为能够提取出特征矩阵和权重矩阵。随便拿一个等式来看,能得到原图的结果都是两个相乘的张量中每一个元素相乘累加得到的结果,但是对于左边的张量来说它可能表示了原图可能存在的特征,对于NMF来说可能就是五官特征,对于VQ就是一一对应的图片,而对于PCA来说可能就是更加抽象的特征。另外一点的好处就是以后我形容一张图,我可以直接使用权重矩阵来表示,甚至是计算。注意能够计算这个特性是十分重要的,毕竟对于计算机来说图片相较于特征矩阵来说,还是后者更加容易理解一点。 根据上面的理解,我们也可以通过某种分解方法把全体日志数据当做“图片”来看。分解最重要的一个准则是要确定特征,所以我们要确定日志它有怎样的特征。上面提到过,日志最明显的特征就是格式化字符串及其参数。但是在论文中作者提出了一个非常重要的一个想法,我觉得也是非常“简洁且优雅”的,先提提我的想法: 在之前我构建的溯源系统中,我是抓住了图这个要素来构建系统的大体逻辑。首先是提取日志信息,将其转化为图上节点,然后寻找节点之间的关系,最后根据训练数据评估节点的好坏程度并绘制溯源图。别看像模像样,其实狗屁不通。这里着重讲一下在处理日志转变为节点,也就是从日志中抽象出网络事件的流程中,我是怎么干的,张量分解的作者又是怎么想的。对于我来说我遵循日志在产生的过程中,就是按照print函数输入的参数执行的。而输入的参数上面也讲到就是格式化字符串及其占位参数。所以在日志的提取过程中,我需要将每条日志诸如时间/ip/路径等等之类的信息提取出来,并随后进行日志的聚类操作,将聚类后的结果看成是一个个事件,并从中找出他们之间的联系然后构成图。 其实这里是很有问题的,虽然日志的特征是日志格式和参数,但是简单的把他们杂糅在一起聚类在一起就是代表了网络事件吗。不过有件事情也是挺奇怪的,感觉自己一直在研究,虽然自己收获的很多,但是老师却是无形之中往自己研究的成果方向让去导,不知道要我干什么,估计是让我独自一个人研究完整体一个框架就让我打工写代码了。当然自己的想法确实不能和论文的方法相比,唉。 日志张量分解中对两个概念进行了定义,一个是日志模板组,另外一个是网络事件。网络事件是基于日志模板组定义的,当然也有其他辅助的定义,从我的观点来看这两个定义显得尤为重要。什么是日志模板组呢,日志模板可以理解就是格式化字符串去掉参数部分的那串字符,这个可以通过正则匹配提取,另一方面也可以通过论文中作者用到的统计方法通过统计模板单词的方法提取模板。各有好坏,前者更加精确,后者更加通用。日志模板组就是两个或者多个模板它们有共同出现的趋势,这样的模板们把它们归纳成一个日志模板组。也就是说模板组里的模板是很可能出现同时发生的。根据对模板组的定义,网络事件的定义就是不同的主机ip下不同的日志模板组在一个时间窗口下出现的情况,把这种事实定义为一件网络事件。 拿图来看一下,V矩阵是模板组矩阵,其中每一纵列代表一个模板组,在每一个模板组里面记录了每一个模板他们的出现情况,比如说示例图中的模板A和模板C,他们就有共同出现的趋势或者可能。同样的Z矩阵是网络事件矩阵,每一个纵切片代表了一个网络事件,每一个网络事件里面记录了在不同的主机上出现不同模板组的情况,比如示例图中主机A出现模板组1,主机B出现模板组1,主机C出现模板组3。我们说这样的日志模板组的出现情况,就是一件网络事件。 但是有一点要注意,就是说这里我们定义了网络事件,但是本质上我们是不知道这是哪一个网络事件,事实上也无法知道。我一开始想到训练,但是后来发现这个世界上哪来的APT日志数据供我们训练的?本来的目的就是要针对新型的APT攻击去进行防御和检测溯源。所以其实就可以在一开始规避掉是否要训练的问题。 在定义完关键概念以后,接下去就是经典的张量分解问题。这个可以参考非负矩阵分解问题,论文中仅是将其做了一点拓展。而后其实在找到表示网络事件的定义后,如何将网络事件关联起来,找到他们之间的联系也是一件较为困难的事情(对我来说)。这部分还在研究,有空继续整理。
21.6.13

指不定哪天就想着绝望,想着惘然,向着死亡。

613 日 , 2021 1:50:39
21.2.8

是一个狂风的不眠夜。思维在不停的跳跃,却无法突破出某种奇怪的结界。仿佛在脑子里存…

208 日 , 2021 3:39:06
thumbnail
x64 Linux Buffer Overflow
有点忘了,整理一下64位下的缓冲区溢出。首先写一段简单的漏洞程序: #include <stdio.h> #include <unistd.h> int vuln() { char buf[80]; int r; r = read(0, buf, 400); printf("\nRead %d bytes. buf is %s\n", r, buf);…
20.12.3

渐渐地能够理解自杀者的渴求之物,以及为什么自杀的理由。

对于痛苦来说,我觉得现阶段…

1203 日 , 2020 0:25:04
20.11.20

作者首先手把手教你如何dump一个ios应用,然后告诉你其实我已经写了一个全自动…

1120 日 , 2020 16:58:38
thumbnail
论文笔记:HinCTI+方法整理
[github author="Endcat" project="apt-provenance-research"][/github] 将之前看过的一些资料中提到的方法进行整理和回顾,同时看一下这周要读的论文中的大体模型思想。 一般来说要构建溯源系统的第一步,就是要找到或者去定义如何去描述一条日志的内容和属性。最简单的,我们可以用正则匹配的方法来找到一条日志里面的状态码、时间日期、url路径等等基本信息。但是对于一般的生产环境来说,一套匹配规则只能适用于单单一种的日志格式。所以在日志的属性数据提取的过程中。往往去倾向这样的一种方法——如何拿到一条未知的字符串,提取分析出其含义和各个部分。 比如可以使用最长公共子序列算法来匹配每条日志中的相似成分,我们无需去知道相似成分的意义,因为在随后的模型训练中,都是把数据以特征向量的形式去看待的。 LCS递归方法 将日志按照一条条的特征向量聚集起来其实就是一张表,或者说矩阵比较合适。研究使用矩阵来表达的时候,发现可以使用向量分解的方法来猜测矩阵中的那些缺失的元素。这是相当关键的,更多更完整的数据对于构建模型有较大的帮助,也能发现那些日志中忽略的“潜在关系”。 矩阵分解预测缺值 到目前为止对日志的分析可以说其实停留在“欧氏空间”,因为攻击溯源的背景是在网络中分布的许许多多的节点。而节点之间的关系其实应当使用图论的知识来解决,这样更为妥当。每一条日志代表了一个日志节点,节点有它的类型区分,比如可以分为文件修改、网络请求、注册表修改等其他涵盖网络和系统的操作。这些在模型构建的过程中需要考虑要设置多少多种的节点类型,因为这些会影响到模型在分类时的效率性能。 不仅节点有它自己的属性,节点与节点之间也有不同种类的关系。比如对一个应用软件来说,它进行了一次对特定url的网络请求,那么表示软件的节点和表示url的节点之间就有访问和被访问的关系。对于文件来说也有被创建和创建者的关系、被删除或删除者的关系。这些种类的设定也与节点本身的类型相似,都是会影响到模型性能的要素。 在研究节点类型和节点间关系的过程中,社区发现算法有助于将关联度较大的节点归为一个社区。而度量一个社区内节点与节点之间的关联程度,使用到的是一个叫做模块度Q的数值。(模块度的定义可以参考百度) 通常以这样的方式来使用上面的公式:首先准备一个空的容器,不断尝试加入新的节点,如果某个加入进来的节点影响模块的程度大(最大),则将它加入进来。不断重复,直到剩下所有的节点加入都不能显著改变模块度,则就找到了一个社区,社区里的所有成员就是容器中装着的节点们。 这是社区发现最为基础的思想,它的改进版Louvain算法其实是在其基础上增加了迭代深度。这就相当于一层层的容器分类,将每次得到的社区们都看成是新的节点,然后循环往复的进行以模块度为衡量的社区发现。这么做的目的对于攻击溯源来说是有好处的,随着每一次的深入迭代,攻击事件从最初的一条条的日志逐渐抽象成为一次具体的网络访问,一次具体的扫描器运行甚至是一次具象的攻击操作。当然对于现在来说还不能确定我把这么多的节点聚集在一起,这么多的子社区聚集在一起就指认说它就是攻击节点或者有害节点。对于标签分类,是需要数据和模型训练的进一步工作。 至此,其实一个比较具象的攻击溯源系统已经展现在我们面前了。我们首先要进行对原数据的处理,对于攻击溯源来说就是日志。对于每一条日志来说,我们首先要提取出其各个特征,并且以向量的形式来将其保存成为一个多维矩阵。这个矩阵可以是基于欧式空间的,也可以是基于网络图的。就目前的研究重点来说,网络图是未来。因此不但要提取出日志的特征,还应当提取日志作为一个节点与其他日志之间的关联,这些步骤称之为数据解析和数据关联。当然,攻击溯源的最终目的是想要将这些日志归类为不同的事件,并且判别其是否具有危害性。 HERCULE其实展现了一个较为完整的攻击溯源系统的架构图,在阶段一时将原始网络日志和系统日志输入到Log Parser,由parser将日志转化为可计算的结构化的日志。在这些日志中,一部分通过tainting module打上标签用来给后面训练用,另一部分传输到第二阶段的日志关联器。实际上每个阶段使用的方法,都是仁者见仁智者见智的决策。 对于HERCULE的阶段二来说,在日志关联方面形成了一个log correlation module/connection generation/correlated log entries的闭环,不断循环迭代。这一方面也和Louvain算法上有异曲同工之妙。在阶段二中也进行了权重分配任务,这一操作也是为了优化模型训练过程中的决策函数判断,这些就都是细节部分了。 在阶段三中通过社区发现和阶段一打上标签的数据进行匹配,判定那些社区代表了哪些攻击事件,从而进行溯源的后续工作。另外根据看过的论文加上我的个人经验倾向来说,我喜欢把整个攻击溯源系统抽象为下面通用的一个架构。一方面可以在接下来看相似的论文中可以很快理清思路,另一方面或许在自己撰写溯源系统中又一个标准。…
Murmur

做一些让自己觉得没有兴趣没有希望的事情,我觉得如犯罪一般。虽然这种情况常常发生,…

1029 日 , 2020 13:17:00
thumbnail
论文笔记:Stanford Network Analysis Project
前言 这篇笔记主要探索和总结斯坦福大学在网络分析上的抽象模型、数据抽象和数据可视化相关的内容。主要参考文章为SNAP: A General-Purpose Network Analysis and Graph-Mining Library。 [github author="snap-stanford" project="snap"][/github] [github author="Endcat" project="apt-provenance-research"][/github] 分析 这个框架是我在进行APT溯源研究中一直遇到的模型架构,其实自己臆想构建的框架也无非是提取特征->抽象行为->抽象事件。SNAP注重点在于元素在事物的网络形态分布上的特征和相互关联。首先将大量的数据作为原始的数据源,辨别数据的具体类型(对应Scalar classes)。在某种程度上,将有关联的数据组成向量或哈希表的形式。这里其实论文扯了很大一部分篇幅在讲链表和哈希表这些数据结构的优缺点,无非前者就是更好的迭代,后者是更好的随机访问,然后在SNAP中将两个数据结构结合成为了更高维的网络数据模型。(对饮Composite classes) Containers是很有意思的一层。首先将网络事件抽象成图和网络的结构模型是当然的,在SNAP的网络图中,网络图是基于原始数据生成的向量组和哈希表构建而成。在数据结构上,这意味着向量组和哈希表之间也需要进行“连接”,换句话说是程序上在向量组或者哈希表上加一个指针,去指向相关联的composited data。(对应Containers) 再向上的方法层就是一般的抽象再抽象的思维了,在这里指的应该是对生成的网络图进行分析,进行抽象出行为和事件的过程。(对应Methods) 可视化 利用SNAP数据集官网,下载了facebook的ego network数据进行绘图,使用的库是matplotlib。…
thumbnail
Little Bite of iOS JailBreak
Rewind 很早以前,经常为了让自己的iPhone 6换上好看的主题,就一直等着网上越狱工具的发布。远古版本的iOS主题真的是一言难尽,随着写实风格到扁平化UI,到现在的设计风格让我觉得iOS作为用户使用来说,没啥越狱的必要了。 当我再次拿起尘封多年的iPhone 6的时候,儿时的越狱情节历历在目。所以决定再次玩玩Jailbreak。而这次,我想走得更深入一点。 Prerequisites 搭载旧版本iOS的设备一部,我使用的是iPhone 6(iOS12.3.1)PC/Mac一台 可能有人会觉得iOS逆向非Mac不可,但是仅仅是尝个鲜而已,Win未尝不可。长远来看要是深耕于此的话,在Mac的加持下会非常方便(需要某些macOS系统下的软件)。当然我觉得其实探索iOS逆向,最重要的一件事是要买得起设备。 Jailbreak 分析iOS的各种软件,越狱是第一关。越狱这个词其实就是拿到root权限的意思,并无其他深意。在以前最耳熟能详的是Pangu Team的国产越狱工具,现在去官网看看,越狱工具貌似就停留在了iPhone 6左右的那个时代。但是团队的博客仍然一直更新。这些是杂谈。现在常用的越狱工具是unc0ver,在官网下就有各个平台帮助iOS设备越狱的工具。我这里采用的是macOS下安装AltStore的越狱方式,详细记录一下过程和一些坑: 在第12步中的“Tap the "Open in AltStore" button located above.”,让我有点不太理解。想了一会才发现这句话意思是“Tap the "Open in AltStore" button…