判断逻辑

这一节我们将介绍Luna的判断逻辑。

Luna exp基类中共有5个成员函数,但对用户开放的接口只有'scan_main'一个。一般情况下我们只需要编写'scan_main' 的实现,而不用关心从继承而来的其他成员函数的实现。

__init__ 函数

用于output、conf类的实例化,以及调用'set_option'来加载各项配置。

set_option函数

解析在 self.options 中设置的各项配置,把开关按插件需要调整到对应的状态。

before_scan函数

在遍历每个参数扫描前的工作。我们可以在这里对不需要扫描的http请求进行白名单控制。而且对于敏感文件探测、管理后台探测类型的策略,可以通过重写父类方法在这里编写探测用例,然后设置'do_scan'为0,就可以只扫描cgi而跳过对每个参数的遍历扫描。

scan函数

这是每个插件被调用的入口,安装options设置的那样进行扫描,每次扫描都会执行scan_main的判断逻辑。

scan_main函数

这里我们我可以尽情编写判断逻辑,我们只需要关注当前请求发送以后遇到的情况,而不用去关心每个零件是怎么被调用的,参数设置是如何被实现的。就像我们在做web开发时只需要关注http请求的request和response,而不需要去关注网络连接、路由配置、tcp建立连接的三次握手等技术细节,这里抽象出了具体面对一次发送用例和接收返回的动作,在这个基础上我们可以大幅简化编写成本。
封装后的lunascan是我们的有力武器,这里提供了四个不同的接口:scan_for_status、scan_for_header、scan_for_body、scan_for_all.
我们使用这四个接口发送扫描payload并获取返回体的status、header、body ,scan_for_all用于返回[status,header,body]三个不同位置的list。
在调用scan_for_* 之前,我们需要先设置好self.key_exp和self.value_exp,因为调用时会按当前的self.key_exp 和self.value_exp进行探测,我们也可以通过在scan_main函数中使用self.value_exp='xx'来变换payload进行探测。

当发现漏洞以后,可以调用output实时打印在屏幕(打印后一般time.sleep若干秒),然后调用

luna_report.report_http(luna_scan,self)


将漏洞写入报告中。
这里为了在打印报告时更好地描述,开放了两个新的成员变量 rule_type 和 match_with,用来记录发现该漏洞所使用的策略类型和发现漏洞的方法。

这里给出一个插件的样例,该插件用于检测发送原始请求后网站返回以'helloworld'作为开头的页面。
helloworld_exp.py

import lunaexp
import output
import conf.lunaconf
import time

class helloworld_exp(lunaexp.base):

    ruleid = 0x0001
    options = 0xA1
    rule_type = "helloworld-test"
    match_with = "'helloworld' was found in the response"
   
    def scan_main(self,luna_scan,luna_report,scan_type,urlencode_type):                                                        #user_define
        
        body=luna_scan.scan_for_body(self,0,scan_type,urlencode_type)
        if body[:10] == 'helloworld':
            print 'helloworld was found'
            time.sleep(5)   
            luna_report.report_http(luna_scan,self)
            return True

 

总结一下,我们在编写插件时需要关心的由三件事情:1.构造测试用例,也就是通常我们说的payload;2.设置扫描选项;3.编写判断逻辑。

Luna尽可能将测试用例和判断逻辑抽象出来,用成员变量来控制用例和选项,用成员函数来实现判断逻辑,在scan_main函数中我们可以奇思妙想天马行空地创造不同的尝试,Luna会帮你逐一验证。