本系列文章为看雪星星人为看雪安全爱好者创作的原创免费作品。
欢迎评论、交流、转载,转载请保留看雪星星人署名并勿用于商业盈利。
本人水平有限,错漏在所难免,欢迎批评指正。
一切起源于很多年前的一个下午,办公室里的电脑刚经过大规模的折腾。有人的机器感染了病毒,导致了局域网内部的感染,很多机器无法工作,纷纷被格式化重装。
作为专门开发安全软件的信息安全部竟然被病毒感染,这显然是很打脸的一件事。那时办公室里也安装了杀毒软件,但效果不佳。事后溯源发现是有人收到了小广告邮件,内含带毒的网页链接。网页打开之后浏览器自动安装了病毒。
这时一个留着小山羊胡子的同事灵光一现,说:“这个病毒不管它是怎么装上的,一定要加载一个可执行文件不是?”
“这可不一定。”
另一个胖同事反驳。
“网页可以利用你的浏览器漏洞用缓冲溢出之类的方法注入代码执行。这样就不需要生成一个可执行文件了。”
“执行?那执行完了呢?下次它怎么启动自己呢?”
“下次它当然是感染了其他的可执行文件来启动自己啦。”
“那最终不还是得加载一个被感染的可执行文件?”
“这……”
恶意代码并非一定要表现为一个新生成或者被修改的可执行文件。只是那时的安全世界还远没有现在这么复杂。见对方无言以对,山羊胡子一拍手,神采飞扬地说:
“我把每个需要用的可执行文件算一个哈希值存起来当白名单。后面系统加载任何可执行模块的时候我都计算一次哈希值和白名单比较。如果不在白名单中的就一律阻止!这不就可以防住所有病毒了?”
“你这个,别人很容易破坏你的吧?”
胖同事显然不相信困扰人类已久的安全问题竟然有如此简单的解决方案。
“比如摘掉你的监控,或破坏你的判断的逻辑。”
“它要破坏我?我做在Windows内核里。它要破坏我那也得先加载一个内核模块是不?”
山羊胡同事的眼里闪着狡黠的光,把这个问题变成了一个先有鸡还是先有蛋的问题。他设想中的系统阻止了一切可疑的可执行文件的加载,那么病毒自然也就没有任何机会去加载一个内核模块。
这个逻辑并不严谨。因为Windows内核以及他开发的驱动也未必没有漏洞。如果病毒能利用这些漏洞来破坏内核的防护是有可能做到的。但这显然使得入侵难度骤然升级。
“但你怎么知道哪些可执行文件是我们要用的呢?”
“这不简单吗?办公机上已经安装的这些就是要用的。别的就是不许用的,我扫描一遍就知道了。”
“这个……好像也可以做做看。”
胖同事似乎被他说服了。
山羊胡子说干就干。他先做了一个简单的扫描工具。这个工具会扫描测试用的虚拟机上所有的可执行文件,对每个文件都计算md5并存入一个白名单列表中。他假定这时候测试机是干净的。
然后他写了一个Windows驱动来监控所有模块的加载。当每个模块他都会找到对应的文件并计算整个文件的md5去和白名单比较。当白名单比较失败的时候,系统会弹出他设计的一个对话框,提示该模块被阻止加载。
然后他在虚拟机中点开了那个导致几乎整个办公室感染的带毒网站。果然,叮地一声,一个携带着ActiveX控件的DLL被拒绝加载的对话框弹了出来!网页正常加载,测试机并未感染病毒。
后来他就一直自己安装着那东西,在办公室里很开心地去网上冲浪了。
第1节的起源故事涉及到了办公室网络、网络攻击和在主机上进行的攻击防御。这正是本书所需要讨论、设计和实现的东西。在这我将首先要明确何为内网,以及何为“主机防御”系统。至于网络攻击,我将放在第3节。
本书所谓的“内网”是相对于“外网”而言。一般地说,如果我们构建服务器对外提供服务,那么面向的是外网,需要关注的是外网或者说服务器的安全。另一方面,公司内部所构建的用于办公、开发的环境,则是所谓“内网”,我们需要关注的是内网的安全。
因此本书的“内网”一词正如第1节的故事中提到的,特指某种机构或组织(比如公司)内部用于内部日常活动(比如办公和开发)的网络环境。这些环境有如下几个显著的特点:
(1)很多情况下,内网在物理上是一个局域网。但很多分布在不同地理位置、由广域网连接的不同的分支机构,可能使用技术手段(比如VPN[1]),相互连成一个逻辑上的局域网。但总体而言,内网和外网之间有一定程度的隔离,有相对较强的防护措施。正常情况下从外网黑客不能直接访问到内网的机器。
(2)大多数情况下,内网和外网又不是完全隔离的。出于各种原因,内网需要能够访问外网获得资料,或是进行邮件通信、实时通信等。少数情况下内网会有完全物理隔离的要求。本书会把物理隔离也视为安全防范措施的一种来进行讨论。
(3)内网内部的机器之间往往能够直接访问。机器与机器之间的防护相对薄弱。因此我们会看到很多黑客控制内网中一台机器后,迅速“横向移动”导致整个内网沦陷的例子。
(4)大多数情况下,这些机器用于办公或者软件开发,会安装Windows系统,但不排除部分公司企业或者其他单位有特殊原因而采用其他的操作系统。本书的代码以Windows为主,同时会简要讨论其他如Linux等系统上的主机防御的可能实现办法。
本书讨论的“主机防御”实际上是“基于主机的入侵检测与防御系统”的简称。各种资料中常见的缩写名词HIDS表示的是“基于主机的入侵检测”而HIPS则是“基于主机的入侵防御”。但检测与防御本身密不可分,因此我将统一简称为“主机防御”。
主机防御的本质特点是它是安装在内网用户主机,也就是内网办公所用的每台电脑上的。它依据的是主机的状态和活动。因此我们可以看到第1节中山羊胡子同事所开发的系统,是跑在他自己的机器,也就是用户主机上的。
与主机防御相对的是基于网络的入侵检测与防御系统,简称分别为NIDS(检测)与NIPS(防御)。NIDS/NIPS一般是安装在硬件防火墙、堡垒主机等专用设备上,通过过滤网络数据来起到检测和防御的作用。
在其他的资料中,我们还会看到一个很容易和“主机防御”混淆的词语“主动防御”。
“主动防御”在大多数情况下,是指基于安全系统的一种特性,或代指拥有这种特性的安全系统。它是相对“被动扫描”而言的。被动扫描是杀软最早期的形式,通过特征码扫描恶意代码。主动防御则会根据未知病毒可能的攻击方式才采取主动的措施去进行抵御。
现代主机防御系统基本都具备了“主动防御”的特性。本书中大部分代码实现的功能都属于“主动防御”的范畴。
想象一下在1.1节的故事中,如果对方针对该公司内网的攻击并不是简单地发小广告,而是窃取某个项目的源码,那么常见的模式会是这样几步。
(1)网络侦察。黑客在网络上收集与该项目有关的开发人员的信息。举例而言,至少获得一个该项目开发人员的办公邮箱地址。
(2)初始访问。黑客和目标用户的第一次接触。在本书开头这个例子中的操作是黑客给目标发出一封精心构造的邮件。
(3)执行。目标点击了邮件中的链接,导致了恶意代码的执行。当然真正的执行方式多种多样,并不限于钓鱼邮件的方式。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2024-5-7 07:20
被星星人编辑
,原因: