首页
社区
课程
招聘
[原创]Windows主机入侵检测与防御内核技术深入解析(1)
2024-4-16 09:03 4583

[原创]Windows主机入侵检测与防御内核技术深入解析(1)

2024-4-16 09:03
4583

本系列文章为看雪星星人为看雪安全爱好者创作的原创免费作品。

欢迎评论、交流、转载,转载请保留看雪星星人署名并勿用于商业盈利。

本人水平有限,错漏在所难免,欢迎批评指正。


 第1章 内网安全与主机防御   

1.1 复杂问题的简单起源

         一切起源于很多年前的一个下午,办公室里的电脑刚经过大规模的折腾。有人的机器感染了病毒,导致了局域网内部的感染,很多机器无法工作,纷纷被格式化重装。

         作为专门开发安全软件的信息安全部竟然被病毒感染,这显然是很打脸的一件事。那时办公室里也安装了杀毒软件,但效果不佳。事后溯源发现是有人收到了小广告邮件,内含带毒的网页链接。网页打开之后浏览器自动安装了病毒。

         这时一个留着小山羊胡子的同事灵光一现,说:“这个病毒不管它是怎么装上的,一定要加载一个可执行文件不是?”

         “这可不一定。”

         另一个胖同事反驳。

         “网页可以利用你的浏览器漏洞用缓冲溢出之类的方法注入代码执行。这样就不需要生成一个可执行文件了。”

         “执行?那执行完了呢?下次它怎么启动自己呢?”

         “下次它当然是感染了其他的可执行文件来启动自己啦。”

         “那最终不还是得加载一个被感染的可执行文件?”

         “这……”

         恶意代码并非一定要表现为一个新生成或者被修改的可执行文件。只是那时的安全世界还远没有现在这么复杂。见对方无言以对,山羊胡子一拍手,神采飞扬地说:

         “我把每个需要用的可执行文件算一个哈希值存起来当白名单。后面系统加载任何可执行模块的时候我都计算一次哈希值和白名单比较。如果不在白名单中的就一律阻止!这不就可以防住所有病毒了?”

       “你这个,别人很容易破坏你的吧?”

         胖同事显然不相信困扰人类已久的安全问题竟然有如此简单的解决方案。

         “比如摘掉你的监控,或破坏你的判断的逻辑。”

         “它要破坏我?我做在Windows内核里。它要破坏我那也得先加载一个内核模块是不?”

         山羊胡同事的眼里闪着狡黠的光,把这个问题变成了一个先有鸡还是先有蛋的问题。他设想中的系统阻止了一切可疑的可执行文件的加载,那么病毒自然也就没有任何机会去加载一个内核模块。

         这个逻辑并不严谨。因为Windows内核以及他开发的驱动也未必没有漏洞。如果病毒能利用这些漏洞来破坏内核的防护是有可能做到的。但这显然使得入侵难度骤然升级。

         “但你怎么知道哪些可执行文件是我们要用的呢?”

         “这不简单吗?办公机上已经安装的这些就是要用的。别的就是不许用的,我扫描一遍就知道了。”

         “这个……好像也可以做做看。”

         胖同事似乎被他说服了。

         山羊胡子说干就干。他先做了一个简单的扫描工具。这个工具会扫描测试用的虚拟机上所有的可执行文件,对每个文件都计算md5并存入一个白名单列表中。他假定这时候测试机是干净的。

         然后他写了一个Windows驱动来监控所有模块的加载。当每个模块他都会找到对应的文件并计算整个文件的md5去和白名单比较。当白名单比较失败的时候,系统会弹出他设计的一个对话框,提示该模块被阻止加载。

         然后他在虚拟机中点开了那个导致几乎整个办公室感染的带毒网站。果然,叮地一声,一个携带着ActiveX控件的DLL被拒绝加载的对话框弹了出来!网页正常加载,测试机并未感染病毒。   

         后来他就一直自己安装着那东西,在办公室里很开心地去网上冲浪了。

 

1.2 内网与主机防御

         1节的起源故事涉及到了办公室网络、网络攻击和在主机上进行的攻击防御。这正是本书所需要讨论、设计和实现的东西。在这我将首先要明确何为内网,以及何为“主机防御”系统。至于网络攻击,我将放在第3节。

         本书所谓的“内网”是相对于“外网”而言。一般地说,如果我们构建服务器对外提供服务,那么面向的是外网,需要关注的是外网或者说服务器的安全。另一方面,公司内部所构建的用于办公、开发的环境,则是所谓“内网”,我们需要关注的是内网的安全。

         因此本书的“内网”一词正如第1节的故事中提到的,特指某种机构或组织(比如公司)内部用于内部日常活动(比如办公和开发)的网络环境。这些环境有如下几个显著的特点:

         1)很多情况下,内网在物理上是一个局域网。但很多分布在不同地理位置、由广域网连接的不同的分支机构,可能使用技术手段(比如VPN[1]),相互连成一个逻辑上的局域网。但总体而言,内网和外网之间有一定程度的隔离,有相对较强的防护措施。正常情况下从外网黑客不能直接访问到内网的机器。

         2)大多数情况下,内网和外网又不是完全隔离的。出于各种原因,内网需要能够访问外网获得资料,或是进行邮件通信、实时通信等。少数情况下内网会有完全物理隔离的要求。本书会把物理隔离也视为安全防范措施的一种来进行讨论。

         3)内网内部的机器之间往往能够直接访问。机器与机器之间的防护相对薄弱。因此我们会看到很多黑客控制内网中一台机器后,迅速“横向移动”导致整个内网沦陷的例子。

         4)大多数情况下,这些机器用于办公或者软件开发,会安装Windows系统,但不排除部分公司企业或者其他单位有特殊原因而采用其他的操作系统。本书的代码以Windows为主,同时会简要讨论其他如Linux等系统上的主机防御的可能实现办法。

         本书讨论的“主机防御”实际上是“基于主机的入侵检测与防御系统”的简称。各种资料中常见的缩写名词HIDS表示的是“基于主机的入侵检测”而HIPS则是“基于主机的入侵防御”。但检测与防御本身密不可分,因此我将统一简称为“主机防御”。

         主机防御的本质特点是它是安装在内网用户主机,也就是内网办公所用的每台电脑上的。它依据的是主机的状态和活动。因此我们可以看到第1节中山羊胡子同事所开发的系统,是跑在他自己的机器,也就是用户主机上的。

         与主机防御相对的是基于网络的入侵检测与防御系统,简称分别为NIDS(检测)与NIPS(防御)。NIDS/NIPS一般是安装在硬件防火墙、堡垒主机等专用设备上,通过过滤网络数据来起到检测和防御的作用。

         在其他的资料中,我们还会看到一个很容易和“主机防御”混淆的词语“主动防御”。

         “主动防御”在大多数情况下,是指基于安全系统的一种特性,或代指拥有这种特性的安全系统。它是相对“被动扫描”而言的。被动扫描是杀软最早期的形式,通过特征码扫描恶意代码。主动防御则会根据未知病毒可能的攻击方式才采取主动的措施去进行抵御。

         现代主机防御系统基本都具备了“主动防御”的特性。本书中大部分代码实现的功能都属于“主动防御”的范畴。

 

