打造可扩展的针对web漏洞的渗透测试平台 – skadi

  • A+
所属分类:神兵利刃

打造可扩展的针对web漏洞的渗透测试平台 – skadi

0.背景分析

当今的互联网站点,各种cms和框架大规模普及,这虽然方便了广大站长,但是这些开源项目的安全性不容乐观,比如前一阵子的strutsII漏洞使各大平台和高校网站被入侵。

如今各大漏洞库的建立为我们提供了丰富的漏洞资源。国内有乌云网,sebug,国际上有CVE和exploit-db。我们可以从这些网站和各大安全论坛获得漏洞资源,编写利用程序。

那么我们既然有如此丰富的资源,为何不编写一款可扩展的集成各种漏洞扫描和利用功能的渗透测试平台呢。

我与很多国内的黑客讨论过,他们表示正在写或者有意向编写一款如此地渗透平台,但是为何国内迟迟不见一款公开的成熟的针对web漏洞的、可扩展的渗透测试平台呢?最后我询问了PKAV的创建者张瑞冬(网名only_guest),他给我的答复是:“其实很多团队都有这样的东西,留着自己用呢。我们团队一直在开发这样的东西,并且已经用了很多年了。国内软件卖不上去价格,这样的东西没人会公开出来。你卖个设备几十万很正常,可你卖软件就很难了,这种东西维护成本又高。所以国内很多团队都是卖单个EXP,平台卖的很少。安全团队也要吃饭,我们支持免费,但这种商业化的东西确实没法免费,自身要承担很大的风险,又要天天维护更新,没几个团队会这么无私吧。”only_guest的解答一语中的。

当然,看到这儿很多看客已经不耐烦了,MSF的MeterpreterScripting不就可以轻松解决这些问题么,但是神器总归是有缺陷的,MSF不能将目标收集,web指纹识别,服务识别,插件的批量载入有机的结合成一套自动化测试的流程;还有,毕竟MSF是国际的神器,对国内cms的EXP涉及略少。

大牛富帅们的神器我们只能仰视了,那么作为屌丝人士,我们也想拥有一款如此地自动化测试神器,所以我用Java编写了一款略微粗糙的软件——skadi。

小弟不才,只是抛砖引玉,将核心模块的一点思路共享出来,或许会对大家编写此类软件有所启发。

1What’s skadi?

Skadi是集成了web指纹识别、漏洞利用、漏洞扫描、目标收集的自动化渗透测试平台。最大的亮点是我们提供了一系列接口和开发包来开发该平台的插件,这是一个平台性质的软件,是一个插件式开发的软件。它的强大并不是最初的开发人员赋予的,我们只是提供了一个平台,一个插件式开发的框架,它真正的强大是由它的插件的数量和质量决定的。

2.核心模块——插件式扩展的构想和结构

使用Java的反射机制编写和载入插件。

我们提供了两种插件式开发的结构:

  1. 将web指纹识别,漏洞扫描和漏洞利用作为相互独立的模块来编写:三个模块可以分别独立的使用,之后输出结果报告文件。那么我们要把这三个模块有机的联系起来形成一套流程的话可以这样,将各种web指纹指定唯一标识,比如织梦指定唯一标识DEDECMS,之后指纹识别模块输出报告文件时,把系统为织梦的站都输出到一个名为DEDECMS的文件中,我们的扫描和利用插件根据针对的cms不同放在不同的文件夹中,比如针对织梦的利用程序放在名为DEDECMS的文件夹中,之后载入该测试工程,那么在DEDECMS报告文件中的站点会载入到名为DEDECMS的插件文件夹中的漏洞利用插件里进行测试。

  2. 将web指纹识别,漏洞扫描和漏洞利用三个功能封装到一个模块中:

这个直接拿我对此种结构写的接口为例子来说:

publicinterfaceNBPlug {

     boolean trigger(List<String> 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文件,发现敏感路径;而嗅探型插件主要是从返回的数据中进行分析,判断漏洞,如我们要找上传点进行上传绕过的测试,就在返回的页面中查找<input type=”file” …..>的标签进行下一步测试。如果type方法返回true就调用audit方法(审计型插件),如果返回false就调用sniff方法(嗅探型插件)。

Audit方法:不做说明。

Sniff方法:参数datapackage就是一个http数据包的内容,该数据包由软件主程序获得,为提高效率减少连接时间,只有在触发sniff方法时才会对该url进行连接抓包,之后将该数据包放到一个队列里,如果还需要该url的数据包时直接从队列中进行调用。Head和body参数就是将datapackage分割成消息头和内容两部分。

对于cms识别插件:有两个插件功能的设想。第一,可以在网页中查找特定标签下的关键字,比如使用Discuz!的网站一般会在页面中出现“Powered by Discuz!”,使用wordpress的网站会在页面中出现“Proudly powered by WordPress”,那么如果在特定HTML标签下出现了这样的关键字就可判断是何种系统。第二,可以比较静态文件的hash值是否与cms中的某静态文件的hash值相等,这样就算更改了文件名,其内容若没有更改也是可以判断的。

对于漏洞利用插件:漏洞利用插件有多种形式。要说明的是,理论上我们不编写钓鱼式的漏洞利用,比如储存型XSS漏洞,这类在时间上有延迟的利用程序,因为要等待触发,所以我们不能实时的知道漏洞是否被利用成功,所以是判断上有很大困难。但是web2.0时代的黑客技术偏向于钓鱼式的陷阱式的攻击,但是我确实没用想出如何编写这样的自动化利用程序,如果哪位基友有想法请联系我深入探讨。

 

3.关于爬虫的编写

扫描漏洞肯定是要有个爬虫的。

编写一个爬虫也不是什么费力气的活,我用的是一个开源的开发包Jsoup编写了一个爬虫,实现方法并不复杂,不做详细说明。

需要注意的一点是,爬虫需要一种模糊过滤机制,举个例子,针对news.php?id=11,这一参数的注入测试只要一次就可以了,我们只要检测了news.php?id=11就不需要检测news.php?id=22,那么我们应该避免爬虫抓取到大量此类重复的url,那么就要进行模糊过滤,我们首先把一个带参数的url分割成文件和参数的形式,之后把他储存到一个队列中,之后再抓取到带参url也行进分割之后进行匹配,如果发现队列中已经有了这个文件和这个参数的组合就抛弃这条url。

在skadi中爬虫默认最多爬行相似url三次。

4Skadi tools

4.1目标搜集

不废话——集成Google、baidu、zoomeye、bing搜索引擎,特定URL网站搜集、特定cms网站搜集、C段、旁站、二级域名查询一条龙服务。

4.2 cms识别

1、构造特定url,判断http响应

首先我们收集了各种cms和框架的特征目录,当需要对一个网站进行指纹识别时,我们将作为参数的URL处理成根目录URL的形式,之后把处理后的URL与特征目录拼接起来,之后连接,得到HTTP响应代码,如果为200或者403则一般可以判断该目录是存在的,则存在该特征目录的可以确定采用了哪种cms。

2、爬行页面链接,匹配特征URL

第一种识别方式一个缺点是文件的上级目录不可确定,也就是说,如果我们把特征文件放到了一个自己命名的目录下,第一种识别方式是不能识别的。那么我们就使用一个spider来爬行网站上的链接,比如a标签下的href属性,src属性,link标签下的href属性,爬行到这些标签之后与特征目录进行匹配,判断是否包含特征目录,这样就可以确定为何种cms。

3web指纹识别插件

4.3 漏洞扫描

内置基于get请求的反射型XSS和GET型sql注入模块,不做详细说明。

提供了漏洞扫描插件编写接口。

4.4 漏洞利用

1.低配置漏洞利用

我们搜集了一些使用url触发的cms漏洞,低配置漏洞利用会连接指定网站的漏洞触发url,如果存在会返回结果。当然,低配置漏洞利用是极不精确的,所以,我们编写了高配置漏洞利用模块。

2、高配置漏洞利用

高配置漏洞利用也就是使用插件编写的方法载入exp。我们提供了编写漏洞利用插件的接口。

 

5. 最后附上skadi工具

    skadi度娘盘

    ps:本来里面有5个漏洞利用插件和一个工程的,但是由于一些隐晦的原因我最后删掉了。=_=

压缩包里有说明文件,插件接口和开发包(开发包没怎么写,就是一些很常用的功能,本来还行写发送http请求的方法来着,但是想想既然都有httpclient和curl了,就不写了了。

    如果大家有兴趣为skadi开发插件或者希望添加什么功能,还有如果想要源码的话,发送邮件到我的邮箱[email protected]

    微博:http://t.qq.com/HoerWing

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: