0.背景分析
当今的互联网站点,各种cms和框架大规模普及,这虽然方便了广大站长,但是这些开源项目的安全性不容乐观,比如前一阵子的strutsII漏洞使各大平台和高校网站被入侵。
如今各大漏洞库的建立为我们提供了丰富的漏洞资源。国内有乌云网,sebug,国际上有CVE和exploit-db。我们可以从这些网站和各大安全论坛获得漏洞资源,编写利用程序。
那么我们既然有如此丰富的资源,为何不编写一款可扩展的集成各种漏洞扫描和利用功能的渗透测试平台呢。
我与很多国内的黑客讨论过,他们表示正在写或者有意向编写一款如此地渗透平台,但是为何国内迟迟不见一款公开的成熟的针对web漏洞的、可扩展的渗透测试平台呢?最后我询问了PKAV的创建者张瑞冬(网名only_guest),他给我的答复是:“其实很多团队都有这样的东西,留着自己用呢。我们团队一直在开发这样的东西,并且已经用了很多年了。国内软件卖不上去价格,这样的东西没人会公开出来。你卖个设备几十万很正常,可你卖软件就很难了,这种东西维护成本又高。所以国内很多团队都是卖单个EXP,平台卖的很少。安全团队也要吃饭,我们支持免费,但这种商业化的东西确实没法免费,自身要承担很大的风险,又要天天维护更新,没几个团队会这么无私吧。”only_guest的解答一语中的。
当然,看到这儿很多看客已经不耐烦了,MSF的MeterpreterScripting不就可以轻松解决这些问题么,但是神器总归是有缺陷的,MSF不能将目标收集,web指纹识别,服务识别,插件的批量载入有机的结合成一套自动化测试的流程;还有,毕竟MSF是国际的神器,对国内cms的EXP涉及略少。
大牛富帅们的神器我们只能仰视了,那么作为屌丝人士,我们也想拥有一款如此地自动化测试神器,所以我用Java编写了一款略微粗糙的软件——skadi。
小弟不才,只是抛砖引玉,将核心模块的一点思路共享出来,或许会对大家编写此类软件有所启发。
1.What’s skadi?
Skadi是集成了web指纹识别、漏洞利用、漏洞扫描、目标收集的自动化渗透测试平台。最大的亮点是我们提供了一系列接口和开发包来开发该平台的插件,这是一个平台性质的软件,是一个插件式开发的软件。它的强大并不是最初的开发人员赋予的,我们只是提供了一个平台,一个插件式开发的框架,它真正的强大是由它的插件的数量和质量决定的。
2.核心模块——插件式扩展的构想和结构
使用Java的反射机制编写和载入插件。
我们提供了两种插件式开发的结构:
将web指纹识别,漏洞扫描和漏洞利用作为相互独立的模块来编写:三个模块可以分别独立的使用,之后输出结果报告文件。那么我们要把这三个模块有机的联系起来形成一套流程的话可以这样,将各种web指纹指定唯一标识,比如织梦指定唯一标识DEDECMS,之后指纹识别模块输出报告文件时,把系统为织梦的站都输出到一个名为DEDECMS的文件中,我们的扫描和利用插件根据针对的cms不同放在不同的文件夹中,比如针对织梦的利用程序放在名为DEDECMS的文件夹中,之后载入该测试工程,那么在DEDECMS报告文件中的站点会载入到名为DEDECMS的插件文件夹中的漏洞利用插件里进行测试。
将web指纹识别,漏洞扫描和漏洞利用三个功能封装到一个模块中:
这个直接拿我对此种结构写的接口为例子来说:
publicinterfaceNBPlug {
boolean trigger(List serviec);
boolean match(String arg);
boolean PID();
boolean type();
void audit(String arg,String project);
void sniff(String url,String dataPackage,String head,String body,Stringproject);
}
Trigger方法:trigger方法是判断该类型的参数是否可以触发该插件,其中serviec队列的生成不是插件的工作,是由软件主程序进行识别的并生成此参数,service参数是唯一标识的,比如”www”为一个链接地址,”ip”为一个IP地址,ftp为一个ftp服务器的地址等等。需要说明的是service还包含了cms的类型,该cms类型如上文所说也是唯一标识的。插件只需要判断service队列中是否包含了该插件需要的服务类型即可;
Match方法:如果插件确定service包含了触发标识,那么进行下一步判断,match函数,这就是判断一下传来的参数的形式是否是插件需要的,比如我只检测php后缀的文件,那么在该函数中就要编写正则匹配php后缀名。
PID方法:如果参数形式正确,那么判断PID是否需要,PID就是在程序中唯一识别插件的标识,解决的问题是保证插件只触发一次,该PID由软件主程序生成(找不到很好的生成方法,索性直接用了插件的文件名,反正是在一个文件夹中的不可能重名),如果PID函数返回true,那么就会生成该插件的PID放入队列中,每次调用插件时判断是否已经存在该PID。如果PID方法返回false,那么每次调用该插件都会执行。
Type方法:这里说明一下对插件类型的构想,插件编写分两种,审计型插件和嗅探型插件。审计型插件主要是从源文件中获取信息分析漏洞,如审计robot.txt文件,发现敏感路径;而嗅探型插件主要是从返回的数据中进行分析,判断漏洞,如我们要找上传点进行上传绕过的测试,就在返回的页面中查找的标签进行下一步测试。如果type方法返回true就调用audit方法(审计型插件),如果返回false就调用sniff方法(嗅探型插件)。
(责任编辑:安博涛)