1.3 针对内网的攻击

         想象一下在1.1节的故事中,如果对方针对该公司内网的攻击并不是简单地发小广告,而是窃取某个项目的源码,那么常见的模式会是这样几步。

         1)网络侦察。黑客在网络上收集与该项目有关的开发人员的信息。举例而言,至少获得一个该项目开发人员的办公邮箱地址。

         2)初始访问。黑客和目标用户的第一次接触。在本书开头这个例子中的操作是黑客给目标发出一封精心构造的邮件。

         3)执行。目标点击了邮件中的链接,导致了恶意代码的执行。当然真正的执行方式多种多样,并不限于钓鱼邮件的方式。

         4)提权。获取系统根[2]权限。通常国内大部分Windows用户直接使用管理员权限登录,因此这一步甚至可以直接免除。少数管理严格的场景下,被执行的恶意代码只有普通用户的权限,需要提权才能实现后面的步骤。

         5)持久驻留。恶意代码执行之后,如果关机重启就没有了显然不是攻击者想要的。有很多方法让恶意代码留在系统中每次都随系统启动。一般而言,现实现提权再实现持久驻留会更方便,因此排在提权之后。

         6)潜藏。在实现了持久驻留之后,如果很容易被杀软或者防御软件发现那也是没有意义的。因此必须实现潜藏。通常而言,提权对潜藏有极大的帮助。因此潜藏排在提权和持久驻留之后。

         7)命令与控制。这是在被感染的机器上实现一个与攻击者通信的机制,使得攻击者随时可以对被感染机器发出命令来实现控制。这是为实现后面更多步骤的准备。

         8)内网侦察。内网侦察和网络侦察不同。网络侦察是在外部公开的网络上搜集信息。内网侦察则是已实现命令与控制的情况下,控制内网某台被感染的机器对整个内网展开的侦察,目的是为了了解内网的安全设施、网络拓补、有价值的目标的存储情况。这也是为下面步骤做的热身运动。

         9)横向移动。当内网已经被侦察清楚,攻击者就会开始横向移动,即把恶意代码从一台机器感染到另一台机器。要么尽可能地控制更多机器,要么精准控制需要窃取的信息所在的机器。

         10)渗出。渗出即是黑客窃取目标项目代码的过程。他已经可以用命令来控制存储项目代码的机器,那么他当然需要将这些代码发出内网。这个过程即是渗出。

         11)影响。和渗出稍有不同,影响的目标并非是窃取信息,而是对目标进行修改导致目标发生黑客所期望的异常。

         比如有的影响是简单地让系统尽可能被破坏,阻滞该项目的进程;也有的影响仅仅是修改某个特定的数据,使得某方得到收益而造成另一方的损失。常见的勒索病毒也是影响的方式之一。

         以上模式参考了MITRE ATT&CK模型[3]ATT&CK矩阵,我做了少量删改。网络攻击行为并不需要全部具备以上所有的步骤,但至少具备其中之一。具有其中(5)(6)(7)的威胁就是常见的APT(高级可持续威胁)。

 

1.4 纵深防御的思想

         现代的安全观念是针对所有的威胁步骤进行纵深防御。也就是节节防守。这是因为和软件不可能消灭所有漏洞一样,安全系统也是不可能没有漏洞。指望某一个技术在某个一个节点上掐灭所有威胁那是不可能的。

         我们只能尽可能地在每个节点上进行防御,并指望即便某个节点被突破了,其他的节点还能防御住攻击。或者即便攻击没有被防住,但是我们至少能在某些节点及时发现攻击的迹象而及时采取所示防止损失扩大化。

         本书也秉持这样的思想。我们在攻击威胁的每一步尽可能地进行防御和检测。因此考虑到1.3节中的种种攻击手段,我们应该进行如下的步步防御:

         1)针对侦察,我们必须尽量隐匿内部的信息,确保只有必要的信息才公开在网络上。

         2)针对初始访问,我们必须考虑各种可能访问的入口。如来自外网的邮件、内部人员访问的外部网络、下载的外网内容、通过实时通信软件收到的外部文档或其他请求(如远程控制)等。

         3)针对执行,我们必须尽量去验证每一次程序执行的合法性。

         4)针对提权,我们应确保补上了所有已知的提权漏洞,并监控各种可疑的提权行为。

         5)针对持久驻留,我们应对系统中的“自启动”项目、可能获得执行的各种途径做全面的扫描和监控。

         6)针对潜藏,我们需要扫描内核中所有可能导致隐藏、隐匿的钩子、过滤层等,可能得设法发现潜藏的rootkit,或者至少发现异常迹象。

         7)针对命令与控制,我们需要在网络上过滤可疑的流量,还需要监控机器可能的异常行为(如非工作时间的异常操作等)。

         8)针对内网侦察和横向移动,我们必须加强内网每台机器之间的防护,加强每台机器的自身信息(如操作系统的版本)的隐藏与保护,并及时把存在异常迹象的被感染机器隔离出内网。

         9)针对渗出,除了如7中监控可疑流量之外,我们要对内部重要资料进行特别的保护,必要时候需要使用DLP(数据防泄密)手段。当然DLP本来不是用来对付内网渗透攻击的,要起作用需要专门结合主机防御的设计。

         10)针对破坏性的影响,我们除了对关键设施要进行专门防护之外,还需要准备应急响应措施。考虑一下所有内网机器全部染毒报废的情况下,如何能快速清理并恢复?

         要注意的是上述措施有些并不适合在主机上实现,也就并不包括在主机防御的范围之中。比如1主要依靠的是规则、审核,而网络流量适合用NIDS来进行监控。

         本书涉及的内容主要有关于上述(3)(7)的执行防御、关于(2)的网络防护,关于(5)(6)的全面扫描,关于(8)的内网反侦察,关于(9)的特殊设计的DLP,关于(9)的磁盘还原技术。

1.5 防御的优先顺序

         当然,在成本有限的情况下,我们应该从最具有性价比的节点开始入手。

       如果遍历1.3节中的攻击手段中从(1-11)一共11个节点,你会发现在每个节点上投入和收益的性价比是不同的。比如“(10)渗出和“(11)影响”,这两个攻击步骤大概率是发生在计算机被完全控制的基础之上。

         在计算机根权限完全被控制的情况下再去阻止或者检测某件事,不用我说你也会明白这究竟有多难!在rootkit[4]的控制下,我们的监控到的系统事件、读取到的文件、甚至调用系统调用返回的结果,统统可能是假的。

         难不等于我们不能去做。但是我们要从最具性价比的事开始做起。仔细观察上述节点,你会发现防御和检测的难度有一个陡然升高的过程。原本关键点在上述的“(4)提权”。在这一步之后,恶意代码已经具有根权限。

         一般而言安全系统具有系统根权限。不考虑被攻击用户主观恶意的情况下,恶意代码在提权之前的权限低于安全系统的权限。而这一步之后,恶意代码和安全系统的权限已经几乎等同,进入了“公平决斗”的阶段。

         上面之所以使用“几乎”,只是因为启动的先后顺序会微妙地影响双方的实力。此时安全系统比恶意代码先启动,依然具有微小的优势,但在“5、持久驻留”之后,恶意代码有可能比安全系统更先启动,优势彻底丧失。

         国内的情况又不止如此。因为使用普通用户的权限使用Windows非常不方便(很多操作无法进行),所以大部分人会直接使用管理员权限登录。此时如果这些用户执行不明程序,那么这些程序就直接获得根权限。这一步很难阻止,也并不关键。关键点提前了!

         考虑“(3)执行”这一步。在这一步之前,黑客有可能获取系统最高权限吗?如果把受攻击的用户主动泄漏管理员密码此类情况排除在外的话,答案是不可能的。恶意代码必须首先要执行,然后才有后面的可能。

         那么更早的节点呢?无论是“(1)网络侦察”还是“(2)初始访问”,都是很难完全我们依赖技术手段阻止的。因为我们不可能写代码禁止黑客使用搜索引擎,也很难写代码完全禁止同事看邮件或浏览网页。这些可以做一些事,但是更多地必须结合管理。

         因此1.1节中的山羊胡子其实注意到了一个很重要的细节:那就是“(3)执行”是一个非常关键的节点。这个节点上我们可以用技术的手段,去监控所有在操作系统上执行起来的“东西”,在这个节点上进行开发的“性价比”相当高。

         在执行之后,网络防护是另一种性价比稍高的手段。虽然我们无法“防止”用户访问外网,但我们可疑对用户对外网进行的系列访问做一番过滤。比如只允许用户访问某些白名单网站,就比允许用户访问任何网站要安全了很多。

       在此之后,如果主机已经被病毒感染,我们将处于非常不利的局势,但此时也绝不能彻底躺平。尽可能地进行扫描,发现潜藏的病毒和其他恶意代码总是有好处的。虽然系统不一定能干净地清除病毒,但至少可以及时将被感染的机器隔离出网络。

         如果连机器被感染了我们都无从得知,那么至少没有被感染的机器自身要具备一定的反内网侦察、防止被发现漏洞迅速感染的能力。

         最坏的情况下,内网机器完全被不明人士所控制,我们能做的也就是保护最重要的机密资料不会外泄,系统不会被彻底摧毁了。

         如果系统已经被彻底摧毁,那么我们最后压箱底的手段自然是应急响应,尽快摆脱困境并恢复正常的工作。

         以上也是将本书讲述的顺序。本书将分为模块执行防御篇、执行流防御篇、脚本防御篇、内网限制篇、渗出防御篇。

         我们将从最为关键的节点开始,层层设防,节节抵抗,用技术手段打造我们的基于主机的防御体系。



