首页 > 代码库 > 实现一个Web版的类Metasploit的攻击框架
实现一个Web版的类Metasploit的攻击框架
这是我现在结题的一个专业实训中的一部分内容,小心翼翼地拿出来分享。
在项目中,攻击模块不仅提供自动化攻击功能,也提供了用户扩展的平台,通过规定编写规则来进行有效的扩展。
(1)攻击模块设计
该攻击模块采用命令行模式,设计功能示意图如下:
(a)指定exp名称攻击:
l全域名扫描
即针对现有的域名全部进行攻击。
python safecatcli.py -m exp_name -n [exploit_file_name] -o all
l单个目标扫描
即对输入的url或者ip地址载入攻击脚本进行攻击。
python safecatcli.py -m exp_name -n [exploit_file_name] -o single -u [url or IP addr]
lIP段扫描
对一个IP段的主机进行攻击。
python safecatcli.py -m exp_name -n [exploit_file_name] -o range -start [your-start-ip-addr] -end [your-end-ip-addr]
(b)指定关键词进行扫描:
you_class_name填你要攻击的flag,比如项目中整合了discuz,ftp,ecshop等,这里要填信息
l指定查询语句攻击
对提交的查询语句进行解析,从es中找出符合条件的域名列表,然后载入一个模块的全部攻击脚本进行攻击。
python safecatcli.py -c [your class name] -q "[your query string]"
比如:攻击台湾的discuz主机
python safecatcli.py -c discuz -q "discuz country:Taiwan"
l指定一个域名攻击
即对提交的一个domain进行攻击,从模块中载入全部脚本进行攻击。
python safecatcli.py -c discuz -u [domain]
(2)攻击模块实现
整个攻击模块的包结构如下:
Safecatcli.py是入口文件,对于如何构建一个命令行解析体系,我们选择使用了Python中的一个库optparse模块完成。使用OptionParser类中的add_option方法就可以轻松添加一条命令行参数,如添加模块选择参数“-m”,实现如下:
对于设计中出现的两个模块(指定攻击脚本模块、指定关键字模块),分别用两个类(EXPModule、KEYModule)来实现。类中的成员变量、类方法名称以及功能如下:
lEXPModule类:
名称 | 功能 |
self.es | Elasticsearch客户端 |
self.exp | 载入的exp攻击代码 |
self.file | 扫描完毕之后生成的报告文件 |
self.httptools | http操作类 |
scanAll() | 全库域名扫描功能实现 |
scanOneHost(target) | 单目标扫描功能实现 |
scanOneRange(startip,endip) | IP段扫描功能实现 |
不论是哪种模式,扫描模式都是如下模式:
全库域名扫描是通过获取现有数据中所有的域名来构成扫描域名列表,这需要与Elasticsearch的服务端进行交互,通过Query DSL查询就可以实现。每次任务执行完成之后,会将任务执行的结果进行保存,以“.cat”后缀的文件作为报告文件,通过web层的views函数提供给用户下载。最后,将这次任务记录到数据库(Mysql)中即可。
单目标扫描是通过用户通过命令行参数给定的URL或者IP地址作为扫描域名列表。由于是单词扫描,所以不会生成报告供下载,只是将结果通过Web层打印,并向数据库中进行记录。
IP段扫描是同样是根据用户提供的一个IP地址段(由起始地址、终止地址构成)作为扫描的域名列表。一次任务所经过的流程与全库域名扫描一致。
lKEYModule
名称 | 功能 |
self.es | Elasticsearch客户端 |
self.flag | 用户提供的设备或者网络组件关键字(如discuz) |
self.file | 扫描完毕之后生成的报告文件 |
self.httptools | http操作类 |
loadExploit() | 载入相应模块的全部exp攻击代码 |
queryParser(query) | 解析用户的查询语句 |
scanByQuery(query) | 根据用户搜索进行攻击 |
scanByDomain(domain) | 攻击一个域名或IP |
KEYModule主要是用于根据关键字(key)进行攻击。Key的定义是目前收录的网络组件或者网络设备的名称,如Discuz、Dedecms等。这个模块还有一个特点就是会载入Key下面的所有攻击脚本进行轮询攻击。
scanByQuery主要根据用户提交的查询字符串从Elasticsearch中拉取域名列表进行扫描。
scanByDomain根据用户提交的单个域名目标进行攻击。
攻击框架的本质就是动态将攻击类进行加载运行,这里使用了Python的imp模块完成类的动态加载,如果碰到路径问题导致类加载不成功,还可以直接将相应模块的工作目录统一添加至sys.path列表中。
(3)攻击类的编写规则定义与实现
为了追求框架的可扩展性,必须将编写规则进行限制,并将一些统一的方法抽象出来放在父类ExploitCore中,这里主要在父类中实现扫描规则验证等功能,但是由于时间紧迫,我只是将框架搭出,没有实现父类中的方法。
攻击类的编写规则定义如下:
1)类名SafecatExploit
2)必须将攻击代码放入类方法exploit中,规则必填参数为攻击URL或者IP,可选参数不做限制。成功则返回攻击结果(string类型),失败返回None。
遵从上述规定的exploit攻击脚本就可以直接从框架入口处进行调用并生成攻击结果报告。
此外,补充信息与公用数据放在构造方法中的info字典中,包括exploit的作者、漏洞相关的信息、漏洞所用payload等。如discuz的faq.php注入攻击类中,info可以写成如下形式:
实现一个Web版的类Metasploit的攻击框架