对于信息安全领域,2021年无疑是动荡不安的一年,Heartbeat、Shellshock、贵宾犬、沙虫等漏洞接二连三的发生。对于普通大众和相当一部分技术人员来说黑客技术总是带着一些神秘的色彩,但是任何人在仔细研究之后都会发现,黑客技术并没有那么神秘,它和我们写的每一行代码、设计的每一个测试用例一样,都遵循最基本的原理。
一、 黑客技术
黑客技术是很多技术的集合,涵盖计算机技术的多个方面从硬件、系统、应用到WEB等,由于涉及的知识较多,很少有研究者能够在各个方面都做到精通,因此把握其本质和主线就显得尤为重要。
1. 漏洞与黑客技术
在了解黑客技术之前我们有必要先了解一些黑客技术的对立面—信息安全方面的一些知识。如图 1所示,信息安全的核心在于权限管理,保密性、完整性、可用性、不可抵赖性等要素都是围绕着权限展开的;认证、防火墙、入侵检测等技术本质上都是为了确保信息被拥有权限的主体使用。
而黑客技术和信息安全正好相反,黑客技术则是为了获得非法权限(如图 2所示)。现实中任何系统在设计的时候都会做一些权限的限制,但由于种种原因,这些限制并非牢不可破,其中往往存在各种各样的漏洞,或者是操作人员的失误、或者软件设计的漏洞,正是因为这些漏洞的存在,黑客技术才得以成为现实。因此黑客技术的核心在于获取非法权限,其实现方式是挖掘和利用漏洞。
由前面的分析可知漏洞是理解黑客技术的主线与核心,所以漏洞挖掘技术和利用技术是黑客的两大核心技能。对于任何一个软件系统或IT系统,其安全性或攻击难度取决于漏洞的多少和漏洞的利用难度。传统的安防产品的思路是提高漏洞的利用难度,而减少漏洞的数量则是软件或设备提供商考虑的事情,但也有一些新兴的安全公司例如Codenomicon提供专业漏洞挖掘的产品。
图 1 信息安全3要素
图 2 黑客技术的核心
2. 安全漏洞的分类
由于信息技术的高速发展,现在的软件系统异常复杂。最初的软件产品只分为硬件和软件两个组成部分,相对而言,漏洞的种类比较有限;现在的软件产品软件层面多,可分为驱动、操作系统、应用程序、脚本、WEB等层面,而且软件产品的种类也非常多,因此为漏洞的分类提出了巨大的挑战。
目前对于漏洞分类最权威的是由美国网络安全与通信办公室、美国国土安共同推出的CWE(Common Weakness Enumeration,通用漏洞枚举),CWE收录了上千种漏洞类型,当然包括熟悉的缓冲区溢出、DDoS、SQL注入、跨站脚本等,这些资料对于研究安全漏洞是非常重要的,不过对于了解黑客技术来讲显得过于细节化了。为了便于了解我们可以简单得将漏洞分为如下几个层面:
表1 漏洞的简单分类
在现实的渗透测试中,部署应用和运作管理漏洞是最常见的,Rapid 7 首席信息安全官表示:“使用默认密码可以访问几乎一半的互联网。”很多人对于黑客技术的误解就在于此,任何单个的技术看起来都是简单的,但各种技术组合起来,效果可能会相当惊人。但对于网络设备厂商,软件编码漏洞和软件设计漏洞才是最值得关注的。
二、 Fuzz测试
1. 什么是Fuzz测试?
漏洞挖掘有三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁。
Fuzz测试,也叫做“模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。Fuzz测试的概念非常容易理解,如果我们构造非法的报文并且通过测试工具打入被测设备,那么这就是一个Fuzz测试的测试例执行,大多数测试工程师肯定都尝试过这种测试手段。
对于网络协议漏洞挖掘来说,Fuzz测试也就意味着打入各种异常报文,然后观察设备是否有异常。
2. 针对FTP sever的Fuzz测试
在本节我们将设计一个简单的针对FTP server的Fuzz测试脚本。从原理上设计Fuzz测试用例是比较简单的,无非是阅读RFC,根据报文设计异常字段,但在实际实施过程中将会遇到以下几个问题。
m 网络协议是有状态的,最常见的一种情况就是,我们需要在协议状态机进行到某种状态的时候发送某种报文,比如FTP协议,如果我们想对put命令的参数进行变异、发送异常报文,则我们需要先通过FTP认证;因此要想实现协议的fuzz测试,则只能手工编写脚本,现有的工具和测试仪都无法实现这些复杂逻辑。
m 另外如何构造异常,这是一个和经验相关性比较大的问题,需要长期积累,以及对安全漏洞有较深入的研究。
m 如何检测被测设备是否异常,这也是一个非常棘手的问题,比如内存泄露,可能只是泄露几个字节的内存,这时候被测设备外部表现正常。
在本节中介绍的FTP server的Fuzz测试中,仅构造比较简单的异常—--超长的报文;设备异常通过检查FTP连接的状态来判断。被测设备选择MSR36设备和日常工作中常用的3CDaemon FTP server2.0。具体测试步骤分为如下。
¡ 输入超长的FTP用户名,被测设备应该表现正常;
¡ 正常登陆FTP后,对于FTP命令“mdelete、cd、mkdir、cwd、mdir、mput、rename”输入超长参数, 被测设备应该表现正常。
根据测试用例设计相应的测试脚本,测试脚本使用python语言编写。脚本主要由三个函数组成。
m get_fuzz_str()函数,用于生成Fuzz str,即异常报文的关键部分;在本例中用于生成超长的字符串“aaaaaa…”(如图3所示)。
图3 get_fuzz_str代码
m fuzz_FTP_usr()函数,用于发送超长的用户名,关键代码如图4所示,将超长的字符串4串拼接在一起,作为user的参数发送给服务器。
图4 fuzz_FTP_user()函数关键代码
m fuzz_FTP_cmd()函数,用于发送超长的命令,关键代码如图5所示,对每一个命令构造异常的参数,然后发送给服务器。
图5 fuzz_FTP_cmd()函数关键代码
之后,执行测试用例,设定被测设备为MSR36设备,MSR36设备表现正常,未发现任何问题(如图6所示)。
图6 MSR36测试结果
将被测设备设定为3CDaemon FTP server,测试结果如图7所示,看起来脚本找到了一个安全漏洞;为了验证我们用windbg调试FTP server看一看,如图8所示可以看到3CDaemon FTP server已经被溢出了,EIP寄存器被我们的字符串“aaaa”覆盖,从而导致程序崩溃,而且从调试器看到这是一个栈溢出漏洞,这些信息会为进一步的漏洞利用提供线索。
图7 3CDaemon FTP server测试结果
图8 3CDaemon FTP server调试结果
通过这个简单的Fuzz测试脚本成功找到了一个缓冲区溢出漏洞。
三、 结束语
如果将漏洞作为理解黑客技术的核心,黑客技术本身已经不再神秘,在日常测试中,经过简单设计的测试用例即可完成漏洞挖掘的工作。但是应该看到的是随着安全技术的发展,挖掘漏洞和利用漏洞必定更为复杂。实际上针对协议设计Fuzz测试脚本并不是一件简单的事情,其复杂程度往往超过实现协议本身,在实际的测试中往往需要借助专业的测试框架、测试套件,或者根据实际情况设计比较有针对性的测试用例进行测试。