[1] Virtual Private Network,虚拟专用网络。

[2] 本书中根权限是指操作系统中的最高权限。

[3] MITRE ATT&CK是一个针对网络攻击行为的知识库和模型,详见MITRE官方文档。

[4] 本书中rootkit指具有系统根权限的恶意代码。




[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

最后于 2024-5-7 07:20 被星星人编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (9)
雪    币: 1076
活跃值: (1373)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
星星人 2024-4-16 09:06
2
0

本想后续章节放在回复里,放弃了,编辑太困难。后续一章一章单独发了。

最后于 2024-4-16 09:37 被星星人编辑 ,原因:
雪    币: 310
活跃值: (1917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 2024-4-16 09:53
3
0
码字很辛苦
雪    币: 126
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
A1v1n 2024-4-16 15:13
4
0
谢谢博主,很有收获,期待后续内容
雪    币: 405
活跃值: (1950)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wowocock 1 2024-4-16 18:18
5
0

酒爷?记得当时一起写的,名字叫VIRUSCRY,图标用的是地狱三头犬,Cerberus。现在恍如隔世了。

最后于 2024-4-23 15:05 被wowocock编辑 ,原因:
雪    币: 1789
活跃值: (4445)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Oxygen1a1 2024-4-17 09:19
6
0

被开头故事吸引了,老师文学功底强大

最后于 2024-4-17 09:27 被Oxygen1a1编辑 ,原因:
雪    币: 1076
活跃值: (1373)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
星星人 2024-4-26 09:06
7
0
wowocock 酒爷?记得当时一起写的,名字叫VIRUSCRY,图标用的是地狱三头犬,Cerberus。现在恍如隔世了。

呵呵,十多年后,你依然初心未改

最后于 2024-4-26 09:20 被星星人编辑 ,原因:
雪    币: 30
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xyhunivers 2024-4-29 14:59
8
0
很好,很多工业机器就是这样做的,可以分享原代码嘛?楼主!!!!
雪    币: 17
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
lixii chen 2024-5-6 09:43
9
0
请问是哪本书呢
雪    币: 1076
活跃值: (1373)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
星星人 2024-5-7 07:13
10
0
xyhunivers 很好,很多工业机器就是这样做的,可以分享原代码嘛?楼主!!!!
每章文中会提供所有关键代码,最后章节后会附加完整的工程压缩包下载。
游客
登录 | 注册 方可回帖
返回